從零開始,用PyTorch學會線性迴歸、邏輯迴歸及影象分類
2021-12-24由 新智元 發表于 林業
迴歸模型中的mse是什麼
【新智元導讀】
本文透過詳實的程式碼,從如何安裝PyTorch開始,一步一步帶領讀者熟悉PyTorch和Jupyter Notebook,最終使用PyTorch實現線性迴歸、邏輯迴歸以及影象分類,非常適合0基礎初學者。
今天為大家帶來一份非常詳盡的PyTorch教程。本文共分3大部分:
安裝PyTorch和Jupyter Notebook
用PyTorch實現線性迴歸
使用邏輯迴歸實現影象分類
文章超長,秉承用程式碼搞定一切的原則,內含大量程式碼,建議收藏,並分享給你喜歡的人。同時如果有什麼疑問,也歡迎留言告知我們。
Tips:為了方便演示,文中程式碼和返回結果是用截圖形式給出。本系列中的所有程式碼都以Jupyter Notebook形式提供,託管在Jovian。託管連結:
https://jvn。io/aakashns/e5cfe043873f4f3c9287507016747ae5
安裝PyTorch和Jupyter Notebook
我們將使用Anaconda的Python發行版來安裝庫和管理虛擬環境,對於互動式編碼和實驗,我們將使用Jupyter Notebook。
首先按照官方教程安裝Anaconda,接下來安裝jovian:
$ pip install jovian ——upgrade
下載針對本教程的notebook:
$ jovian clone e5cfe043873f4f3c9287507016747ae5
此時會建立一個01-pytorch-basics的目錄,包含01-pytorch-basics。ipynb和environment。yml檔案。
$ cd 01-pytorch-basics$ conda env update
目的是不破壞本地Python環境,使用一個虛擬環境。接下來啟用
$ conda activate 01-pytorch-basics
啟動Jupyter
$ jupyter notebook
開啟瀏覽器,輸入http://localhost:8888 。然後點有01-pytorch-basics。ipynb字樣的就開始了。
本質上PyTorch是處理Tensor的庫。所以我們先來簡單看下tensor型別:
因為很多時候我們需要在NumPy的陣列和PyTorch陣列之間進行轉換。
Commit並上傳:
上傳的專案還可以用 jovian clone 下載回來。操作類似git,這裡不再累述。
簡單的開場之後,我們直接進入硬核階段。
用PyTorch實現線性迴歸
對於線性迴歸,相信大家都很熟悉了,各種機器學習的書第一個要講的內容必定有線性迴歸。
這一部分,我們首先透過最原始的手動操作,來理解整個線性迴歸的原理和操作流程。
接著我們會再介紹使用PyTorch內建的函式,透過自動化的方式實現線性迴歸。
線性迴歸模型中,每個目標變數都被估算為輸入變數的加權和及偏差。
先看一張表:
表格第一列是地區,第二類是溫度單位華氏度,第二列是降水量單位毫米,第四列是溼度,第五列是蘋果產量,第六列是橙子產量。
下面這段程式碼的目的是為了預估出蘋果和橙子在不同地區、不同環境中的產量。
yield_apple = w11 * temp + w12 * rainfall + w13 * humidity + b1yield_orange = w21 * temp + w22 * rainfall + w23 * humidity + b2
分別個溫度temp、降水量rainfall、溼度humidity加上不同的權重(w11,w12,w13),最後再加一個b1或者b2的偏差。
透過使用被稱為梯度下降的最佳化技術,少量多次調整權重以獲得更精準的預測結果。
訓練資料
在Jupyter Notebook裡匯入NumPy和PyTorch
訓練資料我們inputs和targets兩個矩陣表示,每個觀察一行,每個變數一列。
接下來轉換成PyTorch的tensors:
變數和偏差也用矩陣表示,從隨機數值開始
模型可以表示為
我們這樣定義模型:
生成預測
對比一下原始資料
發現差距很大,因為一開始我們用的是隨機數值,所以資料合不上很正常。
接下來我們需要透過損失函式,來評估我們的模型和實際差距多大。分為3個步驟
計算兩個矩陣(preds和targets)之間的差異
平方差矩陣的所有元素以消除負值
計算結果矩陣中元素的平均值
最終結果為均方誤差MSE
計算梯度:
使用PyTorch可以自動計算損耗的梯度或導數w。r。t。 權重和偏差,因為requires_grad被設定為True。
計算權重梯度:
重置梯度:
使用梯度下降調整重量和偏差
我們將使用梯度下降最佳化演算法減少損失並改進我們的模型,該演算法具有以下步驟:
生成預測
計算損失
計算梯度w。r。t權重和偏差
透過減去與梯度成比例的小量來調整權重
將漸變重置為零
讓我們逐步實現上述步驟
接下來分別用程式碼表示:
最終效果:
再來看看損失:
說明有進步。那麼我們就重複上面的過程,把損失減到最小。每詞重複,我們成為1個epoch。我們先來100個epoch:
再看看效果:
損失很低了。print一下結果:
用PyTorch內建函式實現線性迴歸
瞭解了上述原理後,我們就可以用PyTorch內建的函式,簡化我們的工作量。
接下來我們建立一個TensorDataset和一個DataLoader:
TensorDataset允許我們使用陣列索引表示法(上面程式碼中的[0:3])訪問訓練資料的一小部分。 它返回一個元組(或對),其中第一個元素包含所選行的輸入變數,第二個元素包含目標。
用for-in迴圈就可以了
用nn.linear自動初始化
剛開始我們是手動隨機輸入的初識權重。現在我們可以使用nn。linear自動完成初始化工作。
對於我們的線性迴歸模型,我們有一個權重矩陣和一個偏差矩陣。
接下來我們重複上面的流程,首先透過損失函式計算出差距,接著不斷的降低損失。
以及用內建損失函式mse_loss:
最佳化的時候,我們可以使用最佳化器optim。SGD,不用手動操作模型的權重和偏差。
SGD代表隨機梯度下降。 它被稱為隨機因為樣本是分批選擇的(通常是隨機抽樣)而不是單個組。
訓練模型,思路上面已經講過了,直接看程式碼
上面要注意的一些事項:
我們使用前面定義的資料載入器來獲取每次迭代的batch資料
我們不是手動更新引數(權重和偏差),而是使用opt。step來執行更新,而使用opt。zero_grad將梯度重置為零
我們還添加了一個日誌語句,用於列印每10個時期最後一批資料的丟失,以跟蹤訓練的進度。 loss。item返回儲存在損失tensor中的實際值
來100個epoch
結果:
對比一下:
Commit並上傳
現在可以將你的程式碼上傳到我們的Notebook了。看了這麼多程式碼估計你可能已經忘記怎麼Commit了。
【2019新智元 AI 技術峰會倒計時16天】
2019年的3月27日,新智元再匯AI之力,在北京泰富酒店舉辦AI開年盛典——2019新智元AI技術峰會。峰會以“
智慧雲•芯世界
“為主題,聚焦智慧雲和AI晶片的發展,重塑未來AI世界格局。
同時,新智元將在峰會現場權威釋出若干
AI白皮書
,聚焦產業鏈的創新活躍,評述華人AI學者的影響力,助力中國在世界級的AI競爭中實現超越。
購票二維碼
活動行購票連結:2019新智元AI技術峰會——智慧雲•芯世界_精彩城市生活,盡在活動行!!