120种小狗图像傻傻分不清?用fastai训练一个分类器
作者:一杯奶茶的功夫
链接:https://www.jianshu.com/p/ab35ed21df87
程序员转行学什么语言?
https://edu.csdn.net/topic/ai30?utm_source=csdn_bw
这篇文章会讲解如何制作能够分类120种小狗的图像分类器。
这篇文章中所讲述的内容都是基于colab notebook和fastai技术的深度学习的应用。
为什么使用colab?
使用colab的好处是,你不需要有任何显卡GPU,colab中提供了一块免费的k80带12G显存的GPU
colab是google提供的一个免费的Jupyter notebook的环境,可以省去安装它的功夫
为什么使用fastai?
fastai是一种超级简洁的深度学习工具,代码上甚至比当前Keras还要简洁。
底层是pytorch,能够提供高速的处理性能。
和之前文章中的两个物种(猫和狗)的分类略有不同,这次使用的数据集全部是狗,需要把这些狗分到不同的类别中。也就是说,图片之间特征的区别的差异要比之前猫和狗分类的来的更加细微。
好吧,接下来我们看看如何动手制作。
1.在colab的作业本中配置fastai的环境
!curl https://course.fast.ai/setup/colab | bash
2.导入fastai包
from fastai import *
from fastai.vision import *
3.加载kaggle.json
这里我们准备从kaggle下载所需要的狗的数据集,如果你可以从其他地方得到数据集,那么可以省略步骤3和4,按照自己的方法在环境中导入数据集即可。
!mkdir /content/.kaggle/
!mkdir /content/data/dogsbreed/
PATH = "/content/data/dogsbreed/"
from google.colab import files
# load from upload dialog
uploaded = files.upload()
for fn in uploaded.keys():
with open(f'/content/.kaggle/{fn}', 'wb') as f:
f.write(uploaded[fn])
4.安装kaggle环境
!chmod 600 /content/.kaggle/kaggle.json
!pip install kaggle
!cp /content/.kaggle/kaggle.json ~/.kaggle/kaggle.json
!kaggle config set -n path -v{/content}
import kaggle
!kaggle competitions download -p /content/data/dogsbreed/ dog-breed-identification
从结果中可以看到,我们已经从kaggle成功的下载了数据集文件。
5.验证GPU
torch.cuda.is_available()
#True
torch.backends.cudnn.enabled
#True
6.解压缩文件
! cd /content/data/dogsbreed && unzip labels.csv.zip
! cd /content/data/dogsbreed && unzip sample_submission.csv.zip
! cd /content/data/dogsbreed && unzip test.zip
! cd /content/data/dogsbreed && unzip train.zip
7.读取label.csv
labels_df=pd.read_csv(f'{PATH}labels.csv')
labels_df.head()
这里我们可以看到labels.csv中的前五条数据
8.查看狗的类别
labels_df.pivot_table(index='breed',aggfunc=len).sort_values('id',ascending=False)
这里可以看到一共有120行数据,也就是120种狗的类别,以及每种类别里面有多少条数据。
9.加载数据集并显示
data = ImageDataBunch.from_csv(
PATH,
folder='train',
valid_pct=0.2,
ds_tfms=get_transforms(),
size=224,
test='test',
suffix='.jpg',
bs=64).normalize(imagenet_stats)
data.show_batch(rows=3, figsize=(10,12))
如果一切顺利,这里会显示出9张狗的图片,并且图片上方会显示相应的狗的类别。
如果只显示了图片,而图片上的标签不是类别的话,那说明数据导入部分存在问题。
OK,我们继续下一步。
10.下载与训练模型并微调
learner = create_cnn(data,models.resnet101,metrics=[accuracy])
learner.fit_one_cycle(10)
这里我们设置了10个epoch,会稍微花费点时间大约40分钟。
可以看到,在最后一个epoch时候,我们的精度在89%。当然我们还可以继续调优:)
或者直接从零开始对每一层权重的训练,这都是可以的。
到这里我们就已经成功的完成了一个120种狗狗的图片分类器的制作啦,怎么样?是不是很简单?希望这篇文章可以给每一个前来阅读的朋友带来收获,对深度学习,图像分类有一个直接的体会。
如果有问题,欢迎来评论区留言讨论^^
(本文为AI科技大本营转载文章,转载请联系原作者)
.
人工智能的现状及今后发展趋势如何?
https://edu.csdn.net/topic/ai30?utm_source=csdn_bw
群招募
扫码添加小助手微信,回复:公司+研究方向(学校+研究方向),邀你加入技术交流群。技术群审核较严,敬请谅解。
推荐阅读:
2018 Python开发者大调查:Python和JavaScript最配?
十大经典排序算法动画与解析,看我就够了
访问量最高超7百万的Stack Overflow问题竟然是...
算法警告!该图片涉嫌违规不予显示
交易机器人春天已来?先看完这篇再说吧
30 秒?!Chrome 插件带你速成编程学习 | 程序员硬核评测
为什么程序员下班后只关显示器从不关电脑?
全面剖析企业私有云
月入5万,程序员夫人们过上"贵妇"生活了吗?
点击“阅读原文”,查看历史精彩文章。
相关文章:

View_01_LayoutInflater的原理、使用方法
View_01_LayoutInflater的原理、使用方法 本篇博客是郭神博客Android视图状态及重绘流程分析,带你一步步深入了解View(一)的读书笔记的笔记。 LayoutInflater简单介绍 setContentView()内部是使用LayoutInflater来完毕载入布局的。setContent…

【ubuntu】在ubuntu下无法输出拼音输入法中的中括号“【” 和 “】”的解决方法
问题 在新装的ubuntu16.04中,打不出中括号【】,而变成 “”和“「” 解决方法 修改文件/usr/share/fcitx/data/punc.mb.zh_CN sudo vi /usr/share/fcitx/data/punc.mb.zh_CN将18、19行改为如下内容 18 [ 【 19 ] 】

配置数据源和分页
1.tomcat的版本,最好不要是安装版的,要解压缩的,不然无法连接数据源。2.conf》context.xml<Resource name"hotel" auth"Container" type"javax.sql.DataSource" driverClassName"oracle.jdbc.…

售价1万7的华为Mate X很贵吗?
整理 | 琥珀 出品 | AI科技大本营(ID: rgznai100) 60s测试:你是否适合转型人工智能? https://edu.csdn.net/topic/ai30?utm_sourcecxrs_bw 继三星之后,网友们期待已久的华为终于忍不住宣布了一系列重磅消息ÿ…

【C】数组数组初始化总结
C数组初始化总结 发现一个新方法,可以分段初始化数组 eg:int arrayC[MAX_LEN] {[1 … 5]9, [6 … 9] 8}; 代码如下 #include <stdio.h> #define MAX_LEN 10int main (int argc, char *argv[]) { //不初始化,参数值随机分配 //[0][0…

Golang的反射reflect深入理解和示例
[TOC] Golang的反射reflect深入理解和示例 【记录于2018年2月】 编程语言中反射的概念 在计算机科学领域,反射是指一类应用,它们能够自描述和自控制。也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representati…

如何读取多个文件,文件后缀名不一致,不过类似source.1 source.2 source.3等
#include <stdio.h> #include <stdlib.h> //为了使用exit() char *itoa(int num,char *str,int radix); int main() { int ch; FILE* fp; // char fname[50]"scan1.source.2100"; //用于存放文件名 char fname[20]"source."; …

AtCoder Petrozavodsk Contest 001
第一场apc,5H的持久战,我当然水几个题就睡了 A - Two Integers Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement You are given positive integers X and Y. If there exists a positive integer not greater than 1018…

【Qt】使用QCamera获取摄像头,并使用图像视图框架QGraphics*来显示
代码下载 https://download.csdn.net/download/u010168781/10373174 #####头文件 #ifndef CAMERATEST_H#define CAMERATEST_H#include <QMainWindow> #include <QGraphicsView> #include <QKeyEvent> #include <QTimer>namespace Ui { class Camera…

CVPR 2019收录论文ID公开,你上榜了吗?
整理 | 琥珀 出品 | AI科技大本营(ID: rgznai100) 计算机视觉和模式识别大会 CVPR(Conference on Computer Vision and Pattern Recognition)作为人工智能领域计算机视觉方向的重要学术会议,每年都会吸引全球最顶尖的…

什么是 prelink
2019独角兽企业重金招聘Python工程师标准>>> Most programs require libraries to function. Libraries can be integrated into a program once, by a linker, when it is compiled (static linking) or they can be integrated when the program is run by a load…

PythonR爬取分析赶集网北京二手房数据(附详细代码)
本文转载自数据森麟(ID:shujusenlin) 作者介绍:徐涛,19年应届毕业生,专注于珊瑚礁研究,喜欢用R各种清洗数据。 知乎:parkson 如何挑战百万年薪的人工智能! https://edu.csdn.net/t…

【Qt】QCloseEvent的使用小结
问题描述 在程序中使用QCloseEvent时,有时没有反应,没有关闭程序。 原因 经测试只有在界面起来以后,使用event->accept()才能关闭程序 测试如下 在构造函数中调用close() 在构造函数中调用close()时,会触发QCloseEvent事件,但是程序界面没有关闭。 使用按钮触发…

Java反射 - 私有字段和方法
尽管普遍认为通过Java Reflection可以访问其他类的私有字段和方法。 这并不困难。 这在单元测试中可以非常方便。 本文将告诉你如何。 访问私有字段 要访问私有字段,您需要调用Class.getDeclaredField(String name)或Class.getDeclaredFields…

.Net 程序员面试 C# 语言篇 (回答Scott Hanselman的问题)
过去几年都在忙着找项目,赶项目,没有时间好好整理深究自己在工作中学到的东西。现在好了,趁着找工作的这段空余时间,正好可以总结和再继续夯实自己的.Net, C#基本功。在05年的时候,Scott Hanselman(微软的一个Principa…

一个小小的AI训练营竟然卧虎藏龙
年前,我来到了一个近墨者黑的地方,黑的不能再黑。。。这个神秘的组织叫做 21 天入门机器学习训练营。讲真的,当初报名这个训练营,我是冲着机器学习来的,主要是好奇想转型,而且听说这个课程对小白很友好&…

【Qt】QCamera查询和设置摄像头的分辨率
查询和设置摄像头分辨率的API QCamera::supportedViewfinderResolutions() QCamera::setViewfinderSettings() 设置摄像头帧率、比例、分辨率、格式的类:QCameraViewfinderSettings 使用注意事项 查询和设置摄像头分辨率时,需要在摄像头启动后调用&a…
附录G Netty与NettyUtils
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/beliefer/article/details/77450134 注:本文是为了配合《Spark内核设计的艺术 架构设计与实现》一书的内容而编写,目的是为了节省成本、方便读者查阅。…

grails日志系统的研究
对于grails的日志输出,我真的是给弄吐血了。开始以为很简单,后来发现grails封装log4j做的有点太多了,很多东西的封装理解了觉得还挺合理,但是不理解的话真是无比迷茫。对于是否有必要做这么多强制性约束,我保留意见...…

给老婆写个Python教程
作者 | 水风 来源 | 水风知乎问答 如何挑战百万年薪的人工智能! https://edu.csdn.net/topic/ai30?utm_sourcecsdn_bw 什么是code code就是一种语言,一种计算机能读懂的语言。计算机是一个傻逼,他理解不了默认两可的任何东西。比如…

SpringBoot的修改操作
今天学习SpringBoot 的 CRUD 操作,练习 修改操作 时,发生了如下的异常: [nio-8080-exec-7] .m.m.a.ExceptionHandlerExceptionResolver : Resolved exception caused by Handler execution: org.springframework.dao.InvalidDataAccessApiUsa…

【Qt】QImage、QPixmap、QBitmap和QPicture
简述 Qt 提供了四个用于处理图像数据的类: QImage、 QPixmap、 QBitmap和QPicture。QImage是为 I/O 设计和优化的, 用于直接像素访问和操作, 而QPixmap是为在屏幕上显示图像而设计和优化的。QBitmap继承自QPixmap,用在位深为1(黑白图片)上。…

ASP.NET,IIS7.0 上传大视频文件报错
一、问题概述: 最近开发上传视频文件的功能。基本流程已经跑通了,可是上传30M以上的文件时就会报错。 二、资料海洋瞎扑腾 从网上查了一些资料,一般都是下面这种说法: 看着步骤倒是也不算繁琐,可是本人照着步骤做了却没…

【imx6】Unable to find the ncurses libraries的解决办法
问题描述 在执行make menuconfig时,报错: Unable to find the ncurses libraries… 解决方法 安装ncurses和ncursesw库 sudo apt-get insatll ncurses-dev sudo apt-get insatll ncursesw-dev 注意:ncursesw库是ncurses的升级版本&#…

Elasticsearch6.1.3 for CRUD
为什么80%的码农都做不了架构师?>>> 一、创建文档 [root AOS2 AutoTest01:/root]#curl -X PUT 9.1.6.140:9200/students/class1/1?pretty -d > { > "first_name": "changwei", > "last_name": "…

指纹锁就安全了?防火防盗还得防AI
整理 | 一一 出品 | AI科技大本营(ID:rgznai100) 如何挑战百万年薪的人工智能 https://edu.csdn.net/topic/ai30?utm_sourcecsdn_bw 近日,你应该看到了社交媒体上对于网站 ThisPersonDoesNotExist.com,生成无数不存在人脸的铺天…

迪杰斯特拉算法(C语言实现)
迪杰斯特拉算法(C语言实现) 如上图,求以a为源点到个顶点的最短路劲。 #include "stdio.h"#include "stdlib.h"//用一个最大数表示顶点之间不相关#define MAX 999//设置顶点个数#define MAX_VERTEX_NUM 7//表示顶点之间不…

小米半年来最大调整:成立技术委员会,雷军称技术事关生死存亡
整理 | 琥珀出品 | AI科技大本营(ID:rgznai100)昨晚,小米集团组织部下发正式文件,宣布了最新一轮组织架构调整,任命了崔宝秋为集团副总裁,集团技术委员会主席,并且在核心管理岗位上共任命了 14 …

【驱动】在内核源码中添加驱动程序
以wifi驱动(RTL8188EUS驱动)为例 添加源码 将源码rtl8188EUS添加到drivers/net/wireless/rtl818x/目录下 添加Kconfig 在drivers/net/wireless/rtl818x/rtl8188EUS添加Kconfig,内容如下: config RTL8188EUtristate "Realtek 8188E USB WiFi&qu…

怎么让wordpress用sqlite3 搭建轻量级博客系统
wordpress 默认是用mysql作为数据库支持,这个对个人站长来说还是有点麻烦了些。特别是如果以后网站备份迁移就有点事多了。 之前用django开发自己的博客感觉其实用sqlite3作为数据库插好,就是一个文件而已。备份网站,直接打包整个目录即可方便…