2017-11-29 3 views
0

현재 배치에 따라 Keras 손실 함수에 추가 정보를 통합해야합니다. Keras 손실은 두 개의 인수 만 취하기 때문에 나는이 정보를 발전기 객체에서 next() 함수를 호출하여 추가하는 방법을 고려했습니다. 그러나 생성기는 한 번만 호출됩니다 (아마도 model.compile()에서 손실 함수를 추가 할 때).손실 함수에서 발전기 사용

data_batches = yield_data_batches() 
meta_batches = yield_meta_batches() 
.... 
model.compile(loss=loss_function, ...) 
model.fit_generator(generator=data_batches, ....) 

def loss_function(x, y): 
     meta_x, meta_y = next(meta_batches) 
     x *= meta_x # component-wise matrix multiplication 
     y *= meta_y # component-wise matrix multiplication 
     return mse(x, y) 

손실 함수는 새로운 meta_batch 그것이 data_batch 평가 때마다 얻을 만들 수있는 방법이 있나요 : 다음은 샘플 코드? 또는이 메타 정보를 손실 함수에 통합하는 또 다른 방법이 있습니까?

설명 : meta_x 및 meta_y는 손실로 계산해서는 안되기 때문에 예측에서 특정 요소를 취소해야하는 이진 행렬입니다. 예를 들어 :

이제

y_true = (a,b,c,0) y_pred = (d,e,f,g) y_meta = (1,1,1,0)

, y_pred *이 손실을 계산하지 않도록 y_meta가 g을 취소해야한다.

답변

0

손실 함수가 컴파일되어 계산 그래프에 추가되므로 작동하지 않습니다. 귀하의 손실 기능은 y_predy_true에만 의존 할 수 있습니다.

y_true에이 정보를 통합하거나 결과 중량에 무게를 더할 수 있습니다.

당신의 접근 방식은 두 가지를 조합 한 것과 같습니다 : 긍정 가중치 a와 b (당신은 meta_x와 meta_y라고 부름)를 가정하십시오 : | ax-by | = a | x-b/a * y |이므로 y_pred를 b/a로 가중치하고 샘플 가중치를 더합니다.

+0

내 경우에는 가중치가 스칼라가 아니라 행렬입니다. 그것은 컴포넌트 - 와이즈 행렬 곱셈 (위의 예제에서 이것을 수정했습니다)이라고 생각했습니다. 그래서 당신의 접근 방식은 불행하게도 작동하지 않습니다. 이 정보를 y_true에 통합하면 (즉,이 두 행렬을 연결하면) 신경망이 더 많은 매개 변수를 추정해야합니다. 그것도 실현 가능한 해결책이 아닙니다. – limes