March 2017

TL;DR:有同学反应资源太多不知道从何看起,或者有点基础了想快速上手,因此就直接把几个比较好的教程放在这里,后面的内容作为参考。 Stanford的CS 20SI课程,专门针对TensorFlow的课程,Tensorflow for Deep Learning Research 两本书籍:TensorFlow Machine Learning Cookbook以及TensorFlow for Machine Intelligence,这两本网络均有pdf版本,请自行搜索。 Udacity公开课,深度学习 第一篇学习之路写于2016年6月份,时过境迁,特别是深度学习这个日新月异的领域,隔了那么久,不得不说已经有些过时了,并且随着学习的深入,越发觉得之前的学习之路过于笼统,加之TensorFlow发布了1.0正式版,因此整理一下,再次写一篇。这次在内容的结构上将会大体分为三种,首先是公共基础部分,这个无需多解释。另外,一个是偏向应用性质的快节奏(fast peace),针对不想也没必要深入了解理论知识希望尽快应用的人群,另一种是偏向研究性质的人群(hard way),针对例如研究生之类希望深入理论知识的人群。当然,hard way的前提是fast peace。但是写法上,并没有分别写,因为某种意义上这两种是相互包含的,分开写会显得冗长与重复,因此采用粗体标记提示特定部分是属于哪一种。 0. 不是前提的前提–英语阅读【公共基础】:需要有扎实的英语阅读能力,其实与其说扎实,不如说是能沉下心看英语。其实我最开始看这些大段英文文档的时候,我是拒绝的,后来发现真的,这是绕不过去的坎,再后来坚持背英语单词(推荐扇贝单词)加上耐着性子读好了很多。至于原因,为什么读英文,那是因为不仅很多优秀的文档有且仅有英文的,更是很多国内的开发者也会用英文写。而且,如果对于做学术的人,那么英语作为通用语言更是要熟练掌握。但是我尽量每个部分教程都给出一份中文的,尽量保证在不想看英文的情况下也有不错的指导。 1. 翻墙【公共基础】:这是个不是技术的技术,TensorFlow毕竟出自Google,官方文档访问不是很稳定,而且Google搜索的结果要比Baidu好很多(学术,代码,外文类,这是有目共睹的)。有些免费一键翻墙的软件比如Lantern,打不开就这个(在releases中下载对应操作系统版本),或者赛风。高级一点的是Shadowsocks,这个不同于前面的一键翻墙工具,需要自己配置服务器或者购买配置好的服务。 在这里插一句,本来是不想说这些的,有推销嫌疑,但是有很多人文这个问题,有哪些推荐的梯子。我是用的是Digitalocean(这是我的推荐链接 ,使用的话你我都可以获得奖励)搭建服务器,很稳定,$5(约35人民币)一个月,1T流量(肯定是用不完的,好像超了也不收费),在服务器上跑了一个shadowsocks的服务端外加这个wordpress的博客。网上有很多搭建教程。或者如果想省事,可以与我合租,服务器已经搭建好了,简单配置即可。可以发我Gmail,在网站的About页面有。p.s. 几人合租就几分之一$5,无额外费用,程序员纯纯的友谊你懂的:) 2. Github【公共基础】:这是个开源程序的网站,Linux内核就在这个网站托管。Github的核心是Git,一种版本控制系统,已经逐渐取代SVN。这个网站托管了很多高质量的或者说世界顶尖的开源项目,比如TensorFlow。学习一下这个网站如何使用,注册个账号,学习一下Git的使用方法。这个网站有自己的tutorial和guide。而且后期自己的项目管理多半也会用到git,所以,早点学习肯定是有好处的。 【fast […]

最近感觉很多应该掌握的技术虽然都知道,也用过,也能说上一知半解,但是没有成系统串起来,趁着研一下学期正好课不多也没科研任务,好好梳理一下需要重新掌握的知识。 语言 C++:阅读《C++ Primer》,25天 Python:重温,着重温习高级特性 Java:重温,重拾老本行:) 算法 基本算法:阅读《算法》,45天 Linux Shell 脚本:阅读《Linux Shell 脚本攻略》,18天 异构计算 CUDA:按照这个Learning path学习基础知识,阅读《CUDA C Programming Guide》以及《CUDA C Best Practices Guide》,60天 OpenCL:暂无具体打算,作为了解。 机器学习 数据挖掘基础理论:阅读《数据挖掘导论》,25天 深度学习理论学习:阅读《Deep Learning》,45天 Python爬虫:Scrapy,45天 框架:TensorFlow […]

虽然用Linux好几年了,但是对shell脚本的掌握基本为零……最近需要做一些文件批量重命名,图像批量预处理,文本批量预处理的琐碎而重复的工作,于是乎下定决心好好学习一下shell脚本。于是找了一本口碑不错的shell脚本入门书—-《Linux Shell 脚本攻略 第2版》,是印度人Shantanu Tushar和Sarath Lakshman写的。边看边写博客系列(计划分九个系列完成)当做读书笔记,同时,也不完全是读书笔记,会加上一些解释的链接或者个人的经验:)当然,如果有人看,也算是做个“脱水版”的精炼shell脚本入门“指南”吧:) 基本的文件格式结构,运行规则:文件开头第一行 #!/bin/bash(这里可以是别的shell的路径),#!这玩意叫shebang,运行可以$ bash script.sh 这种运行方式首行的shebang就没什么用了,或者$ chmod +x script.sh 然后 $ ./script.sh。 命令间隔符:换行符或者分号; 是等价的,也就是说 $ cmd1; cmd2 等同于 $ cmd1 $ cmd2。 终端的打印:最基本的echo,$ echo “Hello […]

TensorBoard Embedding 实战

TensorBoard是TensorFlow自带的一个训练可视化工具,可以实现对训练过程中的tensor量监控,常见的包括loss,accuracy等等,同时也可以对权重值W,偏置值b等绘制histogram(不过这个不是传统意义上的histogram,开发组也在着手让这个histogram变得更直观),r0.12版本中添加了新功能embedding,随着r1.0的释出,embedding也越发成熟,但是官网的教程确实让新手一头雾水,几番搜索后,发现了一份不错的示例代码,但是这其中还是有些比较隐晦的概念,因此这篇博客针对对mnist的embedding进行讲解。 预备知识: 1. 什么是embedding,首先,可以看看wiki的定义,其实简而言之,embedding就是一个“保持结构的单射”,保持结构是指不改变原始数据的结构信息(比如几何结构,mnist图像的内在结构),单射是指一一映射,这样就很好理解什么叫对mnist进行embedding,也就是对mnist原始图像进行一个“保持结构的单射变换”,使得一个图像这种非结构型数据易于处理(分类),如果对词嵌入很熟悉的话,就很好理解了,词嵌入也是一种embedding,把词映射到了实数空间。 2. 什么是sprite image,首先看一下w3schools的定义,这个其实在网页和游戏里比较常用,就是把很多零碎的小图片拼接成一张大图片,要用到相应图片的时候就去大图片上截取。例如,1024张mnist图像拼接的sprite image是这样的: 接下来我就先说一下TensorBoard Embedding的基本思想,基本代码操作,然后给出完整代码以及用到的资源。(请先阅读上面给出的官方教程,有很多概念需要了解,例如sprite image以及labels文件的内容,组织方式等。) TensorBoard Embedding的基本思想就是embedding+sprite image。首先,输入(例如mnist图像以及对应的标签)经过模型(例如卷积神经网络)得到输出(一个对图像重表示的tensor),这个输出的tensor其实就可以看做对一个mnist输入的embedding(1.由图像结构计算出的。2.每个图像有且仅有一个对应的输出tensor),那么,我们就可以利用这个embedding对原始的mnist图像进行分类,可视化处理。随后,指定sprite image的路径以及对应的labels的路径,利用给出的labels去把输出的tensor绑定到对应的sprite image区块的图像。这么说有点绕,举个例子:mnist的有监督训练,网络模型接收了一个mnist图像“7”以及对应这个图像的标签“7”,经过模型,得到输出tensor “t”,那么TensorBoard就会去给定的labels文件里寻找“7”这个标签,然后找到“7”这个标签对应的sprite image中的区块(行优先),绑定到tensor “t”上,这样,对tensor进行可视化的时候就可以显示绑定的image,达到对image进行分类可视化的效果。 实现的关键代码是(解释详见注释): config = tf.contrib.tensorboard.plugins.projector.ProjectorConfig() embedding_config = config.embeddings.add() # embedding是一个tf变量 embedding_config.tensor_name = […]

看完了TensorFlow官网的两份白皮书后,产生了阅读源码的念头,不过,git clone下来以后,仅从代码大小上就可以看出TF的体量之大,源码绝不是一己之力一时半会能够理解的。几番搜索,发现网上关于源码阅读的教程确实是很少,这里有一份不错的,这里还有google group里的讨论,为了方便墙内读者阅读,引用于此: core/ contains the main C++ code and runtimes. core/ops/ contains the “signatures” of the operations core/kernels/ contains the “implementations” of the operations (including CPU and CUDA kernels) […]