2017-12-26

Matplotlib subplot 关闭坐标显示

只要在Subplot(...)添加axis(‘off’)就可以了。

例如:

Subplot(2, 2, 1).axis(‘off’)

2017-12-23

2017-12-02

Xfce 关闭屏保


  1. 在设置中打开Screensaver

  2. 关闭屏保


虽然很简单,但是我居然找了好久。。。



如下图所示,关闭屏保

2017-11-12

如何在ubuntu设置共享目录文件夹

这篇百度经验介绍了一个很简单的办法。我一开始也是用这个方法的。但是这个方法在xfce桌面环境下就不那么好用了。

所以Xfce下可以用这个方法:

sudo apt install gnome-system-tools

然后运行shares-admin



参考资料: [1]

2017-11-10

ubuntu 自动挂载

由于工作站有两块硬盘,2T的机械硬盘需要自动挂载。man了一下mount,发现/etc/fstab这个文件可以设置。于是依葫芦画瓢,修改了这个文件。果真实现了自动挂载。这一次的心得是:网上看上去很牛逼的教程,其实自己也可以做到,并没有那么难,只要你愿意看文档。

修改/etc/fstab

参考资料:[1][2]

UUID的获取:可以使用GParted查看





挂载后出现权限不够,所有者是root用户。于是修改下权限即可



使用命令:

sudo chown your_user:your_user <mount point> 命令修改所有者。修改之后,重启,就可以使用了。

参考资料:[3]

2017-11-05

彻底的结束了

当中午接到你电话,我真的懵了。我没想到你会穿过将近500公里的距离,独自来到深圳找我。我不忍心让你带着破碎的心来找我,又带着更加破碎的心毫无收获的回去。虽然你回去时依旧是破碎的心。

我不知道为什么现在的我,一直泪流个不停。明明是已经不爱了,但毕竟在一起四年了。

虽然已经分手半年多了,可是你依旧停留在那段感情之中。于是昨晚我骗了你我有新女友了。只是想让你早点死心,不要再过得那么浑浑噩噩了。只是我没想到你今天居然来了。

你告诉我你坐7点的动车,6点半的返程。昨晚你肯定是哭了一夜。到了深圳,午餐都没吃就来找我。而我正在吃午餐。

朋友告诉我,要让她彻底死心,就连见都不见。可是我实在是不忍心。不忍心你来了深圳,人都没见到就回去了。我更担心如果我不见你,你傻傻的躲在某个角落,傻傻的等。我实在是不忍心,你为爱如此卑微。

你好傻,你真的好傻。

最后走的时候,还只带你到北站旁的时代广场随便吃了下。我真是不行,你一天都没吃,就让你吃那么一点东西。我真是不行,你那么辛苦大老远跑来,我却总是背对着你。

吃饭的时候,我劝了你几句。你终于流泪了。我也梗咽了,担心被你发现,于是我不说了。走的时候,因为时间大概只有5点,于是你改签到6点的动车。

送你去候车的时候,我想再劝你几句,我告诉你以后不要再为了我了,平板支撑不再是为了我了,而是为了你自己,“好好过自己的生活,不要再想我了”。可是没再多说几句,我就梗咽了。我眼眶控制不住的湿润了,我怕你发现,于是轻轻的推了你一下,“走吧”。

然后我转身就走了,走时我的眼泪不停的流。你似乎也看到了,你一直跟着我,我加快步伐,就怕你追上,可是你依旧跟着我。我赶紧擦掉脸上的泪迹,尽量控制着自己的眼睛。转过身来跟你说“赶紧回去排队啊”,你似乎说了什么,可是我并没有听清。我转身继续走了。

可是我依旧听到你一直跟着我在后面说什么,我再次擦干泪水,你肯定也看得到我擦泪水的动作。我转身说:“干嘛啊,赶紧去排队啊~”

你比着拥抱的姿势,我明白了。我走向前跟你拥抱了,这真的是最后一次了。那一刻我脑袋只想着,赶紧走吧。倒不是因为想早点摆脱你,而是担心我忍不住哭了。我拍了你的背两下,你也拍了我两下。就这样我放开了,你还拉着我袖子,看着我。可是我不敢看你,也不敢让你看着我,因为我的眼眶里都是泪。我甩开了你的手,走了。

后来我才知道,你一直跟着我进地铁。

今天就这样结束了,我们就这样分开了。

你换了头像了,换成你原来的蜡笔小新头像,只不过这次头像似乎暗示着你从此要变坚强了。

你发了朋友圈,应该只有我能见到,但你说了再见。

我也给你发了微信,我写的时候,不停的流泪。





