我正在训练 CNN,为了调试我的问题,我正在处理实际训练数据的一小部分。
在训练过程中,损失和准确性似乎非常合理且相当不错。(在示例中,我使用相同的小子集进行验证,问题已经显示在这里)
适合 x_train 并在 x_train 上验证,使用 batch_size=32
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
当我在相同的训练数据集上进行评估时,准确度确实与我在训练期间看到的有所不同(我希望它至少与在同一数据集上进行训练时一样好)。
当直接评估或使用
K.set_learning_phase(0)
我得到,类似于验证(Evaluating on x_train using batch_size=32):
Evaluation Accuracy: 0.266318537392, Loss: 1.50756853772
如果我将后端设置为学习阶段,结果会再次变得相当好,因此每批标准化似乎运作良好。我怀疑没有正确使用累积的均值和方差。
所以之后
K.set_learning_phase(1)
我得到(使用 batch_size=32 对 x_train 进行评估):
Evaluation Accuracy: 0.887728457507, Loss: 0.335956037511
我在第一个卷积层之后添加了批标准化层,如下所示:
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))
...
再往下,我还会有一些 dropout 层,我将其删除以研究 Batchnormalization 行为。我的打算是在非训练阶段使用该模型进行正常预测。
它不应该那样工作,还是我缺少一些额外的配置?
谢谢!
我正在使用 keras 2.0.8 和 tensorflow 1.1.0 (anaconda)