Author:baiyucraft
BLog: baiyucraft’s Home
原文:《动手学深度学习》
首先,我们得知道什么是深度学习:
深度学习是一种特殊的机器学习,通过学习将世界使用嵌套的概念层次来表示并实现巨大的功能和灵活性,其中每个概念都定义为与简单概念相关联,而更为抽象的表示则以较不抽象的方式来计算。
其实目前来说我也不太清楚机器学习和深度学习具体的概念,所以这块留白,日后补充。
在深度学习中,这里我们选择PyTorch作为机器学习库,PyTorch是一个开源的深度学习框架。我们知道,计算机做的主要步骤,是对数据的处理,为了完成各种操作,我们需要某种方法来存储和操作数据。所以在PyTorch中,用张量tensor
来存储数据,并且PyTorch中的张量支持使用GPU加速运算,并且支持自动微分。
因为对于大部分人来说,GPU的价格太过昂贵,所以在学习过程中有个折中方法,利用Google 的 Colab就能有免费的GPU使用,还不用装环境,具体操作可以百度。
首先,在运用PyTorch前,肯定要包,需要注意的是,导入的包名叫torch
而不是pytorch
import torch
张量tensor
的表现看来可以认为是n维的数组,也就是说这个数组是具有维度的。一维的就对应数学上的向量vector
,二维的对应数学上的矩阵matrix
。
在默认情况下,张量tensor
中的元素都是浮点数,且存储在内存中,基于CPU计算的。
arrange(): 用arrange(n)
来创建一个行向量,其作用类似于Python自带的range(n)
;
shape: 通过tensor
的shape
属性来访问它的形状;
numel(): 用numel()
函数可以查看tensor
中所有元素的总数,即形状的所有元素的乘积;
reshape(): 要改变一个tensor
的形状而不改变元素总数和元素值,可以调用reshape()
函数实现,在给出其他部分后可以自动计算出一个维度。我们可以通过将希望tensor
自动推断的维度放置 -1
来调用此功能。我们可以用 reshape(-1, 4)
或 reshape(3, -1)
来取代reshape(3, 4)
;
zero(): 用zero()
函数可以创建一个全为0的tensor
;
ones(): 用ones()
函数可以创建一个全为1的tensor
;
randn(): 用randn()
函数可以创建一个全随机初始化参数的tensor
,每个元素都从均值为0、标准差为1的标准正态分布中随机采样;
tensor(): 用tensor()
函数可以直接从嵌套列表生成tensor
代码:
# x1
print("======x1======")
x1 = torch.arange(12)
print("x1为:", x1)
print("x1的形状为:", x1.shape)
print("x1的形状为:", x1.size())
print("x1的元素总数为:", x1.numel())
# x2
print("======x2======")
x2 = x1.reshape(3, 4)
print("x2为:", x2)
print("x2的形状为:", x2.shape)
print("x2的元素总数为:", x2.numel())
# x3
print("======x3======")
x3 = torch.zeros((2, 3, 4))
print("x3为:", x3)
# x4
print("======x4======")
x4 = torch.ones((2, 3, 4))
print("x4为:", x4)
# x5
print("======x5======")
x5 = torch.randn(3, 4)
print("x5为:", x5)
# x6
print("======x6======")
x6 = torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
print("x6为:", x6)# x1
x1 = torch.arange(12)
print("x1为:", x1)
print("x1的形状为:", x1.shape)
print("x1的形状为:", x1.size())
print("x1的元素总数为:", x1.numel())
# x2
x2 = x1.reshape(3, 4)
print("x2为:", x2)
print("x2的形状为:", x2.shape)
print("x2的元素总数为:", x2.numel())
# x3
x3 = torch.zeros((2, 3, 4))
print("x3为:", x3)
# x4
x4 = torch.ones((2, 3, 4))
print("x4为:", x4)
# x5
x5 = torch.randn(3, 4)
print("x5为:", x5)
# x6
x6 = torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
print("x6为:", x6)
运行结果:
这里首先介绍最直观的运算,就是按元素运算:
代码:
x = torch.tensor([1.0, 2, 4, 8])
y = torch.tensor([2, 2, 2, 2])
print("x为:", x)
print("y为:", y)
print("x + y:", x + y)
print("x - y:", x - y)
print("x * y:", x * y)
print("x / y:", x / y)
print("x ** y:", x**y)
print("e ** x:", torch.exp(x))
运行结果:
除了按元素计算外,我们还可以执行线性代数运算,包括向量点积和矩阵乘法。这个内容后文会讲到,其他的一些:
我们也可以把多个张量用cat()
函数连结在一起,可以指定维度dim
连结;
我们同样可以对两个tensor
使用逻辑运算符,如==
;
用sum()
可以获取tensor
中所有元素和;
代码:
X = torch.arange(12, dtype=torch.float32).reshape((3, 4))
Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
print("X为:", X)
print("Y为:", Y)
print("按行连结为:", torch.cat((X, Y), dim=0))
print("按列连结为:", torch.cat((X, Y), dim=1))
print("X == Y:", X == Y)
print("X中的元素和:", X.sum())
运行结果:
在某些情况下,即使形状不同,我们仍然可以通过调用广播机制来执行按元素操作:
代码:
a = torch.arange(3).reshape((3, 1))
b = torch.arange(2).reshape((1, 2))
print("\a为:", a)
print("b为:", b)
print("a + b:", a + b)
运行结果: