하드웨어/Verilog-NN
Verilog-NN : Long Short Term Memory : LSTM
wareeasy
2023. 2. 9. 13:37
반응형
module LSTMCell(input clk,
input [3:0] input_data,
input [3:0] prev_hidden_state,
input [3:0] prev_cell_state,
output reg [3:0] next_hidden_state,
output reg [3:0] next_cell_state);
reg [3:0] forget_gate, input_gate, output_gate, cell_input;
// weights for inputs
parameter w0_f = 0.3;
parameter w1_f = 0.4;
parameter w2_f = 0.2;
parameter w0_i = 0.5;
parameter w1_i = 0.7;
parameter w2_i = 0.9;
parameter w0_o = 0.1;
parameter w1_o = 0.3;
parameter w2_o = 0.5;
parameter w0_c = 0.2;
parameter w1_c = 0.4;
parameter w2_c = 0.6;
// biases
parameter b_f = 0.1;
parameter b_i = 0.2;
parameter b_o = 0.3;
parameter b_c = 0.4;
always @(posedge clk) begin
forget_gate <= w0_f * input_data + w1_f * prev_hidden_state + w2_f * prev_cell_state + b_f;
input_gate <= w0_i * input_data + w1_i * prev_hidden_state + w2_i * prev_cell_state + b_i;
output_gate <= w0_o * input_data + w1_o * prev_hidden_state + w2_o * prev_cell_state + b_o;
cell_input <= w0_c * input_data + w1_c * prev_hidden_state + w2_c * prev_cell_state + b_c;
// apply activation functions (sigmoid)
forget_gate <= 1 / (1 + exp(-forget_gate));
input_gate <= 1 / (1 + exp(-input_gate));
output_gate <= 1 / (1 + exp(-output_gate));
cell_input <= tanh(cell_input);
next_cell_state <= forget_gate * prev_cell_state + input_gate * cell_input;
next_hidden_state <= output_gate * tanh(next_cell_state);
end
endmodule
https://towardsdatascience.com/the-mostly-complete-chart-of-neural-networks-explained-3fb6f2367464
The mostly complete chart of Neural Networks, explained
The zoo of neural network types grows exponentially. One needs a map to navigate between many emerging architectures and approaches.
towardsdatascience.com
module lstm_cell (
input clk,
input rst,
input [15:0] x,
input [15:0] h_prev,
input [15:0] c_prev,
output [15:0] h,
output [15:0] c
);
reg [15:0] i_t, f_t, o_t, g_t, s_t;
reg [15:0] i_t_temp, f_t_temp, o_t_temp, g_t_temp, s_t_temp;
reg [15:0] c_temp;
reg [15:0] h_temp;
// Gates
assign i_t_temp = x + h_prev;
assign f_t_temp = x + h_prev;
assign o_t_temp = x + h_prev;
assign g_t_temp = x + h_prev;
// Sigmoid Non-Linearity
always @(posedge clk or posedge rst) begin
if (rst) begin
i_t <= 16'h0000;
f_t <= 16'h0000;
o_t <= 16'h0000;
g_t <= 16'h0000;
end else begin
i_t <= i_t_temp;
f_t <= f_t_temp;
o_t <= o_t_temp;
g_t <= g_t_temp;
end
end
// LSTM Cell
always @(posedge clk or posedge rst) begin
if (rst) begin
s_t <= 16'h0000;
c <= 16'h0000;
h <= 16'h0000;
end else begin
s_t_temp <= c_prev * f_t + g_t * i_t;
c_temp <= s_t_temp;
h_temp <= o_t * c_temp;
s_t <= s_t_temp;
c <= c_temp;
h <= h_temp;
end
end
endmodule
반응형