1D max pooling operation
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(array_type), | intent(in), | target | :: | input | ||
| integer, | intent(in) | :: | pool_size | |||
| integer, | intent(in) | :: | stride |
module function maxpool1d(input, pool_size, stride) result(output) !! 1D max pooling operation implicit none ! Arguments type(array_type), intent(in), target :: input integer, intent(in) :: pool_size integer, intent(in) :: stride type(array_type), pointer :: output ! Local variables integer :: i, m, s integer :: stride_idx, idx integer, dimension(3) :: output_shape output_shape = [ & (input%shape(1) - pool_size) / stride + 1, & input%shape(2), & size(input%val, dim=2)] output => input%create_result(array_shape = output_shape) do concurrent(& s = 1:output_shape(3), & m = 1:output_shape(2), & i = 1:output_shape(1)) stride_idx = (i - 1) * stride + (m - 1) * input%shape(1) idx = i + (m - 1) * output_shape(1) output%val(idx, s) = maxval( & input%val( stride_idx + 1 : stride_idx + pool_size, s ) & ) end do allocate(output%adj_ja(1,2)) output%adj_ja(1,1) = pool_size output%adj_ja(1,2) = stride output%get_partial_left => get_partial_maxpool1d output%get_partial_left_val => get_partial_maxpool1d_val if(input%requires_grad)then output%requires_grad = .true. output%is_forward = input%is_forward output%operation = 'maxpool' output%left_operand => input end if end function maxpool1d