首页 > 其他分享 >机器学习练手项目-猫狗分类器

机器学习练手项目-猫狗分类器

时间:2024-03-15 17:29:36浏览次数:28  
标签:练手 loss 机器 nn self torch 分类器 train import

机器学习练手项目-猫狗分类器

  • 作者简介:一名后端开发人员,每天分享后端开发以及人工智能相关技术,行业前沿信息,面试宝典。
  • 座右铭:未来是不可确定的,慢慢来是最快的。
  • 个人主页极客李华-CSDN博客
  • 合作方式:私聊+
  • 这个专栏内容:用最低价格鼓励和博主一起在寒假打卡高频大厂算法题,连续一个月,提升自己的算法实力,为了算法比赛或者春招。
  • 我的CSDN社区:https://bbs.csdn.net/forums/99eb3042821a4432868bb5bfc4d513a8
  • 微信公众号,抖音,b站等平台统一叫做:极客李华,加入微信公众号领取各种编程资料,加入抖音,b站学习面试技巧,职业规划

猫狗分类器是一个深度学习项目,旨在识别图像中的猫和狗。通过训练神经网络模型,该项目可以从输入的图像中准确地识别出是猫还是狗。这个项目可以应用于许多实际场景,如图像分类、动物识别等。

1. 准备数据集

首先,需要准备一个包含猫和狗图像的数据集。您可以从各种来源收集这些图像数据,例如网络上的图片库或自己的图片文件夹。确保每个类别的图像都放在单独的文件夹中,并将它们命名为相应的类别。

2. 数据预处理

在加载图像数据之前,需要进行一些预处理步骤。这包括调整图像大小、将图像转换为张量以及标准化图像数据。通过torchvision.transforms模块,我们可以方便地实现这些预处理步骤。

import torch
import torchvision.transforms as transforms
from torchvision.datasets import ImageFolder
from torch.utils.data import DataLoader

3. 构建模型

将使用卷积神经网络(CNN)来构建我们的猫狗分类器。CNN是一种在图像识别任务中非常流行的深度学习模型。

import torch.nn as nn
import torch.nn.functional as F

class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()
        # 定义卷积层、池化层和全连接层
        self.conv1 = nn.Conv2d(3, 16, 3, padding=1)
        self.conv2 = nn.Conv2d(16, 32, 3, padding=1)
        self.conv3 = nn.Conv2d(32, 64, 3, padding=1)
        self.pool = nn.MaxPool2d(2, 2)
        self.fc1 = nn.Linear(64 * 8 * 8, 512)
        self.fc2 = nn.Linear(512, 2)

    def forward(self, x):
        # 前向传播函数
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = self.pool(F.relu(self.conv3(x)))
        x = x.view(-1, 64 * 8 * 8)  # 将特征展平为一维向量
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
        return x

4. 训练模型

将使用训练集来训练我们的模型,并使用测试集来评估模型的性能。

import torch.optim as optim

# 实例化模型、定义损失函数和优化器
model = CNN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 训练模型
num_epochs = 10
for epoch in range(num_epochs):
    running_loss = 0.0
    for i, data in enumerate(train_loader, 0):
        inputs, labels = data
        optimizer.zero_grad()
        try:
            outputs = model(inputs)
            loss = criterion(outputs, labels)
            loss.backward()
            optimizer.step()
            running_loss += loss.item()
            if (i+1) % 100 == 0:
                print(f'Epoch [{epoch+1}/{num_epochs}], Iteration [{i+1}/{len(train_loader)}], Loss: {running_loss/100:.4f}')
                running_loss = 0.0
        except Exception as e:
            print(f"Error processing batch {i}:", str(e))
            continue

print('Finished Training')

5. 评估模型

在训练完成后,需要评估模型在测试集上的性能。

model.eval()
correct = 0
total = 0
with torch.no_grad():
    for data in test_loader:
        images, labels = data
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print(f'Accuracy of the network on the {total} test images: {100 * correct / total}%')

完整代码:


import os
import torch
import torchvision.transforms as transforms
from torchvision.datasets import ImageFolder
from torch.utils.data import DataLoader
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
import matplotlib.pyplot as plt
from PIL import Image

# 设置随机种子
torch.manual_seed(42)

# 数据预处理,包括调整大小、转换为张量、以及标准化
transform = transforms.Compose([
    transforms.Resize((64, 64)),  # 将图像调整为 64x64 大小
    transforms.ToTensor(),         # 将图像转换为张量
    transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5])  # 标准化图像数据
])

# 加载训练数据集,使用ImageFolder自动加载图像数据,并应用上面定义的数据预处理
# root参数指定数据集根目录
train_dataset = ImageFolder(root='D:\\系统默认\\桌面\\python\\PetImages\\', transform=transform)

# 计算训练集的大小
train_size = int(0.8 * len(train_dataset))
test_size = len(train_dataset) - train_size

# 划分训练集和测试集
train_dataset, test_dataset = torch.utils.data.random_split(train_dataset, [train_size, test_size])

# 创建数据加载器,用于加载训练集和测试集的数据
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=4, shuffle=False)

# 定义卷积神经网络模型
class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()
        # 定义卷积层
        self.conv1 = nn.Conv2d(3, 16, 3, padding=1)
        self.conv2 = nn.Conv2d(16, 32, 3, padding=1)
        self.conv3 = nn.Conv2d(32, 64, 3, padding=1)
        # 定义池化层
        self.pool = nn.MaxPool2d(2, 2)
        # 定义全连接层
        self.fc1 = nn.Linear(64 * 8 * 8, 512)
        self.fc2 = nn.Linear(512, 2)

    def forward(self, x):
        # 前向传播函数,定义网络结构
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = self.pool(F.relu(self.conv3(x)))
        x = x.view(-1, 64 * 8 * 8)  # 将特征展平为一维向量
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
        return x

# 实例化模型、定义损失函数和优化器
model = CNN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 训练模型
num_epochs = 10
for epoch in range(num_epochs):
    running_loss = 0.0
    for i, data in enumerate(train_loader, 0):
        inputs, labels = data
        optimizer.zero_grad()
        try:
            outputs = model(inputs)
            loss = criterion(outputs, labels)
            loss.backward()
            optimizer.step()
            running_loss += loss.item()
            if (i+1) % 100 == 0:
                print(f'Epoch [{epoch+1}/{num_epochs}], Iteration [{i+1}/{len(train_loader)}], Loss: {running_loss/100:.4f}')
                running_loss = 0.0
        except Exception as e:
            print(f"Error processing batch {i}:", str(e))
            continue

print('Finished Training')

# 保存模型
torch.save(model.state_dict(), 'cat_dog_model.pth')

# 测试模型
model.eval()
correct = 0
total = 0
with torch.no_grad():
    for data in test_loader:
        images, labels = data
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print(f'Accuracy of the network on the {total} test images: {100 * correct / total}%')

  • 运行结果样子
    在这里插入图片描述

想要获取数据集在这个地址里面:GitHub地址

标签:练手,loss,机器,nn,self,torch,分类器,train,import
From: https://blog.csdn.net/qq_51447496/article/details/136745632

相关文章

  • 工匠的发展与兴衰趋势-机器人篇
    这是一篇纯纯调侃的博客,如有雷同纯属意外。之前,写过:从2050回顾2020,职业规划与技术路径(节选)从2050回顾2020,职业规划与技术路径(节选)补充 未来以“工”为主的就业机会趋势是越来越少,也就是从业人员的感受是越来越卷。学生通常最多困惑或者反馈的现象。如果从零搭建一台......
  • 模仿昆虫大脑:高效机器人技术的飞跃
    原文链接:https://www.unite.ai/mimicking-insect-brains-a-leap-forward-in-efficient-robotics/ Inthevastexpanseofnature,someofthemostprofoundinspirationscomefromthesmallestofcreatures.Insects,oftenoverlookedduetotheirdiminutivesize,a......
  • 超低功耗LCD显示段码驱动芯片VKL128 LQFP44 适用于扫地机器人/燃气表-原厂技术支持
    VKL128概述:VKL128是一个点阵式存储映射的LCD驱动器,可支持最大128点(32SEGx4COM)的LCD屏。单片机可通过I2C接口配置显示参数和读写显示数据,可配置4种功耗模式,也可通过关显示和关振荡器进入省电模式。其高抗干扰,低功耗的特性适用于水电气表以及工控仪表类产品。功能特点:•   ......
  • 【10分钟掌握深度学习2】机器学习基础14
    2.30聚类和降维有什么区别与联系?聚类用于找寻数据内在的分布结构,既可以作为一个单独的过程,比如异常检测等等。也可作为分类等其他学习任务的前驱过程。聚类是标准的无监督学习。在一些推荐系统中需确定新用户的类型,但定义“用户类型”却可能不太容易,此时往往可先对原油......
  • rviz上不显示机器人模型(模型只有白色)
    文档中的是base_footprint,需要根据自己所设的坐标系更改,我的改为base_link如何查看自己设的坐标系:这些parent父坐标系就是同时打开rviz后需要更改成base_link......
  • 机器学习 - PyTorch中使用到的名字解释
    Tensor(张量):Tensor是一个类似于NumPy数组的多维数组结构,可以在CPU或GPU上进行并行计算。Tensor是PyTorch中最基本的数据结构。Tensorrepresentsdatainanumericalway.它具有以下几个重要的特点和用途:多维数组:Tensor可以是任意维度的数组,可以是0维(标量),1维(......
  • 如何依赖机器人安装极狐GitLab
    本文作者:徐晓伟GitLab是一个全球知名的一体化DevOps平台,很多人都通过私有化部署GitLab来进行源代码托管。极狐GitLab是GitLab在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。极狐GitLab依赖机器人dependabot-gitlab使用dockercompose安装说明......
  • KUKA机器人后台逻辑功能模块sps
    KUKA机器人的后台逻辑功能体现在其sps.sub文件中,其中功能和其他品牌的机器人一致(详细的说明解释可参考小编另一篇文章FANUC机器人后台逻辑功能),这边对软plc,后台逻辑功能的具体解释不做过多的赘述,下面进入讲解的主题。一、SPS后台逻辑文件的位置在workvisual软件中我们可以看到......
  • 【转载】学术科研无从下手?27 条机器学习避坑指南,让你的论文发表少走弯路
    原作者链接:https://blog.csdn.net/HyperAI/article/details/128866164 内容一览:如果你刚接触机器学习不久,并且未来希望在该领域开展学术研究,那么这份为你量身打造的「避坑指南」可千万不要错过了。关键词:机器学习科研规范学术研究机器学习学术小白,如何优雅避坑坑、让自己的......
  • 【机器学习300问】35、什么是随机森林?
    〇、让我们准备一些训练数据idx0x1x2x3x4y04.34.94.14.75.5013.96.15.95.55.9022.74.84.15.05.6036.64.44.53.95.9146.52.94.74.66.1152.76.74.25.34.81    表格中的x0到x4一共有5个特征,y是目标值只有0,1两个值说明是一个二分类问题。 一、决策树的局限性   ......