pytorch基础教程
张量数据类型
张量定义:
- 在数学中,如果一个数组的维度超过2,那么我们可以称该数组为张量
- 但是在pytorch中,张量属于一种数据结构,它可以是一个标量、一个向量、一个矩阵,甚至是更高维度的数组
- 因此在Pytorch中的张量(Tenser)和Numpy中的数组非常相似,在使用时也会经常将二者相互转化。
- 在深度网络中,基于PyTorch的相关计算和优化都是在Tenser的基础上完成成的
Pytorch的基本类型都是在Int,Double,Float等数据类型后加一个Tensor,但没String类型.
How to denote string
onehot编码,都是01矩阵
- [0,1,0,0]
Embedding
- Word2vec
- glove
张量数据类型
在torch中CPU和GPU张量分别有8中数据类型
数据类型 | dtype | CPU tensor | GPU tensor |
---|---|---|---|
32位浮点型 | torch.float32/torch.float | torch.FloatTensor | torch.cuda.FloatTensor |
64位浮点型 | torch.float64/torch.double | torch.DoubleTensor | torch.cuda.DoubleTensor |
16位浮点型 | torch.float16/torch.half | torch.HalfTensor | torch.cuda.HalfTensor |
8位无符号整型 | torch.uint8 | torch.ByteTensor | torch.cuda.ByteTensor |
8位有符号整型 | torch.int8 | torch.charTensor | torch.cuda.charTensor |
16位有符号整型 | torch.int16/torch.short | torcj.shortTensor | torch.cuda.shortTensor |
32位有符号整型 | torch.int32/torch.int | torch.IntTensor | torch.cuda.IntTensor |
64位you符号整型 | torch.int64/torch.long | torch.LongTensor | torch.cuda.LongTensor |
在torch中默认的数据类型是32位浮点型(torch.FloatTensor),可以通过torch.set_default_tensor_type()函数设置默认的数据类型,但是该函数只支持设置浮点型数据类型
代码如下:
import torch
torch.tensor([1.2,3.4]).dtype #获取张量的数据类型,其中torch.tensor()函数生成一个张量
# torch.float32
torch.set_default_tensor_type(torch.DoubleTensor) #设置张量的默认数据类型
torch.tensor([1.2,3.4]).dtype
#torch.float64
如果一个数据a是Tensor类型
- type(a),a.type()查询数据类型
- isinstance(a,torch.FloatTensor)合法化检验
维度是0的为标量,1的为张量,Pytorch0.3一下没有维度(dimention)为0的标量,自动为1
1 In[3]: torch.tensor[1.]
2 Out[3]:tensor(1.)
3
4 In[3]:torch.tensor(1,3)
5 Out[3]:tensor(1.300)
1.3是0维,但是[1,3]是1维,长度为1的Tensor
z.shape是成员,但a.shape()是成员函数
In[25]: a=torch.tensor(2,2)
In[26]:a.shape
Out[26]:torch.Size([])
In[27]:len(a.shape)
Out[27]:0
In[28]:a.size()
Out[28]:torch.Size([])
- 用.Tensor接受的是数据
- 用.FloatTensor接受的是维度,里面的数据是随机的
In[8]:torch.tensor([1,1])
Out[8]:tensor([1.1000])
In[9]:torch.tensor([1.1,2.2])#.tensor接受的是数据的内容
Out[9]:tensor([1.1000,2.2000])
In[10]:torch.FloatTensor(1)#.FloatTensor接受的是数据的shape
Out[10]:tensor([3.2239e-25])
In[11]:torch.FloatTensor(2)
Out[11]:tensor([3.2239e-25,4.5915e-41])
In[12]:data = np.ones(2)
In[13]:data
Out[13]:array([1.,1.])
In[14]:torch.from_numpy(data)
Out[14]:tensor([1.,1.],dtype=torch.float64)
维度(dim)为2——[2,2]-2行2列
size/shape(形状,不是数据):[2,2]
Tensor指具体数据
In[29]:a=torch.ones(2)
In[30]:a.shape
Out[30]:torch.Size([2])
torch.randn(2,3)-dim维度为2
dim2应用:batch[4,784]—[图片个数,每个图片的维度/数据]
In[31]:a=torch.randn(2,3)
In[32]:a
Out[32]:
tensor([[-0.4423,0.5949,1.1440],
[-2.0935,0.2051,1.2781]])
In[33]:a.shape
Out[33]:torch.Size([2,3])
In[34]:a.size[0]
Out[34]:2
In[35]:a.size(1)
Out[35]:3
In[38]:a.shape[1]
Out[38]:3
dim3应用:文字处理[10,20,100],batch10,每次20句话,每句话100个数据/特征
In[39]:a=torch.rand(1,2,3)
In[40]:a
Out[40]:
tensor([[[0.0764,0.2590,0.9816],
[0.6798,0.1568,0.7919]]])
In[41]:a.shape
Out[41]:torch.Size([1,2,3])
In[42]:a[0]
Out[42]:
tensor([[0.0764,0.2590,0.9816],
[0.6798,0.1568,0.7919]])
In[43]:list(a.shape)
Out[43]:[1,2,3]
dim4:应用于图片[b,c,h,w]—batch,图片通道数channel,高,宽度
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1Nd11Jbz-1617539389852)(pytorch基础教程.assets/20200226171949370.JPG)]
numel:Tensor占用内存大小
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qbqX3kuw-1617539389854)(pytorch基础教程.assets/20200226172205659.JPG)]
张量操作
numpy->torch torch.from_numpy(a)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z6sYcBkY-1617539389855)(pytorch基础教程.assets/20200226182913484.JPG)]
-
小写tensor输入数据
-
大写Tensor和FloatTensor输入维度,shape或者数据-用[] (少用,输入数据可以直接用小写tensor)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OZNUlC8n-1617539389857)(pytorch基础教程.assets/20200226183438379.JPG)]
初始化,不赋值(生成未初始化的数据)
- enpty的值是随机的(给未初始化的数据)
- 建议用大写Tensor输入维度,小写输入数据
绿色标注表示大写不推荐 - 前面的Float是数据形式,若想生成Int型则将Float更改为Int
初始化忘记赋值,会出现随机数非常大,非常小的问题,造成bug,所以要记得赋值
torch.Tensor默认生成torch.FloatTensor数据
图为修改Tensor默认生成的FloatTensor->DoubleTensor
随机初始化
rand随机产生0~1之间的数值,不包括1
torch.rand(3,3)->产生dim为2,shape为3的矩阵
rand_like(a)->把a的shape取出来,再创建一个类似a的tensor
randint只能采样整数
torch.randint(1,10,[3,3]),产生1-9的数。不包括10,左闭右开
正态随机分布
- randn:产生N~(0,1)正态分布
- torch.normal产生的是一维的数,需要自己再reshape
矩阵赋值为同一个数
[]代表标量
[1]代表矢量,维度为1
[2]代表生成两个向量
Pytorch中的range
被arrange
代替,且都是左闭右开
等分函数linspace
,给的是数目而不是步长
logspace
的base参数可以设置为2,10,e等底数
logspace
,10的多少次方
randperm:随机打散
有时需要人的顺序打散,分数不会打散,采用随机种子,例子中的idx
Pytorch的索引和切片
Pytorch风格的索引
根据Tensor的shape,从前往后索引,依次在每个维度上做索引。
import torch
a = torch.rand(4, 3, 28, 28)
print(a[0].shape) #取到第一个维度
print(a[0, 0].shape) # 取到二个维度
print(a[1, 2, 2, 4]) # 具体到某个元素
上述代码创建了一个shape=[4, 3, 28, 28]的Tensor,我们可以理解为4张图片,每张图片有3个通道,每个通道是28x28的图像数据。a代表这个Tensor,a后面跟着的列表[]表示对Tensor进行索引,a的维度dim = 4,决定了[]中的元素个数不能超过4个,[]中的值表示对应维度上的哪一个元素,比如 a[0]表示取第一个维度上的第一个元素,可以理解为第一张图片,a[1]表示取第一个维度上的第二个元素,可以理解为第二张图片。a[0, 0]表示取第一个维度上第一个元素的与第二个维度上的第一个元素,也就是第一张图片第一个通道的元素。a[1, 2, 2, 4]表示取第第一个维度上的第二个元素与第二个维度上的第三个元素与第三个维度上的第三个元素与第四个维度上的第5个元素,也就是第二张图片第三个通道第三行第四列的像素值是一个标量值。
输出结果:
torch.Size([3, 28, 28])
torch.Size([28, 28])
tensor(0.1076)
索引
注意,最后维度上的值取出来是标量
:2->0,1不包含2
-1:->最后开始
[0 1 2],用-1表示索引就是-3 -2 -1,所以最后一个是-1,因为从最后开始,所以如果是RGB
通道,就只取了B一个通道
start:end:step
::2,代表步长为2
挑选任一位置
…自动识别
ge:找比函数的参数大的位置
转化为一维
nd:step`
::2,代表步长为2
挑选任一位置
…自动识别
ge:找比函数的参数大的位置
转化为一维