Низкая точность глубокой CNN - PullRequest
0 голосов
/ 28 января 2020

Я сгенерировал набор данных с использованием EMNIST и математических символов, который имеет один символ на изображение или два символа на изображение. В наборе данных 72 возможных символа. Размер изображения 28x56 (hxw).

Пример: - один символ двойной символ

Существует 5256 (72 * 73) возможных классов с учетом всех комбинаций символов. Это из 72 возможных символов в первой части и 73 возможных символов (включая пробел) во второй части этикетки. Я удостоверился, что у каждого класса есть приблизительно 540-600 изображений. Всего набор данных содержит около 3 миллионов изображений.

Модели CNN, которые я пробовал:

  input_shape = (28, 56, 1)
  model = Sequential()
  model.add(Conv2D(filters=32, kernel_size=(3, 3), padding='same', use_bias=False,
  input_shape=input_shape))
  model.add(Activation('relu'))
  model.add(Conv2D(filters=32, kernel_size=(3, 3), padding='same', use_bias=False))
  model.add(BatchNormalization())
  model.add(Activation('relu'))
  model.add(MaxPooling2D(pool_size=(2, 2)))
  model.add(Dropout(.2))

  model.add(Conv2D(filters=64, kernel_size=(3, 3), padding='same', use_bias=False))
  model.add(Activation('relu'))
  model.add(Conv2D(filters=64, kernel_size=(3, 3), padding='same', use_bias=False))
  model.add(BatchNormalization())
  model.add(Activation('relu'))
  model.add(MaxPooling2D(pool_size=(2, 2)))
  model.add(Dropout(.2))

  model.add(Conv2D(filters=128, kernel_size=(3, 3), padding='same', use_bias=False))
  model.add(Activation('relu'))
  model.add(Conv2D(filters=128, kernel_size=(3, 3), padding='same', use_bias=False))
  model.add(BatchNormalization())
  model.add(Activation('relu'))
  model.add(MaxPooling2D(pool_size=(2, 2)))
  model.add(Dropout(.3))

  model.add(Flatten())
  model.add(Dense(4096, activation='relu'))
  model.add(BatchNormalization())
  model.add(Dense(4096, activation='relu'))

  model.add(Dense(units=5256, activation='softmax'))
  sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)

  model.compile(loss='sparse_categorical_crossentropy', optimizer=sgd, metrics=['sparse_categorical_accuracy'])

Я даже пробовал модель с двумя плотными слоями из 10512 единиц. Я смог достичь точности только около 66%. Я пробовал разные размеры пакетов из 32, 64, 256 и ADAM-оптимизатора с различной скоростью обучения. Было бы замечательно, если бы кто-то мог указать на то, что я делаю здесь неправильно, или дать несколько советов по повышению точности.

1 Ответ

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

Следуя рекомендации Руслана С., я обучил модель на Resnet50 (переучил всю сеть, а не только последние уровни). Мне удалось добиться значительного улучшения точности. Я смог достичь точности около 96%.

...