基于Pytorch实现猫狗分类

1. 导入相应的库

import torch.nn.functional as F
import torch.optim as optim
import torch
import torch.nn as nn
import torch.nn.parallel

import torch.optim
import torch.utils.data
import torch.utils.data.distributed
import torchvision.transforms as transforms
import torchvision.datasets as datasets

1. 设置超参数

BATCH_SIZE = 20

EPOCHS = 10

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

1. 图像处理与图像增强

transform = transforms.Compose([
transforms.Resize(100),
transforms.RandomVerticalFlip(),
transforms.RandomCrop(50),
transforms.RandomResizedCrop(150),
transforms.ColorJitter(brightness=0.5, contrast=0.5, hue=0.5),
transforms.ToTensor(),
transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
])

1. 读取数据集和导入数据

dataset_train = datasets.ImageFolder('E:\\Cat_And_Dog\\kaggle\\cats_and_dogs_small\\train', transform)

print(dataset_train.imgs)

print(dataset_train.class_to_idx)

dataset_test = datasets.ImageFolder('E:\\Cat_And_Dog\\kaggle\\cats_and_dogs_small\\validation', transform)

print(dataset_test.class_to_idx)


1. 定义网络模型

class ConvNet(nn.Module):
def __init__(self):
super(ConvNet, self).__init__()
self.conv1 = nn.Conv2d(3, 32, 3)
self.max_pool1 = nn.MaxPool2d(2)
self.conv2 = nn.Conv2d(32, 64, 3)
self.max_pool2 = nn.MaxPool2d(2)
self.conv3 = nn.Conv2d(64, 64, 3)
self.conv4 = nn.Conv2d(64, 64, 3)
self.max_pool3 = nn.MaxPool2d(2)
self.conv5 = nn.Conv2d(64, 128, 3)
self.conv6 = nn.Conv2d(128, 128, 3)
self.max_pool4 = nn.MaxPool2d(2)
self.fc1 = nn.Linear(4608, 512)
self.fc2 = nn.Linear(512, 1)

def forward(self, x):
in_size = x.size(0)
x = self.conv1(x)
x = F.relu(x)
x = self.max_pool1(x)
x = self.conv2(x)
x = F.relu(x)
x = self.max_pool2(x)
x = self.conv3(x)
x = F.relu(x)
x = self.conv4(x)
x = F.relu(x)
x = self.max_pool3(x)
x = self.conv5(x)
x = F.relu(x)
x = self.conv6(x)
x = F.relu(x)
x = self.max_pool4(x)

x = x.view(in_size, -1)
x = self.fc1(x)
x = F.relu(x)
x = self.fc2(x)
x = torch.sigmoid(x)
return x

modellr = 1e-4

model = ConvNet().to(DEVICE)


1. 调整学习率
def adjust_learning_rate(optimizer, epoch):

"""Sets the learning rate to the initial LR decayed by 10 every 30 epochs"""
modellrnew = modellr * (0.1 ** (epoch // 5))
print("lr:",modellrnew)
for param_group in optimizer.param_groups:
param_group['lr'] = modellrnew

1. 定义训练过程

def train(model, device, train_loader, optimizer, epoch):

model.train()
for batch_idx, (data, target) in enumerate(train_loader):

data, target = data.to(device), target.to(device).float().unsqueeze(1)

output = model(data)

loss = F.binary_cross_entropy(output, target)

loss.backward()

optimizer.step()

if (batch_idx + 1) % 10 == 0:

print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(

epoch, (batch_idx + 1) * len(data), len(train_loader.dataset),

100. * (batch_idx + 1) / len(train_loader), loss.item()))

model.eval()

test_loss = 0

correct = 0

data, target = data.to(device), target.to(device).float().unsqueeze(1)

output = model(data)

test_loss += F.binary_cross_entropy(output, target, reduction='mean').item()
pred = torch.tensor([[1] if num[0] >= 0.5 else [0] for num in output]).to(device)
correct += pred.eq(target.long()).sum().item()

print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(

1. 定义保存模型和训练

for epoch in range(1, EPOCHS + 1):

torch.save(model, 'E:\\Cat_And_Dog\\kaggle\\model.pth')


1. 准备预测的图片
2. 进行测试
from __future__ import print_function, division
from PIL import Image

from torchvision import transforms
import torch.nn.functional as F

import torch
import torch.nn as nn
import torch.nn.parallel

class ConvNet(nn.Module):
def __init__(self):
super(ConvNet, self).__init__()
self.conv1 = nn.Conv2d(3, 32, 3)
self.max_pool1 = nn.MaxPool2d(2)
self.conv2 = nn.Conv2d(32, 64, 3)
self.max_pool2 = nn.MaxPool2d(2)
self.conv3 = nn.Conv2d(64, 64, 3)
self.conv4 = nn.Conv2d(64, 64, 3)
self.max_pool3 = nn.MaxPool2d(2)
self.conv5 = nn.Conv2d(64, 128, 3)
self.conv6 = nn.Conv2d(128, 128, 3)
self.max_pool4 = nn.MaxPool2d(2)
self.fc1 = nn.Linear(4608, 512)
self.fc2 = nn.Linear(512, 1)

def forward(self, x):
in_size = x.size(0)
x = self.conv1(x)
x = F.relu(x)
x = self.max_pool1(x)
x = self.conv2(x)
x = F.relu(x)
x = self.max_pool2(x)
x = self.conv3(x)
x = F.relu(x)
x = self.conv4(x)
x = F.relu(x)
x = self.max_pool3(x)
x = self.conv5(x)
x = F.relu(x)
x = self.conv6(x)
x = F.relu(x)
x = self.max_pool4(x)

x = x.view(in_size, -1)
x = self.fc1(x)
x = F.relu(x)
x = self.fc2(x)
x = torch.sigmoid(x)
return x

model_save_path = 'E:\\Cat_And_Dog\\kaggle\\model.pth'

transform_test = transforms.Compose([
transforms.Resize(100),
transforms.RandomVerticalFlip(),
transforms.RandomCrop(50),
transforms.RandomResizedCrop(150),
transforms.ColorJitter(brightness=0.5, contrast=0.5, hue=0.5),
transforms.ToTensor(),
transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
])

class_names = ['cat', 'dog']

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

model.eval()

image_PIL = Image.open('E:\\Cat_And_Dog\\kaggle\\cats_and_dogs_small\\test\\cats\\cat.1500.jpg')

image_tensor = transform_test(image_PIL)

image_tensor.unsqueeze_(0)

image_tensor = image_tensor.to(device)

out = model(image_tensor)
pred = torch.tensor([[1] if num[0] >= 0.5 else [0] for num in out]).to(device)
print(class_names[pred])

1. 预测结果

从实际训练过程来看，总体准确率不高。经过测试发现，该模型只能识别猫，却误判了狗。
[En]

From the actual training process, the overall accuracy is not high. After testing, it is found that the model can only identify cats, but misjudge dogs.

Original: https://blog.csdn.net/qq_43279579/article/details/117606669
Author: HarrietLH
Title: 基于Pytorch实现猫狗分类

正文

M = ( c o s ( θ ) − s i n ( θ ) s i n ( θ ) c o s ( θ ) ) M= \begin{pmatrix} cos(\theta) & -sin(\theta) \ sin(\theta) & cos(\theta) \end{pmatrix}M =(cos (θ)s in (θ)​−s in (θ)cos (θ)​)

opencv的特点就是如此虽然图片的直观表现上是逆时针旋转，但是由于原点的位置关系，想要达到该效果需要顺时针旋转矩阵。

M = ( c o s ( θ ) − s i n ( θ ) ( 1 − c o s ( θ ) ) × x c e n t e r + s i n ( θ ) × y c e n t e r s i n ( θ ) c o s ( θ ) − s i n ( θ ) × x c e n t e r + ( 1 − c o s ( θ ) ) × y c e n t e r ) M= \begin{pmatrix} cos(\theta) & -sin(\theta) & (1-cos(\theta))\times x_{center}+sin(\theta)\times y_{center}\ sin(\theta) & cos(\theta) & -sin(\theta)\times x_{center}+(1-cos(\theta))\times y_{center} \end{pmatrix}M =(cos (θ)s in (θ)​−s in (θ)cos (θ)​(1 −cos (θ))×x ce n t er ​+s in (θ)×y ce n t er ​−s in (θ)×x ce n t er ​+(1 −cos (θ))×y ce n t er ​​)

• 旋转中心
• 旋转角度
• 旋转后的缩放比例
具体在程序中如何表现请看下述代码：
import cv2
import matplotlib.pyplot as plt

rows, cols = img.shape[:2]

M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 45, 1)

res1 = cv2.warpAffine(img, M, (cols, rows))

plt.subplot(121)
plt.imshow(img)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.title('原图')
plt.axis(False)
plt.subplot(122)
plt.imshow(res1)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.title('绕中心点旋转的图像')
plt.axis(False)
plt.show()


拓展

import cv2
import matplotlib.pyplot as plt
import numpy as np

rows, cols = img.shape[:2]

M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 45, 1)

cos = np.abs(M[0, 0])
sin = np.abs(M[0, 1])
new_w = rows * sin + cols * cos
new_h = rows * cos + cols * sin
M[0, 2] += (new_w - cols) * 0.5
M[1, 2] += (new_h - rows) * 0.5
w = int(np.round(new_w))
h = int(np.round(new_h))
res2 = cv2.warpAffine(img, M, (w, h))

plt.subplot(121)
plt.imshow(img)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.title('原图')
plt.axis(False)
plt.subplot(122)
plt.imshow(res2)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.title('绕中心点旋转的图像')
plt.axis(False)
plt.show()


