C語言LSTM隱層神經元結構:
LSTM隱層神經元詳細結構:
//讓程序自己學會是否需要進位,從而學會加法#include "iostream"#include "math.h"#include "stdlib.h"#include "time.h"#include "vector"#include "assert.h"using namespace std;#define innode 2 //輸入結點數,將輸入2個加數#define hidenode 26 //隱藏結點數,存儲“攜帶位”#define outnode 1 //輸出結點數,將輸出一個預測數字#define alpha 0.1 //學習速率#define binary_dim 8 //二進制數的最大長度#define randval(high) ( (double)rand() / RAND_MAX * high )#define uniform_plus_minus_one ( (double)( 2.0 * rand() ) / ((double)RAND_MAX + 1.0) - 1.0 ) //均勻隨機分布int largest_number = ( pow(2, binary_dim) ); //跟二進制最大長度對應的可以表示的最大十進制數//激活函數double sigmoid(double x) { return 1.0 / (1.0 + exp(-x)); }//激活函數的導數,y為激活函數值double dsigmoid(double y) { return y * (1.0 - y); } //tanh的導數,y為tanh值double dtanh(double y) { y = tanh(y); return 1.0 - y * y; }//將一個10進制整數轉換為2進制數void int2binary(int n, int *arr) { int i = 0; while(n) { arr[i++] = n % 2; n /= 2; } while(i < binary_dim) ? ? ? ?arr[i++] = 0; }class RNN {public: ? ?RNN(); ? ?virtual ~RNN(); ? ?void train();public: ? ?double W_I[innode][hidenode]; ? ? //連接輸入與隱含層單元中輸入門的權值矩陣 ? ?double U_I[hidenode][hidenode]; ? //連接上一隱層輸出與本隱含層單元中輸入門的權值矩陣 ? ?double W_F[innode][hidenode]; ? ? //連接輸入與隱含層單元中遺忘門的權值矩陣 ? ?double U_F[hidenode][hidenode]; ? //連接上一隱含層與本隱含層單元中遺忘門的權值矩陣 ? ?double W_O[innode][hidenode]; ? ? //連接輸入與隱含層單元中遺忘門的權值矩陣 ? ?double U_O[hidenode][hidenode]; ? //連接上一隱含層與現在時刻的隱含層的權值矩陣 ? ?double W_G[innode][hidenode]; ? ? //用于產生新記憶的權值矩陣 ? ?double U_G[hidenode][hidenode]; ? //用于產生新記憶的權值矩陣 ? ?double W_out[hidenode][outnode]; ?//連接隱層與輸出層的權值矩陣 ? ?double *x; ? ? ? ? ? ? //layer 0 輸出值,由輸入向量直接設定 ? ?//double *layer_1; ? ? //layer 1 輸出值 ? ?double *y; ? ? ? ? ? ? //layer 2 輸出值};void winit(double w[], int n) //權值初始化{ ? ?for(int i=0; i
-
C語言
+關注
關注
180文章
7614瀏覽量
137420 -
程序
+關注
關注
117文章
3795瀏覽量
81292 -
神經元
+關注
關注
1文章
363瀏覽量
18489
原文標題:LSTM神經網絡的詳細推導與c++實現
文章出處:【微信號:C_Expert,微信公眾號:C語言專家集中營】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論