标签: batch-normalization

在恢复模型时使用批量规范?

我在使用tensorflow恢复模型时使用批量规范有一点问题.

以下是我的批量规范,从这里:

def _batch_normalization(self, input_tensor, is_training, batch_norm_epsilon, decay=0.999):
    """batch normalization for dense nets.

    Args:
        input_tensor: `tensor`, the input tensor which needed normalized.
        is_training: `bool`, if true than update the mean/variance using moving average,
                             else using the store mean/variance.
        batch_norm_epsilon: `float`, param for batch normalization.
        decay: `float`, param for update move average, default is 0.999.

    Returns:
        normalized params.
    """
    # actually batch normalization is according to the channels dimension.
    input_shape_channels = int(input_tensor.get_shape()[-1])

    # scala and beta using in the …
Run Code Online (Sandbox Code Playgroud)

neural-network deep-learning tensorflow batch-normalization

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

tf.keras中的批次归一化不计算平均均值和平均方差

在这里提出一个类似的未解决的问题。我正在测试一种深度增强学习算法,该算法在张量流中使用keras后端。我对tf.keras不太熟悉,不过我想添加批处理规范化层。因此,我尝试使用tf.keras.layers.BatchNormalization(),但是由于update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)为空,它不会更新平均均值和方差。

使用常规tf.layers.batch_normalization似乎很好。但是,由于完整的算法有些复杂,因此我需要找到一种使用方法tf.keras

由于不为空,因此标准tf层将batch_normed = tf.layers.batch_normalization(hidden, training=True)更新平均值update_ops

[
    <tf.Operation 'batch_normalization/AssignMovingAvg' type=AssignSub>, 
    <tf.Operation 'batch_normalization/AssignMovingAvg_1' type=AssignSub>, 
    <tf.Operation 'batch_normalization_1/AssignMovingAvg' type=AssignSub>, 
    <tf.Operation 'batch_normalization_1/AssignMovingAvg_1' type=AssignSub>
]
Run Code Online (Sandbox Code Playgroud)

无效的最小示例:

import tensorflow as tf
import numpy as np

tf.reset_default_graph()
graph = tf.get_default_graph()
tf.keras.backend.set_learning_phase(True)

input_shapes = [(3, )]
hidden_layer_sizes = [16, 16]

inputs = [
    tf.keras.layers.Input(shape=input_shape)
    for input_shape in input_shapes
]

concatenated = tf.keras.layers.Lambda(
    lambda x: tf.concat(x, axis=-1)
)(inputs) …
Run Code Online (Sandbox Code Playgroud)

python keras tensorflow batch-normalization

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

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
查看次数

如何设置批量归一化层的权重?

如何设置 Keras 批量归一化层的权重?

我对文档有点困惑

weights:初始化权重。2 个 Numpy 数组的列表,具有形状:[(input_shape,), (input_shape,)] 注意这个列表的顺序是 [gamma, beta, mean, std]

我们是否需要全部四个 [gamma、beta、mean、std]?有没有办法只使用 [gamma, beta] 来设置权重?

keras batch-normalization

5
推荐指数
1
解决办法
3276
查看次数

使用批量归一化时的嘈杂验证损失(相对于纪元)

我在 Keras 中使用以下模型:

输入/conv1/conv2/maxpool/conv3/conv4/maxpool/conv5/conv6/maxpool/FC1/FC2/FC3/softmax(2个节点)。

当我在每次激活 (Wx) 之后和非线性 ReLu(Wx) 之前使用 Batch Normalization 时,验证的损失和准确性是嘈杂的(Red=Training_set / Blue=validation_set):

图1-与BN。

如果我删除 BN 层,则验证损失与训练损失一样平滑 图2.

我已经尝试了以下(但没有奏效):

1.将批量大小从 64 增加到 256 2. 降低学习率 3. 添加 L2-reg 和/或不同幅度的 dropout 4. 训练/验证拆分比率:20%、30%。仅供参考,数据集是 kaggle 猫狗图像。

validation deep-learning keras batch-normalization

