转载:https://magolor.cn/2020/01/14/2020-01-14-blog-01/

Kaggle 猫狗识别比赛地址:https://www.kaggle.com/c/dogs-vs-cats-redux-kernels-edition/

上不到的也可以用我用PanDownload搜出来的:

链接:https://pan.baidu.com/s/1eUULKk-w3c8nNh8iBv-x-g 
提取码:lywk

电脑配置:

CPU:i5-4590 3.30GHz

内存:8GB

显卡:影驰GTX1050Ti 4GB

运行环境:

PyCharm Professional 2019.3

Python 3.7.4

anaconda 4.8.2

torch 1.4.0

torchvision 0.5.0

import torch
import torch.nn as nn
import torch.optim as optim
import torch.utils.data as data
import matplotlib.pyplot as plt
import torchvision.transforms as transforms
from PIL import Image
import pandas as pd
import numpy as np
import math
import time
import os
import gc# Configurations
torch.cuda.empty_cache()
INPUT_PATH = "D:\\PythonWork"
OUTPUT_PATH = "D:\\PythonWork"
ORIGIN_DATA_SIZE = 12500
TARGET_DATA_SIZE = 12500
RATIO = 0.99
EPOCH = 10
BATCH_SIZE = 2
LOSS_FUNC = nn.BCELoss()
LR = 0.0001
SWITCH = 3
UPDATE = 5
TRANSFORM = transforms.Compose([transforms.Resize((256,256)),transforms.RandomCrop((224,224)),transforms.ToTensor(),transforms.Normalize((0.485,0.456,0.406),(0.229,0.224,0.225))])
PARAMETERS = ""class ImageDataset(data.Dataset):def __init__(self, image_list, label_list):self.data = image_listself.label = label_listdef __getitem__(self, index):global TRANSFORMimg = Image.open(self.data[index])data = TRANSFORM(img)img.close()return data.cuda(),torch.cuda.FloatTensor([self.label[index]])def __len__(self):return len(self.data)class VGG(nn.Module):def __init__(self, name="11"):super(VGG, self).__init__()self.name = "VGG"+nameself.conv = nn.Sequential()i = 1; p = 1self.conv.add_module('conv-{0}'.format(i),nn.Conv2d(in_channels=  3, out_channels= 64, kernel_size=3, stride=1, padding=1))self.conv.add_module('ReLU-{0}'.format(i),nn.ReLU());i+=1if name in ["13","16-1","16","19"]:self.conv.add_module('conv-{0}'.format(i),nn.Conv2d(in_channels= 64, out_channels= 64, kernel_size=3, stride=1, padding=1))self.conv.add_module('ReLU-{0}'.format(i),nn.ReLU());i+=1if name in ["11-LRN"]:self.conv.add_module('LRN',nn.LocalResponseNorm(size=2))self.conv.add_module('MaxPooling-{0}'.format(p),nn.MaxPool2d(kernel_size=2, stride=2));p+=1   # 224 -> 112self.conv.add_module('conv-{0}'.format(i),nn.Conv2d(in_channels= 64, out_channels=128, kernel_size=3, stride=1, padding=1))self.conv.add_module('ReLU-{0}'.format(i),nn.ReLU());i+=1if name in ["13","16-1","16","19"]:self.conv.add_module('conv-{0}'.format(i),nn.Conv2d(in_channels=128, out_channels=128, kernel_size=3, stride=1, padding=1))self.conv.add_module('ReLU-{0}'.format(i),nn.ReLU());i+=1self.conv.add_module('MaxPooling-{0}'.format(p),nn.MaxPool2d(kernel_size=2, stride=2));p+=1   # 112 -> 56self.conv.add_module('conv-{0}'.format(i),nn.Conv2d(in_channels=128, out_channels=256, kernel_size=3, stride=1, padding=1))self.conv.add_module('ReLU-{0}'.format(i),nn.ReLU());i+=1self.conv.add_module('conv-{0}'.format(i),nn.Conv2d(in_channels=256, out_channels=256, kernel_size=3, stride=1, padding=1))self.conv.add_module('ReLU-{0}'.format(i),nn.ReLU());i+=1if name in ["16","19"]:self.conv.add_module('conv-{0}'.format(i),nn.Conv2d(in_channels=256, out_channels=256, kernel_size=3, stride=1, padding=1))self.conv.add_module('ReLU-{0}'.format(i),nn.ReLU());i+=1if name in ["16-1"]:self.conv.add_module('conv-{0}'.format(i),nn.Conv2d(in_channels=256, out_channels=256, kernel_size=1, stride=1, padding=0))self.conv.add_module('ReLU-{0}'.format(i),nn.ReLU());i+=1if name in ["19"]:self.conv.add_module('conv-{0}'.format(i),nn.Conv2d(in_channels=256, out_channels=256, kernel_size=3, stride=1, padding=1))self.conv.add_module('ReLU-{0}'.format(i),nn.ReLU());i+=1self.conv.add_module('MaxPooling-{0}'.format(p),nn.MaxPool2d(kernel_size=2, stride=2));p+=1   # 56 -> 28self.conv.add_module('conv-{0}'.format(i),nn.Conv2d(in_channels=256, out_channels=512, kernel_size=3, stride=1, padding=1))self.conv.add_module('ReLU-{0}'.format(i),nn.ReLU());i+=1self.conv.add_module('conv-{0}'.format(i),nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, padding=1))self.conv.add_module('ReLU-{0}'.format(i),nn.ReLU());i+=1if name in ["16","19"]:self.conv.add_module('conv-{0}'.format(i),nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, padding=1))self.conv.add_module('ReLU-{0}'.format(i),nn.ReLU());i+=1if name in ["16-1"]:self.conv.add_module('conv-{0}'.format(i),nn.Conv2d(in_channels=512, out_channels=512, kernel_size=1, stride=1, padding=0))self.conv.add_module('ReLU-{0}'.format(i),nn.ReLU());i+=1if name in ["19"]:self.conv.add_module('conv-{0}'.format(i),nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, padding=1))self.conv.add_module('ReLU-{0}'.format(i),nn.ReLU());i+=1self.conv.add_module('MaxPooling-{0}'.format(p),nn.MaxPool2d(kernel_size=2, stride=2));p+=1   # 28 -> 14self.conv.add_module('conv-{0}'.format(i),nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, padding=1))self.conv.add_module('ReLU-{0}'.format(i),nn.ReLU());i+=1self.conv.add_module('conv-{0}'.format(i),nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, padding=1))self.conv.add_module('ReLU-{0}'.format(i),nn.ReLU());i+=1if name in ["16","19"]:self.conv.add_module('conv-{0}'.format(i),nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, padding=1))self.conv.add_module('ReLU-{0}'.format(i),nn.ReLU());i+=1if name in ["16-1"]:self.conv.add_module('conv-{0}'.format(i),nn.Conv2d(in_channels=512, out_channels=512, kernel_size=1, stride=1, padding=0))self.conv.add_module('ReLU-{0}'.format(i),nn.ReLU());i+=1if name in ["19"]:self.conv.add_module('conv-{0}'.format(i),nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, padding=1))self.conv.add_module('ReLU-{0}'.format(i),nn.ReLU());i+=1self.conv.add_module('MaxPooling-{0}'.format(p),nn.MaxPool2d(kernel_size=2, stride=2));p+=1   # 14 -> 7self.fc = nn.Sequential(nn.Linear(512*7*7,4096),nn.ReLU(),nn.Dropout(0.5),nn.Linear(4096,4096),nn.ReLU(),nn.Dropout(0.5),nn.Linear(4096,1000),nn.ReLU(),nn.Linear(1000,1),nn.Sigmoid())def forward(self, x):x = self.conv(x)x = x.view(x.shape[0], -1)x = self.fc(x)return xdef train(optimizer):global netglobal EPOCHglobal BATCH_SIZEglobal train_dataglobal validate_dataglobal PROGRAM_STARTprint('['+net.name+'] with optimizer ['+str(type(optimizer))+']:')train_loader = data.DataLoader(train_data, batch_size=BATCH_SIZE, shuffle=True, num_workers=0)validate_loader = data.DataLoader(validate_data, batch_size=1, shuffle=False, num_workers=0)BATCH = len(train_loader)m = len(validate_loader)for epoch in range(EPOCH):EPOCH_START = time.time()print("\\tEpoch #{0}\\{1}:".format(epoch+1,EPOCH))for batch,(x,y) in enumerate(train_loader):optimizer.zero_grad()t = net(x)loss = LOSS_FUNC(t,y)print("\\t\\tBatch #{0}\\{1}: ".format(batch+1,BATCH) + "Loss = %.6f"%float(loss))loss.backward()optimizer.step()with torch.no_grad():L = 0.E = 0.for batch,(x,y) in enumerate(validate_loader):t = net(x)L += float(LOSS_FUNC(t,y))E += float((float(t[0][0])>0.5)!=y)print("\t  Validation Loss = %.6f. Error Rate = %.3f%%"%(L/m,E*100/m))if((epoch+1)%UPDATE==0):torch.save(net.state_dict(),OUTPUT_PATH+"\\{0}[{1}]".format(net.name,epoch+1)+"-L(%.6f)E(%.3f).pt"%(L/m,E*100/m))torch.save(optimizer.state_dict(),OUTPUT_PATH+"\\{0}[{1}]".format(net.name,epoch+1)+"-L(%.6f)E(%.3f)-optimizer.pt"%(L/m,E*100/m))print("\t  Finish epoch #{0}".format(epoch+1)+" in %.4f s."%(time.time()-EPOCH_START)+" Total Time Cost = %.4f s."%(time.time()-PROGRAM_START))def run(filename):global netglobal test_dataprediction = []test_loader = data.DataLoader(test_data, batch_size=1, shuffle=False, num_workers=0)with torch.no_grad():for i,(x,y) in enumerate(test_loader):t = net(x)prediction.append([i+1,float(t[0][0])])submission = pd.DataFrame(prediction)submission.columns = ['id','label']submission.to_csv(filename+".csv",index=0)def load():np.random.seed(998244353)torch.manual_seed(998244353)image_list = []label_list = []for i in range(ORIGIN_DATA_SIZE):image_list.append(INPUT_PATH+"\\train\\cat.{0}.jpg".format(i))label_list.append(0)image_list.append(INPUT_PATH+"\\train\\dog.{0}.jpg".format(i))label_list.append(1)n = int(ORIGIN_DATA_SIZE*2*RATIO)train_data = ImageDataset(image_list[:n],label_list[:n])validate_data = ImageDataset(image_list[n:],label_list[n:])image_list = []for i in range(TARGET_DATA_SIZE):image_list.append(INPUT_PATH+"\\test\\{0}.jpg".format(i+1))test_data = ImageDataset(image_list,[0]*TARGET_DATA_SIZE)# np.random.seed()# torch.seed()return train_data,validate_data,test_dataprint("*****Start")
PROGRAM_START = time.time()
train_data,validate_data,test_data = load()
print("Finish reading data in %.4f s."%(time.time()-PROGRAM_START))
net = VGG("11")
if SWITCH//2==1 and PARAMETERS!="":net.load_state_dict(torch.load(PARAMETERS+".pt"))print("Load Model ["+PARAMETERS+".pt] Success!")
net.cuda()
optimizer = optim.RMSprop(net.parameters(), lr=LR, alpha=0.9)
if SWITCH//2==1 and PARAMETERS!="":optimizer.load_state_dict(torch.load(PARAMETERS+"-optimizer.pt"))print("Load Optimizer ["+PARAMETERS+"-optimizer.pt] Success!")
LOSS_FUNC.cuda()
if SWITCH% 2==1:train(optimizer)
TRANSFORM = transforms.Compose([transforms.Resize((224,224)),transforms.ToTensor(),transforms.Normalize((0.485,0.456,0.406),(0.229,0.224,0.225))])
run(OUTPUT_PATH+"\\{0}".format(net.name))
print("*****Finish")

