Set padding for convolutional layers
| Type | Intent | Optional | 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 |
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