给定长度为v
的向量30
,可以说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
答案 0 :(得分:3)
切片和重塑操作符合标准反向模式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])
答案 1 :(得分:0)
让我们看一下源代码:
@ops.RegisterGradient("Reshape")
def _ReshapeGrad(op, grad):
return [array_ops.reshape(grad, array_ops.shape(op.inputs[0])), None]
这是张量流自动区分的方式。