0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一份非常詳盡的PyTorch教程,從如何安裝PyTorch開始

DPVg_AI_era ? 來(lái)源:lp ? 2019-03-12 09:15 ? 次閱讀

本文通過(guò)詳實(shí)的代碼,從如何安裝PyTorch開始,一步一步帶領(lǐng)讀者熟悉PyTorch和Jupyter Notebook,最終使用PyTorch實(shí)現(xiàn)線性回歸、邏輯回歸以及圖像分類,非常適合0基礎(chǔ)初學(xué)者。

今天為大家?guī)?lái)一份非常詳盡的PyTorch教程。本文共分3大部分:

安裝PyTorch和Jupyter Notebook

用PyTorch實(shí)現(xiàn)線性回歸

使用邏輯回歸實(shí)現(xiàn)圖像分類

文章超長(zhǎng),秉承用代碼搞定一切的原則,內(nèi)含大量代碼,建議收藏,并分享給你喜歡的人。同時(shí)如果有什么疑問,也歡迎留言告知我們。

Tips:為了方便演示,文中代碼和返回結(jié)果是用截圖形式給出。本系列中的所有代碼都以Jupyter Notebook形式提供,托管在Jovian。托管鏈接:

https://jvn.io/aakashns/e5cfe043873f4f3c9287507016747ae5

安裝PyTorch和Jupyter Notebook

我們將使用Anaconda的Python發(fā)行版來(lái)安裝庫(kù)和管理虛擬環(huán)境,對(duì)于交互式編碼和實(shí)驗(yàn),我們將使用Jupyter Notebook。

首先按照官方教程安裝Anaconda,接下來(lái)安裝jovian:

$ pip install jovian --upgrade

下載針對(duì)本教程的notebook:

$ jovian clone e5cfe043873f4f3c9287507016747ae5

此時(shí)會(huì)創(chuàng)建一個(gè)01-pytorch-basics的目錄,包含01-pytorch-basics.ipynb和environment.yml文件。

$ cd 01-pytorch-basics$ conda env update

目的是不破壞本地Python環(huán)境,使用一個(gè)虛擬環(huán)境。接下來(lái)激活

$ conda activate 01-pytorch-basics

啟動(dòng)Jupyter

$ jupyter notebook

打開瀏覽器,輸入http://localhost:8888 。然后點(diǎn)有01-pytorch-basics.ipynb字樣的就開始了。

本質(zhì)上PyTorch是處理Tensor的庫(kù)。所以我們先來(lái)簡(jiǎn)單看下tensor類型:

因?yàn)楹芏鄷r(shí)候我們需要在NumPy的數(shù)組和PyTorch數(shù)組之間進(jìn)行轉(zhuǎn)換。

Commit并上傳:

上傳的項(xiàng)目還可以用 jovian clone 下載回來(lái)。操作類似git,這里不再累述。

簡(jiǎn)單的開場(chǎng)之后,我們直接進(jìn)入硬核階段。

用PyTorch實(shí)現(xiàn)線性回歸

對(duì)于線性回歸,相信大家都很熟悉了,各種機(jī)器學(xué)習(xí)的書第一個(gè)要講的內(nèi)容必定有線性回歸。

這一部分,我們首先通過(guò)最原始的手動(dòng)操作,來(lái)理解整個(gè)線性回歸的原理和操作流程。

接著我們會(huì)再介紹使用PyTorch內(nèi)置的函數(shù),通過(guò)自動(dòng)化的方式實(shí)現(xiàn)線性回歸。

線性回歸模型中,每個(gè)目標(biāo)變量都被估算為輸入變量的加權(quán)和及偏差。

先看一張表:

表格第一列是地區(qū),第二類是溫度單位華氏度,第二列是降水量單位毫米,第四列是濕度,第五列是蘋果產(chǎn)量,第六列是橙子產(chǎn)量。

下面這段代碼的目的是為了預(yù)估出蘋果和橙子在不同地區(qū)、不同環(huán)境中的產(chǎn)量。

yield_apple = w11 * temp + w12 * rainfall + w13 * humidity + b1yield_orange = w21 * temp + w22 * rainfall + w23 * humidity + b2

分別個(gè)溫度temp、降水量rainfall、濕度humidity加上不同的權(quán)重(w11,w12,w13),最后再加一個(gè)b1或者b2的偏差。

通過(guò)使用被稱為梯度下降的優(yōu)化技術(shù),少量多次調(diào)整權(quán)重以獲得更精準(zhǔn)的預(yù)測(cè)結(jié)果。

訓(xùn)練數(shù)據(jù)

