Python 合并Conv2D和稠密模型会导致;RuntimeError:您必须在使用模型之前编译它;,尽管已经编译了合并模型

Python 合并Conv2D和稠密模型会导致;RuntimeError:您必须在使用模型之前编译它;,尽管已经编译了合并模型,python,machine-learning,keras,neural-network,conv-neural-network,Python,Machine Learning,Keras,Neural Network,Conv Neural Network,我试图训练一个人工智能,根据图像和患者信息识别病变。我使用Keras的序列模型来实现这一点。我创建了两个连续的模型,然后合并它们并编译合并后的模型。 当我尝试拟合模型时,我得到一个错误RuntimeError:您必须在使用它之前编译您的模型。即使我的模型定义了输入形状 我试着将input\u dim=dim切换到input\u shape=(dim,)。 在这个问题上,我能找到的唯一的东西,比如或只是说,确保要合并的模型中的第一层有一个定义的输入形状,这是我的。我无法想象,对于连接层,您也必须这

我试图训练一个人工智能,根据图像和患者信息识别病变。我使用Keras的序列模型来实现这一点。我创建了两个连续的模型,然后合并它们并编译合并后的模型。 当我尝试拟合模型时,我得到一个错误
RuntimeError:您必须在使用它之前编译您的模型。
即使我的模型定义了输入形状

我试着将input\u dim=dim切换到input\u shape=(dim,)。 在这个问题上,我能找到的唯一的东西,比如或只是说,确保要合并的模型中的第一层有一个定义的输入形状,这是我的。我无法想象,对于连接层,您也必须这样做

我首先为患者信息创建密集层:

metadata\u model=Sequential()
metadata_model.add(密集型(32,input_dim=X_train.iloc[:,L*W:.shape[1],activation=“relu”))
元数据_model.add(密集(64))
然后,图像的模型:

model = Sequential()
model.add(Conv2D(32, (3, 3), padding="same", input_shape=(W, L, 3)))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=-1))
model.add(MaxPooling2D(pool_size=(3,3)))
model.add(Dropout(rate = 0.25))
model.add(Conv2D(64, (3, 3), padding="same"))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=-1))
model.add(Conv2D(64, (3, 3), padding="same"))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=-1))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(128, (3, 3), padding="same"))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=-1))
model.add(Conv2D(128, (3, 3), padding="same"))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=-1))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(1024))
model.add(Activation("relu"))
model.add(BatchNormalization())
model.add(Dropout(0.5))
然后我合并它们:

merged_model = Sequential()
merged_model.add(Concatenate([model, metadata_model]))
merged_model.add(Dense(7)) #7 lesion classes
merged_model.add(Activation("softmax"))
编译并创建ImageDataGenerator:

opt = Adam(lr=INIT_LR, decay=INIT_LR/EPOCHS)
merged_model.compile(loss="categorical_crossentropy", optimizer = opt, metrics=["accuracy"])
aug = ImageDataGenerator(rotation_range=25, width_shift_range=0.1, height_shift_range=0.1, shear_range=0.2, zoom_range=0.2, horizontal_flip=True, fill_mode="nearest")
并试着训练它:

train = merged_model.fit_generator(
aug.flow([trainInput, X_train.iloc[:, L*W:]], labels, batch_size=BS),
validation_data=([testInput, X_test.iloc[:, L*W:]], labels_test),
steps_per_epoch=500,
epochs=EPOCHS,
verbose=1)
此行导致以下错误:

RuntimeError                              Traceback (most recent call last)
<ipython-input-114-fc6c254db390> in <module>
      4 steps_per_epoch=500,
      5 epochs=EPOCHS,
----> 6 verbose=1)

c:\users\megag\appdata\local\programs\python\python37\lib\site-packages\keras\legacy\interfaces.py in wrapper(*args, **kwargs)
     89                 warnings.warn('Update your `' + object_name + '` call to the ' +
     90                               'Keras 2 API: ' + signature, stacklevel=2)
