내 CNN 딥 러닝 네트워크를 계산하는 동안 훈련 단계의 손실은 교차 엔트로피 함수로 계산됩니다.
tf.nn.weighted_cross_entropy_with_logits(targets = labels_flat, logits = logits_flat, pos_weight=98.22)
그러나 예측과 실측이 매우 잘 위치한다고 가정합니다. 여기에서는 그렇지 않습니다. 사실 내 실측 값은 2 ~ 3 픽셀에서 로컬로 이동할 수 있으므로 "픽셀 단위"비교에 대한 불확실성을 사용하여 교차 엔트로피를 계산하고 싶습니다.
이를 위해 다음과 같이 처리합니다. 원하는 불확실성을 정의했습니다. 여기서는 2 픽셀입니다. 그런 다음 Ground Truth의 각면에서 2 픽셀을자를 수 있습니다. 예측은 또한 다른 위치에서 잘려 예측과 실측 값 간의 "이동"을 시뮬레이션합니다. 다음으로,이 "이동 된"예측과 실측 값 간의 손실을 계산하고 저장 한 다음 다음 "이동 된"예측으로 이동해야합니다. 그렇게하면 다른 시프트 값으로 손실이 계산됩니다.
tensorflow의 교차 엔트로피 함수를 올바르게 이해했다면 예측이 좋으면 GT와 예측 사이의 픽셀 비교는 최소화되어야합니다. 따라서 교차 엔트로피 텐서의 각 구성 요소에 대한 최소값을 사용하여 예측과 GT 간의 평균 손실을 계산할 수 있습니다.
with tf.variable_scope('loss_layer'):
Unc = 2
labelsCropped = tf.image.crop_to_bounding_box(labels, Unc, Unc, 256-Unc*2, 256-Unc*2)
labels_flat = tf.reshape(labelsCropped, [-1, depth])
Allcross_entropy_loss = []
for x in range(2*2):
for y in range(2*2):
logitsCropped = tf.image.crop_to_bounding_box(logits, x, y, 256-Unc*2, 256-Unc*2)
logits_flat = tf.reshape(logitsCropped, [-1, depth])
Allcross_entropy_loss += [tf.nn.weighted_cross_entropy_with_logits(targets = labels_flat, logits = logits_flat, pos_weight=98.22)]
loss = tf.reduce_mean(tf.reduce_min(tf.stack(Allcross_entropy_loss), 0))
그건 그렇고, 이것은 0에 해당하는 손실을 매우 빠르게 생성합니다 (실제하기에는 너무 빠른 ~ 100 반복, 이전 모델은 20,000 반복 (20 epoch 및 1000 반복 / epoch, ~의 손실을 갖기 위해) 이상으로 계산됩니다. 여기에서 뭔가 잘못 될 것으로 예상하지만 각 함수의 출력을 표시하는 방법을 모르겠습니다. 예를 들어 reduce_min
함수가 252x252의 최소 텐서 또는 1 개의 값을 제공 하는지 알고 싶습니다 .1 값을 반환하면 , 잘못되었습니다.
커뮤니티의 이익을 위해 아래 솔루션을 언급합니다.
tf.stack
아래 줄에서 제거 하면 문제가 해결됩니다.
loss = tf.reduce_mean(tf.reduce_min(tf.stack(Allcross_entropy_loss), 0))
올바른 코드는 다음과 같습니다.
loss = tf.reduce_mean(tf.reduce_min(Allcross_entropy_loss), 0)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다