如果我想在Keras中使用BatchNormalization函数,那么我是否只需要在开头调用它一次?
我为它阅读了这个文档:http://keras.io/layers/normalization/
我不知道我应该把它称之为什么.以下是我的代码试图使用它:
model = Sequential()
keras.layers.normalization.BatchNormalization(epsilon=1e-06, mode=0, momentum=0.9, weights=None)
model.add(Dense(64, input_dim=14, init='uniform'))
model.add(Activation('tanh'))
model.add(Dropout(0.5))
model.add(Dense(64, init='uniform'))
model.add(Activation('tanh'))
model.add(Dropout(0.5))
model.add(Dense(2, init='uniform'))
model.add(Activation('softmax'))
sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='binary_crossentropy', optimizer=sgd)
model.fit(X_train, y_train, nb_epoch=20, batch_size=16, show_accuracy=True, validation_split=0.2, verbose = 2)
Run Code Online (Sandbox Code Playgroud)
我问,因为如果我运行包含批量规范化的第二行的代码,如果我运行没有第二行的代码,我得到类似的输出.所以要么我没有在正确的位置调用该功能,要么我认为它没有那么大的差别.
python neural-network keras data-science batch-normalization
我是卷积神经网络的新手,只是想知道特征映射以及如何对图像进行卷积以提取特征.我很高兴知道在CNN中应用批量标准化的一些细节.
我读了本文https://arxiv.org/pdf/1502.03167v3.pdf和可以理解的BN算法应用于数据,但最终他们提到,当应用到CNN的轻微修改是必需的:
对于卷积层,我们还希望归一化遵循卷积属性 - 以便在不同位置对同一特征映射的不同元素以相同方式进行归一化.为实现这一目标,我们联合规范了所有地点的小批量激活.在Alg.1,我们令B是该组中跨越小批量的两个元件和空间位置的特征地图的所有值的 - 因此对于小批量大小p×Q的大小为m和特征映射的,我们使用的短跑运动员 - 小型m'= | B |的小批量 = m·pq.我们学习每个特征图的一对参数γ(k)和β(k),而不是每次激活.ALG.类似地修改图2,使得在推理期间,BN变换对给定特征图中的每个激活应用相同的线性变换.
当他们说"以不同位置的相同特征地图的不同元素以相同方式标准化"时,我完全感到困惑 "
我知道哪些特征映射意味着什么,不同的元素是每个特征映射中的权重.但我无法理解什么位置或空间位置意味着什么.
我根本无法理解下面的句子 "在Alg.1中,我们让B成为特征图中所有值的集合,跨越小批量和空间位置的元素"
如果有人冷静地阐述并用更简单的术语解释我,我会很高兴的
machine-learning computer-vision deep-learning conv-neural-network batch-normalization
我知道批量标准化通过将激活转向单位高斯分布,从而有助于更快的训练,从而解决消失的梯度问题.批量标准行为在训练时使用不同(使用每批的平均值/ var)和测试时间(使用训练阶段的最终运行平均值/ var).
另一方面,实例规范化作为对比度规范化,如本文中提到的https://arxiv.org/abs/1607.08022.作者提到输出风格化图像应该不依赖于输入内容图像的对比度,因此实例规范化有所帮助.
但是,我们不应该使用实例规范化进行图像分类,其中类标签不应该依赖于输入图像的对比度.我还没有看到任何使用实例规范化的纸张来进行批量归一化以进行分类.这是什么原因?此外,可以并且应该一起使用批处理和实例规范化.我渴望在何时使用哪种规范化方面获得直观和理论上的理解.
machine-learning computer-vision neural-network conv-neural-network batch-normalization
我可以在输入层后立即使用批量规范化层而不规范化我的数据吗?我希望得到类似的效果/表现吗?
在keras功能中它将是这样的:
x = Input (...)
x = Batchnorm(...)(x)
...
Run Code Online (Sandbox Code Playgroud) artificial-intelligence machine-learning neural-network keras batch-normalization
我正在尝试使用批量标准化.我试图在一个简单的转义网上使用tf.layers.batch_normalization for mnist.
我获得了高精度的列车步骤(> 98%)但测试精度非常低(<50%).我试图改变动量值(我尝试了0.8,0.9,0.99,0.999)并使用批量大小,但它总是表现得基本相同.我在20k迭代上训练它.
我的代码
# Input placeholders
x = tf.placeholder(tf.float32, [None, 784], name='x-input')
y_ = tf.placeholder(tf.float32, [None, 10], name='y-input')
is_training = tf.placeholder(tf.bool)
# inut layer
input_layer = tf.reshape(x, [-1, 28, 28, 1])
with tf.name_scope('conv1'):
#Convlution #1 ([5,5] : [28x28x1]->[28x28x6])
conv1 = tf.layers.conv2d(
inputs=input_layer,
filters=6,
kernel_size=[5, 5],
padding="same",
activation=None
)
#Batch Norm #1
conv1_bn = tf.layers.batch_normalization(
inputs=conv1,
axis=-1,
momentum=0.9,
epsilon=0.001,
center=True,
scale=True,
training = is_training,
name='conv1_bn'
)
#apply relu
conv1_bn_relu = tf.nn.relu(conv1_bn)
#apply pool ([2,2] : [28x28x6]->[14X14X6])
maxpool1=tf.layers.max_pooling2d(
inputs=conv1_bn_relu, …
Run Code Online (Sandbox Code Playgroud) 在tensorflow 1.4中,我发现了两个执行批量规范化的函数,它们看起来相同:
我应该使用哪种功能?哪一个更稳定?
python neural-network deep-learning tensorflow batch-normalization
我正在实施一个依赖于3D卷积的模型(用于类似于动作识别的任务),我想使用批量标准化(参见[Ioffe&Szegedy 2015]).我找不到任何专注于3D转换的教程,因此我在这里做一个简短的教程,我想和你一起回顾.
下面的代码引用TensorFlow r0.12并且它显式实例变量 - 我的意思是我没有使用tf.contrib.learn,除了tf.contrib.layers.batch_norm()函数.我这样做是为了更好地了解事情如何在幕后工作并具有更多的实现自由(例如,可变摘要).
通过首先编写完全连接层的示例,然后进行2D卷积,最后编写3D情况,我将顺利地进入3D卷积情况.在浏览代码时,如果你能检查一切是否正确完成会很好 - 代码运行,但我不能100%确定应用批量规范化的方式.我以更详细的问题结束这篇文章.
import tensorflow as tf
# This flag is used to allow/prevent batch normalization params updates
# depending on whether the model is being trained or used for prediction.
training = tf.placeholder_with_default(True, shape=())
Run Code Online (Sandbox Code Playgroud)
# Input.
INPUT_SIZE = 512
u = tf.placeholder(tf.float32, shape=(None, INPUT_SIZE))
# FC params: weights only, no bias as per [Ioffe & Szegedy 2015].
FC_OUTPUT_LAYER_SIZE = 1024
w = tf.Variable(tf.truncated_normal(
[INPUT_SIZE, FC_OUTPUT_LAYER_SIZE], dtype=tf.float32, stddev=1e-1))
# Layer output …
Run Code Online (Sandbox Code Playgroud) python machine-learning deep-learning tensorflow batch-normalization
我对如何"BatchNorm"
在模型中使用/插入图层感到有点困惑.
我看到了几种不同的方法,例如:
"BatchNorm"
+ "Scale"
(无参数共享)"BatchNorm"
图层紧跟着"Scale"
图层:
layer {
bottom: "res2a_branch1"
top: "res2a_branch1"
name: "bn2a_branch1"
type: "BatchNorm"
batch_norm_param {
use_global_stats: true
}
}
layer {
bottom: "res2a_branch1"
top: "res2a_branch1"
name: "scale2a_branch1"
type: "Scale"
scale_param {
bias_term: true
}
}
Run Code Online (Sandbox Code Playgroud)
"BatchNorm"
在提供caffe的cifar10示例中,"BatchNorm"
使用时没有任何"Scale"
跟随它:
layer {
name: "bn1"
type: "BatchNorm"
bottom: "pool1"
top: "bn1"
param {
lr_mult: 0
}
param {
lr_mult: 0
}
param {
lr_mult: 0
}
} …
Run Code Online (Sandbox Code Playgroud) machine-learning neural-network deep-learning caffe batch-normalization
我有以下代码.
x = keras.layers.Input(batch_shape = (None, 4096))
hidden = keras.layers.Dense(512, activation = 'relu')(x)
hidden = keras.layers.BatchNormalization()(hidden)
hidden = keras.layers.Dropout(0.5)(hidden)
predictions = keras.layers.Dense(80, activation = 'sigmoid')(hidden)
mlp_model = keras.models.Model(input = [x], output = [predictions])
mlp_model.summary()
Run Code Online (Sandbox Code Playgroud)
这是模型摘要:
____________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
====================================================================================================
input_3 (InputLayer) (None, 4096) 0
____________________________________________________________________________________________________
dense_1 (Dense) (None, 512) 2097664 input_3[0][0]
____________________________________________________________________________________________________
batchnormalization_1 (BatchNorma (None, 512) 2048 dense_1[0][0]
____________________________________________________________________________________________________
dropout_1 (Dropout) (None, 512) 0 batchnormalization_1[0][0]
____________________________________________________________________________________________________
dense_2 (Dense) (None, 80) 41040 dropout_1[0][0]
====================================================================================================
Total …
Run Code Online (Sandbox Code Playgroud) 我想知道在使用多GPU进行训练时,通过同步批量统计来实现批量规范化层的可能方法.
Caffe也许有一些caffe可以做的变种,比如链接.但是对于BN层,我的理解是它仍然只同步层的输出,而不是平均值和变量.也许MPI可以同步手段和变量,但我认为MPI有点难以实现.
火炬我在这里和这里看到了一些评论,它们显示了running_mean和running_var可以同步,但我认为批量平均值和批量变量不能或难以同步.
Tensorflow通常,它与caffe和torch相同.BN的实施是指这一点.我知道tensorflow可以将操作分配给指定的任何设备tf.device()
.但是平均值和变量的计算是在BN层的中间,所以如果我在cpu中收集平均值和变量,我的代码将是这样的:
cpu_gather = []
label_batches = []
for i in range(num_gpu):
with tf.device('/gpu:%d' % i):
with tf.variable_scope('block1', reuse=i > 0):
image_batch, label_batch = cifar_input.build_input('cifar10', train_data_path, batch_size, 'train')
label_batches.append(label_batch)
x = _conv('weights', image_batch, 3, 3, 16, _stride_arr(1))
block1_gather.append(x)
with tf.device('/cpu:0'):
print block1_gather[0].get_shape()
x1 = tf.concat(block1_gather, 0)
# print x1.get_shape()
mean, variance = tf.nn.moments(x1, [0, 1, 2], name='moments')
for i in range(num_gpu):
with tf.device('/gpu:%d' % i): …
Run Code Online (Sandbox Code Playgroud)