本文为fastai官方教程编译版本。若有错误,欢迎指正。

总目录:

  • *查看数据:本节为初级教程,介绍怎样快速的查看你的数据和模型预测结果。*
  • 推理学习器(Inference Learner):本节为中级教程,介绍怎样为(模型)推理创建学习器。
  • 自定义类ItemList(Custom ItemList):本节为高级教程,介绍如何创建类ItemBase与类ItemList。
  • 使用极小的代价实现深度学习:本节介绍如何使用较少的GPU资源实现推理,和避免重启笔记内核的时间。

查看数据

本文目录:

  • 查看输入与输出
  • 视觉任务
    • 分类问题
    • 多标签问题
    • 回归任务示例
    • 分割任务示例
  • 文本任务
    • 语言模型
    • 文本分类
  • 列表(Tabular)

查看输入与输出

在本节教程中,我们将介绍如何在一个API中查看视觉任务、文本任务或者列表应用中的模型输入与输出。我们将处理不同的任务,而且每次都在DataBunch中使用data block API来获取数据、查看如何使用showbatch方法查看部分输入、训练合适地Learner后用showresults方法查看模型的实际输出。

注意:照例,此页面从Notebook生成,您可以在fasti git分支(https://github.com/fastai/fastai)中docs_src文件夹找到该笔记。这些示例旨在快速运行,所以我们使用部分示例数据集(且使用ResNet18作为主干网络,不进行长时间训练)。您可以更改任一参数来进行自己的实验!

视觉

为了快速访问fastai内部的所有视觉函数,我们使用通用的 Import 语句:

  1. from fastai.vision import *

分类问题让我们使用MINIST手写体数据集作为示例数据集:

  1. mnist = untar_data(URLs.MNIST_TINY)tfms = get_transforms(do_flip=False)

它是用imagenet结构建立的,因此我们使用它来加载我们的训练和验证数据集,然后对其进行标记、变换、将其转换为ImageDataBunch,最终对其进行规范化。

  1. data = (ImageList.from_folder(mnist)
  2. .split_by_folder()
  3. .label_from_folder()
  4. .transform(tfms, size=32)
  5. .databunch()
  6. .normalize(imagenet_stats))

在DataBunch中正确设置好您的数据之后,我们可以调用函数 data.showbatch() 查看(可视化)数据。

  1. data.show_batch()

请注意,在显示带有标签的图像之前,图像会自动进行归一化处理(从文件夹名称推断)。如果默认值5太大,我们可以指定行数和限定图形的大小。

  1. data.show_batch(rows=3, figsize=(4,4))

现在,让我们创建一个 Learner 对象来训练分类器。

  1. learn = cnn_learner(data, models.resnet18, metrics=accuracy)learn.fit_one_cycle(1,1e-2)
  2. learn.save('mini_train')

我们的模型迅速达到了91%左右的准确率,接下来让我们看下模型在一组验证样本上的表现。我们使用 show_results 方法实现。

  1. learn.show_results()

由于验证集通常是经过排序的,因此我们仅获得了属于同一类的图像。然后,我们可以再次指定行数、图形大小以及要进行预测的数据集进行查看。

  1. learn.show_results(ds_type=DatasetType.Train, rows=4, figsize=(8,10))

多标签问题

现在让我们使用planet数据集上进行演示,其(与其他数据集的)不同之处在于每个图像可以具有多个标签(而不仅仅是一个标签)

  1. planet = untar_data(URLs.PLANET_TINY)
  2. planet_tfms = get_transforms(flip_vert=True, max_lighting=0.1, max_zoom=1.05, max_warp=0.)

这里每张图片的标签都存储在labels.csv文件中。我们需要在文件名中添加前缀'train'和后缀'.jpg',并设定每个标签之间用空格分开。

  1. data = (ImageList.from_csv(planet, 'labels.csv', folder='train', suffix='.jpg')
  2. .split_by_rand_pct()
  3. .label_from_df(label_delim=' ')
  4. .transform(planet_tfms, size=128)
  5. .databunch()
  6. .normalize(imagenet_stats))

我们可以通过函数data.show_batch来查看数据。

  1. data.show_batch(rows=2, figsize=(9,7))

然后我们可以相当轻松的创建Learner对象和进行尝试性训练。

  1. learn = cnn_learner(data, models.resnet18)
  2. learn.fit_one_cycle(5,1e-2)
  3. learn.save('mini_train')

要查看实际的预测结果,我们只需要运行方法learn.show_results()即可。

  1. learn.show_results(rows=3, figsize=(12,15))

回归问题对于接下来这个示例,我们使用BIWI头部姿态(https://data.vision.ee.ethz.ch/cvl/gfanelli/headpose/headforest.html#db)数据集。在人物图像中,我们要找出人脸的中心。在fastai文档中,我们已经建立了一个包含有200张图像数据的BIWI数据集子样本集,同时将每个图像中的中心坐标对应文件名以字典的形式进行存储。

  1. biwi = untar_data(URLs.BIWI_SAMPLE)
  2. fn2ctr = pickle.load(open(biwi/'centers.pkl', 'rb'))

为了获取数据,我们使用这个字典去标记我们的项目。我们同样使用PointsItemList使目标类型为ImagePoints(用于确保可以正确的应用数据增强)。当调用函数transform时我们确保设置tfm_y=True.

  1. data = (PointsItemList.from_folder(biwi)
  2. .split_by_rand_pct(seed=42)
  3. .label_from_func(lambda o:fn2ctr[o.name])
  4. .transform(get_transforms(), tfm_y=True, size=(120,160))
  5. .databunch()
  6. .normalize(imagenet_stats))

接着,我们可以使用data.show_batch()可视化我们的数据.

  1. data.show_batch(row=3, figsize=(9,6))

我们在使用函数learn.show_results()之前先尝试性训练下我们的模型。

  1. learn = cnn_learner(data, models.resnet18, lin_ftrs=[100], ps=0.05)
  2. learn.fit_one_cycle(5, 5e-2)
  3. learn.save('mini_train')

  1. learn.show_results(rows=3)

分割示例本节我们将使用camvid数据集(至少是其中的一部分数据),我们需要预测数据图像中的每一个像素点的类别。在“images”子文件夹中的每一幅图像都相当于对应的图像“labels”,也就是图像的分割掩码。

  1. camvid = untar_data(URLs.CAMVID_TINY)
  2. path_lbl = camvid/'labels'
  3. path_img = camvid/'images'

我们从'codes.txt'文件中读取类别信息和每个图像与其相关掩码名称的映射关系。

  1. codes = np.loadtxt(camvid/'codes.txt', dtype=str)
  2. get_y_fn = lambda x: path_lbl/f'{x.stem}_P{x.suffix}'

数据模块API允许我们快速获取 DataBunch中的任何内容,同时我们可以通过函数show_batch查看。

  1. data = (SegmentationItemList.from_folder(path_img)
  2. .split_by_rand_pct()
  3. .label_from_func(get_y_fn, classes=codes)
  4. .transform(get_transforms(), tfm_y=True, size=128)
  5. .databunch(bs=16, path=camvid)
  6. .normalize(imagenet_stats))
  1. data.show_batch(rows=2, figsize=(7,5))

接下来,我们训练Unet网络几个轮次(epochs)。

注意:本次训练是相当不稳定的,使用更多地训练轮次与更全的数据集可以获得更好的结果。

  1. learn = unet_learner(data, models.resnet18)learn.fit_one_cycle(3,1e-2)learn.save('mini_train')

总耗时(00:23)

  1. learn.show_results()

文本

本节介绍在文本上的应用,同样地让我们从导入所有需要函数开始。

  1. from fastai.text import *

语言模型首先我们在imdb子数据集上微调(fine-tune)一个预训练模型。

  1. imdb = untar_data(URLs.IMDB_SAMPLE)
  1. data_lm = (TextList.from_csv(imdb, 'texts.csv', cols='text')
  2. .split_by_rand_pct()
  3. .label_for_lm()
  4. .databunch())data_lm.save()

函数data.show_batch()同样也可以在这里使用。对于语言模型来说,它向我们展示了沿着批处理维度每个文本序列的开头(目标是猜下一个单词)。

  1. data_lm.show_batch()

现在让我们定义一个语言模型学习器。总耗时(Total time):00:25然后我们可以查看结果。它会显示确定数量的单词(默认20),以及之后的20个目标单词和预测的单词。

  1. learn.show_results()

文本分类本节介绍一个关于文本分类的例子。如果使用保存的编码器,我们要使用与语言模型相同的词汇表。

  1. data_clas = (TextList.from_csv(imdb, 'texts.csv', cols='text', vocab=data_lm.vocab)
  2. .split_from_df(col='is_valid')
  3. .label_from_df(cols='label')
  4. .databunch(bs=42))

这里通过函数 show_batch 显示了每次评审(review)的开始(信息)以及其目标(target)。

  1. data_clas.show_batch()

然后我们可以使用之前的编码器训练一个分类器。

  1. learn = text_classifier_learner(data_clas, AWD_LSTM)
  2. learn.load_encoder('mini_train_encoder')
  3. learn.fit_one_cycle(2, slice(1e-3,1e-2))learn.save('mini_train_clas')

总耗时(Total time):00:25

  1. learn.show_results()

列表

本节介绍列表数据中的应用范例。首先让我们导入全部所需要的函数。

  1. from fastai.tabular import *

我们使用adult数据集(https://archive.ics.uci.edu/ml/datasets/adult)中的一部分数据。当我们读取csv文件时,我们需要指定相关变量、类别变量、连续变量和要使用的处理器。

  1. adult = untar_data(URLs.ADULT_SAMPLE)df = pd.read_csv(adult/'adult.csv')
  2. dep_var = 'salary'
  3. cat_names = ['workclass', 'education', 'marital-status', 'occupation', 'relationship', 'race', 'sex', 'native-country']
  4. cont_names = ['education-num', 'hours-per-week', 'age', 'capital-loss', 'fnlwgt', 'capital-gain']
  5. procs = [FillMissing, Categorify, Normalize]

然后,我们可以使用数据块API在使用data.show_batch()之前获取所有内容。


  1. data = (TabularList.from_df(df, path=adult, cat_names=cat_names, cont_names=cont_names, procs=procs)
  2. .split_by_idx(valid_idx=range(800,1000))
  3. .label_from_df(cols=dep_var)
  4. .databunch())

data.show_batch()

这里我们可以得到尝试性训练后的tabular_learner。

  1. learn = tabular_learner(data, layers=[200,100], metrics=accuracy)
  2. learn.fit(5, 1e-2)
  3. learn.save('mini_train')

总耗时(Total time):00:19我们可以使用learn.show_results()(查看结果)。

  1. learn.show_results()

欢迎关注磐创博客资源汇总站:http://docs.panchuang.net/

欢迎关注PyTorch官方中文教程站:http://pytorch.panchuang.net/

OpenCV中文官方文档:http://woshicver.com/

fastai 官方教程之查看数据的更多相关文章

  1. Asp.Net MVC4.0 官方教程 入门指南之五--控制器访问模型数据

    Asp.Net MVC4.0 官方教程 入门指南之五--控制器访问模型数据 在这一节中,你将新创建一个新的 MoviesController类,并编写代码,实现获取影片数据和使用视图模板在浏览器中展现 ...

  2. 阿里云官方教程 Linux 系统挂载数据盘

    适用系统:Linux(Redhat , CentOS,Debian,Ubuntu) *  Linux的云服务器数据盘未做分区和格式化,可以根据以下步骤进行分区以及格式化操作. 下面的操作将会把数据盘划 ...

  3. Unity性能优化(3)-官方教程Optimizing garbage collection in Unity games翻译

    本文是Unity官方教程,性能优化系列的第三篇<Optimizing garbage collection in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...

  4. Unity性能优化(4)-官方教程Optimizing graphics rendering in Unity games翻译

    本文是Unity官方教程,性能优化系列的第四篇<Optimizing graphics rendering in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...

  5. Unity性能优化(2)-官方教程Diagnosing performance problems using the Profiler window翻译

    本文是Unity官方教程,性能优化系列的第二篇<Diagnosing performance problems using the Profiler window>的简单翻译. 相关文章: ...

  6. Unity性能优化(1)-官方教程The Profiler window翻译

    本文是Unity官方教程,性能优化系列的第一篇<The Profiler window>的简单翻译. 相关文章: Unity性能优化(1)-官方教程The Profiler window翻 ...

  7. Asp.Net MVC4.0 官方教程 入门指南之三--添加一个视图

    Asp.Net MVC4.0 官方教程 入门指南之三--添加一个视图 在本节中,您需要修改HelloWorldController类,从而使用视图模板文件,干净优雅的封装生成返回到客户端浏览器HTML ...

  8. DroidParts 中文系列教程(基于官方教程)

    DroidParts中文系列教程(基于官方教程) (一)DroidParts框架概况 2014年4月18日星期五 11:36 他是一个精心构造的安卓框架,包括下面这些基本功能 DI依赖注入,可以注入V ...

  9. SwiftUI 官方教程(七)

    7. 给子 View 传递数据 LandmarkDetail 现在依然使用硬编码的数据来显示地标.像 LandmarkRow 一样,LandmarkDetail 类型和它组合的其他 view 都需要一 ...

随机推荐

  1. 【简单版】hexo博客搭建流程梳理

    前言 本文章会为你梳理一个搭建hexo博客的流程 相关网址: Docs: https://hexo.io/docs/ Themes: https://hexo.io/themes/ 安装hexo 准备 ...

  2. C++扬帆远航——1

    问题及代码: /* * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:test.cpp * 作者:常轩 * 完成日期:2 ...

  3. IP 数据报

    IP 数据报 1.IP 数据报的格式 一个 IP 数据报由首部和数据两部分组成.(数据报也可以说是数据包) 首部的前一部分是固定长度,共 20 字节,是所有 IP 数据报必须具有的. 在首部的固定部分 ...

  4. 硬件小白学习之路(1)稳压芯片LM431

    图稳压芯片LM431简介 偶然的机会接触到LM431这个芯片,周末晚上打发无聊的时光,查资料进行剖析. LM431的Symbol Diagram和Functional Diagram如图1所示,下面分 ...

  5. Hibernate和Mybatis的工作原理以及区别

    一.Mybatis的工作流程图 (1).原理详见: MyBatis应用程序根据XML配置文件创建SqlSessionFactory,SqlSessionFactory在根据配置,配置来源于两个地方,一 ...

  6. [2020.03]Unity ML-Agents v0.15.0 环境部署与试运行

    一.ML-Agents简介 近期在学习Unity中的机器学习插件ML-Agents,做一些记录,用以简单记录或交流学习. 先简单说一下机器学习使用的环境场景:高视觉复杂度(Visual Complex ...

  7. 用libvlc 播放指定缓冲区中的视频流

    有时候,我们需要播放别的模块传输过来的视频流,VLC提供了这样的机制,但一般很少这样用,下面的例子实现了这样的功能. 其中用到一个关键的模块 imem.  vlc提供多种创建媒体的方式,如要从指定缓存 ...

  8. JavaMail(二):利用JavaMail发送复杂邮件

    上一篇文章我们学习了利用JavaMail发送简单邮件,这篇文章我们利用JavaMail发送稍微复杂一点的邮件(包含文本.图片.附件).这里只贴出核心代码,其余代码可参考JavaMail(一):利用Ja ...

  9. Golang中database/sql包

    驱动 github.com/go-sql-driver/mysql 请求一个连接的函数有好几种,执行完毕处理连接的方式稍有差别,大致如下: db.Ping() 调用完毕后会马上把连接返回给连接池. d ...

  10. js 模拟鼠标绘制方块

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...