我是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)
我尝试过使用批量大小和优化器,但它看起来并不是很有效。我做错了吗?
答案 0 :(得分:1)
我将学习率提高到0.01
,看起来网络能够学到一些东西(我得到Epoch 1000/5000- 0s - loss: 0.2330
)。
我认为值得在原始Batch Normalization论文的摘要中注意以下内容:
批量标准化允许我们使用更高的学习率和 初始化时要小心。它还充当正规化器(...)
这暗示了学习率的提高(这可能是你想要尝试的东西)。
请注意,由于它的工作方式与正规化相同,因此BatchNorm 应使您的训练损失更严重 - 它应该防止过度拟合,从而缩小列车与测试/有效错误之间的差距。