在Jupyter Notebook里導(dǎo)入NumPy和PyTorch

訓(xùn)練數(shù)據(jù)我們inputs和targets兩個(gè)矩陣表示,每個(gè)觀察一行,每個(gè)變量一列。

接下來(lái)轉(zhuǎn)換成PyTorch的tensors:

變量和偏差也用矩陣表示,從隨機(jī)數(shù)值開始

模型可以表示為

我們這樣定義模型:

生成預(yù)測(cè)

對(duì)比一下原始數(shù)據(jù)

發(fā)現(xiàn)差距很大,因?yàn)橐婚_始我們用的是隨機(jī)數(shù)值,所以數(shù)據(jù)合不上很正常。

接下來(lái)我們需要通過(guò)損失函數(shù),來(lái)評(píng)估我們的模型和實(shí)際差距多大。分為3個(gè)步驟

計(jì)算兩個(gè)矩陣(preds和targets)之間的差異

平方差矩陣的所有元素以消除負(fù)值

計(jì)算結(jié)果矩陣中元素的平均值

最終結(jié)果為均方誤差MSE

計(jì)算梯度:

使用PyTorch可以自動(dòng)計(jì)算損耗的梯度或?qū)?shù)w.r.t. 權(quán)重和偏差,因?yàn)閞equires_grad被設(shè)置為True。

計(jì)算權(quán)重梯度:

重置梯度:

使用梯度下降調(diào)整重量和偏差

我們將使用梯度下降優(yōu)化算法減少損失并改進(jìn)我們的模型,該算法具有以下步驟:

生成預(yù)測(cè)

計(jì)算損失

計(jì)算梯度w.r.t權(quán)重和偏差

通過(guò)減去與梯度成比例的小量來(lái)調(diào)整權(quán)重

將漸變重置為零

讓我們逐步實(shí)現(xiàn)上述步驟

接下來(lái)分別用代碼表示:

最終效果:

再來(lái)看看損失:

說(shuō)明有進(jìn)步。那么我們就重復(fù)上面的過(guò)程,把損失減到最小。每詞重復(fù),我們成為1個(gè)epoch。我們先來(lái)100個(gè)epoch:

再看看效果:

損失很低了。print一下結(jié)果:

用PyTorch內(nèi)置函數(shù)實(shí)現(xiàn)線性回歸

了解了上述原理后,我們就可以用PyTorch內(nèi)置的函數(shù),簡(jiǎn)化我們的工作量。

接下來(lái)我們創(chuàng)建一個(gè)TensorDataset和一個(gè)DataLoader:

TensorDataset允許我們使用數(shù)組索引表示法(上面代碼中的[0:3])訪問訓(xùn)練數(shù)據(jù)的一小部分。 它返回一個(gè)元組(或?qū)Γ?,其中第一個(gè)元素包含所選行的輸入變量,第二個(gè)元素包含目標(biāo)。

用for-in循環(huán)就可以了

用nn.linear自動(dòng)初始化

剛開始我們是手動(dòng)隨機(jī)輸入的初識(shí)權(quán)重?,F(xiàn)在我們可以使用nn.linear自動(dòng)完成初始化工作。

對(duì)于我們的線性回歸模型,我們有一個(gè)權(quán)重矩陣和一個(gè)偏差矩陣。

接下來(lái)我們重復(fù)上面的流程,首先通過(guò)損失函數(shù)計(jì)算出差距,接著不斷的降低損失。

以及用內(nèi)置損失函數(shù)mse_loss:

優(yōu)化的時(shí)候,我們可以使用優(yōu)化器optim.SGD,不用手動(dòng)操作模型的權(quán)重和偏差。

SGD代表隨機(jī)梯度下降。 它被稱為隨機(jī)因?yàn)闃颖臼欠峙x擇的(通常是隨機(jī)抽樣)而不是單個(gè)組。

訓(xùn)練模型,思路上面已經(jīng)講過(guò)了,直接看代碼

上面要注意的一些事項(xiàng):

我們使用前面定義的數(shù)據(jù)加載器來(lái)獲取每次迭代的batch數(shù)據(jù)

我們不是手動(dòng)更新參數(shù)(權(quán)重和偏差),而是使用opt.step來(lái)執(zhí)行更新,而使用opt.zero_grad將梯度重置為零

我們還添加了一個(gè)日志語(yǔ)句,用于打印每10個(gè)時(shí)期最后一批數(shù)據(jù)的丟失,以跟蹤訓(xùn)練的進(jìn)度。 loss.item返回存儲(chǔ)在損失tensor中的實(shí)際值

來(lái)100個(gè)epoch

結(jié)果:

對(duì)比一下:

Commit并上傳

現(xiàn)在可以將你的代碼上傳到我們的Notebook了??戳诉@么多代碼估計(jì)你可能已經(jīng)忘記怎么Commit了。

用PyTorch的邏輯回歸實(shí)現(xiàn)圖像分類

數(shù)據(jù)集來(lái)自MNIST手寫數(shù)字?jǐn)?shù)據(jù)庫(kù)。它由手寫數(shù)字(0到9)的28px乘28px灰度圖像以及每個(gè)圖像的標(biāo)簽組成。

導(dǎo)入torch、torchvision和MNIST

看一下lengh:

這個(gè)數(shù)據(jù)集有60000張圖片,可以用來(lái)訓(xùn)練模型。還有一個(gè)10,000個(gè)圖像的附加測(cè)試集,可以通過(guò)將train = False傳遞給MNIST類來(lái)創(chuàng)建。

該圖像是PIL.Image.Image類的對(duì)象,由28x28圖像和標(biāo)簽組成。PIL是Python成像庫(kù)Pillow。

我們可以使用matplotlib在Jupyter中查看圖像,matplotlib是Python中數(shù)據(jù)科學(xué)的事實(shí)繪圖和圖形庫(kù)。

先看數(shù)據(jù)集里的幾個(gè)圖片:

除了導(dǎo)入matplotlib之外,還添加了一個(gè)特殊聲明%matplotlib inline,告知Jupyter要在Notebook中繪制圖形。

沒有這個(gè)聲明的話,Jupyter將在彈出窗口中顯示圖像。以%開頭的語(yǔ)句稱為IPython magic命令,用于配置Jupyter本身的行為。

PyTorch無(wú)法直接處理圖像,需要將圖像轉(zhuǎn)換成tensor。

PyTorch數(shù)據(jù)集允許我們指定一個(gè)或多個(gè)轉(zhuǎn)換函數(shù),這些函數(shù)在加載時(shí)應(yīng)用于圖像。

torchvision.transforms包含許多這樣的預(yù)定義函數(shù),我們將使用ToTensor變換將圖像轉(zhuǎn)換為PyTorchtensor。

現(xiàn)在圖像轉(zhuǎn)換為1x28x28的tensor。第一個(gè)維度用于跟蹤顏色通道。由于MNIST數(shù)據(jù)集中的圖像是灰度級(jí)的,因此只有一個(gè)通道。 其他數(shù)據(jù)集具有彩色圖像,在這種情況下有3個(gè)通道:紅色,綠色和藍(lán)色(RGB)。

讓我們看一下tensor內(nèi)的一些樣本值:

0表示黑色,1表示白色,中間的值表示不同的灰度。嗯還可以使用plt.imshow將tensor繪制為圖像。

請(qǐng)注意,我們只需要將28x28矩陣傳遞給plt.imshow,而不需要通道尺寸。

我們還傳遞了一個(gè)顏色映射(cmap ='gray'),表示我們想要查看灰度圖像。

訓(xùn)練和驗(yàn)證數(shù)據(jù)集

在構(gòu)建真實(shí)世界的機(jī)器學(xué)習(xí)模型時(shí),將數(shù)據(jù)集分成3個(gè)部分是很常見的:

訓(xùn)練集:用于訓(xùn)練模型,即計(jì)算損失并使用梯度下降調(diào)整模型的權(quán)重

驗(yàn)證集:用于在訓(xùn)練時(shí)評(píng)估模型,調(diào)整超參數(shù)(學(xué)習(xí)率等)并選擇最佳版本的模型

測(cè)試集:用于比較不同的模型或不同類型的建模方法,并報(bào)告模型的最終準(zhǔn)確性

在MNIST數(shù)據(jù)集中,有60,000個(gè)訓(xùn)練圖像和10,000個(gè)測(cè)試圖像。測(cè)試集是標(biāo)準(zhǔn)化的,以便不同的研究人員可以針對(duì)同一組圖像報(bào)告其模型的結(jié)果。

由于沒有預(yù)定義的驗(yàn)證集,我們必須手動(dòng)將60,000個(gè)圖像拆分為訓(xùn)練和驗(yàn)證數(shù)據(jù)集

讓我們定義一個(gè)函數(shù),隨機(jī)選擇驗(yàn)證集的圖像的給定部分。

split_indices隨機(jī)地混洗數(shù)組索引0,1,... n-1,并從中為驗(yàn)證集分離出所需的部分。

在創(chuàng)建驗(yàn)證集之前對(duì)索引進(jìn)行混洗是很重要的,因?yàn)橛?xùn)練圖像通常由目標(biāo)標(biāo)簽排序,即0s的圖像,然后是1s的圖像,接著是2s的圖像,依此類推。

