Loading...
Searching...
No Matches
recurrent_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{
26
39
40 Index input_features = 0;
41 Index time_steps = 0;
42 Index output_features = 0;
44
45 bool return_sequences = false;
46
50
54
55 void set(Index,
56 Index,
57 Index,
60
61 vector<TensorSpec> parameter_specs() const override;
62 vector<ParameterSlot> parameter_slots() override;
63
64 void set_parameters_random() override;
65 void set_parameters_glorot() override;
66 void set_parameters_pytorch() override;
67
69 void back_propagate(ForwardPropagation&, BackPropagation&, size_t) const override;
70
71private:
72 void apply(const TensorView&,
76 bool is_training) const;
77 void apply_gpu(const TensorView&,
87 Buffer&,
88 bool is_training,
89 uint64_t parameters_version) const;
90
91 void apply_delta(const TensorView&,
92 const TensorView&,
93 const TensorView&,
94 const TensorView&,
97 Buffer&) const;
98 void apply_delta_gpu(const TensorView&,
99 const TensorView&,
100 const TensorView&,
101 const TensorView&,
102 TensorView&,
103 TensorView&,
104 TensorView&,
105 TensorView&,
106 TensorView&,
107 TensorView&,
108 TensorView&,
109 TensorView&,
110 const TensorView&,
111 const TensorView&,
112 const Buffer&,
113 Buffer&) const;
114
115 bool cudnn_rnn_eligible_(const TensorView&) const;
116 CudnnRnnShapeSlot& ensure_cudnn_setup_(Index batch_size, bool for_training) const;
117 void pack_weights_to_cudnn_(Buffer&, uint64_t) const;
118 void unpack_gradients_from_cudnn_(Buffer&) const;
119 void apply_gpu_cudnn_(const TensorView&, TensorView&, TensorView&,
121 uint64_t parameters_version) const;
122 void apply_delta_gpu_cudnn_(const TensorView&, const TensorView&,
123 const TensorView&, const TensorView&,
125 TensorView&, const Buffer&, Buffer&) const;
126};
127
128class Recurrent final : public Layer
129{
130public:
131
132 Recurrent(const Shape& = {0, 0},
133 const Shape& = {0},
134 const string& = "Tanh",
135 const string& = "recurrent_layer");
136
137 Shape get_input_shape() const noexcept override { return input_shape; }
138 Shape get_output_shape() const override
139 {
140 return return_sequences ? Shape{input_shape[0], output_features}
141 : Shape{output_features};
142 }
143
144 void set_return_sequences(bool value);
145
146 string get_activation_function() const { return ActivationOperator::to_string(recurrent_op.activation); }
147 ActivationFunction get_output_activation() const override { return recurrent_op.activation; }
148
149 vector<TensorSpec> get_forward_specs(Index) const override;
150 vector<TensorSpec> get_backward_specs(Index) const override;
161
162 void set(const Shape& = {},
163 const Shape& = {},
164 const string& = "Tanh",
165 const string& = "recurrent_layer");
166
167 bool accepts_input_rank(Index rank) const override { return is_one_of(rank, 2); }
168 bool is_recurrent() const noexcept override { return true; }
169
170 void apply_input_shape(const Shape&) override;
171 void set_output_shape(const Shape&) override;
172 void on_compute_dtype_changed() override { configure_operators(); }
173
174 void set_activation_function(const string&);
175
176 void read_JSON_body(const Json*) override;
177 void write_JSON_body(JsonWriter&) const override;
178
179 string write_expression(const vector<string>&,
180 const vector<string>&) const override;
181
182private:
183
184 enum Forward
185 {
186 Input,
187 HiddenStates,
188 ActivationDerivatives,
189 StepInputScratch,
190 StepHiddenScratch,
191 PreviousHiddenScratch,
192 StepDerivativesScratch,
193 CudnnInputSequence,
194 CudnnOutputSequence,
195 Output
196 };
197
198 Index output_features = 0;
199 bool return_sequences = false;
200
201 RecurrentOperator recurrent_op;
202
203 void configure_operators();
204};
205
206}
Definition json.h:92
Definition json.h:24
Layer(LayerType type, Trainability trainability=Trainability::Trainable)
Definition layer.h:210
Shape input_shape
Definition layer.h:219
string get_activation_function() const
Definition recurrent_layer.h:146
ActivationFunction get_output_activation() const override
Definition recurrent_layer.h:147
void read_JSON_body(const Json *) override
Shape get_output_shape() const override
Definition recurrent_layer.h:138
void apply_input_shape(const Shape &) override
void set(const Shape &={}, const Shape &={}, const string &="Tanh", const string &="recurrent_layer")
Recurrent(const Shape &={0, 0}, const Shape &={0}, const string &="Tanh", const string &="recurrent_layer")
bool accepts_input_rank(Index rank) const override
Definition recurrent_layer.h:167
Shape get_input_shape() const noexcept override
Definition recurrent_layer.h:137
void set_return_sequences(bool value)
vector< TensorSpec > get_forward_specs(Index) const override
string write_expression(const vector< string > &, const vector< string > &) const override
vector< TensorSpec > get_backward_specs(Index) const override
void on_compute_dtype_changed() override
Definition recurrent_layer.h:172
void set_output_shape(const Shape &) override
void set_activation_function(const string &)
void write_JSON_body(JsonWriter &) const override
ForwardSlotKind get_forward_slot_kind(size_t slot) const override
Definition recurrent_layer.h:151
bool is_recurrent() const noexcept override
Definition recurrent_layer.h:168
Definition configuration.h:10
bool is_training(ForwardPropagationMode pass) noexcept
Definition forward_propagation.h:38
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
ForwardSlotKind
Definition layer.h:18
@ Transient
Definition layer.h:18
@ TrainingOnly
Definition layer.h:18
@ Pooled
Definition layer.h:18
ForwardPropagationMode
Definition forward_propagation.h:33
ActivationFunction
Definition configuration.h:39
@ Tanh
Definition configuration.h:39
static const string & to_string(ActivationFunction function)
Definition activation_operator.h:14
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 operator.h:28
Definition recurrent_layer.h:15
Index input_features
Definition recurrent_layer.h:40
Index time_steps
Definition recurrent_layer.h:41
TensorView input_weights
Definition recurrent_layer.h:48
void set_parameters_pytorch() override
TensorView input_weight_gradient
Definition recurrent_layer.h:52
bool return_sequences
Definition recurrent_layer.h:45
vector< ParameterSlot > parameter_slots() override
void back_propagate(ForwardPropagation &, BackPropagation &, size_t) const override
void set_parameters_glorot() override
ActivationFunction activation
Definition recurrent_layer.h:43
TensorView bias_gradient
Definition recurrent_layer.h:51
void forward_propagate(ForwardPropagation &, size_t, ForwardPropagationMode) override
ForwardScratchSlot
Definition recurrent_layer.h:17
@ StepHiddenForwardSlot
Definition recurrent_layer.h:20
@ PreviousStateHistoryForwardSlot
Definition recurrent_layer.h:18
@ StepDerivativesForwardSlot
Definition recurrent_layer.h:22
@ CudnnOutputSequenceForwardSlot
Definition recurrent_layer.h:24
@ PreviousHiddenForwardSlot
Definition recurrent_layer.h:21
@ StepInputForwardSlot
Definition recurrent_layer.h:19
@ CudnnInputSequenceForwardSlot
Definition recurrent_layer.h:23
BackwardSlot
Definition recurrent_layer.h:28
@ StepPrevHScratchSlot
Definition recurrent_layer.h:32
@ StepInputScratchSlot
Definition recurrent_layer.h:31
@ StepInDeltaScratchSlot
Definition recurrent_layer.h:35
@ NextCarryScratchSlot
Definition recurrent_layer.h:34
@ InputDeltaSlot
Definition recurrent_layer.h:30
@ OutputDeltaSlot
Definition recurrent_layer.h:29
@ SequenceDeltaScratchSlot
Definition recurrent_layer.h:36
@ CudnnInputDeltaScratchSlot
Definition recurrent_layer.h:37
@ DeltaScratchSlot
Definition recurrent_layer.h:33
TensorView bias
Definition recurrent_layer.h:47
void set(Index, Index, Index, ActivationFunction=ActivationFunction::Tanh, Type=Type::FP32)
TensorView recurrent_weight_gradient
Definition recurrent_layer.h:53
Index output_features
Definition recurrent_layer.h:42
vector< TensorSpec > parameter_specs() const override
TensorView recurrent_weights
Definition recurrent_layer.h:49
void set_parameters_random() override
Definition tensor_types.h:172
Definition tensor_types.h:540