完全连接的图层中隐藏节点的数量是否必须等于输出类别的数量?

时间:2017-09-11 11:28:46

标签: r nodes mxnet

我使用MXNet软件包https://www.r-bloggers.com/image-recognition-tutorial-in-r-using-deep-convolutional-neural-networks-mxnet-package尝试了R中的图像识别教程。本教程的目的是识别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个,但准确性非常好。我不明白这个事件。 我尝试添加第三个完全连接的图层以获得正确数量的catgories:

# 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. 完全连接层中隐藏节点的数量是否必须等于输出类别的数量?
  3. 感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我的模型现在有效:

# 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 - &gt; 0; Person2:2 - &gt; 1; Person2:3 - &gt; 2; Person2:4 - &gt; 3; Person5:5 - &gt; 4;

我不知道它为什么会起作用,但确实如此。 感谢Hagay Lupesko的帮助。

答案 1 :(得分:0)

模型中的参数明显多于样本。这通常非常糟糕,并且可能导致过度拟合。

您可以采取的另一种方法是采用预先训练的模型,并仅使用您的数据重新训练最后一层(AKA传输学习)。这是一个MXNet教程:https://mxnet.incubator.apache.org/how_to/finetune.html