Emit initialisers for a learnable layer
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(learnable_layer_type), | intent(in) | :: | layer |
Learnable layer containing parameter tensors and shape metadata |
||
| character(len=*), | intent(in) | :: | prefix |
Name prefix used to generate exported initialiser names |
||
| type(onnx_initialiser_type), | intent(inout), | dimension(:) | :: | inits |
Initialiser accumulator array |
|
| integer, | intent(inout) | :: | num_inits |
Current number of populated initialisers |
||
| integer, | intent(in) | :: | max_inits |
Maximum number of initialisers available in the accumulator |
subroutine emit_initialisers(layer, prefix, inits, num_inits, max_inits) !! Emit initialisers for a learnable layer implicit none ! Arguments class(learnable_layer_type), intent(in) :: layer !! Learnable layer containing parameter tensors and shape metadata character(*), intent(in) :: prefix !! Name prefix used to generate exported initialiser names type(onnx_initialiser_type), intent(inout), dimension(:) :: inits !! Initialiser accumulator array integer, intent(inout) :: num_inits !! Current number of populated initialisers integer, intent(in) :: max_inits !! Maximum number of initialisers available in the accumulator ! Local variables integer :: i, j, n !! Parameter index, shape index, and flattened tensor size character(128) :: name !! Generated ONNX initialiser name for the current parameter tensor if(.not.allocated(layer%params)) return do i = 1, size(layer%params) n = size(layer%params(i)%val, 1) num_inits = num_inits + 1 write(name, '(A,"_param",I0)') trim(prefix), i inits(num_inits)%name = trim(name) inits(num_inits)%data_type = 1 ! Set dims from weight_shape if(allocated(layer%weight_shape))then if(i .le. size(layer%weight_shape, 2))then j = 0 allocate(inits(num_inits)%dims(size(layer%weight_shape, 1))) inits(num_inits)%dims = 0 do j = 1, size(layer%weight_shape, 1) if(layer%weight_shape(j,i) .gt. 0)then inits(num_inits)%dims(j) = layer%weight_shape(j,i) end if end do ! Remove zero dims inits(num_inits)%dims = pack(inits(num_inits)%dims, & inits(num_inits)%dims .gt. 0) else allocate(inits(num_inits)%dims(1)) inits(num_inits)%dims = [n] end if else allocate(inits(num_inits)%dims(1)) inits(num_inits)%dims = [n] end if allocate(inits(num_inits)%data(n)) ! Convert column-major to row-major for 2D weight matrices if(allocated(layer%weight_shape))then if(i .le. size(layer%weight_shape, 2))then if(count(layer%weight_shape(:,i) .gt. 0) .eq. 2)then call col_to_row_major_2d( & layer%params(i)%val(:,1), & inits(num_inits)%data, & layer%weight_shape(1,i), & layer%weight_shape(2,i)) else inits(num_inits)%data = layer%params(i)%val(:,1) end if else inits(num_inits)%data = layer%params(i)%val(:,1) end if else inits(num_inits)%data = layer%params(i)%val(:,1) end if end do end subroutine emit_initialisers