• pytorch中.size()、.item、argmax()、.cpu()、.detach()和.data的使用


    1、广播机制

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

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

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

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

    举个例子:

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

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

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

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

    举个例子:

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

    2、.size(dim = x)

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

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

    3、.item()

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

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

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

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

    1. output=torch.tensor([[-0.7403, -0.6481],
    2. [-0.6869, -0.6994]])
    3. pred = torch.argmax(output,dim=1)
    4. 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的用法 - 知乎

  • 相关阅读:
    Java synchronized锁 String 和 Integer 会有什么问题?
    Nacos+openfeign
    DFS 无向图欧拉路径
    千万不要支付赎金!解密.halo勒索病毒的秘诀在这里
    单列集合顶层接口Collection
    利用Gauss-Legendre 5点通用公式正算线路中边桩坐标FX4850曲线任意里程中边桩正反算程序
    从 JDK 8 到 JDK 18,Java 垃圾回收的十次进化
    【华为OD机试python】拔河比赛【2023 B卷|100分】
    如何拓展同城的客户群体?小魔推助力把握同城精准流量!
    【设计模式】工厂模式
  • 原文地址:https://blog.csdn.net/YKbsmn/article/details/127572933