#Kerasの重みの初期化タイミング
##はじめに
ニューラルネットワークを使う際に、重みのよる初期化の違いを飽和するために複数回に渡って学習させなおし、平均した結果が欲しいことがあります。
しかし、自分が初心者のため、どこで重みの初期化が行われているかわからなかったので検証してみました。
##結論
先に結論を書きます。
重みはレイヤーの追加時に初期化されてるようです。
公式のドキュメントにも書いてありました。
https://keras.io/ja/initializations/
このページは読んでいたのですが、初期化方法を定義するだけだと勘違いしていました。
##二回立て続けに学習させた場合
#引数は見易さのため省略しています
model.fit()
model.fit()
このようにfitを二回行った場合は、重みは初期化されず、続けて学習されているようです。
2回目の学習のlossの値がほぼ変わらずに始まります。(1回目のEpochでは1.0以上のlossです)
##途中にcompileを挟む
#引数は見易さのため省略しています
model.fit()
model.compile()
model.fit()
きっとダメだろうな、と思いつつも実行。
やっぱりダメでした。
##レイヤーをもう一度追加
###追記
この方法だと層が追加されているだけで上手くいかないことを教えていただきました
(追記終わり)
ここで、ようやく私は、公式ドキュメントに書いてあることが初期化法を定義しているだけではない、という考えに気がつきました。
#引数は見易さのため省略しています
for i in range(2):
model.add()
model.add()
model.add()
model.summary()
model.compile()
model.fit()
lossがちゃんと高くなっている……!
層が追加されているためにlossが高くなっていることをコメントで指摘していただきました。
##層の初期化とレイヤの追加
for i in range(2):
model = Sequential()
model.add()
model.add()
model.add()
model.summary()
model.compile()
model.fit()
modelを初期化してから、層を追加する必要があります。
##おわりに
私の読解力に難ありでした。
もし間違っていたら、コメントいただけると嬉しいです。