自从读研,论文阅读量直线上升,总觉得电子版读起来不如纸质的感觉好,最关键是电子版做笔记不方面。于是乎,和室友商量着买个打印机。因为是打论文看,所以对打印质量没有特别要求,只要公式清晰就行,因此为了节省成本,二手激光打印机是首选。 因为是寝室两个人用,所以网络打印机肯定是最方便的,但是贵啊……其次,考虑到成本,支持自动双面也会很划算(毕竟国产硒鼓二三十一个,而且还2000的打印量,还可以加粉,纸张的成本显得格外重要)。 目标明确:黑白激光,网络打印,自动双面,二手,开始淘宝~ 一番搜索,找到一款HP P2055DN的型号,自动双面,网络打印,但是要600多,有点贵,一番咨询,老板人很nice,推荐了HP P2015D,USB打印,自动双面,虽然不支持网络打印,但是便宜啊!当时突然觉得网络打印没那么重要了,一时心动就这个了。 买回来以后,发现,没有网络打印两个人用真的超级不方面。随时需要拔插不说,每次还要抱着笔记本蹲到角落里连上打印机……正有些懊恼的时候,看到了桌子角落里尘封已久的树莓派,心生一计,可以用这玩意儿做服务器啊,而且功耗还极低,完全可以一直保持开机状态,想想就很方便。于是乎一番搜索,有些教程极其复杂,有些有很简略,一时无所适从,还是变弄边看吧! 因为长久不用,树莓派的系统估计已经很过时了,不如格式化重来,于是到官网下载了树莓派的镜像安装系统,进行安装,这一步非常简单,到这里下载noobs,格式化TF卡,解压拷贝到TF卡里,连接电源,显示器,鼠标键盘,开机,按照提示安装即可。 接下来就是配置系统啦,首先是换源+升级系统。因为是教育网,用中科大的就很快,这里有配置教程。其实这里有个小坑,就算换了/etc/apt/sources.list文件中的源,apt-get update的时候还是会有一个官方源会卡住,那是因为/etc/apt/sources.list.d/raspi.list也需要配置,网上大部分教程没有涉及这个或者直接说删除这个文件,但是其实各大镜像是有这个的,只不过地址有点奇怪,以中科大源为例,要把这个文件中的http://archive.raspberrypi.org/debian/替换为http://mirrors.ustc.edu.cn/archive.raspberrypi.org/就OK啦。然后就是sudo apt-get update,sudo apt-get dist-upgrade。 接下来,安装USB无线网卡,以前本科毕业的时候,捡了两个TL-WN725N v2的小东西,没想到今天还用上了。然而悲催的是,驱动!这个不是官方支持的USB无线网卡,没有驱动……不过,一番搜索后,还是找到了,下载install即可,也很容易。教程,资源都在这里。唯一需要注意的地方是,文件下载可能需要翻墙,可以先用别的电脑下载对应版本的源码,拷贝到树莓派上install。 接下来就是安装cups,sudo apt-get install cups,然后输入sudo usermod -a -G lpadmin 自己的用户名(默认是pi,或者输入whoami查看),把自己添加到CUPS管理组,打开浏览器,输入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,拷贝到树莓派上上传即可。 添加完成后即可对打印机配置,比如勾选自动双面等等,不同厂商的打印机有不同的选项,这个就参见说明了。 最后,打印测试页测试一下吧~ […]

在Android端使用TensorFlow

