当我将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从binary改为categorical,还是应该保持为binary。
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:可以是”categorical”、”binary”、”sparse”、”input”或None。默认值为”categorical”。决定返回的标签数组类型: – “categorical”将返回2D的一热编码标签, – “binary”将返回1D的二进制标签,”sparse”将返回1D的整数标签, – “input”将返回与输入图像相同的图像(主要用于自编码器)。 – 如果为None,则不返回标签(生成器只会产生图像数据批次,这对于使用model.predict_generator()很有用)。请注意,如果class_mode为None,数据仍然需要位于directory的子目录中才能正常工作。
所以,如果你选择categorical
作为class_mode
,你应该使用categorical_crossentropy
作为损失函数;如果你选择sparse
,则应该使用sparse_categorical_crossentropy
。