当前位置: 首页 > 编程日记 > 正文

120种小狗图像傻傻分不清?用fastai训练一个分类器

640?wx_fmt=jpeg

作者:一杯奶茶的功夫

链接: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

640?wx_fmt=png

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

640?wx_fmt=png

从结果中可以看到,我们已经从kaggle成功的下载了数据集文件。

5.验证GPU

torch.cuda.is_available()
#True
torch.backends.cudnn.enabled
#True

640?wx_fmt=png

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()

640?wx_fmt=png

这里我们可以看到labels.csv中的前五条数据

8.查看狗的类别

labels_df.pivot_table(index='breed',aggfunc=len).sort_values('id',ascending=False)

640?wx_fmt=png

这里可以看到一共有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))

640?wx_fmt=png

如果一切顺利,这里会显示出9张狗的图片,并且图片上方会显示相应的狗的类别。

如果只显示了图片,而图片上的标签不是类别的话,那说明数据导入部分存在问题。

OK,我们继续下一步。

10.下载与训练模型并微调

learner = create_cnn(data,models.resnet101,metrics=[accuracy])
learner.fit_one_cycle(10)

640?wx_fmt=png

这里我们设置了10个epoch,会稍微花费点时间大约40分钟。

可以看到,在最后一个epoch时候,我们的精度在89%。当然我们还可以继续调优:)

或者直接从零开始对每一层权重的训练,这都是可以的。

到这里我们就已经成功的完成了一个120种狗狗的图片分类器的制作啦,怎么样?是不是很简单?希望这篇文章可以给每一个前来阅读的朋友带来收获,对深度学习,图像分类有一个直接的体会。

如果有问题,欢迎来评论区留言讨论^^

(本文为AI科技大本营转载文章,转载请联系原作者)

.

人工智能的现状及今后发展趋势如何? 

https://edu.csdn.net/topic/ai30?utm_source=csdn_bw

群招募

扫码添加小助手微信,回复:公司+研究方向(学校+研究方向),邀你加入技术交流群。技术群审核较严,敬请谅解。

640?wx_fmt=jpeg

推荐阅读:

  • 2018 Python开发者大调查:Python和JavaScript最配?

  • 十大经典排序算法动画与解析,看我就够了

  • 访问量最高超7百万的Stack Overflow问题竟然是...

  • 算法警告!该图片涉嫌违规不予显示

  • 交易机器人春天已来?先看完这篇再说吧

  • 30 秒?!Chrome 插件带你速成编程学习 | 程序员硬核评测

  • 为什么程序员下班后只关显示器从不关电脑?

  • 全面剖析企业私有云

  • 月入5万,程序员夫人们过上"贵妇"生活了吗?

640?wx_fmt=png

点击“阅读原文”,查看历史精彩文章。

相关文章:

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的版本&#xff0c;最好不要是安装版的&#xff0c;要解压缩的&#xff0c;不然无法连接数据源。2.conf》context.xml<Resource name"hotel" auth"Container" type"javax.sql.DataSource" driverClassName"oracle.jdbc.…

售价1万7的华为Mate X很贵吗?

整理 | 琥珀 出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09; 60s测试&#xff1a;你是否适合转型人工智能&#xff1f; https://edu.csdn.net/topic/ai30?utm_sourcecxrs_bw 继三星之后&#xff0c;网友们期待已久的华为终于忍不住宣布了一系列重磅消息&#xff…

【C】数组数组初始化总结

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

Golang的反射reflect深入理解和示例

[TOC] Golang的反射reflect深入理解和示例 【记录于2018年2月】 编程语言中反射的概念 在计算机科学领域&#xff0c;反射是指一类应用&#xff0c;它们能够自描述和自控制。也就是说&#xff0c;这类应用通过采用某种机制来实现对自己行为的描述&#xff08;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&#xff0c;5H的持久战&#xff0c;我当然水几个题就睡了 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科技大本营&#xff08;ID: rgznai100&#xff09; 计算机视觉和模式识别大会 CVPR&#xff08;Conference on Computer Vision and Pattern Recognition&#xff09;作为人工智能领域计算机视觉方向的重要学术会议&#xff0c;每年都会吸引全球最顶尖的…

什么是 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爬取分析赶集网北京二手房数据(附详细代码)

本文转载自数据森麟&#xff08;ID:shujusenlin&#xff09; 作者介绍&#xff1a;徐涛&#xff0c;19年应届毕业生&#xff0c;专注于珊瑚礁研究&#xff0c;喜欢用R各种清洗数据。 知乎&#xff1a;parkson 如何挑战百万年薪的人工智能&#xff01; https://edu.csdn.net/t…

【Qt】QCloseEvent的使用小结

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

Java反射 - 私有字段和方法

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

.Net 程序员面试 C# 语言篇 (回答Scott Hanselman的问题)

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

一个小小的AI训练营竟然卧虎藏龙

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

【Qt】QCamera查询和设置摄像头的分辨率

查询和设置摄像头分辨率的API QCamera::supportedViewfinderResolutions() QCamera::setViewfinderSettings() 设置摄像头帧率、比例、分辨率、格式的类&#xff1a;QCameraViewfinderSettings 使用注意事项 查询和设置摄像头分辨率时&#xff0c;需要在摄像头启动后调用&a…

附录G Netty与NettyUtils

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/beliefer/article/details/77450134 注&#xff1a;本文是为了配合《Spark内核设计的艺术 架构设计与实现》一书的内容而编写&#xff0c;目的是为了节省成本、方便读者查阅。…

grails日志系统的研究

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

给老婆写个Python教程

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

SpringBoot的修改操作

今天学习SpringBoot 的 CRUD 操作&#xff0c;练习 修改操作 时&#xff0c;发生了如下的异常&#xff1a; [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&#xff0c;用在位深为1&#xff08;黑白图片&#xff09;上。…

ASP.NET,IIS7.0 上传大视频文件报错

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

【imx6】Unable to find the ncurses libraries的解决办法

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

Elasticsearch6.1.3 for CRUD

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

指纹锁就安全了?防火防盗还得防AI

整理 | 一一 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 如何挑战百万年薪的人工智能 https://edu.csdn.net/topic/ai30?utm_sourcecsdn_bw 近日&#xff0c;你应该看到了社交媒体上对于网站 ThisPersonDoesNotExist.com&#xff0c;生成无数不存在人脸的铺天…

迪杰斯特拉算法(C语言实现)

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

小米半年来最大调整:成立技术委员会,雷军称技术事关生死存亡

整理 | 琥珀出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;昨晚&#xff0c;小米集团组织部下发正式文件&#xff0c;宣布了最新一轮组织架构调整&#xff0c;任命了崔宝秋为集团副总裁&#xff0c;集团技术委员会主席&#xff0c;并且在核心管理岗位上共任命了 14 …

【驱动】在内核源码中添加驱动程序

以wifi驱动(RTL8188EUS驱动)为例 添加源码 将源码rtl8188EUS添加到drivers/net/wireless/rtl818x/目录下 添加Kconfig 在drivers/net/wireless/rtl818x/rtl8188EUS添加Kconfig&#xff0c;内容如下&#xff1a; config RTL8188EUtristate "Realtek 8188E USB WiFi&qu…

怎么让wordpress用sqlite3 搭建轻量级博客系统

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