Tensorflow 具有BatchNormalization的模型:停滞测试损失

Tensorflow 具有BatchNormalization的模型:停滞测试损失,tensorflow,keras,keras-layer,Tensorflow,Keras,Keras Layer,我用Keras写了一个神经网络。它包含批处理规范化层 当我用model.fit训练它时,一切都很好。当使用tensorflow对其进行训练时,训练是很好的,但验证步骤的性能总是很差,并且很快就会饱和(准确度达到5%、10%、40%、40%、40%,损失也停滞不前) 我需要使用tensorflow,因为它允许在训练的监控部分有更多的灵活性 我强烈怀疑这与BN层或/和我计算测试性能的方式有关(见下文) 当计算包含Keras BatchNormalizatin层的模型的验证精度时,有什么特别的事情要做

我用Keras写了一个神经网络。它包含批处理规范化层

当我用
model.fit
训练它时,一切都很好。当使用tensorflow对其进行训练时,训练是很好的,但验证步骤的性能总是很差,并且很快就会饱和(准确度达到5%、10%、40%、40%、40%,损失也停滞不前)

我需要使用tensorflow,因为它允许在训练的监控部分有更多的灵活性

我强烈怀疑这与BN层或/和我计算测试性能的方式有关(见下文)

当计算包含Keras BatchNormalizatin层的模型的验证精度时,有什么特别的事情要做吗


提前谢谢你

事实上,我发现了

因此,实例化层时,您可以做的只是:

x = Input((dim1, dim2))
h = Dense(dim3)(x)
h = BatchNormalization()(h, training=K.learning_phase())
在验证集上评估性能时:

feed_dict = {x: X_valid,
             batch_size_placeholder: X_valid.shape[0],
             K.learning_phase(): 0,
             beta: self.warm_up_schedule(global_step)
             }
acc = accuracy.eval(feed_dict=feed_dict)
summary_ = merged.eval(feed_dict=feed_dict)
test_writer.add_summary(summary_, global_step)

实际上,我发现了

因此,实例化层时,您可以做的只是:

x = Input((dim1, dim2))
h = Dense(dim3)(x)
h = BatchNormalization()(h, training=K.learning_phase())
在验证集上评估性能时:

feed_dict = {x: X_valid,
             batch_size_placeholder: X_valid.shape[0],
             K.learning_phase(): 0,
             beta: self.warm_up_schedule(global_step)
             }
acc = accuracy.eval(feed_dict=feed_dict)
summary_ = merged.eval(feed_dict=feed_dict)
test_writer.add_summary(summary_, global_step)

实际上我错了,它不起作用,但我不明白为什么我遇到了类似的问题,并发现在
BatchNormalization
调用中设置
training=1
似乎有效。将
K.learning\u phase()
设置为0或1似乎不会对输出产生影响,因为批处理规范化是相关的,并且只要您没有运行培训op,批处理规范参数就不会更改。因此建议使用不同的占位符而不是K.learning\u phase()实际上我错了,它不起作用,但我不明白为什么我遇到了类似的问题,并发现在
BatchNormalization
调用中设置
training=1
似乎有效。将
K.learning_phase()
设置为0或1似乎不会影响批标准化的输出,并且只要您没有运行培训op,批规范参数就不会更改。因此建议使用不同的占位符而不是K.learning_phase()?