2017-09-11 2 views
0

J'ai essayé le tutoriel pour la reconnaissance d'image dans R en utilisant le paquet MXNet https://www.r-bloggers.com/image-recognition-tutorial-in-r-using-deep-convolutional-neural-networks-mxnet-package. Le but du tutoriel est de reconnaître les visages de 40 personnes. La base de données se compose de 400 images (10 images par personne). Le CNN ressemble à ceci:Le nombre de nœuds cachés dans la couche entièrement connectée doit-il être égal au nombre de catégories de sortie?

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) 

J'ai utilisé le même réseau de neurones pour mon propre jeu de données, qui se compose de 1600 images de 5 personnes. Donc, je me suis ajusté le nombre de noeuds dans la couche entièrement connecté à 5.

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

Les résultats du modèle sont très mauvais, donc je mis ceteris paribus le nombre de noeuds dans la couche entièrement connecté à 80 et a obtenu une grande résultats (précision: 100%). Le modèle génère des probabilités pour 80 catégories bien que j'en ai seulement 5, mais la précision est excellente. Je ne comprends pas cet événement. Je essayé d'ajouter une troisième couche entièrement connecté pour obtenir le bon nombre de 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) 

Mais les résultats sont très mauvais. Je pensais que le nombre de nœuds dans la couche entièrement connectée représentait le nombre de catégories de sortie que le modèle devrait essayer de distinguer.

  1. Quelqu'un peut-il expliquer cet événement?
  2. Le nombre de nœuds cachés dans la couche entièrement connectée doit-il être égal au nombre de catégories de sortie?

Merci pour votre aide.

Répondre

0

Vous avez beaucoup plus de paramètres dans votre modèle que d'échantillons. Ceci est généralement très mauvais, et peut causer un ajustement excessif.

Une autre approche que vous pouvez prendre est de prendre un modèle pré-formé, et de ré-former la dernière couche seulement avec vos données (AKA transfert d'apprentissage). Voici un tutoriel pour MXNet que: https://mxnet.incubator.apache.org/how_to/finetune.html

+0

Merci pour votre réponse. J'aurais dû mentionner, je divise les données en un ensemble d'entraînement (n = 1440) que j'ai utilisé pour former le modèle et un ensemble de test (n = 160) que j'ai utilisé pour valider mon modèle, donc je pense que le surdimensionnement n'est pas le problème . Résultats: 1. num_hidden = 80) Précision (entraînement): 0,996; Précision (test): 0,99 2.num_hidden = 5), Précision (entraînement): 0,21; Précision (test): 0,05. Dans le premier cas, la fonction softmax fournit des probabilités pour 80 classes et les résultats sont meilleurs que le modèle avec 5 classes même s'il n'y a que 5 personnes que j'essaie de séparer. – SvDigi

1

Mon modèle ne fonctionne maintenant:

# 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) 

j'ai changé l'étiquette des personnes à partir de:

Person1: 1 -> 0; Personne 2: 2 -> 1; Personne 2: 3 -> 2; Personne 2: 4 -> 3; Personne5: 5 -> 4;

Je ne sais pas pourquoi cela fonctionne, mais c'est le cas. Merci pour votre aide Hagay Lupesko.