Не удалось увеличить точность с фиксированного порогового значения при использовании слоя Keras Dense ANN - PullRequest
0 голосов
/ 03 июля 2019

Я изучаю простейшие нейронные сети, используя плотные слои, используя Keras.Я пытаюсь реализовать распознавание лиц на относительно небольшом наборе данных (всего ~ 250 изображений с 50 изображениями в классе).

Я скачал изображения из картинок Google и изменил их размеры до 100 * 100 png файлов.Затем я прочитал эти файлы в массив numpy, а также создал один массив меток для обучения моей модели.

Вот мой код для обработки обучающих данных:

X, Y = [], []
feature_map = {
    'Alia Bhatt': 0,
    'Dipika Padukon': 1,
    'Shahrukh khan': 2,
    'amitabh bachchan': 3,
    'ayushmann khurrana': 4
}
for each_dir in os.listdir('.'):
  if os.path.isdir(each_dir):
    for each_file in os.listdir(each_dir):
      X.append(cv2.imread(os.path.join(each_dir, each_file), -1).reshape(1, -1))
      Y.append(feature_map[os.path.basename(each_file).split('-')[0]])

X = np.squeeze(X)
X = X / 255.0 # normalize the training data
Y = np.array(Y)
Y = np.eye(5)[Y]
print (X.shape)
print (Y.shape)

Это печать (244, 40000) и (244, 5).Вот моя модель:

model = Sequential()

model.add(Dense(8000, input_dim = 40000, activation = 'relu'))
model.add(Dense(1200, activation = 'relu'))
model.add(Dense(700, activation = 'relu'))
model.add(Dense(100, activation = 'relu'))
model.add(Dense(5, activation = 'softmax'))

# Compile model
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
# Fit the model
model.fit(X, Y, epochs=25, batch_size=15)

Когда я тренирую модель, она застряла с точностью 0.2172, что почти совпадает со случайными предсказаниями (0,20).

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

Что мне здесь не хватает?Мой набор данных слишком мал?или я упускаю какие-либо другие технические детали?

Для получения более подробной информации о коде, вот моя записная книжка: https://colab.research.google.com/drive/1hSVirKYO5NFH3VWtXfr1h6y0sxHjI5Ey

Ответы [ 2 ]

0 голосов
/ 04 июля 2019

Я согласен, что набор данных слишком мал, 50 экземпляров каждого человека, вероятно, недостаточно. Вы можете использовать увеличение данных с помощью метода keras ImageDataGenerator , чтобы увеличить количество изображений и переписать код с измененной формой в качестве функции предварительной обработки для генератора. Я также заметил, что вы не перетасовали данные, поэтому сеть, скорее всего, предсказывает первый класс для всего (возможно, поэтому точность почти случайна).

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

0 голосов
/ 03 июля 2019

Я могу сделать два предложения:

  1. Ваш набор данных, вероятно, слишком мал.Если вы разделяете обучение и проверку на 80/20, это означает, что вы тренируетесь только на 200 изображениях, что, вероятно, слишком мало.Попробуйте увеличить свой набор данных, чтобы увидеть, улучшатся ли результаты.

  2. Я бы порекомендовал добавить Dropout на каждый слой вашей сети, поскольку ваш тренировочный набор очень мал.Скорее всего, ваша сеть переопределяет ваш тренировочный набор данных, так как он очень мал, и Dropout - простой способ избежать этой проблемы.

Дайте мне знать, если эти предложения помогутразница!

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