pytorch深入学习(四)

基本原理

请添加图片描述
请添加图片描述

请添加图片描述
请添加图片描述

pytorch是如何操作的

  • 在了解cross entropy之前先了解下NLLLoss, 就是Negative Log Likelihood Loss

在这里插入图片描述

  • 输入端是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)

猜你喜欢

转载自blog.csdn.net/landing_guy_/article/details/120345070