最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Pytorch相關(guān)知識(shí)介紹與應(yīng)用

 更新時(shí)間:2022年11月21日 13:59:50   作者:明湖小蝦  
最近又重拾了機(jī)器學(xué)習(xí)的相關(guān)技術(shù),在本科畢設(shè)的階段下學(xué)習(xí)使用了Tensorflow 2.x工具,當(dāng)時(shí)也是不求甚解,直接拿來用了,但現(xiàn)在已經(jīng)有充足的時(shí)間、精力和基礎(chǔ)知識(shí)來重新學(xué)習(xí)一下

前言

目前機(jī)器學(xué)習(xí)框架有兩大方向,Pytorch和Tensorflow 2。對(duì)于機(jī)器學(xué)習(xí)的小白的我來說,直觀的感受是Tensorflow的框架更加傻瓜式,在這個(gè)框架下只需要定義神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)、輸入和輸出,然后直接使用其框架下的各種框架函數(shù)即可。而對(duì)于Pytorch來說,則使用者能操作、定義的細(xì)節(jié)更多,但與此同時(shí)使用難度也會(huì)更高。

通過各種資料也顯示,在學(xué)術(shù)研究范圍內(nèi),越來越多的人使用Pytorch,其實(shí)Tensorflow也不錯(cuò),但對(duì)于普通小白來說入手更快,應(yīng)用也更快。本著全面發(fā)展,多嘗試的心態(tài),開始Pytorch學(xué)習(xí)。

小編將從自身的理解習(xí)慣開始不斷更新這篇博文:

1.Pytorch簡介

Pytorch就是一個(gè)神經(jīng)網(wǎng)絡(luò)框架,使用Pytorch可以跳過很多不必要的底層工作,很多通用的方法、數(shù)據(jù)結(jié)構(gòu)都已經(jīng)實(shí)現(xiàn)供我們調(diào)用,從而可以讓我們將精力集中在改進(jìn)數(shù)據(jù)質(zhì)量、網(wǎng)絡(luò)結(jié)構(gòu)和評(píng)估方法上去。

使用和訓(xùn)練神經(jīng)網(wǎng)絡(luò)從思考順序上來說無非就三個(gè)階段:

1)構(gòu)思神經(jīng)網(wǎng)絡(luò)的輸入、輸出和網(wǎng)絡(luò)結(jié)構(gòu),其中輸入輸出非常關(guān)鍵。

2)訓(xùn)練數(shù)據(jù)集(粗糙的原始數(shù)據(jù))。

3)如何將訓(xùn)練數(shù)據(jù)集轉(zhuǎn)換成神經(jīng)網(wǎng)絡(luò)能夠接受并且能夠正確輸出的結(jié)構(gòu)。

4)訓(xùn)練神經(jīng)網(wǎng)絡(luò)并進(jìn)行預(yù)測。

2.Pytorch定義神經(jīng)網(wǎng)絡(luò)的輸入輸出和結(jié)構(gòu)

使用Pytorch定義神經(jīng)網(wǎng)絡(luò)非常通用的格式:

class NN(nn.Module):
    def __init__(self):
        super(NN,self).__init__()#繼承tOrch中已經(jīng)寫好的類,包含神經(jīng)網(wǎng)絡(luò)其余所有通用必要方法函數(shù)。
        self.flatten=nn.Flatten()#加入展平函數(shù)。
        self.net=nn.Sequential(#調(diào)用Sequential方法定義神經(jīng)網(wǎng)絡(luò)。
            nn.Linear(100*3,100*3),
            nn.ReLU(),
            nn.Linear(100*3,100*3),
            nn.ReLU(),
            nn.Linear(100*3,27)
        )
    def forward(self,x):#自定義神經(jīng)網(wǎng)絡(luò)的前向傳播函數(shù),本文使用了正常的前向傳播函數(shù),但最終的結(jié)果給出三個(gè)輸出。
        result=self.net(x)
        r1=result[:9]
        r2=result[9:18]
        r3=result[18:27]    
        return [r1,r2,r3]
 

到這里基本上已經(jīng)定義了自己的神經(jīng)網(wǎng)絡(luò)了,輸入為100*3=200個(gè)數(shù)據(jù)、輸出為27個(gè)數(shù)據(jù)。那么問題來了,怎么把數(shù)據(jù)輸入進(jìn)去呢?

3.Pytorch神經(jīng)網(wǎng)絡(luò)的數(shù)據(jù)格式-tensor

對(duì)于編程小白、機(jī)器學(xué)習(xí)小白的我或者大家來說,tensor的直接定義不好理解。

tensor表面上只進(jìn)行了存儲(chǔ),但實(shí)際上它包含了很多中方法,直接使用tensor.Method()調(diào)用相關(guān)方法即可,而省去了自己來定義函數(shù),再操作數(shù)據(jù)結(jié)構(gòu)。并且在Pytorch進(jìn)行訓(xùn)練時(shí),也會(huì)在其內(nèi)部調(diào)用這些方法,所以就需要我們使用這些數(shù)據(jù)結(jié)構(gòu)來作為Pytorch神經(jīng)網(wǎng)的輸入,并且神經(jīng)網(wǎng)絡(luò)的輸出也是tensor形式,numpy array 和 list 和 tensor 的轉(zhuǎn)換其實(shí)就是數(shù)據(jù)相同,但集成了不同方法的數(shù)據(jù)結(jié)構(gòu)。

那么下面就是輸入數(shù)據(jù)的定義。train_data和labels都是我們使用python方法寫出的list。

#train_data、labels都是list,經(jīng)過list->ndarray->tensor的轉(zhuǎn)換過程。
train_data=torch.tensor(np.array(train_data)).to(torch.float32).to(device)
labels=torch.tensor(np.array(labels)).to(torch.float32).to(device)

4.神經(jīng)網(wǎng)絡(luò)進(jìn)行預(yù)測

使用神經(jīng)網(wǎng)絡(luò)進(jìn)行預(yù)測(前向傳播)、計(jì)算損失函數(shù)、反向傳播更新梯度

1)進(jìn)行前向傳播

#train_data[0]即為訓(xùn)練數(shù)據(jù)的第一條輸入數(shù)據(jù)。
prediction=model(train_data[0])

2)計(jì)算損失

#定義優(yōu)化器
optim=torch.optim.SGD(model.parameters(),lr=1e-2,momentum=0.9)
# 定義自己的loss 
loss=(prediction[0]-labels[0]).sum()+(prediction[1]-labels[1]).sum()+(prediction[2]-labels[2]).sum()
#反向傳播
optim.zero_grad()#清除上一次的靜態(tài)梯度,防止累加。
loss.backward()#計(jì)算反向傳播梯度。
optim.step()#進(jìn)行一次權(quán)值更新。
 

此處的計(jì)算損失和權(quán)值依據(jù)輸入數(shù)據(jù)更新一次的結(jié)果,由此加入一個(gè)循環(huán),便可以實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過程。

3) 訓(xùn)練網(wǎng)絡(luò)

在正式進(jìn)入訓(xùn)練網(wǎng)絡(luò)之前,我們還需要了解一個(gè)叫做Batch的東西,如果我們將數(shù)據(jù)一個(gè)一個(gè)送進(jìn)去訓(xùn)練,那么神經(jīng)網(wǎng)絡(luò)訓(xùn)練的速度將是十分緩慢的,因此我們每次可以丟進(jìn)去很多數(shù)據(jù)讓神經(jīng)網(wǎng)絡(luò)進(jìn)行預(yù)測,通過計(jì)算總體的損失就可以讓梯度更快地下降。但訓(xùn)練數(shù)據(jù)有時(shí)又很巨大,所以就需要將整個(gè)訓(xùn)練數(shù)據(jù)打包成一批一批的進(jìn)入訓(xùn)練,并重復(fù)若干次,每訓(xùn)練整個(gè)數(shù)據(jù)一次,會(huì)經(jīng)歷若干個(gè)batch,這一過程稱為一個(gè)epoch。

