张量流图形构造中没有出现错误,但在tf.gradients
中的图形计算过程中出现了形状不匹配错误(我猜错误是在反向传播中)。
这是我得到的错误:
InvalidArgumentError(参见上面的追溯):
重塑的输入是一个具有16777216值的张量,但请求的形状有4096
[[Node:gradients / truediv_grad / Reshape = Reshape [T = DT_FLOAT,Tshape = DT_INT32,_device =" / job:localhost / replica:0 / task:0 / device:GPU:0"](渐变/ truediv_grad / Sum,gradients / truediv_grad / Shape)]]
答案 0 :(得分:0)
我使用两种技术解决了这个问题:
1.显然,如果您要创建自定义操作和渐变,则需要非常明确地使用set_shape
或tf.reshape
2.当您使用tf.register_gradient
注册梯度时,将op和grad作为输入,在链接渐变时需要小心,dy/dx = dy/dz*dz/dx
。
假设dy/dz
是我们创建的自定义渐变,dz/dx
是根据差异化链条规则的前一个操作的渐变。
tf.register_gradient(Mygrad)
def Mygrad(op,grad):
*****do stuff with op.inputs and calculate custom grads say cust_grad or dy/dz****
return cust_grad*grad
我将此更改为以下内容:
tf.register_gradient(Mygrad)
def Mygrad(op,grad):
*****do stuff with op.inputs and calculate custom grads say cust_grad or dy/dz****
return tf.matmul(tf.reshape(cust_grad,[calculated_shape]),tf.reshape(grad,expeced_shape))