【问题标题】:Unable to Compile Model CNN-LSTM Image Classification无法编译模型 CNN-LSTM 图像分类
【发布时间】:2020-07-10 06:59:24
【问题描述】:

我打算使用 CNN+LSTM 将图像分类为 4 类。

我对如何结合 CNN 和 LSTM 不是很熟悉。

我在尝试编译 CNN+LSTM 时遇到错误:You must compile your model before using it.

数据集是一系列医学图像。仅使用 CNN 就能获得大约 70% 的准确率(仅大约 300 个样本的小样本量),因此我决定结合 LSTM 看看是否会提高准确率。

from keras.optimizers import RMSprop
from keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras import Sequential
from tensorflow.keras.layers import (LSTM, Dense, Embedding, Dropout, Conv2D, BatchNormalization, Activation,
                                     MaxPooling2D, Flatten, TimeDistributed, SpatialDropout1D)

train_datagen = ImageDataGenerator(rescale=1. / 255, shear_range=0.2, zoom_range=0.2, rotation_range=45,
                                   horizontal_flip=True, vertical_flip=True, validation_split=.2)
validation_datagen = ImageDataGenerator(rescale=1. / 255, validation_split=.2)
test_datagen = ImageDataGenerator(rescale=1. / 255)

train_generator = train_datagen.flow_from_directory(directory=r'', target_size=(224, 224), color_mode="rgb",
                                                    batch_size=32, class_mode='categorical', shuffle=True, seed=42)
validation_generator = validation_datagen.flow_from_directory(directory=r'', target_size=(224, 224), color_mode="rgb",
                                                              batch_size=32, class_mode='categorical', shuffle=True,
                                                              seed=42)
test_generator = test_datagen.flow_from_directory(directory=r'', target_size=(224, 224), color_mode="rgb",
                                                  batch_size=1, class_mode=None, shuffle=False, seed=42)

num_classes = 4
input_shape = (224, 224, 3)

# input image dimensions
img_rows, img_cols = 224, 224

model = Sequential()
# define CNN model
model.add(TimeDistributed(Conv2D(32, (3, 3), padding='same', input_shape=input_shape)))
model.add(TimeDistributed(BatchNormalization()))
model.add(TimeDistributed(Activation('relu')))
model.add(TimeDistributed(MaxPooling2D(pool_size=(2, 2))))

model.add(TimeDistributed(Conv2D(64, (3, 3))))
model.add(TimeDistributed(BatchNormalization()))
model.add(TimeDistributed(Activation('relu')))
model.add(TimeDistributed(MaxPooling2D(pool_size=(2, 2))))
model.add(TimeDistributed(Dropout(0.25)))

model.add(TimeDistributed(Flatten()))
model.add(TimeDistributed(Dense(256)))
model.add(TimeDistributed(BatchNormalization()))
model.add(TimeDistributed(Activation('relu')))
model.add(TimeDistributed(Dropout(0.25)))

# define LSTM model
model.add(LSTM(100, input_shape=(5, 1), return_sequences=True))
model.add(LSTM(Embedding(8192, 256)))
model.add(LSTM(SpatialDropout1D(0.3)))
model.add(LSTM(256, dropout=0.3, recurrent_dropout=0.3))
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.3))
model.add(Dense(5, activation='softmax'))

model.compile(loss=keras.losss.categorical_crossentropy, optimizer=RMSprop(lr=0.001, rho=0.9, epsilon=1e-08, decay=0.0),
              metrics=['accuracy'])

STEP_SIZE_TRAIN = train_generator.n // train_generator.batch_size
STEP_SIZE_VALID = validation_generator.n // validation_generator.batch_size
model.fit_generator(generator=train_generator, steps_per_epoch=50, validation_data=validation_generator,
                    validation_steps=STEP_SIZE_VALID, epochs=30)

【问题讨论】:

    标签: python lstm conv-neural-network


    【解决方案1】:

    您可以简单地将input_shape=input_shape 从 Conv2D 中移出并将其放入 TimeDistributed。即

    model.add(TimeDistributed(Conv2D(32, (3, 3), padding='same'), input_shape=input_shape))
    

    【讨论】:

      猜你喜欢
      • 2022-12-03
      • 2021-07-15
      • 2020-10-09
      • 2018-10-23
      • 2021-09-16
      • 1970-01-01
      • 2021-08-13
      • 2018-01-26
      • 1970-01-01
      相关资源
      最近更新 更多