深度学习初探/02-Pytorch知识/01-Tensor张量数据类型
一、Tensor的基本概念
1、python数据类型与PyTorch数据类型的对比
Tensor中,size表示维度,决定了该数据的数据类型(如int型变量3,其dimension = 0;若要表示二维数组,则dimension = 2)
2、PyTorch中String类型的表示与处理
PyTorch本身不支持string,如果要处理string,必须要采用编码的方式
编码方式 | |
---|---|
ONE-HOT | 类似于ASCII码,用一维向量来表示类别,如[1 0]表示“cat”,[0 1]表示“dog”缺点:表示大量词汇过于浪费(只有一个1,其余全是0);不能很好的表示语义相关性 |
Embedding | 如经典的word2vec、glove |
3、PyTorch中常见的Tensor类型
注意区分CPU和GPU中的Tensor,GPU_Tensor在CPU_Tensor中间加上cuda
常用:FloatTensor、ByteTensor、IntTensor
Δ \Delta Δ判别Tensor的数据类型
import torch
# randn是根据标准正态分布N(0,1)随机生成的tensor
a = torch.randn(2, 3) # 新建一个2维的tensor,2行,3列
(1)查看Tensor的具体数据类型(FloatTensor?IntTensor?and so on)
# a.type()
print('a.type() = ', a.type()) # 返回一个string,代表该tensor的类型
(2)调用python自带函数type(),查看变量的基本数据类型
# (用的少)python自带的type方法,只能返回基本的数据类型(torch.Tensor,而不是torch.FloatTensor)
print('type(a) = ',type(a))
(3)参数的合法化检验:该变量是否是xxx类型?
# 参数的合法化检验:该变量是否是xxx类型?
print('a is FloatTensor ? ',isinstance(a, torch.FloatTensor))
(4)检测某Tensor是否在GPU上?如果不在,如何将其搬运到GPU上?
# 检测某Tensor是否在GPU上
print('a is on GPU ? ',isinstance(a, torch.cuda.FloatTensor))
# 如果为False,则将其搬运到GPU上
a = a.cuda() # .cuda()会返回一个GPU类型的引用
#再检测
print('a is on GPU ? ',isinstance(a, torch.cuda.FloatTensor))
上述实验结果:
二、各个维度的Tensor:
1、Dimension == 0的张量:标量
标量的声明方法
In: torch.tensor(1.3)
Out: tensor(1.3000)
此处,1.3是0维,但[1.3]是一个1维、长度为1的Tensor
标量的应用场景:计算Loss
Δ \Delta Δ检验tensor的维度(验证一个tensor是否为标量)
a = torch.tensor(2.2)
print('a.shape == ', a.shape,'\n', # 是一个空的list类型的size(即一个标量)
'len(a.shape) == ',len(a.shape),'\n', # 0维
'a.size() == ',a.size())
2、Dimension == 1的张量:向量
向量的声明方法:
方法1:使用 .tensor(数据的内容)
In: torch.tensor([1.1, 2.2])
Out: tensor([1.1000, 2.2000])
方法2:使用 .FloatTensor(数据的shape)
该方法会对数据内容进行随机初始化
In: torch.FloatTensor(2)
Out: tensor([-2.4370e-08, 4.5915e-41])
方法3:使用numpy引入向量
In: data = np.ones(2) # numpy初始化默认的数据值为1
print(data)
Out: [1. 1.]
In: print(torch.from_numpy(data)) # 将numpy格式转换为FloatTensor
Out: tensor([1., 1.], dtype=torch.float64)
向量的应用场景:
(1)Bias神经元偏置;
(2)Linear Input(神经网络线性层的输入,如:将[28,28]的手写数字图片进行flat平坦化操作,打平成[784]的Tensor进行输入)
Δ \Delta Δ如何区分dim、size、shape
类型 | 特性 |
---|---|
dimension | 描述有行有列 |
shape/size | 描述有几行几列 |
3、Dimension == 2的tensor
随机生成一个2行3列的tensor
In: a = torch.randn(2,3) # 随机生成一个2行3列的tensor,有行有列,所以dim==2
Out: tensor([[-0.5616, -1.4493, 1.5513],
[-0.4550, -1.1353, -0.4386]]) # dim等于多少,就叠多少‘[]’
注意:shape用方括号[ ],size用圆括号( )
调用a.shape和a.shape[ ]实现对a整体shape的打印以及对行、列shape的分别打印
In: print(a.shape,a.shape[0],a.shape[1])
Out: torch.Size([2, 3]) 2 3
调用a.size和a.size( )实现对a整体size的打印以及对行、列size的分别打印
In: print(a.size(),a.size(0),a.size(1))
Out: torch.Size([2, 3]) 2 3
应用场景:带有batch的Linear Input
如同时处理4张线性输入的图片:[4,784],dim1表示选择哪一个图片,dim2用于表示该照片的具体数据
4、Dimension == 3 的tensor
生成方法:类比上面即可
应用场景:带有batch的RNN Input
如: 一句话由10个单词组成,每次传送20句话,每句话使用100bit进行ONE HOT编码
⇒ \Rightarrow ⇒[word_num, batch, feature]==[10,20,100]
5、Dimension == 4 的tensor
应用场景:基于CNN的图片处理
如:[batch,通道数, height, width] == [5,1,28,28] 每次处理5张mnist数据集中的图片
(彩色图片由RGB组成,通道数可以为3;手写数字图片只有灰度值,只用1个通道即可)