Talk is cheap

Do something cool and make the world a better place.

0%

如果用sudo执行python命令的话,会发现:

1
2
import os
os.getenv("PATH")

得到的变量和普通权限得到的不一致,即使是sudo加上-E参数也没有用。 这是sudoers的默认行为导致的,解决方案: sudo visudoDefaults env_reset改为Defaults !env_reset。 注意,加了!号。 同时注释掉Defaults secure_path,改完记得注销一下。

不需要以sudo执行python的时候记得改回来,防止出现权限安全问题。

这个奇葩的问题Google居然搜不到,看来是个神坑,分析过程如下:

既然问题的根源是sudo -E python都无法继承当前的环境变量,那么首先man sudo搜索-E参数,发现是这么写的:

-E, –preserve-env Indicates to the security policy that the user wishes to pre‐ serve their existing environment variables. The security policy may return an error if the user does not have permis‐ sion to preserve the environment.

感觉这句

The security policy may return an error if the user does not have permission to preserve the environment.

有问题,于是乎,man sudoers,搜索PATH,发现有这么一段:

By default, the env_reset option is enabled. This causes commands to be executed with a new, minimal environment. On AIX (and Linux systems without PAM), the environment is initialized with the contents of the /etc/environment file. The new environment contains the TERM, PATH, HOME, MAIL, SHELL, LOGNAME, USER, USERNAME and SUDO_* variables in addition to variables from the invoking process permitted by the env_check and env_keep options. This is effectively a whitelist for environment variables. Environment variables with a value beginning with () are removed unless both the name and value parts are matched by env_keep or env_check, as they will be interpreted as functions by older versions of the bash shell. Prior to version 1.8.11, such variables were always removed.

那肯定是envreset的锅跑不了了,继续搜索,发现envreset是默认参数行为,这就好办了,到sudoers文件里disable就好了。 因此,sudo visudoDefaults env_reset改为Defaults !env_reset,保险起见,注释掉Defaults secure_path,注销后生效,问题解决!

p.s. 后来似乎搜到了,PYTHONPATH not working for sudo on GNU/Linux (works for root)

2022更新:距离初版答案编写已经过去6年,就算是第二版的答案,很多内容也已经过时或者失效。我本人也很久不从事这个领域了,因此这次更新我会尽自己所能保持内容的有效性,还请读者辩证阅读。

阅读目的声明

发现很多人看这个回答并不是要学习TensorFlow本身,而是想高效入门并达到初级机器学习/深度学习实战水平。如果你是这类读者,那么直接看机器学习实战这本书(个人强烈推荐,属于读一本少一本的宝藏级书籍),并停止向下阅读本回答。如果你想深入了解、学习、使用TensorFlow,那么接着往下看。

TL;DR:有同学反应资源太多不知道从何看起,或者有点基础了想快速上手,因此就直接把几个比较好的教程放在这里,后面的内容作为参考。

  1. TensorFlow 实战Google深度学习框架 第2版(喜欢阅读中文资料的可以先看这本书)
  2. 两本书籍:TensorFlow Machine Learning Cookbook以及TensorFlow for Machine Intelligence,这两本网络均有pdf版本,请自行搜索
  3. Udacity公开课,深度学习
  4. 《三日入门TensorFlow》,直接搜索即可找到资源
  5. (推荐参考)Awesome TensorFlow

前言 其实TensorFlow本身仅仅是一个分布式的高性能计算框架,想要用TF做深度学习,仅仅学习这个框架本身是没有太大意义的。因此应该将TF看作技术路线中的一个核心点,去掌握整个开发所需要的必要技术,知识。尤其是深度学习的基本原理,这对日后搭建模型,模型调参以至提出新的模型都是极其有用的。

不是前提的前提–英语阅读【公共基础】

需要有扎实的英语阅读能力,其实与其说扎实,不如说是能沉下心看英语。 其实我最开始看这些大段英文文档的时候,我是拒绝的,后来发现真的,这是绕不过去的坎,再后来坚持背英语单词(推荐扇贝单词)加上耐着性子读好了很多。 至于原因,为什么读英文,那是因为不仅很多优秀的文档有且仅有英文的,更是很多国内的开发者也会用英文写。 而且,如果对于做学术的人,那么英语作为通用语言更是要熟练掌握。但是我尽量每个部分教程都给出一份中文的,尽量保证在不想看英文的情况下也有不错的指导。

