一、使用pip安裝好tensorflow
二、使用pip安裝好Keras
三、構建過程:
1 導入數據
2 定義模型
3 編譯模型
4 訓練模型
5 測試模型
6 寫出程序
1.導入數據
使用皮馬人糖尿病數據集(Pima Indians onset of diabetes)(自行百度,google下載數據集)
數據集的內容是皮馬人的醫療記錄,以及過去5年內是否有糖尿病。所有的數據都是數字,問題是(是否有糖尿病是1或0),是二分類問題。數據的數量級不同,有8個屬性:
- 懷孕次數
- 2小時口服葡萄糖耐量試驗中的血漿葡萄糖濃度
- 舒張壓(毫米汞柱)
- 2小時血清胰島素(mu U/ml)
- 體重指數(BMI)
- 糖尿病血系功能
- 年齡(年)
- 類別:過去5年內是否有糖尿病
所有的數據都是數字,可以直接導入Keras。
導入資料
使用隨機梯度下降時最好固定隨機數種子,這樣你的代碼每次運行的結果都一致。這種做法在演示結果、比較算法或debug時特別有效。你可以隨便選種子:
# fix random seed for reproducibility seed = 7 numpy.random.seed(seed)
現在導入皮馬人數據集。NumPy的loadtxt()
函數可以直接帶入數據,輸入變量是8個,輸出1個。導入數據后,我們把數據分成輸入和輸出兩組以便交叉檢驗:
# load pima indians dataset dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",") # split into input (X) and output (Y) variables X = dataset[:,0:8] Y = dataset[:,8]
2 定義模型
Keras的模型由層構成:我們建立一個Sequential
模型,一層層加入神經元。第一步是確定輸入層的數目正確:在創建模型時用input_dim
參數確定。例如,有8個輸入變量,就設成8。
隱層怎么設置?這個問題很難回答,需要慢慢試驗。一般來說,如果網絡夠大,即使存在問題也不會有影響。這個例子里我們用3層全連接網絡。
全連接層用Dense
類定義:第一個參數是本層神經元個數,然后是初始化方式和激活函數。這里的初始化方法是0到0.05的連續型均勻分布(uniform
),Keras的默認方法也是這個。也可以用高斯分布進行初始化(normal
)。
前兩層的激活函數是線性整流函數(relu
),最后一層的激活函數是S型函數(sigmoid
)。之前大家喜歡用S型和正切函數,但現在線性整流函數效果更好。為了保證輸出是0到1的概率數字,最后一層的激活函數是S型函數,這樣映射到0.5的閾值函數也容易。前兩個隱層分別有12和8個神經元,最后一層是1個神經元(是否有糖尿病)。
# create model model = Sequential() model.add(Dense(12, input_dim=8, init='uniform', activation='relu')) model.add(Dense(8, init='uniform', activation='relu')) model.add(Dense(1, init='uniform', activation='sigmoid')) # 現在Keras使用API 2.0版本,所以上述的init需要改為kernel_initializer
3 編譯模型
定義好的模型可以編譯:Keras會調用TensorFlow編譯模型。后端會自動選擇表示網絡的最佳方法,配合你的硬件。這步需要定義幾個新的參數。訓練神經網絡的意義是:找到最好的一組權重,解決問題。
我們需要定義損失函數和優化算法,以及需要收集的數據。我們使用binary_crossentropy
,錯誤的對數作為損失函數;adam
作為優化算法,因為這東西好用。
# Compile model model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # Fit the model # metrics=['accuracy'] 評價函數,用來度量模型,該訓練的評估結果不參與更新權重的運算
4 訓練模型
調用模型的fit()
方法即可開始訓練
網絡按輪訓練,通過nb_epoch
參數控制。每次送入的數據(批尺寸)可以用batch_size
參數控制。這里我們只跑150輪,每次10個數據。
# Fit the model model.fit(X, Y, nb_epoch=150, batch_size=10) # 現在Keras API 2.0版本已經將nb_epoch改為了epochs
5 測試模型
我們把測試數據拿出來檢驗一下模型的效果。注意這樣不能測試在新數據的預測能力。應該將數據分成訓練和測試集。
調用模型的evaluation()
方法,傳入訓練時的數據。輸出是平均值,包括平均誤差和其他的數據,例如准確度。
# evaluate the model scores = model.evaluate(X, Y) print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))
6 寫出程序
import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' # Create first network with Keras from keras.models import Sequential from keras.layers import Dense import numpy # fix random seed for reproducibility seed = 7 numpy.random.seed(seed) # load pima indians dataset dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",") # split into input (X) and output (Y) variables X = dataset[:,0:8] Y = dataset[:,8] # create model model = Sequential() model.add(Dense(12, input_dim=8, kernel_initializer='uniform', activation='relu')) model.add(Dense(8, kernel_initializer='uniform', activation='relu')) model.add(Dense(1, kernel_initializer='uniform', activation='sigmoid')) # Compile model model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # Fit the model model.fit(X, Y, epochs=150, batch_size=10) # evaluate the model scores = model.evaluate(X, Y) print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100)) # 在開頭加上 #import os #os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' # 是因為我的CPU支持AVX擴展,但是安裝的TensorFlow版本無法編譯使用。所以使用上面兩行代碼直接將警告忽略。
# 編譯TensorFlow源碼
# 如果沒有GPU並且希望盡可能多地利用CPU,那么如果CPU支持AVX,AVX2和FMA,則應該從針對CPU優化的源構建tensorflow。
訓練時每輪會輸出一次損失和正確率,以及最終的效果
總結:
- 如何導入數據
- 如何用Keras定義神經網絡
- 如何調用后端編譯模型
- 如何訓練模型
- 如何測試模型