问题
卷积网络与全连接网络对于图像分类的功能上谁更加好,及在同一变量的情况下谁的精度高?
方法
要想两种网络进行比较,要做到输出的通道数要相同,大小要保持一致,学习率一致,优化器使用一种。对于输出通道数的选择,这里统一选择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个周期得比较的实验中所得,卷积网络分类的精度远高于全连接网络的分类精度。实验不足的地方在于没有将层数保持一致,由于时间原因,运行周期较小,实验次数较少。