首页 > 解决方案 > 从 Tensorflow 中的模型检查点将损失值加载到 numpy.array

问题描述

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

我想numpy.array从检查点文件中加载每个时代的损失值。

我的意思是下面。

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

检查点文件没有所有时代的损失信息吗?

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

我怎么做?

标签: pythontensorflow

解决方案


检查点文件没有所有时代的损失信息吗?

不,他们没有。检查点文件旨在保存和恢复变量。它们仅包含保存时指定(或所有)变量的值,以便以后能够恢复该检查点,因此得名。由于损失通常不是变量而是中间张量,因此损失通常根本不保存在检查点文件中。

但当然,您可以自己简单地跟踪和保存损失,如果您不想使用 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()

但正如李旭红在评论中所建议的那样,有很多不同的方法可以在不重新发明轮子的情况下实现这样的目标。但是由于它只有几行代码,我通常更喜欢像上面演示的那样自己执行此操作,尤其是当我需要自己的项目日志记录时。


推荐阅读