a63dfe3b70a514abc6a98bff7467cee2.png

63deb58ae7ee478e6ae226a44a90da8e.png

我们把单个样本图像张量放入一个大小为1的批次当 (batchsize,in_channels,height,width)=(批量大小,输入通道数,高,宽)

18ada110f34d5533c5f5941dc03dc326.png

函数:torch.unsqueeze(tensor, dim)

unsqueeze()函数的功能是在tensor的某个维度上添加一个维数为1的维度,这个功能用view()函数也可以实现。这一功能尤其在神经网络输入单个样本时很有用,由于pytorch神经网络要求的输入都是mini-batch型的,维度为[batch_size, channels, w, h],而一个样本的维度为[c, w, h],此时用unsqueeze()增加一个维度变为[1, c, w, h]就很方便了。

79217007c8049acc0278a9316ef1c434.png

9a4e35f124a59802a0b9f0ab252d9bef.png
预测结果

这个argmax()函数什么意思?怎么用?为什么里面用dim=1,dim=1是什么意思?

argmax函数:torch.argmax(input, dim=None, keepdim=False)返回指定维度最大值的序号,dim给定的定义是:the demention to reduce.也就是把dim这个维度的,变成这个维度的最大值的index。

dim的不同值表示不同维度。特别的在dim=0表示二维中的列,dim=1在二维矩阵中表示行。广泛的来说,我们不管一个矩阵是几维的,比如一个矩阵维度如下:(d0,d1,...,dn−1) ,那么dim=0就表示对应到d0 也就是第一个维度,dim=1表示对应到也就是第二个维度,一次类推。

import torch
a=torch.tensor(
              [
                  [1, 5, 5, 2],
                  [9, -6, 2, 8],
                  [-3, 7, -9, 1]
              ])
b=torch.argmax(a,dim=0)#选取每列最大行标,9在这一列的位置是1,第二列最大是7位置是2,后面依次类推。
print(b)
print(a.shape)
结果:
1.tensor([1, 2, 0, 1])
2.torch.Size([3, 4])

6b89e95e881a0a67f5653dd13d78feae.png

使用pytorch框架进行神经网络训练时,涉及到分类问题,就需要使用softmax函数,这里以二分类为例,介绍nn.Softmax()函数中,参数的含义。
1. 新建一个2x2大小的张量,一行理解成一个样本经过前面网络计算后的输出(1x2),则batch_size是2。
import numpy as np
import torch
import torch.nn as nn
a = np.array([[1.5, 6.7],[6.8, 3.4]])
b = torch.from_numpy(a)
2. 下面调用nn.Softmax(dim),dim分别为0,1,看看结果是什么样子
f = nn.Softmax(dim = 0)
c = f(b)
结果: tensor([[0.0050, 0.9644], [0.9950, 0.0356]], dtype=torch.float64)
可以发现,是每一列和为1.
f = nn.Softmax(dim = 1)
结果:tensor([[0.0055, 0.9945], [0.9677, 0.0323]], dtype=torch.float64)
可以发现是每一行和为1

简单来说:当nn.Softmax的输入是一个二维张量时,其参数dim = 0,是让列之和为1;dim = 1,是让行之和为1。

ce1ab742bb530acb3eeb8bd88b6eff1b.png

从上图可以看得出来,由于权重的不一样,即使同一个模型,预测结果也是不一样的。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