Снижение потерь на обучение, потеря на валидацию не уменьшается вообще, точность в обоих случаях - PullRequest
0 голосов
/ 04 февраля 2019

Так что я признаю, что это распространенный вопрос, но мне любопытно, кто-нибудь может помочь заметить ошибку в моем коде или подходе.Я работаю над тонкой настройкой DenseNet CNN в кератах (предварительно обученных в ImageNet) для классификации аэрофотоснимков устриц и не устриц.Вы можете увидеть пример моих изображений здесь с [1,0], обозначающим не устрицу, и [0,1], указывающим на устрицу.

Моя модель может соответствовать моим тренировочным данным в соответствии с потерей тренировки, нопотеря проверки никогда не уменьшается.С учетом вышесказанного, когда я на самом деле оцениваю точность данных обучения и проверки, они оба колеблются с точностью около 65%, что довольно ужасно для двоичной классификации.Мои разделы train / val созданы из одного и того же случайно перемешанного основного набора данных, и у меня есть около 5000 каждого из изображений устриц и не устриц.Есть идеи, что может пойти не так?Я признаю, что это изображение совсем не то, что ImageNet, но я все же предположил бы, что оно все же обеспечит некоторое улучшение.

enter image description here

Я точно настраиваювстроенная DenseNet в Keras:

from keras.applications.densenet import DenseNet121
from keras.optimizers import SGD

base_model=DenseNet121(weights='imagenet',include_top=False) #imports the mobilenet model and discards the last 1000 neuron layer.

x=base_model.output
x=GlobalAveragePooling2D()(x)
x=Dense(512,activation='relu')(x) #we add dense layers so that the model can learn more complex functions and classify for better results.
#x=Dense(1024,activation='relu')(x) #dense layer 2
x=Dense(256,activation='relu')(x) #dense layer 3
predictions=Dense(2,activation='softmax')(x) #final layer with softmax activation

# this is the model we will train
model = Model(inputs=base_model.input, outputs=predictions)

Сначала я замораживаю все, кроме моих новых случайно инициализированных полностью связанных слоев:

for layer in base_model.layers:
    layer.trainable=False

Затем я компилирую и помещаю:

model.compile(optimizer=SGD(lr=0.0001, momentum=0.9, decay=0.0, nesterov=False), 
              loss='categorical_crossentropy',metrics=['accuracy'])

batch_size = 20
INPUT_SHAPE = (224,224)
data_dir = '../data/patch/'

# set the model up to save the best weights based on val_loss
#filepath="../data/patch/logs/mobilenet--{epoch:02d}-{val_loss:.2f}.hdf5"
#checkpoint = ModelCheckpoint(filepath, monitor='val_loss', verbose=1, save_best_only=True, mode='min')
#callbacks_list = [checkpoint]

model.fit_generator(
    generate_data(data_dir, batch_size, 'train', augment=False),
    len(os.listdir(data_dir + 'images/')) // batch_size,
    epochs=50,
    validation_data=generate_data(data_dir, batch_size, 'val'),
    validation_steps= 700 // batch_size,
)

Далее я размораживаюсь до верхней трети DenseNet, перекомпилирую и запускаю снова

for layer in model.layers[:368]:
    layer.trainable=False
for layer in model.layers[368:]:
    layer.trainable=True

model.compile(optimizer=SGD(lr=0.0001, momentum=0.9, decay=0.0, nesterov=False), 
              loss='categorical_crossentropy',metrics=['accuracy'])

model.fit_generator(
    generate_data(data_dir, batch_size, 'train', augment=False),
    len(os.listdir(data_dir + 'images/')) // batch_size,
    epochs=50,
    validation_data=generate_data(data_dir, batch_size, 'val'),
    validation_steps= 700 // batch_size,
)
...