📄 weight_update.c
字号:
/* * $Id: weight_update.c 1272 2007-05-09 16:26:20Z mhe $ */#include <stdio.h>#include <stdlib.h>#include <math.h>#include "lstm.h"#include "weight_update.h"#include "regularization.h"void weight_update() { int i,j,k,u,v; // use a regularization matrices or not #define REGUMAT 1 //#undef REGUMAT /* output units */ for (k=cell_mod,j=0;k<ges_mod;k++,j++) { /* memory cell */ i=in_mod_b+1; for (u=0;u<num_blocks;u++) { i++; for (v=0;v<block_size[u];v++) { i++; W[k][i] += DW[k][i]; DW[k][i] = 0; } i++; } /* bias */ W[k][in_mod_b] += DW[k][in_mod_b]; DW[k][in_mod_b] = 0; } /* memory cells with gates */ i=in_mod_b+1; for (u=0;u<num_blocks;u++) { for (j=in_mod_b;j<cell_mod;j++) { W[i][j] += DW[i][j]; DW[i][j] = 0; } i++; for (j=in_mod_b;j<cell_mod;j++) { W[i][j] += DW[i][j]; DW[i][j] = 0; } for (v=0;v<block_size[u];v++) { i++; #ifdef REGUMAT int j0 = 0; // begin of current aa segment int k0 = 0; // index of current aa in current aa segment (0-19) double dwtmpa[AAS]; for (k=0;k<AAS;k++) { dwtmpa[k] = 0; } for (j=0;j<in_mod_b;j++,k0++) { if (k0 == AAS) { for (k=0;k<AAS;k++) { W[i][j0 + k] += dwtmpa[k]; DW[i][j0 + k] = 0; dwtmpa[k] = 0; } j0 += AAS; k0 = 0; } for (k=0;k<AAS;k++) { // Gonnet500 matrix gives good results if (gonnet500skal0[k0][k]) { dwtmpa[k] += DW[i][j0 + k] * gonnet500skal0[k0][k]; } } } for (k=0;k<AAS;k++) { W[i][j0 + k] += dwtmpa[k]; DW[i][j0 + k] = 0; } #else for (j=0;j<in_mod_b;j++) { W[i][j] += DW[i][j]; DW[i][j] = 0; } #endif for (j=in_mod_b;j<cell_mod;j++) { W[i][j] += DW[i][j]; DW[i][j] = 0; } } i++; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -