athena__reshape_layer Module

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)


Uses


Interfaces

public interface reshape_layer_type

Interface for setting up the reshape layer

  • private module function layer_setup(output_shape, input_shape, verbose) result(layer)

    Set up the reshape layer

    Arguments

    Type IntentOptional 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

    Return Value type(reshape_layer_type)

    Instance of the reshape layer


Derived Types

type, public, extends(base_layer_type) ::  reshape_layer_type

Type for reshape layer with overloaded procedures

Components

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

Constructor

Interface for setting up the reshape layer

private module function layer_setup (output_shape, input_shape, verbose)

Set up the reshape layer

Type-Bound Procedures

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

Read more…
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


Functions

public function create_from_onnx_reshape_layer(node, initialisers, value_info, verbose) result(layer)

Build reshape layer from ONNX node and initialiser

Arguments

Type IntentOptional 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

Return Value class(base_layer_type), allocatable

Instance of the reshape layer

public function read_reshape_layer(unit, verbose) result(layer)

Read reshape layer from file

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: unit

File unit

integer, intent(in), optional :: verbose

Verbosity level

Return Value class(base_layer_type), allocatable

Instance of the reshape layer

private module function layer_setup(output_shape, input_shape, verbose) result(layer)

Set up the reshape layer

Arguments

Type IntentOptional 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

Return Value type(reshape_layer_type)

Instance of the reshape layer


Subroutines

private subroutine build_from_onnx_reshape(this, node, initialisers, value_info, verbose)

Build reshape layer from ONNX node and initialiser

Arguments

Type IntentOptional 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

private subroutine forward_reshape(this, input)

Forward propagation derived type handler

Arguments

Type IntentOptional Attributes Name
class(reshape_layer_type), intent(inout) :: this

Instance of the reshape layer

class(array_type), intent(in), dimension(:,:) :: input

Input array

private subroutine init_reshape(this, input_shape, verbose)

Initialise reshape layer

Arguments

Type IntentOptional 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

private subroutine print_to_unit_reshape(this, unit)

Print reshape layer to unit

Arguments

Type IntentOptional Attributes Name
class(reshape_layer_type), intent(in) :: this

Instance of the reshape layer

integer, intent(in) :: unit

File unit

private subroutine read_reshape(this, unit, verbose)

Read reshape layer from file

Arguments

Type IntentOptional 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

private subroutine set_hyperparams_reshape(this, output_shape, verbose)

Set hyperparameters for reshape layer

Arguments

Type IntentOptional 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