所以為了使網(wǎng)絡(luò)預(yù)測結(jié)果更快地收斂,即更快地訓(xùn)練神經(jīng)網(wǎng)絡(luò),我們需要首先對(duì)數(shù)據(jù)進(jìn)行打包。

import torch.utils.data as Data
bath=50#每批次大小
loader=Data.DataLoader(#制作數(shù)據(jù)集,只能由cpu讀取
    dataset = train_data_set,
    batch_size=bath,#每批次包含數(shù)據(jù)條數(shù)
    shuffle=True,#是否打亂數(shù)據(jù)
    num_workers=1,#多少個(gè)線程搬運(yùn)數(shù)據(jù)
)

然后,我們就可以進(jìn)行神經(jīng)網(wǎng)絡(luò)的訓(xùn)練了:

pstep=2#每個(gè)多少個(gè)批次就輸出一次結(jié)果
for epoch in range(1000):
    running_loss=0.0
    for step,(inps,labs) in enumerate(loader):
        #取出數(shù)據(jù)并搬運(yùn)至GPU進(jìn)行計(jì)算。
        labs=labs.to(device)
        inps=inps.to(device) 
        outputs = model(inps)#將數(shù)據(jù)輸入進(jìn)去并進(jìn)行前向傳播
        loss=loss_fn(outputs,labs)#損失函數(shù)的定義
        optimizer.zero_grad()#清楚上一次的靜態(tài)梯度,防止累加。
        loss.backward()#反向傳播更新梯度
        optimizer.step()#進(jìn)行一次優(yōu)化。
        running_loss += loss.item()#不加item()會(huì)造成內(nèi)存堆疊
        size=len(labs)*3
        correct=0
        #print("outputs:",outputs.argmax(-1),"\nlabs:",labs.argmax(-1))
        #逐個(gè)判斷計(jì)算準(zhǔn)確率
        correct+=(outputs.argmax(-1)==labs.argmax(-1)).type(torch.float).sum().item()
        if step % pstep == pstep-1:    # print every 10 mini-batches
            print('[%d, %5d] loss: %.3f correct:%.3f' %
                  (epoch + 1, step + 1, running_loss / pstep,correct/size))
            if correct/size>1:#錯(cuò)誤檢查
                print("outputs:",outputs.argmax(-1),"\nlabs:",labs.argmax(-1),"\ncorrect:",correct,"\nSize:",size)
            running_loss = 0.0
#保存模型
torch.save(model.state_dict(), "model.pth")
print("Saved PyTorch Model State to model.pth")

