Category: Machine Learning

机器学习笔记5-Tensorflow高级API之tf.estimator

机器学习笔记5-Tensorflow高级API之tf.estimator

前言 本文接着上一篇继续来聊Tensorflow的接口,上一篇中用较低层的接口实现了线性模型,本篇中将用更高级的API——tf.estimator来改写线性模型。 还记得之前的文章《机器学习笔记2 – sklearn之iris数据集》吗?本文也将使用tf.estimator改造该示例。 本文代码都是基于API版本r1.4。本文中本地开发环境为Pycharm,在文中不再赘述。 tf.estimator 内置模型 比起用底层API“较硬”的编码方式,tf.estimator的在使用时更像是对模型描述(或定义)的过程。Tensorflow把训练、评估、数据处理等这些过程全部封装起来,让开发人员更专注于解决实际问题的建模过程,而不是纠结于代码实现过程。如果用tf.estimator改造上一篇中的线性模型的话,完整代码如下: 本例中使用的库numpy是一个开源工具,是一个功能非常强大且执行效率很高的库,主要用作数值处理及矩阵操作等。 import numpy as np import tensorflow as tf # 定义特性列,线性模型中特性是列是x,shape=[1],因此定义如下: feature_columns = [tf.feature_column.numeric_column(“x”, shape=[1])] # 使用tf.estimator内置的LinearRegressor来完成线性回归算法 # tf.estimator提供了很多常规的算法模型以便用户调用,不需要用户自己重复造轮子 # 到底为止,短短两行代码我们的建模工作就已经完成了 estimator = tf.estimator.LinearRegressor(feature_columns=feature_columns) # 有了模型之后,我们要使用模型完成训练->评估->预测这几个步骤 # 训练数据依旧是(1.,0.),(2.,-1.),(3.,-2.),(4.,-3.)这几个点,拆成x和y两个维度的数组 x_train = np.array([1., 2., 3., 4.]) y_train = np.array([0., -1., -2., -3.]) # […]

机器学习笔记4-Tensorflow线性模型示例及TensorBoard的使用

机器学习笔记4-Tensorflow线性模型示例及TensorBoard的使用

前言 在上一篇中,我简单介绍了一下Tensorflow以及在本机及阿里云的PAI平台上跑通第一个示例的步骤。在本篇中我将稍微讲解一下几个基本概念以及Tensorflow的基础语法。 本文代码都是基于API版本r1.4。本文中本地开发环境为Pycharm,在文中不再赘述。 名词解释 核心概念 和很多开发语言设计一样,Tensorflow提供了多个级别的客户端API,其中最底层叫Tensorflow Core,使用这一层API可以完全控制Tensorflow,但是使用难度上也相对较大。在Tensorflow Core之上创建的更高级别的API,对开发者更友好,更易于使用、学习起来也更简单。 Tensorflow中该数据的核心单位是张量(Tensor),张量就是将一组基础数值,组织成形态(Shape)为一个任意维度的数组,张量的阶(Rank)就是维度的数量。概念还是挺拗口的,举个例子就非常明了了: [1., 2., 3.] # Rank=1, Shape=[3] [[1., 2., 3.], [4., 5., 6.]] # Rank=2; Shape=[2, 3]: 代表第一层数组里包含2个子数组,每个子数组里包含3个值 [[[1., 2., 3.]], [[7., 8., 9.]]] # Rank=3; Shape=[2, 1, 3] : 代表第一层数组里包含2个数组,每个子数组里又包含1个子数组,子数组里包含3个元素 Tensorflow其实就是针对张量的计算图,计算图中的每个节点(Node)之间是有向连接的,看起来像张量的流动图(即从输入开始,流过一系列的节点,最终输出结果),Tensorflow也由此得名。官方原话是: What is a Data Flow Graph? Data flow graphs describe […]

机器学习笔记3-Tensorflow简介

机器学习笔记3-Tensorflow简介

前言 前面两篇主要写了一些机器学习的基础概念,从本篇开始我们来了解下深度学习。深度学习是机器学习的一个子集,是一种特殊的数学模型。同样是从输入到输出,深度学习在这两者之间会有很多层称为“隐层”(Hidden Layers)的层,每一层将会将输入内容进行计算并自我调节,最终得到合理模型,这种数学模型非常像人类目前对大脑工作原理的认知,所以也称之为“人工神经网络”。 现在市面上有数十种深度学习框架:Wiki传送门。一个个学过来肯定精力不够,那我们就学综合评分最高的那个:Tensorflow。 Tensorflow是由Google团队在2015年11月9日以Apache 2.0开源许可证开源的,但刚发布的版本有诸多缺陷:bug比较多、性能比较差、使用难度比较高。在2017年2月16日,Google宣布Tensorflow 1.0正式发布,该版本适用于工业生产场景。所以在该版本发布之后,对深度学习领域产生了极大的影响,其大大简化了编写深度学习的代码难度,并且在Google这面大旗下,被各种专业人员以及机器学习爱好者所推崇(截止2018年1月9日,Tensorflow在Github上已经有7193个Watch,85038个Star和41555个Fork)。 Tensorflow在短短发布后的一年不到的时间里,已经跃居为综合排名第一的深度学习框架。为什么会如此火爆呢?我个人猜测理由如下: 深度学习目前是大趋势(所以得抓紧学习,抓住机遇) Google的技术实力太强大,开源过很多项目都非常成功(比如Android),所以跟着Google走可能不会让我们失望 接口丰富易用且支持多种语言(底层是C++实现的,这里指的是客户端调用底层API的语言),如Python、C++、Java、Go 易于部署,包括分布式部署 本机安装Tensorflow 如果你的电脑性能还不错,可以考虑直接在本机安装Tensorflow(官方安装文档传送门),优先考虑使用Anaconda来安装,按照官方教程一步步执行即可。 安装之后,需要在Pycharm中执行Tensorflow的代码,我们这里先用简单的输出常量的代码为例(此代码也是后文中demo1.py中的代码): import tensorflow as tf node1 = tf.constant(3.0, dtype=tf.float32) node2 = tf.constant(4.0) # also tf.float32 implicitly print(node1, node2) sess = tf.Session() print(sess.run([node1, node2])) 常见错误汇总 执行代码的时候,你可能会遇到很多错误,我这里整理了一份我在此过程中遇到的错误以及对应的解决方案供大家参考: 错误提示 解决方案 Anaconda installation is not found https://stackoverflow.com/questions/47624777/pycharm-anaconda-installation-is-not-found ImportError: Could not […]

机器学习笔记2 – sklearn之iris数据集

机器学习笔记2 – sklearn之iris数据集

前言 本篇我会使用scikit-learn这个开源机器学习库来对iris数据集进行分类练习。 我将分别使用两种不同的scikit-learn内置算法——Decision Tree(决策树)和kNN(邻近算法),随后我也会尝试自己实现kNN算法。目前为止,我还是在机器学习的入门阶段,文章中暂不详细解释算法原理,如果想了解细节信息可自行搜索。 代码分解 读取数据集 scikit-learn中预制了很多经典数据集,非常方便我们自己练习用。使用方式也很容易: # 引入datasets from sklearn import datasets # 获取所需数据集 iris = datasets.load_iris() load_iris返回的结果有如下属性: feature_names – 分别为:sepal length (cm), sepal width (cm), petal length (cm)和 petal width (cm) data – 每行的数据,一共四列,每一列映射为feature_names中对应的值 target – 每行数据对应的分类结果值(也就是每行数据的label值),其值为[0,1,2] target_names – target的值对应的名称,其值为[‘setosa’ ‘versicolor’ ‘virginica’] 分离数据 监督学习可以用一个简单的数学公式来代表: y = f(X) 按上一篇中的相关术语描述就是已知X(features),通过方法f(classifier)求y(label)。 […]

机器学习笔记1 – Hello World In Machine Learning

机器学习笔记1 – Hello World In Machine Learning

