TensorFlow图像分类教程
云栖君导读:深度学习算法与计算机硬件性能的发展,使研究人员和企业在图像识别、语音识别、推荐引擎和机器翻译等领域取得了巨大的进步。六年前,视觉模式识别领域取得了第一个超凡的成果。两年前,Google大脑团队开发了TensorFlow,并将深度学习巧妙的应用于各个领域。现在,TensorFlow则超越了很多用于深度学习的复杂工具。
利用TensorFlow,你可以获得具有强大能力的复杂功能,其强大的基石来自于TensorFlow的易用性。
在这个由两部分组成的系列中,我将讲述如何快速的创建一个应用于图像识别的卷积神经网络。
TensorFlow计算步骤是并行的,可对其配置进行逐帧视频分析,也可对其扩展进行时间感知视频分析。
本系列文章直接切入关键的部分,只需要对命令行和Python有最基本的了解,就可以在家快速地创建一些令你激动不已的项目。本文不会深入探讨TensorFlow的工作原理,如果你想了解更多,我会提供大量额外的参考资料。本系列所有的库和工具都是免费开源的软件。
工作原理
本教程旨在把一个事先被放到训练过的类别里的图片,通过运行一个命令以识别该图像具体属于哪个类别。步骤如下图所示:
标注:管理训练数据。例如花卉,将雏菊的图像放到“雏菊”目录下,将玫瑰放到“玫瑰”目录下等等,将尽可能多的不同种类的花朵按照类别不同放在不同的目录下。如果我们不标注“蕨类植物”,那么分类器永远也不会返回“蕨类植物”。这需要每个类型的很多样本,因此这一步很重要,并且很耗时。(本文使用预先标记好的数据以提高效率)
训练:将标记好的数据(图像)提供给模型。有一个工具将随机抓取一批图像,使用模型猜测每种花的类型,测试猜测的准确性,重复执行,直到使用了大部分训练数据为止。最后一批未被使用的图像用于计算该训练模型的准确性。
分类:在新的图像上使用模型。例如,输入:IMG207.JPG,输出:雏菊。这个步骤快速简单,且衡量的代价小。
训练和分类
本教程将训练一个用于识别不同类型花朵的图像分类器。深度学习需要大量的训练数据,因此,我们需要大量已分类的花朵图像。值得庆幸的是,另外一个模型在图像收集和分类这方面做得非常出色,所以我们使用这个带有脚本的已分类数据集,它有现成且完全训练过的图像分类模型,重新训练模型的最后几层以达到我们想要的结果,这种技术称为迁移学习。
我们重新训练的模型是Inception v3,最初是在2015年12月发表的论文“重新思考计算机视觉的Inception架构”中有做论述。
直到我们做了这个约20分钟的训练,Inception才知道如何识别雏菊和郁金香,这就是深度学习中的“学习”部分。
安装
首先,在所选的平台上安装Docker。
在很多TensorFlow教程中最先且唯一依赖的就是Docker(应该表明这是个合理的开始)。我也更喜欢这种安装TensorFlow的方法,因为不需要安装一系列的依赖项,这可以保持主机(笔记本或桌面)比较干净。
Bootstrap TensorFlow
安装Docker后,我们准备启动一个训练和分类的TensorFlow容器。在硬盘上创建一个2GB空闲空间的工作目录,创建一个名为local的子目录,并记录完整路径。
docker run -v /path/to/local:/notebooks/local --rm -it --name tensorflow
tensorflow/tensorflow:nightly /bin/bash
下面是命令解析:
-v /path/to/local:/notebooks/local将刚创建的local目录挂载到容器中适当的位置。如果使用RHEL、Fedora或其他支持SELinux的系统,添加:Z允许容器访问目录。
--rm 退出时令docker删除容器
-it 连接输入输出,实现交互。
--name tensorflow将容器命名为tensorflow,而不是sneaky_chowderhead或任何Docker定义的随机名字。
tensorflow/tensorflow:nightly从Docker Hub (公共图像存储库)运行tensorflow/tensorflow的nightly 图像,而不是最新的图像(默认为最近建立/可用图像)。使用nightly图像而不是latest图像,是因为(在写入时)latest包含的一个bug会破坏TensorBoard,这是我们稍后需要的一个数据可视化工具。
/bin/bash指定运行Bash shell,而不运行系统默认命令。
转自:云栖社区
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android-Jetpack笔记-ViewModel
- GitLab CE 安装记录
- SparkSQL中产生笛卡尔积的几种典型场景以及处理策略
- TypeScript 中的 export 和 import
- Angular2 初体验
- 在 Ubuntu 系统上配置 Nginx Git 服务器
- 设计模式之规格模式
- Android-Jetpack笔记-Navigation之Fragment使用
- Android-Jetpack笔记-Navigation之Fragment支持复用
- Android-Jetpack笔记-Room
- 代理模式看这一篇就够了~
- Spark MLlib中KMeans聚类算法的解析和应用
- 通过 PHP 代码发送 HTTP 响应与文件下载
- 玩转 PhpStorm 系列(八):Vim 篇
- Android-Jetpack笔记-Paging结合数据库