当我应用有状态LSTM并重置状态时,是否有任何方法可以使用EarlyStopping Keras功能?
我使用的是一个有状态的LSTM回归模型,我想应用Earlystoping函数。在有状态LSTM中,当我读取时,状态应该在每个历元重置。然而,我注意到,当我重置状态时,EarlyStoping方法根本不起作用。我也附上代码当我应用有状态LSTM并重置状态时,是否有任何方法可以使用EarlyStopping Keras功能?,keras,lstm,stateful,Keras,Lstm,Stateful,我使用的是一个有状态的LSTM回归模型,我想应用Earlystoping函数。在有状态LSTM中,当我读取时,状态应该在每个历元重置。然而,我注意到,当我重置状态时,EarlyStoping方法根本不起作用。我也附上代码 模型=顺序() 添加(LSTM(256,批处理输入形状=(批处理大小、时间步长、特征),返回序列=False,有状态=True)) 模型添加(辍学率=0.2)) model.add(密集型(1,激活='sigmoid')) compile(loss='mean\u squar
模型=顺序()
添加(LSTM(256,批处理输入形状=(批处理大小、时间步长、特征),返回序列=False,有状态=True))
模型添加(辍学率=0.2))
model.add(密集型(1,激活='sigmoid'))
compile(loss='mean\u squared\u error',optimizer='adam')
mc=ModelCheckpoint('best_model.h5',monitor='val_loss',mode='min',verbose=0,save_best_only=True)
es=早期停止(监视器='val\u loss',模式='min',耐心=1,恢复最佳权重=真,详细度=1)
对于范围内的历元(历元):
打印(“历元:,历元+1)
hist=model.fit(序列x,序列y,历代数=1,批量大小,随机数=False,
验证数据=(验证x,验证y),详细=2,回调=[mc,es])
model.reset_states()
如果我在没有for循环和状态重置的情况下运行上述代码,那么earlystoping可以正常工作。有没有办法在for循环中应用earlystoping
提前感谢在
model.fit()函数中,当epoch的数量=1时,似乎无法应用EarlyStoping。据我所知,发生这种情况是因为earlystoping
每次应用一个历元,并且仅当model.fit()
中的历元数大于1时才能工作
我使用下面的代码保存了最佳模型,并在经过一段时间后停止了培训过程
# Number of epochs to wait before halting the training process
patience = 50
# Store the metrics of each epoch to a pandas dataframe
history = pd.DataFrame()
# Define a high loss value (this may change based on the classification problem that you have)
min_loss = 2.00
# Define a minimum accuracy value
min_acc = 0.25
# Initialize the wait variable
wait = 0
for epoch in range(epochs):
print("Epoch: ", epoch + 1)
hist = model.fit(train_x, train_y, epochs=1, batch_size, shuffle=False,
validation_data=(validation_x, validation_y), verbose=2)
model.reset_states()
if epoch >= 0:
if np.isnan(hist.history['val_loss'][0]):
break
else:
if round(hist.history['val_loss'][0], 4) < min_loss:
min_loss = round(hist.history['val_loss'][0], 4)
min_acc = hist.history['val_accuracy'][0]
model.save('best_model')
history.loc[epoch, 'epoch'] = epoch + 1
history.loc[epoch, 'loss'] = hist.history['loss'][0]
history.loc[epoch, 'val_loss'] = hist.history['val_loss'][0]
history.loc[epoch, 'accuracy'] = hist.history['accuracy'][0]
history.loc[epoch, 'val_accuracy'] = hist.history['val_accuracy'][0]
wait = 0
else:
wait += 1
print('*' * 50)
print(f"Patience: {wait}/ {patience}", "-", "Current best val_accuracy:",
'{0:.5}'.format(min_acc),
"with loss:", '{0:.5}'.format(min_loss), f"at epoch {epoch - wait}")
print('*' * 50)
if wait < patience:
history.loc[epoch, 'epoch'] = epoch + 1
history.loc[epoch, 'loss'] = hist.history['loss'][0]
history.loc[epoch, 'val_loss'] = hist.history['val_loss'][0]
history.loc[epoch, 'accuracy'] = hist.history['accuracy'][0]
history.loc[epoch, 'val_accuracy'] = hist.history['val_accuracy'][0]
else:
break
history.to_csv('history.csv', header=True, index=False)
#停止培训过程之前要等待的时间数
耐心=50
#将每个历元的度量存储到数据帧中
history=pd.DataFrame()
#定义高损失值(这可能会根据您的分类问题而改变)
最小损耗=2.00
#定义最小精度值
最小加速度=0.25
#初始化wait变量
等待=0
对于范围内的历元(历元):
打印(“历元:,历元+1)
hist=model.fit(序列x,序列y,历代数=1,批量大小,随机数=False,
验证数据=(验证x,验证y),详细数据=2)
model.reset_states()
如果历元>=0:
如果np.isnan(历史记录['val_loss'][0]):
打破
其他:
如果四舍五入(历史记录['val_loss'][0],4)