本篇文章为大家展示了如何实现PyTorch的基本数据类型、数据的获得和生成,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
10年积累的成都网站设计、成都做网站经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先做网站后付款的网站建设流程,更有昭平免费网站建设让你可以放心的选择与我们合作。
总的来说,除了String类型之外,Python中存在的数据类型,PyTorch中都有对应的数据类型。只不过PyTorch中的数据类型都是Tensor。
PyTorch中的变量是用Variable定义。例如想要定义一个FloatTensor的变量,我们可以这样:先定义一个常量tensor,然后用Variable类包装一下即可:
① w = Variable(torch.tensor([2.0, 3.0]), requires_grad = True)
这个w是一维的,称之为张量。张量可以是一维、二维或多维。如果w需要梯度下降优化,那就要梯度requires_grad = True。如果w不需要梯度下降优化,则设置requires_grad为False。
② b = Variable(torch.tensor(1.0), requires_grad = True)。这个b是0维的,称之为标量。
Variable变量除了有tensor的属性和方法之外,还有一些特殊的属性和方法:grad属性、zero_grad()方法等。
PyTorch的数据的获得
第一行是导入torch包,注意,名字是torch,而不是PyTorch。
第二行代码是引入numpy包,并使用np作为别名。以后代码中不再显示这两行代码。
PyTorch可以从Numpy获得数据,把Numpy的数据转化成PyTorch的数据的方式:torch.from_numpy()
PyTorch也可以自己生成数据。torch.empty()、torch.Tensor()、torch.IntTensor()这三种方法获得的是矩阵,矩阵中的数据是随机的,有可能非常大,也可能非常小。所以用这些方法获得的矩阵中的数据一定要重新进行初始化,而不能直接使用。
torch.tensor([2,3])是把已有的一个列表转化成一维张量,这个一维张量里面的数据是两个标量,分别是toensor(2)和toensor(3)。这两个标量中的数据都是整数类型。
b = torch.Tensor(2, 3)是生成一个2行3列的二维张量,PyTorch默认的数据类型是TensorFloat,所以得到的都是tensor(0.0),简写成tensor(0.)。
a = torch.rand(2,3)表示产生一个2行3列的二维张量,这个张量中的数据是[0, 1]之间的tensor标量,里面的数据分布是均匀分布的。
而torch.rand_like(a)表示产生与张量a相同形状的张量,里面的数据也是[0, 1]之间的tensor标量。
torch.randint(1,10, [5])的意思是产生5个元素的一维张量,里面的数据是[1, 10)之间的整数。如果把第三个参数换成[5, 2],那就可以得到5行2列的二维张量。
与torch.rand([2, 3])得到均匀分布的数据不同,torch.randn([2, 3])生成2行3列的二维张量,里面的数据是均值为0,方差为1的正态分布的。函数名randn()中的n是normal,也就是正态的意思。(正态分布:Normal distribution)。
torch.full([2,3], 7)的意思是生成2行3列的二维张量,里面的数据是都是7。张量和一个普通数据的相乘(加、减、除)得到的结果是张量中的每个元素都与这个普通数据相乘(加、减、除)。torch.ones([2, 3])的意思是生成2行3列的二维张量,里面的数据是都是1。所以torch.full([2,3], 7)也可以用torch.ones([2, 3]) + 6或torch.ones([2, 3]) * 7代替。
如果torch.full([], 9)第一个参数是一个空数组,这样得到的就是一个标量9。与torch.tensor(9)一样。
torch.linspace(0, 10, steps = 4)的意思是把0~10分为3等分。
torch.logspace(0, 1, steps = 10)的意思是把0~1分为9等分,然后分别计算10^X,得到如下序列。
torch.zeros([2,3])的意思是生成2行3列的二维张量,里面的数据是都是0。
torch.ones([2,3])在前面已经介绍过了,是2行3列的二维张量,里面的数据是都是1。
torch.eye(3,4)生成的是对角线矩阵,对角线上的数据都是1,其余都是0。如果两个参数相等就生成正方形的矩阵,这时可以只写一个参数。
torch.full([2,3], 9)在前面已经介绍过了,是2行3列的二维张量,里面的数据是都是9。它可以用torch.ones([2,3])代替。
产生随机打乱的一个序列。troch.randperm()函数非常有用。一般情况下,我们的数据集中的数据都是有序的,在训练和检测的时候,我们都需要一些随机的次序的数据,这时就可以用troch.randperm()产生随机的整数,用这些整数作为数据集中的数据的index进行取样即可得到随机的数据。
torch中也有与Python一样的range()函数,但是torch产生的是张量。为了避免混淆,PyTorch建议使用arange()函数。类似的,numpy中也有arange()函数。
torch与Python一样支持切片功能,且语法几乎一致。
reshape()函数是tensor自带的函数。它可以改变tensor的维度和尺寸。例如把[4, 1, 28, 28]的四维数据转化成1~4维,只需要保证转变之后的数据的维度的乘积与转变之前相等。
卷积操作需要的是二维数据,而卷积层后的全连接层需要一维数据。用reshape()函数处理之后就可以把n张图片的二维数据转成一维数据。当然,有些预处理的图片是一维数据,也可以用这个函数处理成二维数据,然后进行卷积操作。
a.unsqueeze()就是在指定的位置插入一个维度,里面的参数是插入的维度的位置。这里的参数与Python的切片用的参数完全一致。
与a.unsqueeze()相反,a.squeeze()是压缩指定位置的维度。如果不指定参数,则压缩所有能压缩的维度。所有一维的维度都是可以压缩的。
b.expand()是维度扩展,注意这是维度扩展,而不是维度增加。这里a是4维的,b必须也是4维的才能进行扩展。里面的参数也是跟Python的切片一样。最后还有一个b.expand_as(a),就是把b扩展成a一样的尺寸。
a.repeat()是把a的每个维度重复多少次。这里需要指定每一个维度的重复次数。
在数学上,二维矩阵使用a.T表示转置,在PyTorch中使用a.t()表示。但转置仅限于二维矩阵。
a.transpose(1, 3)表示交换两个维度的数据。当交换数据与矩阵变形联用时一定要当心数据被污染。
permute():手动指定各个维度的数据的存放位置,这个方法比transpose()更灵活。
矩阵也可以像字符串一样分割,使用的也是split()。很是好奇,PyTorch怕range()函数与Python中的range()函数混淆,但却不怕split()函数与Python中的split()函数混淆。
上述内容就是如何实现PyTorch的基本数据类型、数据的获得和生成,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注创新互联行业资讯频道。