Модель CNN с низкой точностью - PullRequest
0 голосов
/ 06 сентября 2018

В настоящее время я работаю над моделью CNN, которая классифицирует изображения продуктов питания. До сих пор мне удалось построить функционирующую Си-Эн-Эн, но я хотел бы улучшить точность. Для набора данных я использовал несколько изображений из Kaggle и несколько из моей собственной коллекции.

Вот некоторая информация о наборе данных:

  1. Есть 91 класс изображений еды.
  2. В каждом классе содержится от 500 до 650 изображений.
  3. Набор данных был очищен вручную и проверен на наличие не связанных или плохого качества изображений ( фотографии имеют разные размеры ).

Вот моя модель CNN:

classifier = Sequential()

def cnn_layer_creation(classifier):

classifier.add(InputLayer(input_shape=[224,224,3]))

classifier.add(Conv2D(filters=32,kernel_size=5,strides=1,padding='same',activation='relu',data_format='channels_first'))
classifier.add(MaxPooling2D(pool_size=5,padding='same'))

classifier.add(Conv2D(filters=50,kernel_size=5,strides=1,padding='same',activation='relu'))
classifier.add(MaxPooling2D(pool_size=5,padding='same'))

classifier.add(Conv2D(filters=80,kernel_size=5,strides=1,padding='same',activation='relu',data_format='channels_last'))
classifier.add(MaxPooling2D(pool_size=5,padding='same'))

classifier.add(Dropout(0.25))
classifier.add(Flatten())
classifier.add(Dense(64,activation='relu'))
classifier.add(Dropout(rate=0.5))
classifier.add(Dense(91,activation='softmax'))

# Compiling the CNN
classifier.compile(optimizer="RMSprop", loss = 'categorical_crossentropy', metrics = ['accuracy'])
data_initialization(classifier)

def data_initialization(classifier):

# Part 2 - Fitting the CNN to the images

from keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(rescale = 1./255,
                                   shear_range = 0.2,
                                   zoom_range = 0.2,
                                   horizontal_flip = True)

test_datagen = ImageDataGenerator(rescale = 1./255,
                                  shear_range = 0.2,
                                  zoom_range = 0.2,
                                  horizontal_flip = True)

training_set = train_datagen.flow_from_directory('food_image/train',
                                                 target_size = (224, 224),
                                                 batch_size = 100,
                                                 class_mode = 'categorical')

test_set = test_datagen.flow_from_directory('food_image/test',
                                            target_size = (224, 224),
                                            batch_size = 100,
                                            class_mode = 'categorical')

classifier.fit_generator(training_set,
                         steps_per_epoch = 100,
                         epochs = 100,
                         validation_data = test_set,
                         validation_steps = 100)

classifier.save("brynModelGPULite.h5")
classifier.summary()

def main():

cnn_layer_creation(classifier)

Обучение проводится на GPU (nVidia 980M)

К сожалению, точность не превысила 10%. Вот что я попробовал:

  1. Увеличение количества эпох.

  2. Смена оптимизатора (ADAM, RMSPROP).

  3. Изменить функцию активации.

  4. Уменьшить размер входного изображения.

  5. Увеличение размера партии.

  6. Измените размер фильтра на 32, 64, 128.

Ни один из них не улучшил точность.

Может ли кто-нибудь пролить свет на то, как можно улучшить точность модели?

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

Вы можете увеличить только тренировочные данные.

Следующий код

test_datagen = ImageDataGenerator(rescale = 1./255,
                                      shear_range = 0.2,
                                      zoom_range = 0.2,
                                      horizontal_flip = True)

должно быть

test_datagen = ImageDataGenerator(rescale = 1./255)
0 голосов
/ 05 августа 2019

У меня была такая же проблема с другим набором данных, и я заменил сплющенный слой на globalAveragepooling, и это решило проблему.

Я не уверен, что это сработает для вас, но поскольку моя модель имеет структуру, аналогичную вашей, я думаю, что это может вам помочь. Но разница в том, что я тренировал свою модель для 3 классов.

0 голосов
/ 07 сентября 2018

Во-первых, я предполагаю, что вы строите свою модель с нуля. Так как такое обучение в меньшее количество эпох (я полагаю, вы не обучили бы свою модель более 1000 эпох), не поможет, так как сеть не будет развиваться полностью, потому что представления не были бы полностью изучены в столь немногие эпохи, когда вы обучаете модель с нуля. Вы можете попробовать увеличить количество эпох до 10000 и посмотреть. Скорее, почему бы не попробовать использовать одно и то же обучение обучению, кроме того, вы также можете использовать извлечение функций и точную настройку, или и то, и другое с использованием предварительно обученной коннет. Для справки вы можете взглянуть на главу 5 в книге Франсуа Шоле под названием «Глубокое обучение на Python».

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