PyTorch的数据类型

python和pytorch中的类型对比:
我们可以发现pytorch中每中类型后面都有一个Tensor。
image
但是很遗憾PyTorch没有String类型。
我们在做NLP的时候会遇到String类型处理的问题,我们会将string转化问数值:

  • one-hot

[0,1,0,0,....]

  • Embedding

word2vec
glove

1 Data type

我们需要注意的是CPU版和GPU版的不一样
image

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

image
这里我们需要注意一下CUP中的tensor和GPU中的不一样。

isinstance(a,torch.cuda.FloatTensor)
# 这里返回 False

a=a.cuda()
#转化成GPU中的tensor

isinstance(a,torch.cuda.FloatTensor)
# 返回True

image

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([])

image

3.2 Dim 1

Dim 1的时候相对于一个列表
可以使用列表的形式定义

torch.tensor([1.1])
# tensor([1.1000])

torch.tensor([1.1,2.2])
# tensor([1.1000, 2.2000])

image

也可以使用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])

image

也可以通过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)

image

或者我们也可以使用

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。
image

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)

image
也可以通过

torch.ones(2,3)
torch.zeros(2,3)

生成全0或者全1的数组
image

这里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])

image
然后我们查看第一个(2,3)的二维矩阵b[0]
image
这个三维的数组主要用于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

posted @ 2023-07-29 22:40  lipu123  阅读(38)  评论(0编辑  收藏  举报