对不起!

2017-11-04

TF: Can not convert a float32 into a Tensor or Operation.

TF: Fetch argument x has invalid type <type 'numpy.float32'>, must be a string or Tensor. (Can not convert a float32 into a Tensor or Operation.)



问题出在存储结果的变量和tensorflow的节点重名了。这样以来,当第一次迭代后,原有的节点变成了一个数,破坏了tensorflow的网络了,原有的图不在具有这个节点。因此出错了。



解决方法只需要把结果保存为其他名字的变量就可以了。

参考资料:[1]

2017-10-28

Ubuntu 16.04 自动登陆 Xfce

由于我的服务器没有鼠标没有键盘,每次重启或者重新登陆的时候都需要重新插上键盘和鼠标才能登陆。所以我需要服务器能够自动登陆,登录后自动启动Synergy,从而共享鼠标和键盘。由于网上Xfce桌面系统的自动登陆资料比较少,所以我自己查了点资料。实验了下发现可行,记录下来。

查了LightDM的官方文档,发现也不是很难。



只要在/usr/share/lightdm/lightdm.conf.d/目录下新建一个自己的配置文件就可以了。
System provided configuration should be stored in /usr/share/lightdm/lightdm.conf.d/. System administrators can override this configuration by adding files to /etc/lightdm/lightdm.conf.d/ and /etc/lightdm/lightdm.conf. Files are read in the above order and combined together to make the LightDM configuration.



参考资料【1】

2017-10-21

python读取mat

Matlab:


在Matlab中首先使用save函数保存变量。为了方便python读出,使用参数version指定保存数据的版本为-v7

save函数的参考资料:[1]

Python:


python端读出使用scipy库

参考资料:[2] loadmat

[python]
import scipy.io as sio
data = sio.loadmat('matlab.mat')
[/python]



是的,最近在做口腔CT的伪影去除。当然是用流行的深度学习的方法啦~~

2017-10-07

synergy:鼠标键盘共享软件

服务端配置:



注意:服务端还要进行如下配置。要将对应的主机放置对应的位置。同时注意主机名字要对应,否则无法使用。



客户端:

2017-09-14

解决:SSL certificate problem unable to get local issuer certificate

网络抽风。GIT连不上,于是挂上代理





git config --global http.proxy 127.0.0.1:8087








解决办法:





git config --global http.sslVerify false





参考资料:

2017-09-10

解决: OpenCV error: (-215)

error: (-215) src.checkVector(2, CV_32F) == 4 && dst.checkVector(2, CV_32F) == 4 in function getPerspectiveTransform

正确的代码示例如下:

[python]
import cv2
import numpy as np

img = cv2.imread('original.jpg',0)

src = np.array([[50,50],[450,450],[70,420],[420,70]],np.float32)
dst = np.array([[0,0],[299,299],[0,299],[299,0]],np.float32)

ret = cv2.getPerspectiveTransform(src,dst)
print ret
[/python]

error: (-215) p.checkVector(2, CV_32S) >= 0 in function polylines

正确的代码示例如下:


[python]
source_pts = np.array([[280,700],[560,480],[760,480],[1120,700]])
cv2.polylines(test_img, source_pts, True, [255,0,0])
[/python]



参考资料:
[1]
[2]Geometric Image Transformations
[3]

2017-08-28

七夕很伤心

本来今晚计划的事不想做了。现在没有心情了,满心的负能量无处发泄。怎么这么刚好今天是七夕。



有点懵啊,我并没有表白,她却突然这么说。。。。

2017-08-06

如何翻转图片

方法一: Numpy

[python]
import numpy as np
image_flipped_lr = np.fliplr(image) #水平翻转
image_flipped_ud = np.flipud(image) #上下翻转
[/python]

参考资料:numpy.fliplr numpy.flipud

方法二: OpenCV

[python]
image_flipped = cv2.flip(image,1)
[/python]

cv2.flip(src, flipCode[, dst]) → dst

参考资料:OpenCV

PS:设置 plt.imshow图片大小:

[python]
plt.figure(figsize=(15,5)) #设置图片显示大小
plt.subplot(1,2,1)
plt.imshow(image)
plt.subplot(1,2,2)
plt.imshow(image_flipped)
[/python]

2017-07-28

python如何将int转换字符串

matlab如何将int转换字符串:

idx = 10
orbit = 150
num = 360
train_image_addr = '../MATLAB/x_data/x'+'%04d'%idx+'_%d'%orbit+'_%d.jpg'%num

输出:

../MATLAB/x_data/x0010_150_120.jpg

参考资料:  [1]

2017-07-23

