前提
tensorflow-kerasのsequentialモデルのMLPモデルにおいて、
所定回数(epoch)学習評価が終了後、少し変化した入力データに対して、同じモデルと直前までの学習データ(weight)とで、
再び学習させる(これを反復する)ことがしたいのですが、
これを行うためには、最後の学習データを保存し、再度それをロードする方法が、公式サイトを調べて浮かんでいます。
これではセーブ/ロード処理が無駄に見えます。
できれば、その損失時間の多寡は別にして、学習の開始にあたって、weightを初期設定せずに学習を開始できれば良いと思いますが、
公式サイトのsequentialモデルの項のメソッドやパラメータにはそれらしいのが見当たりませんでした(日本語サイトにて)。
この操作は可能なのでしょうか。あるいはMLPとは違うモデルで可能なのでしょうか。
試したこと
日本語の公式サイトを調べた。
本家のサイトの関係のありそうな
https://keras.io/api/layers/initializers/
を見てみましたが、このページには最後まで各種のinitialyzeの方法が書いてあるだけで、
例えばinitialyze=Noneなどと言う個所はありませんでした。
よく見るサンプルコードにはinitialyzeパラメータはなく、したがって、defaultのinitialyzeを行っていることになりますから、
initialyzeをさせないためには、何らかの抑止パラメータを必要だろうと思いました。。
> 学習の開始にあたって、weightを初期設定せずに学習を開始できれば
https://qiita.com/neptunium/items/a3a4e111c4049a6e1acf
の「二回立て続けに学習させた場合」によると、「model.fit()」を2回連続して実行した場合は、1回目の学習が終了した状態から2回目の学習が開始されるようです
> 少し変化した入力データに対して、同じモデルと直前までの学習データ(weight)とで、再び学習させる
「model.fit()」で指定する教師(学習)データを1回目と2回目で変えても、上記の「二回立て続けに学習させた場合」と同様に、1回目の学習が終了した状態から2回目の学習が開始されるかもしれません
またまた関係のありそうな記事をご紹介いただき、ありがとうございます。
なるほどそうかもしれませんね。
本家の記事は、initialyzeの方法だけでなく、initilyzeのタイミングも規定しているということは、次の部分なのでしょうか。
The keyword arguments used for passing initializers to layers depends on the layer.
Usually, it is simply kernel_initializer and bias_initializer:
英語は得意でないので、深く考えられませんでしたが、
そのkeywordが指定されることによって、initialyze機能を行う(passing)ということなのかな。
それで引用の記事を参考にすると、今回の目的は次のようにならべることかとおもいました。
model = Sequential()
model.add()
model.add()
model.add()
model.compile()
model.get_weights() #weigth更新の確認用
model.fit()
model.get_weights()
#データ更新
model.fit()
model.get_weights()
#データ更新
model.fit()
そもそも質問はMLPモデル(kerasでない)でしたが、kerasのsequentialモデルとを混同していたようです。
これから実際に調べて結果をここでお知らせします。
kerasのsequntialモデルの場合について調べました。
model = Sequential()
model.add(dense(256))
model.add(Dropout)
model.add(dense(softmax))
model.compile(SGD)
for offs in range(5):
----#model.get_weights() #weigth更新の確認用(今回は使用せず)
----history=model.fit(x_train[offs:],y_train[offs:]) #訓練データの開始位置を変更している
結果:
訓練データを少しずつ変えて 5回fitを反復させた。
1回目fitのepoch1回目のロスは大きくepoch2回目以降は減少していて、
2回目fitのepoch1回目以降は、最後のlossとあまり変わらないので(そのような特性の訓練データ)、
wieghtの変化を確認するまでもなく各回fitのweightは継続適用されていることがわかる。
Model: "sequential_7"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_13 (Dense) (None, 256) 16640
dropout_7 (Dropout) (None, 256) 0
dense_14 (Dense) (None, 15) 3855
=================================================================
Total params: 20,495
Trainable params: 20,495
Non-trainable params: 0
10epocch分のlossのリスト
offs 0 loss= [4.118412494659424, 2.6233770847320557, 2.4884963035583496, ... 2.298717737197876]
offs 1 loss= [2.3131299018859863, 2.303950071334839, 2.3082361221313477, ... 2.2688634395599365]
offs 2 loss= [2.2706689834594727, 2.2805964946746826, 2.25848650932312, ... 2.265894651412964]
offs 3 loss= [2.2610740661621094, 2.260964870452881, 2.2591965198516846, ... 2.255542039871216]
offs 4 loss= [2.2434709072113037, 2.238076686859131, 2.25534987449646, ... 2.2449545860290527]
MLPモデルの場合も同様の発想でこれから調べます。
kerasのMLPモデルでは多分次のようにすればよいのではと思われます。
(kerasでないMLPモデルとしたのは、間違いと思う)
model = MLP(100, p_out)
for offs in range(5) #少し変更したデータを指定するためのループ
----for epoch in range(epochs):
--------x_, y_ = shuffle(tr_x, tr_y, )
--------# 1ステップにおける訓練用ミニバッチを使用した学習
--------for step in range(tr_steps):
------------start = step * batch_size + offs
------------end = start + batch_size + offs
------------train_step(x_[start:end], y_[start:end]) # ミニバッチでバイアス、重みを更新して誤差を取得
このようにしてランすると、次のoffs時に残念ながらエラーとなりますが、質問の本質とは関係ないと思います。
これで、この質問はご紹介の記事(回答者さんの手順と同じように)に倣えば解決したと考えます。
ありがとうございました。
回答1件
あなたの回答
tips
プレビュー