热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

pytorch猫狗大战项目代码

pytorch猫狗大战-项目代码各位看官老爷,小白我知道pytorch的这个猫狗大战的代码真是漫天都是,这基本上也就是一个helloworld的程序。我

                               pytorch猫狗大战-项目代码



各位看官老爷,小白我知道pytorch的这个猫狗大战的代码真是漫天都是,这基本上也就是一个hello world的程序。我这个代码也是从《pytorch 机器学习从入门到实践》一书中摘出来了。对于初学者来说(像小白我)这本书还是不错的,难能可贵的是,它良心的在github上给出了代码。如果各位看官也有这本书的话,一定不要直接敲书中的代码,而是要结合着github上的代码再敲。因为这本书中的印刷的代码有缩进错误和一些疏漏的地方。有时照着这个书中的代码敲是会报错的。书中的代码只是一个核心代码的参考。我这也是敲过之后的感悟,现在就直接贴出这个hello word代码,本人亲测是可以运行的通的。感兴趣的大神就运行一下吧。




0. 前提:

已经下载了kaggle中的猫狗数据集,这个注册是需要翻墙的,但是好在国内的网盘中有很多已经下好的数据集可以直接使用。


1. 数据预处理代码

将下载好的数据集中的trainzip处理成一个小的数据集,并且区分出train和test比例为0.95和0.05。并将其中的猫狗图像进行归一化处理

import os, shutil
import numpy as np
import pdbrandom_state = 42
np.random.seed(random_state)original_dataset_dir = './data/CAT-DOG/train' #这是我的train的路径可以换成你的
total_num = int(len(os.listdir(original_dataset_dir)) / 2)
random_idx = np.array(range(total_num))
np.random.shuffle(random_idx)
base_dir = 'cats_and_dogs_small'
if not os.path.exists(base_dir):os.mkdir(base_dir)sub_dirs = ['train', 'test']
animals = ['cats', 'dogs']
train_idx = random_idx[: int(total_num * 0.9)]
test_idx = random_idx[int(total_num * 0.9) :]
numbers = [train_idx, test_idx]
for idx, sub_dir in enumerate(sub_dirs):dir = os.path.join(base_dir, sub_dir)if not os.path.exists(dir):os.mkdir(dir)for animal in animals:animal_dir = os.path.join(dir, animal)if not os.path.exists(animal_dir):os.mkdir(animal_dir)fnames = [animal[: -1]+ '.{}.jpg'.format(i) for i in numbers[idx]]for fname in fnames:src = os.path.join(original_dataset_dir, fname)dst = os.path.join(animal_dir,fname)shutil.copyfile(src, dst)print(dir + 'total images : %d'%(len(os.listdir(animal_dir))))

 2. 自己设计的网络中的训练和测试代码

这部分代码在书中是存在部分问题的,但是我这是修改后的能够运行的代码

from __future__ import print_function, division
import shutil
import torch
import os
import torch.nn as nn
import torch.nn.functional as F
from torch.autograd import Variable
import numpy as np
from torch.utils.data import Dataset, DataLoader
from torchvision import transforms, datasets, utils
from torch.utils.data import DataLoader
import torch.optim as optimtorch.manual_seed(1)
epochs = 10
batch_size = 4
num_workers = 4
use_gpu = torch.cuda.is_available()data_transform = transforms.Compose([transforms.Scale(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean = [0.485, 0.456, 0.406], std = [0.229, 0.224, 0.225])])train_dataset = datasets.ImageFolder(root = 'cats_and_dogs_small/train/', transform = data_transform)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size = batch_size, shuffle = True, num_workers = num_workers)
test_dataset = datasets.ImageFolder(root = 'cats_and_dogs_small/test/', transform=data_transform)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size = batch_size, shuffle=True, num_workers = num_workers)class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.conv1 = nn.Conv2d(3, 6, 5)self.maxpool = nn.MaxPool2d(2, 2)self.conv2 = nn.Conv2d(6, 16, 5)self.fc1 = nn.Linear(16 * 53 * 53, 1024)self.fc2 = nn.Linear(1024, 512)self.fc3 = nn.Linear(512, 2)def forward(self, x):x = self.maxpool(F.relu(self.conv1(x)))x = self.maxpool(F.relu(self.conv2(x)))x = x.view(-1, 16 * 53 * 53)x = F.relu(self.fc1(x))x = F.relu(self.fc2(x))x = self.fc3(x)return x
if use_gpu:net = Net().cuda()
else:net = Net()
print(net)cirterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.0001, momentum=0.9)net.train()
for epoch in range(epochs):running_loss = 0.0train_correct = 0train_total = 0for i, data in enumerate(train_loader, 0):inputs, train_labels = dataif use_gpu:inputs, labels = Variable(inputs.cuda()), Variable(train_labels.cuda())else:inputs, labels = Variable(inputs), Variable(train_labels)optimizer.zero_grad()outputs = net(inputs)_, train_predicted = torch.max(outputs.data, 1)train_correct += (train_predicted == labels.data).sum()loss = cirterion(outputs, labels)loss.backward()optimizer.step()running_loss += loss.item()train_total += train_labels.size(0)print('train %d epoch loss: %.3f acc: %.3f '% (epoch + 1, running_loss / train_total, 100 * train_correct / train_total))correct = 0test_loss = 0.0test_total = 0net.eval()for data in test_loader:images, labels = dataif use_gpu:images, labels = Variable(images.cuda()), Variable(labels.cuda())else:images, labels = Variable(images), Variable(labels)outputs = net(images)_, predicted = torch.max(outputs.data, 1)loss = cirterion(outputs, labels)test_loss += loss.item()test_total += labels.size(0)correct += (predicted == labels.data).sum()print('test %d epoch loss: %.3f acc: %.3f' % (epoch + 1, test_loss / test_total, 100 * correct / test_total))