TypeError: __init__() missing 1 required positional argument: 'nb_col' 解决办法

当我第一次使用keras出现了:
TypeError: __init__() missing 1 required positional argument: 'nb_col' 的错误



经过搜索,发现原来是使用了旧版本的Keras,可以使用print(keras.__version__)查看版本号。

解决办法:
在conda下升级Keras:

conda install keras  

2017-07-11

imageJ如何选取指定大小区域截图


  1. 首先选择edit-->selection-->specify




2. 选择固定大小



3. 截图快捷键: ctrl+shift+x

2017-07-08

年中总结

这一篇是继续上一篇《六月》。没办法,六月的最后一个星期太忙了。先是回了学校考试,然后报名的udacity自动驾驶课程,项目1提交时间又很紧。于是就漏了写这一篇。趁现在有点感受,坐下来,写点东西。



柳暗花明


晚餐的时候在食堂遇到杨师兄。感觉自从我的工卡下来后,就很少联系了。难得在食堂遇到他,和他聊了好久,还跟他一起去村里买点水果,一路上聊了好多事。

我告诉他,我不喜欢这里做的工作。因为这里做的工作和我以前的工作差太多了,最主要还没有半点兴趣。这让我很难受,很煎熬。但是我又想要一份实习证明。师兄实在的告诉我,如果真的不喜欢,想走就要早走,不要为了一个证明在这里浪费时间。“因为你不可能在这做了一年,一年以后你又要换方向,到时候你都研二了。你得为你未来的规划考虑。”

什么叫醍醐灌醒,这句话真的是点醒我了。我不能在纠结于一纸证明。归根结底,自己还是存在官本位的思想,还是为了满足自己的虚荣心。毕竟是中科院的实习证明,听上去就虚荣心爆棚了。其实都是骗人的。所以不要再纠结实习证明了。

现在有种茅塞顿开的感觉。这几个礼拜的烦恼似乎找到了思路。我不能为了这一实习证明,浪费我一年的时间。现在我对这份实习工作是这么规划的:现在先不想那么多了。抓紧时间,看能不能在3个月内有点思路。因为这礼拜刚做了数据集的处理,接下去是什么情况还很难说。如果接下去的3个月还是像前两个礼拜什么实质事都没做的话,那就得考虑尽快离职了。给自己定个期限,最多就9个月。如果到时候还是现在这种焦虑的心态,那一定要果断走人了。当然现在在这里也不是为了混日子,而是观望项目能不能让自己满意,让自己喜欢。



总结


总结过去6个月的生活和学习。上一次做计划是在这里《最近好忙》

这半年我做了:

  • 参加了研究生电子竞赛。做了FPGA的深度学习实现项目。这个项目让我学到了很多,甚至我能来深圳这里实习,就是靠着这个项目的;甚至还有老师赞赏这个项目。也因为这个项目,认识了教授,并且他十分认可我的能力和我的所做的工作。正好今天赛区结果出来了,只有个三等奖安慰。哈哈~这也让我认识到了,这个项目背后的思想,不是普通人能做的。而我要做的,是大众能做的、是随大流的。随大流对我来说风险更低,以后也好找工作些。FPGA做了整整一学年,现在算是正式放弃了。既然FPGA放弃了,那立体视觉的FPGA实现,那自然而然的也是放弃了。

  • Udacity的DLND顺利拿下了!毕业了,这门课让我快速的入门了深度学习。虽然不是特别精,但帮助特别大。如果没有这门课,我可能还要绕更多的弯路、浪费更多的时间。也正式这门课,指明了我未来的大方向。


下半年我的计划:

  • 完成Udacity自动驾驶第一二学期课程。

  • 在这边好好干!弄出点头绪来!

2017-07-01

