最初的问题是关于TensorFlow实现的具体问题.但是,答案仅适用于实施.这个一般答案也是TensorFlow的正确答案.
在TensorFlow中使用批量标准化和dropout(特别是使用contrib.layers)时,我是否需要担心排序?
似乎有可能如果我使用dropout然后立即批量标准化可能会有麻烦.例如,如果批量标准化的偏移训练到训练输出的较大比例数,但是然后将相同的偏移应用于较小的(由于具有更多输出的补偿)标度数而在测试期间没有丢失,那么转移可能会关闭.TensorFlow批量标准化层是否会自动对此进行补偿?或者这不是因为某些原因我不在乎?
此外,在将这两者结合使用时还有其他需要注意的问题吗?例如,假设我使用他们以正确的顺序在问候上述(假设有是一个正确的顺序),可以存在与使用分批正常化和漏失在多个连续层烦恼?我没有立即看到问题,但我可能会遗漏一些东西.
非常感谢!
更新:
实验测试似乎表明排序确实很重要.我运行了相同的网络两次,只有批量规范和退出反向.当辍学率在批量规范之前时,随着训练损失的减少,验证损失似乎在增加.在另一种情况下,他们都会倒下.但就我而言,动作很慢,所以在经过多次训练后情况可能会发生变化,这只是一次测试.一个更明确和知情的答案仍然会受到赞赏.
我在一堆我自己的图像数据上运行卷积神经网络(这个),形状(通道数,高度,宽度)=(3, 30, 30)。我有76960个训练样本,19240个测试样本,一共有39个类。最后几块代码是:
# Train the model using Stochastic grad descent + momentum
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
cnn.compile(loss='categorical_crossentropy',
optimizer=sgd,
metrics=['accuracy'])
batch_size = 128
nb_epoch = 50
cnn.fit(x_train, y_train,
batch_size = batch_size,
nb_epoch = nb_epoch,
validation_data=(x_test, y_test),
shuffle=True)
Run Code Online (Sandbox Code Playgroud)
训练损失和准确率随 epoch 变化,但验证准确率仅从第 1 个到第 2 个 epoch(从 0.3387 到 0.3357)发生变化,然后一直保持在 0.3357。
我尝试过不同的批量大小(32、128 或 256)、学习率(从 1e-6 到 0.1,一路乘以 10)并尝试使用或不使用数据标准化(基本均值偏移和除以 sd )。这些都没有奏效。