1.全连接网络问题
链接权过多,算的慢,难收敛,同时可能进入局部极小值,也容易产生过拟合问题
解决算的慢问题:减少权值连接,每一个节点只连到上一层的少数神经元,即局部连接网络。信息分层处理,每一层在上层提取特征的基础上获取进行再处理,得到更高级别的特征。
2.卷积神经网络基础
卷积核:
可以看作对某个局部的加权求和;它是对应局部感知,它的原理是在观察某个物体时我们既不能观察每个像素也不能一次观察整体,而是先从局部开始认识,这就对应了卷积。
一些概念:
填充(Padding):也就是在矩阵的边界上填充一些值,以增加矩阵的大小,通常用0或者复制边界像素来进行填充
步长(Stride):卷积核每次移动的距离,单位为一个像素点。
多通道卷积:如RGB,相当于给卷积核赋予高度。
池化(Pooling):使用局部统计特征,如均值或最大值。用于解决特征过多问题
卷积神经网络的结构:
3.LeNet-5网络
网络结构
与现在网络的区别:
4.AlexNet
网络结构
改进之处:
5.实战--CIFAR10数据集
如下图所示,搭建神经网络
一步步搭建
import torch
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential
from torch.utils.tensorboard import SummaryWriter
class Zz(nn.Module):
def __init__(self):
super(Zz, self).__init__()
self.conv1 = Conv2d(3, 32, 5, padding=2)
self.maxpool1 = MaxPool2d(2)
self.conv2 = Conv2d(32, 32, 5, padding=2)
self.maxpool2 = MaxPool2d(2)
self.conv3 = Conv2d(32, 64, 5, padding=2)
self.maxpool3 = MaxPool2d(2)
self.flatten = Flatten()
self.linear1 = Linear(1024, 64)
self.linear2 = Linear(64, 10)
)
def forward(self,x):
x = self.conv1(x)
x = self.maxpool1(x)
x = self.conv2(x)
x = self.maxpool2(x)
x = self.conv3(x)
x = self.maxpool3(x)
x = self.flatten(x)
x = self.linear1(x)
x = self.linear2(x)
return x
zz = Zz()
print(zz)
input = torch.ones((64, 3, 32, 32))
output = zz(input)
print(output.shape)
writer = SummaryWriter("./logs_sqe")
writer.add_graph(zz, input)
writer.close()
也可以用Sequential简化代码:
class Zz(nn.Module):
def __init__(self):
super(Zz, self).__init__()
self.model1 = Sequential(
Conv2d(3, 32, 5, padding=2),
MaxPool2d(2),
Conv2d(32, 32, 5, padding=2),
MaxPool2d(2),
Conv2d(32, 64, 5, padding=2),
MaxPool2d(2),
Flatten(),
Linear(1024, 64),
Linear(64, 10)
)
def forward(self,x):
x = self.model1(x)
return x