PyTorch的数据类型
python和pytorch中的类型对比:
我们可以发现pytorch中每中类型后面都有一个Tensor。
但是很遗憾PyTorch没有String类型。
我们在做NLP的时候会遇到String类型处理的问题,我们会将string转化问数值:
- one-hot
[0,1,0,0,....]
- Embedding
word2vec
glove
1 Data type
我们需要注意的是CPU版和GPU版的不一样
2 Type check
这里我们使用randn生成一个符合正态分布的tensor
a=torch.randn(2,3)
a
tensor([[ 0.9793, 1.1300, -0.6563],
[-0.8705, -0.9400, 1.3000]])
使用a.type,type(a),isinstance(a,torch.FloatTensor)来检验一下他的类型
a.type
#<function Tensor.type>
type(a)
#torch.Tensor
isinstance(a,torch.FloatTensor)
# True
这里我们需要注意一下CUP中的tensor和GPU中的不一样。
isinstance(a,torch.cuda.FloatTensor)
# 这里返回 False
a=a.cuda()
#转化成GPU中的tensor
isinstance(a,torch.cuda.FloatTensor)
# 返回True
3 Dim
3.1 Dim 0
Dim为0的tensor是一个标量,也就是一个具体的数值
torch.tensor(1.)
# tensor(1.)
torch.tensor(1.3)
# tensor(1.3000)
a=torch.tensor(2.2)
a.shape
# torch.Size([])
len(a.shape)
# 0
a.size()
# torch.Size([])
3.2 Dim 1
Dim 1的时候相对于一个列表
可以使用列表的形式定义
torch.tensor([1.1])
# tensor([1.1000])
torch.tensor([1.1,2.2])
# tensor([1.1000, 2.2000])
也可以使用torch.Tensor(1)或者torch.FloatTensor(2)定义
torch.Tensor(1)
# tensor([3.5873e-43])
torch.FloatTensor(1)
# tensor([6.0757e+19])
torch.FloatTensor(2)
# tensor([6.0757e+19, 4.5916e-41])
也可以通过numpy类型变成tensor
torch.from_numpy(data)
data是np列表
data=np.ones(2)
data
# array([1., 1.])
torch.from_numpy(data)
# tensor([1., 1.], dtype=torch.float64)
或者我们也可以使用
torch.ones([2])
torch.zeros([2,2])
来生成一个全0或者全1的tensor
a=torch.ones([2])
a
#tensor([1., 1.])
a.shape
# torch.Size([2])
b=torch.zeros([2,2])
b
#tensor([[0., 0.],
# [0., 0.]])
b.shape
#torch.Size([2, 2])
这里我们要区分一下dim和size/shape,比如一个[2,2]的一个二维矩阵,2是它的dim,[2,2]是它的size/shape。
3.3 Dim 2
可以通过
torch.randn(2,3)
随机生成一个二维的2行,3列的符合正太分布的数组
a=torch.randn(2,3)
a
# tensor([[ 1.0871, 0.6401, 1.1010],
# [ 0.1840, 1.6281, -0.3268]])
a.shape
#torch.Size([2, 3])
a.size(0),a.size(1),a.shape[0],a.shape[1]
#(2, 3, 2, 3)
也可以通过
torch.ones(2,3)
torch.zeros(2,3)
生成全0或者全1的数组
这里2维的dim重要用在Linear Input batch。例如一个[batch,784]
3.4 Dim 3
例如torch.randn(2,2,3),是一个三维的tensor,这个代表的是有2个(2,3)的二维矩阵
b=torch.randn(2,2,3)
b
#tensor([[[ 0.6101, 0.7085, -0.5774],
# [-0.1907, 1.3382, 0.0592]],
#
# [[-0.4956, 0.7636, 0.1150],
# [-0.0104, 0.3667, -1.4105]]])
b[0]
#tensor([[ 0.6101, 0.7085, -0.5774],
# [-0.1907, 1.3382, 0.0592]])
b.shape
# torch.Size([2, 2, 3])
然后我们查看第一个(2,3)的二维矩阵b[0]
这个三维的数组主要用于RNN Input Batch,例如[10,20,100],这里代表的数10个句子,每个句子中都有20个单词,每个单词都用一个100维的列表表示
3.5 Dim 4
a=torch.randn(2,3,28,28)
a
a.shape
#torch.Size([2, 3, 28, 28])
这里主要用于CNN的输入
[b,c,h,w],c是RGB,h是图片的高,w图片的宽
a.numel()
指的是a里面的元素的个数
对于一个shape=[2,3,28,28]的tensor,他的a.numel()=2328*28=4704