深度学习平台介绍
总览
pytorch
张量:是一个物理量,对高维(维数 ≥ 2) 的物理量进行“量纲分析” 的一种工具。简单的可以理解为:一维数组称为矢量,二维数组为二阶张量,三维数组为三阶张量
计算图:用“结点”(nodes)和“线”(edges)的有向图来描述数学计算的图像。“节点” 一般用来表示施加的数学操作,但也可以表示数据输入的起点/输出的终点,或者是读取/写入持久变量的终点。“线”表示“节点”之间的输入/输出关系。这些数据“线”可以输运“size可动态调整”的多维数据数组,即
“张量”(tensor)
pytorch使用 tensor 表示数据,使用 Dataset、DataLoader 读取样本数据和标签;使用变量 (Variable) 存储神经网络权值等参数;使用计算图 (computational graph) 来表示计算任务;在代码运行过程中同时执行计算图。
pytorch线性回归基本例程:
import torch.nn as nn
#定义网络
class LinearRegression(nn.Module):
def __init__(self):
super(LinearRegression, self).__init__()
self.linear = nn.Linear(1, 1) # 输入和输出的维度都是1
def forward(self, x):
out = self.linear(x)
return out
#进行训练:
model = LinearRegression()
params = list(model.named_parameters())
(_, w) = params[0]
(_, b) = params[1]
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.3)
x = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1)
y = 2*x + 10 + torch.rand(x.size())
for epoch in range(20):
inputs = x
target = y
out = model(inputs) # 向前传播
loss = criterion(out, target) # 向后传播
optimizer.zero_grad() # 注意每次迭代都需要清零
loss.backward()
optimizer.step()
print('Epoch: {}, w: {:.4f},b:{:.4f}'.format(epoch + 1, float(w.data),float(b.data)))
model.eval()
卷积神经网络基础
基本概念
填充(Padding):也就是在矩阵的边界上填充一些值,以增加矩阵的大小,通常用0或者复制边界像素来进行填充。
步长(Stride):卷积核在矩阵上移动的步长
多通道卷积:以RGB为例,如下图:
池化(pooling):使用局部统计特征,如均值或最大值。解
决特征过多问题
卷积神经网络结构
构成:由多个卷积层和下采样层构成,后面可连接全连接网络
卷积层:k个滤波器
下采样层:采用mean或max
后面:连着全连接网络
前向传播定义为:
如果第l层为卷积+池化层,则:
LeNet-5
网络结构
C1层:
6个feature map,每个神经元对输入进行5x5卷积,每个神经元对应(5x5+1)个参数,共6个feature map,28*28个神经元,共有(5x5+1)x6x(28x28)个连接
S2层:
池化层
C3层:
16个feature map,每个神经元对输入进行三维卷积核卷积,某个feature map上的神经元并没有用到S2层每一个feature map的数据,对于单个C3层feature map它使用的S2层的哪些feature map是固定的,设计出来的关系如下:
S4层:
120个神经元, 每个神经元同样对输入进行5x5卷积,与S4全连接,总连接数(5x5x16+1)x120=48120
C5层:
120个神经元,与S4层全连接
F6层:
84个神经元,与C5全连接,总连接数(120+1)x84=10164
输出层:
由欧式径向基函数单元构成,每类一个单元,输出RBF单元计算输入向量和参数向量之间的欧式距离
LeNet与现在网络的区别:卷积时不进行填充(padding),池化层选用平均池化而非最大池化,选用Sigmoid或tanh而非ReLU作为非线性环节激活函数,层数较浅,参数数量小(约为6万)
网络形状概览:
误差反向传播
卷积NN的BP算法
1.误差从下采样层回传到卷积层(假设为2x2核平均池化):
2.误差从卷积层回传到下采样层(假设为2x2核卷积):
LeNet5代码实现
import torch
from torch import nn
from d2l import torch as d2l
class Reshape(torch.nn.Module):
def forward(self, x):
return x.view(-1, 1, 28, 28)
net = torch.nn.Sequential(
Reshape(),
nn.Conv2d(1, 6, kernel_size=5, padding=2), nn.Sigmoid(),
nn.AvgPool2d(kernel_size=2, stride=2),
nn.Conv2d(6, 16, kernel_size=5), nn.Sigmoid(),
nn.AvgPool2d(kernel_size=2, stride=2),
nn.Flatten(),
nn.Linear(16 * 5 * 5, 120), nn.Sigmoid(),
nn.Linear(120, 84), nn.Sigmoid(),
nn.Linear(84, 10))