李沐深度学习记录1:零碎知识记录、08线性回归

news2024/11/26 0:41:15

简要记录,以便查阅~

一、零碎知识

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.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范数是矩阵元素平方和的平方根。

二、线性回归从零开始实现

%matplotlib inline
import random
import torch
from d2l import torch as d2l

#生成数据集
#构建synthetic_data函数,给定w、b和数据样本个数num_examples,给出随机合成的数据集,返回数据样本X和数据标签y
def synthetic_data(w,b,num_examples):#@save
    #生成y=Xw+b+噪声
    X=torch.normal(0,1,(num_examples,len(w)))#随机生成样本值服从均值为0标准差为1的正态分布。样本数据矩阵为(样本量,样本特征维度)
#     print('X:',X,'\nX的形状:',X.shape)  #torch.Size([1000, 2])
    y=torch.matmul(X,w)+b #矩阵乘法。得到数据X在权重w和偏差值b下的对应y值
#     print('y:',y,'\ny的形状:',y.shape)  #torch.Size([1000])
    y+=torch.normal(0,0.01,y.shape) #随机为y添加服从均值0标准差0.01的正态分布的噪声值,噪声值形状与y相同
#     print('y:',y,'\ny的形状:',y.shape)  #torch.Size([1000])
#     print('reshape后y的形状:',y.reshape((-1,1)).shape,'\ny:',y)  #reshape后y的形状: torch.Size([1000, 1]) 
    return X,y.reshape((-1,1))  #返回数据X和标签y

true_w=torch.tensor([2,-3.4]) #权重w
true_b=4.2
features,labels=synthetic_data(true_w,true_b,1000)  #feature即返回的X数据,指的二维数据样本;labels即标签值
print('features:',features[0],'\nlabel:',labels[0])
print('features:',features[0:5],'\nlabel:',labels[0:5])

在这里插入图片描述

#直观观察数据样本features和labels的线性关系
d2l.set_figsize()
d2l.plt.scatter(features[:,1].detach().numpy(),labels.detach().numpy(),1);#利用数据样本X的第1维特征和数据标签y作散点图。最后的1表示标记点的大小

在这里插入图片描述

#如果使用X的第0维特征
d2l.set_figsize()
d2l.plt.scatter(features[:,0].detach().numpy(),labels.detach().numpy(),1);

在这里插入图片描述

#读取数据集   
#定义data_iter函数,该函数接收批量大小、特征矩阵和标签向量作为输入,生成大小为batch_size的小批量。
def data_iter(batch_size,features,labels):
    num_examples=len(features)
    indices=list(range(num_examples)) #将0-总样本数间的所有数字保存在一个list中
    random.shuffle(indices) #将list中的数值随机打乱,也即做到之后随机取数据
    for i in range(0,num_examples,batch_size):  #从0开始到最后样本总数,每次跳batch_size的大小来取i,即每批数据的第一个数据的下标值
        batch_indices=torch.tensor( indices[i:min(i+batch_size,num_examples)] ) #从数据i开始,连着取batchsize大小的数据。min(,)是防止最后数据不足batchsize时,将最后的数据取为一个batch即可
        yield features[batch_indices],labels[batch_indices]  #根据前面所得的indices来取对应的features和labels
        #yield是返回两部分features,labels

batch_size=10
for X,y in data_iter(batch_size,features,labels):
    print(X,'\n',y) 
    break  #只输出一次X,y便跳出了

在这里插入图片描述

#初始化模型参数
w=torch.normal(0,0.01,size=(2,1),requires_grad=True)
b=torch.zeros(1,requires_grad=True)

#定义模型
def linreg(X,w,b):  #@save
    #线性回归模型
    return torch.matmul(X,w)+b

#定义损失函数
def squared_loss(y_hat,y):#@save
    #均方损失
    return (y_hat-y.reshape(y_hat.shape))**2/2
    
