理论推导

简介

softmax回归模型,实际是一个分类模型,与线性回归模型有很多不同的地方(与线性回归一样都是一个单层的神经网络)

分类问题介绍

输入图片的每一个像素值都可以用一个标量表示,我们将图片中的4个像素用 x1,x2,x3,x4表示

假设训练数据集中图像的真实标签为狗、猫或鸡(假设可以用4像素表示出这3种动物),这些标签分别对应离散值y 1 , y 2 , y 3

softmax回归模型

softmax回归跟线性回归一样将输入特征与权重做线性叠加。与线性回归的一个主要不同在于,softmax回归的输出值个数等于标签里的类别数。因为一共有4种特征和3种输出动物类别,所以权重包含12个标量(带下标的w)、偏差包含3个标量(带下标的b),每个输入都会得到三个输出o1,o2,o3

输出oi当作预测类别i的置信度,将最大的置信度输出作为预测的种类(我们会用一些方法把Oi转换成为概率),假如O1=o.1,O2=o.3,O3=0.6 , 最大,那么预测类别为2,其代表猫。

代码实践

从零开始

引入数据集

#sec_fashion_mnist中引入的Fashion-MNIST数据集, 并设置数据迭代器的批量大小为256
import torch
from IPython import display
from d2l import torch as d2l
batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)//iter 是迭代器

初始化模型参数

num_inputs = 784#模型输入有784
num_outputs = 10#模型输入有10W = torch.normal(0, 0.01, size=(num_inputs, num_outputs), requires_grad=True)#初始一个权重,选一个高斯随机数据为权重
b = torch.zeros(num_outputs, requires_grad=True)#初始化偏差,利用某个数学方法在数据中选择一个作为偏差

定义softmax操作

X = torch.tensor([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
X.sum(0, keepdim=True), X.sum(1, keepdim=True)
def softmax(X):X_exp = torch.exp(X)#对元素进行指数计算partition = X_exp.sum(1, keepdim=True)#对每一行进行求和return X_exp / partition  # 这里应用了广播机制
#将输出变成总概率为1
X = torch.normal(0, 1, (2, 5))
X_prob = softmax(X)
X_prob, X_prob.sum(1)

定义模型

def 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])cross_entropy(y_hat, y)

分类精度

#将预测类别与真实y元素进行比较
def accuracy(y_hat, y):  #@save"""计算预测正确的数量"""if len(y_hat.shape) > 1 and y_hat.shape[1] > 1:y_hat = y_hat.argmax(axis=1)cmp = y_hat.type(y.dtype) == yreturn float(cmp.type(y.dtype).sum())
accuracy(y_hat, y) / len(y)#预测正确的概率

绘制动画

#在展示训练函数的实现之前,我们[定义一个在动画中绘制数据的实用程序类]Animator
class Animator:  #@save"""在动画中绘制数据"""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):  #@save"""训练模型(定义见第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):#扫n遍数据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_acc
#小批量随机梯度下降来优化模型的损失函数,设置学习率为0.1
lr = 0.1def updater(batch_size):return d2l.sgd([W, b], lr, batch_size)
num_epochs = 10#训练10个迭代周期
train_ch3(net, train_iter, test_iter, cross_entropy, num_epochs, updater)#开始训练

预测

#现在训练已经完成,我们的模型已经准备好[对图像进行分类预测]。 给定一系列图像,我们将比较它们的实际标签(文本输出的第一行)和模型预测(文本输出的第二行)
def predict_ch3(net, test_iter, n=6):  #@save"""预测标签(定义见第3章)"""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)

pytorch简洁实现

引入数据集

import torch
from torch import nn
from d2l import torch as d2l
batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)

初始化模型参数

 PyTorch不会隐式地调整输入的形状。因此,
# 我们在线性层前定义了展平层(flatten),来调整网络输入的形状
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)#每一层跑一下这个函数就可以完成初始化

softmax的实现

loss = nn.CrossEntropyLoss(reduction='none')

优化算法

trainer = torch.optim.SGD(net.parameters(), lr=0.1)#调用优化算法,设置学习率为0.1 ,这与我们在线性回归例子中的相同,这说明了优化器的普适性

训练

num_epochs = 10#训练10圈
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)#调用第三章的那个ch3函数训练

