我正在训练一个模型来尝试解决“糖尿病性视网膜病”这一在世界上广为人知的问题。 在这里,我将保留到目前为止的代码。
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 ()
函数,因为这是内存崩溃的方式。我想知道如何传递少量的图像样本,从而能够做到这一点。
我还有一个关于停止条件的问题,我已将其配置为恢复最佳权重,但是只要算法要执行此操作,算法就会停止。
最后,感谢您在代码中看到的其他建议和错误。我真的很陌生,就我看文档而言,我不会停止发现自己迷路了。非常感谢
答案 0 :(得分:0)
如您所见,我正在使用预先训练的模型VGG16。
从weigts=None
开始,根据给出的代码,您似乎未在使用预训练的代码。您也不需要指定classes=5
,因为您要向网络和include_top=False
添加自己的顶部。
首先,我不知道我的缩放比例是否做得很好,我了解除了操作之外...
第二,我想使用诸如featurewise_std_normalization等参数。...
您可以预先对图像进行预处理,按图像加载数据集图像,然后计算值并进行汇总。
我还有一个关于停止条件的问题,我已将其配置为恢复最佳权重,但是只要算法要执行此操作,算法就会停止。
这是EarlyStopping
回调的目的。它会根据您的情况停止训练,然后恢复重量。也就是说,在3个时间段后,如果精度没有提高,请停止训练并恢复最佳体重。
最后,感谢您在代码中看到的其他建议和错误。
没有明显的方法可以改进代码,只能进行实验并看看会发生什么。