文章目录

  • 1、概述
  • 2、学习内容
    • 2.1、pytorch 常见语法
      • 2.1.1、sum
      • 2.1.2、广播机制
      • 2.1.3、张量
      • 2.1.4、DataLoader
    • 2.2、普通语法
      • 2.2.1、迭代器

1、概述

本篇博客用来记录,在深度学习过程中,常用的 python 语法内容

2、学习内容

2.1、pytorch 常见语法

2.1.1、sum

在 PyTorch 中,torch.sum() 是一个非常常用的函数,用于对张量(Tensor)进行求和操作。
它的核心作用是沿着指定的维度对张量元素进行累加,支持灵活的维度选择和结果维度保留。

函数定义

torch.sum(input, dim=None, keepdim=False, dtype=None) → Tensor
  • input:输入的张量(Tensor)。
  • dim:指定求和的维度(可以是单个整数或整数列表)。如果不指定(dim=None),则对整个张量的所有元素求和。
  • keepdim:布尔值,是否保留被求和的维度。默认为 False(不保留),若设为 True,则返回的张量会在指定维度上保留大小为 1 的维度。
  • dtype:可选参数,指定输出张量的数据类型。

对所有张量求和

import torch
x = torch.tensor([[1, 2], [3, 4]])
result = torch.sum(x)  # 等价于 1 + 2 + 3 + 4
print(result)  # 输出: tensor(10)

沿着指定维度求和

x = torch.tensor([[1, 2], [3, 4]])# 按列求和(dim=0)
result_dim0 = torch.sum(x, dim=0)  # 1+3, 2+4
print(result_dim0)  # 输出: tensor([4, 6])# 按行求和(dim=1)
result_dim1 = torch.sum(x, dim=1)  # 1+2, 3+4
print(result_dim1)  # 输出: tensor([3, 7])

保留维度求和

x = torch.tensor([[1, 2], [3, 4]])# 按列求和(dim=0)
result_dim0 = torch.sum(x, dim=0)  # 1+3, 2+4
print(result_dim0)  # 输出: tensor([4, 6])# 按行求和(dim=1)
result_dim1 = torch.sum(x, dim=1)  # 1+2, 3+4
print(result_dim1)  # 输出: tensor([3, 7])

2.1.2、广播机制

广播机制(Broadcasting)是 Python 的 NumPy 和 PyTorch 等科学计算库中的核心功能,它允许不同形状的张量/数组进行逐元素运算(如加法、乘法等),而无需显式复制数据。其核心目标是自动扩展较小数组的维度,使其与较大数组的维度匹配,从而简化代码并提高计算效率。

举例

import torch
x = torch.tensor([[1, 2], [3, 4]])
y = x + 10  # 标量 10 被广播为 [[10, 10], [10, 10]]
print(y)
# 输出:
# tensor([[11, 12],
#         [13, 14]])

2.1.3、张量

在深度学习和科学计算中(如 PyTorch、TensorFlow),张量被定义为多维数组的通用数据结构,用于高效存储和操作数据

维度(Rank):张量的“阶数”,即数组的维度数量。

  • 0阶(标量):单个数(如 5)。
  • 1阶(向量):一维数组(如 [1, 2, 3])。
  • 2阶(矩阵):二维数组(如 [[1, 2], [3, 4]])。
  • 3阶及以上:三维及以上数组(如 [[[1, 2], [3, 4]], [[5, 6], [7, 8]]])。

形状(Shape):描述每个维度的大小。例如:

  • 标量:()。
  • 向量:(n,)。
  • 矩阵:(m, n)。
  • 三维张量:(a, b, c)。

张量在深度学习中的作用

  • 数据表示:
    图像:[通道数, 高度, 宽度](如 [3, 256, 256] 表示 RGB 图像)。
    视频:[帧数, 通道数, 高度, 宽度]。
  • 批次数据:[批次大小, …](如 [128, 3, 256, 256] 表示 128 张图像)。
  • 模型参数:神经网络的权重和偏置通常以张量形式存储。
  • 高效计算:支持 GPU/TPU 加速,适用于大规模数据处理。
import torch# 创建张量
scalar = torch.tensor(5)          # 0阶张量 (标量)
vector = torch.tensor([1, 2, 3])  # 1阶张量 (向量)
matrix = torch.tensor([[1, 2], [3, 4]])  # 2阶张量 (矩阵)
tensor_3d = torch.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])  # 3阶张量print("标量形状:", scalar.shape)     # 输出: torch.Size([])
print("向量形状:", vector.shape)     # 输出: torch.Size([3])
print("矩阵形状:", matrix.shape)     # 输出: torch.Size([2, 2])
print("三维张量形状:", tensor_3d.shape)  # 输出: torch.Size([2, 2, 2])

