自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(62)
  • 收藏
  • 关注

原创 Fast convnets using group-wise brain damage

Fast convnets using group-wise brain damage出发点在convolution layer中,很多工具箱(caffe等)都把卷积操作转换成矩阵操作,通过增加并行度来提升计算速度。那么在这个基础上怎么继续加速矩阵运算呢? 对于一个输入是64x224x224的特征图来说,如果有64组3x3卷积核,那么正常的矩阵转化计算就变成 (224∗224)∗(3∗3∗64)∗

2017-01-14 15:57:22 1915

原创 caffe loss以及正则项反向传播过程

概述以前一直以为反向传播的过程是这样的,由Softmax计算得出分类loss,然后在加上L2正则项得出总的total_loss,然后再利用total_loss进行反向梯度的计算,而正则项会在每层的Forward函数中计算并返回,表面上感觉很对,但是实际分析就会发现这样想法不合理的地方,对正则项的计算,不同的solver是不一样的,而且正则项的方法也是有L2和L1, 每层layer的Forward函

2017-01-05 15:40:16 3130

原创 OUTRAGEOUSLY LARGE NEURAL NETWORKS

概述现在的CNN网络普遍都是做成通用分类网络,即一个网络要做很多种事物的分类和识别,但是仔细想想这样是不是真的合理,能不能设计一种网络,对一种输入用一种子网络去做,对另外一种输入就用另外一种子网络去做,这样做的好处就很明显,首先可以在显著增大网络规模的情况下,不会明显升高计算量;其次,我感觉这参数稀疏网络的实现方式。而在今年ICLR上,就有人提出这种网络结构OUTRAGEOUSLY LARGE NE

2017-01-03 21:09:52 1348

原创 caffe编译问题汇总

简述每次编译caffe出现的问题基本都不一样,在不同的系统和硬件平台上都会出现不一样的问题,这里就把每次编译出现的问题总结一下。undefined reference to cv:imread一看就知道是opencv库出现问题,这里是缺少了opencv_imgcodecs库,在Makefile文件中的LIBRARIES += opencv_core opencv_highgui opencv_img

2016-12-07 11:21:32 5733 1

原创 git版本管理

起因最近做项目的时候,代码量很多,而且经常要对代码进行修改,更纠结的是因为考虑到之前的代码可能还会有用,所以必须保存原先的代码,这样一个代码目录里就有好多版本不一样的代码,弄得很乱,到最后都不知道哪个代码对应哪个功能。 之前想过解决的办法,就是利用linux的符号连接,然后再代码目录里写出必要的README文件,但是当要运行之前的版本的时候,就必须一各个更改对应的符号文件,而且如果README记载

2016-12-01 17:16:50 692

原创 GoogLenet Inception module的caffe实现

简述GoogLenet其实网络结构不是很复杂,之所以要总结这个代码实现,主要是想看一下Inception module在caffe中是怎么实现的。通过跟踪caffe代码,对Inception module也有了更深入的理解。 本文主要总结Inception module的实现,其他网络层的实现都是以前的网络差不多。具体实现本文以Inception(3a)为例,简述在caffe中是怎么实现的,首先I

2016-11-30 16:51:03 3572

原创 GoogLenet

面临问题1,当前深度学习网络规模越来越大,网络规模越来越大,网络中的参数也就也来越多,这就很有可能在训练中造成过拟合的问题。 2,当前的大规模网络涉及的计算量也是非常高,特别对于卷积层,卷积层的增加带来的就是计算量几何级别的上升。问题思考一味地位追求识别准确率而增加网络规模有一部分原因就是特征提取模块的设计没有能很好提取出图像的特征,如果能在基本的特征提取单元上做一些优化,然后用优化后的特征提取模

2016-11-30 16:06:28 11374

原创 Inception module的演化

概述Inception module中突出强调了卷积单元特征提取能力的强化对最后的分类效果有着很大的帮助,但是GoogLenet中的Inception module面临一个问题就是卷积模块太多,造成的计算量很大,特别是对于5x5这种大的卷积核,GoogLenet不得不采用1x1的卷积核先进行降维,然后再进行5x5的卷积。 但是,除了使用1x1卷积核进行降维,其实还有别的方式降低大的卷积核的计算量,

2016-11-30 15:58:53 6486 1

原创 VCS中verilog和C语言混合仿真

面临问题写verilog的时候,最麻烦就是对写好的程序进行验证,而单纯用verilog语言进行验证有非常不方便,因为verilog语言能提供的操作太少太少了,而如果能用其他语言对程序进行验证对于verilog的验证会有着巨大的帮助。verilog本身提供了和C语言混合仿真的借口,但是借口太复杂,单纯熟悉这个接口就得花上一定时间。解决方案本文的解决方案只是在VCS仿真环境下,对于其他仿真环境不适用。在

