使用Keras開發神經網絡


一、使用pip安裝好tensorflow

二、使用pip安裝好Keras

三、構建過程:

1 導入數據

2 定義模型

3 編譯模型

4 訓練模型

5 測試模型

6 寫出程序

 

1.導入數據

使用皮馬人糖尿病數據集(Pima Indians onset of diabetes)(自行百度,google下載數據集)

數據集的內容是皮馬人的醫療記錄,以及過去5年內是否有糖尿病。所有的數據都是數字,問題是(是否有糖尿病是1或0),是二分類問題。數據的數量級不同,有8個屬性:

  1. 懷孕次數
  2. 2小時口服葡萄糖耐量試驗中的血漿葡萄糖濃度
  3. 舒張壓(毫米汞柱)
  4. 2小時血清胰島素(mu U/ml)
  5. 體重指數(BMI)
  6. 糖尿病血系功能
  7. 年齡(年)
  8. 類別:過去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定義神經網絡
  • 如何調用后端編譯模型
  • 如何訓練模型
  • 如何測試模型


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM