此次测试发现老是发现缺包,后面发现装的位置不对。先看一下环境文件

发现自己的用户名是gluon ,所以应该在d21-zh文件目录下进cmd应该输入conda activate gluon

然后在各种pip install xxx。

 

导入包

import torch
from IPython import display
from d2l import torch as d2l

读取数据集

batch_size = 256train_iter,test_iter = d2l.load_data_fashion_mnist(batch_size)

展开每个图像,看作784向量。数据集有10个类别,则输出维度10

num_inputs = 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]])
X.sum(0,keepdim=True),X.sum(1,keepdim=True)#分别以维度0和1求和    6=【1,2,3】相加 15=【4,5,6】自己相加

实现softmax

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)

具体实现softmax

def net(X):return softmax(torch.matmul(X.reshape((-1,W.shape[0])),W)+b) #-1表示批量大小

常见一个数据y_hat,包含两个样本在3个类别的预测概率,使用y作为y_haht中概率大索引

y = torch.tensor([0,2]) #两个真实的标号
y_hat = torch.tensor([[0.1,0.3,0.6],[0.3,0.2,0.5]])
y_hat[[0,1],y] #0.1是y_hat[0]在[0.1,0.3,0.6]里第y[0]  0.5是y_hat[1]在[0.3,0.,0.5]里第y[2] 

实现交叉熵损失函数

#print(y_hat,y) y_hat是预测集  y是预测的预测集标号
#print(y_hat[range(len(y_hat)),y])
def cross_entropy(y_hat,y):return -torch.log(y_hat[range(len(y_hat)),y]) #y_hat[range(len(y_hat)),y]与上段测试相同
cross_entropy(y_hat,y)
将预测类别与真实y元素比较
def accuracy(y_hat,y):"""计算正确预测的数量"""if len(y_hat.shape)>1 and y_hat.shape[1]>1: #判断y_hat是否为矩阵y_hat = y_hat.argmax(axis=1)cmp = y_hat.type(y.dtype) == yreturn float(cmp.type(y.dtype).sum())   #y是int类型 cmp转int求和再转floataccuracy(y_hat,y)/len(y) #测试结果

评估在任意模型net的准确率

def evaluate_accuracy(net, data_iter):  #@save"""计算在指定数据集上模型的精度。"""if isinstance(net, torch.nn.Module):net.eval()  # 将模型设置为评估模式metric = Accumulator(2)  # 正确预测数、预测总数for X, y in train_iter:metric.add(accuracy(net(X), y), y.numel())return metric[0] / metric[1]   #    metric[0]是分类正确   metric[1]是分类总数

Accumulator实例创建2个变量,分别存储正确预测数量和预测总数量

class Accumulator:  #@save"""在`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]
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)#for X,y in data_iter(batch_size,features,labels):此线性的for X,y in train_iter: #(batch_size,features,labels)在上文集合了#l = loss(net(X),y)y_hat = net(X)l = loss(y_hat,y)   #上下不可改为 l = loss(net(X),y)  因为y_hat类型是floatif isinstance(updater,torch.optim.Optimizer):updater.zero_grad()l.backward()updater.step()metric.add(float(1)*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())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):  """训练模型。"""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_metrics

小批量随机梯度下降优化模型店损失函数

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):  """预测标签(定义见第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)

显示

深度学习(李沐)—————Softmax回归相关推荐

  1. 动手学深度学习(李沐)的pytorch版本(包含代码和PDF版本)

    目录 网址(特别适合自学) 说明: 代码与PDF版 网址(特别适合自学) 传送门 界面一览: 说明:   github上一个项目将<动手学深度学习>从mxnet改为了pytorch实现.感 ...

  2. 假设训练数据集中有10万个词,四元语法需要存储多少词频和多词相邻频率?《动手学深度学习 李沐》 转

    假设训练数据集中有10万个词,四元语法需要存储多少词频和多词相邻频率? 循环神经网络 Notes 1. 语言模型 语言模型(language model)是自然语言处理的重要技术.自然语言处理中最常见 ...

  3. 动手学深度学习第九节softmax回归中FashionMNIST数据集无法加载的解决方法

    在电脑上运行本节代码时最开始下载FashionMNIST时出了问题,自己折腾了很长时间才加载出本地数据集,希望给同样遇到问题的朋友以参考. 环境:VScode 直接下载时出现问题(响应时间过长,未完成 ...

  4. 吴恩达深度学习第二周--logistic回归作业1

    吴恩达深度学习第二周–logistic回归作业1 本系列为吴恩达老师深度学习作业的总结,其中参考了很多优秀的文章,本文为了方便日后的复习与巩固,更为详细的作业讲解参考 目录 吴恩达深度学习第二周--l ...

  5. 【深度学习】Keras实现回归和二分类问题讲解

    [深度学习]Keras实现回归和二分类问题讲解 文章目录 [深度学习]Keras实现回归和二分类问题讲解 1 回归问题1.1 波士顿房价预测数据集1.2 构建基准模型1.3 数据预处理1.4 超参数 ...

  6. 深度学习(2)回归问题

    深度学习(2)回归问题 一. 问题提出与解析 1. Machine Learning 2. Continuous Prediction 3. Linear Equation 4. With Noise ...

  7. 学习李沐的课程中的问题记录

    (50条消息) 李沐<动手学深度学习>d2l--安装和使用_梁小憨憨的博客-CSDN博客_d2l Python安装 d2l 库过程中出现" Failed building whe ...

  8. 【深度学习】深度学习预测房价:回归问题,K折交叉

    机器学习中,大部分是分类问题,另一种常见的机器学习问题是回归问题,它预测一个连续值而不是离散的标签,例如,根据气象数据预测明天的气温,或者根据软件说明书预测完成软件项目所需要的时间.根据消费行为预测用 ...

  9. 【深度学习】去掉softmax后Transformer会更好吗?复旦华为诺亚提出SOFT:轻松搞定线性近似...

    作者丨happy  编辑丨极市平台 导读 本文介绍了复旦大学&华为诺亚提出的一种新颖的softmax-free的Transformer-SOFT.所提SOFT显著改善了现有ViT方案的计算效率 ...

最新文章

  1. 错误 1 “System.Data.DataRow.DataRow(System.Data.DataRowBuilder)”不可访问,因为它受保护级别限制...
  2. 李飞飞、吴恩达、Bengio等人的15大顶级深度学习课程,你收集全了吗?
  3. 深度学习如何挑选GPU?
  4. javascript中错误使用var造成undefined
  5. selenium自动化测试、Python单元测试unittest框架以及测试报告和日志输出
  6. Android Studio向项目中导入jar包的方法
  7. cuda10安装_Mmdetection的安装和使用
  8. python制作QQ游戏--大家来找茬游戏辅助(一)
  9. code3:使用set判断数组中是否有重复值
  10. pdf转换成word后有文字叠加_将PDF转换成Word文档后,为什么字体全变了?
  11. 最新最快的HTTP代理服务器,国内外HTTP代理服务器,游戏代理服务器,Q代理服务器,代理IP...
  12. 【USACO3-4-2】电网 皮克定理
  13. Codeforces 1359 C. Mixing Water (二分 /数学)
  14. 【C++篇】STL常见容器String的模拟实现
  15. 办公技巧:常用的100个Word快捷键
  16. 五子棋棋谱16*16c语言,五子棋开局棋谱大全
  17. Remove Duplicates
  18. 常见的五种排序,冒泡排序,选择排序,插入排序,并归排序,快速排序
  19. Flappy bird模式值得追捧么?
  20. HTML5 Canvas小游戏

热门文章

  1. 日常学习记录一_mcufly串口下载
  2. 乐博Android客户端(新浪微博)1.01发布,欢迎各位童鞋试用
  3. Fedora10下AMD,Nvidia,Intel显卡驱动安装指南
  4. 黑盒测试与bug定位
  5. word怎样把多个标题设置成一级标题,二级标题的简便方法
  6. 内网机器如何连接公网
  7. IDEA中大小写切换
  8. 风车动漫服务器维修要多长时间,风车动漫APP是什么样的软件?风车动漫APP出现打不开的具体处理方法...
  9. 【API接口】接口上线下线 用户在线测试,和管理员发布api待完善...
  10. can't find lxxx解决办法