Charades网络架构部分代码阅读

文章详细解释了torch.arange用于创建特定范围的张量,以及tensor.expand函数如何扩展单维度张量的维度值。特别强调了扩展操作不会分配新内存,仅创建视图,并且只适用于维度值为1的情况。
摘要由CSDN通过智能技术生成

1 torch.arange

(0, seg_masks.size(1)).type_as(seg_masks).unsqueeze(0).long()

torch.arange(0, seg_masks.size(1))

为表示position,创建0-127的tensor

type_as 将其变成参数的tensor类型
.unsqueeze(0) 在第一维添加一个维度
.long() 转化为longtensor形式

2 tensor.expand(B, nseg, -1)

(100,1,512).expand(100,128,-1)
这个讲的比较清楚

tensor.expand()函数可以将维度值包含 1 的Tensor(如:torch.Size([1, n])或者torch.Size([n, 1]))的维度进行扩展。其具体的扩展规则如下:

1 只能对维度值包含 1 的张量Tensor进行扩展,即:Tensor的size必须满足:torch.Size([1, n]) 或者 torch.Size([n, 1]) 。
2 只能对维度值等于 1 的那个维度进行扩展,无需扩展的维度务必保持维度值不变,或者置为-1,否则,报错。(简言之,只要是单维度均可进行扩展,但是若非单维度会报错。)
3 扩展的Tensor不会分配新的内存,只是原来的基础上创建新的视图并返回;
4 新扩展维度的取值范围为:− 1 以 及 [ 1 , + ∞ ] 区 间 内 的 任 意 整 数 -1以及[1, +∞]区间内的任意整数−1以及[1,+∞]区间内的任意整数,例如:将 torch.Size([1, n]) 扩展为torch.Size([m, n])时,新扩展维度 m 的可能取值为-1,或者 m ≥ 1的任意整数;
5 只能对张量Tensor进行维度扩展,而不能降维;否则,报错。
6 tensor通过.expand()函数扩展某一维度后,tensor自身不会发生变化

注意第3和第6条

>>> a = torch.tensor([[[2,3,4]],[[5,6,7]]])
>>> print(a.size())
torch.Size([2, 1, 3])
>>> a.expand(2,3,-1)
tensor([[[2, 3, 4],
         [2, 3, 4],
         [2, 3, 4]],

        [[5, 6, 7],
         [5, 6, 7],
         [5, 6, 7]]])
>>> print(a)
tensor([[[2, 3, 4]],

        [[5, 6, 7]]])
>>>

可以看到执行expand后,a的视图显示为[2,3,3] (即2,3,-1),但print输出a/a的size(),仍与expand前没有改变。这是只能在命令行中看到的,如果在spyder中则无法直观的看到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值