当前位置: 首页 > news >正文

1-4 动手学深度学习v2-线性回归的简洁实现-笔记

通过使用深度学习框架来简洁地实现 线性回归模型 生成数据集

import numpy as np
import torch
from torch.utils import data  # 从torch.utils中引入一些处理数据的模块
from d2l import torch as d2ltrue_w = torch.tensor([2,-3.4])
true_b = 4.2
features, labels = d2l.synthetic_data(true_w, true_b, 1000)

调用框架中现有的API来读取数据

# 假设我们已经有了features和labels,我们可以把它们作为一个list传到TensorDataset里面
# 会得到一个Pytorch的一个dataset
# dataset拿到数据集之后,我们可以调用data.DataLoader这个函数,每一次从里面随机的挑选batch_size个样本
# shuffle表示是不是要随机去打乱它的顺序def load_array(data_arrays, batch_size, is_train=True):# 构造一个PyTorch数据迭代器dataset = data.TensorDataset(*data_arrays)return data.DataLoader(dataset, batch_size, shuffle=is_train)batch_size = 10
data_iter = load_array((features, labels), batch_size)next(iter(data_iter))
# 先把data_iter转成python iter,通过next函数来得到一个X和一个y

控制台输出:

[tensor([[ 0.7835,  2.1334],[ 1.2522,  0.8810],[ 2.7299, -0.8198],[-0.7226,  0.1075],[ 0.1661,  3.0323],[ 1.5635,  0.4247],[-0.1221,  0.3311],[ 0.3448,  0.8430],[-0.9672,  1.3701],[ 0.8360,  2.6205]]),tensor([[-1.4739],[ 3.7078],[12.4481],[ 2.4049],[-5.7701],[ 5.8812],[ 2.8200],[ 2.0200],[-2.3958],[-3.0526]])]

使用框架预定义好的层

# nn是神经网络的缩写
from torch import nn
# nn 中定义了大量的定义好的层 对我们的线性回归来说 等价于它的线性层或者说全连接层net = nn.Sequential(nn.Linear(2,1))  # 唯一需要指定的是 输入的维度是多少 输出的维度是多少
# 输入维度:每个样本它的特征个数,即为输入维度# 一般直接用nn.Linear就行(线性回归就是一个简单的单层神经网络),
# 但是我们为了后面的方便,把它放到一个容器Sequential里面
# 可以理解容器Sequential为 list of layers 我们把层按顺序 一个一个的放到一起

在这段代码中,nn.Linear(2,1) 创建了一个线性层(或称为全连接层),这是神经网络中最基本的组成单元之一。
nn.Linear 需要两个主要的参数:输入维度和输出维度,这两个参数决定了层的结构。

输入维度(Input Dimension)

  • 输入维度指的是每个输入数据向量的大小或长度。在神经网络中,每个样本通常被表示为一个向量,向量中的每个元素对应一个特征。因此,输入维度就是每个样本的特征数量
  • 例如,nn.Linear(2,1) 中的 2 表示每个输入样本有2个特征。如果你的数据是二维空间中的点,那么每个点由两个坐标值表示(例如,x 和 y),因此输入维度是2

输出维度(Output Dimension)

  • 输出维度指的是经过这一层计算后输出数据向量的大小或长度。输出维度取决于你希望这一层神经网络输出多少个数值
  • nn.Linear(2,1)中,1 表示这个线性层的输出是一个单一的值。这常见于执行回归任务(如线性回归)时,你可能只需要预测一个连续值(比如房价),因此输出维度是1

nn.Sequential 容器

nn.Sequential 是一个容器,用于按顺序包装多个层。它允许你将多个层组合成一个模块,这样数据就可以依次通过这些层进行处理。在这个例子中,虽然只有一个 nn.Linear(2,1) 层,将其放入 nn.Sequential 中可能看起来多此一举,但这种做法为添加更多层提供了灵活性,便于后续模型的扩展。


初始化模型参数

net[0].weight.data.normal_(0, 0.01)
net[0].bias.data.fill_(0)
# 因为我是放在容器里,也就它一个模型,所以可以用索引0访问到
# weight w
# bias b
# data 真实data
# normal_ 使用正态分布来填充data的值 均值为0,标准差为0.01

计算均方误差使用的是MSELoss类,也称为平方 L 2 L_{2} L2范数

loss = nn.MSELoss()

实例化SGD实例

trainer = torch.optim.SGD(net.parameters(), lr=0.03)
# net.parameters() w和b

那么相比从0开始实现,那里的除以batch_size这里怎么没有了呢?

