Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用不同的优化器运行Keras序列模型_Python_Tensorflow_Keras_Deep Learning - Fatal编程技术网

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

Python 使用不同的优化器运行Keras序列模型,python,tensorflow,keras,deep-learning,Python,Tensorflow,Keras,Deep Learning,我想对照各种优化器检查模型的性能 (新加坡元、rmsprop、adam、adamax等) 所以我定义了一个keras序列模型,然后我做了这个 我对所有优化器都这样做(在上面的代码中只提到了sgd和rmsprop),然后执行这些语句。所以现在发生的事情是,第一个优化器从低精度开始,然后随着更多时代的发生,精度增加。但是下一个优化器从已经很高的精度开始 以上代码正确吗?还是每次都需要重置模型 在我编译之前 请参见下面不同优化器的第一个历元输出 --sgd start--- Train on 1712

我想对照各种优化器检查模型的性能 (新加坡元、rmsprop、adam、adamax等)

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

我对所有优化器都这样做(在上面的代码中只提到了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() 

这个解决方案应该能解决你的问题。让我知道它是否有效。

我不明白…什么是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()