回归:估计一个连续值(房价问题)

分类:预测一个离散类别(预测图片中是猫是狗)

kaggle上的分类问题:将人类蛋白质显微镜图片分成28类、将恶意软件分成9类、将恶意的Wikipedia评论分成7类。

损失函数:

softmax回归从0开始实现

import matplotlib.pyplot as plt
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  # 长度为784的向量,28*28=784
num_outputs = 10  # 十个类别W = torch.normal(0, 0.01, size=(num_inputs, num_outputs), requires_grad=True)
b = torch.zeros(num_outputs, requires_grad=True)# # 对矩阵求和
# X = torch.tensor([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
# print(X.sum(0, keepdim=True), X.sum(1, keepdim=True))# 实现softmax
# 1)对每个项求幂(使用exp);
# 2)对每一行求和(小批量中每个样本是一行),得到每个样本的归一化常数;
# 3)将每一行除以其归一化常数,确保结果的和为1。
def softmax(X):X_exp = torch.exp(X)  # 对每个元素做指数partition = X_exp.sum(1, keepdim=True)  # 行求和return X_exp / partition  # 广播机制X = torch.normal(0, 1, (2, 5))
X_prob = softmax(X)
print(X_prob, X_prob.sum(1))# 实现softmax回归模型
def net(X):return softmax(torch.matmul(X.reshape((-1, W.shape[0])), W) + b)# 创建一个y_hat,(两个样本在三个类别的预测概率)使用y作为y_hat中概率的索引
# 创建一个长度为2的向量,表示两个真实的标号
y = torch.tensor([0, 2])
y_hat = torch.tensor([[0.1, 0.3, 0.6], [0.3, 0.2, 0.5]])   # 假设有三个类别
print(y_hat[[0, 1], y])   # y0=1——0.1、y1=2——0.5# 实现交叉熵损失函数
def cross_entropy(y_hat, y):return -torch.log(y_hat[range(len(y_hat)), y])print(cross_entropy(y_hat, y))# 预测值和真实值进行比较
def accuracy(y_hat, y):"""计算预测正确的数量"""# 判断是否为矩阵if len(y_hat.shape) > 1 and y_hat.shape[1] > 1:y_hat = y_hat.argmax(axis=1)   # 每行最大值的下标存到y_hatcmp = y_hat.type(y.dtype) == y   # 将 y_hat的数据类型转换为与 y的数据类型一致,再进行比较return float(cmp.type(y.dtype).sum())   # 进行求和print(accuracy(y_hat, y) / len(y))    # 得到正确预测的数量# 评估在任意模型net的准确率
def evaluate_accuracy(net, data_iter):"""计算在指定数据集上模型的精度"""if isinstance(net, torch.nn.Module):net.eval()  # 将模型设置为评估模式metric = Accumulator(2)  # 正确预测数、预测总数for X, y in data_iter:metric.add(accuracy(net(X), y), y.numel())print(f'test_acc:{metric[0] / metric[1]}')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]# print(evaluate_accuracy(net, test_iter))# softmax回归训练
def train_epoch_ch3(net, train_iter, loss, updater):"""训练模型一个迭代周期"""# 将模型设置为训练模式if isinstance(net, torch.nn.Module):net.train()# 训练损失总和、训练准确度总和、样本数metric = Accumulator(3)    # 长度为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()   # 梯度设为0l.backward()    # 计算梯度updater.step()   #更新metric.add(float(l) * len(y), accuracy(y_hat, y), y.size().numel())else:# 使用定制的优化器和损失函数l.sum().backward()    # 求和计算梯度updater(X.shape[0])metric.add(float(l.sum()), accuracy(y_hat, y), y.numel())# 返回训练损失和训练准确率print(f'train_loss:{metric[0] / metric[2]},train_acc:{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)plt.draw();plt.pause(0.001)display.clear_output(wait=True)# 训练函数
def train_ch3(net, train_iter, test_iter, loss, num_epochs, updater):"""训练模型"""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_accprint(f'train_acc:{train_acc},train_loss:{train_loss},test_acc:{test_acc}')
# 小批量随机梯度下降来优化模型的损失函数
lr = 0.1def updater(batch_size):return d2l.sgd([W, b], lr, batch_size)# 训练模型10个迭代周期
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])d2l.plt.show()predict_ch3(net, test_iter)

softmax回归的简洁实现

import torch
from torch import nn
from d2l import torch as d2lbatch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)# softmax回归的输出层是一个全连接层
# PyTorch不会隐式地调整输入的形状。因此
# 在线性层前定义了展平层(flatten),来调整网络输入的形状
net = nn.Sequential(nn.Flatten(), nn.Linear(784, 10))# m是当面的linear
def init_weights(m):if type(m) == nn.Linear:nn.init.normal_(m.weight, std=0.01)   # 均值为0,方差为0.01net.apply(init_weights);# 在交叉熵损失函数中传递未归一化的预测,并同时计算softmax及其对数
loss = nn.CrossEntropyLoss()# 使用学习率为0.1的小批量随机梯度下降作为优化算法
trainer = torch.optim.SGD(net.parameters(),lr=0.1)# 调用之前定义的训练函数来训练模型
num_epochs = 10
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)

