Pytorch基础(5)——SOFTMAX回归相关知识

  • 对多维 Tensor 按维度操作

    给定⼀个 Tensor 矩阵 X 。我们可以只对其中同⼀列( dim=0 )或同⼀⾏( dim=1 )的元素求和,并在结果中保留⾏和列这两个维度( keepdim=True )。
    X = torch.tensor([[1, 2, 3], [4, 5, 6]])
    print(X.sum(dim=0, keepdim=True))
    print(X.sum(dim=1, keepdim=True))
    
    # 输出
    tensor([[5, 7, 9]])
    tensor([[ 6],
            [15]])
  •  gather函数

    变量 y_hat 2 个样本在 3 个类别的预测概率,变量 y 是这 2个样本的标签类别。通过使⽤ gather 函数,我们得到了 2 个样本的标签的预测概率。
    y_hat = torch.tensor([[0.1, 0.3, 0.6], [0.3, 0.2, 0.5]])
    y = torch.LongTensor([0, 2])
    y_hat.gather(1, y.view(-1, 1))
    
    # 输出
    tensor([[0.1000],
            [0.5000]])
    下⾯实现了( softmax 回归)交叉熵损失函数。
    def cross_entropy(y_hat, y):
     return - torch.log(y_hat.gather(1, y.view(-1, 1)))

  •  计算准确率

    定义准确率 accuracy 函数。其中 y_hat.argmax(dim=1) 返回矩阵 y_hat 每⾏中最⼤元素的索 引,且返回结果与变量 y 形状相同。相等条件判断式 (y_hat.argmax(dim=1) == y) 是⼀个类型为 ByteTensor Tensor ,我们⽤ float() 将其转 换为值为0 (相等为假)或 1 (相等为真)的浮点型 Tensor
    def accuracy(y_hat, y):
        return (y_hat.argmax(dim=1) == y).float().mean().item()
  • 训练模型 

    num_epochs, lr = 5, 0.1
    
    # 本函数已保存在d2lzh包中⽅便以后使⽤
    def train_ch3(net, train_iter, test_iter, loss, num_epochs,
    batch_size,params=None, lr=None, optimizer=None):
         for epoch in range(num_epochs):
             train_l_sum, train_acc_sum, n = 0.0, 0.0, 0
             for X, y in train_iter:
                 y_hat = net(X)
                 l = loss(y_hat, y).sum()
     
                 # 梯度清零
                 if optimizer is not None:
                     optimizer.zero_grad()
                 elif params is not None and params[0].grad is not None:
                     for param in params:
                         param.grad.data.zero_()
     
                 l.backward()
                 if optimizer is None:
                     d2l.sgd(params, lr, batch_size)
                 else:
                     optimizer.step() # “softmax回归的简洁实现”将⽤到
     
     
                 train_l_sum += l.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 %d, loss %.4f, train acc %.3f, test acc %.3f'
                 % (epoch + 1, train_l_sum / n, train_acc_sum / n, test_acc))
    
    train_ch3(net, train_iter, test_iter, cross_entropy, num_epochs,
    batch_size, [W, b], lr)
    
    
    # 输出
    epoch 1, loss 0.7878, train acc 0.749, test acc 0.794
    epoch 2, loss 0.5702, train acc 0.814, test acc 0.813
    epoch 3, loss 0.5252, train acc 0.827, test acc 0.819
    epoch 4, loss 0.5010, train acc 0.833, test acc 0.824
    epoch 5, loss 0.4858, train acc 0.836, test acc 0.815

### Softmax 回归概述 Softmax 回归是一种用于解决多分类问题的监督学习算法。该方法通过将输入特征映射到多个离散类别上的概率分布来工作,从而允许模型预测给定输入最可能所属的类别。 #### 1. Softmax 函数基本概念 Softmax 函数接收一组实数值作为输入,并将其转换为表示各个类别的相对概率值向量[^1]。具体来说,对于任意一个输入 \( z \),其对应的第 i 类的概率可由下式给出: \[ p(y=i|z)=\frac{e^{z_i}}{\sum_{j=1}^{n}{e^{z_j}}} \] 其中 n 表示总共有多少个不同的类别;\( e^{z_i} \) 是自然常数 e 的幂运算结果;分母是对所有类别求和的结果,确保最终输出的是有效的概率分布——即各成分之和等于 1。 这种机制使得即使当某些原始得分远大于其他得分时,也能合理地反映不同选项之间的差异程度,而不会因为极端值的存在而导致整个系统的崩溃或失真。 #### 2. 底层实现细节 为了更好地理解如何实际操作这一过程,在 Python 中可以通过 PyTorchTensorFlow 等框架轻松构建并训练一个基于 Softmax 的神经网络模型来进行图像识别任务。下面是一个使用 PyTorch 实现简单版本的例子: ```python import torch.nn as nn class SimpleNet(nn.Module): def __init__(self, input_size, num_classes): super(SimpleNet, self).__init__() self.linear = nn.Linear(input_size, num_classes) def forward(self, x): out = self.linear(x) return nn.functional.softmax(out, dim=-1) ``` 此代码片段展示了怎样创建一个接受固定大小输入并向指定数量的目标类别输出概率估计的小型全连接前馈网络结构。`forward()` 方法内部调用了 `nn.functional.softmax()` 来完成最后一步转化处理。 #### 3. 数据准备与可视化 以 Fashion-MNIST 图像分类为例,这是一个包含7万个灰度服装图片的数据集,分为十个不同类型的商品标签。加载数据之后通常还需要一些预处理工作,比如标准化像素强度范围、划分训练测试集合等。接着就可以利用 matplotlib 等工具展示部分样例以便直观感受所要解决问题的特点[^2]: ```python from torchvision import datasets, transforms import matplotlib.pyplot as plt transform = transforms.Compose([transforms.ToTensor()]) train_dataset = datasets.FashionMNIST(root='./data', train=True, download=True, transform=transform) fig, axes = plt.subplots(2, 5, figsize=(10, 4)) for ax, img in zip(axes.flatten(), [train_dataset[i][0] for i in range(10)]): ax.imshow(img.squeeze().numpy(), cmap='gray') plt.show() ``` 这段脚本会下载Fashion-MNIST数据集并将前十张图片显示出来供观察者查看。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值