我在使用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) 在这里提出了一个类似的未解决的问题。我正在测试一种深度增强学习算法,该算法在张量流中使用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) 我正在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) 如何设置 Keras 批量归一化层的权重?
我对文档有点困惑
weights:初始化权重。2 个 Numpy 数组的列表,具有形状:[(input_shape,), (input_shape,)] 注意这个列表的顺序是 [gamma, beta, mean, std]
我们是否需要全部四个 [gamma、beta、mean、std]?有没有办法只使用 [gamma, beta] 来设置权重?
我在 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.将批量大小从 64 增加到 256 2. 降低学习率 3. 添加 L2-reg 和/或不同幅度的 dropout 4. 训练/验证拆分比率:20%、30%。仅供参考,数据集是 kaggle 猫狗图像。
我正在训练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) 我正在尝试使用 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
我正在尝试将 BatchNorm 层用于图像分类任务,但我在实现 keras 时遇到了问题。当我使用 BatchNormalization 层运行相同的网络时,我获得了更好的训练准确度和验证准确度,但在训练过程中,验证准确度波动很大。以下是训练的情况。
我曾尝试更改批量大小(从 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
我试图找出 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
我正在遵循TensorFlow 官方网站上的迁移学习和微调指南。它指出在微调期间,批量归一化层应处于推理模式:
BatchNormalization关于图层的重要说明许多图像模型包含
BatchNormalization图层。从所有可以想象的角度来看,该层都是一个特例。以下是一些需要记住的事情。
BatchNormalization包含 2 个不可训练的权重,在训练期间更新。这些是跟踪输入的均值和方差的变量。- 当您设置 时
bn_layer.trainable = False,BatchNormalization图层将在推理模式下运行,并且不会更新其均值和方差统计数据。一般来说,其他层的情况并非如此,因为权重可训练性和推理/训练模式是两个正交的概念。但在层的情况下两者是并列的BatchNormalization。- 当您解冻包含
BatchNormalization图层的模型以进行微调时,您应该在调用基础模型时BatchNormalization通过传递将图层保持在推理模式。training=False否则,应用于不可训练权重的更新将突然破坏模型所学到的知识。您将在本指南末尾的端到端示例中看到此模式的实际应用。
尽管如此,其他一些来源,例如这篇文章(标题为 ResNet 的迁移学习),说了一些完全不同的内容:
Run Code Online (Sandbox Code Playgroud)for layer in resnet_model.layers: if isinstance(layer, BatchNormalization): layer.trainable = True else: layer.trainable = False
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