第10章 專案 多類花朵分類

2021-09-20 12:21:46 字數 3917 閱讀 4984

本章我們使用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-setosairis-versicoloriris-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)
這樣我們就可以在資料集(xdummy_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 類的組成 類宣告 資料成員描述資料部分 成員函式 方法 描述公有介面,一般放於標頭檔...