为训练与验证数据提供张量

时间:2016-02-20 01:32:29

标签: python tensorflow

在张量流示例中,feed_dict用于将训练或验证输入发送到同一模型图中。不幸的是,你不能提供张量:

    Acceptable feed values include Python scalars, strings, lists, or numpy ndarrays.

我一直在使用输入管道和TFRecordReader,所以我的数据永远不会真正进入python。不得不调用run将数据导入python只是为了将数据反馈给tensorflow似乎很愚蠢,而且肯定很慢。

有没有人有这方面的好解决方案?

目前,我只是创建两个使用相同参数的模型子图的相同副本。这有效,但迫使我以奇怪的方式组织我的代码。

修改

例如,我现在正在做类似的事情:

model_params = BuildModelParams()
train_model = BuildModel(model_params, train_input)
test_model = BuildModel(model_params, test_input)

以便测试模型使用训练学到的参数。关于feed_dict的好处是我只需要定义一次模型,而不必将模型的参数与其结构分开。

2 个答案:

答案 0 :(得分:8)

警告:

当涉及输入队列时,此解决方案可能会导致严重问题。请参阅:https://groups.google.com/a/tensorflow.org/forum/#!msg/discuss/mLrt5qc9_uU/sGNbC7GpAwAJ

感谢@fwalch在评论中指出这一点

没有办法完全按照您的要求行事,请参阅我的问题here的答案。

但是新上映的" cond"从0.7版本可以填写您的用例:

# Here are the two data streams.
train_data = tf.Variable(999)
test_data = tf.Variable(1000)

# This selects which stream to use.
select_test = tf.placeholder(dtype=bool,shape=[],name='select_test')
data = tf.cond(
    select_test,
    lambda:test_data,
    lambda:train_data
)

# Here is the model.
model = data-500;

init = tf.initialize_all_variables()
with tf.Session():
    init.run()

    # You just have to feed `select_test` when you evaluate the model.
    print(model.eval({select_test:False})) #499
    print(model.eval({select_test:True})) #500

您可以对switching Batch Normalization to use a moving average during test使用相同的技巧。

答案 1 :(得分:1)

<强> TL; DR

您可以将输入管道用于训练,测试和验证步骤,而不是使用占位符。当你已经拥有Tensor时,我没有理由不使用它。

相关文档

可在TF的网站上找到更多信息。

  1. Feeding Data from Python
  2. Placeholders
  3. 示例

    在这个例子中,我们将模型和预期输出发送到训练和测试函数。唯一的区别是,对于一些人,我们使用占位符,而其他人则使用Tensors。

    import tensorflow as tf
    
    
    def train(model, T):
        """Example train operation which returns sum of parameters."""
        return model + T
    
    
    def test(model, T):
        """Example test operation which returns parameters multiplied."""
        return model * T
    
    
    # Placeholders which will be required in the feed_dict once we execute a TF_Run.
    x_placeholder_model = tf.placeholder(tf.int32)
    t_placeholder = tf.placeholder(tf.int32)
    
    # Tensors, using constants for brevity but these could be from an input pipeline
    #  or some other set of operations.
    x_tensor_model = tf.constant([1, 2, 3])
    t_tensor = tf.constant([1, 2, 3])
    
    using_placeholder_train = train(x_placeholder_model, t_placeholder)
    using_tensor_train = train(x_tensor_model, t_tensor)
    
    using_placeholder_test = test(x_placeholder_model, t_placeholder)
    using_tensor_test = test(x_tensor_model, t_tensor)
    
    with tf.Session() as sess:
        print(sess.run(
            using_placeholder_train, feed_dict={
                x_placeholder_model: [1, 2, 3],
                t_placeholder: [1, 2, 3]}))
    
        print(sess.run(
            using_placeholder_test, feed_dict={
                x_placeholder_model: [1, 2, 3],
                t_placeholder: [1, 2, 3]}))
    
        print(sess.run(using_tensor_train))
        print(sess.run(using_tensor_test))
    

    执行此代码将产生以下输出:

    [2 4 6]
    [1 4 9]
    [2 4 6]
    [1 4 9]
    

    说明调用:

    print(sess.run(
        using_placeholder_train, feed_dict={
            x_placeholder_model: [1, 2, 3],
            t_placeholder: [1, 2, 3]}))
    

    返回相同的输出:

    print(sess.run(using_tensor_train))
    

    feed_dict没有添加任何内容,因为我们已经在图表上提供了张量。