李沐深度学习记录2:10多层感知机

一.简要知识记录

x.numel():看向量或矩阵里元素个数
A.sum():向量或矩阵求和,axis参数可对某维度求和,keepdims参数设置是否保持维度不变
A.cumsum:axis参数设置沿某一维度计算矩阵累计和x*y:向量的按元素乘法
torch.dot(x,y):向量的点乘(点积or内积),结果是标量。公式,向量a点积向量b=|a||b|cos两向量夹角。向量点积即x的转置与向量y相乘,即对应元素相乘相加得数值。
torch.sum(x*y):计算向量点积的另一方式,执行向量的按元素乘法得向量,再对向量求和。torch.mul(A,x):两个变量对应元素相乘。A为矩阵时,x可以是一个数,也可以是向量(支持广播机制)。若A(m,n),x为向量时,x只能(1,n)(m,1)即选择与矩阵A每行向量对应元素想乘或者与矩阵A每列向量对应元素想乘,显然(n,1)(1,m)维度不符合形式。
torch.mv(A,X):矩阵向量积,矩阵乘以向量。A*B:矩阵的按元素乘法,称为Hadamard积。
torch.mm(A,B):矩阵乘法。但是注意,高维矩阵(二维以上)不可以使用mm(),应当使用matmul().torch.abs(x).sum():计算向量的L1范数,即先计算各项绝对值,再求和。
torch.norm(x):计算向量的L2范数。L2范数是向量元素平方和的平方根
torch.norm(A):类似于向量的L2范数,矩阵A的Frobenius范数是矩阵元素平方和的平方根。梯度和等高线正交,梯度指向值变化最大的方向1.线性回归:估计一个连续值
公式(对于单个样本,向量内积),y=<w,x>+b  (<w,x>向量内积得标量) ;
公式(对于多个样本,矩阵乘法),y=w*x+b    x维度[batchsize,m], w维度[m,1], b维度[1]是个标量,输出维度[batchsize,1]
损失函数,平方损失 ;
输出:输出只有一个连续值表预测 2.softmax回归:预测一个离散类别;设类别数n
公式(对多个样本):1)y=w*x+b;x维度[batchsize,m], w维度[m,n] ,b维度[1,n], 输出维度[batchsize,n]2)y=softmax(o);o是1)的输出值,通过softmax将其转化为概率输出,即n个值和为1
损失函数;交叉熵( H(p,q)=求和-pi*log(qi) )常用于衡量两个概率的区别,一个是正确类别进行的一位有效编码,一个是2)的预测概率输出
输出:输出n个类别的概率预测
另,逻辑斯蒂回归是softmax回归二分类的一种特殊形式3.单层感知机:二分类
公式(对于单个样本):o=硬sigmoid(<w,x>+b)  硬sigmoid(x)=1(x>0) or -1(otherwise) 
损失函数:等价于使用批量大小为1的梯度下降,具体如下
l=max(0,-y<w,x>)  当预测值<w,x>与真实值y符号相同即均大于0或均小于0,该样本预测正确,此时-y<w,x>小于0,损失函数l=0当预测值<w,x>与真实值y符号不同,该样本预测错误,此时-y<w,x>大于0,损失函数l=-y<w,x>
存在问题,无法解决XOR二分类问题多层感知机-单分类即二分类
公式(对多个样本):h=sigmoid(w1*x+b1)  输入x维度(batchsize,n),隐藏层w1维度(n,m), b1维度(1,m), 隐藏层输出维度(batchsize,m)o=w2*h+b2  输入h维度(batchsize,m),输出层w2维度(m,1), b2维度(1)标量,输出o维度(batchsize,1) 
关于激活函数:sigmoid:[0,1]     Tanh: [-1,1]     ReLU: max(x,0)  常用ReLU,因为它没有指数运算,而指数计算很贵多层感知机-多分类
公式(对多个样本):h=sigmoid(w1*x+b1)  输入x维度(batchsize,n),隐藏层w1维度(n,m), b1维度(1,m), 隐藏层输出维度(batchsize,m)o=w2*h+b2   输入h维度(batchsize,m),输出层w2维度(m,k), b2维度(k,1),输出o维度(batchsize,k) y=softmax(o)  通过softmax将k个值转化为概率
损失函数:交叉熵
超参数:隐藏层数;每个隐藏层的大小
另,多层感知机多分类与softmax回归多分类区别只是多了隐藏层部分

