create_from_onnx_fixed_lno_layer Function

public function create_from_onnx_fixed_lno_layer(meta_key, meta_value, inits, verbose) result(layer)

Build fixed LNO layer from ONNX metadata and return layer

Arguments

Type IntentOptional Attributes Name
character(len=*), intent(in) :: meta_key

NOP metadata key/value pair

character(len=*), intent(in) :: meta_value

NOP metadata key/value pair

type(onnx_initialiser_type), intent(in), dimension(:) :: inits

ONNX initialisers containing parameter tensors

integer, intent(in), optional :: verbose

Verbosity level

Return Value class(base_layer_type), allocatable

Constructed fixed LNO layer


Source Code

  function create_from_onnx_fixed_lno_layer( &
       meta_key, meta_value, inits, verbose &
  ) result(layer)
    !! Build fixed LNO layer from ONNX metadata and return layer
    use athena__fixed_lno_layer, only: fixed_lno_layer_type
    implicit none

    ! Arguments
    character(*), intent(in) :: meta_key, meta_value
    !! NOP metadata key/value pair
    type(onnx_initialiser_type), dimension(:), intent(in) :: inits
    !! ONNX initialisers containing parameter tensors
    integer, optional, intent(in) :: verbose
    !! Verbosity level
    class(base_layer_type), allocatable :: layer
    !! Constructed fixed LNO layer

    ! Local variables
    integer :: num_inputs, num_outputs, num_modes, verbose_
    !! Parsed layer dimensions and effective verbosity level
    logical :: use_bias
    !! Whether the imported layer uses bias
    character(64) :: activation_name, nop_prefix

    verbose_ = 0
    if(present(verbose)) verbose_ = verbose

    num_inputs = 0; num_outputs = 0; num_modes = 0
    use_bias = .true.; activation_name = 'none'

    call parse_nop_metadata(meta_value, &
         num_inputs, num_outputs, num_modes, use_bias, activation_name)

    nop_prefix = extract_nop_prefix(meta_key)

    block
      type(fixed_lno_layer_type) :: lno_layer

      lno_layer = fixed_lno_layer_type( &
           num_outputs = num_outputs, &
           num_modes = num_modes, &
           num_inputs = num_inputs, &
           use_bias = use_bias, &
           activation = trim(activation_name) &
      )

      ! params: (1) R [modes x modes], (2) W [n_out x n_in], (3) b [n_out]
      call load_nop_param_from_inits( &
           lno_layer%params(1), nop_prefix, '_param1', &
           inits, size(inits), [num_modes, num_modes])
      call load_nop_param_from_inits( &
           lno_layer%params(2), nop_prefix, '_param2', &
           inits, size(inits), [num_outputs, num_inputs])
      if(use_bias)then
         call load_nop_param_from_inits( &
              lno_layer%params(3), nop_prefix, '_param3', &
              inits, size(inits), [num_outputs, 1])
      end if

      allocate(layer, source=lno_layer)
    end block

  end function create_from_onnx_fixed_lno_layer