2019-09-24

autoencoderなどを作っていると、保存や推論を行う上での再利用性を考え、encoderとdecoderは分けてModelを作りたいことがある。

autoencoderの学習の際には、作成したencoderのModelとdecoderのModelを結合する。

Modelの結合は前はできなかった気がするが、できるようになっていたのでメモ。

Kerasのバージョンは、2.1.1

まずは、シンプルなモデルを2つ作る。input→model1→model2→outputを作る。

def model1():
    layer_input = Input(shape=(None, 10))
    layer_output = Dense(10)(layer_input)
    model = Model(layer_input, layer_output)
    model.summary()
    return model

def model2():
    layer_input = Input(shape=(None, 10))
    layer_output = Dense(10)(layer_input)
    model = Model(layer_input, layer_output)
    model.summary()
    return model

まず、model1へのインプットを作る。model1のアウトプットをmodel2のインプットにし、Modelのインスタンスを作る。

m1 = model1()
m2 = model2()

inp = Input(shape=(None, 10))
model1_output = m1(inp)
out = m2(model1_output)
model = Model(inp, out)
model.summary()

すると、こんな感じでモデルが結合できたのが確認できる。

Using TensorFlow backend.
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
input_1 (InputLayer)         (None, None, 10)          0
_________________________________________________________________
dense_1 (Dense)              (None, None, 10)          110
=================================================================
Total params: 110
Trainable params: 110
Non-trainable params: 0
_________________________________________________________________
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
input_2 (InputLayer)         (None, None, 10)          0
_________________________________________________________________
dense_2 (Dense)              (None, None, 10)          110
=================================================================
Total params: 110
Trainable params: 110
Non-trainable params: 0
_________________________________________________________________
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
input_3 (InputLayer)         (None, None, 10)          0
_________________________________________________________________
model_1 (Model)              (None, None, 10)          110
_________________________________________________________________
model_2 (Model)              (None, None, 10)          110
=================================================================
Total params: 220
Trainable params: 220
Non-trainable params: 0
_________________________________________________________________

コード全体はこんな感じ。

from keras.layers import Dense
from keras.models import Model

def model1():
    layer_input = Input(shape=(None, 10))
    layer_output = Dense(10)(layer_input)
    model = Model(layer_input, layer_output)
    model.summary()
    return model

def model2():
    layer_input = Input(shape=(None, 10))
    layer_output = Dense(10)(layer_input)
    model = Model(layer_input, layer_output)
    model.summary()
    return model

def main():
    m1 = model1()
    m2 = model2()

    inp = Input(shape=(None, 10))
    x = m1(inp)
    out = m2(x)
    model = Model(inp, out)
    model.summary()

if __name__ == '__main__':
   main()

モデルインスタンスの再利用性が上がってて使いやすくなってる。

See Also