系列前言
参考文献:
  1. RNNLM - Recurrent Neural Network  Language Modeling Toolkit(点此阅读)
  2. Recurrent neural network based language model(点此阅读)
  3. EXTENSIONS OF RECURRENT NEURAL NETWORK LANGUAGE MODEL(点此阅读)
  4. Strategies for Training Large Scale Neural Network  Language Models(点此阅读)
  5. STATISTICAL LANGUAGE MODELS BASED ON NEURAL  NETWORKS(点此阅读)
  6. A guide to recurrent neural networks and backpropagation(点此阅读)
  7. A Neural Probabilistic Language Model(点此阅读)
  8. Learning Long-Term Dependencies with Gradient Descent is Difficult(点此阅读)
  9. Can Artificial Neural Networks Learn Language Models?(点此阅读)
上一篇是介绍成员变量的大概含义,这一篇是介绍一些成员函数的功能,仍然是大体了解一下个别函数的功能,在第三篇才正式写实现分析。这一篇稍短,里面大部分是代码,因为很多涉及变量相关的在上一篇注释过了,所以这篇就没注释那么详细。如下:


//构造函数,这里进行很多变量的初始化    
CRnnLM()        //constructor initializes variables    
{    
    //这里的很多变量在前面都前一篇都有详细的介绍  
    //这里的初始值只要初始是为非0的可以留意一下  
    version=10;    
    filetype=TEXT;    
        
    use_lmprob=0;    
    lambda=0.75;    
    gradient_cutoff=15;    
    dynamic=0;    
        
    train_file[0]=0;    
    valid_file[0]=0;    
    test_file[0]=0;    
    rnnlm_file[0]=0;    
        
    alpha_set=0;    
    train_file_set=0;    
        
    alpha=0.1;    
    beta=0.0000001;    
    //beta=0.00000;    
    alpha_divide=0;    
    logp=0;    
    llogp=-100000000;    
    iter=0;    
        
    min_improvement=1.003;    
        
    train_words=0;    
    train_cur_pos=0;    
    vocab_max_size=100;    
    vocab_size=0;    
        
    vocab=(struct vocab_word *)calloc(vocab_max_size, sizeof(struct vocab_word));    
        
    layer1_size=30;    
        
    direct_size=0;    
    direct_order=0;    
        
    bptt=0;    
    bptt_block=10;    
    bptt_history=NULL;    
    bptt_hidden=NULL;    
    bptt_syn0=NULL;    
        
    gen=0;    
        
    independent=0;    
        
    neu0=NULL;    
    neu1=NULL;    
    neuc=NULL;    
    neu2=NULL;    
        
    syn0=NULL;    
    syn1=NULL;    
    sync=NULL;    
    syn_d=NULL;    
    syn_db=NULL;    
    //backup    
    neu0b=NULL;    
    neu1b=NULL;    
    neucb=NULL;    
    neu2b=NULL;    
        
    neu1b2=NULL;    
        
    syn0b=NULL;    
    syn1b=NULL;    
    syncb=NULL;    
    //    
        
    rand_seed=1;    
        
    class_size=100;    
    old_classes=0;    
        
    one_iter=0;    
    maxIter=0;    
        
    debug_mode=1;    
    srand(rand_seed);    
        
    //word映射为哈希的值小于100000000    
    vocab_hash_size=100000000;          
        
    //动态分配内存,calloc会自动将申请的内存初始化为0,但这里奇怪申请这么大空间,这里没对vocab_hash做检查    
    vocab_hash=(int *)calloc(vocab_hash_size, sizeof(int));    
}    
    
//析构函数,释放申请的空间    
~CRnnLM()       //destructor, deallocates memory    
{    
    int i;    
        
    if (neu0!=NULL) {    
        free(neu0);    
        free(neu1);    
        if (neuc!=NULL) free(neuc);    
        free(neu2);    
            
        free(syn0);    
        free(syn1);    
        if (sync!=NULL) free(sync);    
            
        if (syn_d!=NULL) free(syn_d);    
            
        if (syn_db!=NULL) free(syn_db);    
            
        //    
        free(neu0b);    
        free(neu1b);    
        if (neucb!=NULL) free(neucb);    
        free(neu2b);    
            
        free(neu1b2);    
            
        free(syn0b);    
        free(syn1b);    
        if (syncb!=NULL) free(syncb);    
        //    
            
        for (i=0; i<class_size; i++) free(class_words[i]);    
        free(class_max_cn);    
        free(class_cn);    
        free(class_words);    
            
        free(vocab);    
        free(vocab_hash);    
            
        if (bptt_history!=NULL) free(bptt_history);    
        if (bptt_hidden!=NULL) free(bptt_hidden);    
        if (bptt_syn0!=NULL) free(bptt_syn0);    
            
        //todo: free bptt variables too    
    }    
}                      
    
//返回值类型为real且范围在[min, max]的数    
real random(real min, real max);    
    
//设置训练数据的文件名    
void setTrainFile(char *str);    
    
