1. 程式人生 > >keras上手系列之: 模型的儲存

keras上手系列之: 模型的儲存

如何將訓練好的網路進行儲存以便以後使用, 進行後續的研究呢?
首先,定義一個簡單的LSTM模型:

from keras.models import Sequential
from keras.layers import LSTM, Dense
model = Sequential()
model.add(LSTM(4,input_shape=(1,8)))
model.add(Dense(1))

整體儲存模型及引數

首先,安裝python的h5py包.
sudo pip3 install h5py
之後呼叫model.save(filepath)將Keras模型和權重儲存在一個HDF5檔案中,該檔案將包含:
- 模型的結構,以便重構該模型
- 模型的權重
- 訓練配置(損失函式,優化器等)
- 優化器的狀態,以便於從上次訓練中斷的地方開始
使用keras.models.load_model(filepath)

來重新例項化之前訓練好的模型,如果檔案中儲存了訓練配置的話,該函式還會同時完成模型的編譯

from keras.models import load_model
model.save('my_model.h5')  # creates a HDF5 file 'my_model.h5'
del model  # deletes the existing model
# returns a compiled model identical to the previous one
model = load_model('my_model.h5')

只儲存模型的結構

可以用model.to_jason()將模型序列化儲存為json檔案.

# save as JSON
json_string = model.to_json()

例如上面LSTM網路的json_string就是:

json_string
Out[10]: '{"class_name": "Sequential", "config": [{"class_name": "LSTM", "config": {"name": "lstm_1", "trainable": true, "batch_input_shape": [null, 1, 8], "dtype": "float32", "return_sequences": false, "return_state"
: false, "go_backwards": false, "stateful": false, "unroll": false, "implementation": 0, "units": 4, "activation": "tanh", "recurrent_activation": "hard_sigmoid", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "recurrent_initializer": {"class_name": "Orthogonal", "config": {"gain": 1.0, "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "unit_forget_bias": true, "kernel_regularizer": null, "recurrent_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "recurrent_constraint": null, "bias_constraint": null, "dropout": 0.0, "recurrent_dropout": 0.0}}, {"class_name": "Dense", "config": {"name": "dense_1", "trainable": true, "units": 1, "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}], "keras_version": "2.0.8", "backend": "tensorflow"}'

裡面記錄了網路的整體結構, 各個層的引數設定等資訊. 將json字串儲存到檔案.

open('my_model_architecture.json','w').write(json_string)

當然,你也可以從儲存好的json檔案或yaml檔案中載入模型:

# 讀取json檔案
from keras.models import model_from_json
json_string = open('my_model_architecture.json').read()
model = model_from_json(json_string)

除了json格式,還可以儲存為yaml格式的字串:

# save as YAML
yaml_string = model.to_yaml()
# 類似地,讀取yaml檔案
from keras.models import model_from_yaml
model = model_from_yaml(yaml_string)

儲存模型權重等配置資訊

經過調參後網路的輸出精度比較滿意後,可以將訓練好的網路權重引數儲存下來.
可通過下面的程式碼利用HDF5進行儲存
model.save_weights(‘my_model_weights.h5’)

以後用的時候可以像這樣載入模型:
model.load_weights(‘my_model_weights.h5’)

如果你需要載入權重到不同的網路結構(有些層一樣)中,例如fine-tune或transfer-learning,你可以通過層名字來載入模型:
model.load_weights('my_model_weights.h5', by_name=True)
首先在建模時,最好對每一層都指定名字, 例如:

# 定義模型
model = Sequential()
model.add(LSTM(4, input_shape=(1, 8), name="lstm_old"))
model.add(Dense(1, name="dense_old"))
...
model.save_weights('my_model_weights.h5')

# 新模型, 過載了前一個模型訓練好的LSTM層

model_new = Sequential()
model_new.add(LSTM(4, input_shape=(1, 8), name="lstm_old"))  # will be loaded
model_new.add(Dense(10, name="dense_new"))  # will not be loaded

# 載入LSTM層訓練好的引數
model.load_weights('my_model_weights.h5', by_name=True)

相關推薦

keras上手系列: 模型儲存

如何將訓練好的網路進行儲存以便以後使用, 進行後續的研究呢? 首先,定義一個簡單的LSTM模型: from keras.models import Sequential from keras.layers import LSTM, Dense model

機器學習實踐(十六)—sklearn模型儲存和載入

一、sklearn - 模型的儲存和載入 - API from sklearn.externals import joblib 儲存 joblib.dump(rf, ‘test.pkl’) 載入 estimator

redis 原理系列--字串儲存的實現原理(1)

背景 redis功能強大,幾乎已經成了現代大中型服務必備的快取技術了。 除了十分給力的快取功能,redis當做訊息佇列,資料庫也有著不錯的表現。 我們都知道,redis 有五種資料型別,string,list, hash, set 和zset。 其中 最基本的,同時也是最常用的 就是string了。 本

Spring MVC系列模型繫結(SpringBoot)(七)

前言 上一節我們在SpringBoot中啟用了Spring MVC最終輸出了HelloWorld,本節我們來講講Spring MVC中的模型繫結,這個名稱來源於.NET或.NET Core,不知是否恰當,我們暫且這樣理解吧。 @RequestParam VS  @PathVariable &n

keras系列儲存與複用模型

keras 模型儲存與複用 這個部落格寫的很好,大體上參考這個 注意checkpoint的使用 ############################### from keras.models import load_model model.save('m

5Python全棧系列Django模型

模型續Python全棧之路系列之Django模型續連表操作一對一在app的models.py文件內添加以下內容用戶創建一對多關系的表:from django.db import models # Create your models here. class UserType(models.Model):

Tensorflow模型引數的Saver儲存讀取

一、Saver儲存 import tensorflow as tf import numpy as np #定義W和b W = tf.Variable([[1,2,3],[3,5,6]],dtype = tf.float32,name = 'weight') b = tf.Variable([

MySQL基礎系列 儲存過程和函式

摘要:儲存過程和函式是事先經過編譯並存儲在資料庫中的一段SQL語句的集合 儲存過程無返回值,函式有返回值 儲存過程的引數可以使用IN、OUT、INOUT,函式只能使用IN 建立儲存過程 CREATE PROCEDURE 建立函式使用 CREATE FUNCTION 使用CALL語句來呼叫

長短期記憶(LSTM)系列_3.1~3.3、第一個LSTM小例子:Keras中長短期記憶模型的5個核心步驟(python)

  本文是演示了一個最簡單的LSTM模型的構建,以0.1~0.9序列為例,做了一個預測的小例項,文章最後我新增了一個測試集,重新使用訓練的模型進行一次預測,詳細程式碼以及註釋見文末。 後續的3.2和3.3課程是一組課程的學習目錄,以及作者自己新書的推薦,3.2章節會在後續學習中更新

MySQL基礎系列 記一次利用儲存過程實現2600萬資料水平分表

日常開發中我們經常會遇到大表的情況,所謂的大表是指儲存了百萬級乃至千萬級條記錄的表。這樣的表過於龐大,導致資料庫在查詢和插入的時候耗時太長,效能低下,如果涉及聯合查詢的情況,效能會更加糟糕。分表的目的就是減少資料庫的負擔,提高資料庫的效率,通常點來講就是提高表的增刪改查效率,本文將介紹我

機器學習實戰系列:sklearn 中模型儲存的兩種方法

一、 sklearn中提供了高效的模型持久化模組joblib,將模型儲存至硬碟。 from sklearn.externals import joblib #lr是一個LogisticRegression模型 joblib.dump(lr, 'lr.model') lr =

無監督學習-聚類系列常見模型

聚類是一個大的家族,常見的分類有6種,而各種聚類又有許多變型,這裡總結下常見聚類及其原理。在此只是為了方便自己記憶而寫的總結,當中有借鑑一些前輩的筆記,感激前輩。 1、劃分聚類: k—means演算法步驟: (1)提前假設k個簇,對於實際問題會有一些啟發式的選取

Keras模型儲存筆記

整理自Keras官方文件 https://keras-cn.readthedocs.io/en/latest/for_beginners/FAQ/#save_model https://keras-cn.readthedocs.io/en/latest/other/c

tensorflow 模型儲存(save)、恢復/載入(restore)

  1、什麼是 tensorflow 模型 當你訓練完一個神經網路,你可能會想要儲存這個網路,以便將來拿來使用或直接用於其他資料的 deploy, tensorflow 模型包括:已訓練並優化的權重引數,網路結構和 graph。 tensorflow 模型檔案包括兩大塊:

關於 keras.callbacks設定模型儲存策略

keras.callbacks.ModelCheckpoint(self.checkpoint_path, verbose=0, save_weights_only=True,mode="max",save_best_only=True

theano學習模型儲存和提取

今天學習如何儲存神經網路,以方便日後可以直接提取使用。 儲存的方式是我們可以先把神經網路的引數,比如說 weights 還有 bias 儲存起來,再重新定義神經網路的結構,使用模型的時候需要把引數 set 到結構中去。 儲存和提取的方法是利用 shared 變數的 get 功能,拿出變數值儲

領域驅動系列模型驅動

1、常規以類圖作為領域模型開發存在的問題 傳統型以技術為驅動的團隊,往往喜歡通過類圖來展示產品的模型,這樣的模型往往存N個物件,這些物件往往存在複雜的關聯,產品的創始人,可能能理解整個產品的架構思路,但是如果是新成員,想通過類圖去了解該產品,那幾乎是不可能的.往往最後還是需要領域專家進行溝通,在結合程式碼,

keras上手:與tensorflow混合程式設計 (tensorboard)

tensorflow具備許多優秀的函式和功能,比如tensorboard,keras作為tensorflow的高階API, 封裝很多tensorflow的程式碼,使得程式碼模組化,非常方便。 當然,由於keras的模型和層與tensorflow的張量高度相容,可以用kera

Keras框架訓練模型儲存及再載入

實驗資料MNIST 初次訓練模型並儲存 import numpy as np from keras.datasets import mnist from keras.utils import n

keras模型儲存的3種形式

目錄 一、儲存整個模型 二、儲存模型結構 三、儲存模型權重 一、儲存整個模型 model.save(filepath)將Keras模型和權重儲存在一個HDF5檔案中,該檔案將包含: 模型的結構 模型的權重 訓練配置(損失函式,優化器,準確率等) 優