ool*_*ole 5 keras tensorflow batch-normalization
我正在训练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: 0.3358 - acc: 0.8879
8/10 [=======================>......] - ETA: 0s - loss: 0.3315 - acc: 0.8863
9/10 [==========================>...] - ETA: 0s - loss: 0.3215 - acc: 0.8885
10/10 [==============================] - 3s - loss: 0.3106 - acc: 0.8863 - val_loss: 1.5021 - val_acc: 0.2707
Run Code Online (Sandbox Code Playgroud)
当我评估相同的训练数据集时,准确度实际上与我在训练期间所看到的一致(我希望它至少与在同一数据集上训练期间一样好).
直接评估或使用时
K.set_learning_phase(0)
Run Code Online (Sandbox Code Playgroud)
我得到,类似于验证(使用batch_size = 32评估x_train):
Evaluation Accuracy: 0.266318537392, Loss: 1.50756853772
Run Code Online (Sandbox Code Playgroud)
所以之后
K.set_learning_phase(1)
Run Code Online (Sandbox Code Playgroud)
我得到(使用batch_size = 32评估x_train):
Evaluation Accuracy: 0.887728457507, Loss: 0.335956037511
Run Code Online (Sandbox Code Playgroud)
model = models.Sequential()
model.add(Conv2D(80, first_conv_size, strides=2, activation="relu", input_shape=input_shape, padding=padding_name))
model.add(BatchNormalization(axis=-1))
model.add(MaxPooling2D(first_max_pool_size, strides=4, padding=padding_name))
...
Run Code Online (Sandbox Code Playgroud)
在线下我还会有一些辍学图层,我将其删除以调查Batchnormalization行为.我打算在非训练阶段使用该模型进行正常预测.
它不应该像那样工作,还是我错过了一些额外的配置?
谢谢!
我正在使用keras 2.0.8和tensorflow 1.1.0(anaconda)
这真的很烦人。当您将 设为learning_phase
-True
时,BatchNormalization
层会直接从数据中获取归一化统计数据,当您的batch_size
. 我前段时间遇到过类似的问题 - 这里有我的解决方案:
构建模型时 - 如果模型将在学习或非学习阶段进行预测,则添加一个选项,并且在学习阶段使用以下类而不是BatchNormalization
:
class NonTrainableBatchNormalization(BatchNormalization):
"""
This class makes possible to freeze batch normalization while Keras
is in training phase.
"""
def call(self, inputs, training=None):
return super(
NonTrainableBatchNormalization, self).call(inputs, training=False)
Run Code Online (Sandbox Code Playgroud)训练模型后 - 将其权重重置为副本NonTrainable
:
learning_phase_model.set_weights(learned_model.get_weights())
Run Code Online (Sandbox Code Playgroud)现在您可以充分享受BatchNormalization
在learning_phase
.
归档时间: |
|
查看次数: |
1708 次 |
最近记录: |