科学上网【公共基础】

这是个不是技术的技术,不做过多解释

在这里插一句,本来是不想说这些的,有推销嫌疑,但是有很多人问这个问题,有哪些推荐的梯子。 我是用的是Digitalocean(这是我的推荐链接 ,使用的话你我都可以获得奖励)搭建服务器。 稳定性不错,$5/月,1T流量,在服务器上跑了一个shadowsocks的服务端

Github【公共基础】

这是个开源程序的网站,Linux内核就在这个网站托管。Github的核心是Git,一种版本控制系统,已经逐渐取代SVN。 这个网站托管了很多高质量的或者说世界顶尖的开源项目,比如TensorFlow。学习一下这个网站如何使用,注册个账号,学习一下Git的使用方法。 这个网站有自己的tutorial和guide。而且后期自己的项目管理多半也会用到git,所以,早点学习肯定是有好处的。

【fast peace(即简略的快节奏教程,下同)】

  1. Git 参考手册(推荐)
  2. git - the simple guide
  3. Git - Quick Guide

【hard way(即大而全的完整或者正式教程,下同)】:

  1. Pro Git与Git的参考文档
  2. Git - Tutorial
  3. Git Tutorial

Python【公共基础】

这是一种非常流行的脚本语言,庞大的第三方库可以快速写出短小容易理解的代码,而且也是TensorFlow的推荐开发语言。 不仅仅是对于TensorFlow这么语言很重要,对于整个机器学习,应用层面放眼望去基本就是Python与R的天下了,而R更偏向与统计学领域, 深度学习Python简直是红透的半边天,当然我是针对初学者,如果已经掌握了其他语言,例如Java,C++,那么其实理论上而言可以不用掌握Python, 选择自己熟悉的语言的API即可。但是对于TensorFlow,只有Python的API最全面,文档社区也最完善(截至2017年3月), 当然随着TensorFlow的发展都会完善,可是现在就要用呀:)。而且,最重要的是,对于已经掌握其他语言的人来说,学习Python不会花费太久的。 并且,Pytohn写起来短小精悍,易于理解,很适合这种用来搭架子调用框架而且不怎么需要考虑效率的场景(一般来讲,最需要效率的部分框架会用C++实现,Python仅仅是作为顶层去调用)。 另外,推荐学习Python3,这才是Python的未来,2.7的支持在2020年会停止。而且,后面会知道的,对于Python2.7向3的支持很多情况仅仅是import几个future包。

【fast peace】

  1. Tutorial - Learn Python in 10 minutes
  2. Python Quick Guide
  3. Google’s Python Class

【hard way】:

  1. 廖雪峰的Python教程
  2. The Python Tutorial

Linux【公共基础】

TensorFlow的主要运行平台之一就是Linux,但是正式版对Windows的支持日趋完善,真的没时间学习Linux平台可以先在Windows上运行TensorFlow。 不过,学习Linux真的用不了多久(当然是指做开发环境日常日用,立志做系统管理员还是要下一番功夫的)。推荐Ubuntu 16.04 LTS, 这不仅是“新手友好”的发行版,也是Google很多产品的官方支持版本,官方支持就会带来很多便捷以及少一些”坑“。 LTS(长期支持版本)的加成保证了系统的稳定(稳定不仅指运行稳定,更是指软件环境,例如python不会突然默认变成3.6,gcc不会突然就默认变成6)。 插一句,之所以这么说,是因为以前用的是Arch,装了TensorFlow一直跑的很开心,直到有天突然发现跑不起来了,原来是Arch升级了一下Python的默认版本变成了3.6了XD。

【fast peace】:

  1. 我的知乎回答

【hard way】:

  1. UNIX Tutorial for Beginners
  2. Linux Tutorial
  3. Linux工具快速教程
  4. Learn Online in 7 days

深度学习–概念与基础

【fast peace】(偏向概念介绍,introduction)

  1. 深度学习wiki

【hard way】(偏向概念解释,数学推导,基本原理)

两本经典中的经典书籍:第一本倾向于直观性的解释,第二本就更加理论了。

  1. Deep Learning
  2. Neural Networks and Deep Learning 代码应用向的,使用Theano从零搭建各种常见的网络结构

Python常用科学计算库【公共基础】

虽然说是公共基础部分,但是系统学习这几个库,也不是一件容易的事,而且很耗时间。因此还是遵循够用即可的原则。 但是还是想列在这里,因为后来发现如果这几个库掌握的比较熟练,数据预处理后处理都能极大地节省时间,当你还在苦苦想如何设计预处理方法的时候, 其实去查一查手册,大概率在这几个库里已经写好了。 这几个库的官方文档都很优秀,比如Pandas的10 Minutes to pandas。因此,闲余时间多看看官方tutorial即可。

  1. Numpy
  2. Sklearn
  3. Matplotlib
  4. Pandas

TensorFlow

【fast peace】(偏向应用性质,到手即用,pretrained-models,tflearn,keras等)

  1. TensorFlow白皮书,对TensorFlow的整体有个把握或者说印象是很有必要的,对后期的“图编程”,优化,都很有启发
  2. Keras,High Level API,目前已经集成进TensorFlow了

【hard way】(偏向理论性质,调用基本API手写,自定义layer,自定义kernel,自定义optimizer等)

  1. 官网教程
  2. Google的Udacity课程

论文阅读路线图

【hard way】

github上有个很有名的repo,已经过万stars,从事深度学习科研者的必读清单。

  1. Deep Learning papers reading roadmap

相关博客等其他资源

教程、资源

  1. CS231n: Convolutional Neural Networks for Visual Recognition
  2. CS224n: Natural Language Processing with Deep Learning
  3. UFLDL Tutorial
  4. First Contact With TensorFlow
  5. Practical Deep Learning for Coders(一个不错的视频教程)
  6. DeepLearning4J(虽然是一个面向Java的深度学习框架,但是文档很好,通用性也很强)
  7. arxiv-sanity

    优秀个人博客

  8. colah(强烈推荐,写了很多晦涩概念可视化的文章)
  9. Chris McCormick
  10. Daniil
  11. ireneli
  12. Hackery

最近感觉很多应该掌握的技术虽然都知道,也用过,也能说上一知半解,但是没有成系统串起来,趁着读研好好梳理一下需要掌握的知识。

语言

  1. C++:阅读《C++ Primer》
  2. Python:重温,着重温习高级特性
  3. Java:重温,重拾老本行:),官方Learning path
  4. Javascript(及其常用框架):按照现在的流行程度再不学不学真是不行了…

算法

  1. 基本算法:阅读《算法》

Linux

  1. Shell 脚本:阅读《Linux Shell 脚本攻略》
  2. Linux编程:阅读《Unix环境高级编程》

异构/并行计算

  1. CUDA:按照这个Learning path学习基础知识,阅读《CUDA C Programming Guide》以及《CUDA C Best Practices Guide》
  2. 阅读《多核应用编程实战》
  3. OpenCL:暂无具体打算,作为了解。

机器学习

  1. 数据挖掘基础理论:阅读《数据挖掘导论》
  2. 深度学习理论学习:阅读《Deep Learning》
  3. 阅读《数据科学家养成手册》
  4. Python爬虫:Scrapy
  5. 框架:TensorFlow,Pytorch(据说很好用很学术,喵喵喵?)

数学理论

  1. 矩阵分析:《特殊矩阵》课程,阅读《矩阵分析与应用》
  2. 图论:《图论》课程
  3. 阅读Deep Learning的paper road

工具

  1. LaTeX:阅读lshort并实践
  2. Markdown:阅读Markdown: Syntax,与Markdown Cheatsheet并实践
  3. django:学习框架基本用法
  4. 数据库技术:学习SQL语言与Oracle数据库

其他

  1. 科普
    • 阅读《通向实在之路》
  2. 社科
    • 学习日语
    • 阅读《The old man and the sea》

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进行分类可视化的效果。

实现的关键代码是(解释详见注释):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import tensorflow as tf

config = tf.contrib.tensorboard.plugins.projector.ProjectorConfig()
embedding_config = config.embeddings.add()
# embedding是一个tf变量
embedding_config.tensor_name = embedding.name
# sprite image文件路径
embedding_config.sprite.image_path = sprite_path
# labels文件路径
embedding_config.metadata_path = labels_path
# sprite image中每一单个图像的大小
embedding_config.sprite.single_image_dim.extend([28, 28])
# 写入配置
tf.contrib.tensorboard.plugins.projector.visualize_embeddings(writer, config)

从代码中可以看出,关键在于,embedding变量,sprite image文件路径,labels文件路径。 具体的实现详见示例代码