到此這篇關(guān)于Pytorch相關(guān)知識(shí)介紹與應(yīng)用的文章就介紹到這了,更多相關(guān)Pytorch知識(shí)點(diǎn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python棧實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換的示例詳解

    python棧實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換的示例詳解

    棧(Stack)是計(jì)算機(jī)科學(xué)中常用的數(shù)據(jù)結(jié)構(gòu),具有眾多實(shí)際應(yīng)用,其中之一是使用棧來實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換,將一個(gè)數(shù)字從一種進(jìn)制表示轉(zhuǎn)換為另一種進(jìn)制表示,本文將深入研究棧的原理,以及如何使用Python實(shí)現(xiàn)十進(jìn)制到二進(jìn)制、八進(jìn)制和十六進(jìn)制的進(jìn)制轉(zhuǎn)換,需要的朋友可以參考下
    2023-11-11
  • 一文詳解Python中生成器的原理與使用

    一文詳解Python中生成器的原理與使用

    生成器表達(dá)式本質(zhì)上就是一個(gè)迭代器,是定義迭代器的一種方式,是允許自定義邏輯的迭代器。本文將詳細(xì)講解一下Python中生成器的原理與使用,需要的可以參考一下
    2022-05-05
  • python sklearn常用分類算法模型的調(diào)用

    python sklearn常用分類算法模型的調(diào)用

    這篇文章主要介紹了python sklearn常用分類算法模型的調(diào)用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • Python實(shí)現(xiàn)給圖片添加文字或圖片水印

    Python實(shí)現(xiàn)給圖片添加文字或圖片水印

    在現(xiàn)今的數(shù)字化時(shí)代,網(wǎng)絡(luò)上的圖片泛濫,盜圖現(xiàn)象也越來越嚴(yán)重。因此,在發(fā)布文章時(shí),為了保護(hù)自己的原創(chuàng)作品版權(quán),很多人選擇使用水印來保護(hù)他們的圖片。本文就和大家分享了Python實(shí)現(xiàn)給圖片添加文字或圖片水印的方法,需要的可以收藏一下
    2023-05-05
  • pygame實(shí)現(xiàn)簡單五子棋游戲

    pygame實(shí)現(xiàn)簡單五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了pygame實(shí)現(xiàn)簡單五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下<BR>
    2022-01-01
  • matplotlib bar()實(shí)現(xiàn)百分比堆積柱狀圖

    matplotlib bar()實(shí)現(xiàn)百分比堆積柱狀圖

    這篇文章主要介紹了matplotlib bar()實(shí)現(xiàn)百分比堆積柱狀圖,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Python圖像處理庫PIL的ImageFont模塊使用介紹

    Python圖像處理庫PIL的ImageFont模塊使用介紹

    這篇文章主要介紹了Python圖像處理庫PIL的ImageFont模塊使用介紹,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Python callable函數(shù)使用方法詳解

    Python callable函數(shù)使用方法詳解

    這篇文章主要介紹了Python callable函數(shù)使用方法,一個(gè)可callable的對(duì)象是指可以被調(diào)用執(zhí)行的對(duì)象,并且可以傳入?yún)?shù), 用另一個(gè)簡單的描述方式,只要可以在一個(gè)對(duì)象的后面使用小括號(hào)來執(zhí)行代碼,那么這個(gè)對(duì)象就是callable對(duì)象,下面來詳細(xì)介紹使用方法,需要的朋友可以參考下
    2024-10-10
  • 排序算法之希爾排序法解析

    排序算法之希爾排序法解析

    這篇文章主要介紹了排序算法之希爾排序法解析,希爾排序法(Shell Sort),也稱為縮小增量排序,是一種改進(jìn)的插入排序算法,它通過將待排序的元素按照一定的間隔分組,對(duì)每個(gè)分組進(jìn)行插入排序,逐漸減小間隔直至為1,最后對(duì)整個(gè)序列進(jìn)行一次插入排序
    2023-07-07
  • Python中JSON常見用法(json.load()、json.loads()、json.dump()、json.dumps())

    Python中JSON常見用法(json.load()、json.loads()、json.dump()、json.du

    本文主要介紹了Python中JSON常見用法(json.load()、json.loads()、json.dump()、json.dumps()),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06

最新評(píng)論

阜阳市| 德清县| 自治县| 仙居县| 阿勒泰市| 饶阳县| 白水县| 宽甸| 云阳县| 浪卡子县| 民乐县| 哈尔滨市| 正镶白旗| 石台县| 鞍山市| 福清市| 西盟| 马公市| 宝山区| 镇坪县| 二手房| 阳城县| 布尔津县| 武陟县| 桐梓县| 阿勒泰市| 临猗县| 石狮市| 平塘县| 普陀区| 宜丰县| 洛隆县| 灵璧县| 罗平县| 岑溪市| 县级市| 南投市| 惠来县| 阿拉善盟| 辽中县| 枞阳县|