今天我们来看看卷积神经网络(CNN)。
这是上文中我们做的识别手写数字的例子,下面我们看一个实例GoogLeNet:
我们可以发现其实一个复杂的识别系统就是把很多我们前面说过的一些构造连接起来,形成一个比较深的神经网络模型。但是我们可以发现在一个系统中存在很多相同的部分,比如上图中的Inception Module:
是这样的一个构造,我们可以发现一个11的卷积层,我们下面来看看:
其实就是将我们上文讲过的三个卷积做某种运算之后将其化为一个卷积。那么为什么我们要用这种11这种看似无用的卷积呢?
我们可以看到使用1*1的卷积可以减小我们的计算量,并且有着很显著的作用。
以下为相关代码:
class InceptionA(nn.Module): def __init__(self, in_channels): super(InceptionA, self).__init__() self.branch1x1 = nn.Conv2d(in_channels, 16, kernel_size=1) self.branch5x5_1 = nn.Conv2d(in_channels,16, kernel_size=1) self.branch5x5_2 = nn.Conv2d(16, 24, kernel_size=5, padding=2) self.branch3x3_1 = nn.Conv2d(in_channels, 16, kernel_size=1) self.branch3x3_2 = nn.Conv2d(16, 24, kernel_size=3, padding=1) self.branch3x3_3 = nn.Conv2d(24, 24, kernel_size=3, padding=1) self.branch_pool = nn.Conv2d(in_channels, 24, kernel_size=1) def forward(self, x): branch1x1 = self.branch1x1(x) branch5x5 = self.branch5x5_1(x) branch5x5 = self.branch5x5_2(branch5x5) branch3x3 = self.branch3x3_1(x) branch3x3 = self.branch3x3_2(branch3x3) branch3x3 = self.branch3x3_3(branch3x3) branch_pool = F.avg_pool2d(x, kernel_size=3, stride=1, padding=1) branch_pool = self.branch_pool(branch_pool) outputs = [branch1x1, branch5x5, branch3x3, branch_pool] return torch.cat(outputs, dim=1) class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(1, 10, kernel_size=5) self.conv2 = nn.Conv2d(88, 20, kernel_size=5) self.incep1 = InceptionA(in_channels=10) self.incep2 = InceptionA(in_channels=20) self.mp = nn.MaxPool2d(2) self.fc = nn.Linear(1408, 10) def forward(self, x): in_size = x.size(0) x = F.relu(self.mp(self.conv1(x))) x = self.incep1(x) x = F.relu(self.mp(self.conv2(x))) x = self.incep2(x) x = x.view(in_size, -1) x = self.fc(x) return x
123456789101112131415161718192021222324252627282930313233343536373839以下为训练结果:
我们可以思考一个问题,神经网络是越深越好吗?我们可以看看下面这组实验:
我们使用了3*3卷积得到了上述的结果,发现其实并不是越深越好,那么我们还能如何来优化我们的模型呢?
我们可以使用Residual net来在深度到一定数值时还让我们的模型有一个不错的训练结果。
相关代码如下:
class ResidualBlock(nn.Module): def __init__(self, channels): super(ResidualBlock, self).__init__() self.channels = channels self.conv1 = nn.Conv2d(channels, channels, kernel_size=3, padding=1) self.conv2 = nn.Conv2d(channels, channels, kernel_size=3, padding=1) def forward(self, x): y = F.relu(self.conv1(x)) y = self.conv2(y) return F.relu(x + y) class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(1, 16, kernel_size=5) self.conv2 = nn.Conv2d(16, 32, kernel_size=5) self.mp = nn.MaxPool2d(2) self.rblock1 = ResidualBlock(16) self.rblock2 = ResidualBlock(32) self.fc = nn.Linear(512, 10) def forward(self, x): in_size = x.size(0) x = self.mp(F.relu(self.conv1(x))) x = self.rblock1(x) x = self.mp(F.relu(self.conv2(x))) x = self.rblock2(x) x = x.view(in_size, -1) x = self.fc(x) return x
12345678910111213141516171819202122232425262728293031以下为训练结果:
相关知识
创建虚拟环境并,创建pytorch 1.3.1
基于pytorch搭建AlexNet神经网络用于花类识别
pytorch深度学习框架——实现病虫害图像分类
搭建简单的神经网络——使用pytorch实现鸢尾花的分类
使用PyTorch实现对花朵的分类
ResNet残差网络在PyTorch中的实现——训练花卉分类器
Pytorch框架实战——102类花卉分类
基于深度学习和迁移学习的识花实践
springboot鲜花商城平台
【十一花坛常见花卉】
网址: Pytorch系列笔记(十一) https://m.huajiangbk.com/newsview398121.html
上一篇: 排风扇噪音大用什么减少噪音 |
下一篇: 为防止酒驾事故的出现.酒精测试仪 |