在上一篇文章:卷积神经网络|猫狗分类系列--导入kaggle猫狗数据集,我们已经成功导入了kaggle猫狗数据集,也就是说,数据的预处理工作已经完成,而接下来就到了构建模型阶段。
建立一个神经网络模型是比较简单的,只要了解各层的含义,不同层之间参数的传递...,有了这些预备知识,那么一个完整的网络模型就可以被很容易地构建出来。
就像这样:
# 创建网络
class Network(nn.Module):
def __init__(self):
super(Network,self).__init__()
self.conv1 = nn.Conv2d(in_channels=3, out_channels=6, kernel_size=5)
self.conv2 = nn.Conv2d(in_channels=6, out_channels=12, kernel_size=5)
self.fc1 = nn.Linear(in_features= 12*4*4, out_features=120)
self.fc2 = nn.Linear(in_features= 120, out_features=60)
self.out = nn.Linear(in_features=60, out_features=2)
def forward(self, t):
t = t
t = F.relu(self.conv1(t))
t = F.max_pool2d(t, kernel_size =2, stride=2)
t = F.relu(self.conv2(t))
t = F.max_pool2d(t, kernel_size=2, stride=2)
t = t.reshape(-1, 12*4*4)
t = F.relu(self.fc1(t))
t = F.relu(self.fc2(t))
t = self.out(t)
return t
当然,这个网络模型结构非常简单,仅仅有两个卷积层和三个全连接层构成,对于我们的实际任务效果可能非常差,但并没有关系,因为我们已经知道一个大致的网络模型是什么样。
既然模型的构建非常简单,实际上,你也可以自己构建一个模型,自己定义卷积层,全连接层的数量,以及在何处使用激活操作和池化操作,但要格外注意参数的设置,因为参数错误会导致整个模型不能工作。
在自己尝试之后,再了解那些十分经典的模型的结构,那么这个过程将是十分有益的。
在下一节,我们将使用经典的预训练好的VGG模型,并在此基础上进行微调,使之可以用来完成猫狗分类任务。