我知道这个论坛上已经有类似的帖子了,但是虽然我查看了它们,但我似乎找不到解决方案。
我正在尝试使用 VGG 模型对图像进行多分类。我正在学习一本书中的教程。我使用 VGG 模型的最后一层作为最后一个 sequentail 层的输入。
我的图像存储在文件夹“train”中,在该文件夹中有 43 个子文件夹,其中包含属于 43 个类别的图像。每个子文件夹的名称都是 0 到 42 之间的数字。
我使用 flow_from_directory()
函数加载图像,最后使用 fit_generator()
。
我模型中的最后一层是密集层 model.add(Dense(43, activation='softmax'))
这是我的代码:
input_shape1 = (224, 224, 3)
vgg = vgg16.VGG16(include_top=False, weights='imagenet', input_shape=input_shape1)
output = vgg.layers[-2].output
output = keras.layers.Flatten()(output)
vgg_model = Model(vgg.input, output)
vgg_model.trainable = False
for layer in vgg_model.layers:
layer.trainable = False
vgg_model.summary()
input_shape = vgg_model.output_shape[1]
model = Sequential()
model.add(InputLayer(input_shape=(input_shape,)))
model.add(Dense(512, activation='relu', input_dim=input_shape))
model.add(Dropout(0.3))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.3))
model.add(Dense(43, activation='softmax'))
model.compile(optimizer=optimizers.RMSprop(lr=1e-4), loss='categorical_crossentropy', metrics=['accuracy'])
当我尝试使用此行运行模型时,出现错误:
epochs=100
history = model.fit_generator(train_ds, steps_per_epoch=1226, epochs=epochs, verbose=1)
WARNING:tensorflow:Model was constructed with shape (None, 100352) for input KerasTensor(type_spec=TensorSpec(shape=(None, 100352), dtype=tf.float32, name='input_4'), name='input_4', description="created by layer 'input_4'"), but it was called on an input with incompatible shape (None, None, None, None).
ValueError: Shapes (None, None) and (None, None, None, 43) are incompatible
我真的不知道它来自哪里。我尝试尝试输入形状,但没有成功。
编辑
这是我的图像生成器
train_datagen = ImageDataGenerator(
rescale=1./255,
validation_split=0.3,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)
test_datagen = ImageDataGenerator(rescale=1./255)
train_ds = train_datagen.flow_from_directory(
train_dir,
seed=123,
target_size=(224, 224),
batch_size=32,
class_mode='categorical')
找到属于 43 个类别的 39209 个图像。但我也为此数据集指定了验证拆分。
编辑 2
vgg_model.output_shape[0]
100352
添加最后一层后模型的输出形状为 43。
此外,我尝试将损失函数更改为 sparse_categorical_crossentropy
并出现此错误:
InvalidArgumentError: Matrix size-incompatible: In[0]: [720000,3], In[1]: [8192,512]
[[node sequential_8/dense_24/Tensordot/MatMul (defined at <ipython-input-37-e259535ec653>:2) ]] [Op:__inference_train_function_4462]
我的模型或加载图像的方式有问题,但我根本不知道。
非常感谢您的帮助。 谢谢!
答案 0 :(得分:1)
我实际上将我的图像生成器更改为 flow_from_dataframe
并且它起作用了。
train_df = train_datagen.flow_from_dataframe(
traindf,
y_col='ClassId',
x_col='Path',
directory=None,
subset='training',
seed=123,
target_size=(150, 150),
batch_size=32,
class_mode='categorical')
答案 1 :(得分:-1)