tensorfow を使い複数入力、複数出力を持つモデルの作成方法(mulitple input , output)


multiple input, outputとは

multiple inputとは

全く違うデータ、あるいは形状の違うデータを一つのモデルに入力する、入力層自体が複数あるモデルを言います。

multiple outputとは

multiclassのように出力層に複数の出力を持つのではなく、出力層がそもそも複数あるモデルを言います。

modelの定義部

modelの定義の際に気をつけなければいけないところは、複数の入力が結合するlayerの形状と、複数の出力が分岐される箇所のlayerの形です。当たり前と言えばそれまでですが、ミスしやすいところだと思います。
書き方的には単純なモデルと同じにできるのでこの部分のコードは省きます。

from tensorflow.keras import Model の部分

次に詰まるのはmodelの宣言だと思います。multiple input output modelの宣言は以下のようにすれば可能です。

model = Model(inputs=[input_1,input_2], outputs=[output_1,output_2])

リスト形式で宣言することができます。

今回の場合の入力層

  • input_1
  • input_2

今回の場合の出力層

  • output_1
  • output_2

compile 部分の書き方

compileではlossと、metricsにおいて各出力層ごとに別の関数を割り当てることができます。


model.compile(optimizer='adam', 
              loss={"output_1":"mse","output_2":"categorical_crossentropy"}, 
              metrics={"output_2":"acc"})

lossもmetricsもdict形式で与えてやることでcompile可能です出力層の指定にはnameを使うのでmodel定義の際にnameを決めてやる必要があります。

学習の書き方

compile同様にdict形式で各層ごとに別のものを与えてやることができます。


model.fit(x = {"input_1":x_train_1,"input_2":x_train_2},
          y={"output_1":x_train_1,"output_2":y_train}, 
          epochs=10000, 
          batch_size=8, 
          shuffle=True, 
          validation_data=({"input_1":x_val_1,"input_12":x_val_2}, {"output_1":x_val_1,"output_2":y_val}), 
          callbacks=[early_stopping]
         )

predictの際の注意点

predictをする際には出力は当たり前ですが定義した出力層の数だけ出てきます。そのため返り値を受け取る変数はその分用意しなければならないわけです。(例 : 出力層が2種類の場合は2つの変数が必要)
入力もdict形式で与えてやる必要があります。


pred_1 ,  pred_2 = model.predict({"input_1":x_test_1,"input_2":x_test_2})
以上でmultiple input outputなmodelの作成方法となります。