Module containing implementation of a reshape layer
This module implements a general reshape layer that can transform tensors between arbitrary shapes while preserving the total number of elements. Unlike flatten (which only converts to 1D), reshape allows any target shape.
Mathematical operation: Reshape: (d1, d2, ..., dn) -> (d1', d2', ..., dm') where: d1 * d2 * ... * dn = d1' * d2' * ... * dm'
Examples: - (28, 28) -> (784) [flatten] - (784) -> (28, 28) [unflatten] - (64, 32, 32) -> (64, 1024) [spatial to sequence] - (100, 50) -> (10, 10, 50) [add spatial dimension]
Properties: - No learnable parameters (pure reshape operation) - Preserves all information (bijective mapping) - No computation beyond memory reorganisation - Gradients flow unchanged (chain rule applies directly)
Interface for setting up the reshape layer
Set up the reshape layer
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer, | intent(in), | dimension(:) | :: | output_shape |
Target output shape (excluding batch dimension) |
|
| integer, | intent(in), | optional, | dimension(:) | :: | input_shape |
Input shape (excluding batch dimension) |
| integer, | intent(in), | optional | :: | verbose |
Verbosity level |
Instance of the reshape layer
Type for reshape layer with overloaded procedures
| Type | Visibility | Attributes | Name | Initial | |||
|---|---|---|---|---|---|---|---|
| type(graph_type), | public, | allocatable, dimension(:) | :: | graph |
Graph structure of input data |
||
| integer, | public | :: | id |
Unique identifier |
|||
| logical, | public | :: | inference | = | .false. |
Inference mode |
|
| integer, | public | :: | input_rank | = | 0 |
Rank of input data |
|
| integer, | public, | allocatable, dimension(:) | :: | input_shape |
Input shape |
||
| character(len=:), | public, | allocatable | :: | name |
Layer name |
||
| class(array_type), | public, | allocatable, dimension(:,:) | :: | output |
Output |
||
| integer, | public | :: | output_rank | = | 0 |
Rank of output data |
|
| integer, | public, | allocatable, dimension(:) | :: | output_shape |
Output shape |
||
| character(len=20), | public | :: | subtype | = | repeat(" ", 20) | ||
| character(len=4), | public | :: | type | = | 'base' |
Layer type |
|
| logical, | public | :: | use_graph_input | = | .false. |
Use graph input |
|
| logical, | public | :: | use_graph_output | = | .false. |
Use graph output |
Interface for setting up the reshape layer
| private module function layer_setup (output_shape, input_shape, verbose) | Set up the reshape layer |
| procedure, public, pass(this) :: build_from_onnx => build_from_onnx_reshape | Build reshape layer from ONNX node and initialisers |
| procedure, public, pass(this) :: emit_onnx_graph_inputs => emit_onnx_graph_inputs_base | Emit graph input tensor declarations for this layer |
| procedure, public, pass(this) :: emit_onnx_nodes => emit_onnx_nodes_base | Emit ONNX JSON nodes for this layer (format-aware and polymorphic) |
| procedure, public, pass(this) :: extract_output => extract_output_base | Extract the output of the layer as a standard real array |
| procedure, public, pass(this) :: forward => forward_reshape | Forward propagation derived type handler |
| procedure, public, pass(this) :: forward_eval => forward_eval_base | Forward pass of layer and return output for evaluation |
| procedure, public, pass(this) :: get_attributes => get_attributes_base | Get the attributes of the layer (for ONNX export) |
| procedure, public, pass(this) :: get_num_params => get_num_params_base | Get the number of parameters in the layer |
| procedure, public, pass(this) :: init => init_reshape | Initialise reshape layer |
| procedure, public, pass(this) :: nullify_graph => nullify_graph_base | Nullify the forward pass data of the layer to free memory |
| procedure, public, pass(this) :: print => print_base | Print the layer to a file with additional information |
| procedure, public, pass(this) :: print_to_unit => print_to_unit_reshape | Print reshape layer to unit |
| procedure, public, pass(this) :: read => read_reshape | Read reshape layer from file |
| procedure, public, pass(this) :: set_graph => set_graph_base | Set the graph structure of the input data !! this is adjacency and edge weighting |
| procedure, public, pass(this) :: set_hyperparams => set_hyperparams_reshape | Set hyperparameters for reshape layer |
| procedure, public, pass(this) :: set_rank => set_rank_base | Set the input and output ranks of the layer |
| procedure, public, pass(this) :: set_shape => set_shape_base | Set the input shape of the layer |
Build reshape layer from ONNX node and initialiser
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(onnx_node_type), | intent(in) | :: | node |
ONNX node |
||
| type(onnx_initialiser_type), | intent(in), | dimension(:) | :: | initialisers |
ONNX initialisers |
|
| type(onnx_tensor_type), | intent(in), | dimension(:) | :: | value_info |
ONNX value infos |
|
| integer, | intent(in), | optional | :: | verbose |
Verbosity level |
Instance of the reshape layer
Read reshape layer from file
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer, | intent(in) | :: | unit |
File unit |
||
| integer, | intent(in), | optional | :: | verbose |
Verbosity level |
Instance of the reshape layer
Set up the reshape layer
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer, | intent(in), | dimension(:) | :: | output_shape |
Target output shape (excluding batch dimension) |
|
| integer, | intent(in), | optional, | dimension(:) | :: | input_shape |
Input shape (excluding batch dimension) |
| integer, | intent(in), | optional | :: | verbose |
Verbosity level |
Instance of the reshape layer
Build reshape layer from ONNX node and initialiser
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(reshape_layer_type), | intent(inout) | :: | this |
Instance of the reshape layer |
||
| type(onnx_node_type), | intent(in) | :: | node |
ONNX node |
||
| type(onnx_initialiser_type), | intent(in), | dimension(:) | :: | initialisers |
ONNX initialisers |
|
| type(onnx_tensor_type), | intent(in), | dimension(:) | :: | value_info |
ONNX value infos |
|
| integer, | intent(in) | :: | verbose |
Verbosity level |
Forward propagation derived type handler
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(reshape_layer_type), | intent(inout) | :: | this |
Instance of the reshape layer |
||
| class(array_type), | intent(in), | dimension(:,:) | :: | input |
Input array |
Initialise reshape layer
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(reshape_layer_type), | intent(inout) | :: | this |
Instance of the reshape layer |
||
| integer, | intent(in), | dimension(:) | :: | input_shape |
Input shape |
|
| integer, | intent(in), | optional | :: | verbose |
Verbosity level |
Print reshape layer to unit
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(reshape_layer_type), | intent(in) | :: | this |
Instance of the reshape layer |
||
| integer, | intent(in) | :: | unit |
File unit |
Read reshape layer from file
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(reshape_layer_type), | intent(inout) | :: | this |
Instance of the reshape layer |
||
| integer, | intent(in) | :: | unit |
File unit |
||
| integer, | intent(in), | optional | :: | verbose |
Verbosity level |
Set hyperparameters for reshape layer
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(reshape_layer_type), | intent(inout) | :: | this |
Instance of the reshape layer |
||
| integer, | intent(in), | dimension(:) | :: | output_shape |
Output rank |
|
| integer, | intent(in), | optional | :: | verbose |
Verbosity level |