1.1 softmax简述

1.1.1 softmax回归和线性回归的异同

首先线性回归是一种回归算法,根据当前数据去学习直线的两个参数,适⽤于输出为连续值的情景。而softmax回归则是一种分类算法,该算法将输出的是该样本属于每个类别的概率(即输出值个数等于标签⾥的类别数),适用于对离散值的预测问题(引⼊了softmax 运算使得输出更适合离散值的预测和训练)。

1.1.2 softmax函数

softmax函数能够将未规范化的预测变换为非负数并且总和为1,同时让模型保持可导的性质。首先对每个未规范化的预测求幂,这样可以确保输出非负,为了确保最终输出的概率值总和为1,再让每个求幂后的结果除以它们的总和。如下式:

1.1.3 交叉熵损失函数

如果跟线性回归一样使用平方损失函数这将过于严格,因为想要预测分类正确,只需要真实类别的概率大于其他类别的概率,而不需要预测概率完全等于标签概率。如yi = 3(第i个样本属于第三类),只需要yi = 1,yi=2的概率均小于yi=3就能预测正确。所以需要一个衡量两个概率分布差异的函数来作为损失函数:

1.2 softmax回归实现

!pip install git+https://github.com/d2l-ai/d2l-zh@release  # installing d2l
import torch
from IPython import display
from d2l import torch as d2lbatch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)num_inputs = 784# 展平每个图像,把它们看作长度为28*28=784的向量
num_outputs = 10#一共10个类别W = torch.normal(0, 0.01, size=(num_inputs, num_outputs), requires_grad=True)
b = torch.zeros(num_outputs, requires_grad=True)
print("heh",W.shape[0])#实现softmax的三个步骤
def softmax(X):X_exp = torch.exp(X)# 1)对每个项求幂partition = X_exp.sum(1, keepdim=True)# 2)对每一行求和(即每个样本)得到规范化的分母return X_exp / partition  # 这里应用了广播机制 3)将每一行除以规范化分母 确保结果的和为1def net(X):return softmax(torch.matmul(X.reshape((-1, W.shape[0])), W) + b)def cross_entropy(y_hat, y):#交叉损失熵函数return - torch.log(y_hat[range(len(y_hat)), y])#得到真实类别预测的概率def accuracy(y_hat, y):#计算预测正确的数量if len(y_hat.shape) > 1 and y_hat.shape[1] > 1:#y_hat是矩阵,那么假定第二个维度存储每个类的预测分数。#使用argmax获得每行中最大元素的索引来获得预测类别y_hat = y_hat.argmax(axis=1)cmp = y_hat.type(y.dtype) == y#如果预测类别相同 cmp=1return float(cmp.type(y.dtype).sum())#得到正确预测的数量def evaluate_accuracy(net, data_iter):#计算在指定数据集上模型的精度if isinstance(net, torch.nn.Module):net.eval()  # 将模型设置为评估模式metric = Accumulator(2)  #Accumulator用于对多个变量进行累加 这里是在Accumulator实例中创建了2个变量,分别用于存储正确预测的数量和预测的总数量with torch.no_grad():for X, y in data_iter:metric.add(accuracy(net(X), y), y.numel())#累加return metric[0] / metric[1]#预测正确的个数/预测总数class Accumulator:  #在n个变量上累加def __init__(self, n):self.data = [0.0] * ndef add(self, *args):self.data = [a + float(b) for a, b in zip(self.data, args)]def reset(self):self.data = [0.0] * len(self.data)def __getitem__(self, idx):return self.data[idx]def train_epoch_ch3(net, train_iter, loss, updater):#训练模型一个迭代周期(定义见第3章)"""# 将模型设置为训练模式if isinstance(net, torch.nn.Module):net.train()# 训练损失总和、训练准确度总和、样本数metric = Accumulator(3)for X, y in train_iter:# 计算梯度并更新参数y_hat = net(X)l = loss(y_hat, y)if isinstance(updater, torch.optim.Optimizer):# 使用PyTorch内置的优化器和损失函数updater.zero_grad()l.mean().backward()updater.step()else:# 使用定制的优化器和损失函数l.sum().backward()updater(X.shape[0])metric.add(float(l.sum()), accuracy(y_hat, y), y.numel())# 返回训练损失和训练精度#print('训练损失:",(metric[0] / metric[2]),"训练精度:",(metric[1] / metric[2]))return metric[0] / metric[2], metric[1] / metric[2]class Animator: # 在动画中绘制数据def __init__(self, xlabel=None, ylabel=None, legend=None, xlim=None,ylim=None, xscale='linear', yscale='linear',fmts=('-', 'm--', 'g-.', 'r:'), nrows=1, ncols=1,figsize=(3.5, 2.5)):# 增量地绘制多条线if legend is None:legend = []d2l.use_svg_display()self.fig, self.axes = d2l.plt.subplots(nrows, ncols, figsize=figsize)if nrows * ncols == 1:self.axes = [self.axes, ]# 使用lambda函数捕获参数self.config_axes = lambda: d2l.set_axes(self.axes[0], xlabel, ylabel, xlim, ylim, xscale, yscale, legend)self.X, self.Y, self.fmts = None, None, fmtsdef add(self, x, y):# 向图表中添加多个数据点if not hasattr(y, "__len__"):y = [y]n = len(y)if not hasattr(x, "__len__"):x = [x] * nif not self.X:self.X = [[] for _ in range(n)]if not self.Y:self.Y = [[] for _ in range(n)]for i, (a, b) in enumerate(zip(x, y)):if a is not None and b is not None:self.X[i].append(a)self.Y[i].append(b)self.axes[0].cla()for x, y, fmt in zip(self.X, self.Y, self.fmts):self.axes[0].plot(x, y, fmt)self.config_axes()display.display(self.fig)display.clear_output(wait=True)def train_ch3(net, train_iter, test_iter, loss, num_epochs, updater):  #训练模型(定义见第3章)animator = Animator(xlabel='epoch', xlim=[1, num_epochs], ylim=[0.3, 0.9],legend=['train loss', 'train acc', 'test acc'])for epoch in range(num_epochs):train_metrics = train_epoch_ch3(net, train_iter, loss, updater)test_acc = evaluate_accuracy(net, test_iter)animator.add(epoch + 1, train_metrics + (test_acc,))train_loss, train_acc = train_metricsassert train_loss < 0.5, train_lossassert train_acc <= 1 and train_acc > 0.7, train_accassert test_acc <= 1 and test_acc > 0.7, test_acclr = 0.1def updater(batch_size):return d2l.sgd([W, b], lr, batch_size)#随机小批量梯度下降
!pip install matplotlib==3.0.0#要将matplotlib替换为3.0.0的版本 不然画图有问题num_epochs = 10
train_ch3(net, train_iter, test_iter, cross_entropy, num_epochs, updater)def predict_ch3(net, test_iter, n=6):  #预测标签for X, y in test_iter:breaktrues = d2l.get_fashion_mnist_labels(y)preds = d2l.get_fashion_mnist_labels(net(X).argmax(axis=1))titles = [true +'\n' + pred for true, pred in zip(trues, preds)]d2l.show_images(X[0:n].reshape((n, 28, 28)), 1, n, titles=titles[0:n])predict_ch3(net, test_iter)
print("测试集上的精度:",evaluate_accuracy(net, test_iter))

