基本框架:
torch.max
<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表示输出所在行的最大值,如下图:
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
得到一个张量里面的元素值
.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()) 运行该行代码会报错
实验结果:
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 = ''