Build orthogonal NOP block from ONNX metadata and return layer
| Type | Intent | Optional | 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 |
Constructed orthogonal NOP layer
function create_from_onnx_orthogonal_nop_layer( & meta_key, meta_value, inits, verbose & ) result(layer) !! Build orthogonal NOP block from ONNX metadata and return layer use athena__orthogonal_nop_block, only: orthogonal_nop_block_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 orthogonal NOP 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(orthogonal_nop_block_type) :: ono_layer ono_layer = orthogonal_nop_block_type( & num_outputs = num_outputs, & num_basis = num_modes, & num_inputs = num_inputs, & use_bias = use_bias, & activation = trim(activation_name) & ) ! params: (1) R [nb x nb], (2) B [n_in x nb], (3) W [n_out x n_in], ! (4) b [n_out] call load_nop_param_from_inits( & ono_layer%params(1), nop_prefix, '_param1', & inits, size(inits), [num_modes, num_modes]) call load_nop_param_from_inits( & ono_layer%params(2), nop_prefix, '_param2', & inits, size(inits), [num_inputs, num_modes]) call load_nop_param_from_inits( & ono_layer%params(3), nop_prefix, '_param3', & inits, size(inits), [num_outputs, num_inputs]) if(use_bias)then call load_nop_param_from_inits( & ono_layer%params(4), nop_prefix, '_param4', & inits, size(inits), [num_outputs, 1]) end if allocate(layer, source=ono_layer) end block end function create_from_onnx_orthogonal_nop_layer