pytorch作为一款经典的深度学习工具,几乎统治了科研/学生党在深度学习工具领域的全部江山。
从本篇博客开始,我将会陆续更新一些关于pytorch的基础用法和实战操作。
Tensor又名为张量,简单来说Tensor就是一个多维数组。而Tensor提出的目的是能够创造更高维度的矩阵、向量。可以理解为:tensor就是pytorch中表示矩阵的一种数据形式,就像在numpy中创建的矩阵的数据格式是ndarray。
pytroch中所有的操作都是基于Tensor的,因此理解Tensor的含义并能够自由的创建tensor是十分必要的。
相较于直接创建Tensor类型的矩阵,我们更了解的是在numpy等包上创建矩阵。为了更好的理解Tensor中的矩阵,就先介绍如何将现有的numpy矩阵转化成Tensor中的矩阵。上文说过tensor就是pytorch中的一种矩阵形式,因此pytorch中集成了将numpy创建的矩阵数据转化成Tensor的方法:
torch.from_numpy()
import torch
import numpy as np
a = np.array([3.0, 4.0, 5.0])
b = torch.from_numpy(a)
print(b)
"""
输出结果:
tensor([3., 4., 5.], dtype=torch.float64)
"""
方法:
直接输入并创建:
torch.tensor()
输入数据并指定数据的类型(int/float/double):
torch.IntTensor()
torch.FloatTensor()
torch.DoubleTensor(
)
使用方法和numpy.array()类似
##########################################
#1、直接输入数据创建
a = torch.tensor([[3, 4, 5],
[6, 7, 8]])
print(a)
print(a.type()) #数据类型
'''
输出结果:
tensor([[3, 4, 5],
[6, 7, 8]])
torch.LongTensor
'''
#########################################
#2、输入数据并指定数据类型创建
b = torch.FloatTensor([[3, 4, 5],
[6, 7, 8]])
print(b)
print(b.type())
'''
输出结果:
tensor([[3., 4., 5.],
[6., 7., 8.]])
torch.FloatTensor
'''
在一些实际应用中,可能会遇到一些使用蒙板Tensor的情况,例如:全0矩阵,全1矩阵。这中tensor的创建方法为:
torch.full()
:接收参数为shape,x,输出一个shape大小的元素全为x的tensor###################################################
#torch.full()方法创建
a = torch.full((2,3),1)
print(a)
print(a.type())
"""
输出结果:
tensor([[1, 1, 1],
[1, 1, 1]])
torch.LongTensor
"""
有些时候,可能会使用到一些连续的数据,类似等差序列等。这时可以使用:
注:.arrange()方法和.range()方法的区别在于:.range()方法可以输出结果包含区间右侧b这个数值,且.range()方法的数据类型为float。
###################################################
#torch.arange()方法创建
a = torch.arange(0,10,2)
print(a)
print(a.type())
"""
输出结果:
tensor([0, 2, 4, 6, 8])
torch.LongTensor
"""
###################################################
#torch.range()方法创建
b = torch.range(0,10,2)
print(b)
print(b.type())
"""
输出结果:
tensor([ 0., 2., 4., 6., 8., 10.])
torch.FloatTensor
"""
在数学计算中会经常使用到全0矩阵、全1矩阵、单位矩阵。其创建方法如下:
torch.zeros()
:接收参数为shape,输出一个shape大小的全0 Tensortorch.ones()
:接收参数为shape,输出一个shape大小的全1 Tensortorch.eye()
:接收参数为shape,输出一个shape大小的单位矩阵Tensor注:关于全0和全1矩阵2.3中介绍的torch.full方法也可以实现,在实际中要活学活用。
###################################################
# torch.zeros()方法创建
a = torch.zeros(3,3)
print(a)
print(a.type())
"""
输出结果:
tensor([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
torch.FloatTensor
"""
###################################################
#torch.ones()方法创建
b = torch.ones(3,3)
print(b)
print(b.type())
"""
tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
torch.FloatTensor
"""
###################################################
#torch.eye()方法创建
c = torch.eye(3,3)
print(c)
print(c.type())
"""
输出结果:
tensor([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
torch.FloatTensor
"""
方法:
torch.rand()
:输入参数为一个shape,创建指定形状大小的tensor,数据为Float类型的随机数torch.randint()
:指定数据范围为的随机tensor创建。输入参数为一个a,b,(x,y,…),创建(x,y,…)大小的tensor,数据的范围为[a,b)torch.rand_like()
:输入参数为一个Float类型的tensor,创建一个与输入tensor数据同大小的矩阵,数据为与原始tensor相同类型的随机数(Float)################################################
#torch.randint()方法创建
b = torch.randint(1,10,(2,3))
print(b)
print(b.type())
"""
输出结果:
tensor([[9, 3, 6],
[4, 1, 1]])
torch.LongTensor
"""
################################################
#torch.rand_like()方法创建
c = torch.rand_like(a)
print(c)
print(c.type())
"""
输出结果:
tensor([[0.2113, 0.4152, 0.4709],
[0.1211, 0.2513, 0.3255]])
torch.FloatTensor
"""
在代码实战中,考虑到网络的学习特性,很多tensor并不会随意的对变量进行初始化,满足正太分布的随机初始化因为其良好的数据分布在随机数据创建中更为常用。这里也建议大家在搭建神经网络初始化变量时(尤其时涉及到需要学习的变量),不要随意使用那些数据范围和分布规律杂乱无知的初始化方法,这会给网络后期的学习造成很大问题。
方法:
torch.randn()
:接受参数为shape,输出一个数据满足标准正太分布(0,1)的tensortorch.normal()
:接受参数为:m,s,shape,分别为所创建数据的均值,标准差和形状,输出一个满足上述参数的广义的正太分布tensor###################################################
#torch.randn()方法创建
a = torch.randn(2,3)
print(a)
print(a.type())
"""
输出结果:
tensor([[ 1.3057, -0.6226, -0.1231],
[ 0.0392, -1.6814, 0.4482]])
torch.FloatTensor
"""
###################################################
#torch.normal()方法创建
b = torch.normal(1,10,(2,3))
print(b)
print(b.type())
"""
输出结果:
tensor([[20.1989, 0.9083, -7.3761],
[-5.6195, 6.6749, 2.7636]])
torch.FloatTensor
"""
Tensor是pytorch的基本数据单位,掌握其创建方法是pytorch的学习基础。在理解上不要被它看似高大上的解释所阻碍,就把它想象成numpy的矩阵。而且在实际的Tensor创建中,很多方法都和numpy是相通的。如果在Tensor中遇到问题,多想想这件事在numpy中该如何处理,然后把处理思路移植到pytorch上基本就能解决这一问题。记住:在编程中语法是次要的,排在第一位的永远是思想。