//设置验证数据集的文件名    
void setValidFile(char *str);    
    
//设置测试集的文件名    
void setTestFile(char *str);    
    
//设置模型保存文件,即该文件用来存储模型的信息,以及各类参数    
void setRnnLMFile(char *str);    
    
    
//下面的函数没写注释,{}里面有语句,变量的含义可以看前篇    
//就不再一一注释了,这些参数都是从main主函数里面传来的,具体来说  
//这些参数就是来自shell命令里面的,这里可以看看我的一篇rnnlm toolkit命令参数介绍          
void setLMProbFile(char *str) {strcpy(lmprob_file, str);}    
    
void setFileType(int newt) {filetype=newt;}    
    
void setClassSize(int newSize) {class_size=newSize;}    
void setOldClasses(int newVal) {old_classes=newVal;}    
void setLambda(real newLambda) {lambda=newLambda;}    
void setGradientCutoff(real newGradient) {gradient_cutoff=newGradient;}    
void setDynamic(real newD) {dynamic=newD;}    
void setGen(real newGen) {gen=newGen;}    
void setIndependent(int newVal) {independent=newVal;}    
    
void setLearningRate(real newAlpha) {alpha=newAlpha;}    
void setRegularization(real newBeta) {beta=newBeta;}    
void setMinImprovement(real newMinImprovement) {min_improvement=newMinImprovement;}    
void setHiddenLayerSize(int newsize) {layer1_size=newsize;}    
void setCompressionLayerSize(int newsize) {layerc_size=newsize;}    
void setDirectSize(long long newsize) {direct_size=newsize;}    
void setDirectOrder(int newsize) {direct_order=newsize;}    
void setBPTT(int newval) {bptt=newval;}    
void setBPTTBlock(int newval) {bptt_block=newval;}    
void setRandSeed(int newSeed) {rand_seed=newSeed; srand(rand_seed);}    
void setDebugMode(int newDebug) {debug_mode=newDebug;}    
void setAntiKasparek(int newAnti) {anti_k=newAnti;}    
void setOneIter(int newOneIter) {one_iter=newOneIter;}    
void setMaxIter(int newMaxIter) {maxIter=newMaxIter;}    
    
//返回单词的哈希值    
int getWordHash(char *word);    
    
//从文件中读取一个单词到word    
void readWord(char *word, FILE *fin);    
    
//查找word,找到返回word在vocab中的索引,没找到返回-1    
int searchVocab(char *word);    
    
//读取当前文件指针所指的单词,并返回该单词在vocab中的索引    
int readWordIndex(FILE *fin);    
    
//将word添加到vocab中,并且返回刚添加word在vocab中的索引    
int addWordToVocab(char *word);    
    
//从train_file中读数据,相关数据会装入vocab,vocab_hash    
//这里假设vocab是空的    
void learnVocabFromTrainFile();     //train_file will be used to construct vocabulary    
    
//保存当前的权值,以及神经元信息值    
void saveWeights();         //saves current weights and unit activations    
    
//上面是暂存当前权值及神经元值,这里是从前面存下的数据中恢复    
void restoreWeights();      //restores current weights and unit activations from backup copy    
//void saveWeights2();      //allows 2. copy to be stored, useful for dynamic rescoring of nbest lists    
//void restoreWeights2();           
    
//保存隐层神经元的ac值    
void saveContext();    
    
//恢复隐层神经元的ac值    
void restoreContext();    
    
//保存隐层神经元的ac值    
void saveContext2();    
    
//恢复隐层神经元的ac值    
void restoreContext2();    
    
//初始化网络    
void initNet();    
    
//保存网络的所有信息到rnnlm_file    
void saveNet();    
    
//从文件流中读取一个字符使其ascii等于delim    
//随后文件指针指向delim的下一个    
void goToDelimiter(int delim, FILE *fi);    
    
//从rnnlm_file中读取网络的所有信息    
void restoreNet();    
    
//清除神经元的ac,er值    
void netFlush();    
    
//隐层神经元(论文中的状态层s(t))的ac值置1    
//s(t-1),即输入层layer1_size那部分的ac值置1    
//bptt+history清0    
void netReset();    //will erase just hidden layer state + bptt history + maxent history (called at end of sentences in the independent mode)    
    
//网络前向,计算概率分布    
void computeNet(int last_word, int word);    
    
//反传误差,更新网络权值    
void learnNet(int last_word, int word);    
    
将隐层神经元的ac值复制到输出层后layer1_size那部分    
void copyHiddenLayerToInput();    
    
//训练网络    
void trainNet();    
void useLMProb(int use) {use_lmprob=use;}    
    
//测试网络    
void testNet();    
    
//这两个我还没看~    
void testNbest();    
void testGen();    
    
//矩阵和向量相乘  
//1.type == 0时,计算的是神经元ac值,相当于计算srcmatrix × srcvec, 其中srcmatrix是(to-from)×(to2-from2)的矩阵 
//srcvec是(to2-from2)×1的列向量,得到的结果是(to-from)×1的列向量,该列向量的值存入dest中的ac值  
//2.type == 1, 计算神经元的er值,即(srcmatrix)^T × srcvec,T表示转置,转置后是(to2-from2)×(to-from),srcvec是(to-from)×1的列向量    
  
void matrixXvector(struct neuron *dest, struct neuron *srcvec, struct synapse *srcmatrix, int matrix_width, int from, int to, int from2, int to2, int type);

rnnlm源码分析 二相关推荐

  1. rnnlm源码分析(二)

    系列前言 参考文献: RNNLM - Recurrent Neural Network  Language Modeling Toolkit(点此阅读) Recurrent neural networ ...

  2. 【Android 事件分发】ItemTouchHelper 源码分析 ( OnItemTouchListener 事件监听器源码分析 二 )

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...

  3. SpringBoot源码分析(二)之自动装配demo

    SpringBoot源码分析(二)之自动装配demo 文章目录 SpringBoot源码分析(二)之自动装配demo 前言 一.创建RedissonTemplate的Maven服务 二.创建测试服务 ...

  4. gSOAP 源码分析(二)

    gSOAP 源码分析(二) 2012-5-24 flyfish 一 gSOAP XML介绍 Xml的全称是EXtensible Markup Language.可扩展标记语言.仅仅是一个纯文本.适合用 ...

  5. Android Q 10.1 KeyMaster源码分析(二) - 各家方案的实现

    写在之前 这两篇文章是我2021年3月初看KeyMaster的笔记,本来打算等分析完KeyMaster和KeyStore以后再一起做成一系列贴出来,后来KeyStore的分析中断了,这一系列的文章就变 ...

  6. 【投屏】Scrcpy源码分析二(Client篇-连接阶段)

    Scrcpy源码分析系列 [投屏]Scrcpy源码分析一(编译篇) [投屏]Scrcpy源码分析二(Client篇-连接阶段) [投屏]Scrcpy源码分析三(Client篇-投屏阶段) [投屏]Sc ...

  7. Nouveau源码分析(二):Nouveau结构体的基本框架

    Nouveau源码分析(二) 在讨论Nouveau对Nvidia设备的初始化前,我准备先说一下Nouveau结构体的基本框架 Nouveau的很多结构体都可以看作是C++中的类,之间有很多相似的东西, ...

  8. ENS最新合约源码分析二

    ENS(以太坊域名服务)智能合约源码分析二 0.简介 ​ 本次分享直接使用线上实际注册流程来分析最新注册以太坊域名的相关代码.本次主要分析最新的关于普通域名注册合约和普通域名迁移合约,短域名竞拍合约不 ...

  9. 【转】ABP源码分析二:ABP中配置的注册和初始化

    一般来说,ASP.NET Web应用程序的第一个执行的方法是Global.asax下定义的Start方法.执行这个方法前HttpApplication 实例必须存在,也就是说其构造函数必然已完成了执行 ...

最新文章

  1. 用Cobertura 测量测试覆盖率
  2. 第一百三十节,JavaScript,封装库--连缀
  3. 正式进驻1410实验室!
  4. .net Web网站转换成Web应用程序 备忘
  5. Coursera自动驾驶课程第9讲:Visual Features Detection Description and Matching
  6. 目标检测论文阅读:Cascade R-CNN: Delving into High Quality Object Detection(CVPR2018)
  7. Logback配置一(按时间归档)
  8. 数据结构和算法——线性结构(1)数组、栈、队列和单链表
  9. 静态资源文件自动压缩并替换成压缩版本(大型网站优化技术)
  10. junsansi 列表(4) - 三思笔记,ORACLE学习轨迹~~~~ - ITPUB个...
  11. Intellij IDEA免费版方法(1)
  12. linux路由表怎么看懂,教你读懂Linux路由表
  13. 借助传感器用计算机测量速度,实验用打点计时器测速度修改.ppt
  14. 线下交易如何避免微信和支付宝交易风控
  15. QTextEdit的使用
  16. h5页面定时跳转+读秒
  17. ASP.NET CORE WebAPI 中 Route 属性配置
  18. alibaba的COBAR真是强大.
  19. 免费DataGridView打印及.NET轻松打印控件(VB打印,C#打印)
  20. 什么是shell,用途是什么

热门文章

  1. 基于正点原子探索者使用STM32CubeMX+FreeRTOS+LWIP
  2. 【51单片机】矩阵键盘逐行扫描法仿真实验+超详细Proteus仿真和Keil操作步骤
  3. vue按钮字体大小设置_用Vue模仿antd的样式造UI组件之button
  4. OpenPifPaf decode源码解析
  5. 知识图谱数据集下载 KnowledgeGraphDatasets
  6. 零基础学习UI设计技能
  7. 如何开发一款ios应用程序
  8. Given-When-Then表达方式应用
  9. 《信息安全技术关键信息基础设施安全保护要求》获批准通过
  10. 垃圾渗滤液的形成过程!