nnet3的代码分析
nnet3/nnet-common.h
定义了Index,(n, t, x)三元组,表示第n个batch中第t帧。
并声明了关于Index或Cindex的一些读写操作。
nnet3/nnet-nnet.h
声明了NetworkNode(主要包含其类型以及索引信息)
声明了Nnet(nnet3网络类)
private:
//网络中的组件名列表
std::vector<std::string> component_names_;
//网络中实际的组件指针列表,同一组件可能出现多次
std::vector<Component*> components_;
//网络中结点名列表,即:inputs、components以及outputs
//同一组件名会出现两次:foo-input和foo
//因为foo-input有其自己的NetworkNode索引
std::vector<std::string> node_names_;
//网络中实际的结点指针列表
std::vector<NetworkNode> nodes_;
以及关于以上数据成员的实用函数。
nnet3/nnet-component-itf.h
Component的itf(interface,接口)
class Component
主要包含以下函数:
Propagate //正向传播
Backprop //反向传播
StoreStats //储存平均激活值、非线性函数微分平均值
ZeroStats //stats清零
GetInputIndexes //只适用于非简单组件
IsComputable //只适用于非简单组件
ReorderIndexes //只适用于非简单组件
以及实用函数
class RandomComponent: public Component
随机数生成的组件
class UpdatableComponent: public Component
参数扰动率
学习率
学习率因子
实际学习率(实际学习率=学习率*学习率因子)
冻结自然梯度更新
每个minibatch最大参数变换率(NnetTrainer以L2正则化的形式使用)
标准L2正则化参数
的设定、修改、查询
class NonlinearComponent: public Component
由于该类不修改特征维数,因子该类是sigmoid、softmax、ReLU的基类
该类
储存激活平均值
储存训练中的微分
负责模型初始化
负责IO
nnet3/nnet-simple-component.h
class PnormComponent: public Component
p-norm的公式:

对维数为intput_dim的输入进行降维,输出维数为output_dim
其Propagate与Backprop函数十分简单,具体关于p-norm单元的实现位于
kaldi::CuMatrixBase::GroupPnorm
Kaldi::CuMatrixBase::DiffGroupPnorm
class DropoutComponent : public RandomComponent
DropoutComponent组件对输入以dropout比例随机置零,而梯度只在非零的输入处进行反向传播。通常只在训练期间使用此组件,但不在测试时间使用
Dropout: A Simple Way to Prevent Neural Networks from Overfitting"
Propogate()
//初始化一个元素取值范围为[0,1]的向量y
const_cast<CuRand<BaseFloat>&>(random_generator_).RandUniform(out);

out->Add(-dropout);

out->ApplyHeaviside();

out->MulElements(in);
通过设置dropout_per_frame_,可以以帧的元素为单位dropout:
[[0,1,1,1],[1,0,1,1],[1,1,0,1],[1,1,1,0],[1,1,1,0]]
或帧为单位进行随机丢弃:
[[1,1,1,1],[0,0,0,0],[0,0,0,0],[1,1,1,1],[0,0,0,0]]
class ElementwiseProductComponent: public Component
点乘组件,用于降维
维输入向量
(0.7,0.5,1.0,0.2,0.9,0.0,0.3,0.1,0.6,0.8)
假设输出维数为5,则10/5=2,两两相乘:
(0.7*0.5,1.0*0.2,0.9*0.0,0.3*0.1,0.6*0.8)
结果为
(0.35,0.20,0.0,0.03,0.48)
class SigmoidComponent: public NonlinearComponent
class TanhComponent: public NonlinearComponent
class RectifiedLinearComponent: public NonlinearComponent
class AffineComponent: public UpdatableComponent
class BlockAffineComponent : public UpdatableComponent
class RepeatedAffineComponent: public UpdatableComponent
class NaturalGradientRepeatedAffineComponent: public RepeatedAffineComponent
class SoftmaxComponent: public NonlinearComponent

Softmax损失函数(归一化指数函数):

其中o是输出向量
Backprop()
对于softmax函数的微分,令:

该函数的雅可比矩阵为:

令输出向量微分为e,输入向量微分为d,有:


nnet3/nnet-computation.h
负责实际的计算。
声明了ComputationRequest、CommandType、NnetComputation等类。
struct ComputationRequest
//计算需要的输入
std::vector<IoSpecification> inputs;
//计算预期的输出
std::vector<IoSpecification> outputs;
以及关于以上数据成员的实用函数
enum CommandType
神经网络计算类型,如:
kPropagate
kBackprop
kAllocMatrix
struct NnetComputation
编译后的神经网络具体计算特定步骤
给定Nnet与ComputationRequest后
就可编译得到该结构体
数据成员包括:
(子)矩阵信息及其索引(使用索引而不存储实际的矩阵)
矩阵
计算类型(CommandType)
计算所依赖的输入输出Index
nnet3/nnet-analyze.h
检测计算是否能有效进行。
主要的类:
class ComputationAnalysis
private:
const NnetComputation &computation_;
const Analyzer &analyzer_;
ComputationVariables variables;
std::vector<CommandAttributes> command_attributes;
std::vector<std::vector<Access> > variable_accesses;
std::vector<MatrixAccesses> matrix_accesses;
成员函数:
访问索引s的第一个非初始化指令
访问索引s的第一个指令
访问索引s的最后一个指令
访问索引s的最后一个写指令
访问索引s的无效指令
访问矩阵索引m的第一个非初始化指令
访问矩阵索引m的最后一个指令
class ComputationChecker
与ComputationAnalysis类似
主要检测:
维数一致性检测
未定义变量读取检测
读写冲突检测(是否是写完再读)
矩阵访问有效性检测
矩阵压缩检测
nnet3/nnet-example.h
struct NnetIo
std::vector<Index> indexes;
GeneralMatrix features;
特征(以及后验)的读写
struct NnetExample
//minibatch结构体
std::vector<NnetIo> io;
及其实用函数
以及一些关于NnetExample的比较、哈希等函数
nnet3的代码分析的更多相关文章
- Android代码分析工具lint学习
1 lint简介 1.1 概述 lint是随Android SDK自带的一个静态代码分析工具.它用来对Android工程的源文件进行检查,找出在正确性.安全.性能.可使用性.可访问性及国际化等方面可能 ...
- pmd静态代码分析
在正式进入测试之前,进行一定的静态代码分析及code review对代码质量及系统提高是有帮助的,以上为数据证明 Pmd 它是一个基于静态规则集的Java源码分析器,它可以识别出潜在的如下问题:– 可 ...
- [Asp.net 5] DependencyInjection项目代码分析-目录
微软DI文章系列如下所示: [Asp.net 5] DependencyInjection项目代码分析 [Asp.net 5] DependencyInjection项目代码分析2-Autofac [ ...
- [Asp.net 5] DependencyInjection项目代码分析4-微软的实现(5)(IEnumerable<>补充)
Asp.net 5的依赖注入注入系列可以参考链接: [Asp.net 5] DependencyInjection项目代码分析-目录 我们在之前讲微软的实现时,对于OpenIEnumerableSer ...
- 完整全面的Java资源库(包括构建、操作、代码分析、编译器、数据库、社区等等)
构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建.Maven优于Apache Ant.后者采用了一种过程化 ...
- STM32启动代码分析 IAR 比较好
stm32启动代码分析 (2012-06-12 09:43:31) 转载▼ 最近开始使用ST的stm32w108芯片(也是一款zigbee芯片).开始看他的启动代码看的晕晕呼呼呼的. 还好在c ...
- 常用 Java 静态代码分析工具的分析与比较
常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基 本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBu ...
- SonarQube-5.6.3 代码分析平台搭建使用
python代码分析 官网主页: http://docs.sonarqube.org/display/PLUG/Python+Plugin Windows下安装使用: 快速使用: 1.下载jdk ht ...
- angular代码分析之异常日志设计
angular代码分析之异常日志设计 错误异常是面向对象开发中的记录提示程序执行问题的一种重要机制,在程序执行发生问题的条件下,异常会在中断程序执行,同时会沿着代码的执行路径一步一步的向上抛出异常,最 ...
随机推荐
- Java 数组+循环升级篇
数组是一个变量,存储相同数据类型的一组数据(就是能存储很多数值的数据类型) 如果说声明一个变量就是在内存空间划出一块合适的空间,那么声明一个数组就是在内存空间划出一串连续的空间. 数组的基本要求 标识 ...
- 厘摩(centimorgan,cM)到底是啥鬼
根据维基百科的定义: 厘摩(centimorgan,简写为cM),或称为图距单位(map unit),是遗传连锁中的距离单位,以现代遗传学之父托马斯·亨特·摩尔根的名字命名.1厘摩的定义为两个位点间平 ...
- DK location not found. Define location with sdk.dir in the local.properties file or with an ANDROID_HOME
根据提示,我们可以新建一个项目或者以前自己使用过没问题的工程,从中把local.properties文件copy到我们从github中想要导入的工程中,我自己就是这样的,然后这个问题就解决了. ndk ...
- 配置ssl
1.配置 <Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000&q ...
- java的零拷贝机制
转:https://blog.csdn.net/zhouhao88410234/article/details/77574689?fps=1&locationNum=9 为何要懂零拷贝原理?因 ...
- MySQL三层结构、用户权限、索引设计原则
一.守护进程是什么? Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.它不需要用户输入就能运行而且提供某种服务,不是对 ...
- 常见的Dos命令
dir : 列出当前目录下的文件以及文件夹 md : 创建目录 rd : 删除目录 注意:rd不能删除非空的文件夹,而且只能用于删除文件夹. cd : 进入指定目录 cd.. : 退回到上一级目 ...
- python自动化开发-[第二十二天]-bbs多级评论、点赞、上传文件
今日概要: 1.related_name和related_query_name的区别 2.through_fields的用途 3.django的事务提交 4.点赞的动画效果 5.多级评论的原理 6.上 ...
- go 终端读写、文件读写
go 终端读写 操作终端相关文件句柄常量 os.Stdin:标准输入 os.Stdout:标准输出 os.Stderr:标准错误输出 示例: package main import ( "b ...
- python第四次周末大作业
''' 选课系统开发 系统登录需要有两类用户:学生.管理员,针对不用用户提供不同功能: 学生用户 :对于学生用户来说,登陆之后有三个功能 1.查看所有课程 2.选择课程 3.查看所选课程 4.删除已选 ...