【发布时间】:2017-05-31 15:21:09
【问题描述】:
假设一个神经网络的输出是一个 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.
我的第一个想法是这样的,不行:
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 中正确实现这个损失函数?
【问题讨论】:
-
一个问题是在get_loss 中你以
res = tf.Variable(0.0)开头,所以当你最小化时,优化器也会改变它。这可以解释负值,修复它与tf.constant(0.0)
标签: python python-3.x tensorflow neural-network