运行结果:

1.3softmax使用模块实现

!pip install git+https://github.com/d2l-ai/d2l-zh@release  # installing d2l
!pip install matplotlib==3.0.0import torch
from torch import nn
from d2l import torch as d2lbatch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)# PyTorch不会隐式地调整输入的形状。因此,
# 我们在线性层前定义了展平层(flatten),来调整网络输入的形状
#nn.Sequential有顺序的容器,将特定神经网络模块按照在传入构造器的顺序依次被添加到计算图中执行。
#torch.flatten(x)等于torch.flatten(x,0)默认将张量拉成一维的向量 从第一维开始平坦化
#torch.nn.Flatten()默认从第二维开始平坦化
#nn.Linear 设置网络中的全连接层的
net = nn.Sequential(nn.Flatten(), nn.Linear(784,10))def init_weights(m):if type(m) == nn.Linear:nn.init.normal_(m.weight, std=0.01)net.apply(init_weights)loss = nn.CrossEntropyLoss(reduction='none')
trainer = torch.optim.SGD(net.parameters(),lr=0.1)
num_epochs = 10
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)

运行结果

1--线性神经网络(softmax回归)相关推荐

  1. 深度学习PyTorch笔记(12):线性神经网络——softmax回归

    深度学习PyTorch笔记(12):线性神经网络--softmax回归 6 线性神经网络--softmax回归 6.1 softmax回归 6.1.1 概念 6.1.2 softmax运算 6.2 图 ...

  2. 3.8 Softmax 回归-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 3.7 测试时的 Batch Norm 回到目录 3.9 训练一个 Softmax 分类器 Softmax 回归 (Softmax Regression) 到目前为止,我们讲 ...

  3. 【Pytorch神经网络基础理论篇】 08 Softmax 回归 + 损失函数 + 图片分类数据集

    3.4. softmax回归 回归可以用于预测多少的问题. 比如预测房屋被售出价格,或者棒球队可能获得的胜场数,又或者患者住院的天数. 事实上,我们也对分类问题感兴趣:不是问"多少" ...

  4. 【深度学习】基于MindSpore和pytorch的Softmax回归及前馈神经网络

    1 实验内容简介 1.1 实验目的 (1)熟练掌握tensor相关各种操作: (2)掌握广义线性回归模型(logistic模型.sofmax模型).前馈神经网络模型的原理: (3)熟练掌握基于mind ...

  5. 深度学习基础--SOFTMAX回归(单层神经网络)

    深度学习基础–SOFTMAX回归(单层神经网络) 最近在阅读一本书籍–Dive-into-DL-Pytorch(动手学深度学习),链接:https://github.com/newmonkey/Div ...

  6. 基于一个线性层的softmax回归模型和MNIST数据集识别自己手写数字

    原博文是用cnn识别,因为我是在自己电脑上跑代码,用不了处理器,所以参考Mnist官网上的一个线性层的softmax回归模型的代码,把两篇文章结合起来识别. 最后效果 源代码识别mnist数据集的准确 ...

  7. 深度学习 第3章线性分类 实验四 pytorch实现 Softmax回归 鸢尾花分类任务 下篇

    目录: 第3章 线性分类 3.3 实践:基于Softmax回归完成鸢尾花分类任务 3.3.1 数据处理 3.3.1.1 数据集介绍 3.3.1.2 数据清洗 1. 缺失值分析 2. 异常值处理 3.3 ...

  8. pytoch人工神经网络基础:最简单的分类(softmax回归+交叉熵分类)

    softmax回归分类原理 对于回归问题,可以用模型预测值与真实值比较,用均方误差这样的损失函数表示误差,迭代使误差最小训练模型. 那么分类问题是否可以用线性回归模型预测呢.最简单的方法就是用soft ...

  9. 2.3.3 Softmax回归介绍

    Softmax回归 到现在我们的分类问题都只能识别0和1的问题,比如说是猫或者不是猫,那么更复杂的问题怎么办呢?Softmax回归就能让你在多分类中识别是哪一个分类,而不只是二分类中识别. 如图所示, ...

