在一个循环中拟合具有不同Epoch数的神经网络,而不需要每次重新开始



我使用keras库在python中拟合一个递归神经网络。我通过改变Sequential.fit()函数中的nb_epoch参数来拟合不同epoch数的模型。目前我正在使用for循环,每次我改变nb_epoch时,它都会开始重新拟合,这是很多重复的工作。下面是我的代码(循环在代码的底部,如果你想跳过代码细节的其他部分):

from __future__ import division
import numpy as np
import pandas
from keras.models import Sequential
from keras.layers.core import Dense, Activation, Dropout
from keras.layers.recurrent import LSTM
from sklearn.preprocessing import MinMaxScaler
from sklearn.learning_curve import learning_curve

####################################
###
### Here I do the data processing to create trainX, testX
###
####################################
#model create:
model = Sequential()
#this is the epoch array for different nb_epoch

####################################
###
### Here I define model architecture
###
####################################
model.compile(loss="mse", optimizer="rmsprop")

#################################################
####  Defining arrays for different epoch number 
#################################################
epoch_array = range(100, 2100,100)

# I create the following arrays/matrices to store the result of NN fit 
# different epoch number.
train_DBN_fitted_Y = np.zeros(shape=(len(epoch_array),trainX.shape[0]))
test_DBN_fitted_Y = np.zeros(shape=(len(epoch_array),testX.shape[0]))
###############################################
###
### Following loop is the heart of the question
###
##############################################
i = 0  
for epoch in epoch_array:
      model.fit( trainX, trainY,
            batch_size = 16, nb_epoch = epoch, validation_split = 0.05, verbose = 2)
      trainPredict = model.predict(trainX)
      testPredict = model.predict(testX)
      trainPredict = trainPredict.reshape(trainPredict.shape[0])
      testPredict = testPredict.reshape(testPredict.shape[0])
      train_DBN_fitted_Y[i] = trainPredict
      test_DBN_fitted_Y[i]  = testPredict
      i = i + 1

这个循环效率很低。因为例如,当它设置nb_epoch = 100时,它从epoch = 1开始训练,并在epoch = 100结束,如下所示:

Epoch 1/100
0s - loss: 1.9508 - val_loss: 296.7801
.
.
.
Epoch 100/100
0s - loss: 7.6575 - val_loss: 366.2218

在循环的下一次迭代中,当它说nb_epoch = 200时,它再次从epoch = 1开始训练,并在epoch = 200结束。但是我想做的是,在这个迭代中,从上一次循环中离开的地方开始训练即epoch = 100然后是epoch = 101,以此类推....

我如何修改这个循环来实现这个?

连续调用fit是在进一步训练你的模型,从上次调用留下的状态开始。对于它而不是继续,它将不得不重置模型的权重,fit没有这样做。你只是没有看到它这样做,因为它总是从1开始计数epoch。

所以最后的问题是它没有打印正确的epoch数(你不能改变)。

如果您对此感到困扰,您可以通过定期调用model.train_on_batch来实现自己的fit

可以使用fit的initial_epoch参数

相关内容

  • 没有找到相关文章

最新更新