【发布时间】:2020-09-02 01:42:44
【问题描述】:
我有两个预训练模型。假设它们是model_A 和model_B。这里,model_A 是 CNN + LSTM 网络,model_B 是 GCN。
模型_A:
Model_A 需要 1 个输入,如下所示。
X_in = Input(shape=(None, 150), name='X_in', dtype=int32)
模型_B:
Model_B 需要 3 个输入,如下所示。
X_in = Input(shape=(X_train_B[0].shape[-1], ), name='X_in', dtype=tf.float64)
A_in = Input(shape=(None,), sparse=True, dtype=tf.float64)
I_in = Input(shape=(), name='segment_ids_in', dtype=tf.int32)
我需要通过在最后一层之前获取该层的输出来合并这两个模型。以下是我如何定义新模型。
model_A = load_model('model_A.h5')
model_A = Model(inputs=model_A.inputs, outputs=model_A.layers[-2].output)
model_B = load_model('model_B.h5', custom_objects={'GraphConvSkip': GraphConvSkip, 'MinCutPool': MinCutPool,
'GlobalAvgPool': GlobalAvgPool})
model_B = Model(inputs=model_B.inputs, outputs=model_B.layers[-2].output)
def final_model():
X_in = Input(shape=(X_train_B[0].shape[-1] ), name='X_in', dtype=tf.float64)
A_in = Input(shape=(None,), sparse=True, dtype=tf.float64)
I_in = Input(shape=(), name='segment_ids_in', dtype=tf.int32)
merged = Concatenate(axis=1)([X_in, A_in, I_in])
concat = concatenate([model_A.output, model_B.output], axis=-1)
concat = Dense(1, activation='sigmoid')(concat)
model = Model(inputs=[model_A.input, merged], outputs=concat)
adam = tf.keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
model.compile(optimizer=adam, loss='binary_crossentropy', metrics=['acc'])
return model
model = final_model()
model.fit([X_train_A,[X_train_B, A_train_B, I_]], [y_train_A], verbose=1)
执行此代码后,出现以下错误。
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-54-8c7e818acc11> in <module>
----> 1 model = final_model()
2
3 print('Fitting model')
4 batches = batch_iterator([A_train_B, X_train_B, y_train_B, X_train_A, y_train_A], batch_size=1, epochs=2)
5 for b in batches:
<ipython-input-53-5c9278e5efb8> in final_model()
3 A_in = Input(shape=(None,), sparse=True, dtype=tf.float64)
4 I_in = Input(shape=(), name='segment_ids_in', dtype=tf.int32)
----> 5 merged = Concatenate(axis=1)([X_in, A_in, I_in])
6
7 concat = concatenate([model_A.output, model_B.output], axis=-1)
~/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/base_layer.py in __call__(self, inputs, *args, **kwargs)
746 # Build layer if applicable (if the `build` method has been
747 # overridden).
--> 748 self._maybe_build(inputs)
749 cast_inputs = self._maybe_cast_inputs(inputs)
750
~/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/base_layer.py in _maybe_build(self, inputs)
2114 # operations.
2115 with tf_utils.maybe_init_scope(self):
-> 2116 self.build(input_shapes)
2117 # We must set self.built since user defined build functions are not
2118 # constrained to set self.built.
~/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/keras/utils/tf_utils.py in wrapper(instance, input_shape)
304 if input_shape is not None:
305 input_shape = convert_shapes(input_shape, to_tuples=True)
--> 306 output_shape = fn(instance, input_shape)
307 # Return shapes from `fn` as TensorShapes.
308 if output_shape is not None:
~/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/keras/layers/merge.py in build(self, input_shape)
380 shape_set = set()
381 for i in range(len(reduced_inputs_shapes)):
--> 382 del reduced_inputs_shapes[i][self.axis]
383 shape_set.add(tuple(reduced_inputs_shapes[i]))
384
IndexError: list assignment index out of range
有人可以帮我解决如何将这些输入值传递给两个不同的模型吗?
----编辑01----
根据 Andrea 的建议修改代码后,出现以下错误。我也尝试使用 np.array() 传递输入,但仍然遇到相同的错误。你能检查一下我在哪里做错了吗?
另外,这里是我传递给模型 B 的值。因为它是一个图,X_ 是一个 N*d 特征向量,A_ 是一个 N*N 邻接矩阵,I_ 是通过调用 @ 得到的 segment_ids 987654331@.
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-71-22f819a7a9cd> in <module>
18 return model
19
---> 20 model = final_model()
21 print('Fitting model')
22 batches = batch_iterator([A_train_B, X_train_B, y_train_B, X_train_A, y_train_A], batch_size=1, epochs=2)
<ipython-input-71-22f819a7a9cd> in final_model()
7
8 def final_model():
----> 9 concat = Concatenate(-1)([model_A.outputs, model_B.outputs]) # merge outputs
10 concat = Dense(1, activation='sigmoid')(concat)
11
~/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/base_layer.py in __call__(self, inputs, *args, **kwargs)
771 not base_layer_utils.is_in_eager_or_tf_function()):
772 with auto_control_deps.AutomaticControlDependencies() as acd:
--> 773 outputs = call_fn(cast_inputs, *args, **kwargs)
774 # Wrap Tensors in `outputs` in `tf.identity` to avoid
775 # circular dependencies.
~/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/keras/layers/merge.py in call(self, inputs)
179 return y
180 else:
--> 181 return self._merge_function(inputs)
182
183 @tf_utils.shape_type_conversion
~/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/keras/layers/merge.py in _merge_function(self, inputs)
402
403 def _merge_function(self, inputs):
--> 404 return K.concatenate(inputs, axis=self.axis)
405
406 @tf_utils.shape_type_conversion
~/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/keras/backend.py in concatenate(tensors, axis)
2671 """
2672 if axis < 0:
-> 2673 rank = ndim(tensors[0])
2674 if rank:
2675 axis %= rank
~/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/keras/backend.py in ndim(x)
1200
1201 """
-> 1202 dims = x.shape._dims
1203 if dims is not None:
1204 return len(dims)
AttributeError: 'list' object has no attribute 'shape'
【问题讨论】:
标签: python python-3.x tensorflow keras deep-learning