Почему точность проверки постоянна на уровне 20%? - PullRequest
1 голос
/ 06 мая 2019

Я пытаюсь реализовать классификатор животных 5 класса, используя Keras. Я строю CNN с нуля, и странно то, что точность проверки остается постоянной на уровне 0,20 для всех эпох. Есть идеи, почему это происходит? Папка набора данных содержит папки train, test и validation. И каждая из папок содержит 5 папок, соответствующих 5 классам. Что я делаю не так?

Я пробовал несколько оптимизаторов, но проблема сохраняется. Я включил пример кода ниже.

import warnings
warnings.filterwarnings("ignore")

#First convolution layer
model = Sequential()
model.add(Conv2D(filters=32, kernel_size=(3, 3), activation='relu',kernel_initializer='he_normal',input_shape=input_shape))
model.add(MaxPooling2D(pool_size=(2, 2)))

#Second convolution layer
model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu',kernel_initializer='he_normal',input_shape=input_shape))
model.add(MaxPooling2D(pool_size=(2, 2)))

#Flatten the outputs of the convolution layer into a 1D contigious array
model.add(Flatten())

#Add a fully connected layer containing 256 neurons
model.add(Dense(256, activation='relu',kernel_initializer='he_normal'))
model.add(BatchNormalization())

#Add another fully connected layer containing 256 neurons
model.add(Dense(256, activation='relu',kernel_initializer='he_normal'))
model.add(BatchNormalization())

#Add the ouput layer containing 5 neurons, because we have 5 categories
model.add(Dense(5, activation='softmax',kernel_initializer='glorot_uniform'))

optim=RMSprop(lr=1e-6)
model.compile(loss='categorical_crossentropy',optimizer=optim,metrics=['accuracy'])
model.summary()

#We will use the below code snippet for rescaling the images to 0-1 for all the train and test images
train_datagen = ImageDataGenerator(rescale=1./255)

#We won't augment the test data. We will just use ImageDataGenerator to rescale the images.
test_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(train_data_dir,
                                                    classes=['frog', 'giraffe', 'horse', 'tiger','dog'],
                                                    target_size=(img_width, img_height),
                                                    batch_size=batch_size,
                                                    class_mode='categorical',
                                                    shuffle=False)

validation_generator = test_datagen.flow_from_directory(validation_data_dir,
                                                        classes=['frog', 'giraffe', 'horse', 'tiger','dog'],
                                                        target_size=(img_width, img_height),
                                                        batch_size=batch_size,
                                                        class_mode='categorical',
                                                        shuffle=False)
hist=History()

model.fit_generator(train_generator,
                    steps_per_epoch=nb_train_samples // batch_size,
                    epochs=epochs,
                    validation_data=validation_generator,
                    validation_steps=nb_validation_samples // batch_size,
                    callbacks=[hist])

model.save('models/basic_cnn_from_scratch_model.h5') #Save the model weights #Load using: model = load_model('cnn_from_scratch_weights.h5') from keras.models import load_model
print("Time taken to train the baseline model from scratch: ",datetime.now()-global_start)

Ответы [ 3 ]

1 голос
/ 06 мая 2019

Проверьте следующие данные:

  1. Хорошо перетасуйте тренировочные данные (я вижу shuffle=False везде)
  2. Правильно нормализуйте все данные (я вижу, вы делаете rescale=1./255, может быть, в порядке)
  3. Правильное разделение поезда / Вала (кажется, вы тоже это делаете)

Рекомендации для вашей модели:

  1. Используйте несколькоConv2D слоев с последующим окончательным Dense.Это то, что лучше всего подходит для задач классификации изображений.Вы также можете посмотреть на популярные архитектуры, которые проверены и протестированы;например, AlexNet
  2. Можно изменить оптимизатор на Adam и попробовать с разными скоростями обучения
  3. Посмотрите на свои графики потерь обучения и проверки и посмотрите, выглядят ли они как ожидалось

Также, я думаю, вы исправили форму 2-го Conv2D слоя, как упомянуто в комментариях.

1 голос
/ 06 мая 2019

Выглядит так, как будто ваш вывод всегда один и тот же, поэтому у вас есть 20% точность.Я настоятельно рекомендую вам проверить результаты тестирования, чтобы увидеть, все ли они одинаковы.

Также вы сказали, что создавали CNN, но во фрагменте кода, который вы разместили, я вижу только плотные слои, плотной архитектуре будет сложно выполнить эту задачу, и она очень мала.Каков размер ваших фотографий?

Надеюсь, это поможет!

0 голосов
/ 07 мая 2019

Модели, кажется, работают сейчас. Я удалил атрибут shuffle = False. Исправлена ​​форма ввода для второго слоя свертки. Поменял оптимизатор на адама. Я достиг точности проверки почти 94%. Тем не менее, я еще не тестировал модель на невидимых данных. В модели немного переоснащения. Мне придется использовать некоторые агрессивные отсева, чтобы уменьшить их. Спасибо!

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