Pytorch基础语法学习(一)
因为之前的研究主要是机器学习,所以很少用到tensor张量,最近的一些研究课题都是基于深度学习为基础的,不得不逼自己学习一下深度学习的框架。最早接触深度学习时使用的框架是tensorflow,通过交流学习发现很多的课题组已经转向pytorch的框架,想了想自己的基础,本身tensorflow框架也一样不熟悉,那就直接入手pytorch吧。tensorflow的框架不完美但最流行,社区强大,适合生产环境。而pytorch具有简洁、速度、易用、活跃的社区。接下来我就写一下自己学习的基础语法,也是为自己做个记录,方便后期写代码时忘记的语法有一个比较好的查阅资料。
1. 创建tensor
之前使用的数据结构类型比较多的是list,array,因此,如果我们获取到list,array类型的数据如何转换成tensor呢?这就是我们首先需要解决的问题:
array转tensor:核心在于torch.from_numpy
import torch
import numpy as np
a = np.array([2, 3, 4])
print('a = ', a) # a = [2 3 4]
print(type(a)) # <class 'numpy.ndarray'>
a1 = torch.from_numpy(a)
print('a1 = ', a1) # a1 = tensor([2, 3, 4])
print(type(a1)) # <class 'torch.Tensor'>
b = np.ones([2, 3]) # 生成2行3列的数组且元素均为1
print('b = ', b) # b = [[1. 1. 1.]
# [1. 1. 1.]]
print(type(b)) # <class 'numpy.ndarray'>
b1 = torch.from_numpy(b)
print('b1 = ', b1) # b1 = tensor([[1., 1., 1.],
# [1., 1., 1.]], dtype=torch.float64)
print(type(b1)) # <class 'torch.Tensor'>
list转tensor:一般情况下建议使用torch.FloatTensor
a = [1,2,3]
print('a = ', a) # a = [1, 2, 3]
print(type(a)) # <class 'list'>
a1 = torch.tensor(a)
print('a1 = ', a1) # a1 = tensor([1, 2, 3])
print(type(a1)) # <class 'torch.Tensor'>
a2 = torch.FloatTensor(a)
print('a2 = ', a2) # a2 = tensor([1., 2., 3.])
print(type(a2)) # <class 'torch.Tensor'>
初始化一个tensor:一般情况下建议使用torch.FloatTensor
a = torch.FloatTensor(3,2)
print('a = ', a) # a = tensor([[ 0.0000e+00, 0.0000e+00],
#[ 0.0000e+00, 0.0000e+00],
#[-3.9671e+06, 3.0702e-41]])
print(a.shape) # torch.Size([3, 2])
tensor随机选取
a = torch.FloatTensor(2,3,4)
b = torch.randperm(1) # 随机输出,相当于random.shuffle
c = a[b]
print('a = ', a) # a = tensor([[[ 2.0465e-27, 4.5850e-41, 0.0000e+00, 0.0000e+00],
#[ 1.4013e-45, 0.0000e+00, 0.0000e+00, 0.0000e+00],
#[ 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00]],
# [[-7.8764e+26, 3.0810e-41, 0.0000e+00, 0.0000e+00],
# [ 1.4013e-45, 0.0000e+00, 1.5414e-44, 0.0000e+00],
# [ 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00]]])
print('b = ', b) # tensor([0])
print('c = ', c) # c = tensor([[[ 2.0465e-27, 4.5850e-41, 0.0000e+00, 0.0000e+00],
# [ 1.4013e-45, 0.0000e+00, 0.0000e+00, 0.0000e+00],
# [ 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00]]])
tensor其他常用操作
a = torch.arange(0,10)
print('a = ', a) # a = tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
b = torch.arange(0,10,2)
print('b = ', b) # b = tensor([0, 2, 4, 6, 8])
a = torch.linspace(0,10,steps=4) #在0到10直接等距离取4个数
print('a = ', a) # a = tensor([ 0.0000, 3.3333, 6.6667, 10.0000])
a1 = torch.linspace(0,10,steps=10)
print('a1 = ', a1) # a1 = tensor([ 0.0000, 1.1111, 2.2222, 3.3333, 4.4444, 5.5556, 6.6667, 7.7778, 8.8889, 10.0000])
a2 = torch.linspace(0,10,steps=11)
print('a2 = ', a2) # a2 = tensor([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.])
2. tensor的索引与切片
tensor索引
a = torch.FloatTensor(2,3,4)
print('a = ', a) #a = tensor([[[ 1.4013e-45, 0.0000e+00, 0.0000e+00, 0.0000e+00],
# [ 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00],
# [-1.2391e-11, 3.0756e-41, 0.0000e+00, 0.0000e+00]],
# [[ 1.4013e-45, 0.0000e+00, 1.6816e-44, 0.0000e+00],
# [ 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00],
# [ 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00]]])
print(a.shape) # torch.Size([2, 3, 4])
print(a[0].shape) # torch.Size([3, 4])
print(a[0,0].shape) # torch.Size([4])
print(a[0,0,0]) # tensor(1.4013e-45)
tensor切片1
a = torch.FloatTensor(2,3,4)
print('a = ', a) #a = tensor([[[ 1.4013e-45, 0.0000e+00, 0.0000e+00, 0.0000e+00],
# [ 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00],
# [-1.2391e-11, 3.0756e-41, 0.0000e+00, 0.0000e+00]],
# [[ 1.4013e-45, 0.0000e+00, 1.6816e-44, 0.0000e+00],
# [ 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00],
# [ 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00]]])
print(a.shape) # torch.Size([2, 3, 4])
print(a[:1]) # tensor([[[ 1.4013e-45, 0.0000e+00, 0.0000e+00, 0.0000e+00],
# [ 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00],
# [-1.2391e-11, 3.0756e-41, 0.0000e+00, 0.0000e+00]]])
print(a[:1].shape) # torch.Size([1, 3, 4])
print(a[:1,:1,:]) # tensor([[[1.4013e-45, 0.0000e+00, 0.0000e+00, 0.0000e+00]]])
print(a[:1,:1,:].shape) #torch.Size([1, 1, 4])
print(a[:1,:1,:4:2]) # tensor([[[1.4013e-45, 0.0000e+00]]])
print(a[:1,:1,:4:2].shape) # torch.Size([1, 1, 2])
tensor切片2
a = torch.FloatTensor(2,3,4)
print('a = ', a) #a = tensor([[[ 1.4013e-45, 0.0000e+00, 0.0000e+00, 0.0000e+00],
# [ 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00],
# [-1.2391e-11, 3.0756e-41, 0.0000e+00, 0.0000e+00]],
# [[ 1.4013e-45, 0.0000e+00, 1.6816e-44, 0.0000e+00],
# [ 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00],
# [ 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00]]])
print(a.shape) # torch.Size([2, 3, 4])
print(a.index_select(0, torch.arange(1))) # tensor([[[ 1.4013e-45, 0.0000e+00, 0.0000e+00, 0.0000e+00],
# [ 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00],
# [-1.2391e-11, 3.0756e-41, 0.0000e+00, 0.0000e+00]]])
print(a.index_select(0, torch.arange(1)).shape) # torch.Size([1, 3, 4])
print(a.index_select(1, torch.arange(2))) # tensor([[[1.4013e-45, 0.0000e+00, 0.0000e+00, 0.0000e+00],
# [0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00]],
# [[1.4013e-45, 0.0000e+00, 1.6816e-44, 0.0000e+00],
# [0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00]]])
print(a.index_select(1, torch.arange(2)).shape) # torch.Size([2, 2, 4])
print(a.index_select(2, torch.arange(3))) # tensor([[[ 1.4013e-45, 0.0000e+00, 0.0000e+00],
# [ 0.0000e+00, 0.0000e+00, 0.0000e+00],
# [-1.2391e-11, 3.0756e-41, 0.0000e+00]],
# [[ 1.4013e-45, 0.0000e+00, 1.6816e-44],
# [ 0.0000e+00, 0.0000e+00, 0.0000e+00],
# [ 0.0000e+00, 0.0000e+00, 0.0000e+00]]])
print(a.index_select(2, torch.arange(3)).shape) # torch.Size([2, 3, 3])
tensor类型转换
t1 = torch.LongTensor(3, 5)
print(t1.type()) # torch.LongTensor
# 转换为其他类型
t2=t1.type(torch.FloatTensor)
print(t2.type()) # torch.FloatTensor
在下一个学习中主要练习一下tensor的维度变换,这在深度学习图像领域是经常使用到的操作,所以也是必须掌握的技能。