pytorch基础教程

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中数据类型

数据类型dtypeCPU tensorGPU tensor
32位浮点型torch.float32/torch.floattorch.FloatTensortorch.cuda.FloatTensor
64位浮点型torch.float64/torch.doubletorch.DoubleTensortorch.cuda.DoubleTensor
16位浮点型torch.float16/torch.halftorch.HalfTensortorch.cuda.HalfTensor
8位无符号整型torch.uint8torch.ByteTensortorch.cuda.ByteTensor
8位有符号整型torch.int8torch.charTensortorch.cuda.charTensor
16位有符号整型torch.int16/torch.shorttorcj.shortTensortorch.cuda.shortTensor
32位有符号整型torch.int32/torch.inttorch.IntTensortorch.cuda.IntTensor
64位you符号整型torch.int64/torch.longtorch.LongTensortorch.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中的rangearrange代替,且都是左闭右开

在这里插入图片描述

等分函数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:找比函数的参数大的位置

在这里插入图片描述

转化为一维

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值