国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

詳解Pytorch 使用Pytorch擬合多項(xiàng)式(多項(xiàng)式回歸)

2020-01-04 14:59:02
字體:
供稿:網(wǎng)友

使用Pytorch來編寫神經(jīng)網(wǎng)絡(luò)具有很多優(yōu)勢(shì),比起Tensorflow,我認(rèn)為Pytorch更加簡(jiǎn)單,結(jié)構(gòu)更加清晰。

希望通過實(shí)戰(zhàn)幾個(gè)Pytorch的例子,讓大家熟悉Pytorch的使用方法,包括數(shù)據(jù)集創(chuàng)建,各種網(wǎng)絡(luò)層結(jié)構(gòu)的定義,以及前向傳播與權(quán)重更新方式。

比如這里給出

Pytorch,多項(xiàng)式    

很顯然,這里我們只需要假定

Pytorch,多項(xiàng)式

這里我們只需要設(shè)置一個(gè)合適尺寸的全連接網(wǎng)絡(luò),根據(jù)不斷迭代,求出最接近的參數(shù)即可。

但是這里需要思考一個(gè)問題,使用全連接網(wǎng)絡(luò)結(jié)構(gòu)是毫無疑問的,但是我們的輸入與輸出格式是什么樣的呢?

只將一個(gè)x作為輸入合理嗎?顯然是不合理的,因?yàn)槊恳粋€(gè)神經(jīng)元其實(shí)模擬的是wx+b的計(jì)算過程,無法模擬冪運(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] 

接下來定義模型:

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() 

接下來我們定義損失函數(shù)和優(yōu)化器:

criterion = nn.MSELoss() optimizer = optim.SGD(model.parameters(), lr = 1e-3) 

網(wǎng)絡(luò)部件定義完后,開始訓(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 

到此我們的所有代碼就敲完了,接下來我們開始詳細(xì)了解一下其中的一些代碼。

在make_features()定義中,torch.cat是將計(jì)算出的向量拼接成矩陣。unsqueeze是作一個(gè)維度上的變化。

get_batch中,torch.randn是產(chǎn)生指定維度的隨機(jī)數(shù),如果你的機(jī)器支持GPU加速,可以將Variable放在GPU上進(jìn)行運(yùn)算,類似語句含義相通。

x.mm是作矩陣乘法。

模型定義是重中之重,其實(shí)當(dāng)你掌握Pytorch之后,你會(huì)發(fā)現(xiàn)模型定義是十分簡(jiǎn)單的,各種基本的層結(jié)構(gòu)都已經(jīng)為你封裝好了。所有的層結(jié)構(gòu)和損失函數(shù)都來自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,通過loss.data可以取出一個(gè)Tensor,再通過data[0]可以得到一個(gè)int或者float類型的值,我們才可以進(jìn)行基本運(yùn)算或者顯示。每次計(jì)算梯度之前,都需要將梯度歸零,否則梯度會(huì)疊加。個(gè)人覺得別的語句還是比較好懂的,如果有疑問可以在下方評(píng)論。

下面是我們的擬合結(jié)果

Pytorch,多項(xiàng)式

其實(shí)效果肯定會(huì)很好,因?yàn)橹皇且粋€(gè)非常簡(jiǎn)單的全連接網(wǎng)絡(luò),希望大家通過這個(gè)小例子可以學(xué)到Pytorch的一些基本操作。往后我們會(huì)繼續(xù)更新,完整代碼請(qǐng)戳,https://github.com/ZhichaoDuan/PytorchCourse

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到python教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 南雄市| 句容市| 车致| 吉木萨尔县| 彭泽县| 慈利县| 桦南县| 津市市| 黄平县| 鄂伦春自治旗| 乌什县| 平顺县| 饶阳县| 城市| 航空| 麻江县| 和平县| 松阳县| 涞源县| 得荣县| 太康县| 玛曲县| 高淳县| 余庆县| 沙雅县| 项城市| 云梦县| 民勤县| 中超| 诸城市| 嫩江县| 滦南县| 中超| 绥阳县| 丹寨县| 涞水县| 安仁县| 凌海市| 山丹县| 紫阳县| 明水县|