学习目标
- 学习CNN基础和原理
- 使用Pytorch框架构建CNN模型
CNN
卷积神经网络由一个或多个卷积层和顶端的全连通层(对应经典的神经网络)组成,同时也包括关联权重和池化层(pooling layer)。这一结构使得卷积神经网络能够利用输入数据的二维结构。与其他深度学习结构相比,卷积神经网络在图像和语音识别方面能够给出更好的结果。
-
卷积层
在输入图像上滑动不同卷积内核并进行运算 -
线性整流层
它可以增强判定函数和整个神经网络的非线性特性,而本身并不会改变卷积层。
常用线性整流 f ( x ) = m a x ( 0 , x ) f(x)=max(0,x) f(x)=max(0,x)为激励函数,双曲正切和Sigmoid函数也可以用于增强网络的非线性。 -
池化层
一种非线性形式的降采样。
有多种不同形式的非线性池化函数,而其中“最大池化(Max pooling)”是最为常见的。它是将输入的图像划分为若干个矩形区域,对每个子区域输出最大值。
池化层每次在一个池化窗口(depth slice)上计算输出,然后根据步幅移动池化窗口。
除了最大池化之外,池化层也可以使用其他池化函数,例如“平均池化”甚至“L2-范数池化”等。 -
完全连接层
在经过几个卷积和最大池化层之后,神经网络中的高级推理通过完全连接层来完成。就和常规的非卷积人工神经网络中一样,完全连接层中的神经元与前一层中的所有激活都有联系。因此,它们的激活可以作为仿射变换来计算,也就是先乘以一个矩阵然后加上一个偏差(bias)偏移量(向量加上一个固定的或者学习来的偏差量)。 -
损失函数层
Softmax
Sigmoid
CNN发展
典型模型:
LeNet-5
AlexNet
VGG-16
Inception-v1
ResNet-50
Pytorch构建CNN模型
import torch
torch.manual_seed(0)
torch.backends.cudnn.deterministic = False
torch.backends.cudnn.benchmark = True
import torchvision.models as models
import torchvision.transforms as transforms
import torchvision.datasets as datasets
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torch.autograd import Variable
from torch.utils.data.dataset import Dataset
class SVHN_Model1(nn.Module):
def __init__(self):
super(SVHN_Model1, self).__init__()
self.cnn = nn.Sequential(
nn.Conv2d(3, 16, kernel_size=(3, 3), stride=(2, 2)),
nn.ReLU(),
nn.MaxPool2d(2),
nn.Conv2d(16, 32, kernel_size=(3, 3), stride=(2, 2)),
nn.ReLU(),
nn.MaxPool2d(2),
)
self.fc1 = nn.Linear(32 * 3 * 7, 11)
self.fc2 = nn.Linear(32 * 3 * 7, 11)
self.fc3 = nn.Linear(32 * 3 * 7, 11)
self.fc4 = nn.Linear(32 * 3 * 7, 11)
self.fc5 = nn.Linear(32 * 3 * 7, 11)
self.fc6 = nn.Linear(32 * 3 * 7, 11)
def forward(self, img):
feat = self.cnn(img)
# print(feat.shape)
feat = feat.view(feat.shape[0], -1)
c1 = self.fc1(feat)
c2 = self.fc2(feat)
c3 = self.fc3(feat)
c4 = self.fc4(feat)
c5 = self.fc5(feat)
#c6 = self.fc6(feat)
return c1, c2, c3, c4, c5#, c6
model = SVHN_Model1()