PyTorch实现猫狗分类代码

实现环境:python3.7,pytorch,jupyter notebook
数据集: Kaggle网站猫狗分类数据集,训练集包括12500张猫和12500张狗,测试集为12500张猫狗无标签图片,我们需要把训练集的猫狗照片各取出2500张作为验证集。
开始部分代码:导入一些必要的包,os包集成了一些对文件路径及目录进行操作的类,time包是一些和时间相关的方法

import torch
import torchvision
from torch.autograd import Variable
from torchvision import datasets, transforms
import os
import matplotlib.pyplot as plt
%matplotlib inline
import time

数据的载入:读取数据并载入

data_dir = 'DogsVSCats'
data_transform = {x:transforms.Compose([transforms.Scale([64, 64]),transforms.ToTensor()]) for x in ['train', 'valid']}
image_datasets = {x:datasets.ImageFolder(root = os.path.join(data_dir,x),transform = data_transform[x]) for x in ['train', 'valid']}
dataloader = {x:torch.utils.data.DataLoader(dataset = image_datasets[x],batch_size = 16,shuffle = True) for x in ['train', 'valid']}  

数据预览:

# 数据预览
X_example, Y_example = next(iter(dataloader['train']))
print(u'X_example个数{}'.format(len(X_example)))
print(u'Y_example个数{}'.format(len(Y_example)))index_classes = image_datasets['train'].class_to_idx
print(index_classes)example_classes = image_datasets['train'].classes
print(example_classes)img = torchvision.utils.make_grid(X_example)
img = img.numpy().transpose([1,2,0])
print([example_classes[i] for i in Y_example])
plt.imshow(img)
plt.show()

结果:
X_example个数16
Y_example个数16
{‘Cat’: 0, ‘Dog’: 1}
[‘Cat’, ‘Dog’]
[‘Cat’, ‘Cat’, ‘Dog’, ‘Dog’, ‘Dog’, ‘Cat’, ‘Cat’, ‘Dog’, ‘Dog’, ‘Dog’, ‘Cat’, ‘Cat’, ‘Dog’, ‘Cat’, ‘Dog’, ‘Cat’]

构建VGGnet

# 模型搭建  简化了的VGGnet
class Models(torch.nn.Module):def __init__(self):super(Models,self).__init__()self.Conv = torch.nn.Sequential(torch.nn.Conv2d(3, 64, kernel_size = 3, stride = 1, padding = 1),torch.nn.ReLU(),torch.nn.Conv2d(64, 64, kernel_size = 3, stride = 1, padding = 1),torch.nn.ReLU(),torch.nn.MaxPool2d(kernel_size = 2, stride = 2),torch.nn.Conv2d(64, 128, kernel_size = 3, stride = 1, padding = 1),torch.nn.ReLU(),torch.nn.Conv2d(128, 128, kernel_size = 3, stride = 1, padding = 1),torch.nn.ReLU(),torch.nn.MaxPool2d(kernel_size = 2, stride = 2),torch.nn.Conv2d(128, 256, kernel_size = 3, stride = 1, padding = 1),torch.nn.ReLU(),torch.nn.Conv2d(256, 256, kernel_size = 3, stride = 1, padding = 1),torch.nn.ReLU(),torch.nn.Conv2d(256, 256, kernel_size = 3, stride = 1, padding = 1),torch.nn.ReLU(),torch.nn.MaxPool2d(kernel_size = 2, stride = 2),torch.nn.Conv2d(256, 512, kernel_size = 3, stride = 1, padding = 1),torch.nn.ReLU(),torch.nn.Conv2d(512, 512, kernel_size = 3, stride = 1, padding = 1),torch.nn.ReLU(),torch.nn.Conv2d(512, 512, kernel_size = 3, stride = 1, padding = 1),torch.nn.ReLU(),torch.nn.MaxPool2d(kernel_size = 2, stride = 2))self.Classes = torch.nn.Sequential(torch.nn.Linear(4*4*512, 1024),torch.nn.ReLU(),torch.nn.Dropout(p = 0.5),torch.nn.Linear(1024, 1024),torch.nn.ReLU(),torch.nn.Dropout(p = 0.5),torch.nn.Linear(1024, 2))def forward(self, inputs):x = self.Conv(inputs)x = x.view(-1, 4*4*512)x = self.Classes(x)return x
model = Models()
print(model)