2. 迁移学习用resnet网络进行训练和预测的代码

# coding=utf-8from __future__ import print_function, division
import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torch.autograd import Variable
from torch.utils.data import Dataset
from torchvision import transforms, datasets, models# 配置参数
random_state = 1
torch.manual_seed(random_state) # 设置随机数种子,确保结果可重复
torch.cuda.manual_seed(random_state)
torch.cuda.manual_seed_all(random_state)
np.random.seed(random_state)
# random.seed(random_state)epochs = 10 # 训练次数
batch_size = 4 # 批处理大小
num_workers = 4 # 多线程的数目
use_gpu = torch.cuda.is_available()
# 对加载的图像作归一化处理, 并裁剪为[224x224x3]大小的图像
data_transform = transforms.Compose([transforms.Scale(256),transforms.CenterCrop(224),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])# 数据的批处理,尺寸大小为batch_size,
# 在训练集中,shuffle 必须设置为True, 表示次序是随机的
train_dataset = datasets.ImageFolder(root='cats_and_dogs_small/train/', transform=data_transform)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True, num_workers=num_workers)test_dataset = datasets.ImageFolder(root='cats_and_dogs_small/test/', transform=data_transform)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=batch_size, shuffle=True, num_workers=num_workers)# 创建模型class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.conv1 = nn.Conv2d(3, 6, 5)self.maxpool = nn.MaxPool2d(2, 2)self.conv2 = nn.Conv2d(6, 16, 5)self.fc1 = nn.Linear(16 * 53 * 53, 1024)self.fc2 = nn.Linear(1024, 512)self.fc3 = nn.Linear(512, 2)def forward(self, x):x = self.maxpool(F.relu(self.conv1(x)))x = self.maxpool(F.relu(self.conv2(x)))x = x.view(-1, 16 * 53 * 53)x = F.relu(self.fc1(x))x = F.relu(self.fc2(x))x = self.fc3(x)return x# 加载resnet18 模型,
net = models.resnet18(pretrained=False)
num_ftrs = net.fc.in_features
net.fc = nn.Linear(num_ftrs, 2) # 更新resnet18模型的fc模型,if use_gpu:net = net.cuda()
print(net)
# 定义loss和optimizer
cirterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.0001, momentum=0.9)# 开始训练
net.train()
for epoch in range(epochs):running_loss = 0.0train_correct = 0train_total = 0for i, data in enumerate(train_loader, 0):inputs, train_labels = dataif use_gpu:inputs, labels = Variable(inputs.cuda()), Variable(train_labels.cuda())else:inputs, labels = Variable(inputs), Variable(train_labels)# inputs, labels = Variable(inputs), Variable(train_labels)optimizer.zero_grad()outputs = net(inputs)_, train_predicted = torch.max(outputs.data, 1)# import pdb# pdb.set_trace()train_correct += (train_predicted == labels.data).sum()loss = cirterion(outputs, labels)loss.backward()optimizer.step()running_loss += loss.item()train_total += train_labels.size(0)print('train %d epoch loss: %.3f acc: %.3f ' % (epoch + 1, running_loss / train_total, 100 * train_correct / train_total))# 模型测试correct = 0test_loss = 0.0test_total = 0test_total = 0net.eval()for data in test_loader:images, labels = dataif use_gpu:images, labels = Variable(images.cuda()), Variable(labels.cuda())else:images, labels = Variable(images), Variable(labels)outputs = net(images)_, predicted = torch.max(outputs.data, 1)loss = cirterion(outputs, labels)test_loss += loss.item()test_total += labels.size(0)correct += (predicted == labels.data).sum()print('test %d epoch loss: %.3f acc: %.3f ' % (epoch + 1, test_loss / test_total, 100 * correct / test_total))

 希望各位看官敲代码愉快!

 


推荐阅读
  • 深入浅出TensorFlow数据读写机制
    本文详细介绍TensorFlow中的数据读写操作,包括TFRecord文件的创建与读取,以及数据集(dataset)的相关概念和使用方法。 ... [详细]
  • 本文介绍了一种根据目标检测结果,从原始XML文件中提取并分析特定类别的方法。通过解析XML文件,筛选出特定类别的图像和标注信息,并保存到新的文件夹中,以便进一步分析和处理。 ... [详细]
  • Redux入门指南
    本文介绍Redux的基本概念和工作原理,帮助初学者理解如何使用Redux管理应用程序的状态。Redux是一个用于JavaScript应用的状态管理库,特别适用于React项目。 ... [详细]
  • 云函数与数据库API实现增删查改的对比
    本文将深入探讨使用云函数和数据库API实现数据操作(增删查改)的不同方法,通过详细的代码示例帮助读者更好地理解和掌握这些技术。文章不仅提供代码实现,还解释了每种方法的特点和适用场景。 ... [详细]
  • 并发编程 12—— 任务取消与关闭 之 shutdownNow 的局限性
    Java并发编程实践目录并发编程01——ThreadLocal并发编程02——ConcurrentHashMap并发编程03——阻塞队列和生产者-消费者模式并发编程04——闭锁Co ... [详细]
  • JavaScript中的数组是数据集合的核心结构之一,内置了多种实用的方法。掌握这些方法不仅能提高开发效率,还能显著提升代码的质量和可读性。本文将详细介绍数组的创建方式及常见操作方法。 ... [详细]
  • 本文介绍如何在Grafana配置面板时,使用JSONNet获取数组中特定元素的位置,并将其应用于动态服务查询。 ... [详细]
  • 本文旨在探讨如何利用决策树算法实现对男女性别的分类。通过引入信息熵和信息增益的概念,结合具体的数据集,详细介绍了决策树的构建过程,并展示了其在实际应用中的效果。 ... [详细]
  • 微信小程序中实现位置获取的全面指南
    本文详细介绍了如何在微信小程序中实现地理位置的获取,包括通过微信官方API和腾讯地图API两种方式。文中不仅涵盖了必要的准备工作,如申请开发者密钥、下载并配置SDK等,还提供了处理用户授权及位置信息获取的具体代码示例。 ... [详细]
  • 利用Python实现自动化群发邮件
    本文详细介绍如何使用Python语言来实现邮件的自动群发功能,适合希望提高工作效率的技术爱好者和开发者。 ... [详细]
  • iTOP4412开发板QtE5.7源码编译指南
    本文详细介绍了如何在iTOP4412开发板上编译QtE5.7源码,包括所需文件的位置、编译器设置、触摸库编译以及QtE5.7的完整编译流程。 ... [详细]
  • sqlserver动态分区方案例子
    sqlserver动态分区方案例子当我们存储的数据量比较大时,比如超过千万,上亿级别时单纯的使用索引可能效果不明显了,此时我们可以考虑采 ... [详细]
  • window下kafka的安装以及测试
    目录一、安装JDK(需要安装依赖javaJDK)二、安装Kafka三、测试参考在Windows系统上安装消息队列kafka一、安装JDKÿ ... [详细]
  • 在Win10上利用VS2015构建Caffe2环境
    本文详细介绍如何在Windows 10操作系统上通过Visual Studio 2015编译Caffe2深度学习框架的过程。包括必要的软件安装、环境配置以及常见问题的解决方法。 ... [详细]
  • 本文探讨了在渗透测试中信息收集阶段使用的几种端口扫描技术,包括nmap、masscan、socket、telnet及nc等工具的应用与比较。 ... [详细]
author-avatar
小小的dream
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有