前言 Alpha Go在16年以4:1的战绩打败了李世石,17年又以3:0的战绩战胜了中国围棋天才柯洁,这真是科技界振奋人心的进步。伴随着媒体的大量宣传,此事变成了妇孺皆知的大事件。大家又开始激烈的讨论机器人什么时候会取代人类统治世界的问题。 其实人工智能在上世纪5、60年代就开始进入了理论研究阶段,人们在不断探索人工智能技术的同时,也担忧起机器人会不会替代人类。然而现实比理想残酷的多,由于当时各种条件的限制(理论基础、技术基础、数据基础、硬件性能等),人工智能相关的项目进度缓慢,也缺少实际成效,研发资金、社会关注度也越来越低,人工智能进入第一次低谷期。 到了80年代,卡内基梅隆大学为数字设备公司设计了一套名为XCON的“专家系统”。这是一种,采用人工智能程序的系统,可以简单的理解为“知识库+推理机”的组合,XCON是一套具有完整专业知识和经验的计算机智能系统。人工智能再一次被各国政府和科研机构看好,大量的资金投入到研发中,但是好景不长,几年后随着苹果和IBM公司研发出了性能强劲的PC机,导致“专家系统”变得没有竞争力,人工智能发展又一次进入寒冬。 随后若干年,人工智能的发展趋于平稳和低调。时间来到21世纪,随着互联网的普及,大量数据被积累下来;摩尔定律一次又一次的被证实,计算机硬件性能以极快的速度在增长;“云”的普及,让普通大众也能轻松拥有调度大量算力的机会,人工智能不再是科学家和专业人员在实验室才能研究的东西了。数据+算力+易得这几方面的因素结合之后,将人工智能再一次推向了高潮。 可能这一波热潮又是人工智能发展史上的一个波峰,未来人工智能还有很长的路要走。但目前的人工智能发展已经惠及到商业领域,在这样一种技术+商业的结合中,我个人还是很看好这次浪潮的。尤其是在看过《最强大脑》中,百度在图像、音频方面的人工智能技术发展到这样一个水平之后(图像识别已经超超越了人类大脑对图像的识别能力,声音识别也几乎和人类最高水平持平),很希望自己也可以有机会涉足到这个领域中。 机器学习基础入门知识 机器学习是人工智能的一个分支,主要是通过数据+算法来训练得出模型,再用模型来预测数据的一种技术。 刚开始接触机器学习,发现基础理论中好多都是大学里学过的数理知识(一直以来困扰我的“大学为什么要学这些东西”的谜团总算被解开了:)。我个人做了Web开发近十载,大部分是应用级的,很少涉及数理算法,看来今后还要慢慢拾起这些知识。不过刚开始入门可以循序渐进,先弄懂机器学习是怎么回事,动手做一个“Hello world”,然后再逐步深入原理层面的知识。 要涉足机器学习,最好会一种编程语言,这点上我们程序员有先天优势。目前用于机器学习的主流语言是Python和R,R我个人还没研究过,个人觉得Python是一个比较好的选择,流行度高、上手难度低、科学计算类库丰富、语法精简,如果本身就有其他面向对象的编程语言基础,不到一周就可以基本掌握Python了。 机器学习从从业分布来看,可以分成基础算法研究(设计师)和应(ban)用(zhuan)两个领域,其中大部分人都是在应(ban)用(zhuan)这个领域。 如果从技术层面来看,机器学习分成监督学习、无监督学习以及半监督学习。如何来区分呢?首先解释下机器学习中的几个名词。 特性(Features) – 其实就是数据 分类器(Classifier) – 其实就是算法 标签(Labels) – 其实就是种类 模型(Models) – 其实就是最终输出的分类公式 监督学习,就是在有标签的前提下,找到一种最合适的分类器,分析特性和标签之间的关系。 无监督学习,就是没有标签的前提下,将数据进行聚类(Clusting)。 半监督学习,就是部分特性有标签,部分则没有的状况(大部分特性可能是没有标签的情况)下进行分类。 监督学习相对来说最简单,由已知特性和标签,利用合适的分类器训练出模型,再以模型套用到数据中来预测出数据的标签。当然,分类器并不需要我们自己来发明创造,我们大部分人也没这个能力做这些事情,所有的理论研究、科学论证、代码实现都是现成的。Python中有很多相关类库,比如scikit-learn。应用层面的机器学习,其实就是通过不停的调参(收集更多的数据、变换算法、选取合适的特征数据等工作)来找到一种更精准的预测模型的工作。 Hello World In Machine Learning 假设我们现在需要区分皮球(以直径15cm-25cm之间的球为例)和甜瓜的图片,如果是传统的硬编码的方式来写代码的话,可能需要写几百上千个if–else才能完成一个基本的算法,而且可扩展性特别差,比如如果图片是黑白的或者图片中有干扰物品,那可能需要修改源代码,添加更多的if–else来增加准确度。更糟的是,真正执行的时候会遇到很多事先没有预料到的特殊情况。 但如果通过机器学习,这个事情可能就会变得很简单。大致步骤如下: 将图片转换成特征向量(这个进阶知识不在本篇中涉及) 决定一种合适当前场景的分类器 结合1中得到的特征和2中得到的分类器训练出模型 用模型中的公式预测数据,估算出其属于某个标签的可能性,最大可能性的那个即模型推算出的结果 数据准备 转换过程略,假设共N条数据,转换得到的特性如下: 直径(厘米) 形状 颜色 标签 24 round white […]