[英]Keras Loss is Negative (Binary CrossEntropy, double output model)
[英]Tensorflow image classification binary crossentropy loss is negative
我是 Tensorflow 的新手。 我使用提供的数据集遵循了一些教程,并想自己尝试一些东西。 我决定尝试对万智牌系列进行分类。 每张卡上都有不同的 colors 符号:黑色、金色等。
colors 没关系,只是符号不同。 所以我创建了一个包含 3 个不同集合(所以 3 个不同符号)的数据集,并得到了大约 15'000 个这样的图像。 有些有点旋转,有些有 X 和 Y 偏移,只是为了得到一些不同的图像。
然后我改编了tensorflow网站上的教程进行图像分类。 我想尝试三个而不是两个类:
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]
)
但是我的损失是负面的,训练后我没有得到很好的准确性。 我搞砸了什么? 教程中使用的 model 不适合我的用例吗? 或者代码中是否有错误,因为我使用了三个而不是两个类?
教程中的 model 用于二进制分类(只有两个类,猫或狗)。 另一方面,您想要分类 3 个类而不是 2 个。因此,您必须稍微调整架构。 你的最后一层应该是:
Dense(3, activation='softmax')
三个神经元,因为你有三个类和 softmax 激活,因为你希望你的输出是有效的概率。 要编译 model,请使用categorical_crossentropy
而不是binary_crossentropy
,并确保您的标签是单热编码的。 同样对于您的ImageDataGenerator
,您应该将class_mode=categorical
传递给.flow_from_directory()
function。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.