- 基础CNN模型 见文件
CNN_food_classification.ipynb
- 基于基础模型改进的 最优版CNN模型 见文件
more_conv_CNN_food_classification2.ipynb
- 其他
.ipynb
文件为基于基础模型改进的其他模型 .csv
文件为与其同名的.ipynb
模型的test set
预测结果
数据集为食物照片,共有11类 Bread, Dairy product, Dessert, Egg, Fried food, Meat, Noodles/Pasta, Rice, Seafood, Soup, and Vegetable/Fruit,其中Training set
有9866张照片,Validation set
有3430张照片,Testing set
有3347张照片。
输入一张食物的图片,然后输出图片中食物所属的类别(0、1、2、……、10),选用的模型是卷积神经网络CNN。
- Google Colaboratory
- GPU:Colab随机分配
- Python=3.6 and Pytorch=1.5.1
首先将图片导入,用opencv(cv2)
读取图片并存放在numpy.ndarray
中,每张图片都是128*128*3
,然后通过随机旋转、水平翻转图片等方法对图片进行数据增强,最后建立模型。
我们首先建立了一个原始模型,利用nn.Conv2d
,nn.BatchNorm2d
,nn.ReLU
,nn.MaxPool2d
这4个函数来构建一个5层的CNN,然后进入到一个3层全连接层
然后我们对模型进行了几次变形,包括增加卷积层(每层均有卷积和池化)、增加卷积层(中间有只有卷积无池化的层)、减少卷积层。接下来是训练参数,使用训练集training set
进行训练,并使用验证集validation set
来选择最好的参数,具体参数见代码文件,同时我们也将training set
和validation set
合并到一起共同训练,最后各模型结果如表1所示。
表1 各模型结果
模型 | 训练集训练模型+验证集验证 | 训练集+验证集训练模型 | ||||
训练集Accuracy | 训练集Loss | 验证集Accuracy | 验证集Loss | Accuracy | Loss | |
原始模型 | 0.863572 | 0.00309 | 0.601458 | 0.01255 | 0.927798 | 0.001628 |
【最优CNN模型】增加卷积层(每层均有卷积和池化,共6层) | 0.886783 | 0.002609 | 0.677843 | 0.010301 | 0.934943 | 0.00145 |
增加卷积层(中间有只有卷积无池化的层) | 0.755321 | 0.005596 | 0.641983 | 0.00868 | 0.837696 | 0.003616 |
减少卷积层 | 0.797993 | 0.004717 | 0.574636 | 0.013245 | 0.879738 | 0.002646 |
根据第四部分和第五部分的模型结果,可以发现验证集的准确率较低,同时还存在一定程度上的过拟合问题,因此我们有了如下的改进思路:
(1)引入残差神经网络,即ResNet
,它允许网络尽可能的加深,可以避免随着网络的加深,出现了训练集准确率下降的现象。
(2)引入dropout
,能够在CNN中防止过拟合。
表3 改进模型结果
训练集训练模型+验证集验证 | 训练集+验证集训练模型 | ||||
训练集Accuracy | 训练集Loss | 验证集Accuracy | 验证集Loss | Accuracy | Loss |
0.885465 | 0.002643 | 0.741399 | 0.007159 | 0.895382 | 0.00237 |