猫狗分类,猫狗大战

项目全部代码在文章末尾

1、任务描述

Cats vs. Dogs(猫狗大战)数据集下载地址为https://www.kaggle.com/c/dogs-vs-cats/data。这个数据集是Kaggle大数据竞赛某一年的一道赛题,利用给定的数据集,用算法实现猫和狗的识别。 其中包含了训练集和测试集,训练集中猫和狗的图片数量都是12500张且按顺序排序,测试集中猫和狗混合乱序图片一共12500张。

卷积神经网络(CNN)是一类包含卷积计算且具有深度结构的前馈神经网络,是深度学习的代表算法之一。卷积神经网络具有表征学习能力,能够按其阶层结构对输入信息进行平移不变分类,因此也被称为“平移不变人工神经网络”不使用深度学习框架,用numpy基础代码来构建自己的深度学习网络。

2、数据预处理

为了加速训练算法的收敛速度,一般都会采用一些数据预处理技术卷积神经网络的输入特征需要进行标准化处理。在将学习数据输入卷积神经网络前,需在通道或时间/频率维对输入数据进行归一化,若输入数据为像素,也可将分布于0-1的原始像素值归一化至0-255区间。输入特征的标准化有利于提升卷积神经网络的学习效率和表现

首先将图片转化成为了RGB格式,RGB就是我们对颜色的一种标准化白色在电脑上的组成就是255.255.255,相对的黑色就是0.0.0这是在电脑上颜色数值代码然后将图片调整为28*28大小,resize是opencv库中的一个函数,主要起到对图片进行缩放的作用。以下代码就将原图片转化为宽和长分别为2828的图片

image= image_list[i]

image = cv2.imread(image)

image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

image = cv2.resize(image, (28, 28))

这里是将一组图像矩阵image重建为新的矩阵reshape()是数组array中的方法,作用是将数据重新组织我们不知道image的shape到底是什么,第一个参数未知,但是后面的形状参数知道,即[28,28]故把第一个参数设为-1,然后第一个可以根据真实的形状自适应得出当前情况下第一个参数的值。

image=image.reshape(-1,28,28)

 3、网络结构

网络结构如下所示

    conv - relu - conv- relu - pool -

    conv - relu - conv- relu - pool -

    conv - relu - conv- relu - pool -

affine - relu - dropout - affine - dropout - softmax

conv层是卷积层,是网络结构的关键。卷积层的功能是对输入数据进行特征提取,其内部包含多个卷积核,组成卷积核的每个元素都对应一个权重系数和一个偏差量,类似于一个前馈神经网络的神经元。卷积层演示过程

relu是隐藏层的激活函数,功能是把卷积层输出结果做非线性映射。CNN采用的激励函数一般为ReLU(The Rectified Linear Unit/修正线性单元),它的特点是收敛快,求梯度简单,但较脆弱,图像如下

pool是池化层,在卷积层进行特征提取后,输出的特征图会被传递至池化层进行特征选择和信息过滤。池化层包含预设定的池化函数,其功能是将特征图中单个点的结果替换为其相邻区域的特征图统计量。池化层选取池化区域与卷积核扫描特征图步骤相同,由池化大小、步长和填充控制

affine是全连接层,卷积神经网络中的全连接层等价于传统前馈神经网络中的隐含层。全连接层位于卷积神经网络隐含层的最后部分,并只向其它全连接层传递信号。特征图在全连接层中会失去空间拓扑结构,被展开为向量并通过激励函数

dropout层用于减少过拟合。dropout是指深度学习训练过程中,对于神经网络训练单元,按照一定的概率将其从网络中移除,注意是暂时,对于随机梯度下降来说,由于是随机丢弃,故而每一个mini-batch都在训练不同的网络。过拟合是深度神经网(DNN)中的一个常见问题:模型只学会在训练集上分类,这些年提出的许多过拟合问题的解决方案,其中dropout具有简单性而且效果也非常良好。

softmax函数,又称归一化指数函数。它是二分类函数sigmoid在多分类上的推广,目的是将多分类的结果以概率的形式展现出来。

 4、实验结果和分析

参数的训练花费了2个小时,处理了两万张图片。测试集精度在第十次迭代达到高峰,随后略微下降,考虑到应该是过拟合问题,所以把迭代次数改为了12次。

超参数的取值

filter_size:3

pad:1

stride:1

第一次训练精度

开始:50%

结束:92%

迭代次数:20

第一次测试精度

开始:50%

结束:78%

迭代次数:20

第二次训练精度

开始:50%

结束:80%

迭代次数:12

第二次测试精度

开始:50%

结束:78%

迭代次数:12

 代码:

 链接:https://pan.baidu.com/s/1Kz4adoDhJ0DYuqgybmq_RQ
提取码:cdmg

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
PyTorch是一个基于Python的开源深度学习框架,被广泛应用于各种研究和工业项目中。大战是一个经典的图像分类任务,旨在通过训练一个分类网络来区分的图像。 在PyTorch中,我们可以使用torchvision包提供的数据集来加载和预处理图像数据。通过使用torchvision.datasets.ImageFolder函数,我们可以轻松地将图像数据集划分为两个类别,并进行必要的预处理操作,如裁剪、缩放和归一化等。 接下来,我们可以定义一个卷积神经网络(CNN)作为分类器。CNN是一种适用于图像处理任务的深度学习模型,其中包含多个卷积层、池化层和全连接层。我们可以使用PyTorch提供的nn.Module类来创建一个自定义的CNN模型,并在其中定义前向传播函数。 然后,我们可以使用训练集对CNN模型进行训练。在训练过程中,我们需要定义损失函数和优化器。损失函数用于衡量模型输出与真实标签之间的差异,常用的损失函数包括交叉熵损失函数。优化器用于更新网络参数以最小化损失函数,常用的优化器包括随机梯度下降(SGD)和Adam。 通过迭代训练和优化,我们可以逐渐改善模型的分类性能。可以通过在验证集上评估模型的准确率、精确率和召回率等指标来评估模型的性能。一般情况下,我们会将训练集划分为训练集和验证集,并使用验证集上的性能作为模型调优的依据。 最后,在模型训练完成后,我们可以使用测试集对模型进行测试。通过计算模型在测试集上的准确率,我们可以评估模型在真实数据上的分类性能。 总结来说,PyTorch可以很好地支持大战分类网络的构建和训练。通过灵活的接口和丰富的工具库,PyTorch使得深度学习任务更加简单和高效。通过不断调整网络结构和优化算法,我们可以提高模型的性能,并在大战分类任务中取得更好的分类结果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值