如何在张量流中最小化这种损失函数?

时间:2017-05-31 15:21:10

标签: python python-3.x tensorflow neural-network

假设一个神经网络的输出是m×n矩阵(或张量)X.我想要最小化的是每对列向量之间的“差异”。 也就是说,如果我们将矩阵X写为 [x(1),x(2),...,x(n)] ,那么损失函数将如下: [ x(1) - x(2)] ^ 2 + [x(1) - x(3)] ^ 2 + ... + [x(1) - x(n)] ^ 2 + [x(2) - x(3)] + ... + [x(2) - x(n)] ^ 2 + ... + [x(n-1) - x(n)] ^ 2。 < / p>

我的第一个想法是这样的,这不起作用:

def get_loss(tensor):
    res = tf.Variable(0.0)
    for i in range(n - 1):
        for j in range(i + 1, n):
            res = res + tf.reduce_sum(tf.square(tensor[:,i] - tensor[:, j]))
    return res

我想函数get_loss(tensor)并没有真正地增加tensorres之间的联系,因为在我运行之后,我得到了一个非常奇怪的输出:

a = tf.placeholder(tf.float32, [3, 2])
b = tf.Variable([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])
loss = get_loss(a + b)
train = tf.train.GradientDescentOptimizer(0.01).minimize(loss)

sess = tf.Session()
sess.run(tf.global_variables_initializer())

for i in range(200):
    sess.run(train,feed_dict = {a : [[1.0, 2.0],[3.0, 4.0], [5.0, 6.0]]})

print('loss = ', sess.run(loss ,feed_dict = {a : [[1.0, 2.0],[3.0, 4.0], [5.0, 6.0]]}))

输出为-12.0,这是没有意义的,因为损失函数的值不能为负。

所以,我想弄清楚的是: 1)为什么输出是负的? 2)如何在Tensorflow中正确实现此丢失功能?

1 个答案:

答案 0 :(得分:1)

您不希望'res'变量成为优化的一部分。请尝试使用以下功能:

def get_loss(tensor):
    n=tensor.shape[-1]
    res = tf.constant(0.0,shape=tensor.shape)
    for i in range(n - 1):
        for j in range(i + 1, n):
             res = res + tf.reduce_sum(tf.square(tensor[:,i] - tensor[:,j]))
    return res