分享

卷积网络与全连接网络比较分析

 算法与编程之美 2023-03-18 发布于四川

问题

卷积网络与全连接网络对于图像分类的功能上谁更加好,及在同一变量的情况下谁的精度高?

方法

要想两种网络进行比较,要做到输出的通道数要相同,大小要保持一致,学习率一致,优化器使用一种。对于输出通道数的选择,这里统一选择10,

学习率统一为0.1,优化器我们选择momentum = 0.5.

首先分类图数据来自torchvision的datasets

1、对全连接进行实验:

全连接网络模型

class MyNet(nn.Module):
   # 5.2 定义网络有哪些层,这些层都作为成员变量
   def __init__(self) -> None:
       super().__init__()
       self.flatten = nn.Flatten() # 将28X28的图像拉伸为784维向量
       self.fc1 = nn.Linear(in_features=784, out_features=512)
       # 对应Layer3 也就是输出层
       self.fc2 = nn.Linear(in_features=512, out_features=10)
   # 5.3 定义数据在网络中的流动
   # x - 1*28*28 C*H*W C表示通道数,H表示图像高度,W表示图像宽度
   def forward(self, x):
       # x为输出层 28*28的图像
       x = self.flatten(x)  # 输出:784,对于图Layer1
       x = self.fc1(x) # 输出:512, Layer2
       out = self.fc2(x)  # 输出:10, Layer3

运行10周期:

最高精度为92.15&

2、对卷积进行实验:

卷积网络模型

class MyNet(nn.Module):
   def __init__(self):
       super(MyNet, self).__init__()
       self.conv_unit=nn.Sequential(
           nn.Conv2d(in_channels=1,out_channels=16,kernel_size=3,stride=1,padding=1),
           nn.MaxPool2d(kernel_size=2,stride=2),
           nn.Conv2d(in_channels=16,out_channels=32,kernel_size=3,stride=1,padding=1),
           nn.MaxPool2d(kernel_size=2, stride=2),
           nn.Conv2d(in_channels=32,out_channels=64,kernel_size=3,stride=1,padding=1),
           nn.AdaptiveMaxPool2d(1),
           nn.Conv2d(in_channels=64,out_channels=128,kernel_size=3,stride=1,padding=1)
       )
       self.fc_unit=nn.Sequential(
           nn.Linear(128*1*1,512),
           nn.Linear(512,10)
       )
   def forward(self,x):
       x=self.conv_unit(x)
       x=torch.flatten(x,1)
       out=self.fc_unit(x)
       return out

运行10周期:

最高精度为99.0%

结语

通过本次全连接网络和卷积网络都运行10个周期得比较的实验中所得,卷积网络分类的精度远高于全连接网络的分类精度。实验不足的地方在于没有将层数保持一致,由于时间原因,运行周期较小,实验次数较少。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多