Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
8
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

Kerasの重みの初期化タイミング

Kerasの重みの初期化タイミング

はじめに

ニューラルネットワークを使う際に、重みのよる初期化の違いを飽和するために複数回に渡って学習させなおし、平均した結果が欲しいことがあります。
しかし、自分が初心者のため、どこで重みの初期化が行われているかわからなかったので検証してみました。

結論

先に結論を書きます。
重みはレイヤーの追加時に初期化されてるようです。
公式のドキュメントにも書いてありました。
https://keras.io/ja/initializations/

このページは読んでいたのですが、初期化方法を定義するだけだと勘違いしていました。

二回立て続けに学習させた場合

#引数は見易さのため省略しています
model.fit()
model.fit()

このようにfitを二回行った場合は、重みは初期化されず、続けて学習されているようです。
2回目の学習のlossの値がほぼ変わらずに始まります。(1回目のEpochでは1.0以上のlossです)
スクリーンショット 2018-11-05 12.19.41.png

途中にcompileを挟む

#引数は見易さのため省略しています
model.fit()
model.compile()
model.fit()

きっとダメだろうな、と思いつつも実行。
スクリーンショット 2018-11-05 15.04.40.png
やっぱりダメでした。

レイヤーをもう一度追加

追記

この方法だと層が追加されているだけで上手くいかないことを教えていただきました
(追記終わり)

ここで、ようやく私は、公式ドキュメントに書いてあることが初期化法を定義しているだけではない、という考えに気がつきました。

#引数は見易さのため省略しています
for i in range(2):
        model.add()
        model.add()
        model.add()
        model.summary()
        model.compile()
        model.fit()

3.jpg

lossがちゃんと高くなっている……!
層が追加されているためにlossが高くなっていることをコメントで指摘していただきました。

層の初期化とレイヤの追加

for i in range(2):
        model = Sequential()
        model.add()
        model.add()
        model.add()
        model.summary()
        model.compile()
        model.fit()

modelを初期化してから、層を追加する必要があります。

おわりに

私の読解力に難ありでした。
もし間違っていたら、コメントいただけると嬉しいです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
8
Help us understand the problem. What are the problem?