2017-07-22 17 views
0

最終出力をポンピングする前に、確定的なマスキングを行うラムダレイヤを作成しようとしています(私はKerasマスキングレイヤについては言及していません)。Kerasカスタムラムダレイヤテンソル操作エラー

def binary_mask(x): 
    # Mask is half the size of x. 
    # 1 if pred1 > pred2 element-wise, 0 otherwise. 

    pred1, pred2 = tf.split(x, 2, 1) 
    mask = tf.greater(pred1, pred2) 
    mask = tf.to_float(mask) 
    return mask 

def mask_output_shape(input_shape): 
    return (input_shape[0], units) 

そして、これは私が機能APIでレイヤーを作成する方法である:これは私がこれまで持っているものである

outputs = Lambda(binary_mask, output_shape=mask_output_shape)(inputs) 

私はオプティマイザから来る非常に奇妙なエラーを取得しています。私の勾配はNoneであるようです。

しかし、binary_maskの現在のコードをLambdaのレイヤ実装のいずれかに置き換えると、正常に動作します。 return x。私はここで間違って何をしていますか?

maskが実際に有効なテンソルフローテンソルであることはかなり確信しています。

答えて

0

inputsを0と1のベクトルに変換する目的がわかりませんが、この操作は明らかに区別できません。そのため、勾配は返されません(勾配はNone)。

多分、この機能に「よりソフトな」バージョンを試すことができます。たとえば、sigmoid(a - b)は、1 if a > b else 0のより柔らかいバージョンにすることができます。

outputs = Lambda(lambda x: K.sigmoid(x[0] - x[1]))([pred1, pred2]) 
+0

あなたは何を言っているのか分かります。しかし、私の目標出力は0と1のベクトルです。なぜそれはまだ問題になるのでしょうか? – jjiang

+0

バックプロパゲーションを機能させるには、各層の出力を微分可能でなければなりません。その入力。一般に、あるレイヤーで微分不可能な操作を必要とする「アイデア」がある場合は、それをグラデーション計算のための「ソフトバージョン」に置き換えることができます。 –

関連する問題