SSLError(SSLError 解决办法

在使用conda搭建环境的时候遇到
SSLError(SSLError(SSLError("bad handshake: Error([('SSL routines', 'ssl3_get_server_certificate', 'certificate verify failed')],)",),),)

错误


解决办法:



conda config --set ssl_verify False



参考资料:

2017-06-19

6月

太懒了,快要一个月什么都没写了。眼看着再不写6月可能就要过来。于是趁着现在没什么事,逼着自己写点东西。其实心里毫无感想,虽然最近有很多事可以写。

深圳我来了

提前两天跟老爸老妈来深圳游玩了一下。先前也没有做什么准备和计划,于是到了深圳几乎就是随便走走看看。游了世界之窗,感觉还不错。但是这两天实在是太热了。在世界之窗快要中暑了都~以至于下午老爸就玩不动了,这不像他的风格。星期天晚上(11号)我们就在酒店附近逛了下,就像福田当地的土著一样,悠闲地散散步。

快乐的时光总是过得很快。这一次深圳之行也是老妈第一次出省,第一次坐地铁。

分别

这天是12号,星期一。其实我本来不想他们送我来到门口的,我觉得影响不好。可是昨天下午老爸玩不动,没有提前带他们过来看看以满足他们的心愿,自己心里有点过意不去。我知道他们很想看看我工作的地方,毕竟听上去确实很高大上(SIAT)。昨晚我跟他们说不要跟我过来,他们说好。我可以听出他们的失落,我也能感觉到老妈在看我。可是我还是不想他们跟我来,原因还是担心被别人看了,影响不好。我原计划我等到快中午的时候,送他们到深圳北站坐车,我再自己转地铁来报道。可是老爸说我要早点出发,他们在酒店呆到快中午的时候再自己去北站。

于是我妥协了,我不舍得了。我说道“要不明早,早点出发,一起去吧~”。因为我不想我走后,他们自己留在酒店等时间。我宁愿他们自己去逛逛,这样我心里也好受些。

写到这里,我渐渐的有了感情了。心中有股滋味~

于是今天早上我们一起退了房,一起前往单位。地铁比想象的快。这两天太热了,我们到了以后,直接坐上三轮黑摩的直奔大门。到了以后,我们没有再停留。我告诉老爸不要错过动车了,问道“懂得坐地铁吧?方向不要弄错了。”我忘了还说了写什么,但是不多就几句而已。

“好的,我们这里自己逛一下”。将要转身走的时候,我看着老妈的眼神。至今忘不了,我和她掌对掌挥了下手。就这样提着包,转头就走了。我没有回头,现在想想我都能哭出来的。直到我走进保安亭后,我才想到要看看他们走了吗,可是被一堵墙堵住了,什么也看不到了。

过后我才想起来我忘了把零钱给他们了。

第一天

这一天我来不及感到离别的悲伤。取而代之的是不知所措和恐惧。到了老板的办公室。老板挺年轻的,和他聊了一下,就去就去办理入职手续了。办完之后,老板说我还没有餐卡,中午就和他吃吧。老板人挺好的~感觉很温和~

下午就比较尴尬了~独自一人从中午12点坐在咖啡厅里等宿舍单下来。在咖啡厅里,听着一些人在谈创业,一些人在聊科研,我感觉到这里平静却又充满的生机。大概坐到3点半左右,我真的不知道要干嘛,不知道接下去要怎么办。于是我想到了师兄。他是我们学校研二师兄,同系,老凌的学生。

他一听说我来了,马上就来找我。坐下来以后,问我东西买好了吗?“没有,那走,我带你去买”。这一瞬间我真的感到一股很强的温暖,我很想哭~路上他说“我见到你就像见到自己家人一样,很激动”。我也很激动。买完以后,为了不影响他的工作,我让他先回去了。走时,留了电话,他说晚上他请我一顿。这天晚上,他请了我院里最贵的食堂,3道菜多到我们两个吃不完。剩了有点多,他说太浪费了,于是硬是挤下肚子。师兄我想嫁给你~

接下去的日子

这周是来的第二周。这两周里的事,我准备下次再说~因为字数已经1300字了。

 

 

 

2017-05-20

Socket编程:解决发送与接收数据不全

这个问题是在上个月在做的项目中遇到的问题。项目采用分布式计算,通过网线传输数据。然而却发现用Socket接收和发送数据会出现不全的问题。由于是第一次使用Socket,因此这个问题还是费了点时间去解决。现在把它整理下。




客户端
原来的编程方案:(错误)

[c]
//创建套接字
int sock = socket(AF_INET, SOCK_STREAM, 0);
//向服务器(特定的IP和端口)发起请求
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr)); //每个字节都用0填充
serv_addr.sin_family = AF_INET; //使用IPv4地址
serv_addr.sin_addr.s_addr = inet_addr("169.254.48.205"); //具体的IP地址
serv_addr.sin_port = htons(1234); //端口
connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
//向服务器发送数据
printf("Sending...\n");
write(sock, (char*)conv_ouput, sizeof(float) * 25088);
printf("Send Successful\n");
//关闭套接字
close(sock);
[/c]

这里有个问题,即是发送端不能保证一次性全部发完数据。因此必须确保发送到能够发全数据。

修改后的编程方案:(正确)

