前言
项目三是训练一个简单的卷积神经网络,实现食物图片的分类。现在还没有完成,在这里做一个记录。第三个作业比前面两个难了不少,遇到了很多困难,首先还是去理解老师已经给出的代码。这里用了paddlepaddle的深度学习框架,代码里碰到很多不懂的api就去paddlepaddle官网找文档然后加了注释。现在代码已经理解了但是运行还有一些错误。
数据集分别为training、validation 以及 testing
training 以及 validation 中的照片名称格式为 [类别]_[编号].jpg,例如 3_100.jpg 即为类别 3 的照片(编号不重要)
四个步骤:
1.定义数据集
2.模型结构
3.模型训练
4.测试
一、定义数据集
在 paddle 中,我们可以利用 paddle.io 的 Dataset 及 DataLoader 来"包装"数据,使后续的训练及预测更为方便。 Dataset 需要 overload 两个函数:len 及 getitem len 必须要回传 dataset 的大小,而 getitem 则定义了当函数利用 [idx] 取值时,数据集应该要怎么回传数据。 实际上我们并不会直接使用到这两个函数,但是使用 DataLoader 在 enumerate Dataset 时会使用到,没有做的话会在运行阶段出现错误。
# Import需要的套件
import os
import cv2
import time
import numpy as np
import paddle
from paddle.io import Dataset, DataLoader
from paddle.nn import Sequential, Conv2D, BatchNorm2D, ReLU, MaxPool2D, Linear, Flatten
from paddle.vision.transforms import Compose, Transpose, RandomRotation, RandomHorizontalFlip, Normalize, Resize
# 分配CPU设备
place = paddle.CPUPlace()
paddle.disable_static(place)
print(paddle.__version__)
# 在框架下不用open一个文件然后去读,而是聚成一个dataset基类,再定义一个业务类FoodDataset,然后在initial方法里面传入必要的一些组件
class FoodDataset(Dataset):
def __init__(self, image_path, image_size=(128, 128), mode='train'):
self.image_path = image_path #传递路径
self.image_file_list = sorted(os.listdir(image_path)) #os.listdir(path)返回指定的文件夹包含的文件或文件夹的名字的列表。
self.mode = mode
# training 时做 data augmentation
self.train_transforms = Compose([ #数据增强组件
Resize(size=image_size), #缩放
RandomHorizontalFlip(), #依据概率p对图片进行水平翻转,p默认0.5
RandomRotation(15), #中心旋转随机(-15,15)度