2017-07-25 10 views
0

私のモデルの宣言に問題があります。私の入力はx_inputとy_inputで、私の出力は予測です。次のように:Kerasバックエンドモデリングの問題

model = Model(inputs = [x_input, y_input], outputs = predictions) 

私の入力(x、y)は両方とも埋め込まれ、その後MatMultが一緒に組み込まれます。次のように:Y分岐のための同様

# Build X Branch 
x_input = Input(shape = (maxlen_x,), dtype = 'int32')        
x_embed = Embedding(maxvocab_x + 1, 16, input_length = maxlen_x) 
XE = x_embed(x_input) 
# Result: Tensor("embedding_1/Gather:0", shape=(?, 31, 16), dtype=float32) 
# Where 31 happens to be my maxlen_x 

...

# Build Y Branch 
y_input = Input(shape = (maxlen_y,), dtype = 'int32')        
y_embed = Embedding(maxvocab_y + 1, 16, input_length = maxlen_y) 
YE = y_embed(y_input) 
# Result: Tensor("embedding_1/Gather:0", shape=(?, 13, 16), dtype=float32) 
# Where 13 happens to be my maxlen_y 

私は、2つの間のバッチドットを行います。 (各インスタンスのデータを単に点描する)

from keras import backend as K 
dot_merged = K.batch_dot(XE, YE, axes=[2,2]) # Choose the 2nd component of both inputs to Dot, using batch_dot 
# Result: Tensor("MatMul:0", shape=(?, 31, 13), dtype=float32)` 

次にテンソルの最後の2つの次元を平坦化しました。

dim = np.prod(list(dot_merged.shape)[1:]) 
flattened= K.reshape(dot_merged, (-1,int(dim))) 

最終的に、このフラット化されたデータを単純なロジスティック回帰分析器に送りました。

predictions = Dense(1,activation='sigmoid')(flattened) 

私の予測は、もちろん、モデルのための私の出力です。

各レイヤーの出力をテンソルの出力形状で表示します。

Tensor("embedding_1/Gather:0", shape=(?, 31, 16), dtype=float32) 
Tensor("embedding_2/Gather:0", shape=(?, 13, 16), dtype=float32) 
Tensor("MatMul:0", shape=(?, 31, 13), dtype=float32) 
Tensor("Reshape:0", shape=(?, 403), dtype=float32) 
Tensor("dense_1/Sigmoid:0", shape=(?, 1), dtype=float32) 

特に以下のエラーが発生します。

Traceback (most recent call last): 
    File "Model.py", line 53, in <module> 
    model = Model(inputs = [dx_input, rx_input], outputs = [predictions]) 
    File "/Users/jiangq/tensorflow/lib/python3.6/site-packages/keras/legacy/interfaces.py", line 88, in wrapper 
    return func(*args, **kwargs) 
    File "/Users/jiangq/tensorflow/lib/python3.6/site-packages/keras/engine/topology.py", line 1705, in __init__ 
    build_map_of_graph(x, finished_nodes, nodes_in_progress) 
    File "/Users/jiangq/tensorflow/lib/python3.6/site-packages/keras/engine/topology.py", line 1695, in build_map_of_graph 
    layer, node_index, tensor_index) 
    File "/Users/jiangq/tensorflow/lib/python3.6/site-packages/keras/engine/topology.py", line 1665, in build_map_of_graph 
    layer, node_index, tensor_index = tensor._keras_history 
AttributeError: 'Tensor' object has no attribute '_keras_history' 

Volia。どこで私は間違えましたか? お手数をおかけしていただきありがとうございます。

-Anthony

答えて

1

あなたはLambda層へのバックエンド機能をラップしようとしたしましたか? Kerasレイヤーの__call__()メソッド内にKeras Modelが正しく構築されるためのいくつかの必要な操作があります。これは、バックエンド関数を直接呼び出すと実行されません。

+0

返信いただきありがとうございます!いいえ。私はしませんでした。ラムダレイヤーはどのように追加しますか? –

+0

私はまだテストしていませんが、 'dot_merged = Lambda(lambda x:K.batch_dot(x [0]、x [1]、axes = [2,2]))'([XE、YE] flattened = Flatten()(dot_merged) 'が動作するはずです。 –

+0

ああ私のゴシック。出来た!!!ありがとう、ありがとう、ありがとう。 Upvote :) –

関連する問題