天天看點

pytorch深入學習(四)

文章目錄

      • 基本原理
      • pytorch是如何操作的

基本原理

pytorch深入學習(四)
pytorch深入學習(四)
pytorch深入學習(四)
pytorch深入學習(四)

pytorch是如何操作的

  • 在了解cross entropy之前先了解下NLLLoss, 就是Negative Log Likelihood Loss
pytorch深入學習(四)
  • 輸入端是softmax經過log之後的值,不過這裡要注意,y可以是one-hot形式,也可以是是單純的數像[2, 3, 4]這種
  • CrossEntropyLoss就是把以上Softmax–Log–NLLLoss合并成一步, 也就是說, CrossEntropyLoss的預測值可以是線性層直接和标簽值算損失

下面程式需要注意的點:

1. 正确率計算中的max, 也有argmax, max第一個是數, 第二個是索引, 0是對行做, 1 是對列做, 1做完了後次元是batch, 也就是行的次元

2. 還有這個(perd==labels).sum()可以學習下

3. dataloader是如何疊代的(元組)

4. 用CNN特征圖變小, 那麼通道得變多

import torch
import torchvision
import torch.nn as nn


batch_size = 128
num_workers = 2
# 先對資料相關的資料進行設定


learning_rate = 0.001
num_epoches = 200



train_data = torchvision.datasets.MNIST(root='./dataset/mnist', train=True, download=True, transform=torchvision.transforms.ToTensor())
train_loader = torch.utils.data.DataLoader(train_data, batch_size=batch_size, shuffle=True)

test_data = torchvision.datasets.MNIST(root='./dataset/mnist', train=False, download=True, transform=torchvision.transforms.ToTensor())
test_loader = torch.utils.data.DataLoader(test_data, batch_size=batch_size, shuffle=False)

class NN(nn.Module):
    def __init__(self, input_dim, output_dim):
        super(NN, self).__init__()
        self.linear = nn.Sequential(
            nn.Linear(input_dim, 50),
            nn.ReLU(),
            nn.Linear(50, output_dim)
        )

    def forward(self, x):
        x = x.reshape(x.shape[0], -1)
        x = self.linear(x)
        return x

Linear_model = NN(784, 10)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(Linear_model.parameters(), lr=learning_rate)

def accuracy(epoch, loader, model):# 檢查總的正确率
    num_correct = 0
    num_samples = 0
    model.eval()


    for x, y in loader:
        x = x
        y = y
        scores = model(x)
        _, pred = scores.max(1) # 注意max和argmax
        num_correct += (pred==y).sum()
        num_samples += pred.shape[0]
        correct = (num_correct/num_samples)*100
        print('batch:{}, correct:{}'.format(epoch, correct))

    model.train()






if __name__ == '__main__':
    for epoch in range(num_epoches):
        for index, (image, labels) in enumerate(train_loader):
            y_pre = Linear_model(image)
            loss = criterion(y_pre, labels)
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()

        accuracy(epoch, test_loader, Linear_model)

           

繼續閱讀