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的代码分析的更多相关文章

  1. Android代码分析工具lint学习

    1 lint简介 1.1 概述 lint是随Android SDK自带的一个静态代码分析工具.它用来对Android工程的源文件进行检查,找出在正确性.安全.性能.可使用性.可访问性及国际化等方面可能 ...

  2. pmd静态代码分析

    在正式进入测试之前,进行一定的静态代码分析及code review对代码质量及系统提高是有帮助的,以上为数据证明 Pmd 它是一个基于静态规则集的Java源码分析器,它可以识别出潜在的如下问题:– 可 ...

  3. [Asp.net 5] DependencyInjection项目代码分析-目录

    微软DI文章系列如下所示: [Asp.net 5] DependencyInjection项目代码分析 [Asp.net 5] DependencyInjection项目代码分析2-Autofac [ ...

  4. [Asp.net 5] DependencyInjection项目代码分析4-微软的实现(5)(IEnumerable<>补充)

    Asp.net 5的依赖注入注入系列可以参考链接: [Asp.net 5] DependencyInjection项目代码分析-目录 我们在之前讲微软的实现时,对于OpenIEnumerableSer ...

  5. 完整全面的Java资源库(包括构建、操作、代码分析、编译器、数据库、社区等等)

    构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建.Maven优于Apache Ant.后者采用了一种过程化 ...

  6. STM32启动代码分析 IAR 比较好

    stm32启动代码分析 (2012-06-12 09:43:31) 转载▼     最近开始使用ST的stm32w108芯片(也是一款zigbee芯片).开始看他的启动代码看的晕晕呼呼呼的. 还好在c ...

  7. 常用 Java 静态代码分析工具的分析与比较

    常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基 本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBu ...

  8. SonarQube-5.6.3 代码分析平台搭建使用

    python代码分析 官网主页: http://docs.sonarqube.org/display/PLUG/Python+Plugin Windows下安装使用: 快速使用: 1.下载jdk ht ...

  9. angular代码分析之异常日志设计

    angular代码分析之异常日志设计 错误异常是面向对象开发中的记录提示程序执行问题的一种重要机制,在程序执行发生问题的条件下,异常会在中断程序执行,同时会沿着代码的执行路径一步一步的向上抛出异常,最 ...

随机推荐

  1. Javascript深入之创建对象的多种方式以及优缺点

    1.工厂模式 function createPerson(name) { var o = new Object(); o.name = name; o.getName = function() { c ...

  2. JavaScript深入之执行上下文栈

    如果要问到 javascript 代码执行顺序的话,想必写过javascript的开发者都会有个直观的印象,那就是顺序执行,例如: var foo = function(){ console.log( ...

  3. [luogu3709][大爷的字符串题]

    题目链接 题意 一天做到两道这种题目描述如此神仙的题也是够了.真锻炼语文能力. 题目的意思其实就是,给你一个序列,然后每次询问一个区间.使得尽量按照严格上升的顺序从这个区间内取数.如果当前取得数字小于 ...

  4. SetCapture() & ReleaseCapture() 捕获窗口外的【松开左键事件】: WM_LBUTTONUP

    今天在窗口上绘图的时候,遇到一个问题:在特殊情况下,当用户在窗口中按下鼠标左键,然后移动到窗口外松开鼠标左键,这时程序中只能捕获到 WM_LBUTTONDOWN(按下) 和 WM_MOUSEMOVE( ...

  5. 在Derby中取得刚刚插入的“递增”类型的字段值

    现在才发现采用不同的数据库,对写程序影响很大. 以前常用SQL Server2000或Access,可能是因为都是Microsoft公司的产品,所以在从不同的平台转换的时候问题不是很大. 现在采用De ...

  6. surfer画世界频率分布图(等高线、地点标注)

    以surfer 12版本为例: 1.下载世界地图,这里我随便提供一个范例(侵删,忘记出处了): 2.进入surfer软件,选择“MAP”——“NEW”——“BASE MAP”. 以此按照以上步骤,在弹 ...

  7. c3p0配置文件(c3p0.properties.xml)解读

    package cn.lijun.demo; import com.mchange.v2.c3p0.ComboPooledDataSource; import javax.sql.DataSource ...

  8. ETL过程

    ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取(extract).转换(transform).加载(load)至目的端的过程.ETL一词较常用在数 ...

  9. gitlab ssh-key

    1.使用 ssh-keygen 生成一下ssh key 2. cat 对应路径 复制 ssh key到项目 settings --> deploy keys 添加 3. enable这个 key

  10. MySQL5.7 的GTID复制

    MySQL5.7 的GTID复制 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 在MySQL5.6之后其官方推出了GTID复制方式,和传统的基于bin log复制方式有所不同,接 ...