当我在CNN模型中从2个类转移到4个类时。我有错误。很多人帮我解决了这些问题,比如我需要将损失更改为sparse_categorical_crossentropy
和最后一层激活函数。
model.compile(loss='sparse_categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
history = model.fit_generator(
train_generator,
steps_per_epoch=nb_train_samples//batch_size,
epochs=epochs,
validation_data = validation_generator,
validation_steps = validation_generator.samples // batch_size,
)
我很困惑,因为我不得不将损失函数从binary_crossentropy
更改为categorical_crossenpropy
.我想知道我是否应该将 4 个类的class_mode从二进制更改为分类,还是应该将其保留为二进制。
train_datagen=ImageDataGenerator(
rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip = True,
#vertical_flip = True,
validation_split=0.2,
brightness_range=[0.5, 1.5]
)
#test_datagen = ImageDataGenerator(
# rescale=1./255,
#
#)
train_generator = train_datagen.flow_from_directory(
train_data_dir,
target_size=(img_width,img_height),
batch_size=batch_size,
shuffle=True,
class_mode='binary',
subset='training'
)
validation_generator = train_datagen.flow_from_directory(
train_data_dir, # same directory as training data
target_size=(img_height, img_width),
batch_size=batch_size,
class_mode='binary',
subset='validation'
#validation_data_dir,
#target_size=(img_width,img_height),
#batch_size=batch_size,
#class_mode='binary'
)
我认为阅读文档将是一个很好的起点。它会回答你所有的问题,然后是一些问题。
class_mode:"分类"、"二进制"、"稀疏"、"输入"或"无"之一。默认值:"分类"。确定返回的标签数组的类型: - "分类"将是 2D 独热编码标签, - "二进制"将是 1D 二进制标签,"稀疏"将是1D 整数标签, - "输入"将是与输入图像相同的图像(主要用于使用自动编码器(。- 如果为 None,则不返回任何标签(生成器将仅生成成批的图像数据,这对于与 model.predict_generator(( 一起使用很有用(。请注意,在class_mode None 的情况下,数据仍然需要驻留在目录的子目录中才能正常工作。
因此,如果选择categorical
作为class_mode
,则应使用categorical_crossentropy
作为损失函数,如果选择sparse
,则应使用sparse_categorical_crossentropy
。
当然,你应该改变它。如果您只有 2 个类,则在函数中使用class_mode='binary'
flow_from_directory
并binary_crossentropy
作为损失。如果您有 2 个以上的类,请使用class_mode='categorical'
和categorical_crossentropy