在是否在图像数据生成器中将class_mode从二进制更改为分类之间感到困惑



当我在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_directorybinary_crossentropy作为损失。如果您有 2 个以上的类,请使用class_mode='categorical'categorical_crossentropy

最新更新