卷积神经网络分类实战

卷积神经网络分类实战

基于唐宇迪老师的神经网络课程,初步实现课堂上的神经网络构建。

1.torchvision

torchvisionpytorch的一个图形库,它服务于 PyTorch深度学习框架的,主要用来构建 计算机视觉模型

torchvision.datasets: 加载数据的函数及常用的数据集的接口;
torchvision.models: 包含有模型架构,例如AlexNet、VGG、ResNet等;
torchvision.transforms: 常用的图片变换,例如裁剪、旋转等功能;
torchvision.utils: 其他的一些有用的方法。

搜索数据模型的方法是:进入如下网站

torchvision — Torchvision 0.13 documentation (pytorch.org)

找到Docs模块[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

卷积神经网络分类实战

下拉到torchvision模块,点击其中的模块即可进入。

; 1)安装torchvison模块

在命令行输入pip install torchvision

2)datasets模块

卷积神经网络分类实战

数据存放模式如上,将分类任务按上述存放方式存放在根文件夹下。

根文件夹下创建一个data文件夹,在文件夹的子目录中创建train和test文件夹,在train和test文件夹中分别创建不同的类型的文件夹,文件夹中放置同种类型的图片。

; 2.分类实战

1)引用库

import os
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
import torch
from torch import nn
import torch.optim as optim
import torchvision

from torchvision import transforms, models, datasets

import imageio
import time
import warnings
import random
import sys
import copy
import json
from PIL import Image

2)数据预处理

①引用路径

卷积神经网络分类实战

如下图,在建立如下文件,需要分类的花的数据文件存放在flower文件下。

data_dir = './flower_data/'
train_dir = data_dir + '/train'
valid_dir = data_dir + '/valid'

②数据增强

数据增强是将现有数据,经过翻转,旋转,对称等方式将图片的数量增加,从而更高效地利用数据。下列进行数据的变换。

训练集数据增强的方法有:

1.随机旋转 transforms.Compose:为保证数据的正确性,旋转的方式注重随机性。

2.从中心裁剪 transforms.CenterCrop(x):从中心裁剪操作是将原本n _n的图形类型从中心裁剪为x_x的图形类型。(也可以采用随机裁剪)

3.随机水平翻转transforms.RandomHorizontalFlip(p):有p的概率进行水平翻转

4.随机垂直翻转transforms.RandomVerticalFlip§

5.颜色变化transforms.ColorJitter,参数定义如下代码中所示

6.转为灰度图概率transforms.RandomGrayscale§

在完成变换后进行数据类型的转换,需要将数据转换成Tensor模式。

为使得数据处理效果更好,进行数据的标准化操作,数据的标准化可采用已经过测试的均值与标准差进行标准化,如下:transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])#均值,标准差.

data_transforms = {
    'train': transforms.Compose([transforms.RandomRotation(45),
        transforms.CenterCrop(224),
        transforms.RandomHorizontalFlip(p=0.5),
        transforms.RandomVerticalFlip(p=0.5),
        transforms.ColorJitter(brightness=0.2, contrast=0.1, saturation=0.1, hue=0.1),
        transforms.RandomGrayscale(p=0.025),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ]),
    'valid': transforms.Compose([transforms.Resize(256),
        transforms.CenterCrop(224),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ]),
}

测试集预处理:

测试集预处理无需进行数据增强操作,将测试集数据进行裁剪标准化即可完成测试集数据处理。

③传入数据

1.首先,定义数据的batch批大小
batch_size = 8
2.分类任务数据集构建
image_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x), data_transforms[x]) for x in ['train', 'valid']}

利用datasets.ImageFolder模块,参数os.path.join(data_dir, x)表示文件夹的位置,data_transforms[x]表示预处理方案(上一步中定义好的)

3.按batch取数据
dataloaders = {x: torch.utils.data.DataLoader(image_datasets[x], batch_size=batch_size, shuffle=True) for x in ['train', 'valid']}

采用dataloader模块进行数据集的存取。

还记得上一章中的Shuffle参数的定义吗?

这个参数表示的是是否洗牌操作。

4.计算数据集大小以及分类名称
dataset_sizes = {x: len(image_datasets[x]) for x in ['train', 'valid']}
class_names = image_datasets['train'].classes
5.定义类别对应的名称
with open('cat_to_name.json', 'r') as f:
    cat_to_name = json.load(f)

首先定义一个json文件,在其中存放类别的名称,如下所示。

{“21”: “fire lily”, “3”: “canterbury bells”, “45”: “bolero deep blue”, “1”: “pink primrose”, “34”: “mexican aster”, “27”: “prince of wales feathers”, “7”: “moon orchid”, “16”: “globe-flower”, “25”: “grape hyacinth”, “26”: “corn poppy”, “79”: “toad lily”, “39”: “siam tulip”, “24”: “red ginger”, “67”: “spring crocus”, “35”: “alpine sea holly”, “32”: “garden phlox”, “10”: “globe thistle”, “6”: “tiger lily”, “93”: “ball moss”, “33”: “love in the mist”, “9”: “monkshood”, “102”: “blackberry lily”, “14”: “spear thistle”, “19”: “balloon flower”, “100”: “blanket flower”, “13”: “king protea”, “49”: “oxeye daisy”, “15”: “yellow iris”, “61”: “cautleya spicata”, “31”: “carnation”, “64”: “silverbush”, “68”: “bearded iris”, “63”: “black-eyed susan”, “69”: “windflower”, “62”: “japanese anemone”, “20”: “giant white arum lily”, “38”: “great masterwort”, “4”: “sweet pea”, “86”: “tree mallow”, “101”: “trumpet creeper”, “42”: “daffodil”, “22”: “pincushion flower”, “2”: “hard-leaved pocket orchid”, “54”: “sunflower”, “66”: “osteospermum”, “70”: “tree poppy”, “85”: “desert-rose”, “99”: “bromelia”, “87”: “magnolia”, “5”: “english marigold”, “92”: “bee balm”, “28”: “stemless gentian”, “97”: “mallow”, “57”: “gaura”, “40”: “lenten rose”, “47”: “marigold”, “59”: “orange dahlia”, “48”: “buttercup”, “55”: “pelargonium”, “36”: “ruby-lipped cattleya”, “91”: “hippeastrum”, “29”: “artichoke”, “71”: “gazania”, “90”: “canna lily”, “18”: “peruvian lily”, “98”: “mexican petunia”, “8”: “bird of paradise”, “30”: “sweet william”, “17”: “purple coneflower”, “52”: “wild pansy”, “84”: “columbine”, “12”: “colt’s foot”, “11”: “snapdragon”, “96”: “camellia”, “23”: “fritillary”, “50”: “common dandelion”, “44”: “poinsettia”, “53”: “primula”, “72”: “azalea”, “65”: “californian poppy”, “80”: “anthurium”, “76”: “morning glory”, “37”: “cape flower”, “56”: “bishop of llandaff”, “60”: “pink-yellow dahlia”, “82”: “clematis”, “58”: “geranium”, “75”: “thorn apple”, “41”: “barbeton daisy”, “95”: “bougainvillea”, “43”: “sword lily”, “83”: “hibiscus”, “78”: “lotus lotus”, “88”: “cyclamen”, “94”: “foxglove”, “81”: “frangipani”, “74”: “rose”, “89”: “watercress”, “73”: “water lily”, “46”: “wallflower”, “77”: “passion flower”, “51”: “petunia”}

④展示数据

3)迁移学习

目标
将某个领域或任务上学习到的知识或模式应用到不同但相关的领域或问题中。

主要思想
从相关领域中迁移标注数据或者知识结构、完成或改进目标领域或任务的学习效果。

注意点

需要将自身数据与已有的迁移数据用有一样的数据类型,数据模式等

①迁移学习的两种方案

1.直接迁移开源的已有的卷积层

在数据量较小时,直接迁移原有卷积层。(数据量

Original: https://blog.csdn.net/chenweiguofff/article/details/125587895
Author: 被迫营业GGG
Title: 卷积神经网络分类实战

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

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

(0)

大家都在看

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