pytorch实现猫狗分类+数据集
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实现猫狗分类+数据集相关推荐
- Pytorch+CNN+猫狗分类实战
文章目录 0.前言 1.猫狗分类数据集 1.1数据集下载(可选部分) 1.2数据集分析 2.猫狗分类数据集预处理 2.1训练集和测试集划分 2.2训练集和测试集读取 3.剩余代码 4.总结 0.前言 ...
- 基于Pytorch的猫狗分类
无偿分享~ 猫狗二分类文件下载地址 在下一章说 猫狗分类这个真是困扰我好几天,找了好多资料都是以TensorFlow的猫狗分类,但我们要求的是以pytorch的猫狗分类.刚开始我找到了也 ...
- 基于Pytorch实现猫狗分类
基于Pytorch实现猫狗分类 一.环境配置 二.数据集准备 三.猫狗分类的实例 四.实现分类预测测试 五.参考资料 一.环境配置 1.环境使用 Anaconda 2.配置Pytorch pip in ...
- PyTorch基础-猫狗分类实战-10
训练模型并保存 import torch import torch.nn as nn import torch.optim as optim from torchvision import datas ...
- 使用Tensorflow 2进行猫狗分类识别
使用Tensorflow 2进行猫狗分类识别 本文参照了大佬Andrew Ng的所讲解的Tensorflow 2视频所写,本文将其中只适用于Linux的功能以及只适用于Google Colab的功能改 ...
- 使用卷积神经网络实现猫狗分类任务
一.数据集下载链接 二.基础环境配置 三.训练及测试过程 使用卷积神经网络在猫狗分类数据集上实现分类任务. 一.数据集下载链接 猫狗分类数据集链接 → 提取码:1uwy. 二.基础环境配置 W ...
- AlexNet 实现猫狗分类(keras and pytorch)
AlexNet 实现猫狗分类 前言 在训练网络过程中遇到了很多问题,先在这里抱怨一下,没有硬件条件去使用庞大的ImageNet2012 数据集 .所以在选择合适的数据集上走了些弯路,最后选择有kagg ...
- 【深度学习】ResNet残差网络 ResidualBlock残差块实现(pytorch) | 跟着李沐学AI笔记 | ResNet18进行猫狗分类
文章目录 前言 一.卷积的相关计算公式(复习) 二.残差块ResidualBlock复现(pytorch) 三.残差网络ResNet18复现(pytorch) 四.直接调用方法 五.具体实践(ResN ...
- 【CNN】搭建AlexNet网络——并处理自定义的数据集(猫狗分类)
前言 2012年,AlexNet横空出世.它首次证明了学习到的特征可以超越手工设计的特征.它一举打破了计算机视觉研究的现状. AlexNet使用了8层卷积神经网络,并以很大的优势赢得了2012年Ima ...
- 【学习笔记】pytorch迁移学习-猫狗分类实战
1.迁移学习入门 什么是迁移学习:在深度神经网络算法的引用过程中,如果我们面对的是数据规模较大的问题,那么在搭建好深度神经网络模型后,我们势必要花费大量的算力和时间去训练模型和优化参数,最后耗费了这么 ...
最新文章
- 《精通自动化测试框架设计》目录—导读
- docker逃逸 从Play-with-Docker容器逃逸到Docker主机
- 逆向学习技术!拆解驱动器,学习布局走线技术
- Unable to generate a temporary class (result=1)解决方法
- hadoop自定义key,value
- 使用 Tye 辅助开发 k8s 应用竟如此简单(四)
- Silverlight 计时器
- 你最喜欢哪款游戏的界面风格,为什么?
- 扫雷游戏计算机版,扫雷经典版电脑版
- 蓝桥杯 -罗马数字问题
- UnityShader学习教程之<StandardShader>
- idea切换工作目录后无法重启问题记录
- 消息:阿里巴巴落户山东济南,注册资本1亿元
- 基于SQLite的信息管理系统
- DellR240服务器U盘引导,【dell uefi u盘引导】dellr730配置uefi引导_dell uefi启动
- 已知三角形三边长求面积java_已知三角形三点坐标求三角形面积.java
- 国际宏观变化20221204
- Hibernate第三讲:Hibernate主键策略和Hibernate的查询方案
- kodi与hdplayer_将Kodi中的电影收藏与电影集合并
- 项目实训2021.07.07