我正在尝试运行以前在苹果硅的2.4.0- r0版本的tensorflow 2.2.0上工作的代码(使用python 3.8),但它现在生成以下关于矩阵维度的错误:
tensorflow.python.framework.errors_impl.InvalidArgumentError: GetOutputShape: Matrix size-incompatible: In[0]: [256,4], In[1]: [4,400]
我使用嵌套梯度磁带来计算我的MLP模型对输入(构成损失的一部分)的梯度,之后我计算损失对可训练变量的梯度,如下所示:
def get_grad_and_loss(self, x, y):
with tf.GradientTape(persistent=True) as gl_tape:
gl_tape.watch(x)
with tf.GradientTape(persistent=True) as l_tape:
l_tape.watch(x)
y_pred = self.call(x)
grad_mat = l_tape.gradient(y_pred, x)
loss = tf.reduce_mean(tf.math.square(y_pred - y[:, tf.newaxis])) + tf.reduce_mean(tf.maximum(0, -1 * (grad_mat[:, 0])))
g = gl_tape.gradient(loss, self.trainable_weights)
return g, loss
换句话说,我正在计算MSE并试图强制梯度的符号为正(作为软约束)。我已经通读了梯度磁带的文档,据我所知,设置persistent=True
应该允许我自由地重新计算梯度。顺便说一句,如果我省略了嵌套的梯度带并简单地使用MSE度量,那么我的代码工作得很好,所以我认为问题不在于代码中的其他地方。任何提示都将非常感激,提前谢谢:)
您似乎对哪个梯度磁带监视哪个变量感到困惑。我建议确保磁带监视不同的变量。现在他们都在看x
。很可能您需要输入gl_tape.watch(self.trainable_weights)
。有两个梯度磁带一起工作的例子。看一看