Tensorflow图像分类二进制交叉熵损失为负

我是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,class_mode='binary')

model = Sequential([
    Conv2D(16,3,padding='same',activation='relu',input_shape=(IMG_HEIGHT,IMG_WIDTH,3)),MaxPooling2D(),Conv2D(32,activation='relu'),Conv2D(64,flatten(),Dense(512,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]
)

但是我的损失是负数,训练后我的准确性不高。我搞砸了什么?本教程中使用的模型对我的用例不利吗?还是代码中有错误,因为我使用了三个而不是两个类?

sxdtzzf 回答:Tensorflow图像分类二进制交叉熵损失为负

本教程中的模型用于二进制分类(仅两个类别,猫或狗)。另一方面,您希望将3个类别分类为2个类别。因此,您必须对架构进行一些调整。您的最后一层应该是:

Dense(3,activation='softmax')

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

本文链接:https://www.f2er.com/3145936.html

大家都在问