李沐笔记(softmax回归)相关推荐

  1. 【李沐】softmax回归-1.使用交叉熵作为损失函数而不是MSE均方误差-(意思就是为什么经过了softmax之后不用MSE) 2.softmax与sigmoid

    2. 交叉熵的来源 2.1 信息量 一条信息的信息量大小和它的不确定性有很大的关系.一句话如果需要很多外部信息才能确定,我们就称这句话的信息量比较大.比如你听到"云南西双版纳下雪了" ...

  2. 深度学习(李沐)—————Softmax回归

    此次测试发现老是发现缺包,后面发现装的位置不对.先看一下环境文件 发现自己的用户名是gluon ,所以应该在d21-zh文件目录下进cmd应该输入conda activate gluon 然后在各种p ...

  3. 跟李沐学深度学习-softmax回归

    softmax回归 分类和回归的区别 无校验比例 校验比例 交叉熵 常见损失函数 均方误差 L2 loss 绝对值损失L1 loss 鲁棒损失 图像分类数据集 分类和回归的区别 回归:估计一个连续值 ...

  4. 3.4 Softmax回归【李沐动手学深度学习】

    目录 1. 从回归到多分类--均方损失 Softmax回归 2. Softmax和交叉熵损失 损失 梯度 3. 损失函数 3.1 均方损失(L2 Loss) 3.2 绝对值损失函数(L1 Loss) ...

  5. Softmax回归及损失函数(李沐深度学习课程、自用)

    1 Softmax回归 回归预测连续值,分类预测离散值 分类多个输出,第i个输出代表第i类的置信度. 1.1 置信度转换 在分类中,希望能尽可能地使正确类别的置信度远大于其它类别.同时我们可以将输出置 ...

  6. 1 跟李沐老师学习深度学习(介绍监督【分类回归】、非监督【聚类】)

    目录 在回归中,我们训练一个回归函数来输出一个数值: 而在分类中,我们训练一个分类器,它的输出即为预测的类别. 把关键章节标注了出来~(由于第一章我当年看过视频了,所以就没再看一遍,而是浏览了笔记) ...

  7. 深度学习笔记-[跟李沐学AI]-01引言

    DIVE INTO DEEP LEARNING 参考笔记:http://zh-v2.d2l.ai/chapter_introduction/index.html 符号 本书中使用的符号概述如下. 数字 ...

  8. Scikit-Learn 机器学习笔记 -- 线性回归、逻辑回归、softmax回归

    Scikit-Learn 机器学习笔记 – 线性回归.逻辑回归.softmax回归 参考文档: handson-ml import numpy as np from matplotlib import ...

  9. UFLDL教程笔记及练习答案三(Softmax回归与自我学习***)

    UFLDL教程笔记及练习答案三(Softmax回归与自我学习***) 1:softmax回归 当p(y|x,theta)满足多项式分布,通过GLM对其进行建模就能得到htheta(x)关于theta的 ...

最新文章

  1. 带修莫队 ---- P1903 [国家集训队]数颜色 / 维护队列 带修莫队模板
  2. 镜头上的四线电机怎么驱动_2相四线,四相五线,四相六线步进电机接线及驱动方法...
  3. c#3.0加入的一些新特性——泛型集合
  4. 032_jQuery Ajax的load方法
  5. tf.boolean_mask
  6. 黄聪: 50 个 Bootstrap 插件
  7. 华农专业课计算机基础,华南农业大学期末考试大学计算机基础试卷.doc
  8. 如何让一个div里面的div垂直居中?
  9. 一代神机落幕!苹果把iPhone 6 Plus列为过时产品,网友吵翻了...
  10. 2021李宏毅机器学习课程笔记——Auto Encoder
  11. 二叉树的创建_【数据结构用python描述】python创建二叉树
  12. SQL Server 2008 Mirror
  13. 利用opencv生成面膜
  14. 华为2台3928千兆电口对接trunk启不来
  15. win7计算机锁频图片怎么设置,win7锁屏背景壁纸如何修改
  16. Windows驱动开发WDM
  17. 2012电商倒闭潮——死亡的电商整理
  18. 登入拼多多显示服务器请求失败,拼多多商家后台登录打不开?
  19. 移动磁盘显示无法访问设备未就绪,里面的资料如何找到
  20. Vivado使用:综合篇(二)综合选项设置

热门文章

  1. css 设置 多行超出 显示为 省略号 ,可 多行超出 显示为 省略号
  2. [转]Web开发者和设计师必须要知道的 iOS 8 十个变化
  3. 解决SVN pristine text xxxx not present问题
  4. 中关村电子商户纷纷搬走或转型 为哪般
  5. linux怎么让普通用户拥有管理员权限
  6. 腾讯云windows server搭建valheim(英灵神殿)服务器
  7. PMP-PMBOK-培训(7)Initiating a Project and Preparing the Project Plan
  8. 京东到家话费券系统NIO实战
  9. Sentinel-2批量大气校正_基于Sen2Cor
  10. apt-get --allow-unauthenticated upgrade