2.多层感知机从零开始实现

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)实现一个具有单隐藏层的多层感知机
#初始化模型参数
#注意对于隐藏层的宽度,常选择2的若干次幂作为层的宽度,可以使得计算更高效
num_inputs,num_outputs,num_hiddens=784,10,256#nn.Parameter()是pytorch一个类,用于创建可训练的参数(权重和偏置),这些参数会在模型训练过程中自动更新
# w1=nn.Parameter(torch.normal(0,0.01,(num_inputs,num_hiddens),requires_grad=True)*0.01)
w1=nn.Parameter(torch.randn(num_inputs,num_hiddens,requires_grad=True)*0.01)
b1=nn.Parameter(torch.zeros(num_hiddens,requires_grad=True))
w2=nn.Parameter(torch.randn(num_hiddens,num_outputs,requires_grad=True)*0.01)
b2=nn.Parameter(torch.zeros(num_outputs,requires_grad=True))params=[w1,b1,w2,b2]#激活函数-实现ReLU函数
def relu(X):a=torch.zeros_like(X) #torch.zeros_like生成和括号内变量维度一致的全是0的内容return torch.max(X,a)#模型
#忽略空间结构,需要使用reshape将每个二维图像转换为一个长度为num_inputs的向量
def net(X):X=X.reshape((-1,num_inputs)) #(batchsize,1,28,28)->(batchsize,784)H=relu(X@w1+b1) #X矩阵(batchsize,784),w1矩阵(784,256),@则为矩阵乘法得(batchsize,256),b1(1,256)return (H@w2+b2) #H矩阵(batchsize,256),w1矩阵(256,10),@则为矩阵乘法得(batchsize,10),b2(1,10)#损失函数
#计算softmax和交叉熵
loss=nn.CrossEntropyLoss(reduction='none') #不对损失求和或求平均,得到一个向量包含batchsize份损失,即每个样本的损失#训练
#由于多层感知机训练过程与softmax回归完全相同,因此可以直接调用d2l包的train_ch3函数
num_epochs,lr=10,0.1
updater=torch.optim.SGD(params,lr=lr)
d2l.train_ch3(net,train_iter,test_iter,loss,num_epochs,updater)#在一些数据上应用模型
d2l.predict_ch3(net,test_iter)

在这里插入图片描述
在这里插入图片描述

三.多层感知机简介实现

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)#模型
#与softmax回归的简洁实现,唯一区别是添加了2个全连接层
#第一层隐藏层,包含256个隐藏单元,并使用ReLU激活函数。第二层是输出层
#nn.Flatten()除了第0维度batchsize保留,其余维度全部展平为一维向量
net=nn.Sequential(nn.Flatten(),nn.Linear(784,256),nn.ReLU(),nn.Linear(256,10))
#参数初始化
#nn.Linear的weight和bias会自动初始化,这里使用init_weight只是不希望采用对weight的默认初始化,对bias采用默认初始化就可以
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=lr)#训练
num_epochs,lr=10,0.1
d2l.train_ch3(net,train_iter,test_iter,loss,num_epochs,trainer)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/124402.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Access注入---Cookie注入

Access注入----Cookie注入Access数据库&#xff08;微软&#xff09; 逐渐淘汰 &#xff08;没有库的概念&#xff0c;是表的集合&#xff09;Access没有系统自带库Cookie注入&#xff08;头注入HEAD注入的&#xff09;php中产生Cookie注入的可能性小&#xff0c;但ASP产生Cook…

基于MDK-Keil环境如何把STM32程序直接下载到SRAM运行

1. 前言 对于 Cortex-M 内核的微控制器&#xff0c;它们都可以支持在 RAM 中执行程序&#xff0c;有些非 ARM 的微控制器是不支持的。 在内部 SRAM 执行程序&#xff0c;有基于以下几方面的原因&#xff1a; 1、所使用的设备可能具有OTP&#xff08;One-time Programmable&a…

