0. 连续张量和非连续张量1.核心含义“连续contiguous” 描述的是张量底层数据在内存中的存储方式。2.连续张量张量的元素在内存中按“行优先”顺序连续排列没有间隔能通过固定步长遍历所有元素3.非连续张量经过transpose()、permute()等操作后张量的维度顺序变了但底层数据的存储顺序没改导致元素在内存中不再连续遍历需要不规则步长。用 “书” 举例连续张量书按[0,0]→[0,1]→[0,2]→[1,0]→[1,1]→[1,2]的顺序摆放在一排没有空隙非连续张量如转置后维度变成[列,行]但书的摆放顺序还是原来的[0,0]→[0,1]→[0,2]→[1,0]→[1,1]→[1,2]此时要按列取数如[0,0]→[1,0]→[0,1]→[1,1]需要跳着找书内存不连续。1. torch.view()核心作用重塑张量形状采用方式是 “共享内存”修改新张量会影响原张量的位置要求张量是 “连续的contiguous”否则会报错。特点不改变原始 x 通过共享内存的方式改变张量的形状并且仅支持连续张量。因为view()需要按固定步长重塑维度。进一步解读PyTorch 中像view()这类操作并不会复制张量的底层数据而是创建一个新的 “视图view” —— 新张量和原张量共用同一块内存空间只是对数据的 “解读方式”维度、步长不同。因此修改新张量的某个元素原张量对应位置的元素也会同步改变反之亦然。importtorch# 原始张量xtorch.randn(2,3)print(原始x shape:,x.shape)# ([2,6])# 重塑x_viewx.view(2,3,3)print(重塑x shape:,x_view.shape)# ([2,3,3])# 验证共享内存x_view[0,0,0]100.0print(原始x[0,0]:,x[0,0])# tensor(100.)2. torch.reshape()核心作用重塑张量形状无需张量连续是更推荐的通用重塑方法。特点reshape兼容非连续张量view仅支持连续张量功能上几乎等价新手优先用reshape。importtorch# 原始张量xtorch.arange(12).reshape(3,4)# torch.Size([3,4])print(x shape:,x.shape)# 重塑为[4,3]x_transx.transpose(0,1)# 连续张量-非连续张量x_reshapex_trans.reshape(4,3)# [3,4] - [4,3]print(x_reshape:,x_reshape.shape)# 展平x_flatx_reshape.reshape(-1)# -1 表示自动计算维度print(x_flat shape:,x_flat.shape)3. torch.triu()核心作用提取张量的上三角部分其余元素置 0常用来构造因果掩码如 Transformer 的自注意力。特点提取张量的上三角部分。其中diagonal对角线偏移默认 0diagonal1表示主对角线以上的部分。importtorch# 原始矩阵torch.ones(x,y) 创建xtorch.ones(3,3)# 提取上三角部分diagonal1主对角线以上保留x_triutorch.triu(x,diagonal1)print(x_triu:,x_triu)# 输出# tensor([[0., 1., 1.],# [0., 0., 1.],# [0., 0., 0.]])# 构造因果掩码矩阵seq_len3masktorch.triu(torch.full(seqlen,seqlen),float(-inf),diagonal1)print(mask:,mask)# 输出# tensor([[-inf, -inf, -inf],# [ -inf, -inf, -inf],# [ -inf, -inf, -inf]])4. torch.full()核心作用创建指定形状、所有元素均为固定值的张量常用于构造掩码如负无穷、0/1 掩码。特点必须得传入默认值。参数size张量形状、fill_value填充值、device可选指定设备。比 torch.ones(x,y) 和 torch.zeros(x,y) 要更灵活。importtorch# 创建2x3的全5张量 torch.full((seq, seq), float(-inf))x_fulltorch.full((2,3),5.0)print(x_full:\n,x_full)# 输出# tensor([[5., 5., 5.],# [5., 5., 5.]])# 创建3x3的全负无穷张量注意力掩码常用masktorch.full((3,3),float(-inf),devicecpu)print(mask:\n,mask)# 输出# tensor([[-inf, -inf, -inf],# [-inf, -inf, -inf],# [-inf, -inf, -inf]])5. torch.transpose()核心作用交换张量的两个维度常用于矩阵转置、调整注意力张量的维度顺序如[bsz, seq_len, heads]→[bsz, heads, seq_len]。参数dim0、dim1要交换的两个维度索引。importtorch# 通过 torch.randn()、torch.full()、torch.ones()创建张量xtorch.randn(1,512,16,1024)xtorch.full((1,512,16,1024),float(-inf))xtorch.full((1,512,16,1024))# 报错torch.full(tensor, value)必须得同时传入默认值、张量两个元素xtorch.ones(1,512,16,1024)print(x:,x)# torch.Size([bsz, seq, heads, dim])6. torch.cat()核心作用在指定维度上拼接多个张量要求除拼接维度外其他维度形状完全一致。参数tensors待拼接的张量列表、dim拼接维度。importtorch# 通过 torch.randn()、torch.full()、torch.ones()创建张量xtorch.randn(1,512,16,1024)xtorch.full((1,512,16,1024),float(-inf))xtorch.full((1,512,16,1024))# 报错torch.full(tensor, value)必须得同时传入默认值、张量两个元素xtorch.ones(1,512,16,1024)print(x:,x)# [bsz, seq, heads, dim]x2torch.randn(1,512,8,1024)# 在维度2上进行拼接x_cattorch.cat([x1,x2],dim2)print(x_cat shape:,x_cat.shape)# torch.Size([1,512,24,1024])# 注意力 KV 缓存拼接past_kvtorch.randn(1,10,1024)# [bsz, seq, dim]这里seq代表已经处理了 10 个kv健cur_kvtorch.randn(1,1,1024)# 当前 kv 键值对new_kvtorch.cat([past_kv,new_kv],dim1)print(new_kv cache:,new_kv)# torch.cat([a, b], dimc)torch.Size([1, 11, 1024])7. torch.arange()核心作用创建连续整数序列的一维张量常用于生成索引、位置编码等。特点torch.arange() 是根据步长来生成张量的没有默认值只能生成一维张量torch.full() 能生成任意维度张量且支持默认值torch.randn() 随机生成指定维度的张量不支持默认值。参数start起始值默认 0、end结束值不包含、step步长默认 1。# 生成0到9的整数[0,1,2,...,9]x1torch.arange(10)print(x1:,x1)# tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])# 生成1到9步长2[1,3,5,7,9]x2torch.arange(1,10,2)print(x2:,x2)# tensor([1, 3, 5, 7, 9])# 结合size()使用生成与张量某维度长度匹配的索引xtorch.randn(2,5,8)# 生成0到x.size(1)-1的索引x.size(1)5idxtorch.arange(x.size(1))print(idx:,idx)# tensor([0, 1, 2, 3, 4])8. tensor.size() / tensor.shape核心作用获取张量的形状信息size()是方法shape是属性功能几乎等价。参数dim可选指定维度索引返回该维度的长度不指定则返回 torch.Size 对象。如 x.size(0) 代表张量中第一个维度的大小。xtorch.randn(2,3,4)# 获取整体形状print(x.size():,x.size())# torch.Size([2, 3, 4])print(x.shape:,x.shape)# torch.Size([2, 3, 4])# 获取指定维度的长度print(维度0长度:,x.size(0))# 2批次大小print(维度1长度:,x.size(1))# 3序列长度print(维度2长度:,x.size(2))# 4特征维度# 解包形状常用操作bsz,seq_len,hidden_dimx.size()print(f批次{bsz}, 序列长度{seq_len}, 特征维度{hidden_dim})# 批次2, 序列长度3, 特征维度49. torch.unsqueeze() / torch.squeeze()核心作用插入和删除指定维度插入和删除的维度的长度为1.torch.unsqueeze(tensor, dim)在指定维度插入一个维度维度长度为 1常用于扩展掩码维度torch.squeeze(tensor, dim)删除长度为 1 的维度简化张量形状。# unsqueeze扩展维度注意力掩码常用masktorch.randn(2,3)# torch.Size([2,3])# 插入维度1和2shape [2,1,1,3]匹配注意力分数维度mask_unsqmask.unsqueeze(1).unsqueeze(2)print(mask_unsq shape:,mask_unsq.shape)# torch.Size([2, 1, 1, 3])# squeeze删除长度为1的维度xtorch.randn(2,1,3,1)x_sqx.squeeze()# 删除所有长度为1的维度print(x_sq shape:,x_sq.shape)# torch.Size([2, 3])总结形状调整reshape通用、view共享内存是核心优先用reshapesize()/shape用于获取形状信息。维度操作transpose交换维度、unsqueeze/squeeze增 / 删维度、cat拼接张量是维度调整高频函数。特殊张量创建arange生成序列、full固定值张量、triu上三角矩阵常用于掩码、索引构造。记忆要点cat要求非拼接维度形状一致triu(diagonal1)是 Transformer 因果掩码的核心unsqueeze是扩展掩码维度的常用操作。