标签 Python 下的文章

GopherChina讲师专访

今年有幸收到GopherChina大会的组织者、beego开源项目的owner、《Go Web编程》的作者谢孟军童鞋的邀请,以讲师身份参加今年的GopherChina大会。下面是GopherChina对我这个讲师的专访稿^0^。该专访稿将同时被发布在公众号“Go中国(微信号:golangchina)”上面,可点击这里阅读。

1、首先介绍一下自己。

大家好!我叫白明(Tony Bai),目前是东软云科技的一名架构师,专职于服务端开发,日常工作主要使用Go语言。我算是国内较早接触Go语言的程序员兼Advocater了,平时在我的博客微博和微信公众号“iamtonybai”上经常发表一些关于Go语言的文章和Go生态圈内的信息。

在接触Go之前,我主要使用C语言开发电信领域的一些后端服务系统,拥有多年的电信领域产品研发和技术管理经验。我个人比较喜换钻研和分享技术,是《七周七语言》一书的译者之一,并且坚持写技术博客十余年。同时我也算是一个开源爱好者,也在github上分享过自己开发的几个小工具。

目前的主要研究领域包括:GoKubernetesDocker和儿童编程教育等。

2、回忆一下与Golang的渊源。是什么原因决定尝试Golang?自己用Go语言实现的第一个项目是什么?当时 Golang 有什么令人惊喜的表现,又有什么样的小不足,这个不足在Golang已经更新到1.8版本的时候是否已经得到改善?

众所周知,Go语言最初由Robert Griesemer, Ken ThompsonRob Pike在2007年末共同设计和实现,2009年11月份正式发布并开源,并于2012年3月份发布了1.0版本以及Go1规范。我就是在2012年开始接触Go的,那是缘于看到一份由Rob Pike主讲的3-day Go Course资料。从那份资料里,我了解到了Go的设计理念和Go语法。

由于之前浸淫于C语言多年,深知C语言在系统编程以及服务端编程方面的强大,同时也亲身体会到C的语法“陷阱”和C手工内存管理给开发者带来的苦恼。虽然那些年市面上也有其他主流语言可供选择,但在我看来,它们给我带来的心智负担太过沉重,比如:C++“宇宙无敌”的学习和使用复杂性、Java超大的资源消耗和庞大且纷繁芜杂的框架体系、动态语言(rubypython)无静态类型而导致运行时crash时调试的困难、函数式语言(如Haskellclisp)的过于小众和非主流。显然它们都不是我的菜。直到Go的出现,C程序员出身的我一下子就被这门新语言迷住了。

现在想起这件事来,我当时迷上Go应该主要由于以下几点原因:

* 静态类型语言、接近于C的性能(对于C程序员来说,这算是某种天然继承性)
* 简洁的语法
* 内置的并发支持
* GC
* 贯穿整个语言的正交设计和组合编程思路(兼容对OO的支持)
* 工具和功能全面的标准库

而且这几点也是这几年持续支撑我深入学习和使用Go语言的原因。

不过由于Go1刚出来时也十分小众,并且各方面功能还在完善中,我并没有在真实项目中使用Go,这种状况一直持续到2014年末。直到那时,我才在一个小项目中使用Go实现了一个微信公众号的协议接口。当时发现:使用Go实现一些安全协议真是非常方便,因为标准库里内置了很好的支持,比如:各种aes、sha256、tls算法实现。同时,Go内置的testing framework、gofmt、Go pprof工具的表现也是让我感觉用起来十分舒服。

如果非要说当时有什么不足之处的话,那只能是Go对debugging的支持明显不足。即便是到了目前最新的Go 1.8版本,Go在debugging方面虽然有所改善,但和C这样的传统语言来说依然有很大差距。不过好在我们有“print”这个无敌调试武器,Go的这个不足对我影响微乎甚微^0^。

当然随着Go在更多规模稍大项目的使用,Go的包管理问题逐渐浮出水面,这也是整个Go社区都想改进的事情。好在目前已经有了专门的Commitee来做这件事,最新的roadmap显示dep工具将在Go 1.10 dev cycle并入Go tools中。

