【问题标题】:ValueError: A `Concatenate` layer should be called on a list of at least 2 inputsValueError:应在至少 2 个输入的列表上调用“连接”层
【发布时间】:2020-04-25 14:55:36
【问题描述】:

我正在尝试使用 sigmoid 来加入具有不同嵌入矩阵的两​​个模型的输出。但我不断在连接行收到错误。我已经尝试过类似问题的其他建议,但它一直给出同样的错误。我觉得我错过了一些东西,但我找不到它。请帮忙解释一下。谢谢

############################            MODEL   1      ######################################
input_tensor=Input(shape=(35,))
input_layer= Embedding(vocab_size, 300, input_length=35, weights=[embedding_matrix],trainable=True)(input_tensor)
conv_blocks = []
filter_sizes = (2,3,4)
for fx in filter_sizes:
    conv_layer= Conv1D(100, kernel_size=fx, activation='relu', data_format='channels_first')(input_layer)   #filters=100, kernel_size=3
    maxpool_layer = MaxPooling1D(pool_size=4)(conv_layer)
    flat_layer= Flatten()(maxpool_layer)
    conv_blocks.append(flat_layer)
conc_layer=concatenate(conv_blocks, axis=1)
graph = Model(inputs=input_tensor, outputs=conc_layer)
model = Sequential()
model.add(graph)
model.add(Dropout(0.2))

############################            MODEL    2     ######################################
input_tensor_1=Input(shape=(35,))
input_layer_1= Embedding(vocab_size, 300, input_length=35, weights=[embedding_matrix_1],trainable=True)(input_tensor_1)
conv_blocks_1 = []
filter_sizes_1 = (2,3,4)
for fx in filter_sizes_1:
    conv_layer_1= Conv1D(100, kernel_size=fx, activation='relu', data_format='channels_first')(input_layer_1)   #filters=100, kernel_size=3
    maxpool_layer_1 = MaxPooling1D(pool_size=4)(conv_layer_1)
    flat_layer_1= Flatten()(maxpool_layer_1)
    conv_blocks_1.append(flat_layer_1)
conc_layer_1=concatenate(conv_blocks_1, axis=1)
graph_1 = Model(inputs=input_tensor_1, outputs=conc_layer_1)
model_1 = Sequential()
model_1.add(graph_1)
model_1.add(Dropout(0.2))


fused = concatenate([graph, graph_1], axis=-1)
prediction = Dense(3, activation='sigmoid')(fused)
model = Model(inputs=[input_tensor,input_tensor_1], outputs=[prediction])
model.compile(loss='sparse_categorical_crossentropy',optimizer='Adagrad', metrics=['accuracy'])
model.summary()

这是错误跟踪

Traceback (most recent call last):
  File "DL_Ensemble.py", line 145, in <module>
    fused = concatenate([graph, graph_1], axis= 1 )
  File "/usr/pkg/lib/python3.8/site- 
   packages/tensorflow_core/python/keras/layers/merge.py", line 705, in concatenate
    return Concatenate(axis=axis, **kwargs)(inputs)
  File "/usr/pkg/lib/python3.8/site-packages/tensorflow_core/python/keras/engine/base_layer.py", line 887, in __call__
    self._maybe_build(inputs)
  File "/usr/pkg/lib/python3.8/site-packages/tensorflow_core/python/keras/engine/base_layer.py", line 2141, in _maybe_build
    self.build(input_shapes)
   File "/usr/pkg/lib/python3.8/site- 
   packages/tensorflow_core/python/keras/utils/tf_utils.py", line 306, in wrapper