#定义优化算法
def sgd(params,lr,batch_size):#@save  #params是一个list,里面包含w和b
    #小批量随机梯度下降
    with torch.no_grad():
        for param in params:
            param-= lr * param.grad / batch_size  #除以batch_size是因为上面计算损失时没有除以batchsize计算均值
            param.grad.zero_()  #每次更新完后,要将梯度置0,这样下次计算梯度时不会在上次计算的梯度上累加

#训练
lr=0.03
num_epochs=3
net=linreg
loss=squared_loss

for epoch in range(num_epochs):
    for X,y in data_iter(batch_size,features,labels):
        l=loss(net(X,w,b),y)  #计算y预测值和y之间的损失,返回l向量的形状是(batch_size,1)
        l.sum().backward() #将l中所有样本损失求和,再反向传播计算梯度
        sgd([w,b],lr,batch_size) #利用优化算法更新参数
    with torch.no_grad():  #前面训练一轮后,输出计算一下当前的损失,这时不计算梯度
        train_l=loss(net(features,w,b),labels)
        print(f'epoch{epoch+1},loss{float(train_l.mean()):f}')

在这里插入图片描述

print(f'w的估计误差: {true_w - w.reshape(true_w.shape)}')
print(f'b的估计误差: {true_b - b}')

在这里插入图片描述

三、线性回归的简洁实现

import numpy as np
import torch
from torch.utils import data
from d2l import torch as d2l

#生成数据集
true_w=torch.tensor([2,-3.4])
true_b=4.2
features,labels=d2l.synthetic_data(true_w,true_b,1000)

#读取数据集
def load_array(data_arrays,batch_size,is_train=True):
    #构造一个pytorch数据迭代器
    dataset=data.TensorDataset(*data_arrays) 
    #将数据数组转换为TensorDataset对象。data_arrays是包含数据的数据元组。*符号表示解压缩元组,使其成为函数参数
    return data.DataLoader(dataset,batch_size,shuffle=is_train) #每次随机从中挑选batchsize大小的数据,随机打乱

batch_size=10
data_iter=load_array((features,labels),batch_size) #这里的data_iter和之前手动创建的data_iter一样

next(iter(data_iter))
#iter()函数是将可迭代对象转换成迭代器。next()是python内置的函数,用于获取迭代器中的下一元素。


#next(iter(data_iter))这一行代码等价于下面的代码
#for X,y in data_iter:
#    print(X,'\n',y) 
#    break  #只输出一次X,y便跳出了

在这里插入图片描述

#定义模型
#nn是神经网络的缩写
from torch import nn
net=nn.Sequential(nn.Linear(2,1)) #制定输入输出维度,分别是2和1。Sequential可理解为存放layer的list

#初始化参数
#net[0]访问网络层layer,weight即访问它的权重w,data即权重的值,normal_表示用均值为0标准差为0.01的数替换掉data的值
net[0].weight.data.normal_(0,0.01)
net[0].bias.data.fill_(0)  #同理将偏差值设置为0

#定义损失函数
loss=nn.MSELoss()  #MSELoss()也称平方L2范数,返回所有样本损失的平均值

#定义优化算法
trainer=torch.optim.SGD(net.parameters(),lr=0.03) #需要指定优化的参数以及优化算法所需的超参数字典

#训练
num_epochs=3
for epoch in range(num_epochs):
    for X,y in data_iter:
        l=loss(net(X),y) #调用net(X)前向计算预测值,将其与y真实值传入loss计算损失
        trainer.zero_grad()  #计算梯度前,现将优化器梯度清零
        l.backward()#反向传播计算梯度
        trainer.step()#进行模型更新
    l=loss(net(features),labels) #与之前一样,扫完一遍数据后计算一下loss
    print(f'epoch {epoch+1},loss {l:f}')

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

05_Bootstrap插件02

