需要帮助来训练糖尿病视网膜病变问题的模型

时间:2019-12-16 19:51:48

标签: keras

我正在训练一个模型来尝试解决“糖尿病性视网膜病”这一在世界上广为人知的问题。 在这里,我将保留到目前为止的代码。

  train_datagen = ImageDataGenerator(
    rescale=1. / 255,
    rotation_range=15,  # randomly rotate pictures
    width_shift_range=0.1,  # randomly translate pictures
    height_shift_range=0.1,
    shear_range=0.2,  # randomly apply shearing
    zoom_range=0.2,  # random zoom range
    horizontal_flip=True,
    #samplewise_std_normalization=True,
    #featurewise_std_normalization=True,
    validation_split=0.30)

train_generator = train_datagen.flow_from_dataframe(
        dataframe=trainLabels,
        directory='resized_train_cropped/resized_train_cropped/',
        x_col="image",
        y_col="level",
        target_size=(224, 224),
        batch_size=10,
        class_mode='categorical',
        color_mode='rgb', #quitar o no quitar
        subset='training')


validation_generator = train_datagen.flow_from_dataframe(
        dataframe=trainLabels,
        directory='resized_train_cropped/resized_train_cropped/',
        x_col="image",
        y_col="level",
        target_size=(224, 224),
        batch_size=10,
        class_mode='categorical',
        subset='validation')

model=Sequential()
model.add(vgg16.VGG16(include_top=False, weights=None, input_tensor=None, input_shape=(224,224,3), pooling=None, classes=5))
model.add(Flatten())
model.add(Dense(4096, activation='relu', name='fc1'))
model.add(Dropout(0.5))
model.add(Dense(4096, activation='relu', name='fc2'))
model.add(Dropout(0.5))
model.add(Dense(5, activation='softmax', name='predictions'))


model.compile(loss='categorical_crossentropy',
            optimizer='adam',
            metrics=['acc', 'mse'])

#Model Summary
model.summary()

log_dir="logs\\fit\\" +'Prueba'+ datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback = TensorBoard(log_dir=log_dir, histogram_freq=1)

parada=callbacks.callbacks.EarlyStopping(monitor='acc',mode='max',verbose=1,restore_best_weights=True,patience=3)
learningRate=callbacks.callbacks.ReduceLROnPlateau(monitor='loss', factor=0.1, verbose=1, mode='min', min_delta=0.0001, cooldown=0, min_lr=0, patience=5)

model.fit_generator(
    train_generator,
    steps_per_epoch=50,
    epochs=10,
    validation_data=validation_generator,
    validation_steps=30,
    validation_freq=1,
    callbacks=[tensorboard_callback,parada])

如您所见,我正在使用预先训练的模型VGG16。 使用这些预处理参数,我的精度不能超过0.75,我已经测试了许多不同的参数,并且无法进行升级。

首先,我不知道我是否进行了很好的缩放,我了解除了我做的操作以外,rescale = 1. / 255有必要将每个图像的平均值除以得到更高的分数。但是我不知道该怎么做。

第二,我想使用诸如featurewise_std_normalization之类的参数。但是这些都需要适合这组图像。问题是我无法将整个train_generator传递给train_datagen.fit ()函数,因为这是内存崩溃的方式。我想知道如何传递少量的图像样本,从而能够做到这一点。

我还有一个关于停止条件的问题,我已将其配置为恢复最佳权重,但是只要算法要执行此操作,算法就会停止。

最后,感谢您在代码中看到的其他建议和错误。我真的很陌生,就我看文档而言,我不会停止发现自己迷路了。非常感谢

1 个答案:

答案 0 :(得分:0)

  

如您所见,我正在使用预先训练的模型VGG16。

weigts=None开始,根据给出的代码,您似乎未在使用预训练的代码。您也不需要指定classes=5,因为您要向网络和include_top=False添加自己的顶部。

  

首先,我不知道我的缩放比例是否做得很好,我了解除了操作之外...

     

第二,我想使用诸如featurewise_std_normalization等参数。...

您可以预先对图像进行预处理,按图像加载数据集图像,然后计算值并进行汇总。

  

我还有一个关于停止条件的问题,我已将其配置为恢复最佳权重,但是只要算法要执行此操作,算法就会停止。

这是EarlyStopping回调的目的。它会根据您的情况停止训练,然后恢复重量。也就是说,在3个时间段后,如果精度没有提高,请停止训练并恢复最佳体重。

  

最后,感谢您在代码中看到的其他建议和错误。

没有明显的方法可以改进代码,只能进行实验并看看会发生什么。