摘要
深度学习
环境搭建
实践环境:python3.7+PyTorch+Jupyter
将经常使用的类和函数等封装在d2l包中,d2l包是轻量级的,仅需要以下软件包和模块作为依赖
#@save
import collections
import hashlib
import math
import os
import random
import re
import shutil
import sys
import tarfile
import time
import zipfile
from collections import defaultdict
import pandas as pd
import requests
from IPython import display
from matplotlib import pyplot as plt
d2l = sys.modules[__name__]
对于要保存到d2l包中的任何代码块,如一个函数、一个类或者多个导入,都会标记为#@save
从PyTorch导入模块:
#@save
import numpy as np
import torch
import torchvision
from PIL import Image
from torch import nn
from torch.nn import functional as F
from torch.utils import data
from torchvision import transforms
如果想成功地应用深度学习,就必须学习如何抛出一个问题、建模的数学方法、将模型与数据拟合的算法、以及实现所有这些的工程技术。
预备知识
张量表示由一个数值组成的数组,这个数组可能有多个维度。具有一个维度的张量对应数学上的向量,具有两个维度的张量对应数学上的矩阵,具有两个轴以上的张量没有特殊的数学名称。在PyTorch这个深度学习框架中,它的张量类为Tensor,以后若无特殊说明,所说的张量均指的是张量类的实例。
Tensor张量类与科学计算包NumPy中的ndarray类似,比ndarray多两个重要功能:一,GPU加速矩阵运算,而NumPy仅支持CPU计算;二,Tensor张量类支持自动微分。
使用torch.arange(num)创建一个行向量,这个行向量包含从0开始的前num个整数,它们被默认创建为浮点数。张量中的每个值都称为张量的元素。
x = torch.arange(12)
print(x)
此张量x中有12个元素。
除非额外指定,否则新的张量将存储在内存中,并采用基于CPU的计算。
x.shape#通过张量的shape属性来访问张量的形状,即沿每个轴的长度
x.numel#检查张量中元素的总数,即形状的所有元素乘积
X = x.reshape(3,4)#改变一个张量的形状而不改变元素的数量和元素值,张量的大小不会改变
张量在给出其他部分后可自动计算出一个维度,调用时在希望张量自动推断的维度放置-1,因此x.reshape(-1,4), x.reshape(3,-1)和x.reshape(3,4)是等价的。
使用全0、全1、其他常量或者从特定分布中随机采样的数字来初始化矩阵:
torch.zeros((2,3,4))#所有元素设置为0
troch.ones((2,3,4))#所有元素设置为1
当我们构造数组来作为神经网络中的参数时,我们通常会随机初始化参数的值。以下代码创建的张量的每个元素都从均值为0、标准差为1的标准正态分布中随机采样。
torch.randn(3,4)
使用其他常量的情况,用到内置的列表类型对象[‘a’, 6, ‘c’, ‘d’],该对象可以包含不同类型的数据,也可以包含其他列表对象。通过提供包含数值的Python列表(或嵌套列表)来为所需张量中的每个元素赋予确定值。最外层的列表对应于轴0,内层的列表对应于轴1
torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
运行结果如图1所示
对于任意具有相同形状的张量,都可以调用按元素运算,还可以执行线性代数运算,包括向量点积与矩阵乘法。
**运算符是求幂运算。
连结(concatenate):将多个张量端对端地叠起来形成一个更大的张量。我们只需要提供张量列表,并给出沿哪个轴连结。
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]])
torch.cat((X, Y), dim=0), torch.cat((X, Y), dim=1) #合并
运行结果如图2所示
还可以通过逻辑运算符构建二元张量。以X == Y为例,对于每个位置,如果X和Y在该位置相等,则新张量中相应项的值为1,否则该位置为0。
X == Y
输出结果如图3所示
对张量中的所有元素求和会产生一个只有一个元素的张量。
X.sum()
广播机制(broadcasting mechanism):对形状不同的两个张量执行按元素操作。首先,通过适当复制元素来扩展一个或两个数组,以便在转换之后,两个张量具有相同的形状。其次,对生成的数组执行按元素操作。
#初始化两个张量
a = torch.arange(3).reshape((3, 1))
b = torch.arange(2).reshape((1, 2))
a, b
运行结果如图4所示
沿着数组中长度为1的轴进行广播,将两个矩阵广播为一个更大的3×2矩阵,矩阵a沿轴1方向广播、将列复制,矩阵b沿轴0方向广播、将行复制,然后再按元素相加。
a + b
运行结果如图5所示
克里金插值
- 公式 z ^ 0 = ∑ i = 1 n λ i z i \hat z_0 =\displaystyle\sum_{i=1}^n \lambda_iz_i z^0=i=1∑nλizi, z ^ 0 \hat z_0 z^0是点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)处的估计值,即 z ^ 0 = z ( x 0 , y 0 ) \hat z_0=z(x_0,y_0) z^0=z(x0,y0),理解为待估计点周围散布采样点,通过公式计算待估计点的各项指标。
- λ i \lambda_i λi是满足点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)处的估计值 z ^ 0 \hat z_0 z^0与真实值 z 0 z_0 z0的差最小的一套最优系数: min λ i V a r ( z ^ 0 − z 0 ) \min\limits_{\lambda_i}Var(\hat z_0-z_0) λiminVar(z^0−z0),同时满足无偏估计的条件 E ( z ^ 0 − z 0 ) = E ( ∑ i = 1 n λ i z i − z 0 ) = 0 E(\hat z_0-z_0)=E(\displaystyle\sum_{i=1}^n\lambda_iz_i-z_0)=0 E(z^0−z0)=E(i=1∑nλizi−z0)=0,再根据假设条件推出 ∑ i = 1 n λ i = 1 \displaystyle\sum_{i=1}^n\lambda_i=1 i=1∑nλi=1
- 假设条件(不同的克里金插值方法的主要差异就是假设条件不同):空间属性z是均一的,对于任一点(x,y),都有同样的期望c与方差 σ 2 \sigma^2 σ2,即对任意(x,y)都有 E [ z ( x , y ) ] = E [ z ] = c , V a r [ z ( x , y ) ] = σ 2 E[z(x,y)]=E[z]=c, Var[z(x,y)]=\sigma^2 E[z(x,y)]=E[z]=c,Var[z(x,y)]=σ2。总结该假设条件:对于任意(x,y)、区域平均值为c、该点的随机偏差为R(x,y),有 z ( x , y ) = E [ z ( x , y ) ] + R ( x , y ) = c + R ( x , y ) z(x,y)=E[z(x,y)]+R(x,y)=c+R(x,y) z(x,y)=E[z(x,y)]+R(x,y)=c+R(x,y),其中偏差的方差均为常数 σ 2 \sigma^2 σ2