2016-11-09 9 views
2

私はケラスのリポジトリでexampleとして与えられたシャムネットワークを理解しようとしています。ラーダレイヤーがケラスでどのように機能するのか理解できませんか?

ネットワークは、次の行で、モデルへの出力としてラムダを追加する距離を

distance = Lambda(euclidean_distance, output_shape=eucl_dist_output_shape)([processed_a, processed_b]) 

他の二つの関数としてのλとして定義される

model = Model(input=[input_a, input_b], output=distance) 

が定義される:

def euclidean_distance(vects): 
    x, y = vects 
    return K.sqrt(K.sum(K.square(x - y), axis=1, keepdims=True)) 


def eucl_dist_output_shape(shapes): 
    shape1, shape2 = shapes 
    return (shape1[0], 1) 

今、私はこのラムダ層が次の層に何を伝えるのか理解できません。

Kerasがので、私は前の層からの入力関数によって処理され、所望の形状に出力として返される推測ラムダ

Lambda(function,output_shape,arguments) 

として定義しています。 私によれば、関数euclidean distanceを適用すると、現在のバッチ内の各ペアの距離を表す行ベクトルが返されます。だから、このような結果は、今機能eucl_dist_output_shapeは、その形状を変えるだろう

batch_size * 1 

ようなものになるだろうの寸法を、私は理解することができないのですが、この関数は、ここでやっているとそれが計算され、正確に何で、何ですかreturn (shape1[0],1)この機能で達成できますか?

答えて

0

このラムダレイヤの入力は[processed_a, processed_b]です。

実行される機能はeuclidean_distanceであり、前方に進むのはK.sqrt(K.sum(K.square(x - y), axis=1, keepdims=True))です。 xおよびyが入力から取得されます。

これは唯一の実際の処理です。これは形状を規定するものです。

入力は、形状が(batch, n)であると思われ、出力は(batch,1)になります。 sumの機能がaxis=1であるため、nが表示されなくなります。しかし、keepdims=Trueを使用するので、軸は1として保存されます。

出力シェイプは実際に何もしません。 Tensorflowを使用している場合は、この機能は必要ありません。しかし、あなたがTheanoを使用しているなら、あなたはそれが必要です。なぜなら、Theanoは計算の形を理解できないからです。

この関数は、形状の(batch,1)を返すだけです。関数の作成者がこれが出力シェイプであることを知っているからです。

この出力形状関数の入力は[shapeOfProcessed_a, shapeOfProcessed_b]です。彼らはちょうど入力形状の1つからバッチサイズを取っています。

関連する問題