使用win_b64做CATIA的开发测试

文章目录 一、把win_b64文件夹放在无中文的路径下二、启动环境文件编辑器三、新建环境文件四、集成CAA代码五、去用户环境目录查看环境文件是否生成六、关闭环境文件编辑器七、去桌面双击新建的快捷方式即可启动CATIA&#xff0c;进行测试八、进入对应的开发模块&#xff0c;查…

高精度算法模板

1.加法 string a1, b1; int a[5010], b[5010], c[5010]; signed main() {cin >> a1 >> b1;int len1 a1.size();int len2 b1.size();for (int i 1; i < len1; i) {a[i] a1[len1 - i] - 0;}for (int i 1; i < len2; i) {b[i] b1[len2 - i] - 0;}for (in…

React 入门笔记

前言 国庆值班把假期拆了个稀碎, 正好不用去看人潮人海, 趁机会赶个晚集入门一下都火这么久的 React 前端技术. 话说其实 n 年前也了解过一丢丢来着, 当时看到一上来就用 JS 写 DOM 的套路直接就给吓退了, 扭头还去看 Vue 了&#x1f923;, 现在从市场份额 社区活度来看, 确实…

【题解 动态规划】 Colored Rectangles

题目描述&#xff1a; 分析&#xff1a; 乍一看我还以为是贪心&#xff01; 猫 想想感觉没问题 但是局部最优并不能保证全局最优 比如这组数据 19 19 19 19 20 20 20 20如果按照贪心的做法&#xff0c;答案是20*20*2 但是其实答案是19*20*4 因此这道题用贪心是不对的 于是我…

计算机网络(五):运输层

参考引用 计算机网络微课堂-湖科大教书匠计算机网络&#xff08;第7版&#xff09;-谢希仁 1. 运输层概述 之前所介绍的计算机网络体系结构中的物理层、数据链路层以及网络层它们共同解决了将主机通过异构网络互联起来所面临的问题&#xff0c;实现了主机到主机的通信&#xff…

QGIS文章三——模拟风暴潮水淹

之前工作中处理过风暴潮的数据&#xff0c;也获取到了不同等级台风水淹的DEM数据&#xff0c;不过还是很好奇是怎么推演出来的&#xff0c;最近一段时间看QGIS比较多&#xff0c;加上看到了一篇文章《GIS软件进行风暴潮沿海洪水建模》 &#xff0c;于是简单尝试了一下&#xff…

【python的输入】sys.stdin与sys.argv

在老师的课堂里碰到了sys.stdin与sys.argv&#xff0c;虽然是很简单的东西&#xff0c;还是花了大半天的时间才勉强理解。在这里记录一下学习过程&#xff0c;方便以后用到复习。 一、sys.stdin 根据python3 library里的解释&#xff0c; sys.stdin可用于所有交互式的输入。 …

Axios post请求出现500错误

笔者在编写前端form表单传后端数据的时候&#xff0c;出现了以下问题 一、问题场景 当我用axios发送post请求的时候&#xff0c;出现了500错误 笔者找了很长时间错误&#xff0c;代码没问题&#xff0c;后端接口也没问题&#xff0c;后来发现问题出在实体类上了 当前端post请…

kr 第三阶段(三)调试器

调试框架 特点&#xff1a;事件驱动&#xff0c;事件响应。 Win32 程序是消息驱动响应的基址&#xff0c;而在调试器则是事件驱动响应&#xff0c;有事件则处理&#xff0c;无事件则去做别的事。 事件&#xff1a;整个调试框架是建立在异常的基础之上的基本单位。响应&#xf…

SpringBoot中使用拦截器

拦截器属于MVC中的内容 SpringBoot项目,引入web依赖即可 需要访问的控制器 拦截器第一步实现HandlerInterceptor接口 第二步实现WebMvcConfigurer接口,并重写addInterCeptors()方法,将自定义的拦截器注册 也就是说这里add进去拦截的请求,才会进入到prehandle方法,这里放行的请…