李宏毅《机器学习》飞桨特训营(九)——卷积神经网络(含作业:食物分类)

李宏毅《机器学习》飞桨特训营(九)

一. 卷积神经网络

视频 PPT 内容总结1(老师上课内容) ⭐内容总结2(含拓展内容:AlexNet、GoogleNet、ResNet模型及源码等)

二. 作业:食物分类

视频讲解(25:00开始)

2.1 数据集介绍

本次使用的数据集为food-11数据集,共有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张

下载 zip 后解压缩会有三个文件夹,分别为training、validation 以及 testing。

training 以及 validation 中的照片名称格式为 [类别]_[编号].jpg,例如 3_100.jpg 即为类别 3 的照片(编号不重要)。

数据集下载地址:https://aistudio.baidu.com/aistudio/datasetdetail/76103

2.2 导入包


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

place = paddle.CUDAPlace(0)
paddle.disable_static(place)

2.3 定义数据集

在 paddle 中,我们可以利用 paddle.io 的 Dataset 及 DataLoader 来”包装”数据,使后续的训练及预测更为方便。

Dataset 需要 overload 两个函数:len 及 getitem:

  • len 必须要回传 dataset 的大小
  • getitem 则定义了当函数利用 [idx] 取值时,数据集应该要怎么回传数据。

实际上我们并不会直接使用到这两个函数,但是使用 DataLoader 在 enumerate Dataset 时会使用到,没有做的话会在运行阶段出现错误。

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))
        self.mode = mode

        self.train_transforms = Compose([
            Resize(size=image_size),
            RandomHorizontalFlip(),
            RandomRotation(15),
            Transpose(),
            Normalize(mean=127.5, std=127.5)
        ])

        self.test_transforms = Compose([
            Resize(size=image_size),
            Transpose(),
            Normalize(mean=127.5, std=127.5)
        ])

    def __len__(self):
        return len(self.image_file_list)

    def __getitem__(self, idx):
        img = cv2.imread(os.path.join(self.image_path, self.image_file_list[idx]))
        if self.mode == 'train':
            img = self.train_transforms(img)
            label = int(self.image_file_list[idx].split("_")[0])
            return img, label
        else:
            img = self.test_transforms(img)
            return img
batch_size = 128

traindataset = FoodDataset('work/food-11/training')
valdataset = FoodDataset('work/food-11/validation')

train_loader = DataLoader(traindataset, places=paddle.CUDAPlace(0), batch_size=batch_size, shuffle=True, drop_last=True)
val_loader = DataLoader(valdataset, places=paddle.CUDAPlace(0), batch_size=batch_size, shuffle=False, drop_last=True)

2.4 构建模型

卷积神经网络时常使用”Conv+BN+激活+池化”作为一个基础block,我们可以将多个block堆叠在一起,进行特征提取,最后连 接一个Linear层,实现图片分类。

⭐CNN的卷积核通道数 = 卷积输入层的通道数
⭐CNN的卷积输出层通道数 = 卷积核的个数

class Classifier(paddle.nn.Layer):
    def __init__(self):
        super(Classifier, self).__init__()

        self.cnn = Sequential(

            Conv2D(3, 64, 3, 1, 1),

            BatchNorm2D(64),
            ReLU(),

            MaxPool2D(2, 2, 0),

            Conv2D(64, 128, 3, 1, 1),
            BatchNorm2D(128),
            ReLU(),
            MaxPool2D(2, 2, 0),

            Conv2D(128, 256, 3, 1, 1),
            BatchNorm2D(256),
            ReLU(),
            MaxPool2D(2, 2, 0),

            Conv2D(256, 512, 3, 1, 1),
            BatchNorm2D(512),
            ReLU(),
            MaxPool2D(2, 2, 0),

            Conv2D(512, 512, 3, 1, 1),
            BatchNorm2D(512),
            ReLU(),
            MaxPool2D(2, 2, 0),
        )

        self.fc = Sequential(
            Linear(512*4*4, 1024),
            ReLU(),
            Linear(1024, 512),
            ReLU(),
            Linear(512, 11)
        )

    def forward(self, x):
        x = self.cnn(x)
        x = x.flatten(start_axis=1)
        x = self.fc(x)
        return x

查看模型结构:

`python
my_model = paddle.Model(Classifier())
my_model.summary((-1, 3, 128, 128))

运行后输出以下内容:
Input size (MB): 0.19
Forward/backward pass size (MB): 49.59
Params size (MB): 48.97
Estimated Total Size (MB): 98.74

Original: https://blog.csdn.net/cyj972628089/article/details/122016063
Author: 卡卡南安
Title: 李宏毅《机器学习》飞桨特训营(九)——卷积神经网络(含作业:食物分类)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/665737/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球