2.1.4、DataLoader

PyTorch 的 DataLoader 是深度学习训练中处理数据的核心工具之一,它通过高效的数据加载和预处理机制,显著提升了训练速度和灵活性。

核心功能
DataLoader 的主要目标是按需批量加载数据,并支持多线程/多进程加速、数据打乱、自动内存管理等功能。其核心功能包括:

  1. 批量处理(Batching)
    将数据集划分为多个批次(batch),每个批次包含 batch_size 个样本。
    批量处理是深度学习模型训练的标准方式,可以充分利用 GPU 的并行计算能力。
  2. 数据打乱(Shuffling)
    通过 shuffle=True 参数,在每个 epoch 开始时随机打乱数据顺序,避免模型学习到数据顺序的偏差。
    如果需要自定义打乱逻辑,可通过 sampler 参数传入自定义采样器(如 RandomSamplerWeightedRandomSampler)。
  3. 多进程数据加载(Multi-worker)
    通过 num_workers 参数指定工作进程数量,利用多进程并行加载数据,减少主进程的等待时间。
    适用于 CPU 密集型的数据预处理(如图像解码、数据增强)。
  4. 内存优化
    按需加载数据(惰性计算),避免一次性加载整个数据集到内存。
    支持自动释放不再使用的数据内存,防止内存泄漏。
  5. 自定义批处理逻辑
    通过 collate_fn 参数自定义如何将单个样本组合成一个批次(默认行为是简单堆叠张量)。
    适用于处理不规则数据(如不同长度的文本序列)。
  6. 支持分布式训练
    配合 DistributedSampler 实现多设备(如多 GPU)的数据分片,确保每个设备只处理分配到的子集。

DataLoader的核心参数
在这里插入图片描述


使用步骤

  1. 定义DataSet
from torch.utils.data import Dataset
import os
from PIL import Imageclass MyDataset(Dataset):def __init__(self, root_dir, label_dir, transform=None):self.root_dir = root_dirself.label_dir = label_dirself.transform = transformself.paths = [os.path.join(root_dir, label_dir, f) for f in os.listdir(os.path.join(root_dir, label_dir))]def __len__(self):return len(self.paths)def __getitem__(self, idx):img_path = self.paths[idx]image = Image.open(img_path)label = self.label_dir  # 示例:标签为目录名if self.transform:image = self.transform(image)return image, label
  1. 创建DataLoader
    Dataset 实例传入 DataLoader,并配置参数:
from torch.utils.data import DataLoader
import torchvision.transforms as transforms# 数据预处理
transform = transforms.Compose([transforms.Resize((224, 224)),transforms.ToTensor()
])# 初始化 Dataset
dataset = MyDataset(root_dir="data", label_dir="cats", transform=transform)# 创建 DataLoader
dataloader = DataLoader(dataset,batch_size=32,shuffle=True,num_workers=4,pin_memory=True
)
  1. 迭代使用DataLoader
    在训练循环中按批次获取数据:
for epoch in range(10):  # 10个epochfor batch_idx, (images, labels) in enumerate(dataloader):# images: (batch_size, channels, height, width)# labels: (batch_size,)print(f"Epoch {epoch}, Batch {batch_idx}, Images shape: {images.shape}")# 训练模型...

2.2、普通语法

2.2.1、迭代器

在Python中,迭代器(Iterator)是一种逐个访问数据集合的机制,它通过__iter__()__next__()方法实现对数据的按需读取。迭代器的核心特性包括惰性计算、内存高效和统一的遍历接口,这些特性使其在处理大规模数据(如深度学习训练数据)时尤为重要。

基本原理

  • 可迭代对象(Iterable):支持逐个返回元素的对象(如列表、字典、字符串等),通过__iter__()方法返回一个迭代器。
  • 迭代器(Iterator):通过__next__()方法逐个获取元素,当没有更多元素时抛出StopIteration异常。
  • 惰性计算:迭代器不会一次性加载所有数据到内存,而是按需生成下一个值,从而节省内存资源。

核心特性

  • 逐项访问:每次调用next()获取一个元素,直到数据耗尽。
  • 内存高效:适用于处理大型数据集,避免一次性加载全部数据。
  • 统一接口:所有迭代器遵循相同的__iter__()__next__()协议,便于与for循环、生成器等协同工作。

代码实现

  1. 内置迭代器
    Python的内置数据结构(如列表、字典、字符串)都可以通过iter()函数转换为迭代器:
numbers = [1, 2, 3]
iterator = iter(numbers)
print(next(iterator))  # 输出: 1
print(next(iterator))  # 输出: 2
  1. 自定义迭代器
    通过实现__iter__()__next__()方法定义自定义迭代器:
