Я хотел узнать больше о машинном обучении / глубоком обучении, поэтому я пытался решить соревнование Kaggle Diabetic Retinopathy как опыт обучения. Однако функция точности и потерь моей модели Keras, похоже, не улучшается.
Я скачал набор данных о диабетической ретинопатии. Сбалансировал классы и создал равномерно распределенные партии по 100 изображений в пакете. Я пробовал много комбинаций параметризации, таких как большее количество эпох, разные скорости обучения, более сложные модели, что угодно. Все они, кажется, не имеют никакого эффекта. Так вот мой код.
Мой импорт:
from tqdm import tqdm
import os
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from keras.utils import to_categorical
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dense, Conv2D, MaxPooling2D, Dropout, Flatten
from keras import optimizers
from keras.callbacks import ModelCheckpoint
from keras import backend as K
K.tensorflow_backend._get_available_gpus()
Мои параметры:
HEIGHT = 512
WIDTH = 512
DEPTH = 3
inputShape = (HEIGHT, WIDTH, DEPTH)
NUM_CLASSES = 5
EPOCHS = 15
INIT_LR = 0.001
BS = 1
Я проверяю партии в заданном каталоге:
''' read batches '''
train_dir = '/DATA/npy_data/train_dir/'
batch_path_list = []
for batch in tqdm(os.listdir(train_dir)):
batch_full_path = os.path.join(os.path.sep, train_dir, batch)
batch_path_list.append(str(batch_full_path))
AMOUNT_OF_BATCHES = len(batch_path_list)
if AMOUNT_OF_BATCHES == 0:
print('We found no batches. Either no data or wrong directory...')
if AMOUNT_OF_BATCHES != 0:
print('We found ' + str(AMOUNT_OF_BATCHES) + ' batches.')
Я прочитал файл CSV, чтобы получить метки
''' read csv labels '''
csv_dir = '/DATA/data/trainLabels_normalised.csv'
dataframe = pd.read_csv(csv_dir, sep=',')
patientIDList = []
for index, row in dataframe.iterrows():
patientID = row[0] + ''
patientID = patientID.replace('_right', '')
patientID = patientID.replace('_left', '')
dataframe.at[index, 'PatientID'] = patientID
patientIDList.append(patientID)
Я создаю и компилирую свою модель
model = Sequential(name='test')
model.add(Conv2D(32, (3, 3), padding='same', activation='relu', input_shape=inputShape))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3, 3), padding='same', activation='relu'))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3, 3), padding='same', activation='relu'))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(activation='softmax', units=5))
opt = optimizers.SGD(decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy", "mse"])
checkpointer = ModelCheckpoint(filepath="/home/user/Desktop/code/model/best_weights.hdf5",
verbose=1,
save_best_only=True)
Я загружаю партию и соединяю этикетки со 100 изображениями из партии.
''' load batches '''
for item in batch_path_list:
batch_data = np.load(item).tolist()
df1 = dataframe[dataframe['image'].isin(batch_data)]
imageNameArr = []
dataArr = []
for index, row in df1.iterrows():
key = str(row[0])
if key in batch_data:
imageNameArr.append(key)
dataArr.append(batch_data[key])
df2 = pd.DataFrame({'image': imageNameArr, 'data': dataArr})
for idx in range(0, len(df1)):
if (df1.loc[df1.index[idx], 'image'] != df2.loc[df2.index[idx], 'image']):
print("Error " + df1.loc[df1.index[idx], 'image'] + "==" + df2.loc[df2.index[idx], 'image'])
merged_files = pd.merge(df2, df1, left_on='image', right_on='image', how='outer')
Я генерирую сплиты
train_ids, valid_ids = train_test_split(patientIDList, test_size=0.25, random_state=10)
traindf = merged_files[merged_files.PatientID.isin(train_ids)] #data (data) image (img name) level (fase)
valSet = merged_files[merged_files.PatientID.isin(valid_ids)]
trainX = traindf['data']
trainY = traindf['level']
valX = valSet['data']
valY = valSet['level']
trainY = to_categorical(trainY, num_classes=NUM_CLASSES)
valY = to_categorical(valY, num_classes=NUM_CLASSES)
Xtrain = np.zeros([trainX.shape[0], HEIGHT, WIDTH, DEPTH])
Xval = np.zeros([valX.shape[0], HEIGHT, WIDTH, DEPTH])
Я использую генератор и вызываю функцию подгонки.
aug = ImageDataGenerator(rotation_range=30, width_shift_range=0.1,
height_shift_range=0.1, shear_range=0.2, zoom_range=0.2,
horizontal_flip=True, fill_mode="nearest")
model.fit_generator(aug.flow(Xtrain, trainY,
batch_size=BS),
validation_data=(Xval, valY),
steps_per_epoch=(len(trainX) // BS),
epochs=EPOCHS,
verbose=1,
callbacks=[checkpointer])
Однако это приводит к очень низкой точности и, по-видимому, не улучшается в течение 29 партий.
Результат:
54/87 [=================> ............] - ETA: 0s - потеря: 1.6092 - согласно: 0.2037 - mean_squared_error: 0.1599
56/87 [==================> ...........] - ETA: 0s - потеря: 1.6089 - acc: 0.2143 - mean_squared_error: 0,1598
58/87 [===================> ..........] - ETA: 0s - потеря: 1.6169 - acc: 0.2069 - mean_squared_error: 0,1605
60/87 [===================> ..........] - ETA: 0s - потеря: 1.6146 - acc: 0.2167 - mean_squared_error: 0,1602
62/87 [====================> .........] - ETA: 0s - потеря: 1.6172 - acc: 0.2097 - mean_squared_error: 0,1605
64/87 [=====================> ........] - ETA: 0s - потеря: 1.6196 - acc: 0.2031 - mean_squared_error: 0,1607
66/87 [=====================> ........] - ETA: 0s - потеря: 1.6180 - acc: 0.2121 - mean_squared_error: 0,1605
68/87 [======================> .......] - ETA: 0s - потеря: 1.6164 - acc: 0.2206 - mean_squared_error: 0,1604
70/87 [=======================> ......] - ETA: 0s - потеря: 1.6144 - acc: 0.2286 - mean_squared_error: 0,1602
72/87 [=======================> ......] - ETA: 0s - потеря: 1.6163 - acc: 0.2222 - mean_squared_error: 0,1604
74/87 [========================> .....] - ETA: 0s - потеря: 1.6134 - acc: 0.2297 - mean_squared_error: 0,1601
76/87 [=========================> ....] - ETA: 0s - потеря: 1.6102 - acc: 0.2368 - mean_squared_error: 0,1598
78/87 [=========================> ....] - ETA: 0s - потеря: 1.6119 - acc: 0.2308 - mean_squared_error: 0,1600
80/87 [==========================> ...] - ETA: 0s - потеря: 1.6159 - acc: 0.2250 - mean_squared_error: 0,1604
82/87 [===========================> ..] - ETA: 0s - потеря: 1.6150 - acc: 0.2195 - mean_squared_error: 0,1603
84/87 [===========================> ..] - ETA: 0s - потеря: 1.6206 - acc: 0.2143 - mean_squared_error: 0,1608
86/87 [============================>.] - ETA: 0s - потеря: 1.6230 - acc: 0.2093 - mean_squared_error: 0,1610
87/87 [==============================] - 3s 31мс / шаг - потеря: 1.6234 - согласно: 0.2069 - mean_squared_error : 0,1610 - val_loss: 1,6435 - val_acc: 0,1282 - val_mean_squared_error: 0,1629
Эпоха 00015: val_loss не улучшился с 1.57533
Предложения и отзывы по улучшению моей модели очень ценятся!