当我应用有状态LSTM并重置状态时,是否有任何方法可以使用EarlyStopping Keras功能?

当我应用有状态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回归模型,我想应用Earlystoping函数。在有状态LSTM中,当我读取时,状态应该在每个历元重置。然而,我注意到,当我重置状态时,EarlyStoping方法根本不起作用。我也附上代码


模型=顺序()
添加(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)