[c]
int sock = socket(AF_INET, SOCK_STREAM, 0);
//向服务器(特定的IP和端口)发起请求
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr)); //每个字节都用0填充
serv_addr.sin_family = AF_INET; //使用IPv4地址
serv_addr.sin_addr.s_addr = inet_addr("169.254.48.205"); //具体的IP地址
serv_addr.sin_port = htons(1234); //端口
connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
//向服务器发送数据
printf("Sending...\n");
int pos = 0;
while(pos < 25088*sizeof(float))
{
int send_num = send(sock,(char*)conv_ouput+pos, sizeof(float) * 25088, 0);
if(send_num<=0)
{
break;
printf("send error\n");
}
pos += send_num;
}
printf("send num = %d\n",pos);
printf("Send Successful\n");
//关闭套接字
close(sock);
[/c]

2017-05-14

中科院offer!!!

我从来也没有想到我能去中科院实习。周二我在实习僧上看到中科院在招聘实习,于是抱着试试的态度发了简历,没想到第二天就电话面试,面试还很顺利。也就问我现在在做的项目,最后竟然直接说:”那我给你发offer吧~“。真的是把我高兴坏了~真的是高兴坏了~高兴得我把正在睡午觉的舍友摇醒~跟他分享喜悦。第一时间告诉了老爸,姐姐。这两天渐渐平静下来了。

终于要出远门了!从高考后就一心想着考出省,去外面看看。然而现实是在省内选个一本院校容易,在省外选好学校就有可能上不了。于是大学继续省内读书,其实是市内读书。接着就是考研。也是选择离家一千公里的学校,不过最后也是没成。不过我总是能接受现实,于是又留在了市内读研。

现在终于有机会了。但现在的我,就好像一个在浅水区游惯的人,突然到海里去游泳一样。心里有一种巨大的压力感,是对陌生水域的恐惧。

不过人生就是这样,一步一步的往前迈。

2017-04-30

Conda 修改源 快速下载




自言自语:趁着现在在训练网络,在4月的最后一天,发表一篇文章。这篇很早之前就已经整理好了,只是迟迟未发表。最近发现当把神经网络移植到FPGA上时,速度居然没有GPU快。也是大跌眼镜了。本来认为可以拿奖的项目,突然又觉得希望渺茫~但项目做到这个地步,只能硬着头皮继续优化下去。(请忽略)




其实很简单,但是也没网上的教程那么简单。在实际中,仅通过命令行修改,并不一定能完全用修改后的源下载,还需要去修改配置文件。

首先设置命令:

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda


config --set show_channel_urls yes


然后:需要修改conda的配置文件。删掉-default选项。

conda info -a 查看.condarc文件位置 修改



修改后,下载速度杠杠的!



参考资料:

https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/




2017-04-22

OpenCL for CodeBlock

这两个礼拜忙于项目。基于OpenCL的VGG-NET卷积神经网络。整个项目的思想很简单,但落实到具体细节上时,我和我队友折腾得焦头烂额。常常一想一个问题,就不舍得去做其他事。以至于放掉了很多计划中的事,包括very9s.net上发表文章,包括英语阅读。趁着现在,项目又进入一个新的问题,停滞不前时,休息下。发表篇文章。




在CodeBlock上搭建OpenCL环境


大部分在windows下的OpenCL环境都是基于visual studio IDE开发环境。其实现在我也是在Visual Studio 2015下进行OpenCL环境开发的。但是Visual studio对于初学者太过臃肿,且如果你是基于C语言开发的,那么Visual Studio支持并不是很好。所以我尝试过CodeBlock下开发,并且一切顺利。



下载时选择带有mingw包,能省去很多步骤。省得自己在配置编译环境。

创建OpenCL的编译器



C/C++ linking (gcc/g++)




    • In order to compile your OpenCL program you must tell the compiler to use the OpenCL library with the flag: –l OpenCL

    • If the compiler cannot find the OpenCL header files (it should do) you must specify the location of the CL/ folder with the –I (capital “i”) flag

    • If the linker cannot find the OpenCL runtime libraries (it should do) you must specify the location of the lib file with the –L flag

    • Make sure you are using a recent enough version of gcc/g++ - at least v4.7 is required to use the OpenCL C++ API (which needs C++11 support)




2017-04-01

C语言指针理解

最近在做OpenCL的项目,做异构计算。在做的过程中让我不得不重新温习下C语言,不得不去深入理解指针的含义。下面几点我列出了我在《Beginning C:From Novice to Professional》(Ivor Horton)书中学到的几点关于C指针的内容。内容很浅显,但过了4年,重新理解这些简单的知识点,有许多新的体会。所谓大道至简,指针的魅力也许就在这些简单的定义,微小的细节当中。




