无法从 tensorflow/keras 中的加载模型中获取梯度

Posted

技术标签:

【中文标题】无法从 tensorflow/keras 中的加载模型中获取梯度【英文标题】:Can't get gradients from loaded model in tensorflow/keras 【发布时间】:2019-06-23 04:23:13 【问题描述】:

我有一个预先训练的模型,我加载了它并且它有效地工作(即我可以做出预测)。我想获得某个参数的模型梯度,但是我无法获得任何有意义的结果。始终是Noneoutput。

我的代码:

sess = tf.Session()
K.set_session(sess)

x = X_test[0].reshape(1,100)
y = np.reshape(Y_test[0], (1,1))
tf_y = tf.convert_to_tensor(y,dtype=np.float32)

model2 = ClassificationModel(config, logging).model
model2.load_weights("class_models/model.382-0.46-0.87.h5")

# predict real x_test
y_hat = model2.predict(x)
tf_y_hat = tf.convert_to_tensor(y_hat, dtype=np.float32)

loss = keras.losses.binary_crossentropy(tf_y,tf_y_hat)
grad, = K.gradients(loss,x)

print(grad)

我得到的打印输出是None。我究竟做错了什么?如何获得给定模型的渐变?

【问题讨论】:

【参考方案1】:

使用您当前的代码,tensorflow 无法将x 连接到loss 的计算图,因为loss 是从一个numpy 数组(y_hat)创建的,而x 也只是一个numpy 数组。下面的代码应该可以代替:

tf_x = tf.convert_to_tensor(x, dtype=np.float32)
loss = tf.keras.losses.binary_crossentropy(tf_y, model2(tf_x))
grad, = K.gradients(loss, tf_x)

【讨论】:

你怎么知道 x 是一个 Numpy 数组?我在 TensorFlow 2 中遇到了类似的问题,其中 x 是 TensorFlow 张量并且模型是从 load_model 加载回来的?

以上是关于无法从 tensorflow/keras 中的加载模型中获取梯度的主要内容,如果未能解决你的问题,请参考以下文章

保存和加载图像生成器 (Tensorflow Keras)

加载自定义模型时 Tensorflow keras 模型到 opencv 错误(C++)

如何解决 tensorflow.keras 中的值错误?

对于 tensorflow.keras.models.Sequential.predict 中的多类多标签问题,是不是可能只得到 0 和 1?

具有推理功能的 TensorFlow + Keras 多 GPU 模型

用于 tensorflow 和 pymysql 的 Sagemaker 内核