本章我們使用keras為多類分類開發並驗證乙個神經網路。本章包括:
我們開始吧。
10.1 鳶尾花分類資料集
本章我們使用經典的鳶尾花資料集。這個資料集已經被充分研究過,4個輸入變數都是數字,量綱都是厘公尺。每個資料代表花朵的不同引數,輸出是分類結果。資料的屬性是(厘公尺):
萼片長度
萼片寬度
花瓣長度
花瓣寬度
類別 這個問題是多類分類的:有兩種以上的類別需要**,確切的說,3種。這種問題需要對神經網路做出特殊調整。資料有150條:前5行是:
5.1,3.5,1.4,0.2,iris-setosa
4.9,3.0,1.4,0.2,iris-setosa
4.7,3.2,1.3,0.2,iris-setosa
4.6,3.1,1.5,0.2,iris-setosa
5.0,3.6,1.4,0.2,iris-setosa
10.2 導入庫和函式
我們匯入所需要的庫和函式,包括深度學習包keras、資料處理包pandas和模型測試包scikit-learn。
import numpy
import pandas
from keras.models import sequential
from keras.layers import dense
from keras.utils import np_utils
from sklearn.cross_validation import cross_val_score
from sklearn.cross_validation import kfold
from sklearn.preprocessing import labelencoder
from sklearn.pipeline import pipeline
10.3 指定隨機數種子
我們指定乙個隨機數種子,這樣重複執行的結果會一致,以便復現隨機梯度下降的結果:
# fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)
10.4 匯入資料
資料可以直接匯入。因為資料報含字元,用pandas更容易。然後可以將資料的屬性(列)分成輸入變數(x)和輸出變數(y):
# load dataset
dataframe = pandas.read_csv("iris.csv", header=none)
dataset = dataframe.values
x = dataset[:,0:4].astype(float)
y = dataset[:,4]
10.5 輸出變數編碼
資料的型別是字串:在使用神經網路時應該將類別編碼成矩陣,每行每列代表所屬類別。可以使用獨熱編碼,或者加入一列。這個資料中有3個類別:iris-setosa
、iris-versicolor
和iris-virginica
。如果資料是
iris-setosa
iris-versicolor
iris-virginica
用獨熱編碼可以編碼成這種矩陣:
iris-setosa, iris-versicolor, iris-virginica 1, 0, 0
0, 1, 0
0, 0, 1
scikit-learn的labelencoder
可以將類別變成數字,然後用keras的to_categorical()
函式編碼:
# encode class values as integers
encoder = labelencoder()
encoder.fit(y)
encoded_y = encoder.transform(y)
# convert integers to dummy variables (i.e. one hot encoded)
dummy_y = np_utils.to_categorical(encoded_y)
10.6 設計神經網路
keras提供了kerasclassifier
,可以將網路封裝,在scikit-learn上用。kerasclassifier
的初始化變數是模型名稱,返回供訓練的神經網路模型。
我們寫乙個函式,為鳶尾花分類問題建立乙個神經網路:這個全連線網路只有1個帶有4個神經元的隱層,和輸入的變數數相同。為了效果,隱層使用整流函式作為啟用函式。因為我們用了獨熱編碼,網路的輸出必須是3個變數,每個變數代表一種花,最大的變數代表**種類。網路的結構是:
4個神經元 輸入層 -> [4個神經元 隱層] -> 3個神經元 輸出層
輸出層的函式是s型函式,把可能性對映到概率的0到1。優化演算法選擇adam隨機梯度下降,損失函式是對數函式,在keras中叫categorical_crossentropy
:
# define baseline model
defbaseline_model
():# create model
model = sequential()
model.add(dense(4, input_dim=4, init='normal', activation='relu')) model.add(dense(3, init='normal', activation='sigmoid'))
# compile model
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) return model
可以用這個模型建立kerasclassifier
,也可以傳入其他引數,這些引數會傳遞到fit()
函式中。我們將訓練次數nb_epoch
設成150,批尺寸batch_size
設成5,verbose
設成0以關閉除錯資訊:
estimator = kerasclassifier(build_fn=baseline_model, nb_epoch=200, batch_size=5, verbose=0)
10.7 用k折交叉檢驗測試模型
現在可以測試模型效果了。scikit-learn有很多種辦法可以測試模型,其中最重要的就是k折檢驗。我們先設定模型的測試方法:k設為10(預設值很好),在分割前隨機重排資料:
kfold = kfold(n=len(x), n_folds=10, shuffle=true, random_state=seed)
這樣我們就可以在資料集(x
和dummy_y
)上用10折交叉檢驗(kfold
)測試效能了。模型需要10秒鐘就可以跑完,每次檢驗輸出結果:
results = cross_val_score(estimator, x, dummy_y, cv=kfold)
print("accuracy: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))
輸出結果的均值和標準差,這樣可以驗證模型的**能力,效果拔群:
baseline: 95.33% (4.27%)
10.8 總結
本章關於使用keras開發深度學習專案。總結一下:
第10章專案2 總是多一次
問題及 除錯前 檔名稱 main.c 完成日期 2018年2月12日 版本號 v1.0 問題描述 總是多一次 輸入描述 輸入字母 程式輸出 無 includevoid dosomething int p int main return 0 void dosomething int p 完成特定的業務...
PMP 第10章 專案溝通管理
有效溝通 以正確的形式,再正確的時間把資訊提供給正確的受眾,並且使資訊產生正確的影響。夏略特煩惱 10.1 規劃溝通管理 10.2 管理溝通 10.3 監督溝通 溝通的方式 內部 外部 專案 正式 非正式 垂直 水平 官方 非官方 書面 口頭 言語 體語 喬哈里窗 1.正確的拼寫方式 2簡潔的表述無...
C Prime Plus 第10章 物件和類
抽象 封裝 將實現細節放在一起並將它們與抽象分開被稱為封裝,種類 1 資料隱藏 2 將類函式定義和類宣告放在不同檔案中 和資料隱藏 將資料封裝到私有部分從而保護資料的完整性稱為資料隱藏 多型繼承 的可重用性 2.1 類的組成 類宣告 資料成員描述資料部分 成員函式 方法 描述公有介面,一般放於標頭檔...