1-指针是存储地址的变量。
2-编译器必须知道指针所指的变量类型。没有这个信息,就不知道如何处理所指向的内存内容。
3-void*类型的指针可以包含任意类型的地址。
4-未初始化的指针是非常危险的,所以应该在声明指针的时候对他进行初始化。例如:

int *pointer = NULL;
表示不指向任何内存的位置。NULL在多个头文件中都包含。例如stdio.h string.h等。NULL也相当于数字0的指针。即
int *pointer = 0;
与上面的初始化等价。
int *pointer = &number;
pointer变量中存储的是number的地址。
*pointer则是存储在number中的值。
*又称取消引用运算符。


5-可以改变指针指向的地址,因此同一个指针也可以改变不同内存空间里的值。
6-指向常量的指针:

const int *pointer = &value;
不能通过指针改变所指向的值。但可以直接对value进行操作。也可以改变指针指向的地址。


7-常量指针:

int *const pointer = &value;
指针存储的地址不能改变。但可以改变指针指向的内容。


8-指向常量的常量指针:

const int *const pointer = &item;
不能改变存储在指针中的地址,不能改变指向的内容。


 



指针与数组


1-指针和数组似乎完全不同,但他们有非常紧密的关系,有时候还可以互换。
2-数组和指针重要的区别:


可以改变指针包含的地址;
不能改变数组名称引用的地址。
(使用数组名称而不带索引值,就等于引用数组的第一个元素的地址)






动态内存分配


1-int *pointer = (int*)malloc(5*sizeof(int));


malloc是一般函数,可为任意类型的数据分配内存。因此这个函数并不知道要分配的内存空间要做什么用,所以返回的是一个void类型指针。因此要将返回的地址做类型转换。(int*)


2-int *pointer = (int*)calloc(5,sizeof(int));


calloc()函数与malloc()函数相比有两个优点:
-它把内存分配为给定大小的数组;
-它初始化了所分配的内存,所有位都是0;


3-释放动态内存:


动态内存,应在不需要改内存时释放他们。堆上分配的内存会在程序结束时自动释放,但是为了避免出现内存泄漏,应在使用完后释放内存,或者退出程序时释放内存。
free(pointer);
同时应避免两次释放相同的内存区域,因为这种情况下,free操作是不确定的,因此结果也是无法预料的。

2017-03-18

DeepLearning:Linear Class解释

[code lang="python"]
class Linear(Node):
"""
Represents a node that performs a linear transform.
"""
def __init__(self, X, W, b):
# The base class (Node) constructor. Weights and bias
# are treated like inbound nodes.
Node.__init__(self, [X, W, b])

def forward(self):
"""
Performs the math behind a linear transform.
"""
X = self.inbound_nodes[0].value
W = self.inbound_nodes[1].value
b = self.inbound_nodes[2].value
self.value = np.dot(X, W) + b

def backward(self):
"""
Calculates the gradient based on the output values.
"""
# Initialize a partial for each of the inbound_nodes.
self.gradients = {n: np.zeros_like(n.value) for n in self.inbound_nodes}
# Cycle through the outputs. The gradient will change depending
# on each output, so the gradients are summed over all outputs.
for n in self.outbound_nodes:
# Get the partial of the cost with respect to this node.
grad_cost = n.gradients[self]
# Set the partial of the loss with respect to this node's inputs.
self.gradients[self.inbound_nodes[0]] += np.dot(grad_cost, self.inbound_nodes[1].value.T)
# Set the partial of the loss with respect to this node's weights.
self.gradients[self.inbound_nodes[1]] += np.dot(self.inbound_nodes[0].value.T, grad_cost)
# Set the partial of the loss with respect to this node's bias.
self.gradients[self.inbound_nodes[2]] += np.sum(grad_cost, axis=0, keepdims=False)
[/code]

1. the loss with respect to inputs
self.gradients[self.inbound_nodes[0]] += np.dot(grad_cost, self.inbound_nodes[1].value.T)
Cost对某个Node的导数(gradient)等于Cost对前面节点导数的乘积。




解释一:

[code]np.dot(grad_cost, self.inbound_nodes[1].value.T)[/code]

对于Linear节点来说,有三个输入参数,即inputs, weights, bias分别对应着

[code]self.inbound_nodes[0],self.inbound_nodes[1],self.inbound_nodes[2][/code]

So, each node will pass on the cost gradient to its inbound nodes and each node will get the cost gradient from it's outbound nodes. Then, for each node we'll need to calculate a gradient that's the cost gradient times the gradient of that node with respect to its inputs.

于是Linear对inputs的求导就是weights。所以是grad_cost*weights.grad_cost是Linear输出节点传递进来的变化率。

