2017-03-24 3 views
2

사용자 지정 손실 기능을 생성하는 람다 레이어를 구현하려고합니다. 레이어에서 배치의 모든 요소를 ​​배치의 다른 모든 요소와 비교하여 비용을 계산할 수 있어야합니다. 이상적으로, 나는이 같은 형태의 코드를 원하는 :사용자 지정 손실 Keras Lambda 레이어

for el_1 in zip(y_pred, y_true): 
    for el_2 in zip(y_pred, y_true): 
     if el_1[1] == el_2[1]: 
      # Perform a calculation 
     else: 
      # Perform a different calculation 

때 나는 사실이, 내가 얻을 : 나는 Theano 버전 0.9.0 백엔드와 Keras 버전 2.0.2을 사용하고

TypeError: TensorType does not support iteration. 

. 이 작업을 수행하기 위해 Keras 텐서 함수를 사용해야한다는 것을 이해하지만, 원하는대로 텐서 함수를 이해할 수는 없습니다.

또한 내 람다 함수가 반환해야하는 것을 정확히 이해하는 데 어려움이 있습니다. 각 샘플에 대한 총 비용의 텐서 (tensor)입니까, 아니면 배치에 대한 총 비용입니까?

저는 며칠 동안 머리를 때렸습니다. 어떤 도움도 깊이 감사드립니다.

+0

좋아, Keras를 사용 : 당신은 그들이 동일한 경우, 당신이 쓰는 것 두 값을 뺄 때 a != b하지만 추가하려는 경우

K.switch의 구문은, 예를 들어

K.switch(condition, then_expression, else_expression) 

입니다 콜백, 나는 람다가 반환해야하는 것을 결정했습니다 - 배치 당 하나의 스칼라. 그러나, 나는 여전히 트레이닝 동안 텐서를 반복하는 법을 이해할 수 없다. 제 생각에는 슬라이스와 관련이 있을지도 모릅니다 ... – gaw89

+0

내 대답을 읽어 보셨습니까? – nemo

+0

죄송합니다. 주말에 끝났습니다. 그냥 받아 들였다. 고마워요! – gaw89

답변

2

Keras의 텐서는 일반적으로 배치와 뉴런/단위/노드/... 차원의 차원이 2 개 이상 있습니다. 그러므로 배치 크기가 64 인 훈련 된 128 개의 치밀한 층은 모양이 (64,128) 인 텐서를 산출합니다.

귀하의 LambdaLayer은 다른 모든 레이어와 마찬가지로 텐서를 처리합니다. 이전에 빽빽한 레이어를 연결 한 후에 텐서를 처리하면 (64,128)이 처리됩니다. 텐서를 처리하는 것은 numpy 배열에 대한 연산 (또는 다른 벡터 처리 라이브러리)이 작동하는 것과 비슷하게 작동합니다. 데이터 구조의 모든 요소에 대해 브로드 캐스팅 할 하나의 연산을 지정합니다. 예를 들어

는, 사용자 정의 비용이 일괄 처리의 각 값에 대한 차이입니다, 당신과 같이 그것을 구현하는 것이 :

- 작업은 ab을 통해 방송되며, 제공된 적절한 결과를 반환합니다
cost_layer = LambdaLayer(lambda a,b: a - b) 

치수가 일치합니다. 테이크 어웨이는 실제로 모든 값에 대해 하나의 작업 만 지정할 수 있다는 것입니다. 더 복잡한 작업을 수행하려는 경우 (예 : 값을 기반으로 한 계산) 두 작업을 수행하는 단일 작업이 필요하므로 적절하게 적용하십시오 (예 : switch 작업).

import keras.backend as K 
cost_layer = LambdaLayer(lambda a,b: K.switch(a != b, a - b, a + b)) 
관련 문제