欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

pytorch基础知识点(一)

程序员文章站 2024-01-29 19:44:40
...

1、torch.linspace(start, end, steps=100)用法

torch.linspace(start, end, steps=100, out=None, dtype=None,\
             layout=torch.strided, device=None, requires_grad=False) → Tensor

例如
torch.linspace(-1, 1, 100)

表示从-1开始,到1结束,取100个数字。
输出结果

tensor([-1.0000, -0.9798, -0.9596, -0.9394, -0.9192, -0.8990, -0.8788, -0.8586,
        -0.8384, -0.8182, -0.7980, -0.7778, -0.7576, -0.7374, -0.7172, -0.6970,
        -0.6768, -0.6566, -0.6364, -0.6162, -0.5960, -0.5758, -0.5556, -0.5354,
        -0.5152, -0.4949, -0.4747, -0.4545, -0.4343, -0.4141, -0.3939, -0.3737,
        -0.3535, -0.3333, -0.3131, -0.2929, -0.2727, -0.2525, -0.2323, -0.2121,
        -0.1919, -0.1717, -0.1515, -0.1313, -0.1111, -0.0909, -0.0707, -0.0505,
        -0.0303, -0.0101,  0.0101,  0.0303,  0.0505,  0.0707,  0.0909,  0.1111,
         0.1313,  0.1515,  0.1717,  0.1919,  0.2121,  0.2323,  0.2525,  0.2727,
         0.2929,  0.3131,  0.3333,  0.3535,  0.3737,  0.3939,  0.4141,  0.4343,
         0.4545,  0.4747,  0.4949,  0.5152,  0.5354,  0.5556,  0.5758,  0.5960,
         0.6162,  0.6364,  0.6566,  0.6768,  0.6970,  0.7172,  0.7374,  0.7576,
         0.7778,  0.7980,  0.8182,  0.8384,  0.8586,  0.8788,  0.8990,  0.9192,
         0.9394,  0.9596,  0.9798,  1.0000])

2、torch.suqeeze()与torch.unsqueeze()
torch.squeeze() 这个函数主要对数据的维度进行压缩,去掉维数为1的的维度,比如是一行或者一列这种,一个一行三列(1,3)的数去掉第一个维数为一的维度之后就变成(3)行。squeeze(a)就是将a中所有为1的维度删掉。不为1的维度没有影响。a.squeeze(N) 就是去掉a中指定的维数为一的维度。还有一种形式就是b=torch.squeeze(a,N) a中去掉指定的定的维数为一的维度。

torch.unsqueeze()这个函数主要是对数据维度进行扩充。给指定位置加上维数为一的维度,比如原本有个三行的数据(3),在0的位置加了一维就变成一行三列(1,3)。a.squeeze(N) 就是在a中指定位置N加上一个维数为1的维度。还有一种形式就是b=torch.squeeze(a,N) a就是在a中指定位置N加上一个维数为1的维度
例如:

import torch
d = torch.randn(3)
print('out_d:\n',d)
print("d_shape:\n",d.shape)

e = torch.unsqueeze(d,1)
print('out_e:\n',e)
print('e_shape:\n',e.shape)

输出结果:

out_d:
 tensor([ 1.0019, -0.5108,  0.7973])
d_shape:
 torch.Size([3])
out_e:
 tensor([[ 1.0019],
        [-0.5108],
        [ 0.7973]])
e_shape:
 torch.Size([3, 1])

对于二维的情况下:

import torch

a = torch.randn(2,3)
print('out_a:\n',a)
print('a_shape:\n',a.shape)

输出结果:生成一个两行三列的数据

out_a:
 tensor([[-0.1760, -0.9538, -0.0040],
        [ 0.2490, -1.2058,  0.1976]])
a_shape:
 torch.Size([2, 3])

对数据a在1的位置增加一维,在0的地方增加一维

b = torch.unsqueeze(a,1)
c = a.unsqueeze(0)
f = torch.unsqueeze(a,0)
print('out_b:\n',b)
print('b_shape:\n',b.shape)
print('out_c:\n',c)
print('c_shape:\n',c.shape)
print('out_f:\n',f)
print('out_f:\n',f.shape)

输出结果

   out_b:
     tensor([[[ 0.6487, -0.3548,  0.4499]],
        [[-1.8756, -0.8990,  0.7497]]])
b_shape:
 torch.Size([2, 1, 3])
out_c:
 tensor([[[ 0.6487, -0.3548,  0.4499],
         [-1.8756, -0.8990,  0.7497]]])
c_shape:
 torch.Size([1, 2, 3])
out_f:
 tensor([[[ 0.6487, -0.3548,  0.4499],
         [-1.8756, -0.8990,  0.7497]]])
out_f:
 torch.Size([1, 2, 3])


3、x = x.view(x.size(0), -1)

x.view(3,4)把x变成一个[3,4]的矩阵,

x = x.view(x.size(0), -1)这句话一般出现在model类的forward函数中,具体位置一般都是在调用分类器之前。分类器是一个简单的nn.Linear()结构,输入输出都是维度为一的值,x = x.view(x.size(0), -1)  这句话的出现就是为了将前面多维度的tensor展平成一维。下面是个简单的例子,我将会根据例子来对该语句进行解析。
class NET(nn.Module):
    def __init__(self,batch_size):
        super(NET,self).__init__()
        self.conv = nn.Conv2d(outchannels=3,in_channels=64,kernel_size=3,stride=1)
        self.fc = nn.Linear(64*batch_size,10)
 
    def forward(self,x):
        x = self.conv(x)
        x = x.view(x.size(0), -1)  
        out = self.fc(x)

上面是个简单的网络结构,包含一个卷积层和一个分类层。forward()函数中,input首先经过卷积层,此时的输出x是包含batchsize维度为4的tensor,即(batchsize,channels,x,y),x.size(0)指batchsize的值。x = x.view(x.size(0), -1)简化x = x.view(batchsize, -1)。
view()函数的功能与reshape类似,用来转换size大小。x = x.view(batchsize, -1)中batchsize指转换后有几行,而-1指在不告诉函数有多少列的情况下,根据原tensor数据和batchsize自动分配列数。