繁体   English   中英

logits 和 labels 必须具有相同的第一维,得到 logits 形状 [2048,10] 和标签形状 [32]

[英]logits and labels must have the same first dimension, got logits shape [2048,10] and labels shape [32]

我正在尝试使用以下代码让 CNN 对图像进行分类。

本质上,此代码接收一个包含文件夹和图像的目录,并训练 CNN 对它们进行分类。

这是我的代码:

        self.model.add(Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same', input_shape=(32, 32, 3)))
        self.model.add(BatchNormalization())
        self.model.add(Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))
        self.model.add(BatchNormalization())
        self.model.add(MaxPooling2D((2, 2)))
        self.model.add(Dropout(0.2))
        self.model.add(Conv2D(64, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))
        self.model.add(BatchNormalization())
        self.model.add(Conv2D(64, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))
        self.model.add(BatchNormalization())
        self.model.add(MaxPooling2D((2, 2)))
        self.model.add(Dropout(0.3))
        self.model.add(Conv2D(128, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))
        self.model.add(BatchNormalization())
        self.model.add(Conv2D(128, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))
        self.model.add(BatchNormalization())
        self.model.add(MaxPooling2D((2, 2)))
        self.model.add(Dropout(0.4))
        self.model.add(Flatten())
        self.model.add(Dense(128, activation='relu', kernel_initializer='he_uniform'))
        self.model.add(BatchNormalization())
        self.model.add(Dropout(0.5))
        self.model.add(Dense(10, activation='softmax'))

    def processModel(self, split, epochs=10):
        datagen = keras.preprocessing.image.ImageDataGenerator(
            rescale=1./255,
            rotation_range=5,
            zoom_range=(0.95, 0.95),
            horizontal_flip=False,
            vertical_flip=False,
            data_format='channels_last',
            validation_split=split,
        )

        train_generator = datagen.flow_from_directory(
            directory=self.path,
            color_mode='rgb',
            class_mode='sparse',
            shuffle=True,
            subset='training',
            seed=7
        )

        test_generator = datagen.flow_from_directory(
            directory=self.path,
            color_mode='rgb',
            class_mode='sparse',
            shuffle=True,
            subset='validation',
            seed=7
        )

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

        self.model.fit(train_generator, epochs=epochs, verbose=2)
        self.score = self.model.evaluate(test_generator)

我不断收到此错误:

logits and labels must have the same first dimension, got logits shape [2048,10] and labels shape [32]

在线的:

        self.model.fit(train_generator, epochs=epochs, verbose=2)

有谁知道为什么会这样?

在不知道您的数据和数据准备的情况下,很难重现,但我认为问题可能出在您的损失函数

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

尝试使用categorical_crossentropy代替sparse_categorical_crossentropy

self.model.compile(
    optimizer='adam',
    loss='categorical_crossentropy',
    metrics=["accuracy"]
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM