Python 使用不同的优化器运行Keras序列模型
我想对照各种优化器检查模型的性能 (新加坡元、rmsprop、adam、adamax等) 所以我定义了一个keras序列模型,然后我做了这个 我对所有优化器都这样做(在上面的代码中只提到了sgd和rmsprop),然后执行这些语句。所以现在发生的事情是,第一个优化器从低精度开始,然后随着更多时代的发生,精度增加。但是下一个优化器从已经很高的精度开始 以上代码正确吗?还是每次都需要重置模型 在我编译之前 请参见下面不同优化器的第一个历元输出Python 使用不同的优化器运行Keras序列模型,python,tensorflow,keras,deep-learning,Python,Tensorflow,Keras,Deep Learning,我想对照各种优化器检查模型的性能 (新加坡元、rmsprop、adam、adamax等) 所以我定义了一个keras序列模型,然后我做了这个 我对所有优化器都这样做(在上面的代码中只提到了sgd和rmsprop),然后执行这些语句。所以现在发生的事情是,第一个优化器从低精度开始,然后随着更多时代的发生,精度增加。但是下一个优化器从已经很高的精度开始 以上代码正确吗?还是每次都需要重置模型 在我编译之前 请参见下面不同优化器的第一个历元输出 --sgd start--- Train on 1712
--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()
这个解决方案应该能解决你的问题。让我知道它是否有效。我不明白…什么是K?我已经编辑了我的答案。拟合模型后使用K.clear_session()重置keras对象。@Nitin K是对运行keras的后端引擎的引用。例如,如果您使用的是TensorFlow后端,则K.placeholder(shape=(2,3,4))相当于tf.placeholder(tf.float32,shape=(2,3,4))。
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()