详解pytorch实现猫狗识别98%附代码

本文详细讲解了如何使用PyTorch实现猫狗识别项目,包括选择框架的原因、迁移学习(resnet50)的高精度应用、神经网络原理与结构(卷积层、池化层、全连接层),以及项目架构、代码实现和数据集准备。


前言

前段时间间做了猫狗识别的项目,采用的是pytorch这个框架,准确率达到了98%,其中对于神经网络 构建也采用了很多种方式,采用过迁移学习使用resnet50resnet18vgg16vgg19,也尝试过自己构建神经网络(自己构建的准确率比较低,但是目的在于熟悉图片维度的计算)

一、为什么选用pytorch这个框架?

首先我们要知道深度学习常用的几个框架有哪些,例如:TensorFlow、Keras、Pytorch等。
TensorFlow:这个框架是目前非常常用的

  • 优点:适合在大范围内进行操作,尤其是对于跨台或者是在实现嵌入式部署的时候更具优势
  • 缺点:静态框架计算的流程处于固定状态,不灵活的运算方式会导致在结算结果上效率比较低下

Keras:封装的比较好,容易上手,相对简单点

  • 优点:极简,只需几行代码就能构建一个神经网络(对TensorFlow进行封装,相当于一个api)
  • 缺点:速度慢

Pytorch

  • 优点:是一个动态的框架,在运算过程中,会根据不同的数值,按照最优方式进行合理安排
  • 缺点:在短时间内建立结果和方案更适合于计算机程序爱好者或者是小规模项目

二、实现效果

1.下面采用resnet50损失值和准确率,准确率在97%以上
在这里插入图片描述
2.自定义的神经网络准确率及损失值,由于自己写神经网络的目的在于了解神经网络的处理一张图片的计算流程 ,所以没太去深究提高准确率
在这里插入图片描述

三、神经网络从头到尾

1.来源:仿照人为处理图片的流程,模拟人们的神经元处理信息的方式

在这里插入图片描述

2.总览神经网络

下面这张更容易理解一点,计算机看到的一张图片是如下图右下角的图片,整体流程中包含输入层、隐藏层和输出层,中间的圈相当于人脑中的神经元
在这里插入图片描述
更加详细的一个卷积神经网络的处理过程,包括卷积层、池化层和全连接层
在这里插入图片描述

3.卷积层(Convolution)

卷积层的作用是对输入的数据做特征提取,而完成该功能的是卷积核,如图为卷积核如何在卷积层进行运算(下图也是在网上经常见到的,备注:引用的图片)
在这里插入图片描述

4.池化层(Subsmpling)

池化层一般对数据进行进一步的特征提取,不仅实现对数据的压缩,还大量减少了参与模型计算的参数,从某种意义上讲,提升了计算效率,池化的方式有取最大、取最小以及取平均值
在这里插入图片描述

5.全连接层(Fully Connected)

全连接层主要作用是将输入的图像在经过卷积核池化操作后提取的特征进行压缩,并根据压缩的特征完成模型的分类功能。
在这里插入图片描述

四、项目架构

下面是我画的一个项目的思维导图,看图完全就可以看懂整个项目的流程,就不多用文字介绍了
在这里插入图片描述

五、代码实现

下面是采用迁移学习resnet50实现的代码,用vgg16以及其它的网络模型的时候只需要更换网络模型即可,注释掉的class类是自定义的神经网络,想要学习流程的话可以看看,代码后面有注释

import torch 
import torchvision
from torchvision import datasets,models,transforms
import os
from torch.autograd import Variable
import torch.nn as nn
import torch.utils.data
import torch.nn.functional as F
#from network import Net


# class Net(nn.Module):                                       # 新建一个网络类,就是需要搭建的网络,必须继承PyTorch的nn.Module父类
#     def __init__(self):                                     # 构造函数,用于设定网络层
#         super(Net, self).__init__()                         # 标准语句
#         self.conv1 = torch.nn.Conv2d(3, 16, 3, padding=1)   # 第一个卷积层,输入通道数3,输出通道数16,卷积核大小3×3,padding大小1,其他参数默认
#         self.conv2 = torch.nn.Conv2d(16, 16, 3, padding=1)  

#         self.fc1 = nn.Linear(56*56*16, 128)                 # 第一个全连层,线性连接,输入节点数50×50×16,输出节点数128
#         self.fc2 = nn.Linear(128, 64)                     
#         self.fc3 = nn.Linear(64, 2)                         

#     def forward(self, x):                                    # 重写父类forward方法,即前向计算,通过该方法获取网络输入数据后的输出值
#         x = self.conv1(x
评论 14
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值