我正在尝试为糖尿病视网膜病变检测建立一个预测模型。比赛的训练数据集包括 hy-res 图像不对称地分为 5 类:Normal-25807 images-73.48%;轻度 2442 图像-6.96%;中等 5291 张图片 - 15.07%;Severe-873 图像 - 2.48% 和 Proliferative-708 图像 - 2.01%。为此,我使用带有 Theano 后端的 Keras 框架(用于 CUDA 计算)。
对于图像增强,我使用了 ImageDataGenerator(代码如下)。我已将图像的大小调整为 299x299,并根据它们的类将它们分成 5 个文件夹:
train_datagen=ImageDataGenerator(rescale=1./255, rotation_range=40, zoom_range=0.2, horizontal_flip=True, fill_mode="constant", zca_whitening=True)
train_generator=train_datagen.flow_from_directory('data/~huge_data/preprocessed_imgs/', target_size=(299, 299), batch_size=32, class_mode='categorical')
起初,只是为了测试,我决定使用一个简单的卷积模型:
model=Sequential()
model.add(Convolution2D(32,3,3, input_shape=(3, 299, 299), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Convolution2D(32, 3, 3, activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Convolution2D(64, 3, 3, activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(5, activation='softmax'))
model.compile(loss='categorical_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
在拟合图像生成器时,我指出了 class_weights 以修复数据的不对称性:class_weight ={0: 25807., 1:2442., 2:5291., 3:873., 4:708.};
model.fit_generator(train_generator,
samples_per_epoch=2000,
nb_epoch=50,
verbose=2,
callbacks=callbacks_list,
class_weight ={0: 25807., 1:2442., 2:5291., 3:873., 4:708.})
问题:
- 该模型输出具有高损耗和高精度。为什么?
纪元 1/50 110s - 损失:5147.2669 - acc:0.7366
纪元 2/50 105s - 损失:5052.3844 - acc:0.7302
纪元 3/50 105s - 损失:5042.0261 - acc:0.7421
纪元 4/50 105s - 损失:4986.3544 - acc:0.7361
纪元 5/50 105s - 损失:4999.4177 - acc:0.7361
- 每个图像模型都预测为“0”类:
datagen_2=ImageDataGenerator(rescale=1./255)
val_generator=datagen_2.flow_from_directory('data/color_validation_images/',
target_size=(299,299),
batch_size=100,
class_mode='categorical')
y_predict=model.predict_generator(val_generator,
val_samples=82)
[np.argmax(i) for i in y_predict]
它的输出是:
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
没有 argmax(部分)
array([ 9.47651565e-01, 7.30426749e-03, 4.40788604e-02,
6.25302084e-04, 3.39932943e-04], dtype=float32),
array([ 9.51994598e-01, 6.50278665e-03, 4.07058187e-02,
5.17037639e-04, 2.79774162e-04], dtype=float32),
array([ 9.49448049e-01, 6.50656316e-03, 4.32702228e-02,
5.20388770e-04, 2.54814397e-04], dtype=float32),
array([ 9.47873473e-01, 7.13181263e-03, 4.40776311e-02,
6.00705389e-04, 3.16353660e-04], dtype=float32),
array([ 9.53514516e-01, 6.13699574e-03, 3.96034382e-02,
4.82603034e-04, 2.62484333e-04], dtype=float32),
....
如果我尝试使用 class_weight ='auto'。在这种情况下,模型显示“可预测”的输出:
纪元 1/50 107s - 损失:0.9036 - acc:0.7381
纪元 2/50 104 秒 - 损失:0.9333 - 累积:0.7321
纪元 3/50 105s - 损失:0.8865 - acc:0.7351
纪元 4/50 106s - 损失:0.8978 - acc:0.7351
纪元 5/50 105s - 损失:0.9158 - acc:0.7302
但是,它仍然不起作用:
severe_DR=plt.imread('data/~huge_data/preprocessed_imgs/3_Severe/99_left.jpeg')
mild_DR=plt.imread('data/~huge_data/preprocessed_imgs/1_Mild/15_left.jpeg')
moderate_DR=plt.imread('data/~huge_data/preprocessed_imgs/2_Moderate/78_right.jpeg')
model.predict(mild_DR.reshape((1,)+x[1].shape))
array([[ 1., 0., 0., 0., 0.]], dtype=float32)
model.predict(severe_DR.reshape((1,)+x[1].shape))
array([[ 1., 0., 0., 0., 0.]], dtype=float32)
model.predict(moderate_DR.reshape((1,)+x[1].shape))
array([[ 1., 0., 0., 0., 0.]], dtype=float32)
我做错了什么?
在回答 Sergii Gryshkevych 之后,我修复了我的模型:我已将 class_weight 更改为 {0:1, 1:10.57, 2:4.88, 3:29, 4:35}(我将每个类中的图像划分为最大图像(在头等舱))。接下来,我将指标更改为 categorical_accuracy。而且我增加了模型中的层数(如这里)。因此,5 个 epoch 后的输出为:
时代 1/5 500/500 [===============================] - 52s - 损失:5.6944 - categorical_accuracy: 0.1840
时代2/5 500/500 [===============================] - 52s - 损失:6.7357 - categorical_accuracy:0.2040
Epoch 3 /5 500/500 [===============================] - 52s - 损失:6.7373 - categorical_accuracy:0.0800
Epoch 4/ 5 500/500 [===============================] - 52s - 损失:6.0311 - categorical_accuracy:0.0180
Epoch 5/5 500/500 [===============================] - 51s - 损失:4.9924 - 分类准确度:0.0560
这是对的吗?
有没有办法将二次加权 kappa 分配为 keras 中的指标?