Так что я признаю, что это распространенный вопрос, но мне любопытно, кто-нибудь может помочь заметить ошибку в моем коде или подходе.Я работаю над тонкой настройкой DenseNet CNN в кератах (предварительно обученных в ImageNet) для классификации аэрофотоснимков устриц и не устриц.Вы можете увидеть пример моих изображений здесь с [1,0], обозначающим не устрицу, и [0,1], указывающим на устрицу.
Моя модель может соответствовать моим тренировочным данным в соответствии с потерей тренировки, нопотеря проверки никогда не уменьшается.С учетом вышесказанного, когда я на самом деле оцениваю точность данных обучения и проверки, они оба колеблются с точностью около 65%, что довольно ужасно для двоичной классификации.Мои разделы train / val созданы из одного и того же случайно перемешанного основного набора данных, и у меня есть около 5000 каждого из изображений устриц и не устриц.Есть идеи, что может пойти не так?Я признаю, что это изображение совсем не то, что ImageNet, но я все же предположил бы, что оно все же обеспечит некоторое улучшение.
Я точно настраиваювстроенная 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,
)