最新文章

  1. C代码生成图片:BMP、PNG和JPEG
  2. 今夜,我们一起缅怀对美好事物痴迷的青葱岁月
  3. C++成员函数的内存分配问题
  4. MVC Razor模板引擎 @RenderBody、@RenderPage、@RenderSection及Html.RenderPartial、Html.RenderAction...
  5. python另一个程序正在使用此文件_另一个程序正在使用此文件,进程无法访问
  6. 如何区分家里的网线是超五类还是超六类的呢?
  7. cmd命令之参数 c
  8. Hadoop学习之虚拟机网络配置
  9. LBP算法,空间金字塔 文献阅读报告《基于差分量化局部二值模式的人脸反欺诈算法研究》
  10. vs2010 sp1安装
  11. Linux内核分析学习路线总结(内核人员必看)
  12. oracle insert提高速度,如何提高oracle的insert速度
  13. shader篇-阴影
  14. echarts实现3D地球模式--3D线和标记mark
  15. matlab批量读取图像图片并批量处理图像(以伽马校正为例)以及批量保存图像
  16. 对txt文件批量操作
  17. 常见问题及解决方法1
  18. 字符串匹配 (KMP)
  19. Oracle 给其他用户授权表的权限
  20. LeetCode刷题分类

热门文章

  1. 批量将Txt文件内容拆分成Excel文件
  2. 1.高通SEE 虚拟sensor分析
  3. 7.18济南特大暴雨(图)惊!!_七夕小子_新浪博客
  4. 每日曝光超500次,中国人的脸还能自己做主吗?
  5. 婚前财产协议书范文-婚前×××协议书范本-2010范本大全
  6. 微信小程序ajax请求分页加载数据
  7. mysql主从同步 添加字段_MySQL主从同步配置
  8. 长虹电视U1机芯(49U3C等型号)开机卡界面进不去系统解决,刷机方法及固件下载。
  9. 双串口转以太网网关模块–WIZ127SR
  10. 关于argmin和argmax的一点说明