詳解Pytorch 使用Pytorch擬合多項(xiàng)式(多項(xiàng)式回歸)
使用Pytorch來(lái)編寫神經(jīng)網(wǎng)絡(luò)具有很多優(yōu)勢(shì),比起Tensorflow,我認(rèn)為Pytorch更加簡(jiǎn)單,結(jié)構(gòu)更加清晰。
希望通過(guò)實(shí)戰(zhàn)幾個(gè)Pytorch的例子,讓大家熟悉Pytorch的使用方法,包括數(shù)據(jù)集創(chuàng)建,各種網(wǎng)絡(luò)層結(jié)構(gòu)的定義,以及前向傳播與權(quán)重更新方式。
比如這里給出
很顯然,這里我們只需要假定
這里我們只需要設(shè)置一個(gè)合適尺寸的全連接網(wǎng)絡(luò),根據(jù)不斷迭代,求出最接近的參數(shù)即可。
但是這里需要思考一個(gè)問(wèn)題,使用全連接網(wǎng)絡(luò)結(jié)構(gòu)是毫無(wú)疑問(wèn)的,但是我們的輸入與輸出格式是什么樣的呢?
只將一個(gè)x作為輸入合理嗎?顯然是不合理的,因?yàn)槊恳粋€(gè)神經(jīng)元其實(shí)模擬的是wx+b的計(jì)算過(guò)程,無(wú)法模擬冪運(yùn)算,所以顯然我們需要將x,x的平方,x的三次方,x的四次方組合成一個(gè)向量作為輸入,假設(shè)有n個(gè)不同的x值,我們就可以將n個(gè)組合向量合在一起組成輸入矩陣。
這一步代碼如下:
def make_features(x): x = x.unsqueeze(1) return torch.cat([x ** i for i in range(1,4)] , 1)
我們需要生成一些隨機(jī)數(shù)作為網(wǎng)絡(luò)輸入:
def get_batch(batch_size=32): random = torch.randn(batch_size) x = make_features(random) '''Compute the actual results''' y = f(x) if torch.cuda.is_available(): return Variable(x).cuda(), Variable(y).cuda() else: return Variable(x), Variable(y)
其中的f(x)定義如下:
w_target = torch.FloatTensor([0.5,3,2.4]).unsqueeze(1) b_target = torch.FloatTensor([0.9]) def f(x): return x.mm(w_target)+b_target[0]
接下來(lái)定義模型:
class poly_model(nn.Module): def __init__(self): super(poly_model, self).__init__() self.poly = nn.Linear(3,1) def forward(self, x): out = self.poly(x) return out
if torch.cuda.is_available(): model = poly_model().cuda() else: model = poly_model()
接下來(lái)我們定義損失函數(shù)和優(yōu)化器:
criterion = nn.MSELoss() optimizer = optim.SGD(model.parameters(), lr = 1e-3)
網(wǎng)絡(luò)部件定義完后,開(kāi)始訓(xùn)練:
epoch = 0 while True: batch_x,batch_y = get_batch() output = model(batch_x) loss = criterion(output,batch_y) print_loss = loss.data[0] optimizer.zero_grad() loss.backward() optimizer.step() epoch+=1 if print_loss < 1e-3: break
到此我們的所有代碼就敲完了,接下來(lái)我們開(kāi)始詳細(xì)了解一下其中的一些代碼。
在make_features()定義中,torch.cat是將計(jì)算出的向量拼接成矩陣。unsqueeze是作一個(gè)維度上的變化。
get_batch中,torch.randn是產(chǎn)生指定維度的隨機(jī)數(shù),如果你的機(jī)器支持GPU加速,可以將Variable放在GPU上進(jìn)行運(yùn)算,類似語(yǔ)句含義相通。
x.mm是作矩陣乘法。
模型定義是重中之重,其實(shí)當(dāng)你掌握Pytorch之后,你會(huì)發(fā)現(xiàn)模型定義是十分簡(jiǎn)單的,各種基本的層結(jié)構(gòu)都已經(jīng)為你封裝好了。所有的層結(jié)構(gòu)和損失函數(shù)都來(lái)自torch.nn,所有的模型構(gòu)建都是從這個(gè)基類 nn.Module繼承的。模型定義中,__init__與forward是有模板的,大家可以自己體會(huì)。
nn.Linear是做一個(gè)線性的運(yùn)算,參數(shù)的含義代表了輸入層與輸出層的結(jié)構(gòu),即3*1;在訓(xùn)練階段,有幾行是Pytorch不同于別的框架的,首先loss是一個(gè)Variable,通過(guò)loss.data可以取出一個(gè)Tensor,再通過(guò)data[0]可以得到一個(gè)int或者float類型的值,我們才可以進(jìn)行基本運(yùn)算或者顯示。每次計(jì)算梯度之前,都需要將梯度歸零,否則梯度會(huì)疊加。個(gè)人覺(jué)得別的語(yǔ)句還是比較好懂的,如果有疑問(wèn)可以在下方評(píng)論。
下面是我們的擬合結(jié)果
其實(shí)效果肯定會(huì)很好,因?yàn)橹皇且粋€(gè)非常簡(jiǎn)單的全連接網(wǎng)絡(luò),希望大家通過(guò)這個(gè)小例子可以學(xué)到Pytorch的一些基本操作。往后我們會(huì)繼續(xù)更新,完整代碼請(qǐng)戳,https://github.com/ZhichaoDuan/PytorchCourse
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python pathlib模塊使用方法及實(shí)例解析
這篇文章主要介紹了Python pathlib模塊使用方法及實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10python的描述符(descriptor)、裝飾器(property)造成的一個(gè)無(wú)限遞歸問(wèn)題分享
這篇文章主要介紹了python的描述符(descriptor)、裝飾器(property)造成的一個(gè)無(wú)限遞歸問(wèn)題分享,一個(gè)不太會(huì)遇到的問(wèn)題,需要的朋友可以參考下2014-07-07python實(shí)現(xiàn)自動(dòng)打卡小程序
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)自動(dòng)打卡小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03詳解Pytorch+PyG實(shí)現(xiàn)GAT過(guò)程示例
這篇文章主要為大家介紹了Pytorch+PyG實(shí)現(xiàn)GAT過(guò)程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04python使用cookie庫(kù)操保存cookie詳解
Python中Cookie模塊(python3中為http.cookies)提供了一個(gè)類似字典的特殊對(duì)象SimpleCookie,其中存儲(chǔ)并管理著稱為Morsel的cookie值集合,這里介紹了python操作cookie的使用方法2014-03-03