class MyRange:def __init__(self, start, end):self.current = startself.end = enddef __iter__(self):return selfdef __next__(self):if self.current < self.end:num = self.currentself.current += 1return numelse:raise StopIterationfor i in MyRange(1, 4):print(i)  # 输出: 1, 2, 3
  1. 数据生成器
    生成器是更简洁的迭代器实现方式,通过yield关键字逐个返回值:
def my_generator():yield 1yield 2yield 3for value in my_generator():print(value)  # 输出: 1, 2, 3

迭代器和深度学习的关联
在深度学习中,数据通常是大规模的(如图像数据集、文本语料库等),直接加载所有数据到内存会导致内存不足。迭代器通过按需加载和批处理(batching)解决了这一问题,成为深度学习框架(如PyTorch、TensorFlow)的核心组件。

pytorch 的 DataLoader

from torch.utils.data import DataLoader, TensorDataset
import torch# 创建虚拟数据
features = torch.randn(1000, 10)  # 1000个样本,每个样本10个特征
labels = torch.randint(0, 2, (1000,))  # 二分类标签dataset = TensorDataset(features, labels)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)for batch_features, batch_labels in dataloader:# 每个batch包含32个样本print(batch_features.shape)  # 输出: torch.Size([32, 10])

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

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

相关文章

力扣网C语言编程题:搜索二维矩阵(右上角->左下角解法)

一. 简介 上一篇文章关于"在二维数组中查找某个元素"的问题&#xff0c;提供了两种解题思路&#xff0c;文章如下&#xff1a; 力扣网C语言编程题&#xff1a;搜索二维矩阵的普通解法与二分查找法-CSDN博客 本文提供第三种解题思路&#xff1a;从左下角->右上角…

AI大模型流式输出,OkHttp Log拦截打印方案

背景&#xff1a; 使用okhttp框架进行网络访问时&#xff0c;一般会使用 HttpLoggingInterceptor 打印请求和响应的log。在使用okhttp访问AI大模型时&#xff0c;如果选择流式输出&#xff0c;那么响应的body数据使用的SSE技术&#xff0c;服务异步发送大模型生成的增量token&…

看数据世界的历史:全面梳理从关系库、大数据到AI时代的数据发展及展望

序章 在数据库不断发展的时代里&#xff0c;我们看到了关系型数据库&#xff08;RDB&#xff09;在一次次的数据演变过程中的占据王位&#xff0c;捍卫了胜利&#xff0c;像一个王朝更替下的“王权”的故事&#xff0c;精彩有趣。 本篇就来探讨下数据库的发展兴衰史&#xff0…

元宇宙与人工智能的融合:从虚拟世界到智能生态的IT新革命

文章目录 引言&#xff1a;前沿技术重塑数字交互体验一、元宇宙与AI融合的本质&#xff1a;虚拟空间与智能交互的交汇元宇宙赋能AI&#xff1a;AI赋能元宇宙&#xff1a; 二、元宇宙与AI融合的演进&#xff1a;从概念到产业热潮三、核心技术&#xff1a;元宇宙与AI融合的基石与…

问卷调查[mqtt dht]

任务 this code uses esp32-wroom-32 and dht11 to read the humidty and temperature, besieds, it will send the meassage to the cloud platform. All communication is conducted through MQTT. 打分标准 您应该对以下代码进行评级&#xff0c;并且必须遵守如…

swift 对象转Json

在 Swift 中将对象转换为 JSON 可以通过以下方法实现&#xff1a; 使用 Codable 协议 Swift 的 Codable 协议&#xff08;Encodable 和 Decodable 的组合&#xff09;是处理 JSON 编码和解码的推荐方式。 struct Person: Codable {var name: Stringvar age: Int }let person…

Python学习Day43

学习来源&#xff1a;浙大疏锦行 import torch import torch.nn as nn import torch.nn.functional as F import torchvision import torchvision.transforms as transforms import numpy as np import matplotlib.pyplot as plt from PIL import Image import os # 设置随机…

了解一下Unity AssetBundle 的几种加载方式

Unity 的 AssetBundle 系统提供了多种加载方式&#xff0c;以满足不同场景下的资源管理和性能需求。 同步加载&#xff08;LoadFromFile&#xff09; 同步加载使用 AssetBundle.LoadFromFile 方法从文件系统中直接加载 AssetBundle。这种方式会阻塞主线程&#xff0c;直到加载…

鸿蒙边缘智能计算架构实战:多线程图像采集与高可靠缓冲设计

