1

v给定一个长度为 say的向量30,say theano 或 tensorflow 中的自动微分工具是否能够采用如下所示的梯度:

x = np.random.rand(5, 1)
v = f(x, z)
w = v[0:25].reshape(5, 5)
y = g(np.matmul(w, x) + v[25:30])
minimize ( || y - x || )

这甚至有意义吗?我在脑海中描绘它的方式我必须通过带有尾随 0 的标识向量/矩阵进行一些乘法来转换v --> w

4

2 回答 2

4

切片和重塑操作以与任何其他操作相同的方式适合标准反向模式 AD 框架。下面是一个简单的 TensorFlow 程序,与您给出的示例类似(我必须更改一些东西以使尺寸匹配),以及生成的梯度计算图

def f(x, z):
  """Adds values together, reshapes into vector"""
  return tf.reshape(x+z, (5,))

x = tf.Variable(np.random.rand(5, 1))
z = tf.Variable(np.random.rand(5, 1))
v = f(x, z)
w = tf.slice(v, 0, 5)
w = tf.reshape(v, (5, 1))
y = tf.matmul(tf.reshape(w, (5, 1)), tf.transpose(x)) + tf.slice(v, 0, 5)
cost = tf.square(tf.reduce_sum(y-x))
print tf.gradients(cost, [x, z])

在此处输入图像描述

于 2016-01-26T19:11:30.297 回答
0

让我们看一下源代码:

@ops.RegisterGradient("Reshape")
def _ReshapeGrad(op, grad):
  return [array_ops.reshape(grad, array_ops.shape(op.inputs[0])), None]

这就是 tensorflow 自动区分的方式。

于 2018-08-09T12:06:32.397 回答