如果我們僅通過(guò)選擇最后20%的圖像來(lái)選擇20%的驗(yàn)證集,則驗(yàn)證集將僅包括8s和9s的圖像,而訓(xùn)練集將不包含8s和9s的圖像,這樣就不可能訓(xùn)練一個(gè)好的模型。

我們隨機(jī)調(diào)整了指數(shù),并選擇了一小部分(20%)作為驗(yàn)證集。

現(xiàn)在可以使用SubsetRandomSampler為每個(gè)創(chuàng)建PyTorch數(shù)據(jù)加載器,SubsetRandomSampler從給定的索引列表中隨機(jī)采樣元素,同時(shí)創(chuàng)建batch數(shù)據(jù)。

模型

現(xiàn)在我們已經(jīng)準(zhǔn)備好了數(shù)據(jù)加載器,我們可以定義我們的模型。

邏輯回歸模型幾乎與線性回歸模型相同,即存在權(quán)重和偏差矩陣,并且使用簡(jiǎn)單矩陣運(yùn)算(pred = x @ w.t()+ b)獲得輸出

就像我們使用線性回歸一樣,我們可以使用nn.Linear來(lái)創(chuàng)建模型,而不是手動(dòng)定義和初始化矩陣

由于nn.Linear期望每個(gè)訓(xùn)練示例都是一個(gè)tensor,因此每個(gè)1x28x28圖像tensor需要在傳遞到模型之前被展平為大小為784(28 * 28)的tensor

每個(gè)圖像的輸出是大小為10的tensor,tensor的每個(gè)元素表示特定目標(biāo)標(biāo)記(即0到9)的概率。 圖像的預(yù)測(cè)標(biāo)簽只是具有最高概率的標(biāo)簽

我們看看權(quán)重和偏差

雖然這里我們的額參數(shù)量編程了7850個(gè),但總的思路是類似的。我們從的數(shù)據(jù)集中,取得第一個(gè)batch,包含100張圖片,傳遞給模型。

直接輸出的話報(bào)錯(cuò)。因?yàn)槲覀兊妮斎霐?shù)據(jù)的形狀不正確。我們的圖像形狀為1x28x28,但我們需要它們是784的矢量。

即我們需要將它們“展評(píng)”。我們將使用一個(gè)tensor的.reshape方法,這將允許我們有效地“查看”每個(gè)圖像作為平面向量,而無(wú)需真正更改基礎(chǔ)數(shù)據(jù)。

要在我們的模型中包含此附加功能,我們需要通過(guò)從PyTorch擴(kuò)展nn.Module類來(lái)定義自定義模型。

在__init__構(gòu)造函數(shù)方法中,我們使用nn.Linear實(shí)例化權(quán)重和偏差。

在我們將一批輸入傳遞給模型時(shí)調(diào)用的forward方法中,我們將輸入tensor展平,然后將其傳遞給self.linear。

xb.reshape(-1,28 * 28)向PyTorch指明,我們想要具有兩個(gè)維度的xbtensor的視圖,其中沿第二維度的長(zhǎng)度是28 * 28(即784)。

.reshape的一個(gè)參數(shù)可以設(shè)置為-1(在這種情況下是第一個(gè)維度),讓PyTorch根據(jù)原始tensor的形狀自動(dòng)計(jì)算出來(lái)。

請(qǐng)注意,模型不再具有.weight和.bias屬性(因?yàn)樗鼈儸F(xiàn)在位于.linear屬性中),但它確實(shí)有一個(gè).parameters方法,該方法返回包含權(quán)重和偏差的列表,并且可以使用PyTorch優(yōu)化器。

我們的新自定義模型可以像以前一樣使用。 讓我們看看它是否有效。

對(duì)于100個(gè)輸入圖像中的每一個(gè),我們得到10個(gè)輸出,每個(gè)類別一個(gè)。 如前所述,我們希望這些輸出表示概率,但是為此,每個(gè)輸出行的元素必須介于0到1之間并且加起來(lái)為1,這顯然不是這里的情況。

要將輸出行轉(zhuǎn)換為概率,我們使用softmax函數(shù),它具有以下公式:

首先,我們將輸出行中的每個(gè)元素yi替換為e ^ yi,這使得所有元素都為正,然后我們將每個(gè)元素除以所有元素的總和,以確保它們加起來(lái)為1。

雖然很容易實(shí)現(xiàn)softmax函數(shù),我們將使用PyTorch中提供的實(shí)現(xiàn),因?yàn)樗m用于多維tensor(在我們的例子中是輸出行列表)。

softmax函數(shù)包含在torch.nn.functional包中,并要求我們指定必須應(yīng)用softmax的維度。

最后,我們可以通過(guò)簡(jiǎn)單地選擇每個(gè)輸出行中具有最高概率的元素的索引來(lái)確定每個(gè)圖像的預(yù)測(cè)標(biāo)簽。

這是使用torch.max完成的,它返回最大元素和沿tensor的特定維度的最大元素的索引。

上面打印的數(shù)字是第一批訓(xùn)練圖像的預(yù)測(cè)標(biāo)簽。 我們將它們與實(shí)際標(biāo)簽進(jìn)行比較。

顯然,預(yù)測(cè)標(biāo)簽和實(shí)際標(biāo)簽完全不同。這是因?yàn)槲覀円呀?jīng)開始使用隨機(jī)初始化的權(quán)重和偏差。

我們需要訓(xùn)練模型,即使用梯度下降調(diào)整權(quán)重以做出更好的預(yù)測(cè)。

評(píng)估度量和損失函數(shù)

與線性回歸一樣,我們需要一種方法來(lái)評(píng)估模型的執(zhí)行情況。一種自然的方法是找到正確預(yù)測(cè)的標(biāo)簽百分比,即預(yù)測(cè)的準(zhǔn)確性。

==運(yùn)算符執(zhí)行具有相同形狀的兩個(gè)tensor的逐元素比較,并返回相同形狀的tensor,對(duì)于不相等的元素包含0,對(duì)于相等的元素包含1。

將結(jié)果傳遞給torch.sum會(huì)返回正確預(yù)測(cè)的標(biāo)簽數(shù)。最后,我們除以圖像總數(shù)來(lái)獲得準(zhǔn)確性。

讓我們計(jì)算第一批數(shù)據(jù)的當(dāng)前模型的準(zhǔn)確性。顯然,我們預(yù)計(jì)它會(huì)非常糟糕。

雖然精度是我們(人類)評(píng)估模型的好方法,但它不能用作使用梯度下降優(yōu)化模型的損失函數(shù),原因如下:

這不是一個(gè)可區(qū)分的功能。torch.max和==都是非連續(xù)和非可微操作,因此我們無(wú)法使用精度來(lái)計(jì)算重量和偏差的梯度

它沒有考慮模型預(yù)測(cè)的實(shí)際概率,因此無(wú)法為漸進(jìn)式改進(jìn)提供足夠的反饋

由于這些原因,準(zhǔn)確性是分類的一個(gè)很好的評(píng)估指標(biāo),但不是一個(gè)好的損失函數(shù)。 分類問題常用的損失函數(shù)是交叉熵,其具有以下公式:

雖然它看起來(lái)很復(fù)雜,但實(shí)際上非常簡(jiǎn)單:

對(duì)于每個(gè)輸出行,選擇正確標(biāo)簽的預(yù)測(cè)概率。例如。如果圖像的預(yù)測(cè)概率是[0.1,0.3,0.2,...]并且正確的標(biāo)簽是1,我們選擇相應(yīng)的元素0.3并忽略其余的

然后,取所選概率的對(duì)數(shù)。如果概率很高,即接近1,則其對(duì)數(shù)是非常小的負(fù)值,接近于0。如果概率低(接近0),則對(duì)數(shù)是非常大的負(fù)值。我們還將結(jié)果乘以-1,結(jié)果是預(yù)測(cè)不良的損失的大正值 最后,獲取所有輸出行的交叉熵的平均值,以獲得一批數(shù)據(jù)的總體損失

與準(zhǔn)確度不同,交叉熵是一種連續(xù)且可微分的函數(shù),它還為模型中的漸進(jìn)改進(jìn)提供了良好的反饋(正確標(biāo)簽導(dǎo)致較低損失的概率略高)。這使它成為損失函數(shù)的一個(gè)很好的選擇。

PyTorch提供了一種有效且張量友好的交叉熵實(shí)現(xiàn),作為torch.nn.functionalpackage的一部分。

此外,它還在內(nèi)部執(zhí)行softmax,因此我們可以直接傳遞模型的輸出而不將它們轉(zhuǎn)換為概率。

由于交叉熵是在所有訓(xùn)練樣本上平均的正確標(biāo)簽的預(yù)測(cè)概率的負(fù)對(duì)數(shù),因此一種解釋結(jié)果數(shù)的方法,例如,2.23是e ^ -2.23,平均值約為0.1,作為正確標(biāo)簽的預(yù)測(cè)概率。降低損失,改善模型。

優(yōu)化

我們將使用optim.SGD優(yōu)化器在訓(xùn)練期間更新權(quán)重和偏差,但學(xué)習(xí)率更高,為1e-3。

batch大小,學(xué)習(xí)率等參數(shù)需要在訓(xùn)練機(jī)器學(xué)習(xí)模型時(shí)提前選取,并稱為超參數(shù)。

選擇正確的超參數(shù)對(duì)于在合理的時(shí)間內(nèi)訓(xùn)練準(zhǔn)確的模型至關(guān)重要,并且是研究和實(shí)驗(yàn)的活躍領(lǐng)域。隨意嘗試不同的學(xué)習(xí)率,看看它如何影響訓(xùn)練過(guò)程。

訓(xùn)練模型

現(xiàn)在我們已經(jīng)定義了數(shù)據(jù)加載器,模型,損失函數(shù)和優(yōu)化器,我們已準(zhǔn)備好訓(xùn)練模型。

訓(xùn)練過(guò)程幾乎與線性回歸相同。但是,我們將增加我們之前定義的擬合函數(shù),以使用每個(gè)epoch末尾的驗(yàn)證集來(lái)評(píng)估模型的準(zhǔn)確性和損失。

我們首先定義一個(gè)函數(shù)loss_batch:

計(jì)算一批數(shù)據(jù)的損失

如果提供了優(yōu)化程序,則可以選擇執(zhí)行梯度下降更新步驟

可選地使用預(yù)測(cè)和實(shí)際目標(biāo)來(lái)計(jì)算度量(例如,準(zhǔn)確度)

優(yōu)化器是一個(gè)可選參數(shù),以確保我們可以重用loss_batch來(lái)計(jì)算驗(yàn)證集上的損失。

我們還將batch處理的長(zhǎng)度作為結(jié)果的一部分返回,因?yàn)樗诮M合整個(gè)數(shù)據(jù)集的損失/度量時(shí)非常有用。

接下來(lái),我們定義一個(gè)函數(shù)evaluate,它計(jì)算驗(yàn)證集的總體損失。

如果不能立即清楚此函數(shù)的作用,請(qǐng)嘗試在單獨(dú)的單元格中執(zhí)行每個(gè)語(yǔ)句,然后查看結(jié)果。

我們還需要重新定義精確度以直接操作整批輸出,以便我們可以將其用作擬合度量。

請(qǐng)注意,我們不需要將softmax應(yīng)用于輸出,因?yàn)樗粫?huì)更改結(jié)果的相對(duì)順序。

這是因?yàn)閑 ^ x是增加函數(shù),即如果y1> y2,則e ^ y1> e ^ y2,并且在對(duì)值求平均值以獲得softmax之后也是如此。

讓我們看看模型如何使用初始權(quán)重和偏差集在驗(yàn)證集上執(zhí)行。

初始準(zhǔn)確度低于10%,這是人們對(duì)隨機(jī)初始化模型的預(yù)期(因?yàn)樗惺种坏臋C(jī)會(huì)通過(guò)隨機(jī)猜測(cè)獲得標(biāo)簽)。

另請(qǐng)注意,我們使用.format方法和消息字符串僅打印小數(shù)點(diǎn)后的前四位數(shù)。

我們現(xiàn)在可以使用loss_batch和evaluate輕松定義擬合函數(shù)。

我們現(xiàn)在準(zhǔn)備訓(xùn)練模型。 讓我們訓(xùn)練5個(gè)epoch并觀察結(jié)果。

不錯(cuò)哦!來(lái)更多點(diǎn)eploch

線圖更直觀的顯示一下效果

從上面的圖片中可以清楚地看出,即使經(jīng)過(guò)很長(zhǎng)時(shí)間的訓(xùn)練,該模型也可能不會(huì)超過(guò)90%的準(zhǔn)確度閾值。

一個(gè)可能的原因是學(xué)習(xí)率可能太高。模型的參數(shù)可能會(huì)圍繞具有最低損耗的最佳參數(shù)集“彈跳”。

您可以嘗試降低學(xué)習(xí)速度和訓(xùn)練幾個(gè)epoch,看看它是否有幫助。

更可能的原因是該模型不夠強(qiáng)大。如果你還記得我們的初始假設(shè),我們假設(shè)輸出(在這種情況下是類概率)是輸入(像素強(qiáng)度)的線性函數(shù),通過(guò)對(duì)權(quán)重矩陣執(zhí)行矩陣乘法并添加偏差來(lái)獲得。