3、2009年诞生至今,Go语言基本统治了云计算,作为最专业的Go语言专家,您认为这是由于它的哪些优雅的特性?Golang未来还会有什么样的改进和突破?

“作为最专业的Go语言专家”,这一称号的确不敢当。我觉得我个人只是国内Gopher普通一员,能为Go语言在国内的发展做点事情就很高兴了^0^。

Go自从1.5版本自举后,随着ssa优化、GC延迟优化的深入,Go在国内外的使用趋势确实是一片大好,尤其是Go问鼎2016年TIOBE编程语言排行榜的年度语言,让更多的程序员知道Go语言、了解Go语言和使用Go语言。在云计算成为当今IT行业常态的今天,Go在这方面已然成为一个重量级选手。从个人对Go的情感角度出发,我个人是希望Go语言能成为”21世纪的C语言”和云平台第一语言的。不过这是一个过程,需要时间,还需要依靠全世界Gopher和Go Community的共同努力才能实现的。

时代不同,语言的成长环境也有所不同。和上一代和两代的语言似乎有所不同,新一代编程语言是否能进入程序员们的法眼,是否值得程序员去投资,“背景”很重要,即所谓的编程语言也进入了“拼爹”时代。Go语言背靠Google这棵大树,又有Robert Griesemer, Ken Thompson, Rob Pike三巨头坐镇,是真正的“牛二代”,它自然就会得到不少程序员的青睐。我想这是Go吸引眼球的场外因素。

至于Go本身的语言特性,在上一个问题中,我已经做了初步阐述了,这里再补充几点:

* Go是一门以解决Google内部生产环境中的问题(大规模并发服务)为目标的、兼顾在语言设计层面解决一些软件工程问题的面向大规模并发服务的编程语言;
* 开发效率较高(对比主流的C、C++和Java),且执行效率与C相比,没有数量级级别的差异;
* 编译速度超快(相对其他需编译的主流语言),无需喝咖啡等待;
* Go1兼容性的承诺。

Go语言到目前已经演进到1.8版本,Go 1.9开发周期已经打开。今年夏天,Go 1.9发布后,Go似乎就到了版本演进的关键节点,是继续Go1兼容(Go 1.10、Go 1.11…),还是诞生Go2规范,目前并没有明确信息。不过未来的改进和突破,我觉得还是应该建立在Go语言设计的初衷和设计原则之上,这些初衷和原则包括:

目标:
 * 高效的静态编译语言
 * 动态语言的易用性
 * 类型安全和内存安全
 * 对并发和通信的良好支持
 * 高效、低/趋于零延迟的GC
 * 高速编译

原则:

 * 保持概念正交
 * 保持语法简单
 * 保持类型系统精炼,无type hierarchy

从这些年Go的发展来看,基本都是遵循以上目标和原则的。即便Go2出来,不符合上述原则的feature,也是很难加入到Go2里面的。

4、之前是否有关注到Gopher China大会,对大会的风格和内容有什么样的印象?

对于中国大陆地区规模最大,最具影响力的Go大会,我是从第一届就开始关注了,虽然第一届因故没能参加^0^。在去年举行的第二届大会,我是作为早鸟观众参与的哦。而本届则有幸成为讲师。

GopherChina从诞生至今,规模日益扩大,据说今年的参会人员可能突破1000人。而且GopherChina大会从第一届就汇聚了国内一线IT厂商的精英技术人员作为讲师,并得到了Go core team的大力支持。在每一届大会都会邀请到Go team中的核心开发人员参会布道,甚至在第一届大会时还邀请到了Go三巨头之一的Robert Griesemer,极大满足了国内Gopher的求知欲。

而且就我观察,每一届GopherChina大会的主题都涵盖:语言、工程、新兴领域应用等多个环节,颇具多样性和全面性。

5、作为讲师也是参会者,对于今年的Gopher China大会的哪些议题有所期待?

GopherChina每一届都是高手云集,这届也不例外。今年大会的每个议题都令我很是期待。

6、现在很多企业项目都在准备转Go,对于这些项目的负责人有没有建议和经验分享?

Go语言以极易上手著称,同时Go也是一门十分简单的语言(相对于其他主流语言),C、Cpp、Java、Python等程序员转型到Go的曲线并不陡峭,因此团队整体转型为Go的门槛并不高。但还是要有几点是项目负责人需要认真考虑的:

(1) 确认Go适合项目的应用场景

Go不是万能的,不能为了用Go而去用Go。但Go从最初定位为一门系统语言(Sytem Programming Language)逐渐演化成为一门通用语言(General Purpose Programming Language),说明其适应性和应用范围已经十分广泛,目前在云计算、Web开发、大数据、游戏、数据库、IDE、容器等领域均有大规模应用案例。但即便这样,仍然在有些领域的应用需要谨慎,比如嵌入式领域、比如mobile开发,虽然在这两个方面Go都做出了很大的努力,但似乎并没有较大的突破。

(2) 以终为始,从开始就参考Go的最佳实践

Go经过若干年的演化发展,逐渐形成了一些最佳实践,包括:项目代码组织、命名、惯用法、测试方法、错误处理、接口使用等。建议多看官方的talks、blog和世界范围内Go大会的presentation video。

(3) 单元测试全程保障

Go内置了单元测试框架,而单元测试是检验代码设计好坏的基础,也是代码重构的先决条件。建议项目从始至终都要优先考虑对代码编写测试代码。

(4) 充分利用标准库

在Go的应用实践中,你会发现Go标准库已经为你提供了大部分你要使用的功能。甚至有一些极端的Go纯粹主义者只愿意标准库中的函数和方法。Go标准库凝聚了Go team以及相关Contributor的Go代码精华,其稳定性绝对值得信赖。充分和广泛利用标准库也便于项目代码组织、构建和迁移。

(5) 基于go tool建立代码metric视图

对于那些性能敏感的系统,建议在内部环境基于go tool建立起代码的metric视图,监控代码变化给系统性能等带来的影响,利于问题诊断。

最后,请及时反馈Go语言自身问题,你的反馈是Go语言演化的动力

7、有没有你觉得很酷的Gopher?可以回答自己哟~

在github.com/golang/go上,我经常关注Russ Cox的代码。众所周知,Russ Cox是Go核心代码提交次数最多的member,他也除三巨头之外,对Go演化影响着最大的人之一。从近两年的Go team开发活动来看,Russ Cox开发效率很高,并且提出的proposal思维之缜密和全面令人叹服。

Dave Cheney是另一个我经常关注的Gopher,他也是第二届GopherChina大会的受邀讲师。他不遗余力的“鼓吹”Go,并从Go 1.6版本开始,发起了Go Global release party ,成为Go Community又一个节日。他不仅是Go community中的意见领袖,同时也为Go社区贡献不少有用的工具和思想,包括:gberrors等。

Dmitry Vyukov,前Intel Black Belt级工程师,现Google员工,虽然他不是专职Go team的人,但他却是Go scheduler当前版本的核心实现者。虽然近两年似乎在golang的投入并不是那么多,但依然成果丰硕,Go Execution Tracergo-fuzz(据说要加入go核心)都是他的杰作。


微博:@tonybai_cn
微信公众号:iamtonybai
github.com: https://github.com/bigwhite

TensorFlow入门:零基础建立第一个神经网络

首先,我不得不承认这篇文章有些标题党的味道^0^,但文章还是要继续写下去,备忘也好,能帮助到一些人也好。

2016小结的时候,我说过:2017年要了解一些有关机器学习人工智能(以下简称AI)方面的技术。如果有童鞋问:Why?我会告诉你:跟风。作为技术人,关注和紧跟业界最前沿的技术总是没错的。

2016年被业界普遍认为是AI这一波高速发展的元年,当然DeepMindAlphaGo在这方面所起到的作用是功不可没的。不过人工智能并未仅仅停留在实验室,目前可以说人工智能已经深入到我们生活中的方方面面,比如:电商的精准个性化商品推荐、手机上安装的科大讯飞的中文语音识别引擎以及大名鼎鼎的Apple的siri等。只是普通老百姓并没有意识到这一点,或者说当前AI的存在和运行形式与大家传统思想中的“AI”还未到形似的地步,再或者当前AI的智能程度还未让人们感觉到AI时代的到来。

人工智能是当前的技术风口,也是投资风口。不过,人工智能技术与普通的IT技术不同的地方在于其背后需要大量且有一定深度的数学理论知识,有门槛,并且门槛较高,这会让普通程序员望而却步的。还好有国际大公司,比如:Google、Facebook等在努力在降低这一门槛,让人工智能技术更加接地气,让更多从事IT领域的人能接触到AI,并思考如何利用AI解决实际问题。Google的TensorFlow应该就是在这样的背景下诞生的。

这里并不打算介绍TensorFlow是什么,其原理是什么(因为目前我也不知道),只是利用TensorFlow简简单单地建立起一个神经网络模型,带着大家感性的认知一下什么是AI。本文特别适合那些像我一样,从未接触过AI,但又想感性认识AI的程序员童鞋们。

一、由来

和AI门外的程序员童鞋一样,想窥探AI的世界已久,但苦于没有引路人,一直在门外徘徊。直到看到martin gorner的那篇《TensorFlow and deep learning, without a PhD》。在这篇文章中,martin已经将利用TensorFlow建立并一步步训练优化一个神经网络的门槛降低到了最简化的程度了。不过即便这样,把martin所使用这个环境搭建起来(文中虽然有详细步骤),可能依旧会遇到一些问题,本文的目的之一就是帮助你迈过这“最后一公里”。

二、搭建环境

我所使用的环境是一台think center x86_64物理机,安装的是ubuntu 16.04.1。相关软件版本:

$ python
Python 2.7.12 (default, Nov 19 2016, 06:48:10)   

$ git version
git version 2.7.4

按照教程中INSTALL.txt中的步骤,我们需要安装依赖软件:

$ sudo  apt-get install python3
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
python3 已经是最新版 (3.5.1-3)。
升级了 0 个软件包,新安装了 0 个软件包,要卸载 0 个软件包,有 203 个软件包未被升级。

$ sudo apt-get install python3-matplotlib
python3-matplotlib 已经是最新版 (1.5.1-1ubuntu1)。

$sudo apt-get install python3-pip
python3-pip 已经是最新版 (8.1.1-2ubuntu0.4)。

$ pip3 install --upgrade tensorflow
Collecting tensorflow
  Downloading tensorflow-0.12.1-cp35-cp35m-manylinux1_x86_64.whl (43.1MB)
... ...
Installing collected packages: numpy, six, wheel, setuptools, protobuf, tensorflow
Successfully installed numpy-1.11.0 protobuf setuptools-20.7.0 six-1.10.0 tensorflow wheel-0.29.0

我们看到安装的TensorFlow是0.12.1版本,这应该是TensorFlow发布1.0版本前的最后一个Release版了。

下载Martin的教程代码:

$ mkdir -p ~/test/tensorflow

$ git clone https://github.com/martin-gorner/tensorflow-mnist-tutorial.git
正克隆到 'tensorflow-mnist-tutorial'...
remote: Counting objects: 271, done.
remote: Total 271 (delta 0), reused 0 (delta 0), pack-reused 271
接收对象中: 100% (271/271), 95.01 KiB | 46.00 KiB/s, 完成.
处理 delta 中: 100% (171/171), 完成.
检查连接... 完成。

我使用的tutorial的revision是:commit a9eb2bfcd74df4d7f3891d5403468d87547320e8。

三、建立并训练识别手写数字的神经网络

万事俱备,只差执行。

一起来建立我们的第一个神经网络:

$cd ~/test/tensorflow/tensorflow-mnist-tutorial
$ ls
cloudml          LICENSE                                mnist_2.2_five_layers_relu_lrdecay_dropout.py  mnist_4.1_batchnorm_five_layers_relu.py  tensorflowvisu_digits.py
CONTRIBUTING.md  mnist_1.0_softmax.py                   mnist_3.0_convolutional.py                     mnist_4.2_batchnorm_convolutional.py     tensorflowvisu.mplstyle
data             mnist_2.0_five_layers_sigmoid.py       mnist_3.1_convolutional_bigger_dropout.py      __pycache__                              tensorflowvisu.py
INSTALL.txt      mnist_2.1_five_layers_relu_lrdecay.py  mnist_4.0_batchnorm_five_layers_sigmoid.py     README.md                  

$ python3 mnist_1.0_softmax.py
/usr/lib/python3/dist-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment.
  warnings.warn('Matplotlib is building the font cache using fc-list. This may take a moment.')
/usr/lib/python3/dist-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment.
  warnings.warn('Matplotlib is building the font cache using fc-list. This may take a moment.')

Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.
Extracting data/train-images-idx3-ubyte.gz
Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.
Extracting data/train-labels-idx1-ubyte.gz
Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.
Extracting data/t10k-images-idx3-ubyte.gz
Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.
Extracting data/t10k-labels-idx1-ubyte.gz
Traceback (most recent call last):
  File "mnist_1.0_softmax.py", line 80, in <module>
    datavis = tensorflowvisu.MnistDataVis()
  File "/home/tonybai/test/tensorflow/tensorflow-mnist-tutorial/tensorflowvisu.py", line 166, in __init__
    self._color4 = self.__get_histogram_cyclecolor(histogram4colornum)
  File "/home/tonybai/test/tensorflow/tensorflow-mnist-tutorial/tensorflowvisu.py", line 160, in __get_histogram_cyclecolor
    colors = clist.by_key()['color']
AttributeError: 'Cycler' object has no attribute 'by_key'

出错了!

这里要注意的是:初次建立时,程序会首先从MNIST dataset下载训练数据文件,这里需要等待一段时间,千万别认为是程序出现什么hang住的异常情况。

之后的AttributeError才是真正的出错了!直觉告诉我是课程程序依赖的某个第三方库版本的问题,但又不知道是哪个库,于是我用临时处理方案fix it:

//tensorflowvisu.py
         #self._color4 = self.__get_histogram_cyclecolor(histogram4colornum)
         #self._color5 = self.__get_histogram_cyclecolor(histogram5colornum)
         self._color4 = '#CFF57F'
         self._color5 = '#E6C54A'

我把出错的调用注释掉,用hardcoding的方式直接赋值了两个color。

再次运行这个模型,我们终于看到那个展示训练过程的“高大上”的窗口弹了出来:

img{512x368}

运行一段时间后,当序号递增到2001时,程序hang住了。最初我以为是程序又出了错,最后在Martin的解释下,我才明白原来是训练结束了。在mnist_1.0_softmax.py文件末尾,我们可以看到这样一行注释:

# final max test accuracy = 0.9268 (10K iterations). Accuracy should peak above 0.92 in the first 2000 iterations.

这里告诉我们对神经网络的训练会进行多少次iterations。mnist_1.0_softmax.py需要2000次。tensorflow-mnist-tutorial下的每个训练程序文件末尾都有iteration次数,只不过有的说明简单些,有些复杂些罢了。

另外一个issue中,Martin也回应了上面的error问题,他的solution是:

pip3 install --upgrade matplotlib

我实测后,发现问题的确消失了!

四、小结

识别手写数字较为简单,采用softmax都可以将识别率训练到92%左右。采用其他几个模型,比如:mnist_4.1_batchnorm_five_layers_relu.py,可以将识别准确率提升到98%,甚至更高。

将这个教程运行起来的第一感觉就是AI真的很“高大上”,看着刷屏的日志和不断变化的UI,真有些科幻大片的赶脚,看起来也让你感觉心旷神怡。

不过目前仅仅停留在感性认知,深入理解TensorFlow背后的运行原理以及训练模型背后的理论才算是真正入门,这里仅仅是在AI领域迈出的一小步罢了^0^。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats