标签: batch-normalization

如何正确使用tensorflow中的tf.layers.batch_normalization()?

我对张量流很困惑tf.layers.batch_normalization.

我的代码如下:

def my_net(x, num_classes, phase_train, scope):
    x = tf.layers.conv2d(...)
    x = tf.layers.batch_normalization(x, training=phase_train)
    x = tf.nn.relu(x) 
    x = tf.layers.max_pooling2d(...)

    # some other staffs
    ...

    # return 
    return x

def train():
    phase_train = tf.placeholder(tf.bool, name='phase_train')
    image_node = tf.placeholder(tf.float32, shape=[batch_size, HEIGHT, WIDTH, 3])
    images, labels = data_loader(train_set)
    val_images, val_labels = data_loader(validation_set)
    prediction_op = my_net(image_node, num_classes=2,phase_train=phase_train, scope='Branch1')

    loss_op = loss(...)
    # some other staffs
    optimizer = tf.train.AdamOptimizer(base_learning_rate)
    update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
    with tf.control_dependencies(update_ops):
        train_op = optimizer.minimize(loss=total_loss, global_step=global_step)
    sess = ...
    coord …
Run Code Online (Sandbox Code Playgroud)

tensorflow batch-normalization

8
推荐指数
1
解决办法
4209
查看次数

测试时Tensorflow batch_norm无法正常工作(is_training = False)

我正在训练以下模型:

with slim.arg_scope(inception_arg_scope(is_training=True)):
    logits_v, endpoints_v = inception_v3(all_v, num_classes=25, is_training=True, dropout_keep_prob=0.8,
                     spatial_squeeze=True, reuse=reuse_variables, scope='vis')
    logits_p, endpoints_p = inception_v3(all_p, num_classes=25, is_training=True, dropout_keep_prob=0.8,
                     spatial_squeeze=True, reuse=reuse_variables, scope='pol')
    pol_features = endpoints_p['pol/features']
    vis_features = endpoints_v['vis/features']

eps = 1e-08
loss = tf.sqrt(tf.maximum(tf.reduce_sum(tf.square(pol_features - vis_features), axis=1, keep_dims=True), eps))

# rest of code
saver = tf.train.Saver(tf.global_variables())
Run Code Online (Sandbox Code Playgroud)

哪里

def inception_arg_scope(weight_decay=0.00004,
                    batch_norm_decay=0.9997,
                    batch_norm_epsilon=0.001, is_training=True):
normalizer_params = {
    'decay': batch_norm_decay,
    'epsilon': batch_norm_epsilon,
    'is_training': is_training
}
normalizer_fn = tf.contrib.layers.batch_norm

# Set weight_decay for weights in Conv and FC layers.
with slim.arg_scope([slim.conv2d, slim.fully_connected],
                    weights_regularizer=slim.l2_regularizer(weight_decay)): …
Run Code Online (Sandbox Code Playgroud)

testing tensorflow batch-normalization

7
推荐指数
1
解决办法
4093
查看次数

你如何去规范化?

一旦您对数据进行了规范化,使值介于 0-1 之间,您如何对其进行反规范化以便解释结果?

因此,当您规范化数据并将其提供给网络并获得规范化数据的输出时。你如何反向归一化以获得原始数据?

neural-network keras tensorflow batch-normalization

7
推荐指数
1
解决办法
4398
查看次数

为什么仅在 CNN 中对通道进行批量归一化

我想知道,在卷积神经网络中,是否应该对每个像素分别应用批量归一化,还是应该对每个通道取像素的平均值?

我在 Tensorflow 的tf.layers.batch_normalization的描述中看到,建议对通道执行 bn,但如果我没记错的话,我使用了另一种方法,效果很好。

machine-learning convolution computer-vision batch-normalization

7
推荐指数
3
解决办法
8966
查看次数

Tensorflow保存/恢复批量规范

我在Tensorflow中训练了一个具有批量规范的模型.我想保存模型并将其恢复以供进一步使用.批量规范由.完成

def batch_norm(input, phase):
    return tf.layers.batch_normalization(input, training=phase)
Run Code Online (Sandbox Code Playgroud)

阶段True在训练False期间和测试期间.

这似乎只是在呼唤

saver = tf.train.Saver()
saver.save(sess, savedir + "ckpt")
Run Code Online (Sandbox Code Playgroud)

不会很好,因为当我恢复模型时,它首先说成功恢复.它还说Attempting to use uninitialized value batch_normalization_585/beta如果我只是在图中运行一个节点.这是否与正确保存模型或我错过的其他内容有关?

tensorflow batch-normalization

7
推荐指数
1
解决办法
5326
查看次数

Keras批次归一化和样本权重

我正在tensorflow 网站上尝试训练和评估示例。具体来说,这部分内容:

import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()

x_train = x_train.reshape(60000, 784).astype('float32') / 255
x_test = x_test.reshape(10000, 784).astype('float32') / 255

y_train = y_train.astype('float32')
y_test = y_test.astype('float32')

def get_uncompiled_model():
  inputs = keras.Input(shape=(784,), name='digits')
  x = layers.Dense(64, activation='relu', name='dense_1')(inputs)
  x = layers.BatchNormalization()(x)
  x = layers.Dense(64, activation='relu', name='dense_2')(x)
  outputs = layers.Dense(10, activation='softmax', name='predictions')(x)
  model = keras.Model(inputs=inputs, outputs=outputs)
  return model

def get_compiled_model():
  model = get_uncompiled_model()
  model.compile(optimizer=keras.optimizers.RMSprop(learning_rate=1e-3),
              loss='sparse_categorical_crossentropy', …
Run Code Online (Sandbox Code Playgroud)

python keras tensorflow batch-normalization

6
推荐指数
1
解决办法
184
查看次数

批量归一化会破坏验证性能

我按照一些教程向我的模型添加了一些批量归一化,以缩短训练时间。这是我的模型:

model = Sequential()

model.add(Conv2D(16, kernel_size=(3, 3), activation='relu', input_shape=(64,64,3)))
model.add(BatchNormalization())

model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(64, kernel_size=(3, 3), activation='relu'))
model.add(BatchNormalization())

model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))
model.add(BatchNormalization())

model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(256, kernel_size=(3, 3), activation='relu'))
model.add(BatchNormalization())

model.add(MaxPooling2D(pool_size=(2, 2)))


model.add(Flatten())

model.add(Dense(512, activation='relu'))
model.add(Dropout(0.5))

#NB: adding more parameters increases the probability of overfitting!! Try to cut instead of adding neurons!! 
model.add(Dense(units=512, activation='relu'))
model.add(Dropout(0.5))

model.add(Dense(units=20, activation='softmax'))
Run Code Online (Sandbox Code Playgroud)

如果没有批量归一化,我的数据准确率约为 50%。添加批量归一化会破坏我的性能,验证准确度降低至 10%。

在此输入图像描述

为什么会发生这种情况?

conv-neural-network keras tensorflow batch-normalization

6
推荐指数
1
解决办法
4829
查看次数

CNN-LSTM 的批量归一化层

假设我有一个这样的模型(这是一个用于时间序列预测的模型):

ipt   = Input((data.shape[1] ,data.shape[2])) # 1
x     = Conv1D(filters = 10, kernel_size = 3, padding = 'causal', activation = 'relu')(ipt) # 2
x     = LSTM(15, return_sequences = False)(x) # 3
x = BatchNormalization()(x) # 4
out   = Dense(1, activation = 'relu')(x) # 5
Run Code Online (Sandbox Code Playgroud)

现在我想向这个网络添加批量标准化层。考虑到批量标准化不适用于 LSTM,我可以在Conv1D层之前添加它吗?我认为在LSTM.

另外,我在哪里可以在这个网络中添加 Dropout?一样的地方?(在批量标准化之后还是之前?)

  • AveragePooling1DConv1D和之间添加怎么样LSTM?在这种情况下,是否可以在层之间Conv1D和之间添加批量标准化AveragePooling1D而不对LSTM层产生任何影响?

conv-neural-network lstm keras tensorflow batch-normalization

6
推荐指数
1
解决办法
2188
查看次数

SpatialDropout2D、BatchNormalization 和激活函数的正确顺序?

对于 CNN 架构,我想使用 SpatialDropout2D 层而不是 Dropout 层。另外我想使用 BatchNormalization。到目前为止,我总是直接在卷积层之后但在激活函数之前设置 BatchNormalization,就像 Ioffe 和 Szegedy 的论文中提到的那样。我总是在 MaxPooling2D 层之后设置 dropout 层。

https://machinelearningmastery.com/how-to-reduce-overfit-with-dropout-regularization-in-keras/ 中, SpatialDropout2D 直接设置在卷积层之后。

我发现我现在应该以何种顺序应用这些层相当令人困惑。我还在 Keras 页面上读到 SpatialDropout 应该直接放在 ConvLayer 后面(但我再也找不到这个页面了)。

以下顺序是否正确?

ConvLayer - SpatialDropout - BatchNormalization - 激活函数 - MaxPooling

我真的希望得到提示并提前谢谢你

更新 我的目标实际上是在以下 CNN 架构 dropout 中交换空间 dropout:

model = Sequential()
model.add(Conv2D(32,(3,3))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Conv2D(32,(3,3))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2))
model.add(Dropout(0.2))

model.add(Conv2D(64, (3,3))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Conv2D(64,(3,3))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2))
model.add(Dropout(0.2))

model.add(Flatten())
model.add(Dense(512))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(0.4))
model.add(Dense(10))
model.add(Activation('softmax'))
Run Code Online (Sandbox Code Playgroud)

keras activation-function batch-normalization dropout

6
推荐指数
1
解决办法
1652
查看次数

Batchnorm2d Pytorch - 为什么将通道数传递给 batchnorm?

为什么我需要将先前的通道数传递给 batchnorm?batchnorm 应该对批处理中的每个数据点进行归一化,为什么它需要有通道数呢?

machine-learning deep-learning pytorch batch-normalization batchnorm

6
推荐指数
1
解决办法
1869
查看次数