[code]np.dot(self.inbound_nodes[0].value.T, grad_cost)[/code]

同理可推对weights的求导为inputs,于是gradient=grad_cost*inputs

[code]np.sum(grad_cost, axis=0, keepdims=False)[/code]

而对于bias,Linear对bias求导恒为1.所以gradient=1*grad_cost

解释二:为何是+=

因为每一个节点将误差传递给每一个输出节点。于是在Backpropagation时,要求出每一个节点的误差,就要将每一份传递出去给输出节点的误差加起来。于是用+=。
于是可以理解为什么要for n in self.outbound_nodes: 目的是为了在每一个节点的输出节点里遍历。
If a node has multiple outgoing nodes, you just sum up the gradients from each node.

注意点一:
要区分Backpropagation 和Gradient Descent是两个步骤,我通过Backpropagation找到gradient,于是找到了变化方向。再通过Gradient Descent来最小化误差。




To find the gradient, you just multiply the gradients for all nodes in front of it going backwards from the cost. This is the idea behind backpropagation. The gradients are passed backwards through the network and used with gradient descent to update the weights and biases.



最终目的是:




Backpropagation只求了导数部分。Gradient Descent则是整个过程。

 

2017-03-16

解决defaults::qt-5.6.2-vc14_3

使用conda 安装tensorflow的时候,出现了这个问题,这不是第一次的出现了。上一次出现,我选择重新安装miniconda,问题解决了。这次我决定去解决他!

ERROR conda.core.link:_execute_actions(330): An error occurred while installing package 'defaults::qt-5.6.2-vc14_3'. UnicodeDecodeError('utf-8', b'\xd2\xd1\xb8\xb4\xd6\xc6 1 \xb8\xf6\xce\xc4\xbc\xfe\xa1\xa3\r\n', 0, 1, 'invalid continuation byte') Attempting to roll back. UnicodeDecodeError('utf-8', b'\xd2\xd1\xb8\xb4\xd6\xc6 1 \xb8\xf6\xce\xc4\xbc\xfe\xa1\xa3\r\n', 0, 1, 'invalid continuation byte')



ERROR conda.core.link:_execute_actions(319): An error occurred while installing package 'defaults::qt-5.6.2-vc9_3'

python | 解决defaults::qt-5.6.2-vc14_3

这两篇都是同一种解决方法,但是当我试着他们的方法的时候,却出现了新的问题,即ModuleNotFoundError: No module named 'chardet'

于是我直接用conda在root环境下安装chardet
conda install chardet


最后一切搞定,连上面两篇文章的添加内容都不需要~


2017-03-11

笔记本升级SSD

电脑莫名其妙总是蓝屏!一气之下,买了固态硬盘。好在主板只有SATA2的接口,所以正好可以省点钱,买低配的SSD。但是也要500大洋,心疼。不过念在学校又发了1000大洋,想想这台12年高考毕业时买的古董,也算焕发第三春了。

大概是大二的时候,升级了内存。加了一条4G内存。这是第二春(ಡωಡ)hiahiahia

没什么事做,尝试用手机发表文章,试试效果。除了屏幕小以外,其他都可以接受。

作为小白,为了选购SSD还特意去看了知乎相关回答,涨了不少知识。

【如何选购固态硬盘?】dyoule:https://www.zhihu.com/question/20369676/answer/99405990?utm_source=com.meizu.notepaper&utm_medium=social (分享自知乎网)

2017-03-06

Very9s第二年



很高兴坚持留下来。最近比较忙,所以写的比较少。但是素材准备了很多。等过段时间,整理整理,写出来。

最近为了自己的项目,焦头烂额的。亚历山大~~不想多说了,有机会再写吧~




2017.5.20添:

删除放在github上的旧站。为了以后还能怀念她,截了首页的图。

这个主题还是我仿照lofter上的主题自己做的。花了可能有一周的时间。好不舍得。

2017-02-16

射频工程师的爱情诗

射频工程师的爱情诗
佚名


我在时域
你在频域
需要经过傅立叶变换
才能发现你的美丽
我把爱的语言调制到星座
通过伪随机序列
载波到到你的频率
并波束赋形到你的接收阵列矩阵
你说我的爱噪声太大
经过层层滤波
原来发现
那是在宇宙开始的时候
我发给你的爱的微波背景辐射
两百年前粗略的论断
催生傅立叶变换不朽的缠绵


2017-02-13

最近好忙

