set_padding Subroutine

public subroutine set_padding(pad, kernel_size, padding_method, verbose)

Uses

    • coreutils

Set padding for convolutional layers

Arguments

Type IntentOptional Attributes Name
integer, intent(out) :: pad

Padding width

integer, intent(in) :: kernel_size

Width of kernel/filter

character(len=*), intent(inout) :: padding_method

Padding method

integer, intent(in), optional :: verbose

Verbosity level


Source Code

  subroutine set_padding(pad, kernel_size, padding_method, verbose)
    !! Set padding for convolutional layers
    use coreutils, only: to_lower
    implicit none

    ! Arguments
    integer, intent(out) :: pad
    !! Padding width
    integer, intent(in) :: kernel_size
    !! Width of kernel/filter
    character(*), intent(inout) :: padding_method
    !! Padding method
    integer, optional, intent(in) :: verbose
    !! Verbosity level

    ! Local variables
    integer :: t_verbose = 0
    !! Temporary verbosity level
    character(256) :: err_msg
    !! Error message


    !---------------------------------------------------------------------------
    ! initialise optional arguments
    !---------------------------------------------------------------------------
    if(present(verbose)) t_verbose = verbose


    !---------------------------------------------------------------------------
    ! Padding method options
    !---------------------------------------------------------------------------
    ! none  = alt. name for 'valid'
    ! zero  = alt. name for 'same'
    ! symmetric = alt.name for 'replication'
    ! valid = no padding
    ! same  = maintain spatial dimensions
    !         ... (i.e. padding added = (kernel_size - 1)/2)
    !         ... defaults to zeros in the padding
    ! full  = enough padding for filter to slide over every possible position
    !         ... (i.e. padding added = (kernel_size - 1)
    ! circular = maintain spatial dimensions
    !            ... wraps data around for padding (periodic)
    ! reflection = maintains spatial dimensions
    !              ... reflect data (about boundary index)
    ! replication = maintains spatial dimensions
    !               ... reflect data (boundary included)
100 select case(to_lower(trim(padding_method)))
    case("none")
       padding_method = "valid"
       goto 100
    case("zero")
       padding_method = "same"
       goto 100
    case("half")
       padding_method = "same"
       goto 100
    case("symmetric")
       padding_method = "replication"
       goto 100
    case("valid", "vali")
       if(t_verbose.gt.0) write(*,*) "Padding type: 'valid' (no padding)"
       pad = 0
       return
    case("same")
       if(t_verbose.gt.0) write(*,*) "Padding type: 'same' (pad with zeros)"
    case("circular")
       if(t_verbose.gt.0) write(*,*) "Padding type: 'same' (circular padding)"
    case("full")
       if(t_verbose.gt.0) write(*,*) &
            "Padding type: 'full' (all possible positions)"
       pad = kernel_size - 1
       return
    case("reflection")
       if(t_verbose.gt.0) write(*,*) &
            "Padding type: 'reflection' (reflect on boundary)"
    case("replication")
       if(t_verbose.gt.0) write(*,*) &
            "Padding type: 'replication' (reflect after boundary)"
    case default
       write(err_msg,'("padding type ''",A,"'' not known")') padding_method
       call stop_program(err_msg)
       return
    end select

    pad = get_padding_half(kernel_size)

  end subroutine set_padding