将损失值从Tensorflow中的模型检查点加载到numpy.array中

时间:2018-04-30 12:41:09

标签: python tensorflow

我在tensorflow中训练了一个深度学习模型。

我想从检查点文件中将每个纪元的损失值加载到numpy.array

我的意思是以下。

np.array([3.45342, 3.23080, 2.98729, ...])

检查点文件是否包含所有历元的丢失信息?

是否需要在培训期间保存所有值?

我该怎么做?

1 个答案:

答案 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在评论中所暗示的那样,有许多不同的方法可以在不重新发明轮子的情况下实现这样的目标。但由于它只有几行代码,我通常更喜欢自己这样做,如上所示,特别是当我需要自己的项目记录时,无论如何。