Модель Keras не тренировочные слои, точность проверки всегда 0,5 - PullRequest
2 голосов
/ 17 февраля 2020

Модель My Keras CNN (основанная на реализации Ale xNet) всегда имеет точность обучения, близкую к 0,5 (в пределах + - 0,02), а точность проверки всегда точно равна 0,5, независимо от того, какая эпоха , Это бинарная классификационная модель, где разделение поезд / вал составляет примерно 85/15, и в обоих этих наборах изображения разделены 50/50 для каждого класса.

Кажется, не имеет значения, какую архитектуру модели я использую, или инициализирую ли я со случайными весами или с весами Imag eNet, точность проверки всегда равна 0,5. Фактически, когда я не делил изображения 50/50 на двоичные классификации, точность проверки отражала бы это (поэтому, когда у меня было значительно больше изображений, принадлежащих одному классу, точность проверки всегда была бы 0,85).

Из-за этого последнего пункта у меня есть подозрение, что проблема не в ie с моделью или оптимизацией веса, а скорее в том, что я создал экземпляр класса ImageDataGenerator - хотя на данном этапе это всего лишь догадка ,

Я включил свой код ниже, кто-нибудь может найти какие-либо ослепительно очевидные ошибки?

sz=224 # image width = height = 224
batch_size=64
train_data_dir = r"./crack_dataset/train"
validation_data_dir = r"./crack_dataset/validate"
nb_train_samples = 3416
nb_val_samples = 612

train_datagen = ImageDataGenerator(rescale=1./255)

validation_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(train_data_dir,
                                                    target_size = (sz, sz),
                                                    batch_size=batch_size,
                                                    class_mode='binary')

validation_generator = validation_datagen.flow_from_directory(validation_data_dir,
                                                              target_size = (sz, sz),
                                                              batch_size=batch_size,
                                                              class_mode='binary')

# Create Model 
model = Sequential()

model.add(Conv2D(filters=96, input_shape=input_shape, kernel_size=(11,11), strides=(4,4), padding='valid', activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='valid'))

model.add(Conv2D(filters=256, kernel_size=(11,11), strides=(1,1), padding='valid', activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='valid'))

model.add(Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), padding='valid', activation='relu'))

model.add(Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), padding='valid', activation='relu'))

model.add(Conv2D(filters=256, kernel_size=(3,3), strides=(1,1), padding='valid', activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='valid'))

model.add(Flatten())
model.add(Dense(4096, input_shape=(256,), activation='relu'))
model.add(Dropout(0.4))

model.add(Dense(4096, activation='relu'))
model.add(Dropout(0.4))

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

model.compile(optimizer=Adam(0.1), loss='binary_crossentropy', metrics=['accuracy'])

model.fit_generator(train_generator,
                    steps_per_epoch = nb_train_samples // batch_size, 
                    epochs=30,
                    validation_data=validation_generator,
                    validation_steps=nb_val_samples // batch_size)

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

Проблема в том, что скорость обучения оптимизатора слишком велика. Как предлагается в комментарии, его следует установить на низкое значение, близкое к 0.

Вы можете увидеть, как скорость обучения может повлиять на точность классификации на изображении ниже:

example of how the learning rate influences the performance of a model

0 голосов
/ 17 февраля 2020

Это был комментарий, но слишком длинный, поэтому я переключился на правильный ответ.

Я не пробовал ваш CNN, но я бы пересмотрел ваши слои. Я не эксперт в разработке архитектур CNN, но я не вижу большого смысла в том, чтобы иметь 2 слоя подряд с одинаковыми параметрами (5-й и 6-й слои), это довольно бесполезно для того, что я изучил до сих пор. Попробуйте с некоторой простой архитектурой и «масштабируемость» (с точки зрения сложности архитектуры) оттуда.

Более того, поднимаясь и опускаясь с точки зрения «количества единиц» (1-й, 3-й, 5-й, 6-й 7-й слой, Conv2D), возможно, не самая лучшая стратегия, каждый раз, когда вы go повышаете свои возможности в плане возможностей, потому что вы начинаете с меньшего количества функций, вы просите свою сеть создавать функции из меньшего набора. Есть сценарий ios, где он может быть полезен, но я не думаю, что это один из них.

И для масштабирования вам не нужно вызывать ImageDataGenerator, вы можете связаться с тот же результат с:

train_datagen = train_datagen/255.0

Упростите, где можете.

...