【问题标题】:Tensorflow image classification binary crossentropy loss is negativeTensorflow 图像分类二元交叉熵损失为负
【发布时间】:2020-03-03 21:10:03
【问题描述】:

我是 TensorFlow 的新手。我使用提供的数据集遵循了一些教程,并想自己尝试一些东西。我决定尝试对万智牌系列进行分类。每个card 上都有一个不同颜色的符号:BlackGold 等等。

颜色无关紧要,只是不同的符号。因此,我创建了一个包含 3 个不同集合(即 3 个不同符号)的数据集,并获得了大约 15'000 张图像,例如 this。有些旋转了一点,有些有 X 和 Y 偏移,只是为了得到一些不同的图像。

然后我改编了tensorflow website 上的教程进行图像分类。我想尝试三个而不是两个类:

batch_size = 250
epochs = 3
IMG_HEIGHT = 55
IMG_WIDTH = 55

train_image_generator = ImageDataGenerator(rescale=1./255)
validation_image_generator = ImageDataGenerator(rescale=1./255)

train_data_gen = train_image_generator.flow_from_directory(batch_size=batch_size,
                                                           directory=train_dir,
                                                           shuffle=True,
                                                           target_size=(IMG_HEIGHT, IMG_WIDTH),
                                                           class_mode='binary')

val_data_gen = validation_image_generator.flow_from_directory(batch_size=batch_size,
                                                              directory=validation_dir,
                                                              target_size=(IMG_HEIGHT, IMG_WIDTH),
                                                              class_mode='binary')

model = Sequential([
    Conv2D(16, 3, padding='same', activation='relu', input_shape=(IMG_HEIGHT, IMG_WIDTH ,3)),
    MaxPooling2D(),
    Conv2D(32, 3, padding='same', activation='relu'),
    MaxPooling2D(),
    Conv2D(64, 3, padding='same', activation='relu'),
    MaxPooling2D(),
    Flatten(),
    Dense(512, activation='relu'),
    Dense(1, activation='sigmoid')
])

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

history = model.fit_generator(
    train_data_gen,
    steps_per_epoch=total_train // batch_size,
    epochs=epochs,
    validation_data=val_data_gen,
    validation_steps=total_val // batch_size,
    callbacks=[cp_callback]
)

但是我的损失是负数,训练后我没有得到很好的准确度。我搞砸了什么?教程中使用的模型不适合我的用例吗?还是因为我使用了三个而不是两个类导致代码有错误?

【问题讨论】:

  • 请注意您的语言

标签: python tensorflow classification loss-function cross-entropy


【解决方案1】:

本教程中的模型用于二元分类(只有两个类别,猫或狗)。另一方面,您想要分类 3 个类而不是 2 个。因此,您必须稍微调整架构。你的最后一层应该是:

Dense(3, activation='softmax')

三个神经元,因为你有三个类和 softmax 激活,因为你希望你的输出是有效的概率。要编译模型,请使用categorical_crossentropy 而不是binary_crossentropy,并确保您的标签是单热编码的。同样对于您的ImageDataGenerator,您应该将class_mode=categorical 传递给.flow_from_directory() 函数。

【讨论】:

    猜你喜欢
    • 2018-09-12
    • 2017-11-11
    • 2021-11-25
    • 2019-07-13
    • 2020-01-03
    • 2020-12-08
    • 2018-05-31
    • 2020-03-14
    • 2018-11-03
    相关资源
    最近更新 更多