模型训练

loss_f = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(),lr = 0.00001)Use_gpu = torch.cuda.is_available()
if Use_gpu:model = model.cuda()epoch_n = 10
time_open = time.time()for epoch in range(epoch_n):print('epoch{}/{}'.format(epoch,epoch_n-1))print('-'*10)for phase in ['train','valid']:if phase == 'train':print('training...')model.train(True)else:print('validing...')model.train(False)running_loss = 0.0running_corrects = 0.0for batch,data in enumerate(dataloader[phase],1):X,Y = dataX,Y = Variable(X).cuda(),Variable(Y).cuda()y_pred = model(X)_,pred = torch.max(y_pred.data,1)optimizer.zero_grad()loss = loss_f(y_pred,Y)if phase == 'train':loss.backward()optimizer.step()running_loss += loss.data.item()running_corrects += torch.sum(pred == y.data)if batch%500 == 0 and phase =='train':print('batch{},trainLoss;{:.4f},trainAcc:{:.4f}'.format(batch,running_loss/bath,100*running_corrects/(16*batch)))epoch_loss = running_loss *16/len(image_datasets[phase])epoch_acc = 100*running_corrects/len(image_datasets[phase])print('{} Loss:{:.4f} Acc:{:.4f}%'.format(phase,epoch_loss,epoch_acc))time_end = time.time()-time_openprint(time_end)

补充:验证集划分程序,并将划分后的猫狗类别区分(略辣鸡)

import os
import random
import shutil
from tqdm import tqdmdef move(src_path,cat_path,dog_path):All_files = os.listdir(src_path)    #读取原路径下的所有文件,即图片length = len(All_files)cat,dog,i = 0,0,0while i < 5000:number = random.randint(0,length)   #生成随机数img_name = All_files[number]        #从图片中随机选择一个图片name = img_name.split('.')[0]   #根据图片名按 '.'分成段,如cat.1.jpg,即'cat','1','jpg'  0对应'cat',以此类推try:        #加报警检测机制,如果有重复的,不报错直接跳过if name == 'cat':      if cat < 2500:shutil.move(src_path + '\\' +img_name, cat_path) #剪切到目标路径cat = cat + 1length = length - 1     #成功剪切一次后,总数减1i = i + 1else:if dog < 2500:shutil.move(src_path + '\\' +img_name, dog_path)dog = dog + 1length = length - 1i = i + 1if cat == 2500 & dog ==2500:breakexcept shutil.Error:i = i - 1   #若剪切不成功,则此次不加1continueif __name__ == "__main__":move("D:\Data\\train",       #原目标文件夹"D:\Data\cat",        #猫"D:\Data\dog")        #狗

备注
猫狗分类数据集:
链接:https://pan.baidu.com/s/1pNKPcOb062npE85NFX_ccw
提取码:tfh0

pytorch实现猫狗分类+数据集相关推荐

  1. Pytorch+CNN+猫狗分类实战

    文章目录 0.前言 1.猫狗分类数据集 1.1数据集下载(可选部分) 1.2数据集分析 2.猫狗分类数据集预处理 2.1训练集和测试集划分 2.2训练集和测试集读取 3.剩余代码 4.总结 0.前言 ...

  2. 基于Pytorch的猫狗分类

    无偿分享~ 猫狗二分类文件下载地址 在下一章说        猫狗分类这个真是困扰我好几天,找了好多资料都是以TensorFlow的猫狗分类,但我们要求的是以pytorch的猫狗分类.刚开始我找到了也 ...

  3. 基于Pytorch实现猫狗分类

    基于Pytorch实现猫狗分类 一.环境配置 二.数据集准备 三.猫狗分类的实例 四.实现分类预测测试 五.参考资料 一.环境配置 1.环境使用 Anaconda 2.配置Pytorch pip in ...

  4. PyTorch基础-猫狗分类实战-10

    训练模型并保存 import torch import torch.nn as nn import torch.optim as optim from torchvision import datas ...

  5. 使用Tensorflow 2进行猫狗分类识别

    使用Tensorflow 2进行猫狗分类识别 本文参照了大佬Andrew Ng的所讲解的Tensorflow 2视频所写,本文将其中只适用于Linux的功能以及只适用于Google Colab的功能改 ...

  6. 使用卷积神经网络实现猫狗分类任务

    一.数据集下载链接 二.基础环境配置 三.训练及测试过程   使用卷积神经网络在猫狗分类数据集上实现分类任务. 一.数据集下载链接   猫狗分类数据集链接 → 提取码:1uwy. 二.基础环境配置 W ...

  7. AlexNet 实现猫狗分类(keras and pytorch)

    AlexNet 实现猫狗分类 前言 在训练网络过程中遇到了很多问题,先在这里抱怨一下,没有硬件条件去使用庞大的ImageNet2012 数据集 .所以在选择合适的数据集上走了些弯路,最后选择有kagg ...

  8. 【深度学习】ResNet残差网络 ResidualBlock残差块实现(pytorch) | 跟着李沐学AI笔记 | ResNet18进行猫狗分类

    文章目录 前言 一.卷积的相关计算公式(复习) 二.残差块ResidualBlock复现(pytorch) 三.残差网络ResNet18复现(pytorch) 四.直接调用方法 五.具体实践(ResN ...

  9. 【CNN】搭建AlexNet网络——并处理自定义的数据集(猫狗分类)

    前言 2012年,AlexNet横空出世.它首次证明了学习到的特征可以超越手工设计的特征.它一举打破了计算机视觉研究的现状. AlexNet使用了8层卷积神经网络,并以很大的优势赢得了2012年Ima ...

  10. 【学习笔记】pytorch迁移学习-猫狗分类实战

    1.迁移学习入门 什么是迁移学习:在深度神经网络算法的引用过程中,如果我们面对的是数据规模较大的问题,那么在搭建好深度神经网络模型后,我们势必要花费大量的算力和时间去训练模型和优化参数,最后耗费了这么 ...

最新文章

  1. 《精通自动化测试框架设计》目录—导读
  2. docker逃逸 从Play-with-Docker容器逃逸到Docker主机
  3. 逆向学习技术!拆解驱动器,学习布局走线技术
  4. Unable to generate a temporary class (result=1)解决方法
  5. hadoop自定义key,value
  6. 使用 Tye 辅助开发 k8s 应用竟如此简单(四)
  7. Silverlight 计时器
  8. 你最喜欢哪款游戏的界面风格,为什么?
  9. 扫雷游戏计算机版,扫雷经典版电脑版
  10. 蓝桥杯 -罗马数字问题
  11. UnityShader学习教程之<StandardShader>
  12. idea切换工作目录后无法重启问题记录
  13. 消息:阿里巴巴落户山东济南,注册资本1亿元
  14. 基于SQLite的信息管理系统
  15. DellR240服务器U盘引导,【dell uefi u盘引导】dellr730配置uefi引导_dell uefi启动
  16. 已知三角形三边长求面积java_已知三角形三点坐标求三角形面积.java
  17. 国际宏观变化20221204
  18. Hibernate第三讲:Hibernate主键策略和Hibernate的查询方案
  19. kodi与hdplayer_将Kodi中的电影收藏与电影集合并
  20. 项目实训2021.07.07

热门文章

  1. 也许下一个倾家荡产的就是你
  2. AD9的PCB技巧——封装的更新
  3. cad插入块_多重插入块加密CAD图纸怎么分解
  4. SonarLint 默认扫描规则
  5. php 开发商城 注意,thinkPHP商城公告功能开发问题分析
  6. 直接选择排序到堆排序做的那些改进
  7. Java中的注释方法
  8. HanLP Demo(学习笔记)
  9. 【前端 教程】详解 立即执行函数
  10. linux救黑砖手机,手机黑砖9006/9008救砖教程 通用救砖模式详细流程