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自动分配列数。