#マルチタスク学習とは
マルチタスク学習モデルとは、1つのネットワークで複数のタスクを解くモデルです。
今回は、1入力1出力のシングルタスク学習モデルから1入力2出力のマルチタスク学習モデルへ変更を行ったため、備忘録としてこの記事を残します。
#実行環境
- Python 3.6.10
- Keras 2.2.4
- tensorflow 1.14.0
#コードの変更点
###Sequential vs Functional API
シングルタスク学習モデルでは基本的にSequentialを使うことが多いが、マルチタスク学習モデルではFunctional APIを使う。そのため、コードはかなり変更する必要がある。
詳しくは以下の公式ドキュメントチェック。
###Sequentialを使ったモデル(変更前)
model = Sequential()
model.add(Bidirectional(LSTM(n_hidden, return_sequences=False, batch_input_shape=(None,799,1))))
model.add(BatchNormalization())
model.add(Dense(3))
model.add(Activation("linear"))
model.compile(loss="mean_absolute_error", optimizer="Adam", metrics=["accuracy"])
history = model.fit(X_train, y_train, batch_size=256, epochs= 120, validation_split=0.05)
###Functional APIを使ったモデル(変更後)
input1 = Input(shape = (799, 1))
layer1 = Bidirectional(LSTM(n_hidden))(input1)
layer2 = BatchNormalization()(layer1)
layer3_1 = Dense(2)(layer2)
out1= Activation("linear", name = 'out1')(layer3_1)
layer3_2 = Dense(1)(layer2)
out2= Activation("linear", name = 'out2')(layer3_2)
model = Model(inputs=input1, outputs=[out1, out2])
model.compile(optimizer='Adam',
loss={'out1': 'mean_absolute_error', 'out2': 'mean_absolute_error'},
loss_weights={'out1': 0.7, 'out2':0.2},
metrics=['accuracy'])
history = model.fit(X_train, [y_train1, y_train2], batch_size=256, epochs= 5, validation_split=0.05)
###変更するにあたって
- Functional APIを使うに当たって、新たにimportするものがいくつかあった(Input, Modelなど)
- モデルの出力を2つにするにあたり、学習データの出力も2つ
(y_train→[y_train1, y_train2])
にする。 - outputの名前をつけないと(コードのActivationのところ)、lossの定義のところでエラーが出るので注意。
- ロスのウェイトについては、チューニングが必要。今後また記事を出すかも。
- 1行目の
Input(shape = (799,1))
をinput1に代入後、shapeを確認すると(?, 799, 1)
となる(次元が一つ増える)。これでかなりの時間格闘したので、今後これについても記事にするかも。