NVcaffe源码阅读——Layer

NVcaffe源码阅读——Layer

Layer

nvcaffe的Layer.hpp/cpp在功能上与以前的caffe相比有一些明显改变。

首先nvcaffe对Layer.hpp的代码进行了拓展,提供了很多便利的新特性:
1. 将Layer.hpp中原先对Layer进行设置的函数抽离出来,组成LayerBase类。真正的Layer类则继承LayerBase类,并只实现前后向、ToProto等少量函数。
2. 提供了获取parent_net的api(parent_net、set_parent_net以及LayerBase的构造函数等),可以在层的代码里拿到关于当前网络的指针。利用这一点便可轻松拿到当前的solver指针(parent_solver()、set_solver_rank()函数),从而进一步拿到诸如当前迭代次数等在训练中有用的信息(iter()、relative_iter()函数等)。
3. 提供了获取层的名称(prototxt中的name域,而不是type域,name()函数)。
4. 提供了net_inititialized_flag_和net_iteration0_flag_两个Flag类指针变量,用来标记层是否处于初始化状态或者尚未迭代的状态。Flag类的定义在commen.hpp中,提供了一系列互斥、带锁的标记操作。
5. nvcaffe在Layer.hpp中还有fmath和bmath这两个变量,与ftype和btype十分相似。因为layer_factor在建立新层的时候只使用了ftype和btype变量,所以暂时不清楚其功能。同时添加了诸如fm_by_user(bool val)、bm_by_user(bool val)等函数以供查询变量的设置状态。

另外一个亮点在于改变了Layer类的模板参数列表,即把过去的

template <typename Dtype>

改为了

template<typename Ftype, typename Btype>

其中Ftype代表’Forward type’,Btype同理。这样做可以将每一层前后向的数据类型隔离开来,即前后向分别使用不同的数据类型,对nvcaffe的多数据类型特性提供支持,也为每一层的构建提供了很大的灵活性。例如,在absval_layer.cpp中,前后向函数的feature的数据结构可以不同:

    // in Forward_cpu()
    Ftype* top_data = top[0]->mutable_cpu_data<Ftype>();
    // in Backward_cpu()
    Btype* bottom_diff = bottom[0]->mutable_cpu_diff<Btype>();

而在Layer.cpp中,nvcaffe则是对Layer类的构造函数进行了拓展,功能是设置该层的前后向数据类型。在caffe.proto中,nvcaffe在LayerParameter中定义了forward/backward_type、forward/backward_math参数。同时在NetParameter中也定义了default_forward/backward_type/math,对整个网络进行默认设置。

Layer Factory

在caffe中,层的建立是通过layer_factory.hpp中的CreateLayer函数实现的。该函数接受一个layerparameter作为参数,将其直接放入对应类型的层的构造函数生成层。而在nvcaffe中,CreateLayer函数需要额外的ftype和btype作为传参。ftype和btype是从当前层的prototxt中的forward_type和backward_type得到的。因此在prototxt中修改这两个域便可设定该层计算时使用的数据类型。另外,forward_math和backward_math两个域在CreateLayer函数中仅仅用来打印信息,没有被用来建立层。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
加壳是指将一个已经编译好的可执行文件,通过加密、压缩等手段,使其变得难以被反汇编和逆向工程,从而提高软件的安全性。其中,UPX 是一种常用的加壳工具,可以将 Windows 和 Linux 下的可执行文件进行压缩和加密。 下面我们来分析一下 UPX 的加壳原理: 1. 文件压缩 UPX 首先对可执行文件进行压缩,可以使用多种压缩算法,包括 LZMA、LZ77 和 Huffman 等。这些算法可以将文件中的重复数据或者无效数据进行删除或者压缩,从而减小文件的体积。 2. 加密 UPX 还可以对压缩后的文件进行加密,可以使用多种加密算法,包括 Blowfish、AES 和 RC4 等。加密可以使得文件内容变得难以被窃取和分析,从而提高软件的安全性。 3. 重定位 由于压缩和加密可能会影响可执行文件的结构,因此 UPX 还需要对文件进行重定位,以确保可执行文件在运行时能够正确加载和执行。重定位是指将可执行文件中的函数地址和数据地址进行修改,使得它们能够正确地指向压缩和加密后的数据。 4. 解压 当可执行文件被运行时,UPX 会先解压它,然后将它加载到内存中,并将其重定位。解压是指将压缩和加密后的文件恢复成原来的可执行文件,以便能够正确地执行其中的函数和数据。 总的来说,UPX 的加壳原理就是通过文件压缩、加密和重定位等手段,使得可执行文件变得难以被分析和逆向工程。但是,需要注意的是,UPX 只是一种基本的加壳工具,对于一些高级的反调试和反反汇编技术,可能并不能有效地提高软件的安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值