猫狗识别


数据集下载:

  网盘链接:https://pan.baidu.com/s/1SlNAPf3NbgPyf93XluM7Fg

  提取密码:hpn4


1. 要导入的包

import os
import time
import numpy as np import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.utils.data import DataLoader
from torch.utils import data
from torchvision import transforms as T
from PIL import Image

import

2. 模型配置

###################################
# SETTINGS
################################### class Config(object): batch_size = 32
max_epoch = 30
num_workers = 2
lr = 0.001
lr_decay = 0.95
weight_decay = 0.0001 train_data_root = '/home/dong/Documents/DATASET/train'
test_data_root = '/home/dong/Documents/DATASET/test' load_dict_path = None opt = Config()

SETTINGS

3. 选择DEVICE

device = 'cuda:0' if torch.cuda.is_available() else 'cpu'

4. 数据集

###################################
# DATASETS
################################### class DogCatDataset(data.Dataset): def __init__(self, root, transforms=None, train=True, test=False): super(DogCatDataset, self).__init__() imgs = [os.path.join(root, img) for img in os.listdir(root)] np.random.seed(10000)
np.random.permutation(imgs) len_imgs = len(imgs) self.test = test # -----------------------------------------------------------------------------------------
# 因为在猫狗数据集中,只有训练集和测试集,但是我们还需要验证集,因此从原始训练集中分离出30%的数据
# 用作验证集。
# ------------------------------------------------------------------------------------------
if self.test:
self.imgs = imgs
elif train:
self.imgs = imgs[: int(0.7*len_imgs)]
else:
self.imgs = imgs[int(0.7*len_imgs): ] if transforms is None: normalize = T.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]) if self.test or not train:
self.transforms = T.Compose([
T.Scale(224),
T.CenterCrop(224),
T.ToTensor(),
normalize
])
else:
self.transforms = T.Compose([
T.Scale(246),
T.RandomCrop(224),
T.RandomHorizontalFlip(),
T.ToTensor(),
normalize
]) def __getitem__(self, index): # 当前要获取图像的路径
img_path = self.imgs[index] if self.test:
img_label = int(img_path.split('.')[-2].split('/')[-1])
else:
img_label = 1 if 'dog' in img_path.split('/')[-1] else 0 img_data = Image.open(img_path)
img_data = self.transforms(img_data) return img_data, img_label def __len__(self):
return len(self.imgs) train_dataset = DogCatDataset(root=opt.train_data_root, train=True) # train=True, test=False -> 训练集
val_dataset = DogCatDataset(root=opt.train_data_root, train=False) # train=False, test=False -> 验证集
test_dataset = DogCatDataset(root=opt.test_data_root, test=True) # test=True -> 测试集 train_dataloader = DataLoader(dataset=train_dataset,
shuffle=True,
batch_size=opt.batch_size,
num_workers = opt.num_workers)
val_dataloader = DataLoader(dataset=val_dataset,
shuffle=False,
batch_size=opt.batch_size,
num_workers = opt.num_workers)
test_dataloader = DataLoader(dataset=test_dataset,
shuffle=False,
batch_size=opt.batch_size,
num_workers = opt.num_workers)

DATASETS

5. 检查数据集的 shape

# ------------------------------------------------
# CHECKING THE DATASETS
# ------------------------------------------------
print("Training set:")
for images, labels in train_dataloader:
print('Image Batch Dimensions:', images.size())
print('Label Batch Dimensions:', labels.size())
break print("Validation set:")
for images, labels in val_dataloader:
print('Image Batch Dimensions:', images.size())
print('Label Batch Dimensions:', labels.size())
break print("Testing set:")
for images, labels in test_dataloader:
print('Image Batch Dimensions:', images.size())
print('Label Batch Dimensions:', labels.size())
break

eg:

Training set:
Image Batch Dimensions: torch.Size([32, 3, 224, 224])
Label Batch Dimensions: torch.Size([32])
Validation set:
Image Batch Dimensions: torch.Size([32, 3, 224, 224])
Label Batch Dimensions: torch.Size([32])
Testing set:
Image Batch Dimensions: torch.Size([32, 3, 224, 224])
Label Batch Dimensions: torch.Size([32])

6. 模型定义

###################################################
# MODEL
################################################### class AlexNet(nn.Module): def __init__(self, num_classes=2): # num_classes代表数据集的类别数 super(AlexNet, self).__init__() self.features = nn.Sequential(
nn.Conv2d(3, 64, kernel_size=(11, 11), stride=(4, 4), padding=2),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=(3, 3), stride=2), nn.Conv2d(64, 192, kernel_size=5, padding=2),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2), nn.Conv2d(192, 384, kernel_size=3, padding=1),
nn.ReLU(inplace=True), nn.Conv2d(384, 256, kernel_size=3, padding=1),
nn.ReLU(inplace=True), nn.Conv2d(256, 256, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2)
) self.avgpool = nn.AdaptiveAvgPool2d((6, 6)) self.classifers = nn.Sequential(
nn.Dropout(),
nn.Linear(256 * 6 * 6, 4096),
nn.ReLU(inplace=True), nn.Dropout(),
nn.Linear(4096, 4096),
nn.ReLU(inplace=True),
nn.Linear(4096, num_classes),
) def forward(self, x):
x = self.features(x)
x = self.avgpool(x)
x = x.view(x.size(0), 256*6*6)
logits = self.classifers(x)
probas = F.softmax(logits, dim=1)
return logits, probas # 记载模型
def load(self, model_path):
self.load_state_dict(torch.load(model_path)) # 保存模型
def save(self, model_name):
# 状态字典的保存格式:文件名 + 日期时间 .pth
prefix = 'checkpoints/' + model_name + '_'
name = time.strftime(prefix + '%m%d_%H:%M:%S.pth')
torch.save(self.state_dict, name) model = AlexNet()
model = model.to(device)

Model

7. 定义优化器

##############################################
# Optimizer
############################################## # optimizer = torch.optim.Adam(model.parameters(), lr=opt.lr, weight_decay=opt.weight_decay) optimizer = torch.optim.SGD(model.parameters(), lr=opt.lr, momentum=0.8)

Optimizer

8. 计算准确率

# -------------------------------------------
# 计算准确率
# -------------------------------------------
def compute_acc(model, dataloader, device): correct_pred, num_examples = 0, 0 # correct_pred 统计正确预测的样本数,num_examples 统计样本总数
for i, (features, targets) in enumerate(dataloader): features = features.to(device)
targets = targets.to(device) logits, probas = model(features)
_, predicted_labels = torch.max(probas, 1) num_examples += targets.size(0)
assert predicted_labels.size() == targets.size()
correct_pred += (predicted_labels == targets).sum() return correct_pred.float() / num_examples * 100

compute_acc

9. 训练 and 验证

##############################################
# TRAINING and VALIDATION
############################################## cost_list = []
train_acc_list, val_acc_list = [], [] start_time = time.time() for epoch in range(opt.max_epoch): model.train()
for batch_idx, (features, targets) in enumerate(train_dataloader): features = features.to(device)
targets = targets.to(device) optimizer.zero_grad() logits, probas = model(features)
# print(targets.size(), logits.size(), probas.size())
cost = F.cross_entropy(logits, targets)
# cost = torch.nn.CrossEntropyLoss(logits, targets) cost.backward() optimizer.step() cost_list.append(cost.item()) if not batch_idx % 50:
print('Epoch: %03d/%03d | Batch %03d/%03d | Cost: %.4f'
%(epoch+1, opt.max_epoch, batch_idx, len(train_dataloader), cost)) model.eval()
with torch.set_grad_enabled(False): # save memory during inference train_acc = compute_acc(model, train_dataloader, device=device)
val_acc = compute_acc(model, val_dataloader, device=device) print('Epoch: %03d/%03d | Training ACC: %.4f%% | Validation ACC: %.4f%%'
%(epoch+1, opt.max_epoch, train_acc, val_acc)) train_acc_list.append(train_acc)
val_acc_list.append(val_acc) print('Time Elapsed: %.2f min' % ((time.time() - start_time)/60)) print('Total Time Elapsed: %.2f min' % ((time.time() - start_time)/60))

Training and Validation

eg:

Epoch: 001/030 | Batch 000/547 | Cost: 0.6945
Epoch: 001/030 | Batch 050/547 | Cost: 0.6920
Epoch: 001/030 | Batch 100/547 | Cost: 0.6942
Epoch: 001/030 | Batch 150/547 | Cost: 0.6926
Epoch: 001/030 | Batch 200/547 | Cost: 0.6926
Epoch: 001/030 | Batch 250/547 | Cost: 0.6946
Epoch: 001/030 | Batch 300/547 | Cost: 0.6920
Epoch: 001/030 | Batch 350/547 | Cost: 0.6951
Epoch: 001/030 | Batch 400/547 | Cost: 0.6943
Epoch: 001/030 | Batch 450/547 | Cost: 0.6946
Epoch: 001/030 | Batch 500/547 | Cost: 0.6932
Epoch: 001/030 | Training ACC: 51.7657% | Validation ACC: 50.8933%
Time Elapsed: 2.98 min
Epoch: 002/030 | Batch 000/547 | Cost: 0.6926
Epoch: 002/030 | Batch 050/547 | Cost: 0.6931
Epoch: 002/030 | Batch 100/547 | Cost: 0.6915
Epoch: 002/030 | Batch 150/547 | Cost: 0.6913
Epoch: 002/030 | Batch 200/547 | Cost: 0.6908
Epoch: 002/030 | Batch 250/547 | Cost: 0.6964
Epoch: 002/030 | Batch 300/547 | Cost: 0.6939
Epoch: 002/030 | Batch 350/547 | Cost: 0.6914
Epoch: 002/030 | Batch 400/547 | Cost: 0.6941
Epoch: 002/030 | Batch 450/547 | Cost: 0.6937
Epoch: 002/030 | Batch 500/547 | Cost: 0.6948
Epoch: 002/030 | Training ACC: 53.0400% | Validation ACC: 52.2933%
Time Elapsed: 6.00 min
...
Epoch: 030/030 | Batch 000/547 | Cost: 0.1297
Epoch: 030/030 | Batch 050/547 | Cost: 0.2972
Epoch: 030/030 | Batch 100/547 | Cost: 0.2468
Epoch: 030/030 | Batch 150/547 | Cost: 0.1685
Epoch: 030/030 | Batch 200/547 | Cost: 0.3452
Epoch: 030/030 | Batch 250/547 | Cost: 0.3029
Epoch: 030/030 | Batch 300/547 | Cost: 0.2975
Epoch: 030/030 | Batch 350/547 | Cost: 0.2125
Epoch: 030/030 | Batch 400/547 | Cost: 0.2317
Epoch: 030/030 | Batch 450/547 | Cost: 0.2464
Epoch: 030/030 | Batch 500/547 | Cost: 0.2487
Epoch: 030/030 | Training ACC: 89.5314% | Validation ACC: 88.6400%
Time Elapsed: 92.85 min
Total Time Elapsed: 92.85 min

10. 可视化 Loss

plt.plot(cost_list, label='Minibatch cost')
plt.plot(np.convolve(cost_list,
np.ones(200,)/200, mode='valid'),
label='Running average')
plt.ylabel('Cross Entropy')
plt.xlabel('Iteration')
plt.legend()
plt.show()

visualize loss

eg:

11. 可视化 准确率

plt.plot(np.arange(1, opt.max_epoch+1), train_acc_list, label='Training')
plt.plot(np.arange(1, opt.max_epoch+1), val_acc_list, label='Validation') plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.legend()
plt.show()

eg:

 

猫狗识别——PyTorch的更多相关文章

  1. pytorch实现kaggle猫狗识别

    参考:https://blog.csdn.net/weixin_37813036/article/details/90718310 kaggle是一个为开发商和数据科学家提供举办机器学习竞赛.托管数据 ...

  2. 猫狗识别-CNN与VGG实现

    本次项目首先使用CNN卷积神经网络模型进行训练,最终训练效果不太理想,出现了过拟合的情况.准确率达到0.72,loss达到0.54.使用预训练的VGG模型后,在测试集上准确率达到0.91,取得了不错的 ...

  3. 深度学习原理与框架-猫狗图像识别-卷积神经网络(代码) 1.cv2.resize(图片压缩) 2..get_shape()[1:4].num_elements(获得最后三维度之和) 3.saver.save(训练参数的保存) 4.tf.train.import_meta_graph(加载模型结构) 5.saver.restore(训练参数载入)

    1.cv2.resize(image, (image_size, image_size), 0, 0, cv2.INTER_LINEAR) 参数说明:image表示输入图片,image_size表示变 ...

  4. keras猫狗图像识别

    这里,我们介绍的是一个猫狗图像识别的一个任务.数据可以从kaggle网站上下载.其中包含了25000张毛和狗的图像(每个类别各12500张).在小样本中进行尝试 我们下面先尝试在一个小数据上进行训练, ...

  5. 使用pytorch完成kaggle猫狗图像识别

    kaggle是一个为开发商和数据科学家提供举办机器学习竞赛.托管数据库.编写和分享代码的平台,在这上面有非常多的好项目.好资源可供机器学习.深度学习爱好者学习之用.碰巧最近入门了一门非常的深度学习框架 ...

  6. 【猫狗数据集】pytorch训练猫狗数据集之创建数据集

    猫狗数据集的分为训练集25000张,在训练集中猫和狗的图像是混在一起的,pytorch读取数据集有两种方式,第一种方式是将不同类别的图片放于其对应的类文件夹中,另一种是实现读取数据集类,该类继承tor ...

  7. Kaggle系列1:手把手教你用tensorflow建立卷积神经网络实现猫狗图像分类

    去年研一的时候想做kaggle上的一道题目:猫狗分类,但是苦于对卷积神经网络一直没有很好的认识,现在把这篇文章的内容补上去.(部分代码参考网上的,我改变了卷积神经网络的网络结构,其实主要部分我加了一层 ...

  8. paddlepaddle实现猫狗分类

    目录 1.预备工作 1.1 数据集准备 1.2 数据预处理 2.训练 2.1 模型 2.2 定义训练 2.3 训练 3.预测 4.参考文献 声明:这是我的个人学习笔记,大佬可以点评,指导,不喜勿喷.实 ...

  9. Java中如何分析一个案列---猫狗案例为例

    猫狗案例: 具体事务: 猫.狗 共性: 姓名.年龄.吃饭 分析:从具体到抽象 猫: 姓名.年龄--->成员变量 吃饭       ---> 成员方法 构造方法:无参.有参 狗: 姓名.年龄 ...

随机推荐

  1. 转 Fortofy扫描漏洞解决方案

    Log Forging漏洞: 数据从一个不可信赖的数据源进入应用程序. 在这种情况下,数据经由CreditCompanyController.java 的第 53行进入 getParameter(). ...

  2. WPF 枚举使用

    1.model class JX_Unit { public enum SumUnit { KW = 1, L = 2, Kt = 3, } } 2.viewModel public string w ...

  3. MES系统实施4大关键点,您都知道吗?

    MES是制造企业生产管理信息化的核心,能否成功实施和应用MES是企业实现提高生产效率,降低成本等信息化建设目标的关键所在. 但是,对于信息化基础相对薄弱的中国制造企业来说,MES的复杂性使得企业在进行 ...

  4. hadoop 完全分布式集群搭建

    1.在伪分布式基础上搭建,伪分布式搭建参见VM上Hadoop3.1伪分布式模式搭建 2.虚拟机准备,本次集群采用2.8.3版本与3.X版本差别不大,端口号所有差别 192.168.44.10 vmho ...

  5. 2.InfluxDB-InfluxQL基础语法教程--目录

    本文翻译自官网,官方文档地址:(https://docs.influxdata.com/influxdb/v1.7/query_language/data_exploration/) InfluxQL ...

  6. tcpdump 介绍

    tcpdump 是一款强大的网络抓包工具,dump the traffice on anetwork,对网络上的数据包进行截获的包分析工具.熟练掌握 tcpdump 可以方便我们跟踪解决网络丢包,重传 ...

  7. nyoj 1278G: Prototypes analyze 与 二叉排序树(BST)模板

    参考博客:https://blog.csdn.net/stpeace/article/details/9067029 参考博客:https://blog.csdn.net/baidu_35643793 ...

  8. 接口测试 从 0 到 1,用 Jmeter 搭建 HTTP 接口自动化引擎 1.0 版本

    百度网盘地址更新:https://pan.baidu.com/s/13S0WStZpwlbL15IBp_Q-bg 1.已实现功能描述 1.1 框架包含:Jenkins.Ant.Jmeter 1.2 测 ...

  9. LVS(二):四种工作模型

    面试的时候必问这个四种工作模式,因为这几乎是企业里面必用的内容,所以一定要将其理解通透. 一.lvs-nat模式 二.LVS-DR模式(默认) 三.LVS-tun模式 四.LVS-fullnat模式 ...

  10. 201871010135 张玉晶《面向对象程序设计(java)》第十四周学习总结

    项目 内容 这个作业属于哪个过程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/zyja/p/11963 ...