1.Python和PyTorch中的数据类型比较:
Python | PyTorch |
---|---|
Int | IntTensor of size() |
Float | FloatTensor of size() |
Int array | IntTensor of size[d1,d2,…] |
Float array | FloatTensor of size[d1,d2,…] |
string | —- |
在Python中有int、float、array等数据类型,在PyTorch中相对应的都是以tensor
代表的数据类型,同时与Python中数组一样,tensor不同的维度代表不同的数据类型。
如果说要表示一个整型的数字5,就使用IntTensor来表示,但是它的dimension为0;
如果说要表示一个数组的话,它的dimension就为多维。
另外对于Python中常见的string类型,因为PyTorch不是一个完善的语言库,它只是一个面向数据计算的GPU加速库,因此pytorch是没有内建对string类型的支持。
那么怎么在PyTorch中表达string类型那(比如说在做NLP处理时),主要有以下两种处理方法:
- One-hot:
- [0,1,0,0,…]
- One-hot对于类别较小的数据处理比较合适,但是对于超大类别数据处理的话,就会变成一个超大维度的稀疏向量。
- 另外One-hot对于语言中的前后单词的相关性无法体现,针对此种情况需使用Embedding方法。
- Embedding:
- Word2vec
- glove
2.PyTorch内建的数据类型:
平时常用的数据类型主要是FloatTensor、IntTensor、ByteTensor(当比较两个Tensor数据是否相等时,会返回一个ByteTensor)。
3.PyTorch数据类型判断:
In [1]: import torch
# 初始化一个变量a
In [2]: a = torch.randn(2,3)
# 使用.type()方法可以返回一个str
In [3]: a.type()
Out[3]:'torch.FloatTensor'
In [4]: type(a)
Out[4]:<class 'torch.Tensor'>
# 使用isinstance()方法进行数据类型检验
In [5]: isinstance(a,torch.FloatTensor)
True
检验数据类型时,需注意的是同一个tensor部署到CPU或者GPU上时是不一样的。
In [6]: isinstance(a,torch.cuda.FloatTensor)
Out[6]: False
# 使用.cuda()方法将其搬运到GPU上
In [7]: a_new = a.cuda()
In [8]: isinstance(a_new,torch.cuda.FloatTensor)
Out[8]:True
In [9]: isinstance(a,torch.cuda.FloatTensor)
Out[9]: False
# 使用.cpu()方法将其搬运到CPU上
In [10]: a_new2 = a_new.cpu()
In [11]: isinstance(a_new2,torch.FloatTensor)
Out[11]: True
4.Dimension 0/Rank 0的张量——标量:
# 使用.tensor()方法,直接将数值放进去即可
In [12]: torch.tensor(1.1)
Out[12]:tensor(1.1000)
Dimension为0的数据类型常见于Loss,当计算输出值与期待值之间的误差求和再平均之后会得到一个标量Loss。
那么如何查看数据类型的shape:
In [13]: a = torch.tensor(1.1)
# 使用.shape()方法,返回一个torch.Size的类型,这里的torch.Size([])表示是一个空的list的类型的size对象,而不是代表列表类型
In [14]: a.shape
Out[14]:torch.Size([])
# 通过对shape的长度做检验,可以得到Dimension
In [15]: len(a.shape)
Out[15]:0
# 也可以使用.dim()方法,也会返回其Dimension
In [16]: a.dim()
Out[16]:0
In [17]: a.size()
Out[17]:torch.Size([])
5.Dimension 1/Rank 1的张量——向量:
# 加上[]时,将生成一个向量,可以是n长度(size)的向量
In [18]: torch.tensor([1.1]) # 此时size为1
Out[18]: tensor([1.1000])
In [19]: torch.tensor([1.1,2.2]) # 此时size为2
Out[19]: tensor([1.1000, 2.2000])
使用FloatTensor()方法,只需给定长度(size),此时数据初始化是random初始化的
In [20]: torch.FloatTensor(1)
Out[20]: tensor([-3.6882e+26])
In [21]: torch.FloatTensor(2)
Out[21]: tensor([-1.0842e-19, 5.4495e+00])
还可以从numpy引入,使用.from_numpy()方法。
In [22]: data = np.ones(2)
In [23]: data
Out[23]: array([1., 1.])
In [24]: torch.from_numpy(data)
Out[24]: tensor([1., 1.], dtype=torch.float64)
Dimension为1的数据类型常见于Bias和Linear Input(神经网络线性层的输入),比如MINST数据集的一张图片用shape=[784]的Tensor来表示。
6.Dimension 2/Rank 2的张量——矩阵:
# 使用随机的正态分布的方法生成一个dim=2的tensor
In [25]: a = torch.randn(2,3)
In [26]: a
Out[26]: tensor([[-0.3360, -0.1063, 1.1457],
[-0.3700, 0.6694, 0.6805]])
In [27]: a.shape
Out[27]: torch.Size([2, 3])
In [28]: a.shape[0]
Out[28]: 2
In [29]: a.shape[1]
Out[29]: 3
In [30]: a.size()
Out[30]: torch.Size([2, 3])
In [31]: a.size(0)
Out[31]: 2
In [32]: a.size(1)
Out[32]: 3
Dimension为2的数据类型常见于Linear Input batch(带有batch的神经网络线性层的输入)。
例如MNIST数据集的k张图片如果放再一个Tensor里,那么shape=[k,784]。
7.Dimension 3/Rank 3的张量:
# 使用随机的均匀分布的方法生成一个dim=3的tensor
# 第一个维度的长度为1,第二个维度的长度为2,第三个维度的长度为3
In [33]: a = torch.rand(1,2,3)
In [34]: a
Out[34]: tensor([[[0.2044, 0.3051, 0.2204],
[0.9878, 0.1139, 0.7721]]])
In [35]: a.shape
Out[35]: torch.Size([1, 2, 3])
# 对a进行索引
In [36]: a[0]
Out[36]: tensor([[0.2044, 0.3051, 0.2204],
[0.9878, 0.1139, 0.7721]])
# 使用list()方法,直接将torch.Size对象直接转化为列表
In [37]: list(a.shape)
Out[37]: [1, 2, 3]
Dimension为3的数据类型常见于RNN和NLP,如20句话,每句话10个单词,每个单词用100个分量的向量表示,得到的Tensor就是shape=[10,20,100]。
8.Dimension 4/Rank 4的张量:
In [38]: a = torch.rand(2,3,28,28)
In [39]: a
Out[39]: tensor([[[[5.4578e-01, 6.9236e-01, 7.4359e-01, ..., 5.1691e-01,
2.4599e-01, 9.8877e-01],
[1.9284e-01, 2.9319e-01, 9.7599e-01, ..., 6.5844e-01,
9.7889e-01, 9.9475e-03],
[2.0392e-01, 9.2494e-01, 6.4112e-01, ..., 2.1229e-01,
1.2594e-01, 1.2334e-01],
...,
[8.4995e-01, 8.5975e-01, 7.6396e-01, ..., 2.7601e-02,
5.5205e-01, 9.6784e-02],
[5.3113e-01, 1.8242e-01, 2.8725e-01, ..., 1.5286e-01,
8.7327e-01, 3.4777e-01],
[4.9350e-01, 9.8958e-01, 2.5296e-01, ..., 4.2621e-01,
9.9638e-01, 7.3620e-01]],
[[3.9818e-03, 8.7052e-01, 2.5922e-01, ..., 6.3523e-01,
8.1208e-01, 2.3421e-01],
[2.9308e-04, 7.0512e-01, 7.2215e-01, ..., 9.7293e-01,
2.6446e-01, 6.4102e-01],
[6.9713e-01, 9.8364e-01, 2.0293e-01, ..., 6.5445e-01,
6.7723e-01, 5.8113e-01],
...,
[1.2855e-02, 1.1698e-01, 8.5757e-01, ..., 5.4866e-01,
9.8738e-02, 1.3790e-01],
[6.4180e-01, 6.1685e-01, 2.1597e-01, ..., 7.9301e-01,
5.3615e-02, 4.6349e-01],
[9.5938e-01, 3.4085e-01, 7.5045e-01, ..., 6.0918e-01,
3.4381e-01, 9.9086e-01]],
[[7.3205e-01, 3.4430e-01, 3.3164e-01, ..., 3.9198e-01,
9.6498e-01, 4.2222e-01],
[5.2616e-01, 2.1094e-01, 2.3668e-01, ..., 4.5279e-01,
3.6291e-01, 4.9846e-03],
[4.7756e-01, 2.8577e-01, 4.2098e-01, ..., 6.7426e-01,
4.3094e-01, 5.0713e-01],
...,
[3.7610e-01, 8.9496e-01, 3.7469e-01, ..., 9.5254e-01,
9.7844e-01, 4.2803e-01],
[6.1275e-01, 8.8268e-01, 9.1424e-01, ..., 4.6052e-01,
8.6243e-01, 2.3756e-01],
[9.8269e-01, 4.5156e-01, 5.3287e-01, ..., 4.1434e-01,
1.0105e-01, 7.9767e-01]]],
[[[8.4436e-01, 7.6937e-02, 4.1650e-01, ..., 2.1915e-01,
8.2477e-01, 2.3747e-01],
[6.5073e-01, 3.3321e-01, 7.9865e-01, ..., 1.0843e-01,
9.6268e-01, 6.3799e-02],
[6.8057e-01, 9.2516e-01, 2.7110e-01, ..., 6.0440e-01,
2.7560e-01, 7.2933e-01],
...,
[4.0624e-01, 7.9069e-01, 1.5574e-02, ..., 4.0489e-03,
5.3646e-01, 1.7618e-01],
[3.7544e-01, 8.4574e-01, 6.3978e-01, ..., 4.6936e-01,
4.7461e-01, 9.1679e-01],
[9.1416e-01, 1.5174e-01, 5.8036e-01, ..., 4.3363e-01,
9.7987e-01, 9.8687e-01]],
[[5.4516e-01, 9.3953e-01, 8.5463e-01, ..., 7.4456e-01,
5.3869e-01, 3.5062e-02],
[8.8229e-01, 7.8182e-01, 9.6519e-01, ..., 3.4532e-01,
8.9800e-01, 7.8572e-01],
[7.3374e-01, 3.0004e-02, 4.1186e-01, ..., 5.7877e-03,
1.5765e-01, 4.3899e-01],
...,
[5.9853e-02, 5.3915e-01, 5.3213e-01, ..., 5.4150e-01,
3.5259e-03, 9.8172e-02],
[9.3411e-02, 3.8344e-01, 3.2259e-02, ..., 2.8350e-01,
3.9490e-01, 6.4623e-01],
[5.1944e-01, 2.0330e-01, 7.4576e-01, ..., 2.3336e-01,
5.2557e-01, 8.1395e-01]],
[[9.2581e-01, 3.4656e-01, 5.2352e-01, ..., 2.5496e-01,
2.6873e-01, 2.8491e-01],
[6.8023e-01, 8.4913e-01, 2.1274e-01, ..., 9.4000e-01,
2.3244e-01, 2.1041e-01],
[3.0403e-01, 2.8815e-01, 8.4456e-01, ..., 8.1843e-01,
2.7128e-01, 5.8056e-01],
...,
[1.1936e-01, 8.0072e-02, 3.9594e-01, ..., 1.6712e-01,
3.8739e-01, 9.4050e-02],
[5.2740e-01, 4.3877e-01, 7.2362e-01, ..., 7.4369e-01,
4.8778e-01, 7.7849e-01],
[8.9059e-02, 2.2841e-01, 1.6498e-01, ..., 8.4955e-01,
2.1776e-01, 3.2699e-01]]]])
In [40]: a.shape
Out[40]:torch.Size([2, 3, 28, 28])
Dimension为4的数据类型常见于图片,例如100张MNIST手写数据集的灰度图(通道数为1,如果是RGB图像通道数就是3),每张图高=28像素,宽=28像素,所以这个Tensor的shape=[100,1,28,28]([batch,channel,height,width])。
另外,可以通过.numel()方法获得张量的元素的数量。
In [41]: a = torch.rand(2,3,28,28)
In [42]: a.numel()
Out[42]: 4704