Точность моей бинарной модели классификации застряла: где я ошибся? - PullRequest
0 голосов
/ 15 октября 2019

Я попытался обучить модель для проблемы двоичной классификации, используя набор данных, сделанный из медицинских снимков (точнее, из набора данных LIDC), который, как я понимаю, не должен быть слишком далек от проблемы классификации «собака против кошки». (различая доброкачественные и злокачественные узелки)

Проблема в том, что точность, похоже, застряла, с начала до примерно 65% и, похоже, не меняется вообще. Я делаю что-то неправильно ? Пример, который привел мой друг, легко достигает более 80%, и точность улучшается эпоха за эпохой, но не моя: /

Я тренируюсь на уже извлеченных патчах одинакового размера и разделенных надва класса.

Модель, в которой я использую VGG16, точно настроенную для этой задачи (я заменил слои FC на новые, заморозил предыдущий слой и попытался пройти обучение)

Я попытался изменитьto binary_crossentropy, применяя to_categorical, измените последний слой с 1 на 2. В этот момент я запутался в правильной комбинации параметров для моих задач. Извините, если я звучу как абсолютный новичок ...

Я попытался пропустить менее информативные части кода, надеюсь, что он читабелен

training_data_dir = "flow/training" 

validation_data_dir = "flow/validation" 

test_data_dir = "flow/test" 

from keras.preprocessing.image import ImageDataGenerator
training_data_generator = ImageDataGenerator(rescale=1./255)
validation_data_generator = ImageDataGenerator(rescale=1./255)
test_data_generator = ImageDataGenerator(rescale=1./255)


training_generator = training_data_generator.flow_from_directory(
    training_data_dir,
    target_size=(IMAGE_WIDTH, IMAGE_HEIGHT),
    batch_size=BATCH_SIZE,
    class_mode="binary")
validation_generator = validation_data_generator.flow_from_directory(
    validation_data_dir,
    target_size=(IMAGE_WIDTH, IMAGE_HEIGHT),
    batch_size=BATCH_SIZE,
    class_mode="binary")
test_generator = test_data_generator.flow_from_directory(
    test_data_dir,
    target_size=(IMAGE_WIDTH, IMAGE_HEIGHT),
    batch_size=1,
    class_mode="binary", 
    shuffle=False)


vgg16_model = VGG16(weights="imagenet", include_top=False,input_tensor=Input(shape=(57, 57, 3)))
vgg16_model.summary()

model = Sequential()

for layer in vgg16_model.layers:
layer.trainable = False
  model.add(layer)

model.add(Flatten())

model.add(Dense(4096, activation='relu'))
model.add(Dense(1024, activation='relu'))
model.add(Dense(1, activation='softmax'))


model.compile(loss='binary_crossentropy',
              optimizer=keras.optimizers.Adam(lr=1e-5),
              metrics=['accuracy'])


model.fit_generator(training_generator,
    steps_per_epoch=len(training_generator.filenames) // BATCH_SIZE,
    epochs=EPOCHS,
    validation_data=validation_generator,
    validation_steps=len(validation_generator.filenames) // BATCH_SIZE, 
    verbose=2)

1 Ответ

1 голос
/ 15 октября 2019

Поскольку у вас есть выходной слой из одной единицы и двоичная кросс-энтропийная потеря, вы должны использовать активацию sigmoid для вашего последнего слоя;измените его на:

model.add(Dense(1, activation='sigmoid'))

Было бы также желательно оставить Адама с его стандартной скоростью обучения, по крайней мере, для начинающих, то есть:

optimizer=keras.optimizers.Adam()

в вашем model.compile.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...