Tensor & Batch(张量 ,批量)

张量是机器学习和深度学习的基础,它是一种多维数据容器,用于存储数值数据。张量的维度称为轴,例如,矩阵是二维张量,而视频数据可能涉及五维张量。在深度学习中,数据通常以批量处理,例如,图像数据表示为4D张量,时间序列数据为3D张量。批量轴是张量的第一个维度,用于容纳多个样本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据张量

一般来说,当前所有机器学习系统都是用张量作为基本的数据结构

张量是一个数据容器,它包含的数据几乎总是数值数据,因此它是数字的容器,矩阵是二维张量, 张量是矩阵向任意维度的推广。

张量的维度,叫做轴。

5D向量 与 5D张量的 区别。

3D张量相当于一个数字组成的立方体,将多个3D张量组合成一个数组,可以创建一个4D张量。以此类推。
深度学习处理的一般是0D到4D的张量,但处理视频数据时可能会遇到5D张量。

张量由以下几个关键属性来定义:
轴的个数、形状、数据类型

数据批量

深度学习中所有数据张量的第一个轴(0轴,因为索引从0开始)都是样本轴(samples axis,有时也叫样本维度)。在mnist的例子中,样本就是数字图像。
此外,深度学习模型不会同时处理整个数据集,而是将数据拆分成小批量。
对于这种批量张量,第一个轴(0轴)叫做批量轴(batch axis)或批量维度(batch dimension)

现实世界中的数据张量:

• 向量数据:2D数据,形状为(samples,features)。
• 时间序列数据 或 序列数据,3D张量,形状为(samples,timesteps,features)
• 图像:4D张量,形状为(samples,height,width,channels )或(samples,frames,channels,height,weight)
• 视频:5D张量,形状为(samples,frames,height, width,channels)或(samples, frame, channels,height, width)
### 多头张量批量张量的概念 在深度学习框架中,多头张量(Multi-head Tensor)通常用于注意力机制中的多头自注意力模型。这种设计允许模型在同一层次上关注不同位置的不同表示空间[^1]。 #### 批量张量定义 批量张量Batch Tensor)是指包含多个样本的数据结构,在神经网络处理过程中一次性传递给模型的一组数据。这有助于提高计算效率并通过并行化加速训练过程。对于形状为 `[batch_size, ...]` 的张量来说,第一个维度代表批次数目[^4]。 #### 多头张量的具体应用 当涉及到像Transformer这样的架构时,输入会被分割成若干个头部(heads),每个头部独立工作于不同的特征子集之上。具体而言: - 输入序列被映射到查询(Query)、键(Key)以及值(Value)三个矩阵; - 这些矩阵进一步拆分为预定数量的小型向量集合——即所谓的“头”,形成三维张量形式 `(num_heads, seq_len, head_dim)`; - 各个头分别执行点积相似度运算、softmax归一化操作,并最终聚合得到加权求和的结果作为输出。 ```python import torch from torch import nn class MultiHeadAttention(nn.Module): def __init__(self, embed_size, num_heads): super(MultiHeadAttention, self).__init__() self.embed_size = embed_size self.num_heads = num_heads assert embed_size % num_heads == 0, "Embedding size must be divisible by number of heads" self.head_dim = embed_size // num_heads # Linear transformations for Q,K,V self.q_linear = nn.Linear(embed_size, embed_size) self.k_linear = nn.Linear(embed_size, embed_size) self.v_linear = nn.Linear(embed_size, embed_size) self.out = nn.Linear(embed_size, embed_size) def forward(self, query, key, value, mask=None): N = query.shape[0] q = self.q_linear(query).view(N, -1, self.num_heads, self.head_dim).transpose(1,2) k = self.k_linear(key).view(N, -1, self.num_heads, self.head_dim).transpose(1,2) v = self.v_linear(value).view(N, -1, self.num_heads, self.head_dim).transpose(1,2) energy = torch.einsum("nqhd,nkhd->nhqk", [q,k]) / (self.head_dim ** (1/2)) if mask is not None: energy = energy.masked_fill(mask==0, float("-1e20")) attention = torch.softmax(energy, dim=-1) out = torch.einsum("nhql,nlhd->nqhd",[attention,v]).reshape(N,-1,self.embed_size) return self.out(out) ``` 上述代码展示了如何构建一个多头注意模块,其中包含了对批量大小的支持。这里的关键在于理解 `einsum` 函数的作用:它能够灵活地指定两个或多于两个张量之间的乘法规则,非常适合用来描述复杂的线性代数变换关系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cmy_CTO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值