pytorch之Softmax回归相关推荐

  1. 【深度学习】基于Pytorch的softmax回归问题辨析和应用(一)

    [深度学习]基于Pytorch的softmax回归问题辨析和应用(一) 文章目录 1 概述 2 网络结构 3 softmax运算 4 仿射变换 5 对数似然 6 图像分类数据集 7 数据预处理 8 总 ...

  2. 【深度学习】基于Pytorch的softmax回归问题辨析和应用(二)

    [深度学习]基于Pytorch的softmax回归问题辨析和应用(二) 文章目录1 softmax回归的实现1.1 初始化模型参数1.2 Softmax的实现1.3 优化器1.4 训练 2 多分类问题 ...

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

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

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

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

  5. 动手学PyTorch | (5) Softmax回归实验

    目录 1. 图像分类数据集(Fashion-Mnist) 2. Softmax回归从0开始实现 3. Softmax回归的简洁实现 1. 图像分类数据集(Fashion-Mnist) 在介绍softm ...

  6. 添加softmax层_PyTorch入门之100行代码实现softmax回归分类

    本文首发于公众号[拇指笔记] 1. 使用pytorch实现softmax回归模型 使用pytorch可以更加便利的实现softmax回归模型. 1.1 获取和读取数据 读取小批量数据的方法: 首先是获 ...

  7. 深度学习 第3章线性分类 实验四 pytorch实现 Logistic回归 上篇

    目录: 第3章 线性分类 3.1 基于Logistic回归的二分类任务 3.1.1 数据集构建 3.1.2 模型构建 1. Logistic函数 2. Logistic回归算子 3.1.3 损失函数 ...

  8. [pytorch、学习] - 3.7 softmax回归的简洁实现

    参考 3.7. softmax回归的简洁实现 使用pytorch实现softmax import torch from torch import nn from torch.nn import ini ...

  9. pytorch学习笔记(九):softmax回归的简洁实现

    文章目录 1. 获取和读取数据 2. 定义和初始化模型 3. softmax和交叉熵损失函数 4. 定义优化算法 5. 训练模型 6. 总代码 7.小结 使用Pytorch实现一个softmax回归模 ...

最新文章

  1. python开发需要掌握哪些知识-研究深度学习的开发者,需要对 Python 掌握哪些知识?...
  2. C#方法中的反射方式和委托方式(小实例)
  3. android 数组赋值字符串_c语言中的字符数组与字符串
  4. C++通过vmware.exe检测虚拟机
  5. configure 包,出现error: no acceptable C compiler found in $PATH 问题
  6. indesign教程,如何创建对齐参考线?
  7. Android--数据存储
  8. linux台式机怎么用无线网卡,台式机无线网卡怎么用 台式机USB无线网卡安装使用教程...
  9. 每日一练_13 :java设计一个动物声音“模拟器”,希望模拟器可以模拟许多动物的叫声(使用接口)。
  10. 百度CTO李一男:未来五年电子商务是关注重点
  11. 带语音通话功能的华为ME909s-821a使用方法
  12. STM32MP157 Linux系统移植开发篇19:Linux内核Wi-Fi驱动移植
  13. 手机rar压缩包解密,rar压缩包权限密码多少?
  14. mac升级系统mysql无法启动解决
  15. 记一次完整手机APP项目的开发
  16. android p2p 连接服务器上,当通过Wi-Fi P2P使用网络服务发现时无法连接到Android设备每个人都可以使用网络服务发现...
  17. 计算机毕业设计(70)php小程序毕设作品之干洗店洗衣小程序系统
  18. 《rust死灵书》阅读笔记
  19. python blp模型 估计_谁能简单解释一下经济学中的BLP模型?
  20. 接口的多实现和多继承

热门文章

  1. 软件项目组织的建立与人员分工(二)
  2. H5跳转小程序(详)
  3. 5G手机销量止跌回升,或因低价手机拉动
  4. 树莓派4B连接蓝牙音响后,播放音频不出声
  5. HTML常用标签之表格标签(合并单元格)
  6. 服务器冲洗泵的作用是什么,蒸发箱吹洗泵有什么作用?
  7. CEntOS6.5从启动界面直接进入命令行界面
  8. 微信下载APP安卓手机弹出默认浏览器打开 苹果App Store苹果商店
  9. 软件工程 用例建模 习题
  10. 小程序苹果6s兼容遇到的坑的总结