在PyTorch中,损失函数的默认行为对于批处理的数据是计算并返回批处理中所有样本损失的平均值。因此,当你在训练循环中调用loss(net(X), y)时,得到的损失l实际上已经是当前批次内所有样本损失的平均值

这意味着,即使在代码中没有显式地除以批大小(batch_size)来计算平均误差,这个计算过程实际上已经在损失函数内部自动完成了。这是为了简化训练过程,并使代码更加简洁。

例如,如果你使用的是torch.nn.CrossEntropyLosstorch.nn.MSELoss作为你的损失函数,这些函数默认就是计算批次中所有样本损失的平均值。如果你希望损失函数返回批次中所有样本损失的总和,而不是平均值,你可以在初始化损失函数时通过设置reduction='sum'参数来实现。默认情况下,reduction参数的值是'mean',即计算平均值。

总结来说,你看不到代码中显式地除以batch_size来计算平均误差的原因是因为这一计算步骤已经被内嵌在了损失函数中。


训练过程代码与我们从零开始实现时所做的非常相似

num_epochs = 3
for epoch in range(num_epochs):for X, y in data_iter:    # 依次拿出小批次l = loss(net(X) ,y)   # net本身自带模型参数了,不需要显示的去写w和b了,# 而且这里算的确实已经是平均值,相当于上一节从0开始里面,除以batch_size的操作,它这里是放在计算损失函数里面已经做了trainer.zero_grad()   # 梯度清零 防止梯度累加l.backward()          # 这里pytorch 自动会计算sum,不需要我们自己再去手动计算sumtrainer.step()        # 模型更新l = loss(net(features), labels) # 扫完一遍数据之后,把整个特征矩阵带进去,评估效果,算损失值print(f'epoch {epoch + 1}, loss {l:f}')

控制台输出:

epoch 1, loss 0.000251
epoch 2, loss 0.000111
epoch 3, loss 0.000110

我们可以发现,随着轮次的增大,损失值在降低。

相关文章:

1-4 动手学深度学习v2-线性回归的简洁实现-笔记

通过使用深度学习框架来简洁地实现 线性回归模型 生成数据集 import numpy as np import torch from torch.utils import data # 从torch.utils中引入一些处理数据的模块 from d2l import torch as d2ltrue_w torch.tensor([2,-3.4]) true_b 4.2 features, labels d2l.syn…...

SQL如何实现数据表行转列、列转行?

SQL行转列、列转行可以帮助我们更方便地处理数据,生成需要的报表和结果集。本文将介绍在SQL中如何实现数据表地行转列、列转行操作,以及实际应用示例。 这里通过表下面三张表进行举例 SQL创建数据库和数据表 数据表示例数据分别如下: data_…...

【React】redux状态管理、react-redux状态管理高级封装模块化

【React】react组件传参、redux状态管理 一、redux全局状态管理1、redux概述2、redux的组成1.1 State-状态1.2 Action-事件1.3 Reducer1.4 Store 3、redux入门案例1.1 前期准备1.2 构建store1.2.1 在src下新建store文件夹1.2.2 在store文件夹下新建index.ts文件1.2.3 在index.t…...

HAProxy 和负载均衡概念简介

简介 HAProxy,全称高可用代理,是一款流行的开源软件 TCP/HTTP 负载均衡器和代理解决方案,可在 Linux、macOS 和 FreeBSD 上运行。它最常见的用途是通过将工作负载分布到多台服务器(例如 Web、应用程序、数据库)上来提…...

【go】ent操作之CRUD与联表查询

文章目录 1 CRUD1.1 创建1.1.1 单条创建1.1.2 批量创建 1.2 查找1.2.1 查询单条 / 条件准确查询1.2.2 查询单条 / 条件模糊查询1.2.3 查询单条 / In1.2.4 查询全部 1.3 更新1.4 删除 2 联表查询2.1 O2M(一对多查询)2.1.1 增加Edge2.1.2 查询方法2.1.2.1 …...

服务器性能监控管理方法及工具

服务器是组织数据中心的主干,无论是优化的用户体验,还是管理良好的资源,服务器都能为您完成所有工作,保持服务器随时可用和可访问对于面向业务的应用程序和服务以最佳水平运行至关重要。 理想的服务器性能需要主动监控物理和虚拟…...

AUTOSAR汽车电子嵌入式编程精讲300篇-基于FPGA和CAN协议2.0B的总线控制器研究与设计

目录 前言 研究现状分析 2 CAN总线协议 2.1 CAN总线基本概念 2.2 物理层...

14.1 Ajax与JSON应用(❤❤)