---> 91             return func(*args, **kwargs)
     92         wrapper._original_function = func
     93         return wrapper

c:\users\megag\appdata\local\programs\python\python37\lib\site-packages\keras\engine\training.py in fit_generator(self, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)
   1416             use_multiprocessing=use_multiprocessing,
   1417             shuffle=shuffle,
-> 1418             initial_epoch=initial_epoch)
   1419 
   1420     @interfaces.legacy_generator_methods_support

c:\users\megag\appdata\local\programs\python\python37\lib\site-packages\keras\engine\training_generator.py in fit_generator(model, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)
     38 
     39     do_validation = bool(validation_data)
---> 40     model._make_train_function()
     41     if do_validation:
     42         model._make_test_function()

c:\users\megag\appdata\local\programs\python\python37\lib\site-packages\keras\engine\training.py in _make_train_function(self)
    494     def _make_train_function(self):
    495         if not hasattr(self, 'train_function'):
--> 496             raise RuntimeError('You must compile your model before using it.')
    497         self._check_trainable_weights_consistency()
    498         if self.train_function is None:

RuntimeError: You must compile your model before using it.
运行时错误回溯(最近一次调用)
在里面
每个历元4步=500,
5个时代=时代,
---->6详细=1)
包装中的c:\users\megag\appdata\local\programs\python37\lib\site packages\keras\legacy\interfaces.py(*args,**kwargs)
89 warnings.warn('Update your`'+object\u name+'`调用+
90'Keras 2 API:'+签名,堆栈级别=2)
--->91返回函数(*args,**kwargs)
92包装器._原始函数=func
93返回包装器
c:\users\megag\appdata\local\programs\python37\lib\site packages\keras\engine\training.py in fit\u generator(self、generator、steps\u per\u epoch、epoch、verbose、callbacks、validation\u data、validation\u steps、class\u weight、max\u queue\u size、worker、use\u multiprocessing、shuffluffle、initial\u epoch)
1416使用多处理=使用多处理,
1417洗牌=洗牌,
->1418初始_历元=初始_历元)
1419
1420@interfaces.legacy\u生成器\u方法\u支持
c:\users\megag\appdata\local\programs\python37\lib\site packages\keras\engine\training\u generator.py in-fit\u generator(模型、生成器、每个历元的步骤、历元、冗余、回调、验证数据、验证步骤、类权重、最大队列大小、工作者、使用多处理、无序、初始历元)
38
39 do\U验证=bool(验证数据)
--->40型。_make_train_function()
41如果进行验证:
42型号.\u制造\u测试\u功能()
c:\users\megag\appdata\local\programs\python37\lib\site packages\keras\engine\training.py in\u make\u train\u函数(self)
494 def生成列车功能(自):
495如果不是HASTATR(自身,“列车功能”):
-->496 raise RUNTIMERROR('在使用模型之前必须编译模型')
497自我检查可训练重量一致性()
498如果self.train_功能为无:
RuntimeError:您必须在使用模型之前编译它。

您的合并模型不再是顺序的(因为它有两个输入层/分支),因此您不能使用顺序API。相反,您需要使用来合并模型:

from keras.models import Model

x = Concatenate()([model.output, metadata_model.output])
x = Dense(7)(x)
out = Activation("softmax")(x)

merged_model = Model([model.input, metadata_model.input], out)

# the rest is the same...

合并的模型不再是连续的(因为它有两个输入层/分支),因此不能使用连续API。相反,您需要使用来合并模型:

from keras.models import Model

x = Concatenate()([model.output, metadata_model.output])
x = Dense(7)(x)
out = Activation("softmax")(x)

merged_model = Model([model.input, metadata_model.input], out)

# the rest is the same...

完美的这似乎解决了问题。合并两个分支后无法使用顺序API是有道理的。完美。这似乎解决了问题。合并两个分支后,不能使用顺序API,这是有道理的。