您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)Pytorch基礎(chǔ)中的邏輯回歸是怎么樣的,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
對(duì)于簡單邏輯回歸,我們可以采用一個(gè)神經(jīng)網(wǎng)絡(luò)進(jìn)行表示:
所以可以看到,輸入為兩個(gè)輸入,所以對(duì)應(yīng)的權(quán)值也是兩個(gè),權(quán)值矩陣為2*1的矩陣;
輸出為o=w1*x1+w2*x2;
對(duì)于三個(gè)樣本,可以看到如下公式:
所以轉(zhuǎn)換為矢量乘積方式:
所以,針對(duì)于三個(gè)參數(shù),可以得到梯度向量:
num_inputs=2#輸入個(gè)數(shù) num_examples=1000#樣本個(gè)數(shù) true_w=[2,-3.4] #w參數(shù)矩陣 true_b=4.2 #b偏置參數(shù) features=torch.tensor(np.random.normal(0,1,(num_examples,num_inputs)),dtype=torch.float) #構(gòu)建基本樣本集:其中采用0~1的分布采樣,輸入的樣本集為2*1000; labels=true_w[0]*features[:,0]*features[:,0]+true_w[1]*features[:,1]+true_b #標(biāo)簽集,也就是最后的y,直接進(jìn)行公式累乘即可; labels+=torch.tensor(np.random.normal(0,0.01,size=labels.size()),dtype=torch.float) #增加一個(gè)擾動(dòng)項(xiàng) batch_size=10 dataset=Data.TensorDataset(features,labels) #使用Data函數(shù)構(gòu)建數(shù)據(jù)集; data_iter=Data.DataLoader(dataset,batch_size,shuffle=True) #對(duì)構(gòu)建的dataset進(jìn)行切分,按照的個(gè)數(shù)參照batch_size
對(duì)于輸入可以參照上述,對(duì)于自己的數(shù)據(jù)集可以直接采用Data.TensorDataset來進(jìn)行構(gòu)造;
之后我們指定網(wǎng)絡(luò)的結(jié)構(gòu)和初始參數(shù),直接進(jìn)行加載dataset進(jìn)行參數(shù)學(xué)習(xí)即可;
對(duì)于網(wǎng)絡(luò)結(jié)構(gòu)的定義,通常有兩種方式:
1.采用類繼承進(jìn)行定義;
2.通過使用函數(shù)傳參逐層累加的方式進(jìn)行定義;
如果通過類繼承進(jìn)行定義:
class LinearNet(nn.Module): def __init__(self, n_feature): super(LinearNet, self).__init__() self.linear = nn.Linear(n_feature, 1) # forward 定義前向傳播 def forward(self, x): y = self.linear(x) return y net = LinearNet(num_inputs)
可以看到LinearNet類繼承自nn.Module類;
如果通過逐層類加進(jìn)行定義:
通常是使用Sequential函數(shù)進(jìn)行定義:
# 寫法一 net = nn.Sequential( nn.Linear(num_inputs, 1) # 此處還可以傳入其他層 ) # 寫法二 net = nn.Sequential() net.add_module('linear', nn.Linear(num_inputs, 1)) # net.add_module ...... # 寫法三 from collections import OrderedDict net = nn.Sequential(OrderedDict([ ('linear', nn.Linear(num_inputs, 1)) # ...... ]))
可以看到三種最常用的方法;
其實(shí)網(wǎng)絡(luò)結(jié)構(gòu)寫法很多,也可以采用自己定義的網(wǎng)絡(luò)構(gòu)造函數(shù)返回一個(gè)net,這樣也是比較常見的操作;
在構(gòu)建網(wǎng)絡(luò)后,需要初始化模型參數(shù),也就是要把網(wǎng)絡(luò)中的w,b全部給予一個(gè)默認(rèn)值:
init.normal_(net[0].weight,mean=0,std=0.01) init.constant_(net[0].bias,val=0)
將權(quán)重參數(shù)每個(gè)元素初始化為隨機(jī)采樣于均值為0、標(biāo)準(zhǔn)差為0.01的正態(tài)分布,偏差初始化為零;
之后我們定義一個(gè)損失函數(shù),對(duì)于線性回歸,采用MSEloss即可;
對(duì)于優(yōu)化器,我們采用learning rate=0.03,SGD梯度下降算法進(jìn)行優(yōu)化;
loss=nn.MSELoss() optimizer=optim.SGD(net.parameters(),lr=0.003);
對(duì)于學(xué)習(xí)率的調(diào)整,我們也可以進(jìn)行動(dòng)態(tài)調(diào)整,例如分層調(diào)整,動(dòng)態(tài)調(diào)整:
optimizer =optim.SGD([ # 如果對(duì)某個(gè)參數(shù)不指定學(xué)習(xí)率,就使用最外層的默認(rèn)學(xué)習(xí)率 {'params': net.subnet1.parameters()}, # lr=0.03 {'params': net.subnet2.parameters(), 'lr': 0.01} ], lr=0.03) # 調(diào)整學(xué)習(xí)率 for param_group in optimizer.param_groups: param_group['lr'] *= 0.1 # 學(xué)習(xí)率為之前的0.1倍
num_epochs = 3 for epoch in range(1, num_epochs + 1): for X, y in data_iter: output = net(X) l = loss(output, y.view(-1, 1)) optimizer.zero_grad() # 梯度清零,等價(jià)于net.zero_grad() l.backward() optimizer.step() print('epoch %d, loss: %f' % (epoch, l.item())) dense = net[0] print(true_w, dense.weight) print(true_b, dense.bias)
所以看到,最后可以通過查看參數(shù),來進(jìn)行對(duì)比;
值得注意的是,每輪訓(xùn)練之后,要記得將優(yōu)化器的殘留梯度清0,防止累加;
關(guān)于Pytorch基礎(chǔ)中的邏輯回歸是怎么樣的就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。