看完了TensorFlow官网的两份白皮书后,产生了阅读源码的念头。 不过,git clone下来以后,仅从代码大小上就可以看出TF的体量之大,源码绝不是一己之力一时半会能够理解的。 几番搜索,发现网上关于源码阅读的教程确实是很少,这里有一份不错的这里 还有google group里的讨论,为了方便读者阅读,引用于此:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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)
core/framework/ contains the main abstract graph computation and other useful libraries
core/platform/ contains code that abstracts away the platform and other imported libraries (protobuf, etc)

TensorFlow relies heavily on the Eigen library for both CPU and GPU calculations. Though some GPU kernels are implemented directly with CUDA code.

bazel builds certain C++ code using gcc/clang, and certain CUDA code (files with extension .cu.cc) with nvcc.

python/ops/ contain the core python interface
python/kernel_tests/ contain the unit tests and lots of example code
python/framework/ contains the python abstractions of graph, etc, a lot of which get serialized down to proto and/or get passed to swigged session calls.
python/platform/ is similar to the C++ platform, adding lightweight wrappers for python I/O, unit testing, etc.

contrib/*/ directories generally mimic the root tensorflow path (i.e., they have core/ops/, etc)

自从读研,论文阅读量直线上升,总觉得电子版读起来不如纸质的感觉好,最关键是电子版做笔记不方面。于是乎,和室友商量着买个打印机。 因为是打论文看,所以对打印质量没有特别要求,只要公式清晰就行,因此为了节省成本,二手激光打印机是首选。

因为是寝室两个人用,考虑到成本,支持自动双面会很划算(毕竟国产硒鼓二三十一个,而且还2000的打印量,还可以加粉,纸张的成本显得格外重要)。 目标明确:黑白激光,自动双面,二手,开始淘宝~ 一番搜索,找到一款HP P2015D,USB打印,自动双面,就这个了。

买回来以后发现,没有网络打印两个人用真的超级不方面。随时需要拔插不说,每次还要抱着笔记本蹲到角落里连上打印机…

正有些懊恼的时候,看到了桌子角落里尘封已久的树莓派,心生一计,可以用这玩意儿做服务器啊,而且功耗还极低,完全可以一直保持开机状态,想想就很方便。 于是乎一番搜索,有些教程极其复杂,有些有很简略,一时无所适从,还是变弄边看吧!

因为长久不用,树莓派的系统估计已经很过时了,不如格式化重来,于是到官网下载了树莓派的镜像安装系统,进行安装,这一步非常简单:

  1. 这里下载noobs
  2. 格式化TF卡,解压拷贝到TF卡里
  3. 连接电源,显示器,鼠标键盘
  4. 开机,按照提示安装

接下来就是配置系统啦,首先是换源+升级系统。因为是教育网,用中科大的就很快,这里有配置教程。

其实这里有个小坑,就算换了/etc/apt/sources.list文件中的源,apt-get update的时候还是会有一个官方源会卡住,那是因为/etc/apt/sources.list.d/raspi.list也需要配置, 网上大部分教程没有涉及这个或者直接说删除这个文件,但是其实各大镜像是有这个的,只不过地址有点奇怪。 以中科大源为例,要把:

1
2
3
http://archive.raspberrypi.org/debian/
替换为
http://mirrors.ustc.edu.cn/archive.raspberrypi.org/

然后就是:

1
2
sudo apt-get update
sudo apt-get dist-upgrade

接下来,安装USB无线网卡,以前本科毕业的时候,捡了两个TL-WN725N v2的小东西,没想到今天还用上了。 然而悲催的是,驱动!这个不是官方支持的USB无线网卡,没有驱动… 不过,一番搜索后,还是找到了,下载install即可,也很容易。 教程,资源都在这里。 唯一需要注意的地方是,文件下载可能需要翻墙,可以先用别的电脑下载对应版本的源码,拷贝到树莓派上install。

接下来就是安装cups和把自己添加到CUPS管理组:

1
2
sudo apt-get install cups
sudo usermod -a -G lpadmin $(whoami)

打开浏览器,输入127.0.0.1:631进入管理页面。到Administration页面,添加打印机,添加驱动的时候注意,勾选上shared,并且最好上传ppd文件,不用默认的驱动, 因为第一次我就是从页面里选的驱动型号,结果打印奇慢并且效果奇差,后来上传ppd文件就好了。

ppd文件获取方式是,首先把打印机连接到计算机(Ubuntu 16.04,Windows不清楚…),然后到/etc/cups/ppd/文件夹下找对应型号的ppd文件, 比如这个HP P2015D打印机对应的是:HP-LaserJet-P2015-Series.ppd,拷贝到树莓派上上传即可。

添加完成后即可对打印机配置,比如勾选自动双面等等,不同厂商的打印机有不同的选项,这个就参见说明了。最后,打印测试页测试一下吧~

p.s. 按照这样的方法有可能会出现打印很慢的情况,如果遇到这种情况,就删除打印机,在添加驱动的步骤中,选择RAW, 然后在客户机搜索到这个RAW打印机后在客户机本地安装驱动,可以缓解打印过慢的情况。

本篇文章中软件的下载需要科学上网支持。

主要参考资料为这篇文章,主要步骤相同,对参数,细节做了说明。

一般来讲,深度学习的模型训练需要消耗大量的计算资源,例如Google的Inception模型,使用了8张K40显卡训练了两周,普通开发者一般没有这样强大的计算资源支撑。 但是迁移学习提供了捷径,通过重训练已训练模型的最后几层,就可以将模型用于自定义图像的分类。TF提供了用于重训练的工具集。 因此,在尝试自己搭建模型并训练模型之前,应首先尝试使用重训练模型方法,这样的好处是可以先快速评估至少可以达到的准确率,对以后的模型建立,优化提供基线(baseline)。 并且,重训练生成的权重值文件可以用于TF移动端app,移动端app直接加载训练好的权重值,通过摄像头实时识别,这将在下篇博客中讲解。

这次项目中使用的是基金会提供的视网膜病变图像,数据集比较小,只有不到400张,依然达到了不错的准确率(测试集80%左右),本教程中,以开源数据集为例做示范。 开源数据集下载地址:http://download.tensorflow.org/example_images/flower_photos.tgz

首先,下载数据集

1
curl -O http://download.tensorflow.org/example_images/flower_photos.tgz

解压到某一目录下,比如~/Downloads/flower,可以看到,flower_photos文件夹中有5个分类,在重训练过程中,TF提供的工具集会将这五个分类文件夹的名称作为类别标签。 因此,若需要修改分类标签,应在这里修改文件夹的名称。

进入tensorflow源码目录,然后执行重训练Python程序(这里的参数仅仅是示例,可直接打开源码文件,底部有所有参数以及参数说明,可用于进一步调参使用),注意路径替换为自己的路径:

1
2
3
4
5
6
python3 tensorflow/examples/image_retraining/retrain.py \
--bottleneck_dir=~/Downloads/flower/bottlenecks \
--model_dir=~/Downloads/flower/inception \
--output_graph=~/Downloads/flower/retrained_graph.pb \
--output_labels=~/Downloads/flower/retrained_labels.txt \
--image_dir=~/Downloads/flower/flower_photos

参数解析:

  1. bottleneck_dir:生成bottleneck文件,加快训练过程,详细解释参见这里
  2. model_dir:下载的Inception存放目录。
  3. output_graph:重训练生成的权重值的存放目录。
  4. output_labels:重训练生成的标签的存放目录。
  5. image_dir:数据集目录。

执行Python程序后,会自动下载Inception模型,随后会生成bottleneck文件并开始重训练,此过程需要些时间。或者:TF提供了二进制重训练工具,执行以下命令编译:

1
bazel build --config opt tensorflow/examples/image_retraining:retrain

其中--config opt参数利用了configure步骤设置的指令集,可以最大化性能。参数与上面的Python程序类似,可以-h查看参数列表与用法:

1
bazel-bin/tensorflow/examples/image_retraining/retrain -h

训练完成在output_graph文件夹将会得到重训练好的权重值文件,接下来,编译分类器,让此分类器利用训练好的权重值执行分类任务:

1
bazel build tensorflow/examples/label_image:label_image

执行分类测试:

1
2
3
4
5
bazel-bin/tensorflow/examples/label_image/label_image \
--graph=~/Downloads/flower/retrained_graph.pb \
--labels=~/Downloads/flower/retrained_labels.txt \
--output_layer=final_result \
--image=~/Downloads/flower/flower_photos/8181477_8cb77d2e0f_n.jpg

程序所用参数应该很容易理解。 这种方法可以用来测试,如果批量对图片分类的话会很慢,因为每次执行命令都会重新加载整个权重值文件, 因此,批量分类应使用另写Python程序利用TF加载重训练的权重值建立图,然后批量分类。具体实现过程我放到了github上,必要的注释在源文件中。

今天研分会开了个《掌控资源,助力科研》的讲座,主讲人是图书馆的管理老师陈卫静,讲的非常nice,总结一下。

主要目标:

  1. 检索
  2. 分析课题进展
  3. 找到课题空白
  4. 跟踪课题进展
  5. 有序管理已有文献

主要途径:

  1. 图书馆数据库 & 学术搜索引擎
  2. 馆际互借
  3. 文摘数据库为主,全文数据库 & 学术搜索引擎为辅

主要文献类型(中文 & 外文):

  1. 文摘
  2. 期刊
  3. 电子图书
  4. 学位论文

数据库类型:

  1. 文摘数据库(无全文信息):
    • SCI
    • DII (专利)
    • EI
    • PQDT-B
  2. 全文数据库:
    • ASME
    • ACM
    • IEL
    • ELsevier
  3. 中文数据库:
    • CNKI
    • 万方
  4. JCR数据库(查看影响因子)

SCI检索技巧:

  1. 基本检索 & 高级检索
    • 逻辑关键词 and or not
    • 位置关键词 same near
    • 截词
  2. 优先阅读文章
    • 高被引
    • 热点论文
    • Review(综述)
  3. 跟踪服务:
    • 引文跟踪
    • 引文报告

从一篇高质量文章开始入手:

  1. 查阅文章的引用文献:越查越旧–>追根溯源
  2. 查阅被引文章:越查越新–>发展趋势
  3. 查阅相关文献:越查越广–>业界态势

文献管理软件:

  1. Endnote(需要注册SCI检索):
    • 网页版和SCI检索无缝衔接
    • word插件–>写作助手,一键插入引用文献
  2. notefirst:
    • 投稿助手–>分析适合投递的刊物
    • 论文助手–>论文模板,参考文献一键插入

很多人把机器学习(或者说本篇文章的重点:神经网络)看成“黑技术”、“黑魔法”,其实不然,所有的机器学习无外乎就是找到从输入到输入的最佳拟合函数, 只是各种不同的机器学习技术得到的拟合函数方法、效果不同因此适用情景不同罢了。 那么今天我们就结合TensorFlow的Playground来具体讲解一下,神经网络是如何去拟合输入和输出之间的目标函数的。好的,系好安全带,要发车了:)

PlayGround是一个图形化用于教学目的的简单神经网络在线演示、实验的平台,非常强大地可视化了神经网络的训练过程。 不得不说做出这个演示系统的人不仅对神经网络的见解深刻,更是找到了可视化的有力方法。建议使用的时候把右下角的discretize output(离散化输出)选上,不去让系统自动平滑,这样本质看的更清楚。

我们首先简单的讲一下这个PlayGround。 第一块也就是最上面一行是训练参数,保持默认即可,这个我们不去做过多解释和介绍。 因为这涉及到更深层次的神经网络知识,远非一篇简短的blog可以解释清楚,而且本篇文章的重点也是从intuitive(直觉化,直观化)方式讲解基本原理。 想要了解更多的内容,请参见我写的另一篇教程:新手向的TensorFlow学习之路(Learning paths)。 第二块就是下面的内容,从左到右是dataset(数据集)选择,feature(特征)选择,hidden layers(隐含层)选择和output(输出)。

研究一个未知事物的时候,我们习惯于也应该从最简单的情况开始讨论,那么对于神经网络,什么是简单的情况? 当然是神经元的数目越少越好,这样我们才能从繁杂的现象中理清关系。首先我们选择dataset中的第二行第一个,也就是Gaussian, 然后feature选择x1,x2,点击hedden layers的减号去掉所有的隐含层,这样我们就得到的简单的模型,这个模型简单到只有两个神经元! 就像这样: playground1 接下来,我们点击第一行的Run开始训练。这个模型应该几秒钟就训练完成了。而且效果非常好,可以清晰的看出dataset已经被明显地按照颜色划分成了两块。 你可能会觉得,What!!发生了什么!!别急,我们接着看。

这时把鼠标hover(悬停)在x1或者x2上,你会看到这样的划分: playground2 对,这就是第一个feature,竖着“切一刀”!同样,第二个也是“切一刀”,不过是横着罢了。这样简单的“切一刀”就能解决问题吗?显然不能,所以这时时候weight(权重)就是上场了。 weight就是来协调每个“切一刀”切多少的,把每个简单的动作联合起来,共同去解决问题。也就是说:

每个神经元都是“傻傻的”只会一件事情,然后通过weight去组合协调,完成一件复杂的任务!

多说无益。我们更进一步看看吧。 我们再把鼠标hover到那个连接x1,x2到output的线条上,这时你会看到“Weight is xxx”的字样,点击线条我们是可以修改那个xxx数值的。 那我们就试着修改那个xxx吧!首先,把x1的weight改成0,你应该会看到这样的画面: playground3

这不就是x2嘛!是不是有点感觉了?如果x2的weight是0那么应该和x1一样吧?那就来试试自己的猜想,点击第一行的reset(重置)后run重新训练,再试着把x2的weight改成0。 这次发现,不出所料,果真是自己猜想的那样~这次我们把x1,x2的weight都改成1,当然如果你开心,可以都改成100:)你会发现,一条完美的对角线平分了dataset,把dataset分成了两个部分。 就像这样: playground4

这意味着什么?这意味着两点:

  1. weight确实是各个feature的加权值,是一个去协调各个feature的量,weight(x1)=weight(x2)的时候,x1,x2同等重要,导致平分天下
  2. 学习/训练的过程不过是去寻找选择最优weight的过程,如果“人眼”能一眼看出weight,就像这个简单的数据集,我们大可去手工输入weight,同样可以达到一样甚至更好的效果!

这正验证了之前的结论:

每个神经元都是“傻傻的”只会一件事情,然后通过weight去组合协调,完成一件复杂的任务!

两个神经元尚且如此,想象一个拥有成千上万乃至上亿神经元的系统(比如人脑),完全不用奇怪这个系统可以完成及其复杂的任务! 现在可以尝试不同的dataset,再多加几个hidden layers,感受一下简单的神经元通过weight组合协调完成分类任务的强大。 推荐试一下这个组合:dataset选择第一行第二个Exclusive or,feature只选择一个,就是第五个x1x2,然后hidden layers为0,也就是没有隐含层。 然后再试一下用其他的feature去训练,对比感受一下feature的选择对结果的巨大影响。

讲到这里,应该对神经网络的基本原理有了朦胧的认识的,但这是远远不够的,还有很多都没有讲(好吧,主要是比较懒:)), 比如feature,multiple output,activation function等等,感兴趣可以参见Michael Nielsen的这一讲, 可视化地证明了神经网络对任意函数的拟合能力,非常精彩。阅读过程中可以结合PlayGround去理解。

在刚开始学习使用TF的过程中,我不是很理解什么是batch。也经常有人问,到底minibatch是干什么的? 然而这是一个在TF中,或者说很多DL的框架中很常见的词。 这个解释我觉得比较贴切也比较容易理解。引用如下:

深度学习的优化算法,说白了就是梯度下降。每次的参数更新有两种方式: 第一种,遍历全部数据集算一次损失函数,然后算函数对各个参数的梯度,更新梯度。 这种方法每更新一次参数都要把数据集里的所有样本都看一遍,计算量开销大,计算速度慢,不支持在线学习,这称为Batch gradient descent,批梯度下降。 另一种,每看一个数据就算一下损失函数,然后求梯度更新参数,这个称为随机梯度下降,stochastic gradient descent。 这个方法速度比较快,但是收敛性能不太好,可能在最优点附近晃来晃去,hit不到最优点。两次参数的更新也有可能互相抵消掉,造成目标函数震荡的比较剧烈。 为了克服两种方法的缺点,现在一般采用的是一种折中手段,mini-batch gradient decent,小批的梯度下降,这种方法把数据分为若干个批,按批来更新参数, 这样,一个批中的一组数据共同决定了本次梯度的方向,下降起来就不容易跑偏,减少了随机性。另一方面因为批的样本数与整个数据集相比小了很多,计算量也不是很大。

Michael Nielsen在这一章节也有解释,mini-batch是什么,为什么有这个东西。 Deep Learning的这一章节的5.9小节也有解释,还给出了batch的典型值。 结合上面给出的中文解释,再看这两个小节,应该会对batch有所理解。