tensorflow 当模型已经构建并调用时,出现"ValueError: The layer sequential has never been called and thus has no defined output."错误,

wn9m85ua  于 5个月前  发布在  其他
关注(0)|答案(4)|浏览(52)

问题类型

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.
fd3cxomn

fd3cxomn1#

当我尝试创建一个Grad-CAM模型时,我遇到了完全相同的问题。为了解释一个CNN预测,我正在使用TensorFlow 2.17。
仍然没有找到解决方案。

f8rj6qna

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'
希望这对你有帮助 :)

x8diyxa7

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。

sd2nnvve

sd2nnvve4#

仅是一个小小的更新,空梯度的问题只出现在从.keras文件加载层时。如果模型代码是写在代码中的,我就不会有空梯度...所以这里似乎有两个不同的错误。如果有人想调查的话,这是模型:

$x_1^a_0b_1^x$

相关问题