2016-07-25 4 views
1

내 데이터의 의미 론적 세분화를 위해 CNN 아키텍처 (FCN-8 모델, 사전 학습 된 VGG16 모델)를 구현하고 있습니다 (2 클래스, 따라서 픽셀 당 바이너리 나는 이것에 대해 이동하려는 어떻게 분류)Tensorflow - 전송 학습 구현 (의미 론적 세분화)

은 다음과 같습니다 가중치

  1. 로드 사전 교육을받은 모델은
  2. 추가/FCN에의
  3. 정지 하위 계층을 변환 할 추가 상위 계층을 제거 사전 훈련 된 모델 교육 단계에서 pdate)
  4. 기차이 올바른 가정 특정 데이터 세트

의 네트워크, 내 tensorflow 모델에 하위 계층 동결에 대해 어떻게 가야합니까? (특정 구현 세부 정보를 찾고 있습니다.) TensorFlow 자습서에서 Inception 재교육을 살펴 보았지만 아직 확실하지 않습니다. , 없이 훈련에게 그것을 기존의 pretrained 모델을 통해 내 데이터를 실행하고 기능 출력을 추출

  1. :

    내가 생각하고있는 워크 플로우입니다. (어떻게?)

  2. 상위 레이어가 포함 된 다른 네트워크에 이러한 기능 출력을 제공하고 교육을 받으십시오.

어떤 제안이 도움이 될 것입니다!

그렇지 않으면 내가 틀렸을 때 어떻게 생각해야합니까?

업데이트 : 아래 chasep255의 제안을했다, 내 모델의 하위 계층을 "동결"하도록 tf.stop_gradient을 사용하려고

. 분명히, 저의 구현에는 잘못된 것이 있습니다. 가능한 대안/제안?

모델은 FCN (의미 론적 세분화) 용지를 기반으로 제작되었습니다. 모델 구조, 즉, 나의 ​​특징으로부터 logits을 추출하고, 이는 softmax 분류기로 최소화하기 위해 처음에 loss 함수로 직접 공급한다. 그때 아래 이러한 그래프 작업을 실행

logits = vgg_fcn.deconv_1 

stopper = tf.stop_gradient(logits, 'stop_gradients') 

loss = train_func.loss(stopper, labels_placeholder, 2) 

with tf.name_scope('Optimizer'): 
    train_op = train_func.training(loss, FLAGS.learning_rate) 

    with tf.name_scope('Accuracy'): 
     eval_correct = train_func.accuracy_eval(logits, labels_placeholder) 
     accuracy_summary = tf.scalar_summary('Accuracy', eval_correct) 

: 내가 이렇게 훈련 사이클을 실행하면

_, acc, loss_value = sess.run([train_op,eval_correct, loss], feed_dict=feed_dict) 

이있다 (픽셀 당 분류) deconv_1 모양의, [batch, h, w, num_classes] = [1, 750, 750, 2] 구현 내 logits 텐서입니다 손실 값의 최적화가 없습니다. 가장 정확한 이유는 Op을 소개했기 때문입니다.

더 자세한 내용은 아래 내 손실 함수는 :

def loss(logits, labels, num_classes): 

    logits = tf.reshape(logits, [-1, num_classes]) 
    #epsilon = tf.constant(value=1e-4) 
    #logits = logits + epsilon 

    labels = tf.to_int64(tf.reshape(labels, [-1])) 
    print ('shape of logits: %s' % str(logits.get_shape())) 
    print ('shape of labels: %s' % str(labels.get_shape())) 

    cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits, labels, name='Cross_Entropy') 
    cross_entropy_mean = tf.reduce_mean(cross_entropy, name='xentropy_mean') 
    tf.add_to_collection('losses', cross_entropy_mean) 

    loss = tf.add_n(tf.get_collection('losses'), name='total_loss') 
    return loss 
+0

안녕하세요 murushiv, 귀하의 로그 코드 = vgg_fcn.deconv_1과 관련하여 MarvinTeichmann의 fcn 구현을 사용하고 있습니까? 나는 그의 코드를 읽고 deconv_1을 찾지 못했습니다. 더 많은 정보를 공유하고 싶습니까? – user288609

+0

@ user288609 약간 수정 된 버전입니다. deconv_1은 최고 점수 방법 중 하나와 동일합니다. (또는 모듈?) 그러나 나는 여기에 오류가 있음을 깨달았습니다. 최고 점수 이전에 탭해야하고, 로그로 사용하고, 업 샘플링 계층까지 훈련해야합니다. – mshiv

+0

안녕하세요 murushiv, 그들의 fcn 구현에서, 거기에 "pred.orence"전에 "pred"레이어가있다, 당신은 로지 (pred)를 직접 손실 함수에서 사용하는 것을 의미합니까? 그런데 오류가 있었다고하셨습니까? 더 자세히 설명해 주시겠습니까? 나는 그들의 구현을 이해하려고 노력하고있다. 도와 주셔서 감사합니다. – user288609

답변

1

당신은 sess.run로 (pretrained_output, ...)을 pretrained 모델의 출력을 전달하고 pretrained 모델의 출력을 캡처 할 수있다.결과를 저장 한 다음 모델에 피드를 제공 할 수 있습니다. 이 경우 옵티마이 저가 사전에 조율 된 모델에 그라데이션을 전파 할 수 없습니다.

모델에 일반적으로 익숙한 사전 훈련 된 모델을 연결 한 다음, 사전 계산 된 출력을 tf.stop_graidents()를 통해 전달할 수도 있습니다. 그러면 tf.stop_graidents()를 통해 옵티마이 저가 그래디언트를 사전 모델링 된 모델로 다시 전파하지 못하게됩니다.

마지막으로, 사전 학습 된 모델의 모든 변수를 검토하여 학습 가능한 변수 목록에서 제거 할 수 있습니다.

+0

tf.stop_gradients()는 필자가 필요로하는 것처럼 보였지만 찾을 수있을만큼 명확하게 표현할 수 없었습니다. 첫 번째 방법에서 제안한 것을 끝내고 파이프 라인을 준비했습니다. 사전 훈련 된 매개 변수를 조정해야하는 경우 stop_gradients()로 대체하는 것이 좋습니다. 훨씬 더 깨끗한 솔루션 인 것 같습니다. – mshiv

+0

내 질문에 tf.stop_gradients() op 구현시 일부 코드가 업데이트되었습니다. 빨리 살펴보고 왜/왜 내가 잘못하고 있는지 볼 수 있습니까? – mshiv

+0

손실 함수에 직접 스톱 그라디언트를 전달하므로 최적화 할 항목이 없습니다. – chasep255