Keras - 火车结束回调没有得到任何日志
Keras - On train end callback does not get any log
我正在做一个需要在 LSTM 网络上做一些工作的项目。我以前没有遇到过这样的问题,而且奇怪的是我没有对这部分代码进行任何更改。
问题是我有回调记录模型训练的过程到文件,称为 Logger
。在 on_train_end
方法中,我调用另一个自定义函数来保存 loss
、acc
和 perplexity
的绘图。但是 on_train_end
方法的 logs
参数给出了空字典,手上没有问题 on_epoch_end
.
def on_train_end(self, logs={}):
#calculate total time
self.train_dur = time.time()-self.train_start
self.log.write("\n\nTotal duration: " + str(self.train_dur) + " seconds\n")
self.log.write("*"*100+"\n")
self.log.close()
print("train end logs:", logs)
self.__save_plots(logs)
#write time to a file
return
def on_epoch_end(self, epoch, logs={}):
#calculate epoch time
self.epoch_dur = time.time()-self.epoch_start
#write epoch logs to a file
print("epoch end logs:" , logs)
epoch_loss_info = "\nloss: {loss} -- val_loss: {val_loss}".format(loss = logs["loss"], val_loss = logs["val_loss"])
epoch_acc_info = "\nacc: {acc} -- val_acc: {val_acc}".format(acc = logs["acc"], val_acc = logs["val_acc"])
epoch_ppl_info = "\nppl: {ppl} -- val_ppl: {val_ppl}\n".format(ppl=logs["ppl"], val_ppl=logs["val_ppl"])
self.log.write("-"*100+"\n")
self.log.write("\n\nEpoch: {epoch} took {dur} seconds \n".format(epoch=epoch+1, dur=self.epoch_dur))
self.log.write(epoch_loss_info+epoch_acc_info+epoch_ppl_info)
#write generations to a file
generator = model_generator(gen_seq_len=self.gen_seq_len, by_dir=self.model_dir)
generated_text = generator.generate()
self.log.write("\nInput text:\t" + generated_text[:self.gen_seq_len] + "\n" )
self.log.write("\nGenerated text:\t" + generated_text + "\n")
self.log.write("-"*100+"\n")
return
正如您在下面看到的,我在每个方法中都有一个 print
函数,并且 print("epoch end logs")
打印出一个 dict
并填充了正确的值。然而 print("train end logs")
打印出一个空的 dict.
我还尝试将 history
作为从 fit_generator
函数返回并尝试将其打印出来。这也伴随着价值观。
我搜索了 GitHub
和 Whosebug
但没有看到类似的内容。
提前致谢。
我暂时解决了这个问题,方法是创建一个包含与 logs
变量相同的键的空字典,并将每个纪元后的每个值附加到该字典。因此,我没有使用我在每个纪元之后填充的参数 self.logs
代替 on_train_end
方法中的 logs
参数。
但请随时回答这个奇怪的问题。
我正在做一个需要在 LSTM 网络上做一些工作的项目。我以前没有遇到过这样的问题,而且奇怪的是我没有对这部分代码进行任何更改。
问题是我有回调记录模型训练的过程到文件,称为 Logger
。在 on_train_end
方法中,我调用另一个自定义函数来保存 loss
、acc
和 perplexity
的绘图。但是 on_train_end
方法的 logs
参数给出了空字典,手上没有问题 on_epoch_end
.
def on_train_end(self, logs={}):
#calculate total time
self.train_dur = time.time()-self.train_start
self.log.write("\n\nTotal duration: " + str(self.train_dur) + " seconds\n")
self.log.write("*"*100+"\n")
self.log.close()
print("train end logs:", logs)
self.__save_plots(logs)
#write time to a file
return
def on_epoch_end(self, epoch, logs={}):
#calculate epoch time
self.epoch_dur = time.time()-self.epoch_start
#write epoch logs to a file
print("epoch end logs:" , logs)
epoch_loss_info = "\nloss: {loss} -- val_loss: {val_loss}".format(loss = logs["loss"], val_loss = logs["val_loss"])
epoch_acc_info = "\nacc: {acc} -- val_acc: {val_acc}".format(acc = logs["acc"], val_acc = logs["val_acc"])
epoch_ppl_info = "\nppl: {ppl} -- val_ppl: {val_ppl}\n".format(ppl=logs["ppl"], val_ppl=logs["val_ppl"])
self.log.write("-"*100+"\n")
self.log.write("\n\nEpoch: {epoch} took {dur} seconds \n".format(epoch=epoch+1, dur=self.epoch_dur))
self.log.write(epoch_loss_info+epoch_acc_info+epoch_ppl_info)
#write generations to a file
generator = model_generator(gen_seq_len=self.gen_seq_len, by_dir=self.model_dir)
generated_text = generator.generate()
self.log.write("\nInput text:\t" + generated_text[:self.gen_seq_len] + "\n" )
self.log.write("\nGenerated text:\t" + generated_text + "\n")
self.log.write("-"*100+"\n")
return
正如您在下面看到的,我在每个方法中都有一个 print
函数,并且 print("epoch end logs")
打印出一个 dict
并填充了正确的值。然而 print("train end logs")
打印出一个空的 dict.
我还尝试将 history
作为从 fit_generator
函数返回并尝试将其打印出来。这也伴随着价值观。
我搜索了 GitHub
和 Whosebug
但没有看到类似的内容。
提前致谢。
我暂时解决了这个问题,方法是创建一个包含与 logs
变量相同的键的空字典,并将每个纪元后的每个值附加到该字典。因此,我没有使用我在每个纪元之后填充的参数 self.logs
代替 on_train_end
方法中的 logs
参数。
但请随时回答这个奇怪的问题。