python - ValueError:形状不匹配:标签的形状(收到的 (15,))应该等于 logits 的形状,除了最后一个维度(收到的 (5, 3))
问题描述
尝试拟合模型时出现此错误:
ValueError:形状不匹配:标签的形状(收到的 (15,))应该等于 logits 的形状,除了最后一个维度(收到的 (5, 3))。
产生错误的代码:
history = model.fit_generator(
train_generator,
epochs=10,
validation_data=validation_generator)
这是train_generator,验证生成器类似:
train_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
train_dir,
target_size=(IMG_WIDTH, IMG_HEIGHT),
batch_size=5)
我试着得到形状:
for data_batch, labels_batch in train_generator:
print('data batch shape:', data_batch.shape)
print('labels batch shape:', labels_batch.shape)
break
数据批次形状:(5, 192, 192, 3) 标签批次形状:(5, 3)
当我更改批量大小时,错误中的标签形状会相应更改(批量大小为 3 会导致标签形状为 (9) 的错误,例如,我有 3 个类)。但我担心的是它是由 train_generator 完成的,我能做些什么来解决这个问题吗?此外,当我从 train_generator 打印形状时,它似乎是正确的。
这是模型,以防万一:
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',
input_shape=(IMG_WIDTH, IMG_HEIGHT, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
for i in range(2):
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(3, activation='softmax'))
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
谢谢!
编辑 - 完整代码:
该目录包含两个文件夹 - 训练和验证,每个文件夹都有三个子文件夹,其中包含相应类的图像。
try:
%tensorflow_version 2.x # enable TF 2.x in Colab
except Exception:
pass
from tensorflow.keras import datasets, layers, models
IMG_WIDTH = 192
IMG_HEIGHT = 192
train_dir = 'train'
validation_dir = 'validation'
from google.colab import drive
drive.mount('/content/drive')
import os
os.chdir("drive/My Drive/colab")
from tensorflow.keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
train_dir,
target_size=(IMG_WIDTH, IMG_HEIGHT),
batch_size=5)
validation_datagen = ImageDataGenerator(rescale=1./255)
validation_generator = validation_datagen.flow_from_directory(
validation_dir,
target_size=(IMG_WIDTH, IMG_HEIGHT),
batch_size=5)
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',
input_shape=(IMG_WIDTH, IMG_HEIGHT, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
for i in range(2):
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(3, activation='softmax'))
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
history = model.fit_generator(
train_generator,
epochs=10,
validation_data=validation_generator)
谢谢!
解决方案
sparse_categorical_crossentropy
和之间的区别在于categorical_crossentropy
您的目标是否是单热编码的。
标签批的形状是(5,3)
,表示它已经过一次热编码。所以你应该使用categorical_crossentropy
损失函数。
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
推荐阅读
- php - 将产品显示在它们所属的类别之下
- swift - 如果枚举的案例具有关联类型,是否可以在没有关联数据的情况下获取案例名称?
- windows - 将错误代码从子 cmd 提示符批量返回到其父 cmd 提示符
- java - 如何让计时器在后台运行以在特定时间段后执行操作?
- pytorch - Pytorch Sigmoid 函数是什么
- mysql - 我应该标准化数据库中的时间记录吗?
- tomcat - 亚马逊 ec2 centos 上的 Essl epush 服务器设置问题
- java - 为什么compareByValue 方法不起作用?
- cuda - 在 CUDA 中找到第一个非零元素
- loops - 优化具有 While 循环和交叉应用的 T-SQL 查询