本篇文章中软件的下载需要科学上网支持。 主要参考资料为这篇文章,但是原文章涉及的TF版本已经过旧,有些小坑,例如android工程几个项目文件的修改,已经完全不同了。 TensorFlow的一个很突出的优势是跨平台,但是这方面的资料还比较少。 不过最近随着1.0版本的发布,文档的逐渐完善,在移动端的应用也越来越都多,并且官方增加了两个demo。其实应用在移动端还是比较容易的,只是因为官方的文档还是太省略,并且如果没有前两篇(1,2)的铺垫知识,看起来容易一头雾水。还有一个复杂的地方是,如果需要自定义app需要用到一些Android编程的知识,并且Google的Bazel编译工具也实在是太小众了。鉴于这些坑,将项目的心得分享记录于此,以供参考,节省大家的时间。 通过前两篇博客(1,2),我们通过重新训练获得了权重值文件(retrained_graph.pb)和标签文件(retrained_labels.txt),利用这两个文件和官方给的demo代码,就可以简单实现在移动端(因为我手上只有Android设备,因此仅针对Android)的实时识别。 编译Android端的app需要用到Android的SDK与NDK,首先下载这两个工具集。不过我推荐先下载Android Studio,使用Android Studio管理SDK与NDK,这样下载,管理和升级比较方便,而且毕竟以后可能还要调整demo,要用到Android的开发IDE。下载过程就不详细描述了,Android开发者网站有很详细的步骤。 有了SDK与NDK后,就可以着手利用我们重训练的权重值文件与标签编译app了。首先,需要告诉TensorFlow SDK与NDK的路径。浏览至tensorflow目录,打开WORKSPACE文件,在文件第10行左右,会看到以下代码: # Uncomment and update the paths in these entries to build the Android demo. #android_sdk_repository( # name = “androidsdk”, # […]

本篇文章中软件的下载需要科学上网支持。 主要参考资料为这篇文章,主要步骤相同,对参数,细节做了说明。 一般来讲,深度学习的模型训练需要消耗大量的计算资源,例如Google的Inception模型,使用了8张K40显卡训练了两周,普通开发者一般没有这样强大的计算资源支撑。但是迁移学习提供了捷径,通过重训练已训练模型的最后几层,就可以将模型用于自定义图像的分类。TF提供了用于重训练的工具集。 因此,在尝试自己搭建模型并训练模型之前,应首先尝试使用重训练模型方法,这样的好处是可以先快速评估至少可以达到的准确率,对以后的模型建立,优化提供基线(baseline)。 并且,重训练生成的权重值文件可以用于TF移动端app,移动端app直接加载训练好的权重值,通过摄像头实时识别,这将在下篇博客中讲解。 这次项目中使用的是基金会提供的视网膜病变图像,数据集比较小,只有不到400张,依然达到了不错的准确率(测试集80%左右),本教程中,以开源数据集为例做示范。 开源数据集下载地址: http://download.tensorflow.org/example_images/flower_photos.tgz 首先,下载数据集 $ curl -O http://download.tensorflow.org/example_images/flower_photos.tgz 解压到某一目录下,比如~/Downloads/flower,可以看到,flower_photos文件夹中有5个分类,在重训练过程中,TF提供的工具集会将这五个分类文件夹的名称作为类别标签,因此,若需要修改分类标签,应在这里修改文件夹的名称。 上篇博客讲解了如何从源码安装TF(是本篇博客的基础)。 首先,浏览至源码目录顶层,例如: $ cd ~/tensorflow 然后执行重训练Python程序(这里的参数仅仅是示例,可直接打开源码文件,底部有所有参数以及参数说明,可用于进一步调参使用),注意路径替换为自己的路径: python3 tensorflow/examples/image_retraining/retrain.py \ –bottleneck_dir=/home/hp/Downloads/flower/bottlenecks \ –model_dir=/home/hp/Downloads/flower/inception \ –output_graph=/home/hp/Downloads/flower/retrained_graph.pb \ –output_labels=/home/hp/Downloads/flower/retrained_labels.txt […]

  今天(2017年2月15日),TensorFlow 1.0正式发布,这意味着TF已经可以真正作为生产环境的主力Framework了!向所有开发者致敬! 本篇文章中软件的下载需要科学上网支持。主要参考资料为tensorflow的官方说明文档。 本想在一月份就把近期做的一个有关医疗图像识别的项目以博客的形式记录下来,然而一直拖到现在……计划写一个小系列吧,把配置过程,尝试过的方法分开记录于此。就从从源码安装开始吧。 由于本项目用到了重训练inception和生成Android端app,这个过程需要使用TensorFlow中的一些二进制工具软件,仅仅使用pip安装Python包是不够的,因此,需要通过源码安装TF。并且,通过源码安装可以获得最大性能,可以开启CPU高级指令集(例如sse,avx)的支持。由于我使用的计算机配置的是AMD显卡,并且当时没有OpenCL支持,因此不涉及GPU版本,但步骤都是相似的,配合查阅官方文档很容易安装GPU版本。我使用的操作系统为Ubuntu 16.04(当时TF的版本是0.11,但是写这篇博客的时候1.0已经发布,因此我就以1.0版本为基础复现项目,在写作过程中我尽量每一步都使用1.0版本复现,防止造成困扰) 首先从github clone项目并checkout到1.0版本: $ git clone https://github.com/tensorflow/tensorflow $ cd tensorflow $ git checkout r1.0 安装编译工具Bazel: 首先安装JDK8: $ sudo add-apt-repository ppa:webupd8team/java $ sudo apt-get update […]

