歡迎您光臨本站 註冊首頁

淺談keras保存模型中的save()和save

←手機掃碼閱讀     limiyoyo @ 2020-06-11 , reply:0

今天做了一個關於keras保存模型的實驗,希望有助於大家瞭解keras保存模型的區別。

我們知道keras的模型一般保存為後綴名為h5的文件,比如final_model.h5。同樣是h5文件用save()和save_weight()保存效果是不一樣的。

我們用宇宙最通用的數據集MNIST來做這個實驗,首先設計一個兩層全連接網絡:

  inputs = Input(shape=(784, ))  x = Dense(64, activation='relu')(inputs)  x = Dense(64, activation='relu')(x)  y = Dense(10, activation='softmax')(x)     model = Model(inputs=inputs, outputs=y)

 

然後,導入MNIST數據訓練,分別用兩種方式保存模型,在這裡我還把未訓練的模型也保存下來,如下:

  from keras.models import Model  from keras.layers import Input, Dense  from keras.datasets import mnist  from keras.utils import np_utils     (x_train, y_train), (x_test, y_test) = mnist.load_data()  x_train=x_train.reshape(x_train.shape[0],-1)/255.0  x_test=x_test.reshape(x_test.shape[0],-1)/255.0  y_train=np_utils.to_categorical(y_train,num_classes=10)  y_test=np_utils.to_categorical(y_test,num_classes=10)     inputs = Input(shape=(784, ))  x = Dense(64, activation='relu')(inputs)  x = Dense(64, activation='relu')(x)  y = Dense(10, activation='softmax')(x)     model = Model(inputs=inputs, outputs=y)     model.save('m1.h5')  model.summary()  model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])  model.fit(x_train, y_train, batch_size=32, epochs=10)  #loss,accuracy=model.evaluate(x_test,y_test)     model.save('m2.h5')  model.save_weights('m3.h5')

 

如上可見,我一共保存了m1.h5, m2.h5, m3.h5 這三個h5文件。那麼,我們來看看這三個玩意兒有什麼區別。首先,看看大小:

m2表示save()保存的模型結果,它既保持了模型的圖結構,又保存了模型的參數。所以它的size最大的。

m1表示save()保存的訓練前的模型結果,它保存了模型的圖結構,但應該沒有保存模型的初始化參數,所以它的size要比m2小很多。

m3表示save_weights()保存的模型結果,它只保存了模型的參數,但並沒有保存模型的圖結構。所以它的size也要比m2小很多。

通過可視化工具,我們發現:(打開m1和m2均可以顯示出以下結構)

而打開m3的時候,可視化工具報錯了。由此可以論證, save_weights()是不含有模型結構信息的。

加載模型

兩種不同方法保存的模型文件也需要用不同的加載方法。

  from keras.models import load_model     model = load_model('m1.h5')  #model = load_model('m2.h5')  #model = load_model('m3.h5')  model.summary()

 

只有加載m3.h5的時候,這段代碼才會報錯。其他輸出如下:

可見,由save()保存下來的h5文件才可以直接通過load_model()打開!

那麼,我們保存下來的參數(m3.h5)該怎麼打開呢?

這就稍微複雜一點了,因為m3不含有模型結構信息,所以我們需要把模型結構再描述一遍才可以加載m3,如下:

  from keras.models import Model  from keras.layers import Input, Dense     inputs = Input(shape=(784, ))  x = Dense(64, activation='relu')(inputs)  x = Dense(64, activation='relu')(x)  y = Dense(10, activation='softmax')(x)     model = Model(inputs=inputs, outputs=y)  model.load_weights('m3.h5')

 

以上把m3換成m1和m2也是沒有問題的!可見,save()保存的模型除了佔用內存大一點以外,其他的優點太明顯了。所以,在不怎麼缺硬盤空間的情況下,還是建議大家多用save()來存。

注意!如果要load_weights(),必須保證你描述的有參數計算結構與h5文件中完全一致!什麼叫有參數計算結構呢?就是有參數坑,直接填進去就行了。我們把上面的非參數結構換了一下,發現h5文件依然可以加載成功,比如將softmax換成relu,依然不影響加載。

對於keras的save()和save_weights(),完全沒問題了吧

 


[limiyoyo ] 淺談keras保存模型中的save()和save已經有218次圍觀

http://coctec.com/docs/python/shhow-post-237977.html