2017-09-11 11 views
0

MXnet 패키지 https://www.r-bloggers.com/image-recognition-tutorial-in-r-using-deep-convolutional-neural-networks-mxnet-package을 사용하여 R에서 이미지 인식을위한 튜토리얼을 시도했습니다. 튜토리얼의 목적은 40 명의 얼굴을 인식하는 것입니다. 데이터 프레임은 400 장의 사진 (1 인당 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) 

내가 5 명 1600 사진으로 구성되어 내 자신의 데이터 집합에 대해 동일한 신경 네트워크를 사용했다. 그래서 5

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

모델의 결과에 완전히 연결 계층의 노드의 수를 조정은 아주 나쁜, 그래서 80에 다른 조건의 paribus에게 완전히 연결 계층의 노드 수를 설정하고 좋은있어 결과 (정확도 : 100 %).

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

이 모델은 5 개 밖에 없지만 80 개 카테고리에 대한 확률을 생성하지만 정확도는 우수합니다. 나는이 사건을 이해하지 못한다. 나는 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. 완전히 연결된 레이어의 숨겨진 노드 수가 출력 범주 수와 같아야합니까?

도움 주셔서 감사합니다.

답변

0

모델에 모델보다 훨씬 많은 매개 변수가 있습니다. 이것은 일반적으로 매우 나쁘고 과도한 피팅을 유발할 수 있습니다.

취할 수있는 또 다른 방법은 미리 훈련 된 모델을 가져와 데이터 (AKA 전송 학습)로 마지막 계층 만 다시 훈련하는 것입니다. https://mxnet.incubator.apache.org/how_to/finetune.html

+0

답변 해 주셔서 감사합니다. 내가 언급 했어야 할 것은 모델을 훈련하는 데 사용한 교육 세트 (n = 1440)와 모델을 검증하는 데 사용한 테스트 세트 (n = 160)로 데이터를 분할 했으므로 초과 구현이 문제가 아닐 것이라고 생각합니다. . 결과 : 1. num_hidden = 80) 정확도 (훈련) : 0.996; 정확도 (시험) : 0.99 2.num_hidden = 5), 정확도 (훈련) : 0.21; 정확도 (테스트) : 0.05. 첫 번째 경우 softmax- 함수는 80 개의 클래스에 대한 확률을 제공하며 분리하려고하는 사람이 5 명인 경우에도 5 개의 클래스가있는 모델보다 결과가 더 좋습니다. – SvDigi

1

내 모델은 지금 작동합니까 :

PERSON1 :

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

난에서 사람들의 레이블을 변경 여기에 대한 MXNet 튜토리얼의 1 -> 0; Person2 : 2 -> 1; Person2 : 3 -> 2; Person2 : 4 -> 3; Person5 : 5 -> 4;

왜 작동하는지 알지 못합니다. 도움 주셔서 감사합니다. Hagay Lupesko.