pytorch的广播机制,以及其他函数.size()、.item、argmax()、.cpu()、.detach()和.data的使用

1、广播机制

pytorch和numpy 的广播机制原理是一样的

一般广播规则(两个数组的维数是一样的)

当对两个数组进行操作时,PyTorch/NumPy 会逐元素比较它们的形状。此时需要满足两个条件:

  • 要么维度大小一样。
  • 如果维度大小不一样,那么其中一个维度大小必须是1。结果数组的大小是输入数组每个维度的最大【大小】。

举个例子:

a = torch.ones(8, 1, 6) # 8*1*6 
b = torch.ones(8, 9, 1) # 8*9*1 
(a + b).shape
torch.Size([8, 9, 6])

特殊广播机制(维数不一样)

向右对齐进行比较。PyTorch 会自动修正维度的数量 ,并根据广播规则匹配每个维度的大小。具体匹配规则:(从右往左匹配)

  • 如果维度大小一样,继续往左比较。
  • 如果维度大小不一样,那么其中一个维度大小必须是1。没有维度的自动补充为1进行比较

举个例子:

a = torch.ones(8, 1, 2) # 1*1*8*1*2 
b = torch.ones(2, 2, 8, 6, 1) # 2*2*8*6*1 
(a + b).shape
torch.Size([2, 2, 8, 6, 2])

2、.size(dim = x)

size函数返回的是数据第x维的个数。

X = torch.Tensor([
    [1,2,3],
    [4,5,6]
])
print(X.shape)
print(X.size(0))
print(X.size(1))
print(X.size(-1)) # -1代表最后一维
torch.Size([2, 3])
2
3
3

3、.item()

将一个Tensor变量转换为python标量(int、float等)。常用于用于深度学习训练时,将loss值转换为标量并加,以及进行分类任务,计算准确值值时需要。

optimizer.zero_grad()
outputs = model(data)
loss = F.cross_entropy(outputs, label)
#计算这一个batch的准确率
acc = (outputs.argmax(dim=1) == label).sum().cpu().item() / len(labels) #这里也用到了.item()
loss.backward()
optimizer.step()
train_loss += loss.item()   #这里用到了.item()
train_acc += acc

4、torch.argmax(output,dim=x)

torch.argmax()的作用是返回tensor数据第x维的最大值的索引。我们只想要神经网络最终的标签,它输出的概率值并不关心,那么就可以直接用torch.argmax()返回tensor数据最大值的索引,代码示例如下:

output=torch.tensor([[-0.7403, -0.6481],
        [-0.6869, -0.6994]])
pred = torch.argmax(output,dim=1)
pred
tensor([1, 0])

5、.cpu()

将数据的处理设备从其他设备(如gpu拿到cpu上),不会改变变量类型,转换后仍然是Tensor变量。

6、.detach()和.data

detach()就是返回一个新的tensor,将requires_grad 属性设置为False。并且这个tensor是从当前的计算图中分离出来的。但是返回的tensor和原来的tensor是共享内存空间的。

还有一点需要注意的是Tensor.detach()和Tensor.data的区别

共同点:Tensor.data和Tensor.detach()一样, 都会返回一个新的Tensor, 这个Tensor和原来的Tensor共享内存空间,一个改变,另一个也会随着改变,且都会设置新的Tensor的requires_grad属性为False。这两个方法只取出原来Tensor的tensor数据, 丢弃了grad、grad_fn等额外的信息。

区别:Tensor.data不能被autograd追踪到,如果你修改了Tensor.data返回的新Tensor,原来的Tensor也会改变, 但是这时候的微分并没有被追踪到,那么当你执行loss.backward()的时候并不会报错,但是求的梯度就是错误的!因此, 如果你使用了Tensor.data,那么切记一定不要随便修改返回的新Tensor的值。如果你使用的是Tensor.detach()方法,当你修改他的返回值并进行求导操作,会报错。 因此,Tensor.detach()是安全的。

参考Pytorch中.detach()与.data的用法 - 知乎

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值