【问题标题】:Tensorflow, proper way to define a loss function with element-wise operationsTensorflow,用元素操作定义损失函数的正确方法
【发布时间】:2018-04-27 22:08:54
【问题描述】:

我有一批 n 个训练示例。每个训练示例都会给我一个向量 a(长度为 k)和一个向量 c(长度也是 k)。

在 tensorflow 中,我的输出是 p

我想定义如下损失函数:

\sum_(i = 0)^(i=n) c_i ( (a_i - p)^2 )

我已经阅读了我可以使用的各种 tf 操作,但似乎找不到合适的实现。我尝试使用 tf.tile 将 p 复制到 k 长度的张量中并进行 tf.subtract,但这似乎太过分了。

任何帮助将不胜感激。

【问题讨论】:

    标签: tensorflow loss-function


    【解决方案1】:

    p的形状是什么? TensorFlow 原生支持对不同形状的张量进行减法:

    import tensorflow as tf
    
    a = tf.Variable([[1, 2, 3], [2, 3, 4], [3, 4, 5]])
    
    x_1 = a - tf.Variable([1, 1, 1])
    x_2 = a - tf.Variable([1])
    x_3 = a - tf.Variable(1)
    
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        print(sess.run(x_1))  # [[0, 1, 2], [1, 2, 3] [2, 3, 4]]
        print(sess.run(x_2))  # [[0, 1, 2], [1, 2, 3] [2, 3, 4]]
        print(sess.run(x_3))  # [[0, 1, 2], [1, 2, 3] [2, 3, 4]]
    

    您可以如下定义损失函数:

    a = tf.Variable([[1, 2, 3], [2, 3, 4], [3, 4, 5]])
    c = tf.Variable([[4, 5, 6], [5, 6, 7], [6, 7, 8]])
    
    p = tf.Variable(1)
    
    loss_1 = tf.reduce_mean(tf.reduce_sum(tf.multiply(c, tf.pow(tf.subtract(a, p), 2)), axis=1))  # 112
    loss_2 = tf.reduce_mean(tf.reduce_sum(c * (a-p)**2, axis=1))  # 112
    

    【讨论】:

    • 太棒了,哇,我忘了。抱歉,我的 tensorflow 经验有些欠缺。我的 p 值只是 [p],只是一些标量。知道我将如何构建其余的损失函数吗?会不会是 tf.reduce_mean(tf.multiply(c, tf.reduce_sum((x_3)**2))
    • 您的代码 sn-p 可以工作,但如果我正确解释了您问题中的公式,我认为这不是您想要的。我编辑了我的答案,并包含了我认为你想要的损失函数。 (对于每个批次元素:从向量 a 中的每个元素中减去标量 p;将得到的向量元素平方;将得到的向量元素与向量 c 并计算其所有元素的总和(所以基本上是点积);最后,取所有批次元素的这个值的平均值)
    猜你喜欢
    • 2020-08-01
    • 1970-01-01
    • 2018-10-28
    • 2017-12-29
    • 1970-01-01
    • 2021-07-18
    • 2020-06-04
    • 2018-12-28
    • 1970-01-01
    相关资源
    最近更新 更多