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

利用PyTorch快速实现分类任务

关于如何快速定义自己的数据集,可以参考我的前一篇文章PyTorch中快速加载自定义数据(入门)_晨曦473的博客-CSDN博客刚开始学习P

关于如何快速定义自己的数据集,可以参考我的前一篇文章PyTorch中快速加载自定义数据(入门)_晨曦473的博客-CSDN博客刚开始学习PyTorch,找了很多自定义数据加载的方法,还是使用torch中封装的库函数好用,而且快捷,会根据路径自动返回对应的标签,下面的代码每一行都给了注释。import torchfrom torchvision import transforms, utilsfrom torchvision import datasetsimport torch.utils.dataimport matplotlib.pyplot as plt# 定义图像预处理transform1 = tranhttps://blog.csdn.net/weixin_55737425/article/details/122958584

这里给出一个模板,适合想要快速实现的朋友们(想要快速做出效果),不需要多少理论知识,只需要将文中的文件地址更改为自己的电脑上的地址即可。(注意图片的保存方式有一定的格式,详细可以查阅ImageFolder函数的用法)

此处每一行的代码都已经标记缘由和作用,如果还有疑惑,欢迎垂询问题!

import random
from torch.utils.data import DataLoader
from torchvision.models import resnet50
from imutils import paths
import torch.nn as nn
from torch import optim
import numpy
from torchvision import transforms, utils
import torch
from torchvision import datasets
import matplotlib.pyplot as pltdef load_data():transform1 = transforms.Compose([ # 这里最好加上一个中括号,否则会被认为是意外实参transforms.RandomResizedCrop(224),transforms.RandomHorizontalFlip(p=0.5), # 随机水平翻转,概率为0.3transforms.RandomVerticalFlip(p=0.5), # 随机垂直翻转,概率为0.3# transforms.CenterCrop((400, 400)),transforms.ToTensor(), # 转换成Tensor类型transforms.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.255)) # 这里是为了和官方文档保持一致])batch_size = 8train_data = datasets.ImageFolder(r"C:\Users\asus\Desktop\cnn_data\cnn_data\data\training_data", transform=transform1)# print(train_data.imgs)# 加载数据train_data = DataLoader(train_data, batch_size=batch_size, shuffle=True)return train_data# def im_convert(tensor): # 这里可以不用理睬,我是想要显示原来图片的
# image = tensor
# image = image.numpy().squeeze()
# image = image.transpose(1, 2, 0)
# iamge = image*numpy.array(0.229, 0.224, 0.255) + numpy.array(0.485, 0.456, 0.406)
# image = image.clip(0, 1)
# return imagedef train(train_data):lr = 0.0001EPOCH = 12 # 可以自己调整,多一点会更好,但十分耗时间device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # 利用GPU进行训练model = resnet50(pretrained=True).to(device) # 此处使用迁移学习的方法预加载权重,此处会下载一段时间model.train() # 设置运行模式in_channel = model.fc.in_features # 获取全连接层中输入的维数model.fc = nn.Linear(in_channel, 2) # 重新赋值全连接层criterion = nn.CrossEntropyLoss().to(device) # 分类问题使用交叉熵的方法optimizer = torch.optim.SGD(model.parameters(), lr=lr, momentum=0.9) # 也可以使用Adam,效果也好,momentum根据文献资料,0.9为最优选择scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=2, gamma=0.1) # 每经历2个epoch就衰减十分之一,也可以自己选择running_loss = 0for epoch in range(0, EPOCH):correct = 0for i, (data, target) in enumerate(train_data, 1):data = torch.autograd.Variable(data).to(device)target = torch.autograd.Variable(target).to(device)optimizer.zero_grad() # 清空上一次的梯度值output = model(data)loss = criterion(output, target)running_loss = loss.item()loss.backward()optimizer.step()prediction = torch.argmax(output, dim=1) # 返回维度为dim上最大值的索引correct += (prediction == target).sum().item() # 当prediction==target时会返回“1”,predicton和target在此处都是tensor类型,所以返回的是“tensor(1)”,之后通过item返回数值if i % 2 == 0:print("第{}个EPOCH,第{}个batch,当前损失为{}".format(epoch+1, i, running_loss))print("本轮训练的准确率为{:}".format(correct/len(train_data)))
if __name__ == '__main__':train_data = load_data()train(train_data)


推荐阅读
  • 本文为Codeforces 1294A题目的解析,主要讨论了Collecting Coins整除+不整除问题。文章详细介绍了题目的背景和要求,并给出了解题思路和代码实现。同时提供了在线测评地址和相关参考链接。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 【论文】ICLR 2020 九篇满分论文!!!
    点击上方,选择星标或置顶,每天给你送干货!阅读大概需要11分钟跟随小博主,每天进步一丢丢来自:深度学习技术前沿 ... [详细]
  • 都会|可能会_###haohaohao###图神经网络之神器——PyTorch Geometric 上手 & 实战
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了###haohaohao###图神经网络之神器——PyTorchGeometric上手&实战相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
author-avatar
漫湾镇团委
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有