2016-07-06 1 views
1

나는 회귀 범주의 분류에 실제로 속하지 않는 tensorflow에서 신경망을 만들려고합니다. 아마도 보강 학습에 더 가깝습니다.특정 사용자 정의 비용 함수가있는 Tensorflow NN

필자는 ReLU 숨겨진 레이어가 3 개인 softmax 출력 레이어로 끝나는 네트워크를 만들었습니다. 각 표본의 표적 벡터는 특정 선택을하기위한 보상 (페널티는 음수, 중립은 0 일 수 있음) (3이 있음)입니다. 아이디어는 모든 샘플에 대해 누적 된 보상을 최대화하는 것입니다.

목표 Y = [d, e, f]로 모델 출력 M = [a, b, c]에 매핑되는 하나의 샘플 입력이 주어지면; 특정 샘플에 대한 손실은 M * Y '이거나 간단히 -tf.matmul (model, Y, transpose_b = True)입니다. 그러나 벡터 대신 행렬을 사용하는 일괄 처리 작업을 수행 할 때 TensorFlow의 최적화 프로그램에서 사용할 수있는 비용 함수로 이것을 표현하는 방법을 잃어 버렸습니다. 위의 예제 코드를 사용하면 의미없는 batchsize^2 크기의 행렬을 얻을 수 있습니다.

어떻게하면됩니까?

답변

2

N 예의 미니 배치에 대한 모델의 출력을 가정 해 보겠습니다. output이라고합니다. 그 모양은 [N, 1, 3]입니다. (참고 : 일반적으로 softmax의 출력은 [N, 3]이지만, tf.reshape을 사용하면 [N, 1, 3]으로 바꿀 수 있습니다). 보상이나 대상을 target라고 부르면 모양도 [N, 1, 3]이됩니다. 당신이 당신의 minibatch 평균 손실을하려면

loss = tf.batch_matmul(output, tf.transpose(target, [0, 2, 1])) 

, 당신은 다음을 수행 할 수 있습니다 : 당신은 모양 [N, 1, 1]으로 loss를 얻기 위해 다음과 같은 작업을 수행 할 수

loss = tf.reduce_mean(loss) 

경우에 당신이 얻을를 스칼라 값.

관련 문제