• 动手从0实现 softmax 回归


    动手从0实现 softmax 回归:

    1)引入相关包

    1. import torch  
    2. import torchvision  
    3. import torchvision.transforms as transforms  
    4. import numpy as np  

    2)下载并装载Fashion MNIST 数据集

    1. mnist_train = torchvision.datasets.FashionMNIST(root='~/Datasets/FashionMNIST', train=True,   
    2. download=False, transform=transforms.ToTensor())  
    3. mnist_test = torchvision.datasets.FashionMNIST(root='~/Datasets/FashionMNIST', train=False,   
    4. download=False, transform=transforms.ToTensor())  

    3)构建迭代器

    1. batch_size = 256  
    2. train_iter = torch.utils.data.DataLoader(mnist_train, batch_size=batch_size, shuffle=True)  
    3. test_iter = torch.utils.data.DataLoader(mnist_test, batch_size=batch_size, shuffle=False) 

    4)初始化学习参数

    1. #初始化学习参数  
    2. num_inputs = 784  
    3. num_outputs = 10  
    4. w = torch.tensor(np.random.normal(0, 0.01, (num_inputs, num_outputs)), dtype=torch.float)  
    5. b = torch.zeros(num_outputs, dtype=torch.float)  
    6. w.requires_grad_(requires_grad=True)  
    7. b.requires_grad_(requires_grad=True) 

    5)定义相关函数

    1. #定义Softmax决策函数  
    2. def softmax(x,w,b):  
    3.     y = torch.mm(x.view(-1, num_inputs), w) + b  
    4.     y_exp = y.exp()  
    5.     y_sum = y_exp.sum(dim=1, keepdim=True)  
    6.     return y_exp / y_sum  
    7. #定义交叉熵损失函数  
    8. def cross_entropy(y_hat, y):  
    9.     #其中gather()就相当于是维度级高级的矩阵索引;并且真实值向量y中其他类别都为0所以不用考虑  
    10.     return - torch.log(y_hat.gather(1, y.view(-1, 1)))  
    11. #定义梯度下降优化函数  
    12. def sgd(params, lr, batch_size):  
    13.     for param in params:  
    14.         param.data -= lr * param.grad / batch_size  
    15. #定义分类准确率  
    16. def accuracy(y_hat, y):  
    17.     return (y_hat.argmax(dim=1) == y).float().mean().item()  
    18. #模型未训练前的准确率  
    19. def evaluate_accuracy(data_iter, net):  
    20.     acc_sum, n = 0.0, 0  
    21.     for X, y in data_iter:  
    22.         acc_sum += (net(X , w ,b).argmax(dim=1) == y).float().sum().item()  
    23.         n += y.shape[0]  
    24.     return acc_sum / n  

    6)开始训练并计算每轮损失

    1. #开始训练并计算每轮损失  
    2. lr = 0.01  
    3. num_epochs = 20  
    4. net = softmax  
    5. loss = cross_entropy  
    6. for epoch in range(num_epochs):  
    7.     train_l_sum, train_acc_sum, n = 0.0, 0.0, 0  
    8.     for X, Y in train_iter:  
    9.         l = loss(net(X, w, b), Y).sum()  
    10.         l.backward()  
    11.         sgd([w, b], lr, batch_size)  
    12.         w.grad.data.zero_()  
    13.         b.grad.data.zero_()  
    14.         train_l_sum += l.item()  
    15.         train_acc_sum += (net(X, w, b).argmax(dim=1) == Y).sum().item()  
    16.         n += Y.shape[0]  
    17.     test_acc = evaluate_accuracy(test_iter, net)  
    18.     print('epoch %d, loss %.4f, train acc %.3f, test acc %.3f'  
    19.               % (epoch + 1, train_l_sum / n, train_acc_sum / n, test_acc))  
  • 相关阅读:
    ETL中元数据处理的方式
    多位大佬合力讲解23种设计模式,这不是轻松拿下
    有奖提问|《新程序员》专访“Apache之父”Brian Behlendorf
    机器学习 | SVD奇异值分解
    【无标题】
    Flinkcdcmysql实时同步pgsql报错,如何排查后面id
    Java 开发环境配置
    Python,图像处理,骨架线,中轴线
    Oracle Primavera Unifier 23.10 新特征
    水库大坝安全监测是什么和主要作用?
  • 原文地址:https://blog.csdn.net/ccyyll1/article/details/126020585