質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

583閲覧

kerasのMLPモデルで学習開始時のweight初期化のon/offをする。

sigefuji

総合スコア123

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/09/18 07:07

前提

tensorflow-kerasのsequentialモデルのMLPモデルにおいて、
所定回数(epoch)学習評価が終了後、少し変化した入力データに対して、同じモデルと直前までの学習データ(weight)とで、
再び学習させる(これを反復する)ことがしたいのですが、
これを行うためには、最後の学習データを保存し、再度それをロードする方法が、公式サイトを調べて浮かんでいます。
これではセーブ/ロード処理が無駄に見えます。
できれば、その損失時間の多寡は別にして、学習の開始にあたって、weightを初期設定せずに学習を開始できれば良いと思いますが、
公式サイトのsequentialモデルの項のメソッドやパラメータにはそれらしいのが見当たりませんでした(日本語サイトにて)。
この操作は可能なのでしょうか。あるいはMLPとは違うモデルで可能なのでしょうか。

試したこと

日本語の公式サイトを調べた。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sigefuji

2022/09/18 09:33

本家のサイトの関係のありそうな https://keras.io/api/layers/initializers/ を見てみましたが、このページには最後まで各種のinitialyzeの方法が書いてあるだけで、 例えばinitialyze=Noneなどと言う個所はありませんでした。 よく見るサンプルコードにはinitialyzeパラメータはなく、したがって、defaultのinitialyzeを行っていることになりますから、 initialyzeをさせないためには、何らかの抑止パラメータを必要だろうと思いました。。
jbpb0

2022/09/18 14:07 編集

> 学習の開始にあたって、weightを初期設定せずに学習を開始できれば https://qiita.com/neptunium/items/a3a4e111c4049a6e1acf の「二回立て続けに学習させた場合」によると、「model.fit()」を2回連続して実行した場合は、1回目の学習が終了した状態から2回目の学習が開始されるようです > 少し変化した入力データに対して、同じモデルと直前までの学習データ(weight)とで、再び学習させる 「model.fit()」で指定する教師(学習)データを1回目と2回目で変えても、上記の「二回立て続けに学習させた場合」と同様に、1回目の学習が終了した状態から2回目の学習が開始されるかもしれません
sigefuji

2022/09/19 01:19

またまた関係のありそうな記事をご紹介いただき、ありがとうございます。 なるほどそうかもしれませんね。 本家の記事は、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モデルとを混同していたようです。 これから実際に調べて結果をここでお知らせします。
sigefuji

2022/09/19 03:39

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モデルの場合も同様の発想でこれから調べます。
sigefuji

2022/09/19 05:53

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時に残念ながらエラーとなりますが、質問の本質とは関係ないと思います。 これで、この質問はご紹介の記事(回答者さんの手順と同じように)に倣えば解決したと考えます。 ありがとうございました。
guest

回答1

0

ベストアンサー

学習の開始にあたって、weightを初期設定せずに学習を開始できれば

Kerasの重みの初期化タイミング
の「二回立て続けに学習させた場合」によると、「model.fit()」を2回連続して実行した場合は、1回目の学習が終了した状態から2回目の学習が開始されるようです

 

少し変化した入力データに対して、同じモデルと直前までの学習データ(weight)とで、再び学習させる

「model.fit()」で指定する教師(学習)データを1回目と2回目で変えても、上記の「二回立て続けに学習させた場合」と同様に、1回目の学習が終了した状態から2回目の学習が開始されるかもしれません

投稿2022/09/21 01:59

jbpb0

総合スコア7651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問