合并Conv2D和Dense模型后出现”RuntimeError: You must compile your model before using it.”错误,尽管已经编译了合并后的模型

我正在尝试训练一个AI来识别基于图像和患者信息的病变。我使用Keras的Sequential模型来实现这一目标。我创建了两个顺序模型,然后将它们合并并编译合并后的模型。当我尝试拟合模型时,我得到了错误RuntimeError: You must compile your model before using it.,尽管我的模型已经定义了输入形状。

我尝试将input_dim=dim改为input_shape=(dim,)。我找到的关于此问题的唯一信息,例如这个帖子这个帖子,都只是说要确保你合并的模型的第一层有一个定义的input_shape,而我的模型已经有了。我无法想象你还需要为Concatenate层做同样的事情。

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

metadata_model = Sequential()metadata_model.add(Dense(32, input_dim=X_train.iloc[:, L*W:].shape[1], activation="relu"))metadata_model.add(Dense(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个病变类别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 wrapperc:\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_supportc:\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.

回答:

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

from keras.models import Modelx = Concatenate()([model.output, metadata_model.output])x = Dense(7)(x)out = Activation("softmax")(x)merged_model = Model([model.input, metadata_model.input], out)# 其余部分相同...

Related Posts

如何对SVC进行超参数调优?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

如何在初始训练后向模型添加训练数据?

我想在我的scikit-learn模型已经训练完成后再…

使用Google Cloud Function并行运行带有不同用户参数的相同训练作业

我正在寻找一种方法来并行运行带有不同用户参数的相同训练…

加载Keras模型,TypeError: ‘module’ object is not callable

我已经在StackOverflow上搜索并阅读了文档,…

在计算KNN填补方法中特定列中NaN值的”距离平均值”时

当我从头开始实现KNN填补方法来处理缺失数据时,我遇到…

使用巨大的S3 CSV文件或直接从预处理的关系型或NoSQL数据库获取数据的机器学习训练/测试工作

已关闭。此问题需要更多细节或更清晰的说明。目前不接受回…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注