5
推荐指数
0
解决办法
952
查看次数

Keras Batchnormalization,培训数据集的培训和评估结果不同

我正在训练CNN,为了调试我的问题,我正在研究一小部分实际训练数据.

在训练期间,损失和准确性似乎非常合理且非常好.(在示例中,我使用相同的小子集进行验证,此问题已在此处显示)

适用于x_train并使用batch_size = 32在x_train上进行验证

Epoch 10/10
1/10 [==>...........................] - ETA: 2s - loss: 0.5126 - acc: 0.7778
2/10 [=====>........................] - ETA: 1s - loss: 0.3873 - acc: 0.8576
3/10 [========>.....................] - ETA: 1s - loss: 0.3447 - acc: 0.8634
4/10 [===========>..................] - ETA: 1s - loss: 0.3320 - acc: 0.8741
5/10 [==============>...............] - ETA: 0s - loss: 0.3291 - acc: 0.8868
6/10 [=================>............] - ETA: 0s - loss: 0.3485 - acc: 0.8848
7/10 [====================>.........] - ETA: 0s - loss: …
Run Code Online (Sandbox Code Playgroud)

keras tensorflow batch-normalization

5
推荐指数
1
解决办法
1708
查看次数

如何在LSTM中有效使用批量归一化?

我正在尝试使用 R 中的 keras 在 LSTM 中使用批量归一化。在我的数据集中,目标/输出变量是列Sales,数据集中的每一行记录Sales一年中的每一天(2008-2017)。数据集如下所示:

销售数据

我的目标是基于这样的数据集构建一个 LSTM 模型,该模型应该能够在训练结束时提供预测。我正在使用 2008-2016 年的数据训练这个模型,并使用 2017 年数据的一半作为验证,其余作为测试集。

之前,我尝试使用 dropout 和提前停止创建模型。如下所示:

mdl1 <- keras_model_sequential()
mdl1 %>%
  layer_lstm(units = 512, input_shape = c(1, 3), return_sequences = T ) %>%  
  layer_dropout(rate = 0.3) %>%
  layer_lstm(units = 512, return_sequences = FALSE) %>%
  layer_dropout(rate = 0.2) %>%
  layer_dense(units = 1, activation = "linear")

mdl1 %>% compile(loss = 'mse', optimizer = 'rmsprop')
Run Code Online (Sandbox Code Playgroud)

模型如下

