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에 대한 최적화가 손실을 줄입니다.
그렇다면 예외를 던지면서 지나치게 과장되는이 이상한 문제가 있습니까? 내 질문은 여전히 의미합니다 : 왜 그것이 원래 코드로 던져 버릴까요? 일정한 제로 용어를 추가하면 수정되므로 나에게 버그처럼 보입니까?
내가 게시 한 코드가 제대로 아무것도 구현하지 않습니다 확실히 잔인하게 잘라 버전이며, 그것은이었다 단지 그 문제를 보여주기위한 것입니다. 실제 코드는 실제 샘플과 가짜 샘플 간의 보간 된 데이터 포인트를 전달하여 샘플링을 구현합니다. 지금까지 장난감 예제를 테스트 해봤지만 나에게 유망 해 보였습니다. 그러나 더 많은 "실제"작업으로 엇비슷했기 때문에 더 복잡한 데이터 세트를 테스트 할 수 없었습니다. –
최종 손실 함수에 많은 예외가 포함되어 있기 때문에 tensorflow로 테스트하지 않았습니다. 여기에 설치하지 마십시오. 예외 문제는 실제로는 문제가 아닙니다. 그것은 단지 나를 혼란 시켰습니다. 당신이 게시 한 wgan 구현이 어쨌든 keras에서 더 많은 경험을 가진 사람들이 작성한 것으로 추측하고 더 잘 문서화 한 것 같습니다. GPU에 보간 부분을 구현 한 것 같아서 CPU에서 처리하는 것처럼 다시 돌아올 때 사용할 수 있습니다. 시원한! –
나는 12 시간의 디버깅 시간을 잃어 버렸고, 별도의 그래디언트 패널티 손실 (discriminator 대신 통합 됨)으로 작동하도록 링크 된 코드를 수정하려고했습니다. 곧 벽에 갇혔습니다. "tensorflow가 손실없이 None"유형을 얻고 있습니다. 오류가 발생했습니다. 나는 갑자기 당신의 고침을 기억하고있다. 그리고 글쎄, 내 경우에도 고치고있다. 수정하지 않고 model.summary()를 통해 모델을 시각화하면 입력 레이어가 없습니다. 간단한 수정으로, 갑자기 입력 레이어가 입력으로 나타납니다. (그래디언트 페널티 손실이 없음 오류를주지 않고 작동합니다.) –