我正在尝试使用Tensorflow。这是一个非常简单的代码。
train = tf.placeholder(tf.float32, [1], name="train")
W1 = tf.Variable(tf.truncated_normal([1], stddev=0.1), name="W1")
loss = tf.pow(tf.sub(train, W1), 2)
step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
忽略优化部分(第4行)。它将采用浮动数字并训练W1以增加平方差。
我的问题很简单。如果我只使用减号代替 tf.sub"如下,有什么不同?它会导致错误的结果吗?
loss = tf.pow(train-W1, 2)
当我更换它时,结果看起来一样。如果它们是相同的,为什么我们需要使用" tf.add / tf.sub"东西?
内置反向传播计算只能通过" tf。*"事情呢?
答案 0 :(得分:13)
是的, - 并且+解析为tf.sub ad tf.add。如果你看一下tensorflow代码,你会发现tf.Variable上的这些运算符都是用tf。*方法重载的。
至于为什么两者都存在,我假设存在tf。*,以保持一致性。所以sub和matmul操作可以以相同的方式使用。虽然操作员超载是为了方便。
答案 1 :(得分:2)
(tf.sub似乎已被替换为tf.subtract)
我看到的唯一优势是您可以指定操作的名称,如下所示:
tf.subtract(train, W1, name='foofoo')
这有助于识别导致错误的操作,因为您提供的名称也会显示:
ValueError: Dimensions must be equal, but are 28 and 40 for 'foofoo' (op: 'Sub') with input shapes
它也可能有助于TensorBoard的理解。对于大多数人来说这可能有点过头了,因为python也会显示触发错误的行号。