繁体   English   中英

使用不同的优化器运行Keras顺序模型

[英]Running Keras Sequential model with different optimizers

我想对照各种优化器(SGD,RMSPS,Adam,adamax等)检查模型的性能

所以我定义了一个keras顺序模型,然后我这样做

epochs = 50
print('--sgd start---')

model.compile(optimizer='sgd', loss='mse', metrics=['accuracy'])

checkpointer_sgd = ModelCheckpoint(filepath='my_model_sgd.h5', 
                               verbose=1, save_best_only=True)


history_sgd = model.fit(X_train, y_train, 
          validation_split=0.2,epochs=epochs, batch_size=32, callbacks=[checkpointer_sgd],verbose=1)

print('--sgd end---')

print('--------------------------------------------')

print('--rmsprop start---')

model.compile(optimizer='rmsprop', loss='mse', metrics=['accuracy'])

checkpointer_rmsprop = ModelCheckpoint(filepath='my_model_rmsprop.h5', 
                               verbose=1, save_best_only=True)

history_rmsprop = model.fit(X_train, y_train, 
          validation_split=0.2,
          epochs=epochs, batch_size=32, callbacks=[checkpointer_rmsprop],verbose=1)

print('--rmsprop end---')

我对所有优化程序都执行此操作(在上面的代码中仅提到了sgd和rmsprop),然后执行语句。 因此,现在发生的情况是,第一个优化器从低精度开始,然后随着更多时期的出现而提高了精度。 但是下一个优化器已经从高精度开始。

上面的代码是否正确,还是在编译之前每次都要重置模型?

请参阅下面的第一纪元输出以了解不同的优化程序

--sgd start---
Train on 1712 samples, validate on 428 samples
Epoch 1/50
1712/1712 [==============================] - 46s 27ms/step - loss: 0.0510 - acc: 0.2985 - val_loss: 0.0442 - val_acc: 0.6986

--rmsprop start---
Train on 1712 samples, validate on 428 samples
Epoch 1/50
1712/1712 [==============================] - 46s 27ms/step - loss: 0.0341 - acc: 0.5940 - val_loss: 0.0148 - val_acc: 0.6963

--adagrad start---
Train on 1712 samples, validate on 428 samples
Epoch 1/50
1712/1712 [==============================] - 44s 26ms/step - loss: 0.0068 - acc: 0.6951 - val_loss: 0.0046 - val_acc: 0.6963

--adadelta start---
Train on 1712 samples, validate on 428 samples
Epoch 1/50
1712/1712 [==============================] - 52s 30ms/step - loss: 8.0430e-04 - acc: 0.8125 - val_loss: 9.4660e-04 - val_acc: 0.7850

--adam start---
Train on 1712 samples, validate on 428 samples
Epoch 1/50
1712/1712 [==============================] - 47s 27ms/step - loss: 7.7599e-04 - acc: 0.8201 - val_loss: 9.8981e-04 - val_acc: 0.7757

--adamax start---
Train on 1712 samples, validate on 428 samples
Epoch 1/50
1712/1712 [==============================] - 54s 31ms/step - loss: 6.4941e-04 - acc: 0.8359 - val_loss: 9.2495e-04 - val_acc: 0.7991

使用K.clear_session()将清除所有内容。

from keras import backend as K

def get_model():
    model = Sequential()
    model.add(Dense(12, input_dim=8, activation='relu'))
    model.add(Dense(8, activation='relu'))
    model.add(Dense(1,activation='sigmoid'))
    return model

model = get_model()
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X, Y, epochs=150, batch_size=10, verbose=0)
K.clear_session() # it will destroy keras object

model1 = get_model()
model1.compile(loss='binary_crossentropy', optimizer='sgd', metrics=['accuracy'])
model1.fit(X, Y, epochs=150, batch_size=10, verbose=0)
K.clear_session() 

此解决方案应该可以解决您的问题。 让我知道它是否有效。

重新编译模型不会更改其状态。 编译前学习的权重将与编译后相同。 您需要删除模型对象以清除权重并创建新的权重,然后再进行编译。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM