说明

采用pytorch框架实现猫狗识别。

数据集下载

猫狗识别数据集下载:

链接:https://pan.baidu.com/s/1hfzSacJbNBUhcDDtPnzlsg 
提取码:fu74

构建datatset类

构建一个CatDogDataset类,用来读取和处理猫狗识别数据集。

import os
import cv2
import torch
import numpy as np
from torch.utils.data import Dataset
import torchvision.transforms as transformfile_path = "F:/train_data/cat_dog/"trans = transform.Compose([transform.ToTensor(),  # 归一化并将HWC转换为CHWtransform.Normalize(0.5, 0.5)  # 做均值为0.5, 标准差为0.5的标准化
])class CatDogDataset(Dataset):"""整理数据集"""def __init__(self, file_path, is_training=True):super(CatDogDataset, self).__init__()# 定义数据列表,装载图片路径和标签的元组self.data = []for path in os.listdir(file_path):full_path = os.path.join(file_path, path)label, _, _ = path.split(".") # 取出标签self.data.append((full_path, label))# 切分训练集和测试集if is_training:self.data = [self.data[i] for i in range(len(self.data)) if i < 5000 or i >= 7000]else:self.data = [self.data[i] for i in range(len(self.data)) if i >= 5000 and i < 7000]def __len__(self):return len(self.data)def __getitem__(self, item):full_path, label = self.data[item]# 读出图片数据并归一化img = cv2.imread(full_path)img_tensor = trans(img)  # HWC转CHW并归一化、标准化# label one hot 编码one_hot = np.zeros(2)one_hot[int(label)] = 1label = int(label)# 将需要的数据转换为tensorlabel_tensor = torch.tensor(label, dtype=torch.float32)one_hot_tensor = torch.tensor(one_hot, dtype=torch.float32)return img_tensor, label_tensor, one_hot_tensor

构建卷积神经网络

对卷积神经网络采用以下几种方法:

  1. 为了减少参数,将3*3的卷积核用1*3和3*1的卷积核替代;
  2. 为了加深网络深度,采用1*1的卷积,并对1*3和3*1的卷积做padding;
  3. 用步长为2的3*3卷积来进行降采样操作;
  4. 卷积后对参数进行正则化;
  5. 为防止过拟合,在卷积后加入dropout。
import torch.nn as nnclass conv(nn.Module):def __init__(self, in_c, out_c, dropout):super(conv, self).__init__()self.conv = nn.Sequential(nn.Conv2d(in_c, out_c, (1, 3), padding=(0, 1)),nn.BatchNorm2d(out_c),nn.ReLU(),nn.Conv2d(out_c, out_c, (3, 1), padding=(1, 0)),  nn.Dropout(dropout),nn.BatchNorm2d(out_c),nn.ReLU(),nn.Conv2d(out_c, out_c, (3, 3), stride=(2, 2)),  nn.Dropout(dropout),nn.BatchNorm2d(out_c),nn.ReLU())def forward(self, x):return self.conv(x)class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.conv2d = nn.Sequential(conv(3, 48, 0.3),  # 47nn.Conv2d(48, 96, (1, 1)),conv(96, 96, 0.3),  # 22nn.Conv2d(96, 192, (1, 1)),conv(192, 192, 0.3),  # 5nn.Conv2d(192, 384, (1, 1)),conv(384, 384, 0.3),  # 3nn.Conv2d(384, 768, (1, 1)),conv(768, 768, 0.3),  # 2nn.MaxPool2d(2))self.linear = nn.Sequential(nn.Linear(768, 1))def forward(self, x):x = self.conv2d(x)x = x.view(x.shape[0], -1)output = self.linear(x)return output

训练和验证

  1. 采用BCEWithLogitsLoss()作为损失函数;
  2. 采用Adam()优化
import time
import torch
from torch import optim, nn
from torch.utils.data import DataLoader
from make_dataset import CatDogDataset
from define_net import Netdevice = "cuda:0" if torch.cuda.is_available() else "cpu"file_path = "F:/train_data/cat_dog/"class TrainTestProcess:"""训练数据集"""def __init__(self, batch_size):# 实例化网络、数据集、优化器和损失函数super(TrainTestProcess, self).__init__()self.net = Net().to(device)  # 实例化卷积神经网络self.batch_size = batch_size# 处理数据集train_dataset = CatDogDataset(file_path, True)self.train_dataloader = DataLoader(train_dataset, batch_size=self.batch_size,shuffle=True, drop_last=True)test_dataset = CatDogDataset(file_path, False)self.test_dataloader = DataLoader(test_dataset, batch_size=self.batch_size,shuffle=True, drop_last=True)# 定义优化器和损失函数self.optimizer = optim.Adam(self.net.parameters())self.loss_func = nn.BCEWithLogitsLoss()def __call__(self, epochs=1):for epoch in range(epochs):total_loss = 0.total_test_loss = 0.total_score = 0.total_test_score = 0.start_time = time.time()# 训练for _, (train_data, train_label, label_onehot) in enumerate(self.train_dataloader):train_data, train_label, label_onehot = train_data.to(device), \train_label.to(device), label_onehot.to(device)predict = self.net(train_data)predict = predict.reshape(-1)loss = self.loss_func(predict, train_label)# 反向传播三件套self.optimizer.zero_grad()loss.backward()self.optimizer.step()total_loss += loss.detach().item()# 求正确率predict_argmax = torch.round_(torch.sigmoid(predict))score = torch.sum(torch.eq(train_label, predict_argmax))total_score += scoreavg_loss = total_loss / len(self.train_dataloader)accuracy = total_score / (len(self.train_dataloader) * self.batch_size)epoch_time = time.time() - start_timeprint("Train###epoch:{}\tloss:{:.4f}\taccuracy:{:.4f}\tuse time:{:.4f}".format( \epoch, avg_loss, accuracy, epoch_time))# 验证for _, (test_data, test_label, label_onehot) in enumerate(self.test_dataloader):test_data, test_label, label_onehot = test_data.to(device), \test_label.to(device), label_onehot.to(device)test_predict = self.net(test_data)# sigmoid_test_predict = nn.sigmoid(test_predict)test_predict = test_predict.reshape(-1)test_loss = self.loss_func(test_predict, test_label)total_test_loss += test_loss.detach().item()# 求正确率test_predict_argmax = torch.round_(torch.sigmoid(test_predict))test_score = torch.sum(torch.eq(test_label, test_predict_argmax))total_test_score += test_scoretest_avg_loss = total_test_loss / len(self.test_dataloader)test_accuracy = total_test_score / (len(self.test_dataloader) * self.batch_size)print("Test####epoch:{}\tloss:{:.4f}\taccuracy:{:.4f}".format( \epoch, test_avg_loss, test_accuracy))torch.save(self.net.state_dict(), "./checkpoint/weights{}.pt".format(epoch))if __name__ == '__main__':train_process = TrainTestProcess(batch_size=20)train_process(epochs=300)

总结与不足之处

  1. 未采用增样操作,训练结果较不如人意;
  2. 采用越多的卷积核提取的特征越多,效果越好;
  3. 网络深度越深,提取的特征越抽象,视野域越大,提取的特征越大;
  4. 网络深度太深的缺点是视野域太大,会忽略掉小的目标;
  5. 采用步长降采样能达到和池化一样的效果。

使用卷积神经网络处理猫狗识别数据集_v1相关推荐

  1. 基于卷积神经网络的猫狗识别

    卷积神经网络的猫狗识别 任务需求 环境配置 识别猫狗实例 首先导入库 数据预处理: 读取数据: 定义网络: 调整机器学习率 定义训练过程 训练开始 训练结果 用于测试代码 结果 任务需求 按照 htt ...

  2. 【实战】kaggle猫狗大战-卷积神经网络实现猫狗识别

    卷积神经网络:猫狗识别 目录 第一步:导入数据集 第二步:数据预处理 第三步:迁移学习 第四步:模型保存 第五步:模型融合 第一步:导入数据集 kaggle猫狗大战数据集地址:kaggle # 将ka ...

  3. TensorFlow 卷积神经网络之猫狗识别(二)

    本文是TensorFlow 卷积神经网络之猫狗识别 的姊妹篇,是加载上一篇博客训练好的模型,进行猫狗识别 本文逻辑: 我从网上下载了十几张猫和狗的图片,用于检验我们训练好的模型. 处理我们下载的图片 ...

  4. 基于卷积神经网络的猫狗识别系统的设计与实现

    1.1 题目的主要研究内容 (1)工作的主要描述 通过卷积网络实现猫狗图像的识别.首先,在数据集中抽取训练集和测试集:其次,对图像进行预处理和特征提取,对图像数据进行图像增强,将图像从.jpg格式转化 ...

  5. 卷积神经网络的猫狗识别

    文章目录 一.准备工作 二.猫狗识别 2.1.下载数据集 2.1.1. 图片分类 2.1.2.图片数量统计 2.2.卷积神经网络CNN 2.2.1.网络模型搭建 2.2.2.图像生成器读取文件中数据 ...

  6. 第十二章 卷积神经网络实战--猫狗识别

    1.介绍 我们已经学习了如何用传统的神经网络进行机器学习,在本章我们学习一下如何使用简单的神经网络进行图像分类.数据集用的是Kaggle的猫狗数据集.这里只有前100张,如果需要更多的可以去Kaggl ...

  7. 毕设:基于CNN卷积神经网络的猫狗识别、狗品种识别(Tensorflow、Keras、Kaggle竞赛)

    基于卷积神经网络的图像识别算法及其应用研究 毕业快一年了,拿出来分享给大家,我和网上唯一的区别就是,我能够同时实现两个方案(猫狗识别和狗品种识别),我当时也是网上各种查,花了2,3个月的时间,一个萝卜 ...

  8. Pytorch基于卷积神经网络的猫狗识别

    实验环境 Pytorch 1.4.0 conda 4.7.12 Jupyter Notebook 6.0.1 Python 3.7 数据集介绍 实验采用的猫和狗的图片来自 Kaggle 竞赛的一个赛题 ...

  9. (人工智能)基于卷积神经网络的猫狗识别

    目录 一.实验条件 二.狗猫数据集的分类实验 1.运行程序:根据命名对图片分类 2.统计图片数量 三.猫狗分类的实例 1.导入相应的库 2.设置超参数 3.图像处理与图像增强 4.读取数据集和导入数据 ...

最新文章

  1. 用Qt写软件系列五:一个安全防护软件的制作(2)
  2. 【Python学习系列二十八】绘图库pyecharts
  3. 源码分享,仿英雄联盟对战游戏!
  4. python echo(msg) 字符串_[宜配屋]听图阁
  5. linux 杀掉php,Linux_在Linux系统中使用xkill命令杀掉未响应的进程,我们如何在Linux中杀掉一个资 - phpStudy...
  6. 性能测试组件CodeBenchmark V2发布
  7. 6004.ubuntu18.04移植qgroundcontrol地面站
  8. WCF项目中出现常见错误的解决方法:基础连接已经关闭: 连接被意外关闭
  9. java实现微信公众平台中的字典排序
  10. Java进阶: springmvc已经引入jar包仍报错lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ObjectMapper
  11. Julia : 又一次 ”协变“ 中招!
  12. 基于51单片机的循迹小车
  13. 【学习笔记】尚硅谷-AJAX
  14. 3DMax的Vray模型如何导入到Unity
  15. 全国各地市统计年鉴汇总2021
  16. 数字逻辑实验五 七人表决器
  17. 《动手学深度学习》入门环境安装
  18. SSM框架整合详细教程
  19. Python数据分析与展示-图像的手绘效果
  20. 【MobaXterm】设置 黑夜模式和白天模式

热门文章

  1. Windows10右键—新建(没有Microsoft Word或者没有Microsoft Excel、Microsof tPowerPoint)
  2. Hishop.5.2.2网店,商城商业版安装包
  3. 第1讲:SAS基本介绍
  4. 统信UOS 20 1050 记录一次openssl升级失败的排查过程
  5. 学习笔记14--障碍物检测之基于激光雷达的障碍物检测及基于视觉和激光雷达融合的障碍物检测
  6. HCIP Datacom - 821 题库(一)
  7. hexo+yilia添加网站运行时间,ICP备案信息,设定站点建立时间
  8. 入党对程序员有什么用_入职薪资对程序员的发展影响有多大?
  9. 移动端-仿B站页面练习
  10. Graph Contrastive Learning with Adaptive Augmentation