INPUT_PATH,OUTPUR_PATH是猫狗图片的地址和输出的地址。

EPOCH如果赶时间可以适当改小,原文是15个,我这里改成了10个。

BATCH_SIZE 原文是75,因为我运行的时候报错说显存不够,我直接改成了最小的2,显卡够强的可以适当调高。

SWITCH 来控制程序运行,1表示训练,2表示载入现成模型。那么如果SWITCH=1就训练现成模型然后预测,SWITCH=2就载入现成模型然后预测,SWITCH=3就载入现成模型,训练后预测。

209行的VGG 原文用VGG19,我运行VGG19太慢了,就改成VGG11了。

最终运行的结果,有点丢人,每个EPOCH都要运行11000s,花了一大个下午的时间就这样,所以说电脑不好就不要玩了...

输出的文件也是乱码,暂时没办法查看到什么内容。

另外,点击运行之后,cpu就会飙到100,显存占满,电源使用情况非常高,所以心疼电费也不要搞了...

PyTorch实现猫狗识别VGG相关推荐

  1. 详解pytorch实现猫狗识别98%附代码

    详解pytorch实现猫狗识别98%附代码 前言 一.为什么选用pytorch这个框架? 二.实现效果 三.神经网络从头到尾 1.来源:仿照人为处理图片的流程,模拟人们的神经元处理信息的方式 2.总览 ...

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

    !有需要本项目的实验源码的可以私信博主! 摘要:随着大数据时代的到来,深度学习.数据挖掘.图像处理等已经成为了一个热门研究方向.深度学习是一个复杂的机器学习算法,在语音和图像识别方面取得的效果,远远超 ...

  3. 猫狗识别——PyTorch

    猫狗识别 数据集下载: 网盘链接:https://pan.baidu.com/s/1SlNAPf3NbgPyf93XluM7Fg 提取密码:hpn4 1. 要导入的包 import os import ...

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

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

  5. 基于Pytorch的猫狗分类

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

  6. 使用卷积神经网络处理猫狗识别数据集_v1

    说明 采用pytorch框架实现猫狗识别. 数据集下载 猫狗识别数据集下载: 链接:https://pan.baidu.com/s/1hfzSacJbNBUhcDDtPnzlsg  提取码:fu74 ...

  7. Tensorflow实现kaggle猫狗识别(循序渐进进行网络设计)

    这篇是tensorflow版本,pytorch版本会在下一篇博客给出 友情提示:尽量上GPU,博主CPU上跑一个VGG16花了1.5h... Tensorflow实现kaggle猫狗识别 数据集获取 ...

  8. 基于卷积神经网络(CNN)的猫狗识别

    目录 引言 1.什么是卷积神经网络? 1.1什么是神经网络? 1.2什么是卷积? 2.准备工作 2.1一些知识: 2.2keras 2.3Conv2D 2.4 MaxPooling2D 3.基于卷积神 ...

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

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

最新文章

  1. Ciruy英雄谭 Chapter 3 杂谈
  2. AnyHand——普通摄像头静态手势识别库
  3. 长度最小的子数组--滑动窗口
  4. 使用Jmeter 创建Post请求
  5. 计算机网络 --- 网络层IP数据报
  6. java设置框架位置_怎样设置label的位置啊?求指导
  7. 【报告分享】零售行业三大平台之对比分析-阿里VS京东VS拼多多:分级、竞争、进化.pdf...
  8. Server object instance creation failed on all SOC machines
  9. Linux查看、处理文件方法
  10. MySQL 第六次练习(索引)
  11. 【Axure高保真原型】移动端地图模板
  12. 顺利通过2020年下工信部的系统架构设计师考试,在此感悟一下
  13. python依赖库是什么_【转】python导出依赖库
  14. MIC - 最大信息系数
  15. order by a desc,b desc与order by a,b desc不同
  16. 实例化bean中有@Autowired注解的有参构造函数(二)
  17. Linux常用命令详解(两万字超长文)
  18. AI学习知识点思维导图
  19. fastboot常用指令
  20. StringUtils 工具

热门文章

  1. 微信消息推送 有新发现 进来看
  2. 【转】第三方支付风控体系
  3. python微信api会封号吗_python调用微信api发告警message
  4. Android中的MVC详解
  5. mysql使用联结的好处_Mysql-联结
  6. shell脚本输出颜色
  7. wps office android,WPS Office
  8. wps 文字删除 多个空行
  9. 我与世界杯的故事——达利奇:铜牌闪耀着金光
  10. Android 分区