基于pytorch搭建神经网络的花朵种类识别(深度学习)

基于pytorch搭建神经网络的花朵种类识别(深度学习)


项目源码网盘链接:https://pan.baidu.com/s/176-HRsaVQkiwTXK6KJg5Bw
提取码:0dng

项目码云链接https://gitee.com/xian-polytechnic-university/python

一.知识点

1.特征提取、神经元逐层判断

在这里插入图片描述

2.中间层(隐藏层)

在这里插入图片描述

3.学习权值、神经元进行运算

返向传递:将输出值与正确答案进行比较,将误差传递回输出层回去(叫梯度,pytorch自动完成),从而计算每个权值的最优值,去进行更改。
Pytorch核心:Autograd包(完成自动梯度计算及返向传递)
在这里插入图片描述
训练一个模型的时候需要返向传递,用的时候不需要
TensorFlow:
定义运算符、定义运算、定义梯度、开启对话框、注入数据、进行运算。
Pytorch:
初始化、进行运算(变调式便运算)

二、项目任务

​基于 pytorch 搭建神经网络分类模型识别花的种类,输入一张花的照片,输出显示最有可能的前八种花的名称和该种花的照片。

操作过程如下:

1.数据集预处理操作

(1)读取数据集数据
(2)构建神经网络的数据集
1)数据增强:torchvision中transforms模块自带功能,将数据集中照片进行旋转、翻折、放大…得到更多的数据
2)数据预处理:torchvision中transforms也帮我们实现好了,直接调用即可
3)处理好的数据集保存在DataLoader模块中,可直接读取batch数据在这里插入图片描述

2.网络模型训练操作

(1)迁移pytorch官网中models提供的resnet模型,torchvision中有很多经典网络架构,调用起来十分方便,并且可以用人家训练好的权重参数来继续训练,也就是所谓的迁移学习
(2)选择GPU计算、选择训练哪些层、优化器设置、损失函数设置…
(3)训练全连接层,前几层都是做特征提取的,本质任务目标是一致的,前面的先不动,先训练最后一层全连接层
(4)再训练所有层
在这里插入图片描述

3.预测种类操作

(1)加载训练好的模型,模型保存的时候可以带有选择性,例如在验证集中如果当前效果好则保存
(2)设置检测图像的数据
(3)设置展示界面并进行预测
在这里插入图片描述

三、程序结构介绍

在这里插入图片描述

1.flower_function/定义函数程序

(在该程序中定义相关函数,以便在其他程序中进行调用)

  • 图像增强(数据集预处理处理)
  • 处理照片数据函数
  • 检测照片预处理函数
  • 展示一张照片函数
    在这里插入图片描述

2.flower_dataset/数据集处理程序

  • 读取数据集(训练集测试集)数据
  • 构建神经网络的数据集
    在这里插入图片描述

3.flower_model网络模型训练程序

  • 冻结神经网络权重函数
  • 修改全连接层函数(官方)
  • 训练模型函数
  • 加载并修改models中提供的resnet模型open
  • 开始训练全连接层(0-19)
  • 再继续训练所有层(0-9)
    在这里插入图片描述

4.flower_forecast预测程序

  • 冻结神经网络权重函数
  • 修改全连接层函数
  • 加载测试模型
  • 设置检测图像数据
  • 设置展示界面
    在这里插入图片描述

四、程序内容说明

1.代码整洁操作说明

  • 两行“”“”“open、”“”“”end封装的是该模块的程序
  • #是单行注释

2.迁移学习

  • 用相似的模型的权重初始化,修改全连接层,然后重新训练
  • pytorch->transforms->resnet->models
    在这里插入图片描述
    (1)一个文件程序写全部代码有两个问题:
    1)功能分工不明确
    2)每次都要重新跑训练网络
    (2)模块化编程: 将功能函数分别放到不同的程序中,程序中相互调,可以分别进行功能测试
    (3)模块化编程两种方式:
    A中:
    import B
    B.function
    A中:
    from B import function
    function
    (4)注意import循环重载:
    ​ 利用pycharm这种IDE进行模块化编程,多个.py文件相互import容易发生循环重载
    先了解下import的原理:
    ​ 例:A中importB,当顺序执行A,遇到相关数据需要调用B时,停止执行A,去执行B,B执行完了再执行A,如果A、B相互调用的话会报错
    解决办法:
    ​ 当A中importB,当B又需要调用A时,把需要的A中参数定义、函数定义在B中再写一遍

五、附录完整代码

1.flower_function/定义函数程序

