问题类型
Bug
你是否在TensorFlow Nightly版本中复现了这个bug?
是的
问题来源
二进制文件
TensorFlow版本
tensorflow[and-cuda]==2.17
自定义代码
是的
OS平台和发行版
Linux Ubuntu 24.04 LTS
移动设备
无响应
Python版本
3.11
Bazel版本
无响应
GCC/编译器版本
无响应
CUDA/cuDNN版本
12.4
GPU型号和内存
RTX A4500笔记本电脑
当前行为?
我加载了一个刚刚在服务器上训练过的.keras模型。该模型已经在本地使用与我相同的TF和Keras版本进行了训练。我加载了模型,并使用了LayerCAM显式函数的自定义实现,其中我正在使用以下内容创建一个子模型:grad_model = tf.keras.models.Model([model.inputs], [model.get_layer(layer_name).output, model.output])。然而,出现了错误。
重现问题的独立代码
Here's a Google Drive link to a code, the model weights and an input to reproduce the error: https://drive.google.com/drive/folders/15J_ghWXWbs8EmSVXedH6sJRvJcPUSTIW?usp=sharing
相关日志输出
ValueError Traceback (most recent call last)
Cell In[1], line 45
42 class_activation_map = tf.expand_dims(class_activation_map, axis=-1)
43 return class_activation_map
---> 45 layer_cam_test = layer_cam(img = test_sample, model=model, label_index = 0)
Cell In[1], line 24, in layer_cam(img, label_index, model)
22 print(layer_names)
23 for layer_name in layer_names[-1:]:
---> 24 grad_model = tf.keras.models.Model([model.inputs], [model.get_layer(layer_name).output, model.output]) #bug's here
25 with tf.GradientTape() as tape:
26 tape.watch(img)
File ~/miniconda3/envs/envtfnightly/lib/python3.11/site-packages/keras/src/ops/operation.py:266, in Operation.output(self)
256 @property
257 def output(self):
258 """Retrieves the output tensor(s) of a layer.
259
260 Only returns the tensor(s) corresponding to the *first time*
(...)
264 Output tensor or list of output tensors.
265 """
--> 266 return self._get_node_attribute_at_index(0, "output_tensors", "output")
File ~/miniconda3/envs/envtfnightly/lib/python3.11/site-packages/keras/src/ops/operation.py:285, in Operation._get_node_attribute_at_index(self, node_index, attr, attr_name)
269 """Private utility to retrieves an attribute (e.g. inputs) from a node.
270
271 This is used to implement the properties:
(...)
282 The operation's attribute `attr` at the node of index `node_index`.
283 """
284 if not self._inbound_nodes:
--> 285 raise ValueError(
286 f"The layer {self.name} has never been called "
287 f"and thus has no defined {attr_name}."
288 )
289 if not len(self._inbound_nodes) > node_index:
290 raise ValueError(
291 f"Asked to get {attr_name} at node "
292 f"{node_index}, but the operation has only "
293 f"{len(self._inbound_nodes)} inbound nodes."
294 )
ValueError: The layer sequential has never been called and thus has no defined output.
Click to add a cell.
4条答案
按热度按时间fd3cxomn1#
当我尝试创建一个Grad-CAM模型时,我遇到了完全相同的问题。为了解释一个CNN预测,我正在使用TensorFlow 2.17。
仍然没有找到解决方案。
f8rj6qna2#
我已经弄明白了。
我相信"Sequential"层被认为是我们网络的最后一层(出于某种原因),但这个层实际上没有输出,相反,你需要用最后一个实际的层替换它。
所以不要这样:
grad_model = tf.keras.models.Model([model.inputs], [model.get_layer(layer_name).output, model.output]) #bug's here
而是这样:
grad_model = keras.models.Model(
[model.inputs],
[model.get_layer(last_conv_layer_name).output,
model.get_layer(Name_of_last_deep_layer).output]) #在这里你应该放上你的最后一层的名称(你可以从运行model.summary中找到)我的是'dense_2'
希望这对你有帮助 :)
x8diyxa73#
感谢您分享这个解决方法sc21lt。我认为我们不应该这样做,因为在Keras的graCAM教程中,他们仍然在使用'model.outputs',但谢谢,现在这一步可以正常工作了。
然而,除了None梯度之外,您还有其他的东西吗?我不知道这是否是由于我的时间分布层导致的,但是当使用grad_model = tf.keras.models.Model([model.inputs], [model.get_layer(layer_name).output, model.layers[-1].output])或grad_model = tf.keras.models.Model([model.inputs], [model.get_layer(layer_name).output, model.get_layer('dense').output])时,它无法获得任何梯度。然而,当我使用普通的显式梯度时,它可以完美地工作,而不需要创建一个新的grad_model。
sd2nnvve4#
仅是一个小小的更新,空梯度的问题只出现在从.keras文件加载层时。如果模型代码是写在代码中的,我就不会有空梯度...所以这里似乎有两个不同的错误。如果有人想调查的话,这是模型:
$x_1^a_0b_1^x$