下礼拜就要开学了。就剩最后一个礼拜了。感觉这几个礼拜过得好忙啊。既要跟udacity的深度学习课程,还有自己的FPGA项目,这两天又要赶一份产赛的文档,时间不够啊。最蛋疼的是自己的项目进展无比缓慢,很焦急啊~~现在担心能不能在下学期结束前,把项目搞定。同时我也给自己这半年定个小目标,很简单,就两个目标:

  1. 把项目搞定

  2. 把Udacity的DLND拿下


不知道要写些什么了,就这样把~

今天小记:今天路过十中,发现变化好大。

 

2017-02-02

Anaconda 虚拟环境删除

anaconda实在是神奇。但是每个环境都挺占空间的。所以不用的就删了把~



一个环境装下来,还是蛮大的。因此删除没用的环境~

conda remove -n environment-name --all


或者

conda env remove -n env_name


2017-01-31

深度学习初体会——fast-style-transfer

报了udacity的深度学习纳米学位课,虽然学费对我来说不少,但是想以后为自己就业多拓宽的路子还是咬牙分期付款。这也是第一次花这么多钱网络学习,希望能有所收获,更希望将来就业能多点机会。

这篇主要是第一次体会下深度学习。没有什么技术含量,只不过是记录一下过程罢了。

fast-style-transfer就是模仿名画的风格,把自己的照片转化成同样的风格。GitHub

1.Git clone



2017-01-19

开源之前——重新拿起Git

今天终于把我的SDRAM写好了,并验证可以用了。搞定了SDRAM感觉自己的FPGA进了一个水平。于是今晚做了个决定,打算把写好的部分模块分享出来。也玩玩时尚的开源。

有好长时间没有用Git了。所以不得不再回忆下流程。刚好记下来,充充文章数量 ^_^




下载安装什么的就省略了。

首先要生成ssh-key

$ ssh-keygen -t rsa -C "your_email@youremail.com"



2017-01-16

写作不易,我真的很忧郁

总是有点感想,但是写下来的时候,却只有几句话。写作真的不容易。要牺牲玩的时间,要静下浮躁的心。尤其放寒假的我,好像没有了束缚,宁愿逛几个小时的草榴,也不愿敲敲键盘写点东西。就算是现在,我也是边写边玩手机。安逸总是舒服的,而做点事总是挣扎的。漫无目的的写,就好像中学时代写800字作文一样痛苦,一点一点地挤。所以今天打算围绕着写文章(见笑,姑且称之为文章吧),来说说其实我也是懂忧郁的。哈哈~

我从初中开始,就偶尔会在深夜写写感想。随便写,想到什么写什么。但是那个晚上,我一定是忧郁的,或者至少是很平静的。最经常的就是感慨感慨时间过的好快,上一次定的目标又没有实现了。那时候我没有手机,不对有一把触屏的山寨手机。但是真的很垃圾,用没多久,写个字都难。

后来到了高中,由于一心想读好书,压力也比较大,所以到后期平均每个月都在某个深夜写感想顺带计划和反思。那个时候写作真的是一个很好的释放压力的方式。不过现在也觉得写作挺释放心灵的。



2017-01-07

MOS频率限制因素和截止频率

MOSFET有两个基本频率限制因素分别是:

  1. 沟道运输时间

  2. 栅或电容的充电时间


沟道运输时间:

简单的说就是载流子在沟道的运输时有时间的。当沟道长度除以载流子在饱和区的漂移速度就是其运输时间。而这个时间限制则可以就是MOSTEF的最大频率限制因素之一。因为,不论设计在怎么快,这个运输时间是一定存在的。

栅或电容的充电时间:

截止频率定义为电流增益为1的时候的频率。根据米勒电容等效原理,输入端的电容将会很大,而输出端的电容则可以忽略。于是用Cg来等效输入栅极电容。

2017-01-04

Verilog实用define和include设置仿真模式与编译模式

最近FPGA琢磨了有一段时间了。虽然后期因为期末考原因,琢磨时间比较少了。每次停歇一段时间后,从新思考问题,问题似乎没有起初那么难解决了,敲起代码来顺手很多。大概是时间慢慢沉淀了知识,吸收了经验。理论和经验都需要时间来消化。这段时间大约写了有5~10K的Verilog了,自己的代码风格也基本定型了。对HDL也有更贴近的认识了。看了些视频教程,这从中吸收了不少精华。其中就包括开源骚客(http://dengkanwen.com/)的SDRAM系列教程。收货颇多,尤其是他的设计逻辑方法。当工程量逐渐增大时,就必须有清晰的逻辑时序图,系统框图。

Ubuntu SSR setting

使用electron-ssr客户端 https://github.com/shadowsocksrr/electron-ssr 设置proxy