; 结束

Original: https://blog.csdn.net/qq_44109682/article/details/117434461
Author: K . U . I
Title: cv2.getRotationMatrix2D()

(0)

大家都在看

• [python] 3D医学数据增强 示例+代码

3D医学数据增强 示例+代码 3D医学数据 * 数据增强库 数据可视化 原始图片 数据增强操作 * Resize Randomcorp Pad Normalize Crop Fli…

人工智能 2022年11月22日
082
• 【毕业设计系列】016：数字图像车牌识别技术研究及其Matlab实现

Date: 2019-4-15 前言 1、车牌识别技术概述 1.1、车牌检测 1.2、车牌识别 2、Matlab实现 3、实现效果图 前言 车牌识别属于数字图像处理在交通行业的典型…

2022年9月1日
0141
• CANopen协议 学习笔记

大纲 前沿：以问题为导向学习是最高效的，本文主要讲述在学习Canopen协议中的一些疑惑点， 分享一些学习心得，不讲协议本身的内容。 1.主机和从机的概念？ 2.PDO和SDO的区…

人工智能 2022年11月26日
067
• 数组的定义与使用

文章目录 数组的基本概念 * 为什么要使用数组 什么是数组 数组的创建及初始化 – 数组的创建 数组的初始化 数组的使用 – 数组中元素的访问 遍历数组 数…

人工智能 2022年11月26日
039
• python-sklearn数据分析-线性回归和支持向量机（SVM）回归预测（实战）

人工智能 2022年12月1日
049

文章目录 前言 一、opencv cv::adaptiveThreshold()函数 * 1.函数原型： 2.参数说明： 3.函数原理： 代码示例 前言 从以下复杂背景图片下提取划…

人工智能 2022年12月12日
062
• pandas的导出csv文件的函数是_Pandas之csv文件对列行的相关操作

1.Pandas对数据某一列删除 1.删除列 import pandas as pd df = pd.read_csv(file) axis=1就是删除列 df.drop([&#8…

人工智能 2022年12月4日
068
• 谈谈事件相机在自动驾驶领域的应用前景

在自动驾驶仪的发展过程中，视觉算法的应用已成为不可或缺的一部分。然而，目前的视觉算法仍然存在一些局限性：一方面，摄像头容易受到明暗、背光等突变的影响；另一方面，当摄像头运行时，产生…

2022年8月31日
0640
• 从TensorFlow到DL4J——主流深度学习框架对比分析

从TensorFlow到DL4J——主流深度学习框架对比分析 2022年2月22日 极链AI云官网地址 点击注册更多AI小知识，关注《极链AI云》公众号 文章目录 从TensorF…

2022年9月2日
065
• 人工智能导论–基于神经网络的模式识别实验

实验3 基于神经网络的模式识别实验 一、实验目的： 理解BP神经网络和卷积神经网络的结构和原理，掌握反向传播学习算法对神经元的训练过程，了解反向传播公式。通过构建BP神经网络和卷积…

人工智能 2022年12月7日
041
• 东北大学大数据班机器学习大作业——印度房价预测

目录 1 、项目背景. 3 2 、实验描述. 3 3 、实验目的. 3 4 、实验环境. 3 5、实验原理. 4 5.1 决策树. 4 5.2 随机森林. 4 5.3 数据预处理与…

人工智能 2022年12月20日
064
• docker搭建Elasticsearch、Kibana、Logstash 同步mysql数据到ES

一、前言 在数据量大的企业级实践中， Elasticsearch显得非常常见，特别是数据表超过千万级后，无论怎么优化，还是有点力不从心！使用中，最首先的问题就是怎么把千万级数据同步…

人工智能 2022年11月26日
055
• 2D目标检测论文大盘点（37篇）

文章目录 * – 1.LeNet – 2.AlexNet – 3.VGGNet – 4.OverFeat – 5.Goo…

人工智能 2022年12月5日
051
• 强化学习—— 多智能体强化学习

强化学习—— 多智能体强化学习 1. 多智能体关系分类 * 1.1 合作关系（Fully Cooperative） 1.2 竞争关系（Fully Competitive） 1.3 …

2022年8月27日
0137
• 散点图和柱状图相结合，厉害了

说到X轴Y轴是不是第一反应就想到数学几何坐标题，其实呢在数据可视化平台中常用的数据图表中也占有一席之地那就是 散点图。那什么是散点图呢？ 分析若干数据，通过X轴和Y轴判断两变量之间…

人工智能 2022年12月10日
060
• 机器学习期末考试

机器学习期末考试 一、机器学习链接 1、机器学习期末复习试卷_zhouyan2000的博客-CSDN博客_机器学习期末考试} 2、机器学习笔试题 3、机器学习面试题 4、一天1个机…

人工智能 2022年12月18日
047