2017-04-05 3 views
2

theano 백엔드가있는 Keras에서 improved WGAN training의 Gradient Norm에 대한 정규화 용어를 구현하려고합니다. 그것은 교육 과정의 시도 일단 DisconnectedInputError을 던졌습니다Keras가 사용자 지정 손실 함수로 인해 DisconnectedInputError를 throw합니다.

def get_gradient_norm(model, y_pred): 
    weights = model.trainable_weights 
    gradients = model.optimizer.get_gradients(K.mean(y_pred), weights) 
    acc = None 
    for g in gradients: 
     s = K.sum(K.square(g)) 
     if acc == None: 
      acc = s 
     else: 
      acc = s + acc 
    return K.sqrt(acc) 

def make_w_reg_loss(model): 
    lvar = K.variable(lamb, name="Lambda") 

    def foo(y_true, y_pred): 
     gnorm = get_gradient_norm(model, y_pred) 
     return lvar * K.square(gnorm - 1) 

return foo 

[...] 

critic.compile(loss=make_w_reg_loss(critic), optimizer=RMSprop(learn_rate)) 

: 기본적으로 나는 1

에서이 같은 사용자 정의 손실을 구현하고 얼마나 멀리에 따라 그라데이션의 L2의 규범을 처벌 할 내 맞춤형 손실 기능의 기울기를 얻으려고 시도합니다.

왜?

손실을 일부 표준 손실 작업으로 대체하십시오. 오류는 내가 정의한 손실 함수에 관한 것입니다.

그래서 내가 지금 작동하는 방법을 알고 있다고 생각 :

EDIT 내 시도의 a minimal not-working example이 요점을 참조하십시오.

은 분명히 일정한 제로
K.mean(y_pred) - K.mean(y_pred) 

, 나는 단지 내 손실로이 용어를 사용하는 경우 내가 않는 얻을 : 먼저 난 그냥 무작위로 (y_true, y_pred) 직접 foo는에서 그것을 반환하기 전에, 내 손실이 용어를 추가 제로. 그러나이 "상수 0"을 정규화 손실에 추가하면 갑자기 정상적으로 작동합니다. 나는 손실이 발생합니다. 이것은 0이 아니므로 정규화에서 비롯되며 많은 train_on_batch에 대한 최적화가 손실을 줄입니다.

그렇다면 예외를 던지면서 지나치게 과장되는이 이상한 문제가 있습니까? 내 질문은 여전히 ​​의미합니다 : 왜 그것이 원래 코드로 던져 버릴까요? 일정한 제로 용어를 추가하면 수정되므로 나에게 버그처럼 보입니까?

답변

0

나는 keras에서도이 향상된 wgan을 구현하고 싶습니다. 어떻게 "문제"를 해결했는지 알고 놀랐습니다. wgan-gp 손실이 의도 한대로 작동하는지 실험 해 보았습니까? 확인하기 쉬워야하며, 아주 깊은 구분자를 사용할 수 있도록 매우 안정적인 교육입니다.) 나는 텐포 플로우 백엔드와 동일한 작업을하고 싶습니다. 코드를 살펴 보겠습니다. 그리고 코드는 여기에 있습니다 : keras improved wgan

keras/tensorflow에 wgan-gp의 작동 코드가 생기 자마자 여기에서 다시 작성하겠습니다. 오후 8시 30 분 P.S. 위의 링크는 tf 트레이닝 함수를 사용하도록하는 텐서 흐름 코드의 모든 프로 시저를 구현합니다.) 우리의 평범한 keras를 모두 사용하여 케라 손실을 정의 할 수있는 접근법을 정말 좋아합니다.

편집 : 코드에서 K 백엔드로 완전히 작업하는 것 같습니다. tensorflow 백엔드에서도 쉽게 실행됩니다. 문제/버그가 진정으로 Theano와 관련이 있는지 확인하기 위해 백엔드를 변경하려고 시도 했습니까?

두 번째 편집 : wgan-gp 용지의 그라디언트를 계산하지만 그라디언트 패널티는 생성 된 샘플과 실제 샘플 사이의 평균 샘플 그라디언트에서 시작하여 계산됩니다. 이것은 매우 다른 결과를 가져올 것입니다.당신은 아주 좋은 개선 wgan 손실 구현을 찾을 수있는 다음과 같은 링크에서 , 너무 theano에 그 일 : https://github.com/farizrahman4u/keras-contrib/

+0

내가 게시 한 코드가 제대로 아무것도 구현하지 않습니다 확실히 잔인하게 잘라 버전이며, 그것은이었다 단지 그 문제를 보여주기위한 것입니다. 실제 코드는 실제 샘플과 가짜 샘플 간의 보간 된 데이터 포인트를 전달하여 샘플링을 구현합니다. 지금까지 장난감 예제를 테스트 해봤지만 나에게 유망 해 보였습니다. 그러나 더 많은 "실제"작업으로 엇비슷했기 때문에 더 복잡한 데이터 세트를 테스트 할 수 없었습니다. –

+0

최종 손실 함수에 많은 예외가 포함되어 있기 때문에 tensorflow로 테스트하지 않았습니다. 여기에 설치하지 마십시오. 예외 문제는 실제로는 문제가 아닙니다. 그것은 단지 나를 혼란 시켰습니다. 당신이 게시 한 wgan 구현이 어쨌든 keras에서 더 많은 경험을 가진 사람들이 작성한 것으로 추측하고 더 잘 문서화 한 것 같습니다. GPU에 보간 부분을 구현 한 것 같아서 CPU에서 처리하는 것처럼 다시 돌아올 때 사용할 수 있습니다. 시원한! –

+0

나는 12 시간의 디버깅 시간을 잃어 버렸고, 별도의 그래디언트 패널티 손실 (discriminator 대신 통합 됨)으로 작동하도록 링크 된 코드를 수정하려고했습니다. 곧 벽에 갇혔습니다. "tensorflow가 손실없이 None"유형을 얻고 있습니다. 오류가 발생했습니다. 나는 갑자기 당신의 고침을 기억하고있다. 그리고 글쎄, 내 경우에도 고치고있다. 수정하지 않고 model.summary()를 통해 모델을 시각화하면 입력 레이어가 없습니다. 간단한 수정으로, 갑자기 입력 레이어가 입력으로 나타납니다. (그래디언트 페널티 손실이 없음 오류를주지 않고 작동합니다.) –