我正在训练大约10,000张图像上的covnet,并注意到将优化器从opt = SGD()
切换到opt = 'adam'
会导致精确度大幅降低,使所有其他参数保持平等。使用SGD(),我可以获得大约80%的准确度(在每个时期之后逐渐增加)。对于亚当,我在每个时代都坚持22.25%的验证准确度。
我想了解可能的原因是什么。
参数
dropout_prob = 0.2
activation_function = 'relu'
loss_function = 'categorical_crossentropy'
batch_size = 32
epoch_count = 20
num_classes = 3
模型
model = Sequential()
model.add(Conv2D(filters=16, kernel_size=(3, 3), input_shape=inp_shape))
model.add(Conv2D(filters=32, kernel_size=(3, 3)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(rate=dropout_prob))
model.add(Flatten())
model.add(Dense(128, activation=activation_function))
model.add(Dropout(rate=dropout_prob))
model.add(Dense(64, activation=activation_function))
model.add(Dropout(rate=dropout_prob))
model.add(Dense(32, activation=activation_function))
model.add(Dense(num_classes, activation='softmax'))
model.summary()
model.compile(loss=loss_function, optimizer=opt, metrics=['accuracy'])
history = model.fit(x_train, y_train_cat, batch_size=batch_size, epochs=epoch_count,
verbose=verbose_level,
validation_data=(x_test, y_test_cat))
答案 0 :(得分:2)
不同的优化器可能需要不同的优化超参数来收敛。 尝试使用
替换opt='adam'
(使用默认学习率)
opt = keras.optimizers.Adam(lr=learning_rate)
而不是使用默认值learning_rate
,而是使用cross-validation选择其值。
根据经验,通常学习率介于1e-6..0.1之间。您可以尝试使用以下学习率值:[1e-6, 3e-6, 1e-5, 3e-5, 1e-4, ..., 1e-1]
答案 1 :(得分:0)
如Improving Generalization Performance by Switching from Adam to SGD中所述:
尽管训练效果出众,但自适应优化方法如 因为发现Adam,Adagrad或RMSprop的概括性很差 与随机梯度下降(SGD)相比。这些方法往往 在训练初期表现良好,但表现不佳 在培训的后期阶段由SGD进行。
为了结合这两个优化器的优势,他们引入了从Adam到SGD的切换技术,方法是:(a)切换点,即在切换到SGD之前与Adam训练模型的时间。作为经验法则,论文至少要经过10个周期才能指向收缩。 (b)切换后用于SGD的学习率:由Adam的动量参数beta_1
确定。
可以找到很好的解释here。