tensorflow學習筆記六——keras模組
機器環境為ubuntu14.04LTS+tensorflow1.8.0
1.Keras模組配置
Keras模組是tensorflow提供的一個高階api,主要有以下優點:使用者友好,一致性強,通過keras模組可以更方便、快捷地構建神經網路模型。keras預設儲存訓練好的神經網路的權重的方式是斷點,如果要使用h5格式,需要指定。
#引入tensorflow、keras模組
import tensorflow as tf
from tensorflow import keras
#設定網路權重儲存檔案格式
#用來儲存訓練好的神經網路
save_format='h5'
2.建立模型
keras模組通過指定神經網路中的層來建立模型。一個神經網路的模型通常是層的計算圖。最常見的神經網路模型
是順序型,即神經網路層的堆疊。
#建立神經網路模型
#指定順序模型
model=keras.Sequential()
#新增層1 64節點 relu啟用函式
model.add(keras.layers.Dense(64,activation='relu',input_shape=(1000,)))
#新增層2 64節點 relu啟用函式
model.add(keras.layers.Dense(64,activation='relu'))
#新增層3 輸出層 10節點 softmax啟用函式
model.add(keras.layers.Dense(10,activation='softmax'))
#列印神經網路模型
#注意,要使用summary()列印網路模型,需要指定層1的輸入維度
model.summary()
#指定順序模型的另一種語法
#將每一層的引數作為順序模型建構函式的引數
#反斜槓'\'代表換行符
'''
model=keras.Sequential([\
keras.layers.Dense(64,activation='relu',input_shape=(1000,)),\
keras.layers.Dense(64,activation='relu')],\
keras.layers.Dense(10,activation='softmax'))
'''
計算圖:神經網路的模型與層還有節點的關係,add()新增的層是非輸入層,因為輸入層
只需要指定輸入節點,Dense層是全連線層,全連線層的意思是前一層的某個節點與下一層
的所有節點都有連線,這樣輸入變數的維度是1000,隱藏層1有64個節點,有(1000+1)×64
=64064個權重需要根據訓練集(及對應標籤)優化,隱藏層1(64節點)與隱藏層2(64節點)
之間有(64+1)*64=4160個權重需要根據訓練集(及對應標籤)優化,隱藏層2(64節點)與
輸出層(10節點)之間有(64+1)×10=650個權重需要根據訓練集(及對應標籤)優化。
啟用函式:啟用函式的作用是使模型具有處理非線性資料的能力,如果模型的所有關係都
是線性加權,那麼模型無法處理非線性資料。在計算圖中,節點是計算,節點間的連線表明了
此計算與上一級計算的依賴關係。以上所有層間的權重都可以分別設定為可優化(利用訓練集
改變其值)和不可優化(常數)。
前向傳播演算法:輸入-隱藏層1-隱藏層2-...-輸出層,利用當前權重,將輸入資料按神經網路
前進方向計算。即由輸入值計算輸出值。
反向傳播演算法:由前向傳播演算法得到的輸出值與標籤做比較,按神經網路的反向,修改每
一層的權重。
正則化選項:表徵資料複雜程度的引數,防止複雜(隱藏層多,隱藏層的節點多)的神經
網路模型過度擬合訓練集資料,而導致在測試集上的表現不好。
3.神經網路層的引數
對於神經網路的每一層,有以下引數需要指定:層間的連線方式、層的節點數、啟用函式、
正則化選項。
#指定某一層的引數
#建立非線性層(relu) 全連線 64節點
keras.layers.Dense(64,activation='relu')
#建立線性層 全連線 64節點 L1正則化
keras.layers.Dense(64,kernel_regularizer=keras.regularizers.l1(0.01))
#建立線性層 全連線 64節點 L2正則化
keras.layers.Dense(64,bias_regularizer=keras.regularizers.l2(0.01))
4.訓練和評估神經網路
訓練神經網路
#指定優化器,損失函式和引數
#損失函式為前向傳播的計算值與標籤值差異的計算方法
#引數metrics可以選為準確度或是交叉熵
model.compile(optimizer=tf.train.AdamOptimizer(0.001),loss=\
'categorical_crossentropy',metrics=['accuracy'])
#指定了模型的訓練引數後需要將資料匯入模型中
#資料可以使用公開資料集 也可以使用自己的實驗資料
#對於曲線擬合,可以使用numpy生成一個函式的輸入輸出真值作為測試集,使用噪聲生成
#一組資料作為訓練集
#這裡只為了說明神經網路的訓練過程 使用隨機數資料集
#使用numpy隨機生成訓練集
import numpy as np
#訓練集有1000個數據,每個資料有32位,共有10個標籤,每個
#資料對應一個標籤
train_data=np.random((1000,32))
train_labels=np.random((1000,10))
model.fit(train_data,trian_labels,epochs=10,batch_size=32)
建立一個分類問題的訓練集,共有1000個數據,每個資料有32個因素,共有10個標籤
每個資料對應一個標籤。
使用訓練集資料和訓練集標籤訓練模型,訓練輪數為10,每一輪訓練使用32個數據。
batch_size指定了每一輪訓練使用的資料量,對於輸入資料太多的情況,每一輪都使用所有
輸入資料會導致計算代價太大,而且模型也容易過度擬合訓練資料。因此一個比較好的方法是
在每一輪訓練中使用一組訓練集資料而不是所有資料。
評估神經網路
#增加驗證集並指定使用驗證集訓練模型
'''
val_data=np.random((1000,32))
val_labels=np.random((1000,10))
model.fit(train_data,train_labels,epochs=10,batch_size=32,\
validation_data=(val_data,val_labels))
'''
#在測試集上評估模型
test_data=np.random((500,32))
test_labels=np.random((500,10))
model.evaluate(test_data,test_labels)
#使用模型做預測
model.predict(test_data)
多輸入所輸出模型上文已經提到,在隱藏層1中指定輸入節點個數就指定了輸入值的維度,
在輸出層中指定節點個數就指定了輸出值的維度。如果要自己指定前向傳播過程,那麼需要對model類
進行繼承,自行指定前向傳播演算法,同樣的,如果要自行指定層,也需要對layers進行繼承並自定義。
神經網路的訓練中,如果想在每一輪訓練完成列印當前進度或是一些損失值,準確度等有用資訊,那麼
需要指定回撥函式。這裡直接貼出官網的程式碼。
自定義模型:
函式定義:
呼叫方法:
自定義層:
函式定義:
呼叫方法:
自定義回撥函式:
函式定義:
呼叫方法:
關於回撥函式的使用在前面教程有例項。
5.儲存和載入神經網路
只儲存權重(即訓練好的神經網路):
#儲存權重到斷點檔案,斷點檔案為tensorflow預設的權重儲存方法
#上文提到可以指定為h5檔案 ./代表儲存到當前路徑
model.save_weights('./my_model')
#讀取權重檔案到新的神經網路,要求讀取的網路結構和新的網路相同
model.load_weights('my_model')
#使用h5檔案儲存權重
model.save('my_model.h5',save_format='h5')
#讀取h5檔案到新的網路,同樣要求結構相同
model.load_weights('my_model.h5')
只儲存模型配置(即模型結構)
#儲存神經網路模型結構
#使用json格式儲存已有網路結構
json_string=model.to_json()
#讀取json檔案建立新的神經網路
fresh_model=keras.models.from_json(json_string)
#使用YAML格式儲存已有網路結構
yaml_string=model.to_yaml()
#讀取yaml格式檔案建立新的神經網路
fresh_model=keras.models.from_yaml(yaml_string)
6.完整過程
1.建立模型(輸入維度,模型層數,層的節點數,啟用函式,正則化選項,層間連線方法等)2.定義訓練過程(優化器,損失函式,評估量等)
3.訓練模型(指定訓練集及標籤,驗證集及標籤或驗證集的分割率(可選),輪數,回撥函式等)
4.儲存訓練好的模型或是網路結構
5.建立新的網路載入儲存的資料