目录 一、技术背景与挑战二、鸿蒙边缘计算架构的核心特性1. 分布式软总线&#xff1a;打破设备孤岛2. 轻量化多线程模型 三、多线程图像采集的稳定性设计1. 分层缓冲队列架构2. 线程优先级策略 四、边缘侧高可靠缓冲机制1. 基于分布式数据管理的容错设计2. 动态带宽调节 五、实…

excel中vba开发工具

1、支持单元格点击出现弹框进行选择 支持模多次模糊查询 Private Sub CommandButton1_Click() Call vehicle_查询 End SubPrivate Sub Worksheet_Activate()Call vehicle_取出车架号和公司名称 取出不重复的车架号Sheet13.ComboBox1.Visible False 车架号显示Sheet13.ComboB…

CatBoost:征服类别型特征的梯度提升王者

基于有序提升与对称树的下一代GBDT框架&#xff0c;重塑高维分类数据处理范式 一、CatBoost的诞生&#xff1a;解决类别特征的终极挑战 2017年由俄罗斯Yandex团队开源&#xff0c;CatBoost&#xff08;Categorical Boosting&#xff09;直指机器学习中的核心痛点&#xff1a;类…

使用 WSL 启动ubuntu.tar文件

使用 WSL 启动ubuntu.tar文件&#xff0c;可按以下步骤进行3&#xff1a; 检查 WSL 版本&#xff1a;确保你的 WSL 版本为 2.4.8 或更高版本。可以在命令行中输入wsl --update来更新 WSL 到最新版本。 设置默认 WSL 版本&#xff1a;如果还没有将 WSL 2 设置为默认版本&#x…

vue-23(创建用于逻辑提取的可重用组合组件)

创建用于逻辑提取的可重用组合组件 可重用的组合式是 Vue 组合式 API 的基石&#xff0c;它使你能够在多个组件中提取和重用有状态逻辑。这有助于编写更清晰的代码&#xff0c;减少冗余&#xff0c;并提高可维护性。通过将特定功能封装到组合式中&#xff0c;你可以轻松地共享…

数据透视表学习笔记

学习视频&#xff1a;Excel数据透视表大全&#xff0c;3小时从小白到大神&#xff01;_哔哩哔哩_bilibili 合并行标签 初始数据透视表 不显示分类汇总 以大纲形式显示 在组的底部显示所有分类汇总 以表格形式显示 合并单元格-右键-数据透视表选项 选中-合并并剧中排列带…

吃透 Golang 基础:测试

文章目录 go test测试函数随机测试测试一个命令白盒测试外部测试包 测试覆盖率基准测试剖析示例函数 go test go test命令是一个按照一定的约定和组织来测试代码的程序。在包目录内&#xff0c;所有以xxx_test.go为后缀名的源文件在执行go build时不会被构建为包的一部分&#…

酒店服务配置无门槛优惠券

1.查看酒店绑定的是那个仓库&#xff1b; 凯里亚德酒店(深圳北站壹城中心店)&#xff0c;绑定的是“龙华民治仓&#xff08;睿嘀购” 2.“门店列表”选择“龙华民治仓&#xff08;睿嘀购””中的“绑定场所” 3.通过酒店名字查找绑定的商品模板&#xff1b; 凯里亚德酒店(深圳…

IoT创新应用场景,赋能海外市场拓展

在数字化浪潮席卷全球的当下&#xff0c;物联网&#xff08;Internet of Things, IoT&#xff09;正以革命性的力量重塑产业生态。这项通过传感器、通信技术及智能算法实现设备互联的技术&#xff0c;不仅推动全球从“万物互联”迈向“万物智联”&#xff0c;更成为赋能企业开拓…

Idea中Docker打包流程记录

1. maven项目&#xff0c;先打package 2.添加Dockerfile 3.执行打包命令 注意最后的路径 . docker buildx build -t xxx-app:版本号 -f Dockerfile . 4.下载文件 docker save -o xxx-app-版本号.tar xxx-app:版本号 5.加载镜像 docker load -i xxx-app-版本号.tar 6.编…

硬件工程师笔试面试高频考点-电阻

目录 1.1 电阻选型时一般从哪几个方面进行考虑? 1.2上拉下拉电阻的作用 1.3 PTC热敏电阻作为电源电路保险丝的工作原理 1.4 如果阻抗不匹配&#xff0c;有哪些后果 1.5 电阻、电容和电感0402、0603和0805封装的含义 1.6 电阻、电容和电感的封装大小与什么参数有关 1.7 …

小程序入门:小程序 API 的三大分类

在小程序开发中&#xff0c;API&#xff08;Application Programming Interface&#xff09;起着至关重要的作用&#xff0c;它为开发者提供了丰富的功能和能力&#xff0c;使我们能够创建出功能强大、用户体验良好的小程序。小程序 API 大致可分为以下三大分类&#xff1a;事件…