這是一個(gè)相當(dāng)弱的假設(shè),因?yàn)閳D像中的像素強(qiáng)度和它所代表的數(shù)字之間可能實(shí)際上不存在線性關(guān)系。

雖然它對(duì)于像MNIST這樣的簡(jiǎn)單數(shù)據(jù)集(使我們達(dá)到85%的準(zhǔn)確度)工作得相當(dāng)好,但我們需要更復(fù)雜的模型來(lái)捕捉圖像像素和標(biāo)簽之間的非線性關(guān)系,以便識(shí)別日常物品,動(dòng)物等復(fù)雜任務(wù)。

使用單個(gè)圖像進(jìn)行測(cè)試

雖然到目前為止我們一直在跟蹤模型的整體精度,但在一些樣本圖像上查看模型的結(jié)果也是一個(gè)好主意。

讓我們用10000個(gè)圖像的預(yù)定義測(cè)試數(shù)據(jù)集中的一些圖像測(cè)試我們的模型。 我們首先使用ToTensor變換重新創(chuàng)建測(cè)試數(shù)據(jù)集。

數(shù)據(jù)集中單個(gè)圖像的樣本:

讓我們定義一個(gè)輔助函數(shù)predict_image,它返回單個(gè)圖像張量的預(yù)測(cè)標(biāo)簽。

img.unsqueeze只是在1x28x28張量的開始處添加另一個(gè)維度,使其成為1x1x28x28張量,模型將其視為包含單個(gè)圖像的批處理。

通過(guò)收集更多的訓(xùn)練數(shù)據(jù),增加/減少模型的復(fù)雜性以及更改超參數(shù),確定我們的模型表現(xiàn)不佳的位置可以幫助我們改進(jìn)模型。

最后,讓我們看看測(cè)試集上模型的整體損失和準(zhǔn)確性。

我們希望這與驗(yàn)證集上的準(zhǔn)確度/損失相似。如果沒有,我們可能需要一個(gè)更好的驗(yàn)證集,它具有與測(cè)試集類似的數(shù)據(jù)和分布(通常來(lái)自現(xiàn)實(shí)世界數(shù)據(jù))。

保存并加載模型

由于我們已經(jīng)長(zhǎng)時(shí)間訓(xùn)練模型并獲得了合理的精度,因此將權(quán)重和偏置矩陣保存到磁盤是個(gè)好主意,這樣我們可以在以后重用模型并避免從頭開始重新訓(xùn)練。以下是保存模型的方法。

.state_dict方法返回一個(gè)OrderedDict,其中包含映射到模型右側(cè)屬性的所有權(quán)重和偏置矩陣。

要加載模型權(quán)重,我們可以實(shí)例化MnistModel類的新對(duì)象,并使用.load_state_dict方法。

正如完整性檢查一樣,讓我們驗(yàn)證此模型在測(cè)試集上具有與以前相同的損失和準(zhǔn)確性。

好了。大功告成了。又到了我們的commit環(huán)節(jié)。以防你已經(jīng)忘記了怎么操作:

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4237

    瀏覽量

    61969
  • 機(jī)器學(xué)習(xí)

    關(guān)注

    66

    文章

    8306

    瀏覽量

    131844
  • pytorch
    +關(guān)注

    關(guān)注

    2

    文章

    794

    瀏覽量

    13010

原文標(biāo)題:從零開始學(xué)PyTorch:一文學(xué)會(huì)線性回歸、邏輯回歸及圖像分類

