如果用sudo执行python命令的话,会发现import os; os.getenv(“PATH”)得到的变量和普通权限得到的不一致,即使是sudo加上-E参数也没有用。 这是sudoers的默认行为导致的,解决方案: sudo visudo Defaults 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 […]

这个月考完研究生阶段应该是告别传统考试了… 好久没更新啦 考完计划写写最近的心得

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》 Python:重温,着重温习高级特性 Java:重温,重拾老本行:),官方Learning path Javascript(及其常用框架):按照现在的流行程度再不学不学真是不行了… 算法 基本算法:阅读《算法》 Linux Shell 脚本:阅读《Linux Shell 脚本攻略》 Linux编程:阅读《Unix环境高级编程》 异构/并行计算 CUDA:按照这个Learning path学习基础知识,阅读《CUDA C Programming Guide》以及《CUDA C Best Practices Guide》 阅读《多核应用编程实战》 OpenCL:暂无具体打算,作为了解。 机器学习 数据挖掘基础理论:阅读《数据挖掘导论》 […]

虽然用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) […]

自从读研,论文阅读量直线上升,总觉得电子版读起来不如纸质的感觉好,最关键是电子版做笔记不方面。于是乎,和室友商量着买个打印机。因为是打论文看,所以对打印质量没有特别要求,只要公式清晰就行,因此为了节省成本,二手激光打印机是首选。 因为是寝室两个人用,所以网络打印机肯定是最方便的,但是贵啊……其次,考虑到成本,支持自动双面也会很划算(毕竟国产硒鼓二三十一个,而且还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 […]