2017最后一天的学习-TensorFlow
中午吃过饭后,家人都去午休了,我就躺在沙发上看电视,然后稀里糊涂睡着了,突然自己问自己今天写点什么呢,然后在迷糊中突然想到了TensorFlow,好了,那今天就看看它吧。
什么是TensorFlow,如果按照标准的官方说法,就是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。数据流图的概念稍后来讲。
TensorFlow到底有多火呢,按照github 2016年的数据是29622个星,2017年这个数字飙升到了8万多,毫无疑问,是2017年最闪亮的项目。
TensorFlow引起很多的关注和兴趣,可能源自AlphaGo,因为都是来自Google Mind团队。他们的关系非常紧密,可以说互相依存。
如果从我的理解来说,该怎么解释这个技术呢。我个人完全不懂围棋的玩法,就班门弄斧说下围棋的这个事情吧,可能很多是不对的,纯是技术交流。以前的计算机模拟的基本都是穷举的模型,比如有一个步骤有100种可能,那么我就计算100次,每一次得到的结果可能都是局限的,如果要看远一些,那么比如看到后面的5步的走法,按照这个方式理解,那就是100*100*100*100*100种可能性,这种方式结算的结果如果从整体来把握,几乎是不可控的,因为围棋里的玩法不是一个固定的模式,不像你输入一个数据,就立马通过公式计算出一个结果一样。所以说在各种不确定中找到确定的方案,而且能够确定边界,难度应该是相当的大,但是如果换一种思路,比如我把所有不同棋手的学习过程都借鉴过来,比如100个人下棋,在某一个阶段下了某一步棋,对整个棋局都是有利,那么计算机就会标记下来,算是学习了这个技巧,不断的借鉴不断的模仿,然后自我改进,这个过程必然会用的大量的数据和大量的计算,于是乎,各种经验和技巧就不断的迭代,不断的抽象出来,所以说如果让计算机来说某一步具体为什么要那么下,可能没有一个很好的答案,但是它有大把的数据显示这么下一定是目前最好的方案,它会把经验集合起来,而不去做最初穷举的计算。
这方面的实力哪里最强,个人认为还是硅谷,大学里面占据地理优势的就是斯坦福了。今年十一去斯坦福的时候,真是被里面的美景和文化氛围吸引了,非常典型的西班牙建筑特征:红陶筒瓦、手工抹灰墙、陶艺挂件、拱璇门廊。
大名鼎鼎的吴恩达就是斯坦福的教授,也在网易开通了机器学习的公开课,感兴趣自行搜索下。
下午的时候开始简单了解了下,然后开始部署下环境。
TensorFlow的安装可以分为不同的操作系统版本,最早是不支持windows的(现在的版本支持),在Unix,Linux下部署还是很方便的。它提供了大量的Python API,这是大多数深度学习框架都有的; 安装时会根据CPU,GPU的差别有不同的安装类型;目前推荐的操作系统是Ubuntu,不同的Python版本安装也有差别。
我们通过网站(https://www.tensorflow.org/install/)的目录结构就很容易看到TensorFlow的大体情况,支持的平台。
目前最新的版本是1.4,下载链接是:
https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.4.0-cp27-none-linux_x86_64.whl
我们可以根据pip来安装,当然我任性了一会,在RedHat 6版本上安装了,结果发现过程还是很痛苦的。
如果直接使用pip install --upgrade来安装,很可能会提示网站的安全性问题,我们可以先用wget拿到whl文件,然后使用pip install来安装。
当然后面又碰到了一堆的问题,最郁闷的就是glibc的版本兼容性问题。在RHEL 6中的glibc版本是2.12,而在7中则为2.17,安装TensorFlow需要的版本至少是2.16,所以在RHEL6版本中还需要手工升级,glibc算是核心库,我们运行的命令ls,rm这些都和这个库息息相关,所以操作不当就会导致整个系统不可用,我算是趟上了这个坑,当手工升级glibc的时候,发现到问题的时候,貌似有些晚了,因为ls,rm都可不用了,而我的虚拟机上已经在跑一些测试环境了。有很多数据都没来得及备份,我一边想办法,后悔没完整备份,一边在找补救措施,最后好不容易搞定,赶紧做了两件事情:
- 备份认为关键的数据和程序
- 对虚拟机开启了快照,随时跟进快照情况进行回退
有了这两个保障,也算是有惊无险。
所以最好还是按照指定的环境,比如Ubuntu来吧。
所以如果说简单些,TensorFlow就是个软件库,我们直接引用即可。
比如一个最简单的TensorFlow程序,引入这个库,然后这样一个3+5的操作还得不到8
import tensorflow as tf
a = tf.add(3, 5)
print(a)
>> Tensor("Add: 0", shape=(), dtype=int32)
这是因为需要开启session,在session中操作能够被执行,简单改进下:
import tensorflow as tf
a = tf.add(3, 5)
sess = tf.Session()
print(sess.run(a))
sess.close()
>> 8
看今天的晚会里面,已经有了全自动码头,看来各行各业都在革命,难啊。
走入IT路,也不容易。
用王家卫《一代宗师》里的台词来简单总结下:
从此只有眼前路,没有身后身,回头无岸
- 移除WordPress 仪表盘首页的“插件”“其它WordPress 新闻”小工具
- 解决VMware 7在Windows 7上无法上网的问题
- Windows Server 2008群集仲裁机制
- [C#2] 5-迭代器
- 服务器未能识别 HTTP 标头 SOAPAction 的值
- 实用代码-C#获取本机网络适配器信息及MAC地址
- WordPress 自定义 login (登录页面)CSS 样式
- [C#1] 12-特性
- HTTP Basic Authentication for RESTFul Service
- [C#2] 4-可空类型、静态类
- jquery 操作css 尺寸
- Windows 7上IIS出现http 500错误
- [C#2] 2-匿名方法
- jquery 操作css 选择器
- 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 数组属性和方法
- 掌握浏览器重绘(reflow)重排(repaint)-前端进阶
- var和let/const的区别
- 刷新/关闭页面之前发送请求
- Web Beacon 刷新/关闭页面之前发送请求
- 解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
- python3 logging日志封装实例
- 解决Python中报错TypeError: must be str, not bytes问题
- H5 notification浏览器桌面通知
- Android线程池控制并发数多线程下载
- Android progressbar实现带底部指示器和文字的进度条
- js 调用栈机制与ES6尾调用优化介绍
- Android Fragment实现列表和内容联动
- 前端中等算法-无重复字符的最长子串
- Android自定义动态壁纸开发(时钟)
- 手摸手教你写个ESLint 插件以及了解ESLint的运行原理