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

时间:2018-09-12 15:49:24

标签: python tensorflow keras deep-learning

  

我想针对各种优化程序检查模型的性能   (sgd,rmsprop,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

2 个答案:

答案 0 :(得分:2)

使用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() 

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

答案 1 :(得分:0)

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