2016-10-28 1 views
1

다중 출력 다중 클래스 분류를 수행하기 위해 TensorFlow를 사용하여 길쌈 신경 네트워크를 학습하고 싶습니다.TensorFlow로 다중 클래스 다중 출력 CNN을 배우는 방법

예 : 우리가 MNIST 샘플 세트를 가져 와서 두 개의 랜덤 이미지를 하나씩 두 개 결합한 다음 결과 이미지를 분류하고 싶다면. 분류 결과는 이미지에 표시된 두 자릿수 여야합니다.

따라서 네트워크의 출력은 [-1, 2, 10] 모양을 가질 수 있습니다. 첫 번째 차원은 일괄 처리이고 두 번째는 출력을 나타내며 (세 번째 숫자는 첫 번째 또는 두 번째 숫자) 세 번째 숫자는 출력입니다. 표시된 숫자의 "보통"분류.

지금 당장 인터넷 검색을 시도했지만 유용한 것을 찾을 수 없었습니다. 또한 다중 출력 다중 클래스 분류가이 작업의 올바른 이름인지 여부는 알 수 없습니다. 그렇지 않은 경우 올바른 이름은 무엇입니까? 손실 기능/교육 작업을 구축하기 위해해야 ​​할 일을 설명하는 링크/자습서/문서/서류가 있습니까?

내가 시도한 것은 tf.split을 사용하여 네트워크의 출력을 단일 출력으로 분할 한 다음 모든 단일 출력에 softmax_cross_entropy_with_logits를 사용하는 것이 었습니다. 결과는 모든 출력에 대해 평균을 냈지만 작동하지 않는 것 같습니다. 이것도 합리적인 방법입니까?

답변

2

는 분류 문제의 용어를 들어,이 링크를 한 번 봐 가질 수 있습니다 그래서 문제는 "다중 레벨 분류"라고 http://scikit-learn.org/stable/modules/multiclass.html

. 일반적인 TensorFlow 멀티 클래스 분류 (클래식 MNIST)에서는 10 개의 출력 단위를 갖게되며 컴퓨팅 손실 (예 : "tf.nn.softmax_cross_entropy_with_logits") 끝에 softmax을 사용하게됩니다.

는 예 : 이미지가 "2"가있는 경우, 다음 groundtruth [0010000000]

그러나 여기에있을 것입니다, 네트워크 출력 것이다 20 개 단위가 당신은 시그 모이 즉 "tf.nn.sigmoid_cross_entropy_with_logits"

예를 사용합니다 : 이미지가있는 경우 "2"&는 "4", 다음 groundtruth 것 [0,0,1,0,0 , 000000000100000], 즉 첫 번째 숫자 클래스를 나타내는 처음 10 비트와 두 번째 숫자 클래스를 나타내는 두 번째 숫자가 있습니다.

0

먼저 두 개의 서로 다른 이미지로 구성된 이미지에 두 개의 라벨을 제공해야합니다. 그런 다음 목표 손실 함수를 변경하여 주어진 두 레이블의 출력을 최대화하고 모델을 교육하십시오. 출력을 나눌 필요가 없다고 생각합니다.

+0

음, 내 질문은 그 손실 기능이 어떻게 생겼는지에 관한 것입니다. 이 손실 함수를 계산하기 위해 호출 할 수있는 tensorflow 메서드가 있습니까? 그렇지 않다면 어떻게 계산합니까? – andy

+0

죄송 합니다만, 저는 tensorflow에 익숙하지 않습니다.하지만 튜토리얼을 끝내면서 y_는 크로스 엔트로피에서 한 예를 들어 몇 가지 값만 가져야한다고 가정합니다. cross_entropy = tf.reduce_mean (tf.nn. softmax_cross_entropy_with_logits (y, y_)) 시도해 봤어? 작동하지 않는다면 레이블이 매트릭스가 아닌 벡터가되도록 직접 비용 함수를 코딩하십시오. 예를 들어, T.log (self.p_y_given_x) [T.arange (y.shape [0]), y])와 y (labels)의 행렬을 만들 것입니다. 예제 별 레이블. – Snate