下の図に示すように、モデルを構築しようとしています。アイデアは、複数のカテゴリ特徴(ワンホットベクトル)を取り、それらを個別に埋め込んでから、それらの埋め込まれたベクトルをLSTMの3Dテンソルと組み合わせるというものです。
Keras2.0.2の次のコードを使用して、複数の入力を持つModel()
オブジェクトを作成すると、AttributeError: 'NoneType' object has no attribute 'inbound_nodes'
this の質問に似ています。誰が私が何が問題なのかを理解するのを手伝ってくれる?
モデル:
コード:
from keras.layers import Dense, LSTM, Input
from keras.layers.merge import concatenate
from keras import backend as K
from keras.models import Model
cat_feats_dims = [315, 14] # Dimensions of the cat_feats
emd_inputs = [Input(shape=(in_size,)) for in_size in cat_feats_dims]
emd_out = concatenate([Dense(20, use_bias=False)(inp) for inp in emd_inputs])
emd_out_3d = K.repeat(emd_out, 10)
lstm_input = Input(shape=(10,5))
merged = concatenate([emd_out_3d,lstm_input])
lstm_output = LSTM(32)(merged)
dense_output = Dense(1, activation='linear')(lstm_output)
model = Model(inputs=emd_inputs+[lstm_input], outputs=[dense_output])
#ERROR MESSAGE
Traceback (most recent call last):
File "C:\Program Files\Anaconda2\envs\mle-env\lib\site-packages\IPython\core\interactiveshell.py", line 2881, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-2-a9da7f276aa7>", line 14, in <module>
model = Model(inputs=emd_inputs+[lstm_input], outputs=[dense_output])
File "C:\Program Files\Anaconda2\envs\mle-env\lib\site-packages\keras\legacy\interfaces.py", line 88, in wrapper
return func(*args, **kwargs)
File "C:\Program Files\Anaconda2\envs\mle-env\lib\site-packages\keras\engine\topology.py", line 1648, in __init__
build_map_of_graph(x, seen_nodes, depth=0)
File "C:\Program Files\Anaconda2\envs\mle-env\lib\site-packages\keras\engine\topology.py", line 1644, in build_map_of_graph
layer, node_index, tensor_index)
File "C:\Program Files\Anaconda2\envs\mle-env\lib\site-packages\keras\engine\topology.py", line 1644, in build_map_of_graph
layer, node_index, tensor_index)
File "C:\Program Files\Anaconda2\envs\mle-env\lib\site-packages\keras\engine\topology.py", line 1639, in build_map_of_graph
next_node = layer.inbound_nodes[node_index]
AttributeError: 'NoneType' object has no attribute 'inbound_nodes'
keras.backend.repeatは関数であり、レイヤーではありません。代わりに keras.layers.core.RepeatVector を使用してみてください。機能と同じ機能があります。
emd_out_3d = RepeatVector(10)(emd_out)
その場合だけでなく、一般に、同等のレイヤー実装がないモデルに関数を追加する場合は、その関数をLambdaレイヤーとして作成できます。
たとえば、axis = 1の平均演算子をモデルに追加する必要がありました。以下は、現在のテンソルxinputと出力テンソルが出力されると想定されるコードです。コードは次のようになります。
# suppose my tensor named xinput
meaner=Lambda(lambda x: K.mean(x, axis=1) )
agglayer = meaner(xinput)
output = Dense(1, activation="linear", name="output_layer")(agglayer)
Lambda関数を使用する代わりに、K.mean関数を直接追加すると、同じエラーが発生します。