ValueError: A `Concatenate` layer should be called on a list of at least 2 inputs

ValueError: A `Concatenate` layer should be called on a list of at least 2 inputs

我正在尝试使用 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 给出的答案,但是,我有这个错误。

文件 "DL_Ensemble.py",第 165 行,在 <模块> 中 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}) 文件“/usr/pkg/lib/python3.8/site- packages/tensorflow_core/python/keras/engine/training.py", 第 709 行,适合 returnfunc.fit( 文件“/usr/pkg/lib/python3.8/site- packages/tensorflow_core/python/keras/engine/training_v2.py", 第 313 行,适合 training_result = run_one_epoch( 文件“/usr/pkg/lib/python3.8/site- packages/tensorflow_core/python/keras/engine/training_v2.py”,第 123 行,在 run_one_epoch batch_outs = execution_function(迭代器) 文件“/usr/pkg/lib/python3.8/site- packages/tensorflow_core/python/keras/engine/training_v2_utils.py", 线 86,在 execution_function distributed_function(input_fn)) 文件“/usr/pkg/lib/python3.8/site- packages/tensorflow_core/python/eager/def_function.py",第 457 行,在 __call__ 中 结果 = self._call(*args, **kwds) 文件“/usr/pkg/lib/python3.8/site- packages/tensorflow_core/python/eager/def_function.py”,第 520 行,在 _call 中 return self._stateless_fn(*args, **kwds) 文件“/usr/pkg/lib/python3.8/site- packages/tensorflow_core/python/eager/function.py",第 1823 行,在 __call__ return graph_function._filtered_call(args, kwargs) # pylint: 禁用=受保护的访问 文件“/usr/pkg/lib/python3.8/site- packages/tensorflow_core/python/eager/function.py",第 1137 行,在 _filtered_call return self._call_flat( 文件“/usr/pkg/lib/python3.8/site- packages/tensorflow_core/python/eager/function.py",第 1223 行,在 _call_flat flat_outputs = forward_function.call( 文件“/usr/pkg/lib/python3.8/site- packages/tensorflow_core/python/eager/function.py",第 506 行,调用中 输出 = execute.execute( 文件“/usr/pkg/lib/python3.8/site- packages/tensorflow_core/python/eager/execute.py",第 67 行,在 quick_execute 中 six.raise_from(core._status_to_exception(e.code, 消息), None) raise_from 中的文件“<string>”,第 3 行 tensorflow.python.framework.errors_impl.InvalidArgumentError:<br> Conv2DCustomBackpropInputOp 仅支持 NHWC。 [[node Conv2DBackpropInput(定义于 /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

所以根据您的堆栈跟踪,代码在以下位置抛出错误:

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

出现此错误是因为 concatenate expects list of tensors to be concatenated. While you are passing graph and graph_1 which is not tensor but a Model 实例。

因此,根据您的代码,我假设您想要 concatenate 这两个模型的输出。在这种情况下,您必须将上面的行更改为:

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

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

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