您現在的位置是:首頁 > 垂釣

從未如此簡單,15分鐘就上手的神經網路構建方法

  • 由 讀芯術 發表于 垂釣
  • 2021-10-23
簡介匯入語句和資料集在這個簡單的範例中將用到幾個庫:· Pandas:用於資料載入和處理· Matplotlib: 用於資料視覺化處理· PyTorch: 用於模型訓練· Scikit-learn: 用於拆分訓練集和測試集圖源:unsplash

什麼網路技術上手快

全文共2392字,預計學習時長11分鐘

從未如此簡單,15分鐘就上手的神經網路構建方法

圖源:unsplash

人工智慧,深度學習,這些詞是不是聽起來就很高大上,充滿了神秘氣息?彷彿是隻對數學博士開放的高階領域?

錯啦!在B站已經變成學習網站的今天,還有什麼樣的教程是網上找不到的呢?深度學習從未如此好上手,至少實操部分是這樣。

假如你只是瞭解人工神經網路基礎理論,卻從未踏足如何編寫,跟著本文一起試試吧。你將會對如何在PyTorch 庫中執行人工神經網路運算,以預測原先未見的資料有一個基本的瞭解。

這篇文章最多10分鐘就能讀完;如果要跟著程式碼一步步操作的話,只要已經安裝了必要的庫,那麼也只需15分鐘。相信我,它並不難。

長話短說,快開始吧!

從未如此簡單,15分鐘就上手的神經網路構建方法

匯入語句和資料集

在這個簡單的範例中將用到幾個庫:

· Pandas:用於資料載入和處理

· Matplotlib: 用於資料視覺化處理

· PyTorch: 用於模型訓練

· Scikit-learn: 用於拆分訓練集和測試集

從未如此簡單,15分鐘就上手的神經網路構建方法

圖源:unsplash

如果僅僅是想複製貼上的話,以下幾條匯入語句可供參考:

import torchimport torch。nn as nnimport torch。nn。functional as Fimport pandas as pdimport matplotlib。pyplot as pltfrom sklearn。model_selection import train_test_split

至於資料集,Iris資料集可以在這個URL上找到。下面演示如何把它直接匯入

