我正在使用keras来实现基本的CNN情绪检测。这是我的模型架构
def HappyModel(input_shape):
X_Input = Input(input_shape)
X = ZeroPadding2D((3,3))(X_Input)
X = Conv2D(32, (7,7), strides=(1,1), name='conv0')(X)
X = BatchNormalization(axis = 3, name='bn0')(X)
X = Activation('relu')(X)
X = MaxPooling2D((2,2), name='mp0')(X)
X = Flatten()(X)
X = Dense(1, activation='sigmoid', name='fc0')(X)
model = Model(inputs = X_Input, outputs = X, name='hmodel')
return model
happyModel = HappyModel(X_train.shape[1:])
happyModel.compile(Adam(lr=0.1) ,loss= 'binary_crossentropy', metrics=['accuracy'])
happyModel.fit(X_train, Y_train, epochs = 50, batch_size=16, validation_data=(X_test, Y_test))
看来,模型损失和准确性在每个时代步骤中都没有改变。感觉梯度下降停留在局部最小值上,如下所示: https://i.imgur.com/9As8v0c.png
曾尝试使用Adam和SGD优化器,学习率分别为.1和.5,仍然没有运气。
事实证明,如果我更改编译方法命令参数,则该模型将在训练时期很好地收敛
happyModel.compile(optimizer = 'adam' ,loss= 'binary_crossentropy', metrics=['accuracy'])
Keras文档说,如果我们以此方式编写参数,它将使用默认参数adam(https://keras.io/optimizers/)
keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)
但是,如果我将模型编译方法更改为默认参数,
happyModel.compile(Adam(lr=0.001, beta_1=0.9, beta_2=0.999, decay=0.0),loss= 'binary_crossentropy', metrics=['accuracy'])
准确性和损失仍然存在。 Keras上的Adam优化器的两种不同实现之间有什么区别?
答案 0 :(得分:0)
您可以在keras-team官方页面上查看已关闭的问题: https://github.com/keras-team/keras/issues/5564
您可能遇到语法问题,因为两种方式并不完全等效。