___________________________________________________________
Layer (type)               Output Shape         Param #    
===========================================================
lstm_25 (LSTM)             (None, 1, …
Run Code Online (Sandbox Code Playgroud)

r keras tensorflow recurrent-neural-network batch-normalization

5
推荐指数
1
解决办法
9160
查看次数

keras 中的 BatchNormalization 层导致验证准确度波动

我正在尝试将 BatchNorm 层用于图像分类任务,但我在实现 keras 时遇到了问题。当我使用 BatchNormalization 层运行相同的网络时,我获得了更好的训练准确度和验证准确度,但在训练过程中,验证准确度波动很大。以下是训练的情况。

使用batchnorm训练准确度

没有batchnorm的训练精度

我曾尝试更改批量大小(从 128 到 1024),并更改 batchnorm 层的动量参数,但变化不大。

我在 conv/Dense 层和它们的激活层之间使用 batchnorm。

我还检查了 conv 层的归一化轴是否正确(使用 Theano 时轴 = 1)。

有没有人遇到过类似的问题?有一些关于 batchnorm 的 keras 实现的问题,但我还没有找到解决这个问题的方法。

感谢您对类似问题的任何指示或参考。

编辑:这是我用来构建 mdoel 的 keras 代码,但我尝试了不同的架构和不同的动力:

    # create model
    model = Sequential()
    model.add(Conv2D(20, (4, 4), input_shape=(input_channels,s,s), activation='relu'))
    model.add(MaxPooling2D(pool_size=(5, 5)))
    model.add(Conv2D(30, (3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(3, 3)))
    model.add(GlobalAveragePooling2D())
    model.add(Dense(128))
    if use_batch_norm:
        model.add(BatchNormalization(axis=1, momentum=0.6))
    model.add(Activation('relu'))
    model.add(Dropout(dropout_rate))
    model.add(Dense(nb_classes))
    if use_batch_norm:
        model.add(BatchNormalization(axis=1, momentum=0.6))
    model.add(Activation('softmax'))
Run Code Online (Sandbox Code Playgroud)

python conv-neural-network keras keras-layer batch-normalization

5
推荐指数
0
解决办法
1556
查看次数

tf.keras.layers.BatchNormalization 与 trainable=False 似乎没有更新其内部移动均值和方差

我试图找出 BatchNormalization 层在 TensorFlow 中的具体表现。我想出了以下一段代码,据我所知,它应该是一个完全有效的 keras 模型,但是 BatchNormalization 的均值和方差似乎没有更新。

来自文档https://www.tensorflow.org/api_docs/python/tf/keras/layers/BatchNormalization

对于 BatchNormalization 层,在该层上设置 trainable = False 意味着该层随后将在推理模式下运行(这意味着它将使用移动均值和移动方差来规范化当前批次,而不是使用均值和当前批次的方差)。

我希望模型在每次后续预测调用时返回不同的值。然而,我看到的是返回 10 次的完全相同的值。谁能向我解释为什么 BatchNormalization 层不更新其内部值?

import tensorflow as tf
import numpy as np

if __name__ == '__main__':

    np.random.seed(1)
    x = np.random.randn(3, 5) * 5 + 0.3

    bn = tf.keras.layers.BatchNormalization(trainable=False, epsilon=1e-9)
    z = input = tf.keras.layers.Input([5])
    z = bn(z)

    model = tf.keras.Model(inputs=input, outputs=z)

    for i in range(10):
        print(x)
        print(model.predict(x))
        print()
Run Code Online (Sandbox Code Playgroud)

我使用TensorFlow 2.1.0

python tensorflow batch-normalization tensorflow2.0

5
推荐指数
1
解决办法
7506
查看次数

如何在迁移学习期间冻结批标准化层

我正在遵循TensorFlow 官方网站上的迁移学习和微调指南。它指出在微调期间,批量归一化层应处于推理模式:

BatchNormalization关于图层的重要说明

许多图像模型包含BatchNormalization图层。从所有可以想象的角度来看,该层都是一个特例。以下是一些需要记住的事情。

  • BatchNormalization包含 2 个不可训练的权重,在训练期间更新。这些是跟踪输入的均值和方差的变量。
  • 当您设置 时bn_layer.trainable = FalseBatchNormalization图层将在推理模式下运行,并且不会更新其均值和方差统计数据。一般来说,其他层的情况并非如此,因为权重可训练性和推理/训练模式是两个正交的概念。但在层的情况下两者是并列的BatchNormalization
  • 当您解冻包含BatchNormalization图层的模型以进行微调时,您应该在调用基础模型时BatchNormalization通过传递将图层保持在推理模式。training=False否则,应用于不可训练权重的更新将突然破坏模型所学到的知识。

您将在本指南末尾的端到端示例中看到此模式的实际应用。

尽管如此,其他一些来源,例如这篇文章(标题为 ResNet 的迁移学习),说了一些完全不同的内容:

for layer in resnet_model.layers:
    if isinstance(layer, BatchNormalization):
        layer.trainable = True
    else:
        layer.trainable = False
Run Code Online (Sandbox Code Playgroud)

training无论如何,我知道 TensorFlow 中的和参数之间存在差异trainable

我正在从文件加载模型,如下所示:

model = tf.keras.models.load_model(path)
Run Code Online (Sandbox Code Playgroud)

我以这种方式解冻(或者实际上冻结其余部分)一些顶层:

model.trainable = True

for layer in model.layers:
    if layer not in model.layers[idx:]:
        layer.trainable = False …
Run Code Online (Sandbox Code Playgroud)

neural-network keras tensorflow batch-normalization tensorflow2.0

5
推荐指数
1
解决办法
5914
查看次数