2016-11-25 16:29:17 8209 1

原创 对ResNet的理解

ResNet要解决的问题深度学习网络的深度对最后的分类和识别的效果有着很大的影响,所以正常想法就是能把网络设计的越深越好,但是事实上却不是这样,常规的网络的堆叠(plain network)在网络很深的时候,效果却越来越差了。 这里其中的原因之一即是网络越深,梯度消失的现象就越来越明显,网络的训练效果也不会很好。 但是现在浅层的网络(shallower network)又无法明显提升网络的识

2016-11-25 16:14:42 80039 10

原创 low level and hight level structure in CNN

什么是low-level和high-level特征为何卷积层越高就越能提取到high-level的特征

2016-11-21 21:50:02 1291

原创 feature_in_reg_matrix.v

1,概述feature_in_reg_matrix分别接受三路数据信号,分别从top_row, left_ram和ddr存储中读取,由于三路数据信号在读取的时候有先后的连续性,所以对于读取的数据该放到缓冲区的那个位置可以考虑移位操作。在feature_in_reg_matrix中,我们把缓冲区分成两个部分,分别对应top row的缓冲区和bram_ddr_buffer部分的缓冲区,如下图所示:

2016-09-26 20:15:16 519

原创 cnn_AVS_proj中的文件数据读写

简述在verilog中读写数据是,数据存储的顺序非常重要,即,对于单个数据,high significant的byte是放在存储器的高地址还是低地址上,就是通常所说的big endian和little endian的问题。 不论是在硬件设计还是硬件验证中,只要设计读写文件的操作,都应该考虑这个问题。系统函数数据读写顺序$fread函数 这里只描述$fread函数读取二进制文件的情形,在读取二进

2016-09-24 21:05:58 778

原创 feature_in_reg

feature_in_reg_matrix中如何解决读取RAM和DDR时数据移位方式不同的位置简述在输入feature map寄存器组中,由于想用移位的方式接受来自RAM或者DDR的数据,这样可以避免使用MUX带来的逻辑电路的复杂性(如果用MUX的话要每个位置都要一个case来判断,情况太多)。但是在读取RAM和DDR数据的时候,对数据移位的方式是不一样的,我们的设计中把寄存器组分成了两个secto

2016-09-23 10:18:37 680

原创 verilog中读写文件操作

简述在verilog设计验证中,我们经常需要从文件中读取验证数据,有些数据是文本文件,有些数据是二进制文件。但是verilog读写文件的操作和软件语言还是有不同的,下面就具体总结一下verilog中的读写文件的操作。读写二进制文件不管是读写二进制文件还是读写文件文件,都要把读取到的数据放入到硬件设计中某个寄存器或者存储器中,这是verilog和软件语言读写文件最大的不同。 其实verilog读写文

2016-09-21 22:27:46 10800

原创 利用gdb远程调试驱动模块

在前面的文章中我总结了gdb远程调试内核的大致过程,由于一开始利用kgdb就是想调试自己的驱动模块,所以,这里我对怎么利用gdb远程调试驱动模块做一个总结。    其实调试驱动模块和调试内核的过程是完全一样的,但是调试驱动模块一个很重要的地方就是驱动的初始化的调试很困难,这我在下面会详细说明原因。    通过两天的摸索,我感觉虽然gdb可以远程调试内核,但是由于调试内核相对于调试普通程序的

2016-07-28 17:15:33 3532

原创 gdb远程调试过程

