web-dev-qa-db-ja.com

中間層の出力を使用したケラ

モデルAをトレーニングし、モデルBの追加入力にname = "layer_x"を持つ中間層の出力を使用しようとします。

Keras docのような中間層の出力を使用しようとしました https://keras.io/getting-started/faq/#how-can-i-obtain-the-output-of-an-中間層

モデルA:

inputs = Input(shape=(100,))
dnn = Dense(1024, activation='relu')(inputs)
dnn = Dense(128, activation='relu', name="layer_x")(dnn)
dnn = Dense(1024, activation='relu')(dnn)
output = Dense(10, activation='softmax')(dnn)

モデルB:

input_1 = Input(shape=(200,))
input_2 = Input(shape=(100,)) # input for model A

# loading model A
model_a = keras.models.load_model(path_to_saved_model_a)

intermediate_layer_model = Model(inputs=model_a.input, 
                                 outputs=model_a.get_layer("layer_x").output)

intermediate_output = intermediate_layer_model.predict(data)

merge_layer = concatenate([input_1, intermediate_output])
dnn_layer = Dense(512, activation="relu")(merge_layer)
output = Dense(5, activation="sigmoid")(dnn_layer)
model = keras.models.Model(inputs=[input_1, input_2], outputs=output)

デバッグすると、次の行にエラーが表示されます。

intermediate_layer_model = Model(inputs=model_a.input, 
                                 outputs=model_a.get_layer("layer_x").output)

File "..", line 89, in set_model
  outputs=self.neural_net_asc.model.get_layer("layer_x").output)
File "C:\WinPython\python-3.5.3.AMD64\lib\site-packages\keras\legacy\interfaces.py", line 87, in wrapper
  return func(*args, **kwargs)
File "C:\WinPython\python-3.5.3.AMD64\lib\site-packages\keras\engine\topology.py", line 1592, in __init__
  mask = node.output_masks[tensor_index]
AttributeError: 'Node' object has no attribute 'output_masks'

Get_layer( "layer_x")。outputでTensorにアクセスできますが、output_maskはNoneです。出力マスクを手動で設定する必要がありますか?また、必要に応じてこの出力マスクを設定するにはどうすればよいですか?

8
KyleReemoN-

あなたが間違っているように見える2つのことがあります:

_intermediate_output = intermediate_layer_model.predict(data)
_

.predict()を実行すると、実際にはグラフを介してデータを渡し、結果を尋ねます。これを行うと、_intermediate_output_はnumpy配列になり、希望するレイヤーではなくなります。

第二に、新しい中間モデルを再作成する必要はありません。興味のある_model_a_の部分を直接使用できます。

これは私のために「コンパイル」するコードです:

_from keras.layers import Input, Dense, concatenate
from keras.models import Model

inputs = Input(shape=(100,))
dnn = Dense(1024, activation='relu')(inputs)
dnn = Dense(128, activation='relu', name="layer_x")(dnn)
dnn = Dense(1024, activation='relu')(dnn)
output = Dense(10, activation='softmax')(dnn)

model_a = Model(inputs=inputs, outputs=output)

# You don't need to recreate an input for the model_a, 
# it already has one and you can reuse it
input_b = Input(shape=(200,))

# Here you get the layer that interests you from model_a, 
# it is still linked to its input layer, you just need to remember it for later
intermediate_from_a = model_a.get_layer("layer_x").output

# Since intermediate_from_a is a layer, you can concatenate it with the other input
merge_layer = concatenate([input_b, intermediate_from_a])
dnn_layer = Dense(512, activation="relu")(merge_layer)
output_b = Dense(5, activation="sigmoid")(dnn_layer)
# Here you remember that one input is input_b and the other one is from model_a
model_b = Model(inputs=[input_b, model_a.input], outputs=output_b)
_

これがあなたのやりたいことだと思います。

何かはっきりしないことがあれば教えてください:-)

11
Nassim Ben