【问题标题】:InvalidArgumentError: Can not squeeze dim[1], expected a dimension of 1, got 16InvalidArgumentError:无法挤压 dim[1],预期维度为 1,得到 16
【发布时间】:2021-07-03 07:32:01
【问题描述】:

我正在尝试使用 tensoflow 制作图像分类器 CNN。我正在尝试使用ImageDataGenerator 加载数据集。像这样:

from tensorflow.keras.preprocessing.image import ImageDataGenerator
image_datagen = ImageDataGenerator(rescale=1/255)

IMAGE_DIMS = (200,200)
train_generator = image_datagen.flow_from_directory(
    TRAIN_DIR,
    target_size=IMAGE_DIMS,
    batch_size=80,
    class_mode="categorical",
    shuffle=True
)

这是我的网络的样子:

model = keras.models.Sequential([
    keras.layers.Conv2D(16,(3,3), input_shape=(200,200,1), activation='relu'),
    keras.layers.MaxPooling2D(2, 2),
    keras.layers.Conv2D(32,(3,3), activation='relu'),
    keras.layers.MaxPooling2D(2, 2),
    keras.layers.Conv2D(64,(3,3), activation='relu'),
    keras.layers.MaxPooling2D(2, 2),
    keras.layers.Flatten(),
    keras.layers.Dense(units=128, activation="relu"),
    keras.layers.Dense(units=64, activation="relu"),
    keras.layers.Dense(units=16, activation="softmax")
])

model.compile(
    optimizer='adam',
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy']
)

当我尝试通过以下方式将模型拟合到数据集时:

model.fit(
    train_generator,
    steps_per_epoch=4,
    epochs=2
)

我收到此错误:

InvalidArgumentError: Can not squeeze dim[1], expected a dimension of 1, got 16

我对 TensorFlow 比较陌生,我不知道这里出了什么问题。我尝试过使用不同的数据集、不同的优化器、不同的层数、不同的损失函数,但没有任何效果。

出了什么问题?我做错了什么?

【问题讨论】:

  • 你的数据集中有多少类?请注意,您不能同时使用class_mode="categorical"loss='sparse_categorical_crossentropy'
  • @Lescurel 16 节课
  • 我不能确定,但​​是当您说I have tried it with different datasets, different optimizers, different numbers of layers, different loss functions, nothing worked 时,您是否始终收到相同的错误消息?另外,当您提出与 python 相关的问题时,请添加完整的 python Traceback,这有助于了解您的代码在哪里失败。
  • 我没有得到同样的错误,但也没有回溯

标签: python tensorflow keras computer-vision tensorflow2.0


【解决方案1】:

由于您在具有 16 个节点的输出层中使用了softmax 激活,我假设您有 16 个互斥类。您的 y 数据应该只是一个包含 16 个 0 和 1 的列表,而不是 0 到 15 的整数 - 这将是 sparse_categorical_crossentropy 损失函数所期望的。

尝试将损失函数设置为 categorical_crossentropy 以适应,将 ImageDataGenerator 的 class_mode 也设置为“稀疏”!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多