在另一篇文章里已经介绍过如何编译安装可以远程gdb调试的内核,在这里我们就来详细介绍一下图和利用gdb远程调试内核和驱动。    网上有很多关于gdb远程调试内核的文章,但是很多文章都说得很杂,而且很多都是利用主机来调试嵌入式的开发板,我们这里说的是利用主机去调试另一台主机的内核和驱动模块。    1,硬件条件    两台主机,一条RS232母对母交叉线(由于主机上的RS232串口线都

2016-07-27 20:37:56 2854

原创 linux重新编译内核

在写驱动程序的过程中,单纯用printk进行前期调试,很是复杂,很难定位错误在什么地方,而内核层的代码是不能像普通程序那样直接利用gdb进行调试的,但是这里说的只是在一台计算机上不能一边运行驱动,一边运行gdb;但是如果有两台计算机,就可以了。一台计算机当作目标机,运行要调试的驱动,另一台计算机当作开发机,运行gdb。    但是要想目标机支持远程gdb调试,目标机的内核就必须支持这种操作,这

2016-07-27 16:04:32 6854

原创 如何解决有限无限同时上网的问题

在学校实验室中,通常会连接实验室服务器,但是如果用有线连接到服务器,当你的上网帐号是计流量的方式时,连接到服务器上的其他人也可以使用你的流量,这样一个晚上能跑几个G的流量;而如果只是用无线上网的话,服务器就连不上。    这里的解决方案是,可以设置特定的目标网络地址经过服务器的路由,而其他网络目标地址经过无线的路由,这样就不会造成流量的偷用。设置方法如下:    运行管理员权限运行cmd,

2016-07-23 09:56:36 599

原创 c++ 流的注意事项

1,输入输出缓冲区    每个输出流都有一个缓冲区,用来保护程序读写的数据,有了缓冲区,输出的数据可能不会立即写入到文件中,操作系统可以将程序的多个输出操作组合成单一的系统级写操作。由于设备的写操作可能很耗时,所以允许操作系统将多个输出操作组合为单一的设备写操作可以带来很大的性能提升。    导致输出流(即,数据真正写到输出设备或者文件)的原因有很多:    ---程序正常结束,作为m

2016-07-08 15:46:07 707

原创 C++ 类的注意事项

1,explicit关键字    在类的构造函数中,当构造函数只有一个输入变量时,如果不加入explicit关键字,那么它实际上定义了转换为此类类型的隐式转换机制,例如下面的代码:    class Sales_data { friend Sales_data add(const Sales_data&, const Sales_data&); friend std::istream

2016-07-08 15:01:55 760

原创 Clang编译时的问题汇总

1, test.cpp:(.text+0xc): undefined reference to `std::cout'test.cpp:(.text+0x22): undefined reference to `std::ostream::operator<<(int)'test.cpp:(.text+0x2a): undefined reference to `std::basic_ostr

2016-07-07 21:58:00 4271 1

原创 gdb调试问题总结

1,怎么在gdb开启的时候加入调试命令,如断点、设置运行参数    gdb有个-x参数,后面接一下存储gdb调试命令的文本文件,所以可以实现写个文本文件,把一开始必要的断点和调试环境以及运行参数设置写进去,然后用-x参数读入即可:   command.txt break main set print pretty run train --solver=models/bvlc_r

2016-06-30 20:56:57 2950

原创 bvlc_reference_caffenet的test过程分析1

本文主要总结一下imageNet的test过程的最外层过程,即test() 函数。该函数主要分为四个部分: - 创建网络 - 拷贝权值参数 - 进行forward过程 - 统计最终的Accuracy和Loss # 创建网络 c++ Net<float> caffe_net(FLAGS_model, caffe::TEST); # 拷贝权值参数

2016-06-24 22:50:15 1936

原创 vivado----fpga验证调试

在vivado中fpga功能验证比ise中方便了很多,主要体现在debug的ip核生成以及最后的波形观察和调试上,下面我就从这两个方面说一下vivado的fpga验证调试。    fpga验证的步骤一般是:    × 在代码中加入关键字,表示信号要被调试.    × 进行elaboration和synthesis.    × 打开synthesis, 设置debug核.

2016-06-17 11:14:02 13627

原创 vivado----simulation上

今天说的vivado的仿真是指用vivado自带的仿真工具进行仿真,主要内容集中在如何运用脚本对代码进行仿真。    1,vivado自带工具的图形界面仿真很简单,这里不做过多介绍,但是在图形界面仿真的时候有一点值得注意,就是如何产生设计中所有信号的波形,因为一般vivado是默认产生顶层模块的IO波形,而如果想产生其他信号的波形,还要在仿真之前添加进去,而如果仿真期间还要加信号的话,就只能重

2016-06-15 23:03:46 11813

原创 vavado----design with IP

vivado中design with ip相比于ise感觉还是改进了。    首先我们简单介绍一下vivado中design with ip的设计过程:    (1)打开IP Catlog定制自己的IP设计,比如这里我们选择Standard Bus Interface-PCI Express-7 Series Integrated Block for PCIE,然后右键Customize

2016-06-14 11:32:38 4174

原创 vivado中各个文件的含义

在Xilinx ISE中不同的操作都有不同的文件类型对应,例如综合、布局、布线、生成比特流等都会产生特定格式的文件,在vivado中也是一样,只不过在vivado中,文件的格式相比于ISE中更加同一。    1,.dcp文件,在ise中每个过程都会产生特定格式的文件,例如.ncd, .pcf, .ngd等等,

2016-06-13 22:09:07 29996 1

原创 how to install Matlab API in caffe

In caffe, sometimes, it is convinient to use matlab function to do calculation, like SVD deconposition. But install Matlab API is very annoying.    1, edit Makefile.configure----MATLAB_DIR    In m

2016-06-07 22:40:40 3528

原创 caffe中网络参数更新总结

前面已经总结了caffe中的foward和backward的过程,最后可以得到代价函数相对于网络中的每一个参数的梯度,接下来就要利用梯度对网络参数进行更新。    网络参数的更新就是网络学习罪关键的一个过程,怎么利用梯度对参数更新也是一个很重要的问题。对深度学习网络的优化也大多在这一方面,对网络参数的更新一般会遇到下面的问题:第一,简单的网络参数更新网络可能导致网络不够generalized,

2016-05-28 09:42:33 4942

原创 caffe中backward过程总结

backward是利用代价函数求取关于网络中每个参数梯度的过程,为后面更新网络参数做准备。求取梯度的过程也是一个矩阵运算的过程,后面会有详细介绍,本身求取梯度的过程并不是很复杂,而且网络中的各层求取梯度的过程都是相似的。下面就按照backward的运行顺序,从最后一层向前介绍caffe的backward的过程。softmax with loss layer:按理说每一层应该都要求一层梯度,

2016-05-27 11:14:20 9991 7

原创 caffe中Blob数据结构

Blob数据结构是caffe中基本的数据存储单元,它主要存储的数据是网络中的中间数据变量,比如各层的输入和输出;代价函数关于网络各层参数的梯度。为什么要专门为数据设计一个存储结构,我的理解是这样保证的网络中的数据存储结构的统一性,由于网络中每个网络的计算过程都是相似的,所以如果能把数据存储也统一起来,使得整个程序也就很有结构。    1,Blob中除了存储重要的数据之外,还有一些标记数据的参数

2016-05-26 16:49:38 5515

原创 caffe中forward过程总结 2

前面http://blog.csdn.net/buyi_shizi/article/details/51504276 总结的是caffe有和卷积有关的forward过程,下面我们总结一下卷积之后和全连接网络Inner Product Layer有关的forward过程。第一层Inner Product void InnerProductLayer::Forward_cpu(const ve

2016-05-26 14:03:28 3018

原创 caffe中forward过程总结

caffe中最重要的两个部分就是forward和backward的过程,farward是根据输入数据正向预测输入属于哪一类;backward是根据输出的结果求得代价函数,然后根据代价函数反向求去其相对于各层网络参数的梯度的过程。我们先对farward过程做一下总结。    caffe中有两个过程会设计到farward,test和train,这里我们以train训练过程为例。int tr

2016-05-26 11:10:24 14609

原创 caffe中的数据结构解析

caffe中数据结构主要包括caffe::Net,caffe::Layer,caffe::Solver三个主要大类。下面就这三个主要的数据结构做一下总结。    1,caffe:Net:这个数据结构用来表示整个网络,这个数据结构里包含了很多重要的变量。vectorLayer > > layers_变量存储的是每层layer结构体的指针。vectorBlob > > blobs_变量

2016-05-25 21:37:17 5048 1

原创 caffe中的softmax layer

在caffe中的lenet实现最后一层是softmax layer,输出分类的结果,下面就简单介绍一下softmax回归。    1,首先,在caffe中,softmax layer输出的是原始的输入在每一个分类标签上的概率,例如在lenet网络中,输出的分类共有0-9的10中分类,那么softmax layer就会输出含有10个元素的向量,每一个元素表示输入在每一个分类上的概率。

2016-05-25 11:01:03 13037

原创 batch learning和stochastic learning

在深度学习网络中,有两种主要的学习方式,batching learning 和 stochastic learning,下面就来对这两种学习方式做以下总结:    batch learing:批量学习,这是一种离线的学习方法,大概的过程就是,每次网络的训练都是用所有的输入样本,针对一个训练样本,我可以比较网络输出和目标输出之间的残差cost(i),在求出所有样本对应的残差之后,对残差去平均,得

2016-05-19 16:23:21 4990

原创 tiny_cnn程序总结2----网络的训练过程

在网络的整体架构搭建好之后,剩下的最重要的部分就是该怎么训练网络,如何更新各层网络的weight和bias参数,LeNet网络采用的optimization的方式是Stochastic Diagonal Levenberg-Marquardt的方式。下面就先介绍以下Stochastic Doagonal Levenberg-Marquardt的基本思想,然后再看tiny_cnn中的实现过程。

2016-05-19 11:24:57 2736

原创 tiny_cnn 程序总结1----tiny_cnn简述

tiny_cnn实现了LeNet的字符识别功能,实现的方式也是利用卷集神经网络,整个网络共有6层,依次为convolution_layer,average_pooling_layer,convolution_layer,average_pooling_layer,convolution_layer,fully_connected_layer。    首先,第一层:convolution_l

2016-05-18 21:59:28 1419

原创 Regularization正则化

这里只是简单说一下regularization的作用,内部的原理现在还没有完全弄懂,等把内部原理弄懂再回来补充。    在深度学习网络上,经常会遇到一个问题就是当我们利用样本对网络进行训练的时候,我们可以用很多层在训练样本上做到很好的效果;但是当我们用测试样本的时候,往往测试的结果和训练的效果差别很大。这就是一个overfitting的问题,就相当于在进行函数拟合的时候,本来用2次就能完成,但

2016-05-13 22:05:07 3416

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除