【问题标题】:Tensorflow single-value vs. batch tensorsTensorFlow 单值与批量张量
【发布时间】:2016-08-23 10:57:12
【问题描述】:

对我来说,Tensorflow 的一个谜团是:变量何时代表单个张量与批次?下面是一个具有连续值输出的网络示例(不是分类器)。在以loss 开头的行中,我通过从真值中减去预测值并将批次中这些差异的绝对值相加来计算损失。在该行中,Tensorflow 为truthValues_placeholder 插入了一批真值,因此truthValues_placeholder 是一个“批处理”张量,即批处理中的每个项目都有一个条目。但是,上一行将prediction 计算为单个值(而不是批处理)。我的问题:Tensorflow 神奇地将prediction 更改为“批处理张量”,因此我是否正确地为批处理中的每个项目计算了一个条目?

graph = tf.Graph()
with tf.Graph().as_default():
    ...
    # Network layers here
    ...
    # Final layer
    prediction = tf.matmul(inputsToLastLayer, weightsOutputLayer) + biasesOutputLayer
    loss = tf.nn.l2_loss(tf.sub(prediction, truthValues_placeholder))
    ...
    global_step = tf.Variable(0, name='global_step', trainable=False)
    train_op = optimizer.minimize(loss, global_step=global_step)
    ...
    sess = tf.Session()
    init = tf.initialize_all_variables()
    sess.run(init)
    for step in xrange(maxSteps):
        feed_dict = fill_feed_dict(..., truthValues_placeholder,...)

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

    Tensorflow 的行为方式与 numpy 相同,因为它将单个单元的基本操作广播到整个矩阵,例如

    In [3]: np.zeros([10, 10]) - 1
    Out[3]: 
    array([[-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.]])
    

    所以,没什么大惊小怪的。如果你想确定,你可以先用 NumPy 测试你的操作。

    【讨论】:

    • 谢谢朱利叶斯。了解广播,但是如果我在一批真值中广播单个预测值,那么我做错了。我希望将一批唯一的预测值与真值批次中的相应条目逐个元素进行比较,即比较 predictValues[i] 和 truthValues[i] 我上面的代码可以做到吗?如果不是,我需要改变什么?
    • 对,你应该输入一批与特征批大小相同的真值
    • 你可能应该使用 tf.reduce_mean(loss, axis=1) 来获得标量损失,因为现在你的损失是 batch_size 宽
    • 如果真值是单个/标量,它肯定只会将单个真值广播到一组预测中
    • 好的,我将使用tf.reduce_mean(loss, axis=1) 来获得标量批量损失。但是我需要改变什么来生成prediction 作为一个批次(与单个值相比)以适应批次的真值?这是我问题的根源。
    猜你喜欢
    • 2017-05-21
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多