Pytorch學習筆記(2):邏輯迴歸
技術標籤:Pytorch在學了pythonpytorch神經網路邏輯迴歸
本部落格基於github上某位大神的pytorch入門學習程式碼,在他的基礎上加上了更詳細的中文註釋以及不懂的模組使用方法。github連線:https://github.com/yunjey/pytorch-tutorial
邏輯迴歸模型
執行程式碼之前,請確定當前環境下已經安裝torch、torchvision。
# 匯入的包
import torch
import torch.nn as nn
import torchvision
import torchvision.transforms as transforms
# 超引數設定
input_size = 784 # 輸入的大小(28*28)
num_classes = 10 # 輸出分類的個數
num_epochs = 5 # 迭代的次數
batch_size = 100 # 一次輸入的資料量
learning_rate = 0.001 # 學習率
# 載入訓練集
# 通過torchvision的這個方法從網上下載MINIST資料集
train_dataset = torchvision.datasets.MNIST(root="../../data/minist", train=True, transform=transforms.ToTensor(), download= True)
# 載入測試集
test_dataset = torchvision.datasets.MNIST(root="../../data/minist", train=False, transform=transforms.ToTensor())
# 資料載入器,用來幫助讀取訓練和測試時所使用的資料,同時設定批次大小和資料亂序
train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size = batch_size, shuffle=True)
test_loader = torch. utils.data.DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False)
# 構建一個線性模型
model = nn.Linear(input_size, num_classes)
# 損失函式,交叉熵損失函式
criterion = nn.CrossEntropyLoss()
# 優化器,使用隨機梯度下降
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
# 訓練模型
total_step = len(train_loader)
# 迭代num_epochs次
for epoch in range(num_epochs):
for i, (images, labels) in enumerate(train_loader):
# 將影象序列轉換至大小為28*28列,行數未知(設為-1)的矩陣
images = images.reshape(-1, 28*28)
# 前向傳播,得到輸出
outputs = model(images)
# 計算損失
loss = criterion(outputs, labels)
# 反向傳播及其優化過程
# 清空梯度快取,避免影響到下一個batch
optimizer.zero_grad()
# 反向傳播,計算新的梯度
loss.backward()
# 更新梯度
optimizer.step()
if (i+1) % 100 == 0:
print('Epoch [{}/{}], Step [{}/{}], Loss:{:.4f}'.format(epoch + 1, num_epochs, i+1, total_step, loss.item()))
# 模型測試
with torch.no_grad():
correct = 0
total = 0
for images, labels in test_loader:
# 設為28*28列的陣列,行數未知,設為-1
images = images.reshape(-1, 28*28)
# 預測輸出
outputs = model(images)
# _代表最大值,predicted代表最大值所在的index,1為輸出所在行的最大值
_, predicted = torch.max(outputs.data, 1)
# 返回labels的個數
total += labels.size(0)
# 計算正確預測的個數
correct += (predicted == labels).sum()
print("Accuracy of the model on the 10000 test images: {} %".format(100 * correct / total))
# 儲存訓練好的模型
torch.save(model.state_dict(), "model.ckpt")
執行結果(部分):
方法解釋
torchvision.datasets.MNIST(root,train,transform,download)
這個方法可以幫助我們下載MINIST資料集。
- root:資料下載存放的目錄
- train:是否下載訓練集,True為下載訓練集,False為下載測試集
- transform:接收影象並對其進行轉換。這裡使用的是
transforms.ToTensor()
指把PIL.Image(RGB) 或者numpy.ndarray(H x W x C) 從0到255的值對映到0到1的範圍內,並轉化成Tensor格式。(解釋來自網上) - download:是否從網上下載該資料集
torch.utils.data.DataLoader(dataset, batch_size, shuffle)
處理訓練集和測試集,用來對資料進行分批和打亂。
- dataset:輸入的資料
- batch_size:每次輸入給模型的資料的行數,即對資料進行分批,預設為1
- shuffle:是否對資料進行打亂
此外還有其他的引數,此處沒有用到不做解釋,可以查詢中文手冊或點選下面相關參考連結進行查閱。
可能出現的錯誤
有可能會出現torchvision下載錯誤問題:
原因是安裝的torch版本和torchvision不對應,可以通過安裝固定版本的torch和torchvision來解決:
pip install torch==1.3.1 -f https://download.pytorch.org/whl/torch_stable.html
pip install torchvision==0.4.1
參考:
totensor方法和normalize方法 數值對映和歸一化:https://www.cnblogs.com/lishikai/p/12364438.html
「學習筆記」torchvision.datasets.MNIST 引數解讀/中文使用手冊:https://blog.csdn.net/ftimes/article/details/105202039
[ PyTorch ] torch.utils.data.DataLoader 中文使用手冊:https://blog.csdn.net/ftimes/article/details/105201002
解決 Could not find a version that satisfies the requirement torch==1.4.0:https://www.cnblogs.com/aze999/p/13784572.html