文章出處:【微信號(hào):AI_era,微信公眾號(hào):新智元】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    PyTorch如何入門

    PyTorch 入門實(shí)戰(zhàn)()——Tensor
    發(fā)表于 06-01 09:58

    Pytorch AI語(yǔ)音助手

    想做個(gè)Pytorch AI語(yǔ)音助手,有沒有好的思路呀?
    發(fā)表于 03-06 13:00

    如何安裝TensorFlow2 Pytorch

    如何安裝TensorFlow2 Pytorch?
    發(fā)表于 03-07 07:32

    pytorch模型轉(zhuǎn)化為onxx模型的步驟有哪些

    首先pytorch模型要先轉(zhuǎn)化為onxx模型,然后onxx模型轉(zhuǎn)化為rknn模型直接轉(zhuǎn)化會(huì)出現(xiàn)如下問題,環(huán)境都是正確的,論壇詢問后也沒給出準(zhǔn)確答案說(shuō)是版本問題--&gt
    發(fā)表于 05-09 16:36

    怎樣使用PyTorch Hub去加載YOLOv5模型

    在Python>=3.7.0環(huán)境中安裝requirements.txt,包括PyTorch>=1.7。模型和數(shù)據(jù)集最新的 YOLOv5版本自動(dòng)下載。簡(jiǎn)單示例此示例
    發(fā)表于 07-22 16:02

    通過(guò)Cortex來(lái)非常方便的部署PyTorch模型

    到軟件中。如何“跨語(yǔ)言語(yǔ)言模型”轉(zhuǎn)換為谷歌翻譯?在這篇博客文章中,我們將了解在生產(chǎn)環(huán)境中使用 PyTorch 模型意味著什么,然后介紹種允許部署任何 PyTorch 模型以便在軟件
    發(fā)表于 11-01 15:25

    如何往星光2板子里裝pytorch?

    如題,想先gpu版本的pytorch安裝cpu版本的pytorch,pytorch官網(wǎng)提供了基于conda和pip兩種安裝方式。因?yàn)樵凼莚
    發(fā)表于 09-12 06:30

    Pytorch入門教程與范例

    pytorch個(gè)基于 python 的深度學(xué)習(xí)庫(kù)。pytorch 源碼庫(kù)的抽象層次少,結(jié)構(gòu)清晰,代碼量適中。相比于非常工程化的 tensorflow,
    發(fā)表于 11-15 17:50 ?5240次閱讀
    <b class='flag-5'>Pytorch</b>入門教程與范例

    非常新的介紹PyTorch內(nèi)部機(jī)制的文章

    譯者序:這篇博文是非常新的介紹PyTorch內(nèi)部機(jī)制的文章,作者Edward Z Yang來(lái)自于Stanford大學(xué),是PyTorch的核心開發(fā)者之
    的頭像 發(fā)表于 12-26 10:17 ?2050次閱讀
    <b class='flag-5'>一</b>篇<b class='flag-5'>非常</b>新的介紹<b class='flag-5'>PyTorch</b>內(nèi)部機(jī)制的文章

    基于PyTorch的深度學(xué)習(xí)入門教程之PyTorch安裝和配置

    神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),并且運(yùn)用各種深度學(xué)習(xí)算法訓(xùn)練網(wǎng)絡(luò)參數(shù),進(jìn)而解決各種任務(wù)。 本文PyTorch環(huán)境配置開始。PyTorch種Python接
    的頭像 發(fā)表于 02-16 15:15 ?2440次閱讀

    一份簡(jiǎn)便的PyTorch教程,從不用自己配置環(huán)境開始。

    會(huì)遇到些問題,比如虛擬環(huán)境配置錯(cuò)誤(沒有安裝TensorBoard),報(bào)錯(cuò)搞不懂問題出在哪等 或者是些硬件上的問題,自己的電腦跑不動(dòng)之類的。 這種時(shí)候就發(fā)現(xiàn)了北鯤云超算平臺(tái)(不是 想要在北鯤云上使用
    發(fā)表于 11-10 14:33 ?582次閱讀
    <b class='flag-5'>一份</b>簡(jiǎn)便的<b class='flag-5'>PyTorch</b>教程,從不用自己配置環(huán)境<b class='flag-5'>開始</b>。

    那些年在pytorch上踩過(guò)的坑

    今天又發(fā)現(xiàn)了個(gè)pytorch的小坑,給大家分享下。手上兩模型的代碼,一份用tensor
    的頭像 發(fā)表于 02-22 14:18 ?958次閱讀
    那些年在<b class='flag-5'>pytorch</b>上踩過(guò)的坑

    PyTorch安裝教程超詳細(xì)

    PyTorch個(gè)用于機(jī)器學(xué)習(xí)和深度學(xué)習(xí)的開源庫(kù),它提供了豐富的工具和接口,幫助開發(fā)者快速構(gòu)建深度學(xué)習(xí)模型。本文將介紹如何在不同操作系統(tǒng)上安裝PyTorch,并詳細(xì)講解每個(gè)步驟。 W
    的頭像 發(fā)表于 12-07 11:19 ?1841次閱讀

    pycharm如何調(diào)用pytorch

    引言 PyTorch個(gè)開源的機(jī)器學(xué)習(xí)庫(kù),廣泛用于計(jì)算機(jī)視覺、自然語(yǔ)言處理等領(lǐng)域。PyCharm是個(gè)流行的Python集成開發(fā)環(huán)境(IDE),提供了代碼編輯、調(diào)試、測(cè)試等功能。將PyTor
    的頭像 發(fā)表于 08-01 15:41 ?279次閱讀

    pytorch怎么在pycharm中運(yùn)行

    部分:PyTorch和PyCharm的安裝 1.1 安裝PyTorch PyTorch
    的頭像 發(fā)表于 08-01 16:22 ?531次閱讀