溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Pytorch基礎(chǔ)中的邏輯回歸是怎么樣的

發(fā)布時(shí)間:2021-12-04 18:36:23 來源:億速云 閱讀:153 作者:柒染 欄目:大數(shù)據(jù)

這篇文章將為大家詳細(xì)講解有關(guān)Pytorch基礎(chǔ)中的邏輯回歸是怎么樣的,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

邏輯回歸基本表示:

對(duì)于簡單邏輯回歸,我們可以采用一個(gè)神經(jīng)網(wǎng)絡(luò)進(jìn)行表示:

Pytorch基礎(chǔ)中的邏輯回歸是怎么樣的

所以可以看到,輸入為兩個(gè)輸入,所以對(duì)應(yīng)的權(quán)值也是兩個(gè),權(quán)值矩陣為2*1的矩陣;

輸出為o=w1*x1+w2*x2;

對(duì)于三個(gè)樣本,可以看到如下公式:

Pytorch基礎(chǔ)中的邏輯回歸是怎么樣的

所以轉(zhuǎn)換為矢量乘積方式:

Pytorch基礎(chǔ)中的邏輯回歸是怎么樣的

所以,針對(duì)于三個(gè)參數(shù),可以得到梯度向量:

Pytorch基礎(chǔ)中的邏輯回歸是怎么樣的

輸入處理:

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í)即可;

網(wǎng)絡(luò)結(jié)構(gòu):

對(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倍

訓(xùn)練階段:

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ò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(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)容。

AI