我正在使用python库在keras中拟合一个递归神经网络。我通过改变epoch函数中的参数nb_epoch来拟合不同Sequential.fit()数的模型。目前我正在使用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等等。。。。
如何修改此循环以实现此目的?

最佳答案

持续调用fit将从上次调用留下的状态开始,进一步训练您的模型。若要使其不继续,则必须重置模型的权重,而fit则不这样做。你只是没有看到它这样做,因为它总是从1开始计算纪元。
所以最后的问题是它没有打印出正确的纪元数(你不能改变)。
如果这让您感到困扰,您可以通过定期调用fit来实现自己的model.train_on_batch

关于python - 循环将具有不同纪元编号的神经网络拟合,而无需每次都重新开始,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39364516/

10-12 18:02