build_from_onnx_batchnorm1d Subroutine

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

Read ONNX attributes for 1D batch normalisation layer

Arguments

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

Instance of the 1D batch normalisation layer

type(onnx_node_type), intent(in) :: node

ONNX node information

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

ONNX initialiser information

type(onnx_tensor_type), intent(in), dimension(:) :: value_info

ONNX value info

integer, intent(in) :: verbose

Verbosity level


Source Code

  subroutine build_from_onnx_batchnorm1d( &
       this, node, initialisers, value_info, verbose &
  )
    !! Read ONNX attributes for 1D batch normalisation layer
    use athena__initialiser_data, only: data_init_type
    implicit none

    ! Arguments
    class(batchnorm1d_layer_type), intent(inout) :: this
    !! Instance of the 1D batch normalisation layer
    type(onnx_node_type), intent(in) :: node
    !! ONNX node information
    type(onnx_initialiser_type), dimension(:), intent(in) :: initialisers
    !! ONNX initialiser information
    type(onnx_tensor_type), dimension(:), intent(in) :: value_info
    !! ONNX value info
    integer, intent(in) :: verbose
    !! Verbosity level

    ! Local variables
    integer :: i
    !! Loop index
    real(real32) :: epsilon, momentum
    !! Epsilon and momentum values
    character(256) :: val
    !! Attribute value
    class(base_init_type), allocatable :: gamma_initialiser, beta_initialiser
    class(base_init_type), allocatable :: &
         moving_mean_initialiser, moving_variance_initialiser

    ! Set default values
    epsilon = 1.E-5_real32
    momentum = 0.9_real32

    ! Parse ONNX attributes
    do i = 1, size(node%attributes)
       val = node%attributes(i)%val
       select case(trim(adjustl(node%attributes(i)%name)))
       case("epsilon")
          read(val,*) epsilon
       case("momentum")
          read(val,*) momentum
       case default
          ! Do nothing
          write(0,*) "WARNING: Unrecognised attribute in ONNX BATCHNORM1D &
               &layer: ", trim(adjustl(node%attributes(i)%name))
       end select
    end do

    ! Check for 4 initialisers: gamma, beta, mean, variance
    if(size(initialisers).ne.4)then
       call stop_program("ONNX BATCHNORM1D layer requires 4 initialisers &
            &(gamma, beta, mean, variance)")
       return
    end if

    ! ONNX BatchNormalisation order: gamma, beta, mean, variance
    gamma_initialiser = data_init_type( data = initialisers(1)%data )
    beta_initialiser = data_init_type( data = initialisers(2)%data )
    moving_mean_initialiser = data_init_type( data = initialisers(3)%data )
    moving_variance_initialiser = data_init_type( data = initialisers(4)%data )

    call this%set_hyperparams( &
         momentum = momentum, &
         epsilon = epsilon, &
         gamma_init_mean = 1.0_real32, &
         gamma_init_std = 0.0_real32, &
         beta_init_mean = 0.0_real32, &
         beta_init_std = 0.0_real32, &
         gamma_initialiser = gamma_initialiser, &
         beta_initialiser = beta_initialiser, &
         moving_mean_initialiser = moving_mean_initialiser, &
         moving_variance_initialiser = moving_variance_initialiser, &
         verbose = verbose &
    )

  end subroutine build_from_onnx_batchnorm1d