Классификация человеческого пола - Точность поезда и Вала не меняется - PullRequest
0 голосов
/ 18 октября 2018

У меня 0,3 миллиона изображений в моем наборе Поезд - мужчина / женщина и около 50К изображений в тестовом наборе - мужчина / женщина.Я использую ниже для работы, также попытался добавить еще несколько слоев и больше единиц.Кроме того, я занимаюсь дополнением данных и предоставлением других документов из keras docs.

targetSize =64
classifier.add(Conv2D(filters = 32,kernel_size =(3,3),input_shape=(targetSize,targetSize,3),activation ='relu'))
classifier.add(MaxPooling2D(pool_size = (2,2)))
classifier.add(Conv2D(filters = 32,kernel_size =(3,3),activation ='relu'))
classifier.add(MaxPooling2D(pool_size = (2,2)))
classifier.add(Conv2D(filters = 32,kernel_size =(3,3),activation ='relu'))
classifier.add(MaxPooling2D(pool_size = (2,2)))
classifier.add(Conv2D(filters = 32,kernel_size =(3,3),activation ='relu'))
classifier.add(MaxPooling2D(pool_size = (2,2)))
classifier.add(Flatten())
classifier.add(Dropout(rate = 0.6))
classifier.add(Dense(units = 64, activation='relu'))
classifier.add(Dropout(rate = 0.5))
classifier.add(Dense(units = 64, activation='relu'))
classifier.add(Dropout(rate = 0.2))
classifier.add(Dense(units = 1,activation='sigmoid')

classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
# 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,
                     height_shift_range = 0.2,
                     width_shift_range = 0.2,
                     horizontal_flip = True)
test_datagen = ImageDataGenerator(rescale = 1./255)

training_set = train_datagen.flow_from_directory('<train_folder_loc>',
                                                 target_size = (img_size, img_size),
                                                 batch_size = batch_size_train,
                                                 class_mode = 'binary')
test_set = test_datagen.flow_from_directory('<test_folder_loc>',
                                            target_size = (img_size, img_size),
                                            batch_size = batch_size_test,
                                            class_mode = 'binary')
classifier.fit_generator(training_set,
                         steps_per_epoch = <train_image_count>/batch_size_train,
                         epochs = n_epoch,
                         validation_data = test_set,
                         validation_steps = <test_image_count>/batch_size_test,
                         use_multiprocessing = True,
                         workers=<mycpu>)

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