14.1 Ajax与JSON应用 1. Ajax1.1 简介1.2 Ajax使用流程1. 前端创建XMLHttpRequest对象2. 发送Ajax请求3. 处理服务器响应4. 代码2. JSON2.1 简介2.2 JS解析JSON3. Ajax与JSON开发3.1 后端:用Jackson实现JSON序列化输出3.2 前端Ajax处理JSON3.3 Ajax工具...

ffmpeg命令生成器

FFmpeg 快速入门:命令行详解、工具、教程、电子书 – 码中人的博客FFmpeg 是一个强大的命令行工具,可以用来处理音频、视频、字幕等多媒体文件。本文介绍了 FFmpeg 的基本用法、一些常用的命令行参数,以及常用的可视化工具。https://blog.mzh…...

JavaScript基础速成

由于学web时只学了后端,现在到了前后端联调的场景发现看不懂前端代码,于是开始恶补 看了下基础内容发现html和css比较好看懂,但JavaScript比较迷,大概知道组件id绑定事件 下面选取看菜鸟教程补充的JS知识 JS的作用 JS是在html…...

openGauss学习笔记-215 openGauss性能调优-确定性能调优范围-性能日志

文章目录 openGauss学习笔记-215 openGauss性能调优-确定性能调优范围-性能日志215.1 性能日志概述215.2 性能日志收集的配置参数 openGauss学习笔记-215 openGauss性能调优-确定性能调优范围-性能日志 215.1 性能日志概述 性能日志主要关注外部资源的访问性能问题。 性能日…...

在vs code的terminal,debug执行python main.py --train True

GPT4告诉我: 在VS Code中以debug状态执行带有参数(如--train)的main.py文件,你需要在launch.json配置文件中正确设置参数。以下是详细步骤: 打开你的main.py文件:确保你的main.py文件已经在VS Code中打开…...

docker 简单项目

要将服务器端口映射到容器端口,你可以使用 Docker 命令的 -p 选项。以下是基本的步骤: 1. **拉取镜像:** 在服务器上运行以下命令拉取你想要的 Docker 镜像,例如 Nginx: bash docker pull nginx 2. **运行容器…...

计算机毕业设计 基于SpringBoot的线上教育培训办公系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…...

四、机器学习基础概念介绍

四、机器学习基础概念介绍 1_机器学习基础概念机器学习分类1.1 有监督学习1.2 无监督学习 2_有监督机器学习—常见评估方法数据集的划分2.1 留出法2.2 校验验证法(重点方法)简单交叉验证K折交叉验证(单独流出测试集)(常…...

Excel设置单元格下拉框(poi)

前言 年关在即,还在最后的迭代处理,还分了个其他同事的单,说是导出的Excel模版的2列要修改为下拉选项,过程很曲折,不说,以下其实就是一个笔记而已! 其实之前分享过阿里的EasyExcel设置单…...

api接口是什么意思,api接口该如何防护呢?

API接口:应用程序与服务之间的接口 什么是API接口 API是应用程序接口的缩写,指的是能够让不同的应用程序之间交换数据的一种方式。一个API接口就是应用程序与服务之间的接口,它定义了服务提供的功能和数据,以及应用程序如何访问这…...

PMP资料怎么学?PMP备考经验分享

PMP考试前大家大多都是提前备考个一两个月,但是有些朋友喜欢“不走寻常路”,并不打算去考PMP认证,想要单纯了解PMP,不管要不要考证,即使是仅仅学习了解一下我个人都非常支持,因为专业的基础的确能提高工作效…...

partition by list(msn_id)子句的含义

在数据库查询中,特别是在使用SQL语言时,"PARTITION BY" 子句用于对结果集进行分区,以便可以对每个分区进行单独的聚合操作。这是在执行窗口函数(如 ROW_NUMBER(), RANK(), SUM(), AVG() 等)时特别有用的。 …...

【C++】I/O多路转接详解(二)

在上一篇文章【C】I/O多路转接详解(一) 在出现EPOLL之后,随之而来的是两种事件处理模式的应运而生:Reator 和 Proactor,同步IO模型常用于Reactor模式,异步IO常用于Proactor. 目录 1. 服务器编程框架简介2. IO处理1. R…...

龙虎榜——20250610

上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...

如何配置一个sql server使得其它用户可以通过excel odbc获取数据

要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据&#xff0c;你需要完成以下配置步骤&#xff1a; ✅ 一、在 SQL Server 端配置&#xff08;服务器设置&#xff09; 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到&#xff1a;SQL Server 网络配…...