import numpy as np
import torch
import matplotlib.pyplot as plt
from PIL import Image

from torchvision import transforms, models


filename='checkpoint.pth'
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

"""""""""""""""图像增强(数据集预处理处理)open"""""""""""""""
#图像增强:将数据集中照片进行旋转、翻折、放大...得到更多的数据
#ImageFolder假设所有的文件按文件夹保存好,每个文件夹下面存贮同一类别的图片,文件夹的名字为分类的名字
data_transforms = {
     #data_transforms中指定了所有图像预处理操作,只需要修改训练集和验证集的名字后复制粘贴
    'train':
        transforms.Compose([transforms.RandomRotation(45),#随机旋转,-45到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),#参数1为亮度,参数2为对比度,参数3为饱和度,参数4为色相
        transforms.RandomGrayscale(p=0.025),#概率转换成灰度率,3通道就是R=G=B
        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])
    ]),
}
"""""""""""""""图像增强(数据集预处理处理)end"""""""""""""""


"""""""""""""""处理照片数据函数open"""""""""""""""
#注意tensor的数据需要转换成numpy的格式,而且还需要还原回标准化的结果
def im_convert(tensor):

    image = tensor.to("cpu").clone().detach()
    image = image.numpy().squeeze()
    # 还原回h,w,c
    image = image.transpose(1, 2, 0)
    # 被标准化过了,还原非标准化样子
    image = image * np.array((0.229, 0.224, 0.225)) + np.array((0.485, 0.456, 0.406))
    image = image.clip(0, 1)

    return image
"""""""""""""""处理照片数据函数end"""""""""""""""


"""""""""""""""检测照片预处理函数open"""""""""""""""
def process_image(image_path):
    # 读取测试数据
    img = Image.open(image_path)
    # Resize,thumbnail方法只能进行缩小,所以进行了判断
    if img.size[0] > img.size[1]:
        img.thumbnail((10000, 256))
    else:
        img.thumbnail((256, 10000))
    # Crop操作,再裁剪
    left_margin = (img.width - 224) / 2
    bottom_margin = (img.height - 224) / 2
    right_margin = left_margin + 224
    top_margin = bottom_margin + 224
    img = img.crop((left_margin, bottom_margin, right_margin,
                    top_margin))
    # 相同的预处理方法
    img = np.array(img) / 255
    mean = np.array([0.485, 0.456, 0.406])  # provided mean
    std = np.array([0.229, 0.224, 0.225])  # provided std
    img = (img - mean) / std

    # 注意颜色通道应该放在第一个位置
    img = img.transpose((2, 0, 1))

    return img
"""""""""""""""检测照片预处理函数end"""""""""""""""


""
  • 3
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
识别算法可以通过深度学习模型实现,主要包括以下几个步骤: 1. 数据集准备:收集卉图片数据集,并将其按照类别进行分类。 2. 数据预处理:对数据进行预处理,包括图像的缩放、裁剪、旋转等操作,以及数据的归一化处理。 3. 模型选择:选择合适的深度学习模型进行训练,如卷积神经网络(CNN)等。 4. 模型训练:使用训练集对模型进行训练,并在验证集上进行验证,调整模型超参数以提高模型的性能。 5. 模型测试:使用测试集对模型进行测试,评估模型的性能指标。 6. 部署应用:将模型部署到应用中,实现识别功能。 在基于PyTorch识别算法研究中,可以使用PyTorch构建深度学习模型,并使用PyTorch提供的数据处理和训练工具进行训练和测试。具体步骤如下: 1. 数据集准备:可以从公共数据集如ImageNet、CIFAR-10中获取卉图片数据集,或者自己采集卉图片数据集。将数据集按照类别进行分类,并制作成PyTorch的数据集格式。 2. 数据预处理:使用PyTorch提供的transforms工具对数据进行预处理,包括图像缩放、裁剪、旋转等操作,以及数据的归一化处理。 3. 模型选择:根据数据集的大小和复杂程度,选择合适的深度学习模型进行训练,如ResNet、Inception等。可以在PyTorch提供的模型库中寻找合适的模型。 4. 模型训练:使用PyTorch提供的数据加载和训练工具,对模型进行训练,并在验证集上进行验证,调整模型超参数以提高模型的性能。 5. 模型测试:使用测试集对模型进行测试,评估模型的性能指标,如准确率、精确率、召回率等。 6. 部署应用:将模型部署到应用中,实现识别功能。可以使用PyTorch提供的模型保存和加载工具,将模型保存为文件,并在应用中加载模型进行推理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值