日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

深度学习pytorch--softmax回归(三)

發布時間:2023/12/3 pytorch 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度学习pytorch--softmax回归(三) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

softmax回歸的簡潔實現

    • 獲取和讀取數據
    • 定義和初始化模型
    • softmax和交叉熵損失函數
    • 定義優化算法
    • 模型評價
    • 訓練模型
    • 小結
    • 完整代碼

前兩篇鏈接:
深度學習pytorch–softmax回歸(一)
深度學習pytorch–softmax回歸(二)

本文使用框架來實現模型。

獲取和讀取數據

我們仍然使用Fashion-MNIST數據集和上一節中設置的批量大小。

#獲取數據集 mnist_train=torchvision.datasets.FashionMNIST('./Datasets/FashionMNIST',train=True,download=False,transform=transforms.ToTensor()) mnist_test=torchvision.datasets.FashionMNIST('./Datasets/FashionMNIST',train=False,download=False,transform=transforms.ToTensor())#讀取數據集 batch_size=256 num_workers=0 #多進程加速數據讀取,0則不使用多進程 train_iter = torch.utils.data.DataLoader(mnist_train, batch_size=batch_size, shuffle=True, num_workers=num_workers) test_iter = torch.utils.data.DataLoader(mnist_test, batch_size=batch_size, shuffle=False, num_workers=num_workers)

定義和初始化模型

在softmax回歸(一)中提到,softmax回歸的輸出層是一個全連接層,所以我們用一個線性模塊就可以了。因為前面我們數據返回的每個batch樣本x的形狀為(batch_size, 1, 28, 28), 所以我們要先用view()將x的形狀轉換成(batch_size, 784)才送入全連接層。

num_inputs = 784 num_outputs = 10class LinearNet(nn.Module): def __init__(self,num_inputs,num_outputs):super().__init__()self.linear=nn.Linear(num_inputs,num_outputs)def forward(self,x):y=self.linear(x.view(x.shape[0], -1)) #等價于view(-1,num_inputs),這里是因為不想再引入num_inputs參數所以換種形式寫return ynet=LinearNet(num_inputs,num_outputs)

然后,我們使用均值為0、標準差為0.01的正態分布隨機初始化模型的權重參數。

init.normal_(net.linear.weight, mean=0, std=0.01) init.constant_(net.linear.bias, val=0)

softmax和交叉熵損失函數

如果做了上一次實驗,那么你可能意識到了分開定義softmax運算和交叉熵損失函數可能會造成數值不穩定。因此,PyTorch提供了一個包括softmax運算和交叉熵損失計算的函數。它的數值穩定性更好。

Cross_loss = nn.CrossEntropyLoss()

定義優化算法

我們使用學習率為0.1的小批量隨機梯度下降作為優化算法。

optimizer = torch.optim.SGD(net.parameters(), lr=0.1)

模型評價

和上一實驗一樣

def evaluate_accuracy(data_iter,net): #在所有樣本上的準確率acc_sum,n=0.0,0for X,y in data_iter:acc_sum+=(net(X).argmax(dim=1) == y).float().sum().item()n+=y.shape[0] #獲取總數量(此處每批256)return acc_sum / n

訓練模型

和上一實驗步驟一樣。

num_epochs = 5 for epoch in range(num_epochs):train_loss_sum=0.0train_acc_sum=0.0n=0 #用來計算數據總數for X,y in train_iter:y_hat=net(X)loss=Cross_loss(y_hat,y).sum()loss.backward()optimizer.step()optimizer.zero_grad()train_loss_sum+=loss.item()train_acc_sum+=(y_hat.argmax(dim=1) == y).sum().item()n+=y.shape[0]test_acc=evaluate_accuracy(test_iter,net)print('epoch {}, loss {:.4f}, train acc {:.3f}, test acc {:.3f}'.format(epoch + 1, train_loss_sum / n, train_acc_sum / n, test_acc))

輸出:

epoch 1, loss 0.0031, train acc 0.745, test acc 0.790 epoch 2, loss 0.0022, train acc 0.812, test acc 0.807 epoch 3, loss 0.0021, train acc 0.825, test acc 0.806 epoch 4, loss 0.0020, train acc 0.832, test acc 0.810 epoch 5, loss 0.0019, train acc 0.838, test acc 0.823

小結

  • PyTorch提供的函數往往具有更好的數值穩定性。
  • 可以使用PyTorch更簡潔地實現softmax回歸。

完整代碼

#使用框架來實現softmax回歸 import torch import torchvision import torchvision.transforms as transforms import torch.nn as nn from torch.nn import init import torch.optim as optim#獲取數據集 mnist_train=torchvision.datasets.FashionMNIST('./Datasets/FashionMNIST',train=True,download=False,transform=transforms.ToTensor()) mnist_test=torchvision.datasets.FashionMNIST('./Datasets/FashionMNIST',train=False,download=False,transform=transforms.ToTensor())#讀取數據集 batch_size=256 num_workers=0 #多進程加速數據讀取,0則不使用多進程 train_iter = torch.utils.data.DataLoader(mnist_train, batch_size=batch_size, shuffle=True, num_workers=num_workers) test_iter = torch.utils.data.DataLoader(mnist_test, batch_size=batch_size, shuffle=False, num_workers=num_workers)#定義模型 num_inputs = 784 num_outputs = 10class LinearNet(nn.Module): def __init__(self,num_inputs,num_outputs):super().__init__()self.linear=nn.Linear(num_inputs,num_outputs)def forward(self,x):y=self.linear(x.view(x.shape[0], -1)) #等價于view(-1,num_inputs),這里是因為不想再引入num_inputs參數所以換種形式寫return ynet=LinearNet(num_inputs,num_outputs)#初始化模型參數 init.normal_(net.linear.weight, mean=0, std=0.01) init.constant_(net.linear.bias, val=0) #softmax和交叉熵 Cross_loss = nn.CrossEntropyLoss() #包括了softmax運算和交叉熵損失計算s #定義優化算法 optimizer = optim.SGD(net.parameters(), lr=0.1) #模型評價 def evaluate_accuracy(data_iter,net): #在所有樣本上的準確率acc_sum,n=0.0,0for X,y in data_iter:acc_sum+=(net(X).argmax(dim=1) == y).float().sum().item()n+=y.shape[0] #獲取總數量(此處每批256)return acc_sum / n #訓練模型 num_epochs = 5 for epoch in range(num_epochs):train_loss_sum=0.0train_acc_sum=0.0n=0 #用來計算數據總數for X,y in train_iter:y_hat=net(X)loss=Cross_loss(y_hat,y).sum()loss.backward()optimizer.step()optimizer.zero_grad()train_loss_sum+=loss.item()train_acc_sum+=(y_hat.argmax(dim=1) == y).sum().item()n+=y.shape[0]test_acc=evaluate_accuracy(test_iter,net)print('epoch {}, loss {:.4f}, train acc {:.3f}, test acc {:.3f}'.format(epoch + 1, train_loss_sum / n, train_acc_sum / n, test_acc))

總結

以上是生活随笔為你收集整理的深度学习pytorch--softmax回归(三)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。