我在tensorflow中训练了一个深度学习模型。
我想从检查点文件中将每个纪元的损失值加载到numpy.array
。
我的意思是以下。
np.array([3.45342, 3.23080, 2.98729, ...])
检查点文件是否包含所有历元的丢失信息?
是否需要在培训期间保存所有值?
我该怎么做?
答案 0 :(得分:1)
检查点文件是否包含所有历元的丢失信息?
不,他们没有。检查点文件旨在保存和恢复变量。它们仅包含保存时指定(或所有)变量的值,以便以后能够恢复该检查点,从而恢复名称。由于损失通常不是变量而是中间张量,因此损失通常不会保存在检查点文件中。
但是当然你可以自己跟踪和保存损失,如果你不想使用Tensorboard。我通常用熊猫来做那件事。 以下是实现此目的的一种方法:
import tensorflow as tf
import pandas as pd
# define a completely pointless model which just fits a single point just for
# demonstration
true = tf.placeholder(shape=(), dtype=tf.float32)
learned = tf.Variable(initial_value=0., dtype=tf.float32)
loss = tf.squared_difference(true, learned)
train = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
if __name__ == '__main__':
session = tf.Session()
session.run(tf.global_variables_initializer())
# create pandas data frame for logging
log = pd.DataFrame(columns=['loss'])
# train and append the loss to the data frame on every step
for step in range(0, 100):
log.loc[step] = session.run([train, loss], feed_dict={true: 100.})[1]
# save it
log.to_hdf('./log.h5', 'log')
培训结束后,您可以在不同的脚本中加载和绘制记录的数据,如下所示:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# load the dataframe
log = pd.read_hdf('./log.h5', 'log')
# and this is how you could get your numpy array
print(np.squeeze(log.as_matrix(columns=['loss'])))
# usually this is sufficient though, since the index is the training step
# and matplotlib can directly plot that
print(log['loss'])
plt.plot(log['loss'])
plt.ylabel('Loss')
plt.xlabel('Step')
plt.show()
但是就像LI Xuhong在评论中所暗示的那样,有许多不同的方法可以在不重新发明轮子的情况下实现这样的目标。但由于它只有几行代码,我通常更喜欢自己这样做,如上所示,特别是当我需要自己的项目记录时,无论如何。