Я попытался обучить модель для проблемы двоичной классификации, используя набор данных, сделанный из медицинских снимков (точнее, из набора данных 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)