2017-09-11 7 views
0

私はkerasでラムダレイヤーを使って2つのベクトルのユークリッド距離を返そうとしています。コードは次のとおりkeras/theano-λの定数を返す方法

def distance(x): 
    a=x[0] 
    b=x[1] 
    dist=np.linalg.norm(a-b) 
    return dist 
dist=Lambda(distance,output_shape=(1,1)name='dist')([x,y]) 

この層の入力は、(100,1,8192)の二つのベクトルです。 100はバッチです。出力は理論上は定数です。私は、これはラムダ層のoutput_shapeによって引き起こされると考え

ValueError: Input dimension mis-match. (input[0].shape[2] = 1, input[1].shape[2] = 8192) 
Apply node that caused the error: Elemwise{Composite{EQ(i0, RoundHalfToEven(i1))}}(/dist_target, Elemwise{Composite{sqrt(sqr(i0))}}.0) 
Toposort index: 92 
Inputs types: [TensorType(float32, 3D), TensorType(float32, 3D)] 
Inputs shapes: [(100, 1, 1), (100, 1, 8192)] 
Inputs strides: [(4, 4, 4), (32768, 32768, 4)] 
Inputs values: ['not shown', 'not shown'] 
Outputs clients: [[Sum{acc_dtype=int64}(Elemwise{Composite{EQ(i0, RoundHalfToEven(i1))}}.0)]] 

:私はこのモデルを実行すると、エラーが発生します

model = Model(inputs=[probe_input_car,probe_input_sign,gallary_input_car,gallary_input_sign], outputs=dist, name='fcn')` 

:そして、私は次のように、このモデルの出力としてdistのを使用したいです。レイヤのoutput_shapeをどのように設定すればよいですか?私はtheanoをバックエンドとして使用するので、output_shape自体を計算することはできません。 それがoutput_shapeによって引き起こされていない場合。エラーはどこですか?

+0

このモデルを「実行する」行を投稿できますか? –

答えて

0

あなたは単にベクトルの間違った部分を取得しているようです。

  • (100,1,1)
  • あなたに基づいて
  • (100,1,8192)

を:メッセージは、形として2つのテンソルで何かを計算しようとしていると言う

入力リストには、[car,signal,car2,signal2]があります。 car x carまたはsignal x signalのいずれかの操作が必要になると思われます。

だから、あなたのラムダ層は、おそらくどちらかとして起動する必要があります。

a = x[0] 
b = x[2] 

かを:

a = x[1] 
b = x[3] 

ヒント:あなたは何を計算するkeras backendで同等の機能を見つけることができるしている場合あなたが望むなら、それはおそらく良いでしょう。 numpy関数を使用するためのエラーメッセージが「切断されました」というメッセージが表示されないことがあります。

0

Theanoテンソルでnp.linalg.norm()を使用したためにエラーが発生します。エラーは発生しませんが、出力は間違いありません。

このエラーを回避するには、代わりにKerasバックエンド関数を使用します。例えば、

dist = K.sqrt(K.sum(K.square(a - b), axis=-1, keepdims=True)) 
np.linalg.norm内部に何が起こっ

(X):

  1. x = np.asarray(x)は、その唯一の要素Theanoある(DTYPE objectの)長さ-1配列にa - bをラップテンソル形状(100,1,8192)。
  2. sqnorm = np.dot(x, x):ドットプロダクトの定義を思い出してください。長さ1の配列にドットを付けると、実際には(a - b) * (a - b)、または要素ごとにa - bの正方形が計算されます。そのため、エラーの2行目にsqr(i0)が存在します。
  3. np.sqrt(sqnorm)が返されます。したがって、sqrt(sqr(i0))があなたのエラーとして表示されることがあります。
  4. したがって、np.linalg.norm(a - b)の出力は(100,1,1)ではなく、テンソルの形状(100,1,8192)です。

また、the codeに近づけば、Elemwise{Composite{EQ(i0, RoundHalfToEven(i1))}}は正確です。

def binary_accuracy(y_true, y_pred): 
    return K.mean(K.equal(y_true, K.round(y_pred)), axis=-1) 

ので、エラーメッセージがy_truey_predの形状との間に不一致があることを教えてくれしようとしています。 y_trueは形状(100,1,1)であるが、np.linalg.norm()はTheanoテンソルに間違った結果を与えるので、y_predは(100,1,8192)の形状を持つ。

+0

あなたの答えをありがとう。あなたのメソッドを使用した後で作業を開始します。 –

関連する問題