我尝试使用MXNET软件包https://www.r-bloggers.com/image-recognition-tutorial-in-r- using-deep--卷积神经网络 - 马克斯 - 包装。教程的目的是认识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)
但是结果非常糟糕。我认为完全连接层中的节点数表示模型应尝试区分的输出类别的数量。
- 有人可以解释这一事件吗?
- 完全连接层中隐藏节点的数量必须等于输出类别的数量?
感谢您的帮助。
我的模型现在可以工作:
# 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;
我不知道为什么它有效,但是确实如此。感谢您的帮助Hagay Lupesko。
您在模型中的参数比样本要多得多。这通常非常糟糕,可能会导致安装。
您可以采用的另一种方法是采用预训练的模型,仅使用数据(又称传输学习)重新培训最后一层。这是一个MXNET教程:https://mxnet.incubator.apache.org/how_to/finetune.html