ValueError: Shapes (None, None) 和 (None, None, None, 43) 不兼容

时间:2021-04-29 14:00:12

标签: python tensorflow machine-learning keras deep-learning

我知道这个论坛上已经有类似的帖子了,但是虽然我查看了它们,但我似乎找不到解决方案。

我正在尝试使用 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]

我的模型或加载图像的方式有问题,但我根本不知道。

非常感谢您的帮助。 谢谢!

2 个答案:

答案 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)

我在使用 MobileNetV3 时遇到了和你一样的问题。我试过这个:

model = tf.keras.applications.MobileNetV3Large

您可以找到更多info