7 小标签 通过 .label 实现小标签&#xff0c;用于提示类。 <h1>h1标题 <span class"label label-default">标签</span></h1> <h2>h2标题<span class"label label-default">标签</span></h2> <h3&g…

精品Python思政素材数据库在线学习资源网

《[含文档PPT源码等]精品基于Python实现的思政素材数据库设计与实现》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;python 使用框架&#xff1a;Django 前端技术&#xff1a;JavaScri…

Linux:GlusterFS 集群

GlusterFS介绍 1&#xff09;Glusterfs是一个开源的分布式文件系统,是Scale存储的核心,能够处理千数量级的客户端.在传统的解决 方案中Glusterfs能够灵活的结合物理的,虚拟的和云资源去体现高可用和企业级的性能存储. 2&#xff09;Glusterfs通过TCP/IP或InfiniBand RDMA网络链…

2023年9月21日

完善登录界面的注册登录功能 头文件1 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QPushButton> #include <QLineEdit> #include <QLabel> #include <QMovie> #include <QDebug> #include <QMessage…

【计算机网络】深入理解TCP协议二(连接管理机制、WAIT_TIME、滑动窗口、流量控制、拥塞控制)

TCP协议 1.连接管理机制2.再谈WAIT_TIME状态2.1理解WAIT_TIME状态2.2解决TIME_WAIT状态引起的bind失败的方法2.3监听套接字listen第二个参数介绍 3.滑动窗口3.1介绍3.2丢包情况分析 4.流量控制5.拥塞控制5.1介绍5.2慢启动 6.捎带应答、延时应答 1.连接管理机制 正常情况下&…

记一次 .NET 某餐饮小程序 内存暴涨分析

一&#xff1a;背景 1. 讲故事 前些天有位朋友找到我&#xff0c;说他的程序内存异常高&#xff0c;用 vs诊断工具 加载时间又太久&#xff0c;让我帮忙看一下到底咋回事&#xff0c;截图如下&#xff1a; 确实&#xff0c;如果dump文件超过 10G 之后&#xff0c;市面上那些可…

ESP8266 WiFi物联网智能插座—项目简介

目录 1、项目背景 2、设备节点功能 3、上位机功能 物联网虽然能够使家居设备和系统实现自动化、智能化管理&#xff0c;但是依然需要依靠更为先进的终端插座作为根本保障&#xff0c;插座是所有家用电器需要使用的电源设备&#xff0c;插座的有序智能管理&#xff0c;对于实…

SpringMVC初级

文章目录 一、SpringMVC 概述二、springMVC步骤1、新建maven的web项目2、导入maven依赖3、创建controller4、创建spring-mvc.xml配置文件&#xff08;本质就是spring的配置件&#xff09;5、web.xml中配置前端控制器6、新建a.jsp文件7、配置tomcat8、启动测试 三、工作流程分析…

echart在折线显示横纵(横纵线沿着折线展示)

产品有个需求&#xff0c;需要在echart折线上展示横纵向坐标系&#xff0c;echart的axisPointer默认是展示在鼠标当前位置的&#xff0c;不符合需求&#xff0c;所以是使用markline实现的 在线例子和源码 先上效果图 实现思路 横纵线的x轴线是比较容易的&#xff0c;因为ech…

ONES 全球化启航,用软件服务全球企业

美西太平洋时间2023年9月6日至9月8日&#xff0c;SaaStr Annual 2023 大会在美国旧金山举办。作为全球最大规模、最具影响力的 SaaS 行业盛会&#xff0c;SaaStr 吸引了上万名来自世界各地的 SaaS 行业从业者&#xff0c;ONES 也作为展商之一参与其中。 在为期三天的大会期间&a…

实用的嵌入式编码技巧:第三部分

每个触发器都有两个我们在风险方面违反的关键规格。“建立时间”是时钟到来之前输入数据必须稳定的最小纳秒数。“保持时间”告诉我们在时钟转换后保持数据存在多长时间。 这些规格因逻辑设备而异。有些可能需要数十纳秒的设置和/或保持时间&#xff1b;其他人则需要少一个数量…

DC/DC开关电源学习笔记(十)Buck降压电路仿真及工程应用实例

(十)Buck降压电路仿真及工程应用实例 1. 仿真应用实例1.1 案例一1.2 案例二2. 工程应用实例2.1 数字DC/DC应用实例2.2 模拟DC/DC应用实例1. 仿真应用实例 1.1 案例一 仿真技术要求输入:输入电压30~90V,输出电压28V,输出电流最大10A,开关频率100KHz。我们按照参数极限工…

大语言模型之十一 Transformer后继者Retentive Networks (RetNet)

在《大语言模型之四-LlaMA-2从模型到应用》的LLama-2推理图中可以看到&#xff0c;在输入“你好&#xff01;”时&#xff0c;是串行进行的&#xff0c;即先输入“你”这个token&#xff0c;然后是“好”&#xff0c;再然后是“&#xff01;”token&#xff0c;前一个token需要…

【QT】day5

1.登录注册和数据库联动 三个头文件 #ifndef DEMO_H #define DEMO_H#include <QWidget> #include <QSqlDatabase> //数据库管理类 #include <QSqlQuery> //执行sql语句的类 #include <QSqlRecord> //数据库记录的类 #include <QMessageBox>…

传统的经典问题 Java 的 Interface 是干什么的

传统的经典问题 Java 的 Interface 是干什么 解答 上面的这个问题应该还是比较好回答的吧。 只要你做过 Java &#xff0c;通常 Interface 的问题多多少少会遇到&#xff0c;而且可能会遇到一大堆。 在JAVA编程语言中是一个抽象类型&#xff08;Abstract Type&#xff09;&…

SpringBoot之静态资源规则与定制化

文章目录 前言一、静态资源访问二、静态资源访问前缀三、webjar资源处理的默认规则 四、welcome与favicon功能1.欢迎页支持欢迎页处理规则 2.自定义Favicon 五、补充总结 前言 本文主要介绍关于SpringBoot中Web开发的简单功能。 一、静态资源访问 只要静态资源放在类路径下&am…

物联网安全优秀实践:2023年设备保护指南

物联网的发展可谓是革命性的&#xff0c;数十亿台设备实时互连、通信和共享数据。因此&#xff0c;考虑物联网安全的最佳实践至关重要。 物联网的重要性日益上升 在数字时代&#xff0c;物联网(IoT)已成为一股革命力量&#xff0c;重塑了企业运营和个人生活方式。从调节家庭温…

基于win32实现TB登陆滑动验证

这里写目录标题 滑动验证触发条件&#xff1a;失败条件&#xff1a;解决方法:清除cooKie 滑动验证方式一&#xff1a;win32 api获取窗口句柄&#xff0c;选择固定位置 成功率高方式二&#xff1a; 原自动化滑动&#xff0c;成功率中 案例 先谈理论&#xff0c;淘宝 taobao.com …

A Span-based Multi-Modal Attention Network for joint entity-relationextraction

原文链接&#xff1a; https://www.sciencedirect.com/science/article/pii/S0950705122013247?via%3Dihub Knowledge-Based Systems 2023 介绍 作者认为当前基于span的关系提取方法都太关注于span内部的语义&#xff0c;忽略了span与span之间以及span与其他模态之间&#xff…

腾讯云服务器16核 32G 28M带宽租用价格、性能测评及配置大全

腾讯云轻量应用服务器16核32G28M配置优惠价3468元15个月&#xff08;支持免费续3个月/送同配置3个月&#xff09;&#xff0c;轻量应用服务器具有100%CPU性能&#xff0c;系统盘为380GB SSD盘&#xff0c;28M带宽下载速度3584KB/秒&#xff0c;月流量6000GB&#xff0c;折合每天…