基本框架:
image.png

torch.max

  1. <br /> _, predicted = torch.max(outputs.data, dim=1) # dim = 1 列是第0个维度,行是第1个维度 求每一行最大下标

输入

  • input是softmax函数输出的一个tensor
  • dim是max函数索引的维度0/1,0是每列的最大值,1是每行的最大值

torch.max)(a,0) 返回每一列中最大值的那个元素,且返回索引(返回最大元素在这一列的行索引
torch.max(a,1) 返回每一行中最大值的那个元素,且返回其索引(返回最大元素在这一行的列索引)

https://blog.csdn.net/Z_lbj/article/details/79766690

torch.max()[0], 只返回最大值的每个数
troch.max()[1], 只返回最大值的每个索引
torch.max()[1].data 只返回variable中的数据部分(去掉Variable containing:)
torch.max()[1].data.numpy() 把数据转化成numpy ndarry
torch.max()[1].data.numpy().squeeze() 把数据条目中维度为1 的删除掉
torch.max(tensor1,tensor2) element-wise 比较tensor1 和tensor2 中的元素,返回较大的那个值

dim=1表示输出所在行的最大值,如下图:

image.png

x:
 tensor([[0.5285, 0.1247, 0.8332, 0.5485],
        [0.7917, 0.6138, 0.5881, 0.3381],
        [0.4226, 0.6605, 0.8571, 0.0399],
        [0.1716, 0.0609, 0.9712, 0.4838]])

torch.max(x,1):
 (tensor([0.8332, 0.7917, 0.8571, 0.9712]), tensor([2, 0, 2, 2]))

torch.max(x,0):
 (tensor([0.7917, 0.6605, 0.9712, 0.5485]), tensor([1, 2, 3, 0]))

————————————————
版权声明:本文为CSDN博主「快乐地笑」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43255962/article/details/84402586

pytorch中为什么要用 zero_grad() 将梯度清零

调用backward()函数之前都要将梯度清零,因为如果梯度不清零,pytorch中会将上次计算的梯度和本次计算的梯度累加。这样逻辑的好处是,当我们的硬件限制不能使用更大的bachsize时,使用多次计算较小的bachsize的梯度平均值来代替,更方便,坏处当然是每次都要清零梯度。

optimizer.zero_grad()
output = net(input)
loss = loss_f(output, target)
loss.backward()

item和data区别

item是得到一个元素张量里面的元素值
链接:pytorch 张量相加的四种方法

torch.Tensor.item() 坑,注意只能是一个值,适合返回loss,acc

得到一个张量里面的元素值
pytorch项目代码小点记录 - 图3

.data返回的是一个tensor,但不会构建计算图
而.item()返回的是一个具体的数值。
注意:对于元素不止一个的tensor列表,使用item()会报错

PyTorch0.4中,.data 仍保留,但建议使用 .detach(), 区别在于 **.data** 返回和 **x** 的相同数据 **tensor**, 但不会加入到**x**的计算历史里,require s_grad = False, 这样有些时候是不安全的, 因为 x.data 不能被 autograd 追踪求微分 。 .detach() 返回相同数据的 tensor ,且 requires_grad=False ,但能通过 in-place 操作报告给 autograd 在进行反向传播的时候.

二、实验代码demo

import torch 
a  = torch.ones([1,3])
print(a)
print(a.data)
print(a.data[0,1])
print(a.data[0,1].item())
# print(a.item()) 运行该行代码会报错

实验结果:
pytorch项目代码小点记录 - 图4

rand&&rand_like&randn

https://blog.csdn.net/qq_35781239/article/details/106981340

rand
返回在区间[0,1)[0,1)上由均匀分布的随机数填充的张量
张量的形状由可变参数大小来定义。
rand_like
格式不变,只修改内容(0,1)
返回与输入相同大小的张量,该张量由区间[0,1)上均匀分布的随机数填充rand_like(input)相当于torch.rand(input.size(), dtype=input.dtype, layout=input.layout, device=input.device)
randn
返回一个从均值为0、方差为1的正态分布(也称为标准正态分布)中填充随机数的张量, ∼ N ( 0 , 1 )
张量的形状由可变参数size来定义

torch.range()和torch.arange()的区别

  • torch.range(start=1, end=6) 的结果是会包含end的,
  • torch.arange(start=1, end=6)的结果并不包含end。

两者创建的tensor的类型也不一样。

    import torch

    y = torch.range(1, 6)

    print(y)
    print(y.dtype)

    z = torch.arange(0, 6)
    print(z)
    print(z.dtype)

    ----
tensor([1., 2., 3., 4., 5., 6.])
torch.float32
tensor([0, 1, 2, 3, 4, 5])
torch.int64

https://blog.csdn.net/lunhuicnm/article/details/106712026

ERROR——

NameError: name ‘false’ is not defined

遇到这个问题,一般是因为eval无法解析null, true, false之类的数据

可以在用eval之前加上这些代码,就不会有问题

global false, null, true
false = null = true = ''