目录
  1. 1. 1.Pytorch中tensor.view()
  2. 2. 2.torch.nn.functional.affine_grid和torch.nn.functional.grid_sample
  3. 3. torch.max()
  4. 4. torch中.data和.detach()
    1. 4.1. tensor的相关知识的介绍:
Tensor的相关操作

1.Pytorch中tensor.view()

把原来tensor中的数据,按照优先顺序重新排列,参数不可为空,参数中的-1表示这个位置由其他位置的数字来推断,如果没有-1,那么所有参数的乘积就要和tensor中元素的总个数一致了,否则就会出现错误。

注意:这样并不会改变原本Tensor的格式,可以通过赋值得到一个新格式的变量,但是需要注意这个时候是浅拷贝,改变原来的变量仍然会使新变量内容改变。

1
2
3
4
5
6
7
8
9
a=torch.Tensor([[[1,2,3],[4,5,6]]])
b=torch.Tensor([1,2,3,4,5,6])

print(a.view(1,6))
print(b.view(1,6))

输出:
tensor([[1., 2., 3., 4., 5., 6.]])
tensor([[1., 2., 3., 4., 5., 6.]])

2.torch.nn.functional.affine_grid和torch.nn.functional.grid_sample

pytorch 中提供了对Tensor进行Crop的方法,可以使用GPU实现。具体函数是torch.nn.functional.affine_gridtorch.nn.functional.grid_sample。前者用于生成二维网格,后者对输入Tensor按照网格进行双线性采样。

grid_sample函数中将图像坐标归一化到[−1,1][−1,1],其中0对应-1,width-1对应1。

affine_grid的输入是 仿射矩阵(Nx2x3)和欲输出Tensor的尺寸(Tensor.Size(NxHxWx2)),输出的是归一化的二维网格NxHxWx2x2。

对于output上的每一个点,(x,y)三个通道的像素值,采集自input上某一点三个通道的像素值,采集哪个点呢,坐标存储在grid最低维,也就是(N x OH x OW x 2) 中的2,[0]索引到input的x坐标,[1]索引到input的y坐标

要使用 pytorch 的平移操作,只需要两步:

  • 创建 grid:grid = torch.nn.functional.affine_grid(theta, size),其实我们可以通过调节 size 设置所得到的图像的大小(相当于resize);
  • grid_sample 进行重采样:outputs = torch.nn.functional.grid_sample(inputs, grid, mode='bilinear')

theta 的第三列为平移比例,向右为负,向下为负

torch.max()

形式: torch.max(input) → Tensor

返回输入tensor中所有元素的最大值:

1
2
3
4
a = torch.randn(1, 3)
>>0.4729 -0.2266 -0.2085
torch.max(a) #也可以写成a.max()
>>0.4729

形式: torch.max(input, dim, keepdim=False, out=None) -> (Tensor, LongTensor)

按维度dim 返回最大值,并且返回索引。

torch.max(a,0)返回每一列中最大值的那个元素,且返回索引(返回最大元素在这一列的行索引)。返回的最大值和索引各是一个tensor,一起构成元组(Tensor, LongTensor)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
a = torch.randn(3,3)
>>
0.2252 -0.0901 0.5663
-0.4694 0.8073 1.3596
0.1073 -0.7757 -0.8649

torch.max(a,0)
>>
(
0.2252
0.8073
1.3596
[torch.FloatTensor of size 3]
,
0
1
1
[torch.LongTensor of size 3]

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
a = torch.randn(3,3)
>>
0.2252 -0.0901 0.5663
-0.4694 0.8073 1.3596
0.1073 -0.7757 -0.8649

torch.max(a,1)
>>
(
0.5663
1.3596
0.1073
[torch.FloatTensor of size 3]
,
2
2
0
[torch.LongTensor of size 3]
)

拓展:
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中.data和.detach()

都用于返回一个相同数据的tensor

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

实例参考:https://blog.csdn.net/DreamHome_S/article/details/85259533

但是在以下代码中不会改变out的值:

1
2
3
4
5
6
7
8
9
10
11
a = torch.tensor([1, 2, 3.], requires_grad=True)
b = torch.tensor([1, 2, 3.], requires_grad=True)
out = a.sigmoid()
print(out)
c = out.detach() + b
c.zero_()
print(out)

output:
tensor([0.7311, 0.8808, 0.9526], grad_fn=<SigmoidBackward>)
tensor([0.7311, 0.8808, 0.9526], grad_fn=<SigmoidBackward>)

tensor的相关知识的介绍:

tensor的求导https://www.jianshu.com/p/a105858567df

tensor的初始化 https://www.jianshu.com/p/7dbfc7076e5a

文章作者: HazardFY
文章链接: http://hazardfy.github.io/2019/11/16/Tensor的相关操作/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 HazardFY's BLOG
打赏
  • 微信
  • 支付寶