今天研分会开了个《掌控资源,助力科研》的讲座,主讲人是图书馆的管理老师陈卫静,讲的非常nice,总结一下(Google keep渣排版……) 主要目标: 检索 分析课题进展 找到课题空白 跟踪课题进展 有序管理已有文献 主要途径: 图书馆数据库 & 学术搜索引擎 馆际互借 文摘数据库为主,全文数据库 & 学术搜索引擎为辅 主要文献类型(中文 & 外文): 文摘 期刊 电子图书 学位论文 数据库类型: 文摘数据库(无全文信息): SCI DII (专利) EI PQDT-B […]

结合TensorFlow PlayGround的简单神经网络原理解释

很多人把机器学习(或者说本篇文章的重点:神经网络)看成“黑技术”、“黑魔法”,其实不然,所有的机器学习无外乎就是找到从输入到输入的最佳拟合函数,只是各种不同的机器学习技术得到的拟合函数方法、效果不同因此适用情景不同罢了。那么今天我们就结合TensorFlow的Playground来具体讲解一下,神经网络是如何去拟合输入和输出之间的目标函数的。好的,系好安全带,要发车了:) PlayGround是一个图形化用于教学目的的简单神经网络在线演示、实验的平台,非常强大地可视化了神经网络的训练过程。不得不说做出这个演示系统的人不仅对神经网络的见解深刻,更是找到了可视化的有力方法。建议使用的时候把右下角的discretize output(离散化输出)选上,不去让系统自动平滑,这样本质看的更清楚。我们首先简单的讲一下这个PlayGround。第一块也就是最上面一行是训练参数,保持默认即可,这个我们不去做过多解释和介绍。因为这涉及到更深层次的神经网络知识,远非一篇简短的blog可以解释清楚,而且本篇文章的重点也是从intuitive(直觉化,直观化)方式讲解基本原理。想要了解更多的内容,请参见我写的另一篇教程:新手向的TensorFlow学习之路(Learning paths)。第二块就是下面的内容,从左到右是dataset(数据集)选择,feature(特征)选择,hidden layers(隐含层)选择和output(输出)。 研究一个未知事物的时候,我们习惯于也应该从最简单的情况开始讨论,那么对于神经网络,什么是简单的情况?当然是神经元的数目越少越好,这样我们才能从繁杂的现象中理清关系。首先我们选择dataset中的第二行第一个,也就是Gaussian,然后feature选择x1,x2,点击hedden layers的减号去掉所有的隐含层,这样我们就得到的简单的模型,这个模型简单到只有两个神经元!就像这样:   接下来,我们点击第一行的Run开始训练。这个模型应该几秒钟就训练完成了。而且效果非常好,可以清晰的看出dataset已经被明显地按照颜色划分成了两块。你可能会觉得,What!!发生了什么!!别急,我们接着看。 这时把鼠标hover(悬停)在x1或者x2上,你会看到这样的划分: 对,这就是第一个feature,竖着“切一刀”!同样,第二个也是“切一刀”,不过是横着罢了。这样简单的“切一刀”就能解决问题吗?显然不能,所以这时时候weight(权重)就是上场了。weight就是来协调每个“切一刀”切多少的,把每个简单的动作联合起来,共同去解决问题。也就是说:每个神经元都是“傻傻的”只会一件事情,然后通过weight去组合协调,完成一件复杂的任务!多说无益。我们更进一步看看吧。 我们再把鼠标hover到那个连接x1,x2到output的线条上,这时你会看到“Weight is xxx”的字样,点击线条我们是可以修改那个xxx数值的。那我们就试着修改那个xxx吧!首先,把x1的weight改成0,你应该会看到这样的画面:   这不就是x2嘛!是不是有点感觉了?如果x2的weight是0那么应该和x1一样吧?那就来试试自己的猜想,点击第一行的reset(重置)后run重新训练,再试着把x2的weight改成0。这次发现,不出所料,果真是自己猜想的那样~这次我们把x1,x2的weight都改成1,当然如果你开心,可以都改成100:)你会发现,一条完美的对角线平分了dataset,把dataset分成了两个部分。就像这样: 这意味着什么?这意味着两点: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,activition 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有所理解。 如果您觉得作者的博客对您有用,不妨鼓励作者一下,作者将会更加努力写出高质量博客。

新手向的TensorFlow学习之路(Learning paths)

UPDATE:请看更新篇新手向的TensorFlow学习之路2 在学习Tensorflow的过程中磕磕碰碰,总结一些个人心得记录于此,志同道合之友共勉~~ 这篇文章算是新手向“纲领性”目录吧,近期正好在做一个有关TensorFlow的小项目,如果有时间就分章分篇详细写几篇TF的教程,还请大家关注本博客~ 1.翻墙:这个是个不是技术的技术,TensorFlow毕竟出自Google,官方文档访问不是很稳定,而且Google搜索的结果要比Baidu好很多。有些免费一键翻墙的软件比如Lantern,打不开就这个(在releases中下载对应操作系统版本),或者赛风。高级一点的是Shadowsocks。 在这里插一句,本来是不想说这些的,有推销嫌疑,但是有很多人文这个问题,有些推荐的梯子。我是用的是Digitalocean(这是我的推荐链接 ,使用的话你我都可以获得奖励)搭建服务器,很稳定,$5(约30人民币)一个月,1T流量(肯定是用不完的,好像超了也不收费),在服务器上跑了一个shadowsocks的服务端外加这个wordpress的博客。网上有很多搭建教程。或者如果想省事,可以与我合租,服务器已经搭建好了,简单配置即可。可以发我Gmail,在网站的About页面有。p.s. 几人合租就几分之一$5,无额外费用,程序员纯纯的友谊你懂的:) 2.Github:这是个开源程序的网站,Linux内核就在这个网站托管。Github的核心是Git,一种版本控制系统,已经逐渐取代SVN。这个网站托管了很多高质量的或者说世界顶尖的开源项目,比如TensorFlow。学习一下这个网站如何使用,注册个账号,学习一下Git的使用方法。这个网站有自己的tutorial和guide。 3.Linux: TensorFlow的主要运行平台就是Linux,目前在Windows上运行的方案是虚拟机,但是深度学习对计算要求还是比较高的,虚拟机效率不是太高,因此还是推荐在原生Linux中运行。新手推荐发行版是Ubuntu 或者Linux mint。这个可以自行搜索。学习Linux也有很多好处,因为很多开源软件都only linux的。 4.Python:这是一种非常流行的脚本语言,庞大的第三方库可以快速写出短小容易理解的代码,而且也是TensorFlow的推荐开发语言。教程太多了,这里给几个优秀的教程:官网教程,Learn Python the Hard Way,Python2.7教程 5.深度学习(Deep Learning,DL):虽然TensorFlow已经封装好了大部分DL的细节,但是如果不了解DL的相关核心概念,就会很难着手分析问题。首先强烈推荐这个教程,通读一遍,然后还有这个,可以快速浏览或者只看自己不太明白的地方,还有这个分块介绍的,还有几篇blog,这个和这个讲的是卷积神经网络。图像识别用的比较多的就是卷积神经网络,这两篇可以看看。 6.Tensorflow:前面都是铺垫,是为了更好地使用TensorFlow。官方的文档不错,可以从get started然后tutorial看起,有个中文的翻译版,但是更新不及时(官方已经v0.10,这个可能是v0.8或者v0.7),可能有坑,可以和英文对照着看,还有个TensorFlow的教程,也不错。有篇FIRST CONTACT WITH TENSORFLOW也不错。 7.优秀博客:http://acko.net/,https://bost.ocks.org/mike/,http://colah.github.io/,https://ireneli.eu/,这几个都是我在学习中遇到的非常nice的blog,有时间读读定会有所收获。 8.经典论文及书籍:收集了一些DL的经典论文&书籍,有些杂乱,不过几乎都是经典,各取所需吧。百度云地址(密码: 4w91)。各位有更好的欢迎推荐,我会整理上传。 其中,Python,DL,TensorFlow是重点,其他都是辅助, 自己感觉够用即可,无需深入。学习中遇到困难首先向搜索引擎询问。   […]