output_shape = fn(instance, input_shape)
  File "/usr/pkg/lib/python3.8/site- 
   packages/tensorflow_core/python/keras/layers/merge.py", line 378, in build
    raise ValueError('A `Concatenate` layer should be called '
ValueError: A `Concatenate` layer should be called on a list of at least 2 inputs

更新:我已经反映了@VivekMehta 给出的答案,但是,我有这个错误。

File "DL_Ensemble.py", line 165, in <module> model.fit([train_sequences,train_sequences], train_y, epochs=10, verbose=False, batch_size=32, class_weight={0: 6.0, 1: 1.0, 2: 2.0}) File "/usr/pkg/lib/python3.8/site- packages/tensorflow_core/python/keras/engine/training.py", line 709, in fit return func.fit( File "/usr/pkg/lib/python3.8/site- packages/tensorflow_core/python/keras/engine/training_v2.py", line 313, in fit training_result = run_one_epoch( File "/usr/pkg/lib/python3.8/site- packages/tensorflow_core/python/keras/engine/training_v2.py", line 123, in run_one_epoch batch_outs = execution_function(iterator) File "/usr/pkg/lib/python3.8/site- packages/tensorflow_core/python/keras/engine/training_v2_utils.py", line 86, in execution_function distributed_function(input_fn)) File "/usr/pkg/lib/python3.8/site- packages/tensorflow_core/python/eager/def_function.py", line 457, in __call__ result = self._call(*args, **kwds) File "/usr/pkg/lib/python3.8/site- packages/tensorflow_core/python/eager/def_function.py", line 520, in _call return self._stateless_fn(*args, **kwds) File "/usr/pkg/lib/python3.8/site- packages/tensorflow_core/python/eager/function.py", line 1823, in __call__ return graph_function._filtered_call(args, kwargs) # pylint: disable=protected-access File "/usr/pkg/lib/python3.8/site- packages/tensorflow_core/python/eager/function.py", line 1137, in _filtered_call return self._call_flat( File "/usr/pkg/lib/python3.8/site- packages/tensorflow_core/python/eager/function.py", line 1223, in _call_flat flat_outputs = forward_function.call( File "/usr/pkg/lib/python3.8/site- packages/tensorflow_core/python/eager/function.py", line 506, in call outputs = execute.execute( File "/usr/pkg/lib/python3.8/site- packages/tensorflow_core/python/eager/execute.py", line 67, in quick_execute six.raise_from(core._status_to_exception(e.code, message), None) File "<string>", line 3, in raise_from tensorflow.python.framework.errors_impl.InvalidArgumentError:
Conv2DCustomBackpropInputOp only supports NHWC. [[node Conv2DBackpropInput (defined at /usr/pkg/lib/python3.8/site- packages/tensorflow_core/python/framework/ops.py:1751) ]] [Op:__inference_distributed_function_2250]

Function call stack:
distributed_function

我还想补充一点,当代码在 GPU 而不是 CPU 上运行时,错误发生在与之前相同的行,但消息变为:

File "DL_Ensemble.py", line 166, in <module>
model.fit([train_sequences,train_sequences], train_y, epochs=10, verbose=False, batch_size=32, class_weight={0: 6.0, 1: 1.0, 2: 2.0})
  File "/home/kosimadukwe/.local/lib/python3.7/site-packages/tensorflow/python/keras/engine/training.py", line 880, in fit
validation_steps=validation_steps)
  File "/home/kosimadukwe/.local/lib/python3.7/site-packages/tensorflow/python/keras/engine/training_arrays.py", line 329, in model_iteration
batch_outs = f(ins_batch)
  File "/home/kosimadukwe/.local/lib/python3.7/site-packages/tensorflow/python/keras/backend.py", line 3073, in __call__
self._make_callable(feed_arrays, feed_symbols, symbol_vals, session)
  File "/home/kosimadukwe/.local/lib/python3.7/site-packages/tensorflow/python/keras/backend.py", line 3019, in _make_callable
callable_fn = session._make_callable_from_options(callable_opts)
  File "/home/kosimadukwe/.local/lib/python3.7/site-packages/tensorflow/python/client/session.py", line 1471, in _make_callable_from_options
return BaseSession._Callable(self, callable_options)
  File "/home/kosimadukwe/.local/lib/python3.7/site-packages/tensorflow/python/client/session.py", line 1425, in __init__
session._session, options_ptr, status)
  File "/home/kosimadukwe/.local/lib/python3.7/site-packages/tensorflow/python/framework/errors_impl.py", line 528, in __exit__
c_api.TF_GetCode(self.status.status))
tensorflow.python.framework.errors_impl.InvalidArgumentError: Conv2DCustomBackpropInputOp only supports NHWC.
     [[{{node training/Adagrad/gradients/conv1d_5/conv1d/Conv2D_grad/Conv2DBackpropInput}}]]
Exception ignored in: <function BaseSession._Callable.__del__ at 0x7fe4dd06a730>
Traceback (most recent call last):
  File "/home/kosimadukwe/.local/lib/python3.7/site-packages/tensorflow/python/client/session.py", line 1455, in __del__
self._session._session, self._handle, status)
  File "/home/kosimadukwe/.local/lib/python3.7/site-packages/tensorflow/python/framework/errors_impl.py", line 528, in __exit__
c_api.TF_GetCode(self.status.status))
tensorflow.python.framework.errors_impl.InvalidArgumentError: No such callable handle: 94697914208640

【问题讨论】:

  • 您在多个地方使用concatenate。请发布完整的错误跟踪,以便更清楚哪个部分导致错误。
  • 错误是什么?
  • @VivekMehta 我已经发布了

标签: python python-3.x keras conv-neural-network tf.keras


【解决方案1】:

所以从你的堆栈跟踪来看,代码在以下位置抛出错误:

fused = concatenate([graph, graph_1], axis= 1 )
print(type(graph))
# output: <class 'tensorflow.python.keras.engine.training.Model'>

出现此错误是因为 concatenate 需要连接张量列表。当您传递 graphgraph_1 时,这不是张量而是 Model 实例。

所以从你的代码中我假设你想要concatenate 这两个模型的输出。在这种情况下,您必须将上述行更改为:

fused = concatenate([graph.outputs[0], graph_1.outputs[0]], axis=-1)

这里,graph.outputs 给出了模型给出的输出列表。由于每个模型都给我们一个输出,我们将从每个输出中获取第 0 个索引。

更改此部分,您将获得预期的模型摘要。

【讨论】:

  • 哦,谢谢。模型摘要生成良好。拜托,你能指出一些可以解释这个概念的东西吗?我永远也猜不到。另外,当我尝试拟合模型时,我收到了这个错误ValueError: Error when checking model input: the list of Numpy arrays that you are passing to your model is not the size the model expected. Expected to see 2 array(s), but instead got the following list of 1 array:。这与我的火车组有关。我已经确认它是一个 numpy 数组,但仍然是同样的错误。其他类似的问题没有答案。你有什么想法吗?
  • 另外,当我只使用一个模型时,模型可以正确拟合。
  • 我在答案中附上了concatenateModel 的文档链接。您可以检查方法预期的输入。
  • 您的错误:您的模型需要两个输入,如此处定义的 Model(inputs=[input_tensor,input_tensor_1], outputs=[prediction])。因此,您必须按照input_tensorinput_tensor_1 中定义的形状传递两个输入的列表
  • 错误跟踪显示它是only supports NHWC,这是一个data_format,所以这是一个起点。
猜你喜欢
  • 1970-01-01
  • 2021-10-10
  • 2020-05-14
  • 1970-01-01
  • 2019-07-24
  • 2020-07-15
  • 2021-04-23
  • 2020-12-22
相关资源
最近更新 更多