一、实验原理
模型的输入数据是包含猫狗信息的RGB图像,将其输入到网络模型中,经过模型的前向计算得到输出的二分类结果,通过损失函数度量计算输出结果与输入图像标签的差异度,并通过反向传播算法根据这个差异来调整网络各层的参数值,经过反复迭代输入,最终得到一个能准确分类输入的猫狗图像的网络模型(输出的识别结果与标签一致)。
二、网络结构
本次试验使用的CNN网络结构如下:
各层参数和实验环境如下:
输入大小:256*256*3
卷积层①:3*3*3*16,padding=0,stride=2
卷积层②:3*3*16*32,padding=0,stride=2
卷积层③:3*3*32*64,padding=0,stride=2
池化层:2*2最大池化
全连接层①:输入3*3*64=576、输出128
全连接层②:输入128、输出10
输出层:输入10、输出2
三、代码
"""cnn模型"""class cnn(nn.Module):def __init__(self):super(cnn, self).__init__()self.relu = nn.ReLU()self.sigmoid = nn.Sigmoid()self.conv1 = nn.Sequential(nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, stride=2),nn.BatchNorm2d(16),nn.ReLU(),nn.MaxPool2d(kernel_size=2),)#self.conv2 = nn.Sequential(nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3, stride=2),nn.BatchNorm2d(32),nn.ReLU(),nn.MaxPool2d(kernel_size=2),)#self.conv3 = nn.Sequential(nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3, stride=2),nn.BatchNorm2d(64),nn.ReLU(),nn.MaxPool2d(kernel_size=2),)self.fc1 = nn.Linear(3 * 3 * 64, 128)self.fc2 = nn.Linear(128, 10)self.out = nn.Linear(10, 2)def forward(self, x):x = self.conv1(x)x = self.conv2(x)x = self.conv3(x)x = x.view(x.shape[0], -1)x = self.relu(self.fc1(x))x = self.relu(self.fc2(x))x = self.out(x)return x
四、实验结果
经过30轮训练,第26轮训练得到了loss最小的模型参数,用该模型测试原始数据集,测试结果为:500张图像中识别正确的数量为435,分类正确率为87%。实验结果如下图所示: