Keras批量标准化停止收敛

时间:2018-02-17 14:06:54

标签: keras batch-normalization

我是keras的新手并且一直在尝试各种事情,例如BatchNormalization,但它根本不起作用。当BatchNormalization线被注释掉时,它会收敛到0.04左右或更好,但是随着它会收敛到0.71然后卡在那里,我不确定是什么错误。

from sklearn import preprocessing
from sklearn.datasets import load_boston
from keras.models import Model
from keras.layers import Input, Dense
from keras.layers.normalization import BatchNormalization
import keras.optimizers

boston = load_boston()

x = boston.data
y = boston.target

normx = preprocessing.scale(x)
normy = preprocessing.scale(y)

# doesnt construct output layer
def layer_looper(inputs, number_of_loops, neurons):
    inputs_copy = inputs
    for i in range(number_of_loops):

        inputs_copy = Dense(neurons, activation='relu')(inputs_copy)
        inputs_copy = BatchNormalization()(inputs_copy)

    return inputs_copy

inputs = Input(shape = (13,))

x = layer_looper(inputs, 40, 20)

predictions = Dense(1, activation='linear')(x)

model = Model(inputs=inputs, outputs=predictions)

opti = keras.optimizers.Adam(lr=0.0001)
model.compile(loss='mean_absolute_error', optimizer=opti, metrics=['acc'])

print(model.summary())

model.fit(normx, normy, epochs=5000, verbose=2, batch_size=128)

我尝试过使用批量大小和优化器,但它看起来并不是很有效。我做错了吗?

1 个答案:

答案 0 :(得分:1)

我将学习率提高到0.01,看起来网络能够学到一些东西(我得到Epoch 1000/5000- 0s - loss: 0.2330)。

我认为值得在原始Batch Normalization论文的摘要中注意以下内容:

  

批量标准化允许我们使用更高的学习率和   初始化时要小心。它还充当正规化器(...)

这暗示了学习率的提高(这可能是你想要尝试的东西)。

请注意,由于它的工作方式与正规化相同,因此BatchNorm 使您的训练损失更严重 - 它应该防止过度拟合,从而缩小列车与测试/有效错误之间的差距。