Pandas:iris = pd。read_csv(‘https://raw。githubusercontent。com/pandas-dev/pandas/master/pandas/tests/data/iris。csv’)iris。head()

前幾行如下圖所示:

從未如此簡單,15分鐘就上手的神經網路構建方法

現在需要將 Name列中鳶尾花的品種名稱更改或者重對映為分類值。——也就是0、1、2。以下是步驟說明:

mappings = { ‘Iris-setosa’: 0, ‘Iris-versicolor’: 1, ‘Iris-virginica’: 2}iris[‘Name’] = iris[‘Name’]。apply(lambda x: mappings[x])

執行上述程式碼得到的DataFrame如下:

從未如此簡單,15分鐘就上手的神經網路構建方法

這恭喜你,你已經成功地邁出了第一步!

從未如此簡單,15分鐘就上手的神經網路構建方法

拆分訓練集和測試集

在此環節,將使用 Scikit-Learn庫拆分訓練集和測試集。隨後, 將拆分過的資料由 Numpy arrays 轉換為PyTorchtensors。

從未如此簡單,15分鐘就上手的神經網路構建方法

圖源:unsplash

首先,需要將Iris 資料集劃分為“特徵”和“ 標籤集” ——或者是x和y。Name列是因變數而其餘的則是“特徵”(或者說是自變數)。

接下來筆者也將使用隨機種子,所以可以直接複製下面的結果。程式碼如下:

X = iris。drop(‘Name’, axis=1)。valuesy = iris[‘Name’]。valuesX_train, X_test, y_train, y_test = train_test_split(X,y, test_size=0。2, random_state=42)X_train = torch。FloatTensor(X_train)X_test = torch。FloatTensor(X_test)y_train = torch。LongTensor(y_train)y_test = torch。LongTensor(y_test)

如果從 X_train 開始檢查前三行,會得到如下結果:

從未如此簡單,15分鐘就上手的神經網路構建方法

從 y_train開始則得到如下結果:

從未如此簡單,15分鐘就上手的神經網路構建方法

地基已經打好,下一環節將正式開始搭建神經網路。

從未如此簡單,15分鐘就上手的神經網路構建方法

定義神經網路模型

模型的架構很簡單。重頭戲在於神經網路的架構:

1。輸入層 (4個輸入特徵(即X所含特徵的數量),16個輸出特徵(隨機))

2。全連線層 (16個輸入特徵(即輸入層中輸出特徵的數量),12個輸出特徵(隨機))

3。輸出層(12個輸入特徵(即全連線層中輸出特徵的數量),3個輸出特徵(即不同品種的數量)

大致就是這樣。除此之外還將使用ReLU 作為啟用函式。下面展示如何在程式碼裡執行這個啟用函式。

class ANN(nn。Module): def __init__(self): super()。__init__() self。fc1 =nn。Linear(in_features=4, out_features=16) self。fc2 =nn。Linear(in_features=16, out_features=12) self。output =nn。Linear(in_features=12, out_features=3) def forward(self, x): x = F。relu(self。fc1(x)) x = F。relu(self。fc2(x)) x = self。output(x) return x

PyTorch使用的面向物件宣告模型的方式非常直觀。在建構函式中,需定義所有層及其架構,若使用forward(),則需定義正向傳播。

接著建立一個模型例項,並驗證其架構是否與上文所指的架構相匹配:

model = ANN()model

在訓練模型之前,需註明以下幾點:

· 評價標準:主要使用 CrossEntropyLoss來計算損失

· 最佳化器:使用學習率為0。01的Adam 最佳化演算法

下面展示如何在程式碼中執行CrossEntropyLoss和Adam :

criterion = nn。CrossEntropyLoss()optimizer = torch。optim。Adam(model。parameters(), lr=0。01)

令人期盼已久的環節終於來啦——模型訓練!

從未如此簡單,15分鐘就上手的神經網路構建方法

模型訓練

這部分同樣相當簡單。模型訓練將進行100輪, 持續追蹤時間和損失。每10輪就向控制檯輸出一次當前狀態——以指出目前所處的輪次和當前的損失。

程式碼如下:

%%timeepochs = 100loss_arr = []for i in range(epochs):y_hat = model。forward(X_train)loss = criterion(y_hat, y_train)loss_arr。append(loss)if i % 10 == 0:print(f‘Epoch: {i} Loss: {loss}’)optimizer。zero_grad()loss。backward()optimizer。step()

好奇最後三行是幹嘛用的嗎?答案很簡單——反向傳播——權重和偏置的更新使模型能真正地“學習”。

以下是上述程式碼的執行結果:

從未如此簡單,15分鐘就上手的神經網路構建方法

進度很快——但不要掉以輕心。

如果對純數字真的不感冒,下圖是損失曲線的視覺化圖(x軸為輪次編號,y軸為損失):

從未如此簡單,15分鐘就上手的神經網路構建方法

模型已經訓練完畢,現在該幹嘛呢?當然是模型評估。需要以某種方式在原先未見的資料上對這個模型進行評估。

從未如此簡單,15分鐘就上手的神經網路構建方法

模型評估

在評估過程中,欲以某種方式持續追蹤模型做出的預測。需要迭代 X_test並進行預測,然後將預測結果與實際值進行比較。

這裡將使用 torch。no_grad(),因為只是評估而已——無需更新權重和偏置。

總而言之,程式碼如下:

preds = []with torch。no_grad(): for val in X_test: y_hat = model。forward(val) preds。append(y_hat。argmax()。item())

現在預測結果被儲存在 preds陣列。可以用下列三個值構建一個Pandas DataFrame。

· Y:實際值

· YHat: 預測值

· Correct:對角線,對角線的值為1表示Y和YHat相匹配,值為0則表示不匹配

程式碼如下:

df = pd。DataFrame({‘Y’: y_test, ‘YHat’:preds})df[‘Correct’] = [1 if corr == pred else 0 for corr, pred in zip(df[‘Y’],df[‘YHat’])]

df 的前五行如下圖所示:

從未如此簡單,15分鐘就上手的神經網路構建方法

下一個問題是,實際該如何計算精確度呢?

很簡單——只需計算 Correct列的和再除以 df的長度:

df[‘Correct’]。sum() / len(df)>>> 1。0

此模型對原先未見資料的準確率為100%。但需注意這完全是因為Iris資料集非常易於歸類,並不意味著對於Iris資料集來說,神經網路就是最好的演算法。NN對於這類問題來講有點大材小用,不過這都是以後討論的話題了。

從未如此簡單,15分鐘就上手的神經網路構建方法

圖源:unsplash

這可能是你寫過最簡單的神經網路,有著完美簡潔的資料集、沒有缺失值、層次最少、還有神經元!本文沒有什麼高階深奧的東西,相信你一定能夠掌握它。

從未如此簡單,15分鐘就上手的神經網路構建方法

留言點贊關注

我們一起分享AI學習與發展的乾貨

如轉載,請後臺留言,遵守轉載規範

Top