Loading...
Searching...
No Matches
lstm_layer.h
Go to the documentation of this file.
1// SPDX-License-Identifier: AGPL-3.0-only
2// Copyright (C) 2026 Artificial Intelligence Techniques, S.L. and Roberto López González
3
4#pragma once
5
10
11namespace opennn
12{
13
15{
30
44
45 Index input_features = 0;
46 Index output_features = 0;
47 Index time_steps = 0;
48
49 bool return_sequences = false;
50
53
58
63
68
73
78
83
84 void set(Index,
85 Index,
86 Index,
87 ActivationFunction new_activation_function = ActivationFunction::Tanh,
88 ActivationFunction new_recurrent_activation_function = ActivationFunction::Sigmoid,
89 Type new_compute_dtype = Type::FP32);
90
91 // The four gates are always taken in this order, and every site that
92 // touches them -- specs, linking, initialization, the cuDNN pack -- used to
93 // spell the quartet out by hand. That was 34 copies of the same four names.
95
96 // A TensorView is itself a view, so reading the quartet never needs a
97 // mutable pointer; only parameter_slots does, and it pairs the members up
98 // by hand so a parameter can never drift away from its gradient.
100
105
114
115 vector<TensorSpec> parameter_specs() const override;
116 vector<ParameterSlot> parameter_slots() override;
117
118 void set_parameters_random() override;
119 void set_parameters_glorot() override;
120 void set_parameters_pytorch() override;
121
123 void back_propagate(ForwardPropagation&, BackPropagation&, size_t) const override;
124
125private:
126 void apply(const TensorView&,
127 TensorView&,
128 TensorView&,
129 TensorView&,
130 TensorView&,
131 TensorView&,
132 TensorView&,
133 TensorView&,
134 TensorView&,
135 bool training) const;
136
137 void apply_delta(const TensorView&,
138 const TensorView&,
139 TensorView&,
140 TensorView&,
141 TensorView&,
142 TensorView&,
143 TensorView&,
144 TensorView&,
145 TensorView&,
146 const TensorView&,
147 const TensorView&,
148 const TensorView&,
149 const TensorView&,
150 const TensorView&,
151 const TensorView&,
152 const TensorView&) const;
153
154 bool apply_onednn(const TensorView&,
155 TensorView&,
156 TensorView&,
157 TensorView&,
158 TensorView&,
159 Buffer&,
160 bool is_training,
161 uint64_t parameters_version) const;
162
163 bool apply_delta_onednn(const TensorView&,
164 const TensorView&,
165 const TensorView&,
166 const TensorView&,
167 TensorView&,
168 TensorView&,
169 TensorView&,
170 const Buffer&,
171 Buffer&,
172 bool return_seq) const;
173
174 void apply_gpu(const TensorView&,
175 TensorView&,
176 TensorView&,
177 TensorView&,
178 TensorView&,
179 Buffer&,
180 bool return_seq,
181 bool is_training,
182 uint64_t parameters_version) const;
183
184 void apply_delta_gpu(const TensorView&,
185 const TensorView&,
186 const TensorView&,
187 const TensorView&,
188 const TensorView&,
189 TensorView&,
190 TensorView&,
191 TensorView&,
192 const Buffer&,
193 Buffer&,
194 bool return_seq) const;
195
196 CudnnRnnShapeSlot& ensure_cudnn_setup_(Index batch_size, bool for_training) const;
197 void pack_weights_to_cudnn_(Buffer&, uint64_t) const;
198 void unpack_gradients_from_cudnn_(Buffer&) const;
199
200};
201
202class LSTM final : public Layer
203{
204public:
205
206 LSTM(const Shape& = {},
207 const Shape& = {},
208 const string& = "Tanh",
209 const string& = "Sigmoid",
210 const string& = "lstm_layer");
211
212 Shape get_input_shape() const noexcept override { return input_shape; }
213 Shape get_output_shape() const override
214 {
215 return return_sequences ? Shape{get_time_steps(), output_features}
216 : Shape{output_features};
217 }
218
219 Index get_time_steps() const noexcept { return input_shape.get_rank() == 2 ? input_shape[0] : Index(0); }
220 Index get_input_features() const noexcept { return input_shape.get_rank() == 2 ? input_shape[1] : Index(0); }
221 Index get_output_features() const noexcept { return output_features; }
222
223 bool get_return_sequences() const noexcept { return return_sequences; }
224 void set_return_sequences(bool value);
225
226 const TensorView& get_forget_bias() const noexcept { return lstm_op.forget_bias; }
227
228 const ActivationFunction& get_activation_function() const noexcept { return lstm_op.activation_function; }
229 const ActivationFunction& get_recurrent_activation_function() const noexcept { return lstm_op.recurrent_activation_function; }
230 ActivationFunction get_output_activation() const noexcept override { return lstm_op.activation_function; }
231
232 vector<TensorSpec> get_forward_specs(Index) const override;
233 vector<TensorSpec> get_backward_specs(Index) const override;
234
235 void set(const Shape& = {},
236 const Shape& = {},
237 const string& = "Tanh",
238 const string& = "Sigmoid",
239 const string& = "lstm_layer");
240
241 bool accepts_input_rank(Index rank) const override { return is_one_of(rank, 2); }
242 bool is_recurrent() const noexcept override { return true; }
243
244 void apply_input_shape(const Shape&) override;
245 void set_output_shape(const Shape&) override;
246 void on_compute_dtype_changed() override { configure_operators(); }
247
248 void set_activation_function(const string&);
250
251 void read_JSON_body(const Json*) override;
252 void write_JSON_body(JsonWriter&) const override;
253
254 string write_expression(const vector<string>&,
255 const vector<string>&) const override;
256
257private:
258
259 Index output_features = 0;
260 bool return_sequences = false;
261
262 LSTMOperator lstm_op;
263
264 void configure_operators();
265};
266
267}
Definition json.h:92
Definition json.h:24
ActivationFunction get_output_activation() const noexcept override
Definition lstm_layer.h:230
Shape get_input_shape() const noexcept override
Definition lstm_layer.h:212
void set_activation_function(const string &)
bool is_recurrent() const noexcept override
Definition lstm_layer.h:242
bool accepts_input_rank(Index rank) const override
Definition lstm_layer.h:241
Index get_time_steps() const noexcept
Definition lstm_layer.h:219
Shape get_output_shape() const override
Definition lstm_layer.h:213
const ActivationFunction & get_recurrent_activation_function() const noexcept
Definition lstm_layer.h:229
void set(const Shape &={}, const Shape &={}, const string &="Tanh", const string &="Sigmoid", const string &="lstm_layer")
void apply_input_shape(const Shape &) override
void set_recurrent_activation_function(const string &)
LSTM(const Shape &={}, const Shape &={}, const string &="Tanh", const string &="Sigmoid", const string &="lstm_layer")
void on_compute_dtype_changed() override
Definition lstm_layer.h:246
bool get_return_sequences() const noexcept
Definition lstm_layer.h:223
Index get_output_features() const noexcept
Definition lstm_layer.h:221
string write_expression(const vector< string > &, const vector< string > &) const override
Index get_input_features() const noexcept
Definition lstm_layer.h:220
vector< TensorSpec > get_forward_specs(Index) const override
void write_JSON_body(JsonWriter &) const override
void set_output_shape(const Shape &) override
void set_return_sequences(bool value)
vector< TensorSpec > get_backward_specs(Index) const override
const TensorView & get_forget_bias() const noexcept
Definition lstm_layer.h:226
void read_JSON_body(const Json *) override
const ActivationFunction & get_activation_function() const noexcept
Definition lstm_layer.h:228
Layer(LayerType type, Trainability trainability=Trainability::Trainable)
Definition layer.h:210
Shape input_shape
Definition layer.h:219
Definition configuration.h:10
bool is_training(ForwardPropagationMode pass) noexcept
Definition forward_propagation.h:38
Eigen::array< T, N > array
Definition tensor_types.h:736
constexpr bool is_one_of(const T &value, const Candidates &... candidates)
Definition opennn_types.h:273
Type
Definition configuration.h:13
@ FP32
Definition configuration.h:13
ForwardPropagationMode
Definition forward_propagation.h:33
ActivationFunction
Definition configuration.h:39
@ Sigmoid
Definition configuration.h:39
@ Tanh
Definition configuration.h:39
Definition back_propagation.h:19
Definition tensor_types.h:340
Definition cudnn_rnn.h:17
Definition cudnn_rnn.h:50
Definition forward_propagation.h:52
Definition lstm_layer.h:15
GateViews gate_weight_gradients() const
Definition lstm_layer.h:108
TensorView output_bias
Definition lstm_layer.h:57
TensorView forget_weights
Definition lstm_layer.h:59
ActivationFunction activation_function
Definition lstm_layer.h:51
TensorView candidate_weight_gradient
Definition lstm_layer.h:76
Index time_steps
Definition lstm_layer.h:47
TensorView output_weight_gradient
Definition lstm_layer.h:77
GateViews gate_bias_gradients() const
Definition lstm_layer.h:106
void set_parameters_glorot() override
Index input_features
Definition lstm_layer.h:45
TensorView input_weights
Definition lstm_layer.h:60
TensorView forget_bias
Definition lstm_layer.h:54
TensorView input_weight_gradient
Definition lstm_layer.h:75
TensorView output_recurrent_weights
Definition lstm_layer.h:67
void set_parameters_pytorch() override
TensorView candidate_recurrent_weights
Definition lstm_layer.h:66
TensorView candidate_bias
Definition lstm_layer.h:56
ActivationFunction recurrent_activation_function
Definition lstm_layer.h:52
TensorView candidate_bias_gradient
Definition lstm_layer.h:71
Gate
Definition lstm_layer.h:94
@ Forget
Definition lstm_layer.h:94
@ Input
Definition lstm_layer.h:94
@ Candidate
Definition lstm_layer.h:94
@ Output
Definition lstm_layer.h:94
@ GateCount
Definition lstm_layer.h:94
TensorView output_recurrent_weight_gradient
Definition lstm_layer.h:82
void set_parameters_random() override
ForwardSlot
Definition lstm_layer.h:17
@ HiddenStateSlot
Definition lstm_layer.h:24
@ ForgetGateSlot
Definition lstm_layer.h:19
@ InputSlot
Definition lstm_layer.h:18
@ CudnnOutputSequenceSlot
Definition lstm_layer.h:27
@ OutputGateSlot
Definition lstm_layer.h:22
@ CellStateSlot
Definition lstm_layer.h:23
@ CandidateGateSlot
Definition lstm_layer.h:21
@ CudnnInputSequenceSlot
Definition lstm_layer.h:26
@ OutputSlot
Definition lstm_layer.h:28
@ InputGateSlot
Definition lstm_layer.h:20
@ CellActivationSlot
Definition lstm_layer.h:25
BackwardSlot
Definition lstm_layer.h:32
@ HiddenDeltaScratchSlot
Definition lstm_layer.h:35
@ InputDeltaSlot
Definition lstm_layer.h:34
@ CellDeltaScratchSlot
Definition lstm_layer.h:36
@ OutputDeltaSlot
Definition lstm_layer.h:33
@ OutputDeltaScratchSlot
Definition lstm_layer.h:40
@ ForgetDeltaScratchSlot
Definition lstm_layer.h:37
@ CandidateDeltaScratchSlot
Definition lstm_layer.h:39
@ CudnnOutputDeltaScratchSlot
Definition lstm_layer.h:41
@ InputDeltaScratchSlot
Definition lstm_layer.h:38
@ CudnnInputDeltaScratchSlot
Definition lstm_layer.h:42
vector< ParameterSlot > parameter_slots() override
TensorView forget_recurrent_weights
Definition lstm_layer.h:64
TensorView forget_recurrent_weight_gradient
Definition lstm_layer.h:79
vector< TensorSpec > parameter_specs() const override
Index output_features
Definition lstm_layer.h:46
GateViews gate_weights() const
Definition lstm_layer.h:102
GateViews gate_recurrent_weights() const
Definition lstm_layer.h:103
TensorView output_bias_gradient
Definition lstm_layer.h:72
GateViews gate_biases() const
Definition lstm_layer.h:101
TensorView forget_bias_gradient
Definition lstm_layer.h:69
bool return_sequences
Definition lstm_layer.h:49
TensorView input_bias
Definition lstm_layer.h:55
TensorView candidate_recurrent_weight_gradient
Definition lstm_layer.h:81
GateViews gate_recurrent_weight_gradients() const
Definition lstm_layer.h:110
TensorView candidate_weights
Definition lstm_layer.h:61
TensorView input_bias_gradient
Definition lstm_layer.h:70
TensorView input_recurrent_weights
Definition lstm_layer.h:65
void set(Index, Index, Index, ActivationFunction new_activation_function=ActivationFunction::Tanh, ActivationFunction new_recurrent_activation_function=ActivationFunction::Sigmoid, Type new_compute_dtype=Type::FP32)
TensorView output_weights
Definition lstm_layer.h:62
void forward_propagate(ForwardPropagation &, size_t, ForwardPropagationMode) override
array< const TensorView *, GateCount > GateViews
Definition lstm_layer.h:99
TensorView input_recurrent_weight_gradient
Definition lstm_layer.h:80
void back_propagate(ForwardPropagation &, BackPropagation &, size_t) const override
TensorView forget_weight_gradient
Definition lstm_layer.h:74
Definition operator.h:28
Definition tensor_types.h:172
Definition tensor_types.h:540