【问题标题】:ValueError: input that isn't a symbolic tensorValueError:输入不是符号张量
【发布时间】:2018-06-21 05:06:12
【问题描述】:

我是 python 新手,正在从事图像处理项目并构建了以下模型。我收到模型下方发布的错误。

在我的研究中,我找到了一些关于这个错误的答案:

Merge 2 sequential models in Keras 上面的问题是 Concatenate 2 模型而不是 Concatenate 2 层

https://keras.io/getting-started/functional-api-guide/#multi-input-and-multi-output-models 在 keras 示例中,连接 2 层,但 1 层是输入层。我想了解如何连接 2 个常规层并将连接层用作层序列中的层。类似于 Inception 模型的概念。

   input
  /  |  \
a1   b1  c1
|    |    | 
a2   b2  c2
\   |   / 
concatenate
 /  |   \
d1   e1  f1
|    |    | 
d2   e2  f2
 \   |   /
  output

以上是我试图画出我的最终目标:)

def fet_Model():

bnd_input = Input(shape=input_shape)

k31 = Conv2D(128, kernel_size=(3, 3), activation='relu', padding='same')(bnd_input)
k31 = Conv2D(128, kernel_size=(3, 3), activation='relu', padding='same')(k31)
k31 = MaxPooling2D(pool_size=(3, 3), strides=(2, 2))(k31)

in_ly1_cv_1n1 = Conv2D(32, kernel_size=(1, 1), activation='relu', padding='same')(k31)
in_ly1_cv_3n3 = Conv2D(64, kernel_size=(3, 3), activation='relu', padding='same')(in_ly1_cv_1n1)
in_ly1_cv_5n5 = Conv2D(64, kernel_size=(5, 5), activation='relu', padding='same')(in_ly1_cv_1n1)

in_ly1_mx_pl = MaxPooling2D(pool_size=(3, 3), strides=(1, 1), padding='same')(k31)
in_ly1_mxcv_1n1 = Conv2D(32, kernel_size=(1, 1), activation='relu', padding='same')(in_ly1_mx_pl)

filt_concat1 = Concatenate([in_ly1_mxcv_1n1, in_ly1_cv_5n5, in_ly1_cv_3n3, k31])

# when running the below line I receive the error
in_ly2_cv_1n1 = Conv2D(32, kernel_size=(1, 1), activation='relu', padding='same')(filt_concat1)
in_ly2_cv_3n3 = Conv2D(64, kernel_size=(3, 3), activation='relu', padding='same')(in_ly2_cv_1n1)
in_ly2_cv_5n5 = Conv2D(64, kernel_size=(5, 5), activation='relu', padding='same')(in_ly2_cv_1n1)

in_ly2_mx_pl = MaxPooling2D(pool_size=(3, 3), strides=(1, 1))(filt_concat1)
in_ly2_mxcv_1n1 = Conv2D(32, kernel_size=(1, 1), activation='relu', padding='same')(in_ly2_mx_pl)

filt_concat2 = Concatenate([in_ly2_mxcv_1n1, in_ly2_cv_5n5, in_ly2_cv_3n3, k31])

lst_ly_avg_pl = AveragePooling2D(pool_size=(3, 3), strides=(2, 2))(filt_concat2)

lst_ly_cnv2 = Conv2D(32, kernel_size=(1, 1), activation='relu', padding='same')(lst_ly_avg_pl)

lst_ly_den = Dense(1, activation='sigmoid')(lst_ly_cnv2)

model = Model(inputs=bnd_input, outputs=lst_ly_den)

optimizer = Adam(lr= 0.002, beta_1=0.99, beta_2=0.999, epsilon=1e-08, decay=0.01)

model.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=['accuracy'])

return model

错误:

Traceback (most recent call last):
   K.is_keras_tensor(x)
   raise ValueError('Unexpectedly found an instance of type `' + 
str(type(x)) + '`. '
ValueError: Unexpectedly found an instance of type `<class 'keras.layers.merge.Concatenate'>`. Expected a symbolic tensor instance.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
   exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-194-ebff784b774c>", line 1, in <module>
   in_ly2_cv_1n1 = Conv2D(32, kernel_size=(1, 1), activation='relu', padding='same')(filt_concat1)
   self.assert_input_compatibility(inputs)
   str(inputs) + '. All inputs to the layer '
ValueError: Layer conv2d_41 was called with an input that isn't a symbolic tensor. Received type: <class 'keras.layers.merge.Concatenate'>. Full input: [<keras.layers.merge.Concatenate object at 0x1cee082b0>]. All inputs to the layer should be tensors.

【问题讨论】:

    标签: python keras-layer


    【解决方案1】:

    我认为你需要Concatenate(axis=-1)([tensor_1, tensor_2])

    【讨论】:

    • 你能详细说明一下吗?
    【解决方案2】:

    对@thepartofspeech 答案的进一步解释 (https://stackoverflow.com/a/51624786/8096768)。

    来自 keras 的 Concatenate 层文档 (https://keras.io/layers/merge/#concatenate)


    keras.layers.Concatenate(axis=-1)

    连接输入列表的层。

    它将张量列表作为输入,除了连接轴外,所有形状都相同,并返回单个张量,即所有输入的连接。


    在这种情况下,应该直接在 Concatenate 层上使用 axis=-1 选项调用该层,然后是输入张量,例如

    filt_concat1 = Concatenate(axis=-1)([in_ly1_mxcv_1n1, in_ly1_cv_5n5, in_ly1_cv_3n3, k31])

    注意:我没有尝试过使用超过 2 个输入张量 - 但在 2 个输入的情况下,它可以工作。

    我希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      我无法重建您的问题。你的代码对我来说很好。 尝试更新 keras,然后再次运行。 如果您使用 anaconda,请执行以下操作:

      conda update --all
      conda -n root update conda
      

      【讨论】:

      • 感谢 Naomi 的回复,我不用 anaconda,我用 PyCharm。
      猜你喜欢
      • 2019-05-02
      • 1970-01-01
      • 1970-01-01
      • 2020-09-21
      • 2019-10-12
      • 1970-01-01
      • 2018-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多