softmax的基本概念

 
交叉熵损失函数

模型训练和预测
在训练好softmax回归模型后,给定任一样本特征,就可以预测每个输出类别的概率。通常,我们把预测概率最大的类别作为输出类别。如果它与真实类别(标签)一致,说明这次预测是正确的。
代码
- 导入相关库
import torch
from torch import nn
- 定义数据集
 自定义输入X为7张高和宽均为2像素的灰度图片
 自定义输出target为 y1=0, y2=1 , y3=2
# 确定随机数种子
torch.manual_seed(7)
# 自定义数据集
X = torch.rand((7, 2, 2))
target = torch.randint(0, 2, (7,))
- 定义网络结构
 定义如下所示的网络结构

# 自定义网络结构
class LinearNet(nn.Module):
    def __init__(self):
        super(LinearNet, self).__init__()
        # 定义一层全连接层
        self.dense = nn.Linear(4, 3)
        # 定义Softmax
        self.softmax = nn.Softmax(dim=1)
    def forward(self, x):
        y = self.dense(x.view((-1, 4)))
        y = self.softmax(y)
        return y
net = LinearNet()
- 定义损失函数
 torch.nn.CrossEntropyLoss(weight=None, size_average=None, ignore_index=-100, reduce=None, reduction=‘mean’)
 衡量模型输出与真实标签的差异,在分类时相当有用。
 结合了nn.LogSoftmax()和nn.NLLLoss()两个函数,进行交叉熵计算。
 主要参数:
 weight: 各类别的loss设置权值
 ignore_index: 忽略某个类别
 reduction: 计算模式,可为none/sum/mean
 none: 逐个元素计算
 sum: 所有元素求和,返回标量
 mean: 加权平均,返回标量
loss = nn.CrossEntropyLoss()  # 交叉熵损失函数
- 定义优化函数
 torch.optim.SGD(params, lr=, momentum=0, dampening=0, weight_decay=0, nesterov=False)
 构建一个优化器对象optimizer,用来保存当前的状态,并能够根据计算得到的梯度来更新参数,使得模型输出更接近真实标签。
 学习率(learning rate)控制更新的步伐。
 主要参数:
 params: 管理的参数组
 lr: 初始化学习率
 momentum: 动量系数
 weight_decay: L2正则化系数
 nesterov: 是否采用NAG
 zero_grad(): 清空所管理参数的梯度,因为Pytorch张量梯度不自动清零。
 step(): 执行一步更新
optimizer = torch.optim.SGD(net.parameters(), lr=0.1)  # 随机梯度下降法
- 开始训练模型
for epoch in range(70):
    train_l = 0.0
    y_hat = net(X)
    l = loss(y_hat, target).sum()
    # 梯度清零
    optimizer.zero_grad()
    # 自动求导梯度
    l.backward()
    # 利用优化函数调整所有权重参数
    optimizer.step()
    train_l += l
    print('epoch %d, loss %.4f' % (epoch + 1, train_l))

















