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

Я попробовал учебник для распознавания изображений в R, используя пакет MXNet https://www.r-bloggers.com/image-recognition-tutorial-in-r-using-deep-convolutional-neural-networks-mxnet-package. Целью учебника является распознавание лиц из 40 человек. Кадр данных состоит из 400 изображений (10 изображений на человека). CNN выглядит так:

data <- mx.symbol.Variable('data')
# 1st convolutional layer
conv_1 <- mx.symbol.Convolution(data = data, kernel = c(5, 5), num_filter = 20)
tanh_1 <- mx.symbol.Activation(data = conv_1, act_type = "tanh")
pool_1 <- mx.symbol.Pooling(data = tanh_1, pool_type = "max", kernel =    c(2, 2), stride = c(2, 2))

# 2nd convolutional layer
conv_2 <- mx.symbol.Convolution(data = pool_1, kernel = c(5, 5), num_filter = 50)
tanh_2 <- mx.symbol.Activation(data = conv_2, act_type = "tanh")
pool_2 <- mx.symbol.Pooling(data=tanh_2, pool_type = "max", kernel = c(2, 2), stride = c(2, 2))

# 1st fully connected layer
flatten <- mx.symbol.Flatten(data = pool_2)
fc_1 <- mx.symbol.FullyConnected(data = flatten, num_hidden = 500)
tanh_3 <- mx.symbol.Activation(data = fc_1, act_type = "tanh")

# 2nd fully connected layer
fc_2 <- mx.symbol.FullyConnected(data = tanh_3, num_hidden = 40)
# Output. Softmax output since we'd like to get some probabilities.
NN_model <- mx.symbol.SoftmaxOutput(data = fc_2)

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

fc_2 <- mx.symbol.FullyConnected(data = tanh_3, num_hidden = 5)

Результаты модели очень плохие, поэтому я установил при прочих равных условиях число узлов в полностью подключенном слое на 80 и получил отличные результаты (точность: 100%).

fc_2 <- mx.symbol.FullyConnected(data = tanh_3, num_hidden = 80)

Модель генерирует вероятности для 80 категорий, хотя я получил только 5, но точность отличная. Я не понимаю это событие. Я попытался добавить третий полностью связанный слой, чтобы получить правильное количество категорий:

# 2nd fully connected layer
fc_2 <- mx.symbol.FullyConnected(data = tanh_3, num_hidden = 80)
tanh_4 <- mx.symbol.Activation(data = fc_2, act_type = "tanh")
# 3rd fully connected layer
fc_3 <- mx.symbol.FullyConnected(data = tanh_4, num_hidden = 5)
# Output. Softmax output since we'd like to get some probabilities.
NN_model <- mx.symbol.SoftmaxOutput(data = fc_3)

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

  1. Кто-нибудь может объяснить это событие?
  2. Должно ли количество скрытых узлов в полностью связанном слое быть равно количеству выходных категорий?

Спасибо за вашу помощь.

2 ответа

Моя модель работает сейчас:

# 1st fully connected layer
flatten <- mx.symbol.Flatten(data = pool_2)
fc_1 <- mx.symbol.FullyConnected(data = flatten, num_hidden = 500)
tanh_3 <- mx.symbol.Activation(data = fc_1, act_type = "tanh")

# 2nd fully connected layer
fc_2 <- mx.symbol.FullyConnected(data = tanh_3, num_hidden = 5)
# Output. Softmax output since we'd like to get some probabilities.
NN_model <- mx.symbol.SoftmaxOutput(data = fc_2)

Я изменил ярлык людей из:

Person1: 1 -> 0; Person2: 2 -> 1; Person2: 3 -> 2; Person2: 4 -> 3; Person5: 5 -> 4;

Я не знаю, почему это работает, но это так. Спасибо за помощь Хагай Лупеско.

У вас значительно больше параметров в вашей модели, чем у образцов. Это, как правило, очень плохо, и может привести к чрезмерной подгонке.

Другой подход, который вы можете использовать, - это использование предварительно обученной модели и повторное обучение последнего уровня только с вашими данными (AKA Transfer Learning). Вот руководство по MXNet для этого: https://mxnet.incubator.apache.org/how_to/finetune.html

Другие вопросы по тегам