假设一个神经网络的输出是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)
并没有真正地增加tensor
和res
之间的联系,因为在我运行之后,我得到了一个非常奇怪的输出:
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中正确实现此丢失功能?
答案 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