首頁 > 軟體

Pytorch實現邏輯迴歸分類

2022-07-30 18:05:45

本文範例為大家分享了Pytorch實現邏輯迴歸分類的具體程式碼,供大家參考,具體內容如下

1、程式碼實現

步驟:

1.獲得資料
2.建立邏輯迴歸模型
3.定義損失函數
4.計算損失函數
5.求解梯度
6.梯度更新
7.預測測試集

import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt
from torch.autograd import Variable
import torchvision.datasets as dataset
import torchvision.transforms as transforms
from torch.utils.data import DataLoader

input_size = 784  # 輸入到邏輯迴歸模型中的輸入大小
num_classes = 10  # 分類的類別個數
num_epochs = 10  # 迭代次數
batch_size = 50  # 批次訓練個數
learning_rate = 0.01  # 學習率


# 下載訓練資料和測試資料
train_dataset = dataset.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True)
test_dataset = dataset.MNIST(root='./data',train=False, transform=transforms.ToTensor)

# 使用DataLoader形成批次檔
train_loader = DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False)

# 建立邏輯迴歸類模型  (sigmoid(wx+b))
class LogisticRegression(nn.Module):
    def __init__(self,input_size,num_classes):
        super(LogisticRegression,self).__init__()
        self.linear = nn.Linear(input_size,num_classes)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        out = self.linear(x)
        out = self.sigmoid(out)
        return out

# 設定模型引數
model = LogisticRegression(input_size, num_classes)
# 定義損失函數,分類任務,使用交叉熵
criterion = nn.CrossEntropyLoss()
# 優化演演算法,隨機梯度下降,lr為學習率,獲得模型需要更新的引數值
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)


# 使用訓練資料訓練模型
for epoch in range(num_epochs):
    # 批次資料進行模型訓練
    for i, (images, labels) in enumerate(train_loader):
        # 需要將資料轉換為張量Variable
        images = Variable(images.view(-1, 28*28))
        labels = Variable(labels)
        
        # 梯度更新前需要進行梯度清零
        optimizer.zero_grad()

        # 獲得模型的訓練資料結果
        outputs = model(images)
        
        # 計算損失函數用於計算梯度
        loss = criterion(outputs, labels)

        # 計算梯度
        loss.backward()
    
        # 進行梯度更新
        optimizer.step()

        # 每隔一段時間輸出一個訓練結果
        if (i+1) % 100 == 0:
            print('Epoch:[%d %d], Step:[%d/%d], Loss: %.4f' % (epoch+1,num_epochs,i+1,len(train_dataset)//batch_size,loss.item()))

# 訓練好的模型預測測試資料集
correct = 0
total = 0
for images, labels in test_loader:
    images = Variable(images.view(-1, 28*28))  # 形式為(batch_size,28*28)
    outputs = model(images)
    _,predicts = torch.max(outputs.data,1)  # _輸出的是最大概率的值,predicts輸出的是最大概率值所在位置,max()函數中的1表示維度,意思是計算某一行的最大值
    total += labels.size(0)
    correct += (predicts==labels).sum()

print('Accuracy of the model on the 10000 test images: %d %%' % (100 * correct / total))

2、踩過的坑

1.在程式碼中下載訓練資料和測試資料的時候,兩段程式碼是有區別的:

train_dataset = dataset.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True)
test_dataset = dataset.MNIST(root='./data',train=False, transform=transforms.ToTensor)

第一段程式碼中多了一個download=True,這個的作用是,如果為True,則從Internet下載資料集並將其存放在根目錄中。如果資料已經下載,則不會再次下載。

在第二段程式碼中沒有加download=True,加了的話在使用測試資料進行預測的時候會報錯。

程式碼中transform=transforms.ToTensor()的作用是將PIL影象轉換為Tensor,同時已經進行歸一化處理。

2.程式碼中設定損失函數:

criterion = nn.CrossEntropyLoss()
loss = criterion(outputs, labels)

一開始的時候直接使用:

loss = nn.CrossEntropyLoss()
loss = loss(outputs, labels)

這樣也會報錯,因此需要將loss改為criterion。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com