tf.sub 和 tensorflow 中的负运算有什么区别?
What's difference between tf.sub and just minus operation in tensorflow?
我正在尝试使用 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.*"的事情来完成?
是,- 和 + 解析为 tf.sub 广告 tf.add。如果您查看 tensorflow 代码,您会发现 tf.Variable 上的这些运算符被 tf.* 方法重载。
至于为什么两者都存在,我假设 tf.* 存在是为了保持一致性。所以 sub 和 say matmul 操作可以用同样的方式使用。而运算符重载是为了方便。
(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 还显示了触发错误的行号。
我正在尝试使用 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.*"的事情来完成?
是,- 和 + 解析为 tf.sub 广告 tf.add。如果您查看 tensorflow 代码,您会发现 tf.Variable 上的这些运算符被 tf.* 方法重载。
至于为什么两者都存在,我假设 tf.* 存在是为了保持一致性。所以 sub 和 say matmul 操作可以用同样的方式使用。而运算符重载是为了方便。
(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 还显示了触发错误的行号。