11112/11111 [==============================] - 156s 14ms/step - loss: 0.5628 - acc: 0.7403 - val_loss: 0.6001 - val_acc: 0.6967
Epoch 2/25
11112/11111 [==============================] - 156s 14ms/step - loss: 0.5516 - acc: 0.7403 - val_loss: 0.6096 - val_acc: 0.6968
Epoch 3/25
11112/11111 [==============================] - 154s 14ms/step - loss: 0.5472 - acc: 0.7404 - val_loss: 0.5837 - val_acc: 0.6967
Epoch 4/25
11112/11111 [==============================] - 155s 14ms/step - loss: 0.5437 - acc: 0.7408 - val_loss: 0.5850 - val_acc: 0.6978
Epoch 5/25
11112/11111 [==============================] - 154s 14ms/step - loss: 0.5409 - acc: 0.7417 - val_loss: 0.5844 - val_acc: 0.6991
Epoch 6/25
11112/11111 [==============================] - 155s 14ms/step - loss: 0.5386 - acc: 0.7420 - val_loss: 0.5828 - val_acc: 0.7011
Epoch 7/25
11112/11111 [==============================] - 154s 14ms/step - loss: 0.5372 - acc: 0.7427 - val_loss: 0.5856 - val_acc: 0.6984
Epoch 8/25
11112/11111 [==============================] - 154s 14ms/step - loss: 0.5347 - acc: 0.7437 - val_loss: 0.5847 - val_acc: 0.7017
Epoch 9/25
11112/11111 [==============================] - 154s 14ms/step - loss: 0.5331 - acc: 0.7444 - val_loss: 0.5770 - val_acc: 0.7017
Epoch 10/25
11112/11111 [==============================] - 154s 14ms/step - loss: 0.5323 - acc: 0.7443 - val_loss: 0.5803 - val_acc: 0.7037
Epoch 11/25
11112/11111 [==============================] - 154s 14ms/step - loss: 0.5309 - acc: 0.7453 - val_loss: 0.5877 - val_acc: 0.7018
Epoch 12/25
11112/11111 [==============================] - 155s 14ms/step - loss: 0.5294 - acc: 0.7454 - val_loss: 0.5774 - val_acc: 0.7037
Epoch 13/25
11112/11111 [==============================] - 154s 14ms/step - loss: 0.5282 - acc: 0.7464 - val_loss: 0.5807 - val_acc: 0.7024
Epoch 14/25
11112/11111 [==============================] - 154s 14ms/step - loss: 0.5276 - acc: 0.7467 - val_loss: 0.5815 - val_acc: 0.7033
Epoch 15/25
11112/11111 [==============================] - 156s 14ms/step - loss: 0.5269 - acc: 0.7474 - val_loss: 0.5753 - val_acc: 0.7038
Epoch 16/25
11112/11111 [==============================] - 154s 14ms/step - loss: 0.5263 - acc: 0.7477 - val_loss: 0.5825 - val_acc: 0.7039
Epoch 17/25
11112/11111 [==============================] - 155s 14ms/step - loss: 0.5249 - acc: 0.7485 - val_loss: 0.5821 - val_acc: 0.7037

Мне нужно ваше предложение по этому или любому фрагменту, чтобы попробовать.

Ответы [ 3 ]

0 голосов
/ 18 октября 2018
  1. Прежде чем пытаться расширить сеть, убедитесь, что вы перегрузили небольшую выборку.

  2. Я хотел бы удалить некоторые / все слои Dropout и посмотреть, не улучшит ли это производительность.Я думаю, что 3 уровня отсева довольно высоки.

  3. Попробуйте уменьшить скорость обучения.

0 голосов
/ 19 октября 2018

Попытайтесь понять некоторые из основных принципов CNN и как они построены;реализовать простой, который работает, прежде чем произвольно вводить ваши собственные параметры.

Например, обычно количество фильтров в последовательных свертках увеличивается в степени двух (например, 32, 64, 128 и т. д.).Использование выпадания также сомнительно, 0,6 очень высоко, не говоря уже о суммировании трех выпавших, как у вас, не имеет никакого смысла.

0 голосов
/ 18 октября 2018

Хм, если вы внимательно посмотрите, это не значит, что он не двигается.это немного движется.Бывают случаи, когда модели становятся лучше только в определенный момент, независимо от того, как долго вы их тренируете или даже сколько слоев вы добавляете.Когда это происходит, все сводится к данным.Я думаю, что было бы лучше определить, что мешает вашей модели улучшиться.Кроме того, мой друг, обучение хорошей модели не происходит в одночасье, особенно с данными реального мира, и гораздо больше со сложными данными, такими как изображения людей.

Полагаю, если вы просто следуете учебнику, который набрал больше очков, чем ваш, вы можете проверить версию пакетов, которые они используют, данные, которые у вас есть, шаги, которые они предприняли, и, что гораздо важнее,запустить модель.Есть случаи, когда модели могли получать разные оценки в разных случаях обучения.

Я предлагаю вам попробовать больше поиграть со слоями или даже использовать другой тип нейронной сети.Если нет, попробуйте больше поиграть со своими данными.300К изображений много, но когда дело доходит до классификации изображений, это может быть очень сложно.

Наконец, я думаю, вы могли бы изучить перенос обучения с помощью tenorflow.Вы можете прочитать об этом там.Он работает путем переподготовки готовых моделей распознавания изображений.У Кераса есть учебник по обучению переводу.

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