GCC Code Coverage Report


Directory: src/lib/
File: src/lib/mod_conv2d_layer.f90
Date: 2024-06-28 12:51:18
Exec Total Coverage
Lines: 215 333 64.6%
Functions: 0 0 -%
Branches: 1764 3545 49.8%

Line Branch Exec Source
1 !!!#############################################################################
2 !!! Code written by Ned Thaddeus Taylor
3 !!! Code part of the ATHENA library - a feedforward neural network library
4 !!!#############################################################################
5 !!! module contains implementation of a 2D convolutional layer
6 !!!#############################################################################
7 !!! Attribution statement:
8 !!! The following procedures are based on code from the neural-fortran library
9 !!! https://github.com/modern-fortran/neural-fortran/blob/main/src/nf/nf_layer.f90
10 !!! procedures:
11 !!! - get_params*
12 !!! - set_params*
13 !!! - get_gradients*
14 !!! - set_gradients*
15 !!!#############################################################################
16 module conv2d_layer
17 use constants, only: real12
18 use base_layer, only: learnable_layer_type, conv_layer_type
19 use custom_types, only: initialiser_type
20 implicit none
21
22
23 type, extends(conv_layer_type) :: conv2d_layer_type
24 real(real12), allocatable, dimension(:,:,:,:) :: weight
25 real(real12), allocatable, dimension(:,:,:,:,:) :: dw ! weight gradient
26 real(real12), allocatable, dimension(:,:,:,:) :: output, z
27 real(real12), allocatable, dimension(:,:,:,:) :: di ! input gradient
28 contains
29 procedure, pass(this) :: get_params => get_params_conv2d
30 procedure, pass(this) :: set_params => set_params_conv2d
31 procedure, pass(this) :: get_gradients => get_gradients_conv2d
32 procedure, pass(this) :: set_gradients => set_gradients_conv2d
33 procedure, pass(this) :: get_output => get_output_conv2d
34
35 procedure, pass(this) :: init => init_conv2d
36 procedure, pass(this) :: set_batch_size => set_batch_size_conv2d
37 procedure, pass(this) :: print => print_conv2d
38
39 procedure, pass(this) :: forward => forward_rank
40 procedure, pass(this) :: backward => backward_rank
41 procedure, private, pass(this) :: forward_4d
42 procedure, private, pass(this) :: backward_4d
43
44 procedure, pass(this) :: reduce => layer_reduction
45 procedure, pass(this) :: merge => layer_merge
46 procedure :: add_t_t => layer_add !t = type, r = real, i = int
47 generic :: operator(+) => add_t_t !, public
48 end type conv2d_layer_type
49
50
51 !!!-----------------------------------------------------------------------------
52 !!! interface for layer set up
53 !!!-----------------------------------------------------------------------------
54 interface conv2d_layer_type
55 module function layer_setup( &
56 input_shape, batch_size, &
57 num_filters, kernel_size, stride, padding, &
58 activation_function, activation_scale, &
59 kernel_initialiser, bias_initialiser, &
60 calc_input_gradients) result(layer)
61 integer, dimension(:), optional, intent(in) :: input_shape
62 integer, optional, intent(in) :: batch_size
63 integer, optional, intent(in) :: num_filters
64 integer, dimension(..), optional, intent(in) :: kernel_size
65 integer, dimension(..), optional, intent(in) :: stride
66 real(real12), optional, intent(in) :: activation_scale
67 character(*), optional, intent(in) :: activation_function, &
68 kernel_initialiser, bias_initialiser, padding
69 logical, optional, intent(in) :: calc_input_gradients
70 type(conv2d_layer_type) :: layer
71 end function layer_setup
72 end interface conv2d_layer_type
73
74
75 private
76 public :: conv2d_layer_type
77 public :: read_conv2d_layer
78
79
80 contains
81
82 !!!#############################################################################
83 !!! layer reduction
84 !!!#############################################################################
85 1 subroutine layer_reduction(this, rhs)
86 implicit none
87 class(conv2d_layer_type), intent(inout) :: this
88 class(learnable_layer_type), intent(in) :: rhs
89
90 select type(rhs)
91 class is(conv2d_layer_type)
92
24/46
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 35 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 1 times.
✗ Branch 40 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 43 not taken.
✓ Branch 44 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 47 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 50 taken 1 times.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 1 times.
✗ Branch 55 not taken.
✓ Branch 56 taken 1 times.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✓ Branch 60 taken 1 times.
✓ Branch 61 taken 1 times.
✓ Branch 62 taken 1 times.
✓ Branch 63 taken 1 times.
3 this%db = this%db + rhs%db
93
62/116
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 1 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 1 times.
✗ Branch 44 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 47 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 50 not taken.
✓ Branch 51 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 57 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 60 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 63 taken 1 times.
✗ Branch 65 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 68 not taken.
✓ Branch 69 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 72 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 75 taken 1 times.
✗ Branch 77 not taken.
✓ Branch 78 taken 1 times.
✗ Branch 80 not taken.
✓ Branch 81 taken 1 times.
✗ Branch 83 not taken.
✓ Branch 84 taken 1 times.
✗ Branch 86 not taken.
✓ Branch 87 taken 1 times.
✗ Branch 89 not taken.
✓ Branch 90 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 93 taken 1 times.
✗ Branch 95 not taken.
✓ Branch 96 taken 1 times.
✗ Branch 98 not taken.
✓ Branch 99 taken 1 times.
✗ Branch 101 not taken.
✓ Branch 102 taken 1 times.
✗ Branch 104 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 107 not taken.
✓ Branch 108 taken 1 times.
✗ Branch 110 not taken.
✓ Branch 111 taken 1 times.
✗ Branch 113 not taken.
✓ Branch 114 taken 1 times.
✗ Branch 116 not taken.
✓ Branch 117 taken 1 times.
✗ Branch 119 not taken.
✓ Branch 120 taken 1 times.
✗ Branch 122 not taken.
✓ Branch 123 taken 1 times.
✗ Branch 125 not taken.
✓ Branch 126 taken 1 times.
✗ Branch 128 not taken.
✓ Branch 129 taken 1 times.
✗ Branch 131 not taken.
✓ Branch 132 taken 1 times.
✗ Branch 134 not taken.
✓ Branch 135 taken 1 times.
✓ Branch 137 taken 1 times.
✗ Branch 138 not taken.
✓ Branch 139 taken 1 times.
✗ Branch 140 not taken.
✓ Branch 141 taken 1 times.
✗ Branch 142 not taken.
✓ Branch 143 taken 1 times.
✗ Branch 144 not taken.
✓ Branch 145 taken 1 times.
✗ Branch 146 not taken.
✓ Branch 147 taken 1 times.
✗ Branch 148 not taken.
✗ Branch 149 not taken.
✗ Branch 150 not taken.
✓ Branch 151 taken 1 times.
✓ Branch 152 taken 1 times.
✓ Branch 153 taken 1 times.
✓ Branch 154 taken 1 times.
✓ Branch 155 taken 1 times.
✓ Branch 156 taken 1 times.
✓ Branch 157 taken 3 times.
✓ Branch 158 taken 1 times.
✓ Branch 159 taken 9 times.
✓ Branch 160 taken 3 times.
17 this%dw = this%dw + rhs%dw
94 end select
95
96 1 end subroutine layer_reduction
97 !!!#############################################################################
98
99
100 !!!#############################################################################
101 !!! layer addition
102 !!!#############################################################################
103 1 function layer_add(a, b) result(output)
104 implicit none
105 class(conv2d_layer_type), intent(in) :: a, b
106 type(conv2d_layer_type) :: output
107
108
33/66
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 1 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 1 times.
✗ Branch 43 not taken.
✓ Branch 44 taken 1 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 50 taken 1 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 1 times.
✗ Branch 55 not taken.
✓ Branch 56 taken 1 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 60 taken 1 times.
✗ Branch 61 not taken.
✓ Branch 62 taken 1 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 1 times.
✗ Branch 65 not taken.
✓ Branch 66 taken 1 times.
1 output = a
109
61/114
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 1 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 1 times.
✗ Branch 66 not taken.
✓ Branch 67 taken 1 times.
✗ Branch 69 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 72 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 75 not taken.
✓ Branch 76 taken 1 times.
✗ Branch 78 not taken.
✓ Branch 79 taken 1 times.
✗ Branch 81 not taken.
✓ Branch 82 taken 1 times.
✗ Branch 84 not taken.
✓ Branch 85 taken 1 times.
✗ Branch 87 not taken.
✓ Branch 88 taken 1 times.
✗ Branch 90 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 93 not taken.
✓ Branch 94 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 97 taken 1 times.
✗ Branch 99 not taken.
✓ Branch 100 taken 1 times.
✗ Branch 102 not taken.
✓ Branch 103 taken 1 times.
✗ Branch 105 not taken.
✓ Branch 106 taken 1 times.
✗ Branch 108 not taken.
✓ Branch 109 taken 1 times.
✗ Branch 111 not taken.
✓ Branch 112 taken 1 times.
✗ Branch 114 not taken.
✓ Branch 115 taken 1 times.
✗ Branch 117 not taken.
✓ Branch 118 taken 1 times.
✗ Branch 120 not taken.
✓ Branch 121 taken 1 times.
✗ Branch 123 not taken.
✓ Branch 124 taken 1 times.
✗ Branch 126 not taken.
✓ Branch 127 taken 1 times.
✗ Branch 129 not taken.
✓ Branch 130 taken 1 times.
✗ Branch 132 not taken.
✓ Branch 133 taken 1 times.
✓ Branch 135 taken 1 times.
✗ Branch 136 not taken.
✓ Branch 137 taken 1 times.
✗ Branch 138 not taken.
✓ Branch 139 taken 1 times.
✗ Branch 140 not taken.
✓ Branch 141 taken 1 times.
✗ Branch 142 not taken.
✓ Branch 143 taken 1 times.
✗ Branch 144 not taken.
✓ Branch 145 taken 1 times.
✗ Branch 146 not taken.
✗ Branch 147 not taken.
✗ Branch 148 not taken.
✓ Branch 149 taken 1 times.
✓ Branch 150 taken 1 times.
✓ Branch 151 taken 1 times.
✓ Branch 152 taken 1 times.
✓ Branch 153 taken 1 times.
✓ Branch 154 taken 1 times.
✓ Branch 155 taken 3 times.
✓ Branch 156 taken 1 times.
✓ Branch 157 taken 9 times.
✓ Branch 158 taken 3 times.
16 output%dw = output%dw + b%dw
110
25/48
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 1 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 1 times.
✓ Branch 54 taken 1 times.
✗ Branch 55 not taken.
✓ Branch 56 taken 1 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
✓ Branch 62 taken 1 times.
✓ Branch 63 taken 1 times.
✓ Branch 64 taken 1 times.
✓ Branch 65 taken 1 times.
3 output%db = output%db + b%db
111
112
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 end function layer_add
113 !!!#############################################################################
114
115
116 !!!#############################################################################
117 !!! layer merge
118 !!!#############################################################################
119 1 subroutine layer_merge(this, input)
120 implicit none
121 class(conv2d_layer_type), intent(inout) :: this
122 class(learnable_layer_type), intent(in) :: input
123
124 select type(input)
125 class is(conv2d_layer_type)
126
60/112
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 35 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 1 times.
✗ Branch 40 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 43 not taken.
✓ Branch 44 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 47 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 50 taken 1 times.
✗ Branch 52 not taken.
✓ Branch 53 taken 1 times.
✗ Branch 55 not taken.
✓ Branch 56 taken 1 times.
✗ Branch 58 not taken.
✓ Branch 59 taken 1 times.
✗ Branch 61 not taken.
✓ Branch 62 taken 1 times.
✗ Branch 64 not taken.
✓ Branch 65 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 68 taken 1 times.
✗ Branch 70 not taken.
✓ Branch 71 taken 1 times.
✗ Branch 73 not taken.
✓ Branch 74 taken 1 times.
✗ Branch 76 not taken.
✓ Branch 77 taken 1 times.
✗ Branch 79 not taken.
✓ Branch 80 taken 1 times.
✗ Branch 82 not taken.
✓ Branch 83 taken 1 times.
✗ Branch 85 not taken.
✓ Branch 86 taken 1 times.
✗ Branch 88 not taken.
✓ Branch 89 taken 1 times.
✗ Branch 91 not taken.
✓ Branch 92 taken 1 times.
✗ Branch 94 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 97 not taken.
✓ Branch 98 taken 1 times.
✗ Branch 100 not taken.
✓ Branch 101 taken 1 times.
✗ Branch 103 not taken.
✓ Branch 104 taken 1 times.
✗ Branch 106 not taken.
✓ Branch 107 taken 1 times.
✗ Branch 109 not taken.
✓ Branch 110 taken 1 times.
✗ Branch 112 not taken.
✓ Branch 113 taken 1 times.
✗ Branch 115 not taken.
✓ Branch 116 taken 1 times.
✗ Branch 118 not taken.
✓ Branch 119 taken 1 times.
✗ Branch 121 not taken.
✓ Branch 122 taken 1 times.
✗ Branch 124 not taken.
✓ Branch 125 taken 1 times.
✗ Branch 127 not taken.
✓ Branch 128 taken 1 times.
✗ Branch 130 not taken.
✓ Branch 131 taken 1 times.
✓ Branch 133 taken 1 times.
✗ Branch 134 not taken.
✓ Branch 135 taken 1 times.
✗ Branch 136 not taken.
✓ Branch 137 taken 1 times.
✗ Branch 138 not taken.
✓ Branch 139 taken 1 times.
✗ Branch 140 not taken.
✓ Branch 141 taken 1 times.
✗ Branch 142 not taken.
✓ Branch 143 taken 1 times.
✗ Branch 144 not taken.
✗ Branch 145 not taken.
✗ Branch 146 not taken.
✓ Branch 147 taken 1 times.
✓ Branch 148 taken 1 times.
✓ Branch 149 taken 1 times.
✓ Branch 150 taken 1 times.
✓ Branch 151 taken 1 times.
✓ Branch 152 taken 1 times.
✓ Branch 153 taken 3 times.
✓ Branch 154 taken 1 times.
✓ Branch 155 taken 9 times.
✓ Branch 156 taken 3 times.
16 this%dw = this%dw + input%dw
127
26/50
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 1 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 1 times.
✗ Branch 44 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 47 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 50 not taken.
✓ Branch 51 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 1 times.
✓ Branch 56 taken 1 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 60 taken 1 times.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✗ Branch 63 not taken.
✓ Branch 64 taken 1 times.
✓ Branch 65 taken 1 times.
✓ Branch 66 taken 1 times.
✓ Branch 67 taken 1 times.
4 this%db = this%db + input%db
128 end select
129
130 1 end subroutine layer_merge
131 !!!#############################################################################
132
133
134 !!!##########################################################################!!!
135 !!! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !!!
136 !!!##########################################################################!!!
137
138
139 !!!#############################################################################
140 !!! get learnable parameters
141 !!! procedure modified from neural-fortran library
142 !!!#############################################################################
143 2 pure function get_params_conv2d(this) result(params)
144 implicit none
145 class(conv2d_layer_type), intent(in) :: this
146 real(real12), allocatable, dimension(:) :: params
147
148 params = [ reshape( &
149 this%weight, &
150 16 [ this%num_filters * this%num_channels * product(this%knl) ]), &
151
22/36
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✓ Branch 12 taken 4 times.
✓ Branch 13 taken 2 times.
✓ Branch 14 taken 2 times.
✓ Branch 15 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✓ Branch 20 taken 18 times.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 2 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 2 times.
✗ Branch 34 not taken.
✓ Branch 35 taken 2 times.
✓ Branch 37 taken 2 times.
✓ Branch 38 taken 2 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 2 times.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 44 not taken.
✓ Branch 45 taken 20 times.
✓ Branch 46 taken 2 times.
48 this%bias ]
152
153 2 end function get_params_conv2d
154 !!!#############################################################################
155
156
157 !!!#############################################################################
158 !!! set learnable parameters
159 !!! procedure modified from neural-fortran library
160 !!!#############################################################################
161
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 subroutine set_params_conv2d(this, params)
162 implicit none
163 class(conv2d_layer_type), intent(inout) :: this
164 real(real12), dimension(:), intent(in) :: params
165
166 this%weight = reshape( &
167 params(1:this%num_filters * this%num_channels * product(this%knl)), &
168
35/52
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✓ Branch 12 taken 2 times.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✓ Branch 20 taken 4 times.
✓ Branch 21 taken 1 times.
✓ Branch 22 taken 4 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 4 times.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 1 times.
✓ Branch 31 taken 1 times.
✓ Branch 32 taken 1 times.
✓ Branch 33 taken 1 times.
✓ Branch 34 taken 3 times.
✓ Branch 35 taken 1 times.
✓ Branch 36 taken 9 times.
✓ Branch 37 taken 3 times.
✓ Branch 38 taken 1 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 1 times.
✗ Branch 43 not taken.
✓ Branch 44 taken 1 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 49 not taken.
✓ Branch 50 taken 1 times.
✓ Branch 51 taken 1 times.
✓ Branch 52 taken 1 times.
✓ Branch 53 taken 1 times.
✓ Branch 54 taken 3 times.
✓ Branch 55 taken 1 times.
✓ Branch 56 taken 9 times.
✓ Branch 57 taken 3 times.
35 shape(this%weight))
169 this%bias = params(&
170
14/26
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✓ Branch 12 taken 2 times.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
✓ Branch 29 taken 1 times.
5 this%num_filters * this%num_channels * product(this%knl) + 1 : )
171
172 1 end subroutine set_params_conv2d
173 !!!#############################################################################
174
175
176 !!!#############################################################################
177 !!! get sample-average gradients
178 !!! sum over batch dimension and divide by batch size
179 !!! procedure modified from neural-fortran library
180 !!!#############################################################################
181 4 pure function get_gradients_conv2d(this, clip_method) result(gradients)
182 use clipper, only: clip_type
183 implicit none
184 class(conv2d_layer_type), intent(in) :: this
185 type(clip_type), optional, intent(in) :: clip_method
186 real(real12), allocatable, dimension(:) :: gradients
187
188 gradients = [ reshape( &
189 80 sum(this%dw,dim=5)/this%batch_size, &
190 16 [ this%num_filters * this%num_channels * product(this%knl) ]), &
191
59/98
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 4 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 4 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 4 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 4 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 4 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 4 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 4 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 4 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 4 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 4 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 4 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 4 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 4 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 4 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 4 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 4 times.
✓ Branch 60 taken 4 times.
✗ Branch 61 not taken.
✓ Branch 62 taken 11 times.
✓ Branch 63 taken 4 times.
✓ Branch 64 taken 35 times.
✓ Branch 65 taken 11 times.
✓ Branch 66 taken 105 times.
✓ Branch 67 taken 35 times.
✓ Branch 68 taken 315 times.
✓ Branch 69 taken 105 times.
✓ Branch 70 taken 315 times.
✓ Branch 71 taken 315 times.
✗ Branch 72 not taken.
✓ Branch 73 taken 4 times.
✗ Branch 75 not taken.
✓ Branch 76 taken 4 times.
✗ Branch 78 not taken.
✓ Branch 79 taken 4 times.
✗ Branch 81 not taken.
✓ Branch 82 taken 4 times.
✓ Branch 84 taken 8 times.
✓ Branch 85 taken 4 times.
✓ Branch 86 taken 4 times.
✓ Branch 87 taken 4 times.
✗ Branch 89 not taken.
✓ Branch 90 taken 4 times.
✓ Branch 92 taken 315 times.
✓ Branch 93 taken 4 times.
✗ Branch 94 not taken.
✓ Branch 95 taken 4 times.
✗ Branch 97 not taken.
✓ Branch 98 taken 4 times.
✗ Branch 100 not taken.
✓ Branch 101 taken 4 times.
✗ Branch 103 not taken.
✓ Branch 104 taken 4 times.
✗ Branch 106 not taken.
✓ Branch 107 taken 4 times.
✗ Branch 109 not taken.
✓ Branch 110 taken 4 times.
✗ Branch 112 not taken.
✓ Branch 113 taken 4 times.
✗ Branch 115 not taken.
✓ Branch 116 taken 4 times.
✗ Branch 118 not taken.
✓ Branch 119 taken 4 times.
✓ Branch 121 taken 11 times.
✓ Branch 122 taken 4 times.
✓ Branch 123 taken 11 times.
✓ Branch 124 taken 11 times.
✗ Branch 125 not taken.
✓ Branch 126 taken 4 times.
✗ Branch 127 not taken.
✗ Branch 128 not taken.
✓ Branch 129 taken 4 times.
✗ Branch 130 not taken.
✓ Branch 131 taken 326 times.
✓ Branch 132 taken 4 times.
1460 sum(this%db,dim=2)/this%batch_size ]
192
193
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 if(present(clip_method)) call clip_method%apply(size(gradients),gradients)
194
195 4 end function get_gradients_conv2d
196 !!!#############################################################################
197
198
199 !!!#############################################################################
200 !!! set gradients
201 !!! procedure modified from neural-fortran library
202 !!!#############################################################################
203 2 subroutine set_gradients_conv2d(this, gradients)
204 implicit none
205 class(conv2d_layer_type), intent(inout) :: this
206 real(real12), dimension(..), intent(in) :: gradients
207
208 integer :: s
209
210 select rank(gradients)
211 rank(0)
212
10/10
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 1 times.
✓ Branch 6 taken 3 times.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 9 times.
✓ Branch 9 taken 3 times.
16 this%dw = gradients
213
4/4
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 1 times.
4 this%db = gradients
214 rank(1)
215
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
2 do s=1,this%batch_size
216 this%dw(:,:,:,:,s) = reshape(gradients(:&
217 4 this%num_filters * this%num_channels * product(this%knl)), &
218
56/100
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 1 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 1 times.
✓ Branch 60 taken 2 times.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 63 taken 1 times.
✗ Branch 64 not taken.
✓ Branch 65 taken 1 times.
✗ Branch 66 not taken.
✓ Branch 67 taken 1 times.
✗ Branch 68 not taken.
✓ Branch 69 taken 1 times.
✓ Branch 70 taken 4 times.
✓ Branch 71 taken 1 times.
✗ Branch 72 not taken.
✓ Branch 73 taken 4 times.
✗ Branch 75 not taken.
✓ Branch 76 taken 4 times.
✗ Branch 78 not taken.
✓ Branch 79 taken 4 times.
✗ Branch 81 not taken.
✓ Branch 82 taken 4 times.
✗ Branch 84 not taken.
✓ Branch 85 taken 4 times.
✗ Branch 87 not taken.
✓ Branch 88 taken 4 times.
✗ Branch 90 not taken.
✓ Branch 91 taken 4 times.
✗ Branch 93 not taken.
✓ Branch 94 taken 4 times.
✗ Branch 96 not taken.
✓ Branch 97 taken 4 times.
✗ Branch 99 not taken.
✓ Branch 100 taken 4 times.
✗ Branch 102 not taken.
✓ Branch 103 taken 4 times.
✗ Branch 105 not taken.
✓ Branch 106 taken 4 times.
✗ Branch 108 not taken.
✓ Branch 109 taken 4 times.
✗ Branch 111 not taken.
✓ Branch 112 taken 4 times.
✗ Branch 114 not taken.
✓ Branch 115 taken 4 times.
✗ Branch 117 not taken.
✓ Branch 118 taken 4 times.
✓ Branch 120 taken 4 times.
✗ Branch 121 not taken.
✗ Branch 122 not taken.
✓ Branch 123 taken 4 times.
✗ Branch 126 not taken.
✓ Branch 127 taken 1 times.
✗ Branch 129 not taken.
✓ Branch 130 taken 1 times.
✓ Branch 132 taken 1 times.
✓ Branch 133 taken 1 times.
✓ Branch 134 taken 1 times.
✓ Branch 135 taken 1 times.
✓ Branch 136 taken 3 times.
✓ Branch 137 taken 1 times.
✓ Branch 138 taken 9 times.
✓ Branch 139 taken 3 times.
21 shape(this%dw(:,:,:,:,s)))
219 this%db(:,s) = gradients(&
220
19/34
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✓ Branch 12 taken 2 times.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 35 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 1 times.
✗ Branch 40 not taken.
✓ Branch 41 taken 1 times.
✓ Branch 43 taken 1 times.
✓ Branch 44 taken 1 times.
5 this%num_filters * this%num_channels * product(this%knl)+1:)
221 end do
222 end select
223
224 2 end subroutine set_gradients_conv2d
225 !!!#############################################################################
226
227
228 !!!#############################################################################
229 !!! get layer outputs
230 !!!#############################################################################
231 5 pure subroutine get_output_conv2d(this, output)
232 implicit none
233 class(conv2d_layer_type), intent(in) :: this
234 real(real12), allocatable, dimension(..), intent(out) :: output
235
236 select rank(output)
237 rank(1)
238
7/10
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
6 output = reshape(this%output, [size(this%output)])
239 rank(2)
240 output = &
241
11/18
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✓ Branch 12 taken 6 times.
✓ Branch 13 taken 2 times.
✓ Branch 14 taken 4 times.
✓ Branch 15 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✓ Branch 19 taken 2 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
12 reshape(this%output, [product(this%output_shape),this%batch_size])
242 rank(4)
243
34/68
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 2 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 2 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 2 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 2 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✗ Branch 50 not taken.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✓ Branch 58 taken 2 times.
✗ Branch 59 not taken.
✓ Branch 60 taken 2 times.
✗ Branch 61 not taken.
✓ Branch 62 taken 2 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 2 times.
✗ Branch 65 not taken.
✓ Branch 66 taken 2 times.
✗ Branch 67 not taken.
✓ Branch 68 taken 2 times.
✗ Branch 69 not taken.
✓ Branch 70 taken 2 times.
✗ Branch 71 not taken.
✓ Branch 72 taken 2 times.
✗ Branch 73 not taken.
✓ Branch 74 taken 2 times.
✗ Branch 75 not taken.
✓ Branch 76 taken 2 times.
✓ Branch 77 taken 2 times.
✓ Branch 78 taken 9 times.
✓ Branch 79 taken 2 times.
✓ Branch 80 taken 25 times.
✓ Branch 81 taken 9 times.
✓ Branch 82 taken 73 times.
✓ Branch 83 taken 25 times.
111 output = this%output
244 end select
245
246 5 end subroutine get_output_conv2d
247 !!!#############################################################################
248
249
250 !!!##########################################################################!!!
251 !!! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !!!
252 !!!##########################################################################!!!
253
254
255 !!!#############################################################################
256 !!! forward propagation assumed rank handler
257 !!!#############################################################################
258 14 pure subroutine forward_rank(this, input)
259 implicit none
260 class(conv2d_layer_type), intent(inout) :: this
261 real(real12), dimension(..), intent(in) :: input
262
263 select rank(input); rank(4)
264 14 call forward_4d(this, input)
265 end select
266 14 end subroutine forward_rank
267 !!!#############################################################################
268
269
270 !!!#############################################################################
271 !!! backward propagation assumed rank handler
272 !!!#############################################################################
273 2 pure subroutine backward_rank(this, input, gradient)
274 implicit none
275 class(conv2d_layer_type), intent(inout) :: this
276 real(real12), dimension(..), intent(in) :: input
277 real(real12), dimension(..), intent(in) :: gradient
278
279 select rank(input); rank(4)
280 2 select rank(gradient)
281 rank(1)
282 call backward_4d(this, input, gradient)
283 rank(2)
284 1 call backward_4d(this, input, gradient)
285 rank(4)
286 1 call backward_4d(this, input, gradient)
287 end select
288 end select
289 2 end subroutine backward_rank
290 !!!#############################################################################
291
292
293 !!!##########################################################################!!!
294 !!! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !!!
295 !!!##########################################################################!!!
296
297
298 !!!#############################################################################
299 !!! set up layer
300 !!!#############################################################################
301 30 module function layer_setup( &
302
2/4
✓ Branch 0 taken 22 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 22 times.
✗ Branch 3 not taken.
30 input_shape, batch_size, &
303 num_filters, kernel_size, stride, padding, &
304 activation_function, activation_scale, &
305 kernel_initialiser, bias_initialiser, &
306 calc_input_gradients) result(layer)
307 !! add in dilation
308 use activation, only: activation_setup
309 use initialiser, only: get_default_initialiser
310 use misc_ml, only: set_padding
311 implicit none
312 integer, dimension(:), optional, intent(in) :: input_shape
313 integer, optional, intent(in) :: batch_size
314 integer, optional, intent(in) :: num_filters
315 integer, dimension(..), optional, intent(in) :: kernel_size
316 integer, dimension(..), optional, intent(in) :: stride
317 real(real12), optional, intent(in) :: activation_scale
318 character(*), optional, intent(in) :: activation_function, &
319 kernel_initialiser, bias_initialiser, padding
320 logical, optional, intent(in) :: calc_input_gradients
321
322 type(conv2d_layer_type) :: layer
323
324 integer :: i
325 real(real12) :: scale
326 character(len=10) :: activation_function_
327 character(len=20) :: padding_
328
329
330
3/8
✓ Branch 0 taken 30 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 30 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 30 times.
30 layer%name = "conv2d"
331 30 layer%input_rank = 3
332 allocate( &
333 layer%knl(layer%input_rank-1), &
334 layer%stp(layer%input_rank-1), &
335 layer%hlf(layer%input_rank-1), &
336 layer%pad(layer%input_rank-1), &
337
40/80
✓ Branch 0 taken 30 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 30 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 30 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 30 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 30 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 30 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 30 times.
✓ Branch 18 taken 30 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 30 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 30 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 30 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 30 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 30 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 30 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 30 times.
✓ Branch 36 taken 30 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 30 times.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 30 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 30 times.
✗ Branch 44 not taken.
✓ Branch 45 taken 30 times.
✗ Branch 46 not taken.
✓ Branch 47 taken 30 times.
✗ Branch 49 not taken.
✓ Branch 50 taken 30 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 30 times.
✓ Branch 54 taken 30 times.
✗ Branch 55 not taken.
✓ Branch 56 taken 30 times.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 30 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 30 times.
✗ Branch 62 not taken.
✓ Branch 63 taken 30 times.
✗ Branch 64 not taken.
✓ Branch 65 taken 30 times.
✗ Branch 67 not taken.
✓ Branch 68 taken 30 times.
✗ Branch 69 not taken.
✓ Branch 70 taken 30 times.
✓ Branch 72 taken 30 times.
✗ Branch 73 not taken.
✓ Branch 74 taken 30 times.
✗ Branch 75 not taken.
✗ Branch 76 not taken.
✓ Branch 77 taken 30 times.
✗ Branch 78 not taken.
✓ Branch 79 taken 30 times.
✗ Branch 80 not taken.
✓ Branch 81 taken 30 times.
✗ Branch 82 not taken.
✓ Branch 83 taken 30 times.
✗ Branch 85 not taken.
✓ Branch 86 taken 30 times.
✗ Branch 88 not taken.
✓ Branch 89 taken 30 times.
30 layer%cen(layer%input_rank-1) )
338 !!--------------------------------------------------------------------------
339 !! initialise batch size
340 !!--------------------------------------------------------------------------
341
2/2
✓ Branch 0 taken 20 times.
✓ Branch 1 taken 10 times.
30 if(present(batch_size)) layer%batch_size = batch_size
342
343
344 !!--------------------------------------------------------------------------
345 !! determine whether to calculate input gradients
346 !!--------------------------------------------------------------------------
347
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 30 times.
30 if(present(calc_input_gradients))then
348 layer%calc_input_gradients = calc_input_gradients
349 write(*,*) "CONV2D input gradients turned off"
350 else
351 30 layer%calc_input_gradients = .true.
352 end if
353
354
355 !!--------------------------------------------------------------------------
356 !! set up number of filters
357 !!--------------------------------------------------------------------------
358
2/2
✓ Branch 0 taken 15 times.
✓ Branch 1 taken 15 times.
30 if(present(num_filters))then
359 15 layer%num_filters = num_filters
360 else
361 15 layer%num_filters = 32
362 end if
363
364
365 !!--------------------------------------------------------------------------
366 !! set up kernel size
367 !!--------------------------------------------------------------------------
368
3/4
✓ Branch 0 taken 17 times.
✓ Branch 1 taken 13 times.
✓ Branch 2 taken 17 times.
✗ Branch 3 not taken.
30 if(present(kernel_size))then
369 17 select rank(kernel_size)
370 rank(0)
371
2/2
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 15 times.
45 layer%knl = kernel_size
372 rank(1)
373
3/6
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
2 layer%knl(1) = kernel_size(1)
374
3/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 1 times.
4 if(size(kernel_size,dim=1).eq.1)then
375
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
1 layer%knl(2) = kernel_size(1)
376
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 elseif(size(kernel_size,dim=1).eq.2)then
377
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
1 layer%knl(2) = kernel_size(2)
378 end if
379 end select
380 else
381
2/2
✓ Branch 0 taken 26 times.
✓ Branch 1 taken 13 times.
39 layer%knl = 3
382 end if
383 !! odd or even kernel/filter size
384 !!--------------------------------------------------------------------------
385
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 30 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 30 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 30 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 30 times.
✓ Branch 12 taken 30 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 30 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✓ Branch 18 taken 60 times.
✓ Branch 19 taken 30 times.
90 layer%cen = 2 - mod(layer%knl, 2)
386
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 30 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 30 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 30 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 30 times.
✓ Branch 12 taken 30 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 30 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✓ Branch 18 taken 60 times.
✓ Branch 19 taken 30 times.
90 layer%hlf = (layer%knl-1)/2
387
388
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 21 times.
30 if(present(padding))then
389
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
9 padding_ = padding
390 else
391 21 padding_ = "valid"
392 end if
393
2/2
✓ Branch 0 taken 60 times.
✓ Branch 1 taken 30 times.
90 do i=1,2
394
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 60 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 60 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 60 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 60 times.
90 call set_padding(layer%pad(i), layer%knl(i), padding_)
395 end do
396
397
398 !!--------------------------------------------------------------------------
399 !! set up stride
400 !!--------------------------------------------------------------------------
401
3/4
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 19 times.
✓ Branch 2 taken 11 times.
✗ Branch 3 not taken.
30 if(present(stride))then
402 11 select rank(stride)
403 rank(0)
404
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 9 times.
27 layer%stp = stride
405 rank(1)
406
3/6
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
2 layer%stp(1) = stride(1)
407
3/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 1 times.
4 if(size(stride,dim=1).eq.1)then
408
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
1 layer%stp(2) = stride(1)
409
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 elseif(size(stride,dim=1).eq.2)then
410
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
1 layer%stp(2) = stride(2)
411 end if
412 end select
413 else
414
2/2
✓ Branch 0 taken 38 times.
✓ Branch 1 taken 19 times.
57 layer%stp = 1
415 end if
416
417
418 !!--------------------------------------------------------------------------
419 !! set activation and derivative functions based on input name
420 !!--------------------------------------------------------------------------
421
2/2
✓ Branch 0 taken 14 times.
✓ Branch 1 taken 16 times.
30 if(present(activation_function))then
422
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 9 times.
14 activation_function_ = activation_function
423 else
424 16 activation_function_ = "none"
425 end if
426
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 30 times.
30 if(present(activation_scale))then
427 scale = activation_scale
428 else
429 30 scale = 1._real12
430 end if
431
1/2
✓ Branch 3 taken 30 times.
✗ Branch 4 not taken.
30 write(*,'("CONV2D activation function: ",A)') trim(activation_function_)
432 allocate(layer%transfer, &
433
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 30 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 30 times.
✓ Branch 8 taken 30 times.
✗ Branch 9 not taken.
60 source=activation_setup(activation_function_, scale))
434
435
436 !!--------------------------------------------------------------------------
437 !! define weights (kernels) and biases initialisers
438 !!--------------------------------------------------------------------------
439
4/4
✓ Branch 0 taken 22 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 11 times.
✓ Branch 3 taken 11 times.
30 if(present(kernel_initialiser)) layer%kernel_initialiser =kernel_initialiser
440
4/4
✓ Branch 1 taken 22 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 22 times.
30 if(trim(layer%kernel_initialiser).eq.'') &
441
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
8 layer%kernel_initialiser=get_default_initialiser(activation_function_)
442
1/2
✓ Branch 3 taken 30 times.
✗ Branch 4 not taken.
30 write(*,'("CONV2D kernel initialiser: ",A)') trim(layer%kernel_initialiser)
443
3/4
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 21 times.
✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
30 if(present(bias_initialiser)) layer%bias_initialiser = bias_initialiser
444
4/4
✓ Branch 1 taken 9 times.
✓ Branch 2 taken 21 times.
✓ Branch 3 taken 21 times.
✓ Branch 4 taken 9 times.
30 if(trim(layer%bias_initialiser).eq.'') &
445 layer%bias_initialiser = get_default_initialiser(&
446
1/2
✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
21 activation_function_, is_bias=.true.)
447
1/2
✓ Branch 3 taken 30 times.
✗ Branch 4 not taken.
30 write(*,'("CONV2D bias initialiser: ",A)') trim(layer%bias_initialiser)
448
449
450 !!--------------------------------------------------------------------------
451 !! initialise layer shape
452 !!--------------------------------------------------------------------------
453
6/10
✓ Branch 0 taken 22 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 22 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 22 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 22 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 22 times.
30 if(present(input_shape)) call layer%init(input_shape=input_shape)
454
455
2/2
✓ Branch 0 taken 22 times.
✓ Branch 1 taken 8 times.
90 end function layer_setup
456 !!!#############################################################################
457
458
459 !!!#############################################################################
460 !!! initialise layer
461 !!!#############################################################################
462
1/2
✓ Branch 0 taken 27 times.
✗ Branch 1 not taken.
27 subroutine init_conv2d(this, input_shape, batch_size, verbose)
463 use initialiser, only: initialiser_setup
464 implicit none
465 class(conv2d_layer_type), intent(inout) :: this
466 integer, dimension(:), intent(in) :: input_shape
467 integer, optional, intent(in) :: batch_size
468 integer, optional, intent(in) :: verbose
469
470 integer :: verbose_ = 0
471 integer, dimension(2) :: end_idx
472 54 class(initialiser_type), allocatable :: initialiser_
473
474
475 !!--------------------------------------------------------------------------
476 !! initialise optional arguments
477 !!--------------------------------------------------------------------------
478
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 27 times.
27 if(present(verbose)) verbose_ = verbose
479
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 23 times.
27 if(present(batch_size)) this%batch_size = batch_size
480
481
482 !!-------------------------------------------------------------------------
483 !! initialise input shape
484 !!--------------------------------------------------------------------------
485
4/8
✓ Branch 0 taken 27 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 27 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 27 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 27 times.
27 if(.not.allocated(this%input_shape)) call this%set_shape(input_shape)
486
487
488 !!--------------------------------------------------------------------------
489 !! allocate output, activation, bias, and weight shapes
490 !!--------------------------------------------------------------------------
491 !! NOTE: INPUT SHAPE DOES NOT INCLUDE PADDING WIDTH
492 !! THIS IS HANDLED AUTOMATICALLY BY THE CODE
493 !! ... provide the initial input data shape and let us deal with the padding
494
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 27 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 27 times.
27 this%num_channels = this%input_shape(3)
495
3/6
✗ Branch 0 not taken.
✓ Branch 1 taken 27 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 27 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 27 times.
27 allocate(this%output_shape(3))
496
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 27 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 27 times.
27 this%output_shape(3) = this%num_filters
497 135 this%output_shape(:2) = floor(&
498
27/52
✗ Branch 0 not taken.
✓ Branch 1 taken 27 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 27 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 27 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 27 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 27 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 27 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 27 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 27 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 27 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 27 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 27 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 27 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 27 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 27 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 27 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 27 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 27 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 27 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 27 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 27 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 27 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 27 times.
✗ Branch 66 not taken.
✓ Branch 67 taken 27 times.
✗ Branch 69 not taken.
✓ Branch 70 taken 27 times.
✓ Branch 72 taken 54 times.
✓ Branch 73 taken 27 times.
✓ Branch 74 taken 54 times.
✗ Branch 75 not taken.
81 (this%input_shape(:2) + 2.0 * this%pad - this%knl)/real(this%stp) ) + 1
499
500
13/24
✓ Branch 0 taken 27 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 27 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 27 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 27 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 27 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 27 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 27 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 27 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 27 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 27 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 27 times.
✓ Branch 29 taken 440 times.
✓ Branch 30 taken 27 times.
467 allocate(this%bias(this%num_filters), source=0._real12)
501
502
12/22
✗ Branch 0 not taken.
✓ Branch 1 taken 27 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 27 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 27 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 27 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 27 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 27 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 27 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 27 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 27 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 27 times.
✓ Branch 30 taken 54 times.
✓ Branch 31 taken 27 times.
81 end_idx = this%hlf + (this%cen - 1)
503 allocate(this%weight( &
504 54 -this%hlf(1):end_idx(1), &
505 54 -this%hlf(2):end_idx(2), &
506
41/74
✗ Branch 0 not taken.
✓ Branch 1 taken 27 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 27 times.
✓ Branch 6 taken 27 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 27 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 27 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 27 times.
✓ Branch 16 taken 27 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 27 times.
✓ Branch 20 taken 27 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 27 times.
✓ Branch 24 taken 27 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 27 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 27 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 27 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 27 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 27 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 27 times.
✗ Branch 40 not taken.
✓ Branch 41 taken 27 times.
✗ Branch 43 not taken.
✓ Branch 44 taken 27 times.
✗ Branch 46 not taken.
✓ Branch 47 taken 27 times.
✗ Branch 49 not taken.
✓ Branch 50 taken 27 times.
✗ Branch 52 not taken.
✓ Branch 53 taken 27 times.
✗ Branch 55 not taken.
✓ Branch 56 taken 27 times.
✗ Branch 58 not taken.
✓ Branch 59 taken 27 times.
✗ Branch 61 not taken.
✓ Branch 62 taken 27 times.
✗ Branch 64 not taken.
✓ Branch 65 taken 27 times.
✗ Branch 67 not taken.
✓ Branch 68 taken 27 times.
✗ Branch 70 not taken.
✓ Branch 71 taken 27 times.
✗ Branch 73 not taken.
✓ Branch 74 taken 27 times.
✗ Branch 76 not taken.
✓ Branch 77 taken 27 times.
✗ Branch 79 not taken.
✓ Branch 80 taken 27 times.
✗ Branch 82 not taken.
✓ Branch 83 taken 27 times.
✗ Branch 85 not taken.
✓ Branch 86 taken 27 times.
✓ Branch 88 taken 440 times.
✓ Branch 89 taken 27 times.
✓ Branch 90 taken 1304 times.
✓ Branch 91 taken 440 times.
✓ Branch 92 taken 3894 times.
✓ Branch 93 taken 1304 times.
✓ Branch 94 taken 11664 times.
✓ Branch 95 taken 3894 times.
17329 this%num_channels,this%num_filters), source=0._real12)
507
508
509 !!--------------------------------------------------------------------------
510 !! initialise weights (kernels)
511 !!--------------------------------------------------------------------------
512
4/8
✗ Branch 1 not taken.
✓ Branch 2 taken 27 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 27 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 27 times.
✓ Branch 10 taken 27 times.
✗ Branch 11 not taken.
54 allocate(initialiser_, source=initialiser_setup(this%kernel_initialiser))
513 432 call initialiser_%initialise(this%weight, &
514
22/42
✗ Branch 0 not taken.
✓ Branch 1 taken 27 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 27 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 27 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 27 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 27 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 27 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 27 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 27 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 27 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 27 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 27 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 27 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 27 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 27 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 27 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 27 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 27 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 27 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 27 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 27 times.
✓ Branch 60 taken 54 times.
✓ Branch 61 taken 27 times.
81 fan_in=product(this%knl)+1, fan_out=1)
515
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 27 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 27 times.
27 deallocate(initialiser_)
516
517 !! initialise biases
518 !!--------------------------------------------------------------------------
519
4/8
✗ Branch 1 not taken.
✓ Branch 2 taken 27 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 27 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 27 times.
✓ Branch 10 taken 27 times.
✗ Branch 11 not taken.
54 allocate(initialiser_, source=initialiser_setup(this%bias_initialiser))
520 108 call initialiser_%initialise(this%bias, &
521
10/18
✗ Branch 0 not taken.
✓ Branch 1 taken 27 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 27 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 27 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 27 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 27 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 27 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 27 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 27 times.
✓ Branch 24 taken 54 times.
✓ Branch 25 taken 27 times.
81 fan_in=product(this%knl)+1, fan_out=1)
522
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 27 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 27 times.
27 deallocate(initialiser_)
523
524
525 !!--------------------------------------------------------------------------
526 !! initialise batch size-dependent arrays
527 !!--------------------------------------------------------------------------
528
2/2
✓ Branch 0 taken 23 times.
✓ Branch 1 taken 4 times.
27 if(this%batch_size.gt.0) call this%set_batch_size(this%batch_size)
529
530
1/4
✗ Branch 2 not taken.
✓ Branch 3 taken 27 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
81 end subroutine init_conv2d
531 !!!#############################################################################
532
533
534 !!!#############################################################################
535 !!! set batch size
536 !!!#############################################################################
537 27 subroutine set_batch_size_conv2d(this, batch_size, verbose)
538 implicit none
539 class(conv2d_layer_type), intent(inout) :: this
540 integer, intent(in) :: batch_size
541 integer, optional, intent(in) :: verbose
542
543 integer :: verbose_ = 0
544
545
546 !!--------------------------------------------------------------------------
547 !! initialise optional arguments
548 !!--------------------------------------------------------------------------
549
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 27 times.
27 if(present(verbose)) verbose_ = verbose
550 27 this%batch_size = batch_size
551
552
553 !!--------------------------------------------------------------------------
554 !! allocate arrays
555 !!--------------------------------------------------------------------------
556
1/2
✓ Branch 0 taken 27 times.
✗ Branch 1 not taken.
27 if(allocated(this%input_shape))then
557
3/4
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
27 if(allocated(this%output)) deallocate(this%output)
558 allocate(this%output( &
559 54 this%output_shape(1), &
560 54 this%output_shape(2), &
561 this%num_filters, &
562
41/74
✗ Branch 0 not taken.
✓ Branch 1 taken 27 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 27 times.
✓ Branch 6 taken 27 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 27 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 27 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 27 times.
✓ Branch 16 taken 27 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 27 times.
✓ Branch 20 taken 27 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 27 times.
✓ Branch 24 taken 27 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 27 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 27 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 27 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 27 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 27 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 27 times.
✗ Branch 40 not taken.
✓ Branch 41 taken 27 times.
✗ Branch 43 not taken.
✓ Branch 44 taken 27 times.
✗ Branch 46 not taken.
✓ Branch 47 taken 27 times.
✗ Branch 49 not taken.
✓ Branch 50 taken 27 times.
✗ Branch 52 not taken.
✓ Branch 53 taken 27 times.
✗ Branch 55 not taken.
✓ Branch 56 taken 27 times.
✗ Branch 58 not taken.
✓ Branch 59 taken 27 times.
✗ Branch 61 not taken.
✓ Branch 62 taken 27 times.
✗ Branch 64 not taken.
✓ Branch 65 taken 27 times.
✗ Branch 67 not taken.
✓ Branch 68 taken 27 times.
✗ Branch 70 not taken.
✓ Branch 71 taken 27 times.
✗ Branch 73 not taken.
✓ Branch 74 taken 27 times.
✗ Branch 76 not taken.
✓ Branch 77 taken 27 times.
✗ Branch 79 not taken.
✓ Branch 80 taken 27 times.
✗ Branch 82 not taken.
✓ Branch 83 taken 27 times.
✗ Branch 85 not taken.
✓ Branch 86 taken 27 times.
✓ Branch 88 taken 38 times.
✓ Branch 89 taken 27 times.
✓ Branch 90 taken 740 times.
✓ Branch 91 taken 38 times.
✓ Branch 92 taken 2212 times.
✓ Branch 93 taken 740 times.
✓ Branch 94 taken 6692 times.
✓ Branch 95 taken 2212 times.
9709 this%batch_size), source=0._real12)
563
3/4
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
27 if(allocated(this%z)) deallocate(this%z)
564
57/106
✓ Branch 0 taken 27 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 27 times.
✓ Branch 4 taken 27 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 27 times.
✓ Branch 8 taken 27 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 27 times.
✓ Branch 12 taken 27 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 27 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 27 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 27 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 27 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 27 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 27 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 27 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 27 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 27 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 27 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 27 times.
✗ Branch 44 not taken.
✓ Branch 45 taken 27 times.
✗ Branch 47 not taken.
✓ Branch 48 taken 27 times.
✗ Branch 50 not taken.
✓ Branch 51 taken 27 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 27 times.
✗ Branch 56 not taken.
✓ Branch 57 taken 27 times.
✗ Branch 59 not taken.
✓ Branch 60 taken 27 times.
✗ Branch 62 not taken.
✓ Branch 63 taken 27 times.
✗ Branch 65 not taken.
✓ Branch 66 taken 27 times.
✗ Branch 68 not taken.
✓ Branch 69 taken 27 times.
✗ Branch 71 not taken.
✓ Branch 72 taken 27 times.
✗ Branch 74 not taken.
✓ Branch 75 taken 27 times.
✗ Branch 77 not taken.
✓ Branch 78 taken 27 times.
✗ Branch 80 not taken.
✓ Branch 81 taken 27 times.
✗ Branch 83 not taken.
✓ Branch 84 taken 27 times.
✗ Branch 86 not taken.
✓ Branch 87 taken 27 times.
✗ Branch 89 not taken.
✓ Branch 90 taken 27 times.
✗ Branch 92 not taken.
✓ Branch 93 taken 27 times.
✗ Branch 95 not taken.
✓ Branch 96 taken 27 times.
✗ Branch 98 not taken.
✓ Branch 99 taken 27 times.
✗ Branch 101 not taken.
✓ Branch 102 taken 27 times.
✗ Branch 104 not taken.
✓ Branch 105 taken 27 times.
✗ Branch 107 not taken.
✓ Branch 108 taken 27 times.
✗ Branch 110 not taken.
✓ Branch 111 taken 27 times.
✗ Branch 113 not taken.
✓ Branch 114 taken 27 times.
✗ Branch 116 not taken.
✓ Branch 117 taken 27 times.
✗ Branch 119 not taken.
✓ Branch 120 taken 27 times.
✗ Branch 122 not taken.
✓ Branch 123 taken 27 times.
✗ Branch 125 not taken.
✓ Branch 126 taken 27 times.
✗ Branch 128 not taken.
✓ Branch 129 taken 27 times.
✗ Branch 131 not taken.
✓ Branch 132 taken 27 times.
✗ Branch 134 not taken.
✓ Branch 135 taken 27 times.
✓ Branch 137 taken 38 times.
✓ Branch 138 taken 27 times.
✓ Branch 139 taken 740 times.
✓ Branch 140 taken 38 times.
✓ Branch 141 taken 2212 times.
✓ Branch 142 taken 740 times.
✓ Branch 143 taken 6692 times.
✓ Branch 144 taken 2212 times.
9709 allocate(this%z, source=this%output)
565
3/4
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
27 if(allocated(this%di)) deallocate(this%di)
566 allocate(this%di( &
567 54 this%input_shape(1), &
568 54 this%input_shape(2), &
569 54 this%input_shape(3), &
570
43/78
✗ Branch 0 not taken.
✓ Branch 1 taken 27 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 27 times.
✓ Branch 6 taken 27 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 27 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 27 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 27 times.
✓ Branch 16 taken 27 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 27 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 27 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 27 times.
✓ Branch 26 taken 27 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 27 times.
✓ Branch 30 taken 27 times.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✓ Branch 33 taken 27 times.
✗ Branch 34 not taken.
✓ Branch 35 taken 27 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 27 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 27 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 27 times.
✗ Branch 43 not taken.
✓ Branch 44 taken 27 times.
✗ Branch 46 not taken.
✓ Branch 47 taken 27 times.
✗ Branch 49 not taken.
✓ Branch 50 taken 27 times.
✗ Branch 52 not taken.
✓ Branch 53 taken 27 times.
✗ Branch 55 not taken.
✓ Branch 56 taken 27 times.
✗ Branch 58 not taken.
✓ Branch 59 taken 27 times.
✗ Branch 61 not taken.
✓ Branch 62 taken 27 times.
✗ Branch 64 not taken.
✓ Branch 65 taken 27 times.
✗ Branch 67 not taken.
✓ Branch 68 taken 27 times.
✗ Branch 70 not taken.
✓ Branch 71 taken 27 times.
✗ Branch 73 not taken.
✓ Branch 74 taken 27 times.
✗ Branch 76 not taken.
✓ Branch 77 taken 27 times.
✗ Branch 79 not taken.
✓ Branch 80 taken 27 times.
✗ Branch 82 not taken.
✓ Branch 83 taken 27 times.
✗ Branch 85 not taken.
✓ Branch 86 taken 27 times.
✗ Branch 88 not taken.
✓ Branch 89 taken 27 times.
✗ Branch 91 not taken.
✓ Branch 92 taken 27 times.
✓ Branch 94 taken 38 times.
✓ Branch 95 taken 27 times.
✓ Branch 96 taken 92 times.
✓ Branch 97 taken 38 times.
✓ Branch 98 taken 430 times.
✓ Branch 99 taken 92 times.
✓ Branch 100 taken 2180 times.
✓ Branch 101 taken 430 times.
2767 this%batch_size), source=0._real12)
571
3/4
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
27 if(allocated(this%dw)) deallocate(this%dw)
572 allocate(this%dw( &
573 lbound(this%weight,1):ubound(this%weight,1), &
574 lbound(this%weight,2):ubound(this%weight,2), &
575 this%num_channels, this%num_filters, &
576
55/100
✓ Branch 0 taken 27 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 27 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 27 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 27 times.
✓ Branch 8 taken 27 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 27 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 27 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 27 times.
✓ Branch 16 taken 27 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 27 times.
✓ Branch 20 taken 27 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 27 times.
✓ Branch 24 taken 27 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 27 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 27 times.
✓ Branch 30 taken 27 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 27 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 27 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 27 times.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✓ Branch 39 taken 27 times.
✗ Branch 40 not taken.
✓ Branch 41 taken 27 times.
✗ Branch 43 not taken.
✓ Branch 44 taken 27 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 27 times.
✓ Branch 48 taken 27 times.
✗ Branch 49 not taken.
✓ Branch 50 taken 27 times.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✓ Branch 53 taken 27 times.
✗ Branch 55 not taken.
✓ Branch 56 taken 27 times.
✗ Branch 58 not taken.
✓ Branch 59 taken 27 times.
✗ Branch 61 not taken.
✓ Branch 62 taken 27 times.
✗ Branch 64 not taken.
✓ Branch 65 taken 27 times.
✗ Branch 67 not taken.
✓ Branch 68 taken 27 times.
✗ Branch 70 not taken.
✓ Branch 71 taken 27 times.
✗ Branch 73 not taken.
✓ Branch 74 taken 27 times.
✗ Branch 76 not taken.
✓ Branch 77 taken 27 times.
✗ Branch 79 not taken.
✓ Branch 80 taken 27 times.
✗ Branch 82 not taken.
✓ Branch 83 taken 27 times.
✗ Branch 85 not taken.
✓ Branch 86 taken 27 times.
✗ Branch 88 not taken.
✓ Branch 89 taken 27 times.
✗ Branch 91 not taken.
✓ Branch 92 taken 27 times.
✗ Branch 94 not taken.
✓ Branch 95 taken 27 times.
✗ Branch 97 not taken.
✓ Branch 98 taken 27 times.
✗ Branch 100 not taken.
✓ Branch 101 taken 27 times.
✗ Branch 103 not taken.
✓ Branch 104 taken 27 times.
✗ Branch 106 not taken.
✓ Branch 107 taken 27 times.
✗ Branch 109 not taken.
✓ Branch 110 taken 27 times.
✓ Branch 112 taken 38 times.
✓ Branch 113 taken 27 times.
✓ Branch 114 taken 740 times.
✓ Branch 115 taken 38 times.
✓ Branch 116 taken 2212 times.
✓ Branch 117 taken 740 times.
✓ Branch 118 taken 6618 times.
✓ Branch 119 taken 2212 times.
✓ Branch 120 taken 19836 times.
✓ Branch 121 taken 6618 times.
29471 this%batch_size), source=0._real12)
577
3/4
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
27 if(allocated(this%db)) deallocate(this%db)
578
21/38
✓ Branch 0 taken 27 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 27 times.
✓ Branch 4 taken 27 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 27 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 27 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 27 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 27 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 27 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 27 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 27 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 27 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 27 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 27 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 27 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 27 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 27 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 27 times.
✓ Branch 45 taken 38 times.
✓ Branch 46 taken 27 times.
✓ Branch 47 taken 740 times.
✓ Branch 48 taken 38 times.
805 allocate(this%db(this%num_filters, this%batch_size), source=0._real12)
579 end if
580
581 27 end subroutine set_batch_size_conv2d
582 !!!#############################################################################
583
584
585 !!!##########################################################################!!!
586 !!! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !!!
587 !!!##########################################################################!!!
588
589
590 !!!#############################################################################
591 !!! print layer to file
592 !!!#############################################################################
593 subroutine print_conv2d(this, file)
594 implicit none
595 class(conv2d_layer_type), intent(in) :: this
596 character(*), intent(in) :: file
597
598 integer :: l, i, itmp1, idx
599 integer :: unit
600 character(:), allocatable :: padding_type
601
602
603 !! handle different width kernels for x, y, z
604 !!--------------------------------------------------------------------------
605 itmp1 = -1
606 do i=1,2
607 if(this%pad(i).gt.itmp1)then
608 itmp1 = this%pad(i)
609 idx = i
610 end if
611 end do
612
613 !! determine padding method
614 !!--------------------------------------------------------------------------
615 padding_type = ""
616 if(this%pad(idx).eq.this%knl(idx)-1)then
617 padding_type = "full"
618 elseif(this%pad(idx).eq.0)then
619 padding_type = "valid"
620 else
621 padding_type = "same"
622 end if
623
624 !! open file with new unit
625 !!--------------------------------------------------------------------------
626 open(newunit=unit, file=trim(file), access='append')
627
628 !! write convolution initial parameters
629 !!--------------------------------------------------------------------------
630 write(unit,'("CONV2D")')
631 write(unit,'(3X,"INPUT_SHAPE = ",3(1X,I0))') this%input_shape
632 write(unit,'(3X,"NUM_FILTERS = ",I0)') this%num_filters
633 if(all(this%knl.eq.this%knl(1)))then
634 write(unit,'(3X,"KERNEL_SIZE =",1X,I0)') this%knl(1)
635 else
636 write(unit,'(3X,"KERNEL_SIZE =",2(1X,I0))') this%knl
637 end if
638 if(all(this%stp.eq.this%stp(1)))then
639 write(unit,'(3X,"STRIDE =",1X,I0)') this%stp(1)
640 else
641 write(unit,'(3X,"STRIDE =",2(1X,I0))') this%stp
642 end if
643 write(unit,'(3X,"PADDING = ",A)') padding_type
644
645 write(unit,'(3X,"ACTIVATION = ",A)') trim(this%transfer%name)
646 write(unit,'(3X,"ACTIVATION_SCALE = ",F0.9)') this%transfer%scale
647
648 !! write convolution weights and biases
649 !!--------------------------------------------------------------------------
650 write(unit,'("WEIGHTS")')
651 do l=1,this%num_filters
652 write(unit,'(5(E16.8E2))', advance="no") this%weight(:,:,:,l)
653 if(mod(size(this%weight(:,:,:,l)),5).eq.0) write(unit,*)
654 write(unit,'(E16.8E2)') this%bias(l)
655 end do
656 write(unit,'("END WEIGHTS")')
657 write(unit,'("END CONV2D")')
658
659 !! close unit
660 !!--------------------------------------------------------------------------
661 close(unit)
662
663 end subroutine print_conv2d
664 !!!#############################################################################
665
666
667 !!!#############################################################################
668 !!! read layer from file
669 !!!#############################################################################
670 function read_conv2d_layer(unit, verbose) result(layer)
671 use infile_tools, only: assign_val, assign_vec
672 use misc, only: to_lower, icount
673 implicit none
674 integer, intent(in) :: unit
675 integer, optional, intent(in) :: verbose
676
677 class(conv2d_layer_type), allocatable :: layer
678
679 integer :: stat, verbose_ = 0
680 integer :: j, k, l, c, itmp1
681 integer :: num_filters, num_inputs
682 real(real12) :: activation_scale
683 logical :: found_weights = .false.
684 character(14) :: kernel_initialiser='', bias_initialiser=''
685 character(20) :: padding, activation_function
686 character(256) :: buffer, tag
687
688 integer, dimension(2) :: kernel_size, stride
689 integer, dimension(3) :: input_shape
690 real(real12), allocatable, dimension(:) :: data_list
691
692
693 !!--------------------------------------------------------------------------
694 !! initialise optional arguments
695 !!--------------------------------------------------------------------------
696 if(present(verbose)) verbose_ = verbose
697
698
699 !!--------------------------------------------------------------------------
700 !! loop over tags in layer card
701 !!--------------------------------------------------------------------------
702 tag_loop: do
703
704 !! check for end of file
705 !!-----------------------------------------------------------------------
706 read(unit,'(A)',iostat=stat) buffer
707 if(stat.ne.0)then
708 write(0,*) "ERROR: file encountered error (EoF?) before END CONV2D"
709 stop "Exiting..."
710 end if
711 if(trim(adjustl(buffer)).eq."") cycle tag_loop
712
713 !! check for end of layer card
714 !!-----------------------------------------------------------------------
715 if(trim(adjustl(buffer)).eq."END CONV2D")then
716 backspace(unit)
717 exit tag_loop
718 end if
719
720 tag=trim(adjustl(buffer))
721 if(scan(buffer,"=").ne.0) tag=trim(tag(:scan(tag,"=")-1))
722
723 !! read parameters from save file
724 !!-----------------------------------------------------------------------
725 select case(trim(tag))
726 case("INPUT_SHAPE")
727 call assign_vec(buffer, input_shape, itmp1)
728 case("NUM_FILTERS")
729 call assign_val(buffer, num_filters, itmp1)
730 case("KERNEL_SIZE")
731 call assign_vec(buffer, kernel_size, itmp1)
732 case("STRIDE")
733 call assign_vec(buffer, stride, itmp1)
734 case("PADDING")
735 call assign_val(buffer, padding, itmp1)
736 padding = to_lower(padding)
737 case("ACTIVATION")
738 call assign_val(buffer, activation_function, itmp1)
739 case("ACTIVATION_SCALE")
740 call assign_val(buffer, activation_scale, itmp1)
741 case("KERNEL_INITIALISER")
742 call assign_val(buffer, kernel_initialiser, itmp1)
743 case("BIAS_INITIALISER")
744 call assign_val(buffer, bias_initialiser, itmp1)
745 case("WEIGHTS")
746 found_weights = .true.
747 kernel_initialiser = 'zeros'
748 bias_initialiser = 'zeros'
749 exit tag_loop
750 case default
751 !! don't look for "e" due to scientific notation of numbers
752 !! ... i.e. exponent (E+00)
753 if(scan(to_lower(trim(adjustl(buffer))),&
754 'abcdfghijklmnopqrstuvwxyz').eq.0)then
755 cycle tag_loop
756 elseif(tag(:3).eq.'END')then
757 cycle tag_loop
758 end if
759 stop "Unrecognised line in input file: "//trim(adjustl(buffer))
760 end select
761 end do tag_loop
762
763
764 !!--------------------------------------------------------------------------
765 !! allocate layer
766 !!--------------------------------------------------------------------------
767 layer = conv2d_layer_type( &
768 input_shape = input_shape, &
769 num_filters = num_filters, &
770 kernel_size = kernel_size, stride = stride, &
771 padding = padding, &
772 activation_function = activation_function, &
773 activation_scale = activation_scale, &
774 kernel_initialiser = kernel_initialiser, &
775 bias_initialiser = bias_initialiser)
776
777
778 !!--------------------------------------------------------------------------
779 !! check if WEIGHTS card was found
780 !!--------------------------------------------------------------------------
781 if(.not.found_weights)then
782 write(0,*) "WARNING: WEIGHTS card in CONV2D not found"
783 else
784 do l=1,num_filters
785 num_inputs = product(layer%knl) + 1 !+1 for bias
786 allocate(data_list(num_inputs), source=0._real12)
787 c = 1
788 k = 1
789 data_concat_loop: do while(c.le.num_inputs)
790 read(unit,'(A)',iostat=stat) buffer
791 if(stat.ne.0) exit data_concat_loop
792 k = icount(buffer)
793 read(buffer,*,iostat=stat) (data_list(j),j=c,c+k-1)
794 c = c + k
795 end do data_concat_loop
796 layer%weight(:,:,:,l) = &
797 reshape(&
798 data_list(1:num_inputs-1),&
799 shape(layer%weight(:,:,:,l)))
800 layer%bias(l) = data_list(num_inputs)
801 deallocate(data_list)
802 end do
803
804 !! check for end of weights card
805 !!-----------------------------------------------------------------------
806 read(unit,'(A)') buffer
807 if(trim(adjustl(buffer)).ne."END WEIGHTS")then
808 write(*,*) trim(adjustl(buffer))
809 stop "ERROR: END WEIGHTS not where expected"
810 end if
811 end if
812
813
814 !!--------------------------------------------------------------------------
815 !! check for end of layer card
816 !!--------------------------------------------------------------------------
817 read(unit,'(A)') buffer
818 if(trim(adjustl(buffer)).ne."END CONV2D")then
819 write(*,*) trim(adjustl(buffer))
820 stop "ERROR: END CONV2D not where expected"
821 end if
822
823 end function read_conv2d_layer
824 !!!#############################################################################
825
826
827 !!!##########################################################################!!!
828 !!! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !!!
829 !!!##########################################################################!!!
830
831
832 !!!#############################################################################
833 !!! forward propagation
834 !!!#############################################################################
835 182 pure subroutine forward_4d(this, input)
836 implicit none
837 class(conv2d_layer_type), intent(inout) :: this
838 real(real12), &
839 dimension( &
840
6/12
✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 14 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 14 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 14 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 14 times.
14 -this%pad(1)+1:this%input_shape(1)+this%pad(1), &
841
6/12
✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 14 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 14 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 14 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 14 times.
14 -this%pad(2)+1:this%input_shape(2)+this%pad(2), &
842 this%num_channels,this%batch_size), &
843 intent(in) :: input
844
845 integer :: i, j, l, s
846 integer, dimension(2) :: stp_idx, start_idx, end_idx
847
848
849 !! perform the convolution operation
850 !!--------------------------------------------------------------------------
851 do concurrent( &
852 28 i=1:this%output_shape(1):1, &
853
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 14 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 14 times.
14 j=1:this%output_shape(2):1)
854 #if defined(GFORTRAN)
855 stp_idx = ([i,j]-1)*this%stp + 1 + (this%hlf - this%pad)
856 #else
857
6/12
✗ Branch 0 not taken.
✓ Branch 1 taken 78 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 78 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 78 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 78 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 78 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 78 times.
78 stp_idx(1) = (i-1)*this%stp(1) + 1 + (this%hlf(1) - this%pad(1))
858
6/12
✗ Branch 0 not taken.
✓ Branch 1 taken 78 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 78 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 78 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 78 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 78 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 78 times.
78 stp_idx(2) = (j-1)*this%stp(2) + 1 + (this%hlf(2) - this%pad(2))
859 #endif
860
7/12
✗ Branch 0 not taken.
✓ Branch 1 taken 78 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 78 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 78 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 78 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 78 times.
✓ Branch 15 taken 156 times.
✓ Branch 16 taken 78 times.
234 start_idx = stp_idx - this%hlf
861
7/12
✗ Branch 0 not taken.
✓ Branch 1 taken 78 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 78 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 78 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 78 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 78 times.
✓ Branch 15 taken 156 times.
✓ Branch 16 taken 78 times.
234 end_idx = start_idx + this%knl - 1
862
863 78 do concurrent(s=1:this%batch_size)
864
19/34
✓ Branch 0 taken 78 times.
✓ Branch 1 taken 78 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 78 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 78 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 78 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 78 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 78 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 78 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 78 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 78 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 78 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 78 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 78 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 78 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 78 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 78 times.
✗ Branch 44 not taken.
✓ Branch 45 taken 78 times.
✓ Branch 47 taken 354 times.
✓ Branch 48 taken 78 times.
510 this%z(i,j,:,s) = this%bias(:)
865 end do
866
867
4/4
✓ Branch 0 taken 26 times.
✓ Branch 1 taken 14 times.
✓ Branch 2 taken 78 times.
✓ Branch 3 taken 26 times.
118 do concurrent(l=1:this%num_filters, s=1:this%batch_size)
868 5664 this%z(i,j,l,s) = this%z(i,j,l,s) + &
869 sum( &
870
1/2
✗ Branch 12 not taken.
✓ Branch 13 taken 354 times.
354 input( &
871 start_idx(1):end_idx(1),&
872 start_idx(2):end_idx(2),:,s) * &
873 6018 this%weight(:,:,:,l) &
874
55/100
✓ Branch 0 taken 78 times.
✓ Branch 1 taken 78 times.
✓ Branch 2 taken 354 times.
✓ Branch 3 taken 78 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 354 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 354 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 354 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 354 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 354 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 354 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 354 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 354 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 354 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 354 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 354 times.
✗ Branch 34 not taken.
✓ Branch 35 taken 354 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 354 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 354 times.
✗ Branch 40 not taken.
✓ Branch 41 taken 354 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 354 times.
✗ Branch 44 not taken.
✓ Branch 45 taken 354 times.
✗ Branch 46 not taken.
✓ Branch 47 taken 354 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 354 times.
✗ Branch 50 not taken.
✓ Branch 51 taken 354 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 354 times.
✗ Branch 56 not taken.
✓ Branch 57 taken 354 times.
✗ Branch 59 not taken.
✓ Branch 60 taken 354 times.
✗ Branch 62 not taken.
✓ Branch 63 taken 354 times.
✗ Branch 65 not taken.
✓ Branch 66 taken 354 times.
✗ Branch 68 not taken.
✓ Branch 69 taken 354 times.
✗ Branch 71 not taken.
✓ Branch 72 taken 354 times.
✗ Branch 74 not taken.
✓ Branch 75 taken 354 times.
✗ Branch 77 not taken.
✓ Branch 78 taken 354 times.
✗ Branch 80 not taken.
✓ Branch 81 taken 354 times.
✗ Branch 83 not taken.
✓ Branch 84 taken 354 times.
✗ Branch 86 not taken.
✓ Branch 87 taken 354 times.
✗ Branch 89 not taken.
✓ Branch 90 taken 354 times.
✗ Branch 92 not taken.
✓ Branch 93 taken 354 times.
✗ Branch 95 not taken.
✓ Branch 96 taken 354 times.
✗ Branch 97 not taken.
✓ Branch 98 taken 354 times.
✗ Branch 100 not taken.
✓ Branch 101 taken 354 times.
✓ Branch 103 taken 1186 times.
✓ Branch 104 taken 354 times.
✓ Branch 105 taken 3540 times.
✓ Branch 106 taken 1186 times.
✓ Branch 107 taken 10602 times.
✓ Branch 108 taken 3540 times.
✗ Branch 109 not taken.
✓ Branch 110 taken 354 times.
✗ Branch 112 not taken.
✓ Branch 113 taken 354 times.
✗ Branch 115 not taken.
✓ Branch 116 taken 354 times.
✗ Branch 118 not taken.
✓ Branch 119 taken 354 times.
✗ Branch 121 not taken.
✓ Branch 122 taken 354 times.
✗ Branch 124 not taken.
✓ Branch 125 taken 354 times.
✗ Branch 127 not taken.
✓ Branch 128 taken 354 times.
✗ Branch 130 not taken.
✓ Branch 131 taken 354 times.
15838 )
875 end do
876 end do
877
878
879 !! apply activation function to activation values (z)
880 !!--------------------------------------------------------------------------
881
62/118
✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 14 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 14 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 14 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 14 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 14 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 14 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 14 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 14 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 14 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 14 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 14 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 14 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 14 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 14 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 14 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 14 times.
✗ Branch 34 not taken.
✓ Branch 35 taken 14 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 14 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 14 times.
✗ Branch 40 not taken.
✓ Branch 41 taken 14 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 14 times.
✗ Branch 44 not taken.
✓ Branch 45 taken 14 times.
✗ Branch 46 not taken.
✓ Branch 47 taken 14 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 14 times.
✗ Branch 50 not taken.
✓ Branch 51 taken 14 times.
✗ Branch 52 not taken.
✓ Branch 53 taken 14 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 14 times.
✗ Branch 56 not taken.
✓ Branch 57 taken 14 times.
✗ Branch 58 not taken.
✓ Branch 59 taken 14 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 14 times.
✗ Branch 62 not taken.
✓ Branch 63 taken 14 times.
✗ Branch 64 not taken.
✓ Branch 65 taken 14 times.
✗ Branch 66 not taken.
✓ Branch 67 taken 14 times.
✗ Branch 68 not taken.
✓ Branch 69 taken 14 times.
✗ Branch 70 not taken.
✓ Branch 71 taken 14 times.
✗ Branch 72 not taken.
✓ Branch 73 taken 14 times.
✗ Branch 74 not taken.
✓ Branch 75 taken 14 times.
✗ Branch 76 not taken.
✓ Branch 77 taken 14 times.
✗ Branch 78 not taken.
✓ Branch 79 taken 14 times.
✗ Branch 80 not taken.
✓ Branch 81 taken 14 times.
✗ Branch 82 not taken.
✓ Branch 83 taken 14 times.
✗ Branch 84 not taken.
✓ Branch 85 taken 14 times.
✗ Branch 86 not taken.
✓ Branch 87 taken 14 times.
✗ Branch 88 not taken.
✓ Branch 89 taken 14 times.
✗ Branch 90 not taken.
✓ Branch 91 taken 14 times.
✗ Branch 92 not taken.
✓ Branch 93 taken 14 times.
✗ Branch 94 not taken.
✓ Branch 95 taken 14 times.
✓ Branch 96 taken 14 times.
✗ Branch 97 not taken.
✓ Branch 99 taken 14 times.
✗ Branch 100 not taken.
✓ Branch 101 taken 14 times.
✗ Branch 102 not taken.
✓ Branch 103 taken 14 times.
✗ Branch 104 not taken.
✓ Branch 105 taken 14 times.
✗ Branch 106 not taken.
✓ Branch 107 taken 14 times.
✗ Branch 108 not taken.
✗ Branch 109 not taken.
✗ Branch 110 not taken.
✓ Branch 111 taken 14 times.
✓ Branch 112 taken 14 times.
✓ Branch 113 taken 34 times.
✓ Branch 114 taken 14 times.
✓ Branch 115 taken 98 times.
✓ Branch 116 taken 34 times.
✓ Branch 117 taken 354 times.
✓ Branch 118 taken 98 times.
514 this%output = this%transfer%activate(this%z)
882
883 14 end subroutine forward_4d
884 !!!#############################################################################
885
886
887 !!!#############################################################################
888 !!! backward propagation
889 !!! method : gradient descent
890 !!!#############################################################################
891 34 pure subroutine backward_4d(this, input, gradient)
892 implicit none
893 class(conv2d_layer_type), intent(inout) :: this
894 real(real12), &
895 dimension( &
896
6/12
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 2 times.
2 -this%pad(1)+1:this%input_shape(1)+this%pad(1), &
897
6/12
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 2 times.
2 -this%pad(2)+1:this%input_shape(2)+this%pad(2), &
898 this%num_channels,this%batch_size), &
899 intent(in) :: input
900 real(real12), &
901
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
2 dimension( &
902
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
2 this%output_shape(1), &
903 this%output_shape(2), &
904 this%num_filters,this%batch_size), &
905 intent(in) :: gradient
906
907 integer :: l, m, i, j, x, y, s
908 integer, dimension(2) :: stp_idx, offset, adjust, end_idx, n_stp
909 integer, dimension(2,2) :: lim, lim_w, lim_g
910 real(real12), &
911 4 dimension( &
912 4 this%output_shape(1),&
913 this%output_shape(2),this%num_filters, &
914
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
2 this%batch_size) :: grad_dz
915
916
917 real(real12), dimension(1) :: bias_diff
918
2/2
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
4 bias_diff = this%transfer%differentiate([1._real12])
919
920
921 !! get size of the input and output feature maps
922 !!--------------------------------------------------------------------------
923
12/22
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 2 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 2 times.
✓ Branch 30 taken 4 times.
✓ Branch 31 taken 2 times.
6 end_idx = this%hlf + (this%cen - 1)
924
12/22
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 2 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 2 times.
✓ Branch 30 taken 4 times.
✓ Branch 31 taken 2 times.
6 offset = 1 + this%hlf - this%pad
925
12/22
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 2 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 2 times.
✓ Branch 30 taken 4 times.
✓ Branch 31 taken 2 times.
6 adjust = 2 * max(this%pad, this%hlf)
926
927
928 !! get gradient multiplied by differential of Z
929 !!--------------------------------------------------------------------------
930
20/32
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 2 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 2 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✓ Branch 36 taken 2 times.
✓ Branch 37 taken 2 times.
✓ Branch 38 taken 12 times.
✓ Branch 39 taken 2 times.
✓ Branch 40 taken 44 times.
✓ Branch 41 taken 12 times.
✓ Branch 42 taken 172 times.
✓ Branch 43 taken 44 times.
232 grad_dz = 0._real12
931 grad_dz(&
932 4 1:this%output_shape(1),&
933 1:this%output_shape(2),:,:) = gradient * &
934
41/74
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 2 times.
✗ Branch 34 not taken.
✓ Branch 35 taken 2 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 2 times.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✗ Branch 46 not taken.
✓ Branch 47 taken 2 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✗ Branch 50 not taken.
✓ Branch 51 taken 2 times.
✗ Branch 52 not taken.
✓ Branch 53 taken 2 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✓ Branch 57 taken 2 times.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 2 times.
✗ Branch 62 not taken.
✓ Branch 63 taken 2 times.
✗ Branch 64 not taken.
✓ Branch 65 taken 2 times.
✗ Branch 66 not taken.
✓ Branch 67 taken 2 times.
✓ Branch 68 taken 2 times.
✗ Branch 69 not taken.
✓ Branch 71 taken 2 times.
✓ Branch 72 taken 2 times.
✓ Branch 73 taken 12 times.
✓ Branch 74 taken 2 times.
✓ Branch 75 taken 44 times.
✓ Branch 76 taken 12 times.
✓ Branch 77 taken 172 times.
✓ Branch 78 taken 44 times.
232 this%transfer%differentiate(this%z)
935 do concurrent( &
936 4 l=1:this%num_filters, s=1:this%batch_size)
937
26/44
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 12 times.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 12 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 12 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 12 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 12 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 12 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 12 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 12 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 12 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 12 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 12 times.
✗ Branch 34 not taken.
✓ Branch 35 taken 12 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 12 times.
✗ Branch 40 not taken.
✓ Branch 41 taken 12 times.
✗ Branch 43 not taken.
✓ Branch 44 taken 12 times.
✓ Branch 46 taken 44 times.
✓ Branch 47 taken 12 times.
✓ Branch 48 taken 172 times.
✓ Branch 49 taken 44 times.
✗ Branch 50 not taken.
✓ Branch 51 taken 12 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 12 times.
✗ Branch 56 not taken.
✓ Branch 57 taken 12 times.
✗ Branch 59 not taken.
✓ Branch 60 taken 12 times.
232 this%db(l,s) = this%db(l,s) + sum(grad_dz(:,:,l,s)) * bias_diff(1)
938 end do
939
940 !! apply convolution to compute weight gradients
941 !! offset applied as centre of kernel is 0 ...
942 !! ... whilst the starting index for input is 1
943 !!--------------------------------------------------------------------------
944 do concurrent( &
945 s=1:this%batch_size, &
946 l=1:this%num_filters, &
947 m=1:this%num_channels, &
948 4 y=-this%hlf(2):end_idx(2):1, &
949 4 x=-this%hlf(1):end_idx(1):1 &
950
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
2 )
951 7920 this%dw(x,y,m,l,s) = this%dw(x,y,m,l,s) + &
952
2/4
✗ Branch 7 not taken.
✓ Branch 8 taken 396 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 396 times.
792 sum(grad_dz(:,:,l,s) * &
953
3/6
✗ Branch 3 not taken.
✓ Branch 4 taken 396 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 396 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 396 times.
1188 input( &
954 x+offset(1):x+offset(1)-1+size(input,1)-adjust(1):this%stp(1), &
955
87/160
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 63 times.
✓ Branch 5 taken 18 times.
✓ Branch 6 taken 396 times.
✓ Branch 7 taken 63 times.
✓ Branch 8 taken 396 times.
✓ Branch 9 taken 396 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 396 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 396 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 396 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 396 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 396 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 396 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 396 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 396 times.
✗ Branch 34 not taken.
✓ Branch 35 taken 396 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 396 times.
✗ Branch 40 not taken.
✓ Branch 41 taken 396 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 396 times.
✗ Branch 44 not taken.
✓ Branch 45 taken 396 times.
✗ Branch 46 not taken.
✓ Branch 47 taken 396 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 396 times.
✗ Branch 50 not taken.
✓ Branch 51 taken 396 times.
✗ Branch 52 not taken.
✓ Branch 53 taken 396 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 396 times.
✗ Branch 56 not taken.
✓ Branch 57 taken 396 times.
✗ Branch 58 not taken.
✓ Branch 59 taken 396 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 396 times.
✗ Branch 62 not taken.
✓ Branch 63 taken 396 times.
✗ Branch 64 not taken.
✓ Branch 65 taken 396 times.
✗ Branch 66 not taken.
✓ Branch 67 taken 396 times.
✗ Branch 68 not taken.
✓ Branch 69 taken 396 times.
✗ Branch 71 not taken.
✓ Branch 72 taken 396 times.
✗ Branch 74 not taken.
✓ Branch 75 taken 396 times.
✗ Branch 77 not taken.
✓ Branch 78 taken 396 times.
✗ Branch 80 not taken.
✓ Branch 81 taken 396 times.
✗ Branch 83 not taken.
✓ Branch 84 taken 396 times.
✗ Branch 86 not taken.
✓ Branch 87 taken 396 times.
✗ Branch 89 not taken.
✓ Branch 90 taken 396 times.
✗ Branch 92 not taken.
✓ Branch 93 taken 396 times.
✗ Branch 95 not taken.
✓ Branch 96 taken 396 times.
✗ Branch 98 not taken.
✓ Branch 99 taken 396 times.
✗ Branch 101 not taken.
✓ Branch 102 taken 396 times.
✗ Branch 104 not taken.
✓ Branch 105 taken 396 times.
✗ Branch 107 not taken.
✓ Branch 108 taken 396 times.
✗ Branch 110 not taken.
✓ Branch 111 taken 396 times.
✗ Branch 113 not taken.
✓ Branch 114 taken 396 times.
✗ Branch 116 not taken.
✓ Branch 117 taken 396 times.
✗ Branch 119 not taken.
✓ Branch 120 taken 396 times.
✗ Branch 122 not taken.
✓ Branch 123 taken 396 times.
✗ Branch 124 not taken.
✓ Branch 125 taken 396 times.
✗ Branch 126 not taken.
✓ Branch 127 taken 396 times.
✗ Branch 128 not taken.
✓ Branch 129 taken 396 times.
✗ Branch 130 not taken.
✓ Branch 131 taken 396 times.
✗ Branch 132 not taken.
✓ Branch 133 taken 396 times.
✗ Branch 134 not taken.
✓ Branch 135 taken 396 times.
✗ Branch 136 not taken.
✓ Branch 137 taken 396 times.
✗ Branch 138 not taken.
✓ Branch 139 taken 396 times.
✗ Branch 140 not taken.
✓ Branch 141 taken 396 times.
✗ Branch 143 not taken.
✓ Branch 144 taken 396 times.
✗ Branch 146 not taken.
✓ Branch 147 taken 396 times.
✗ Branch 149 not taken.
✓ Branch 150 taken 396 times.
✗ Branch 151 not taken.
✓ Branch 152 taken 396 times.
✗ Branch 153 not taken.
✓ Branch 154 taken 396 times.
✗ Branch 156 not taken.
✓ Branch 157 taken 396 times.
✗ Branch 159 not taken.
✓ Branch 160 taken 396 times.
✗ Branch 162 not taken.
✓ Branch 163 taken 396 times.
✗ Branch 164 not taken.
✓ Branch 165 taken 396 times.
✗ Branch 166 not taken.
✓ Branch 167 taken 396 times.
✗ Branch 168 not taken.
✓ Branch 169 taken 396 times.
✓ Branch 170 taken 1404 times.
✓ Branch 171 taken 396 times.
✓ Branch 172 taken 5292 times.
✓ Branch 173 taken 1404 times.
✗ Branch 174 not taken.
✓ Branch 175 taken 396 times.
✗ Branch 177 not taken.
✓ Branch 178 taken 396 times.
✗ Branch 180 not taken.
✓ Branch 181 taken 396 times.
✗ Branch 183 not taken.
✓ Branch 184 taken 396 times.
✗ Branch 186 not taken.
✓ Branch 187 taken 396 times.
✗ Branch 189 not taken.
✓ Branch 190 taken 396 times.
✗ Branch 192 not taken.
✓ Branch 193 taken 396 times.
✗ Branch 195 not taken.
✓ Branch 196 taken 396 times.
✗ Branch 198 not taken.
✓ Branch 199 taken 396 times.
✗ Branch 201 not taken.
✓ Branch 202 taken 396 times.
9161 y+offset(2):y+offset(2)-1+size(input,1)-adjust(2):this%stp(2),m,s))
956 end do
957
958
959 !! apply strided convolution to obtain input gradients
960 !!--------------------------------------------------------------------------
961
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
2 if(this%calc_input_gradients)then
962
7/12
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 1 times.
3 lim(1,:) = this%knl - 1
963
13/24
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 1 times.
✓ Branch 33 taken 2 times.
✓ Branch 34 taken 1 times.
3 lim(2,:) = (this%output_shape(:2) - 1) * this%stp + 1 + end_idx
964
12/22
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
✓ Branch 30 taken 2 times.
✓ Branch 31 taken 1 times.
3 n_stp = this%output_shape(:2) * this%stp
965
8/8
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 20 times.
✓ Branch 5 taken 4 times.
✓ Branch 6 taken 100 times.
✓ Branch 7 taken 20 times.
126 this%di = 0._real12
966 !! all elements of the output are separated by stride_x (stride_y)
967 do concurrent( &
968 s=1:this%batch_size, &
969 l=1:this%num_filters, &
970 m=1:this%num_channels, &
971 i=1:size(this%di,dim=1):1, &
972 j=1:size(this%di,dim=2):1 &
973 931 )
974
975 !! set weight bounds
976 #if defined(GFORTRAN)
977 stp_idx = ([i,j]-offset)/this%stp + 1
978 #else
979
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 800 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 800 times.
800 stp_idx(1) = ( i - offset(1) )/this%stp(1) + 1
980
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 800 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 800 times.
800 stp_idx(2) = ( j - offset(2) )/this%stp(2) + 1
981 #endif
982 !! max( ...
983 !! ... 1. offset of 1st o/p idx from centre of knl (lim)
984 !! ... 2. lwst o/p idx overlap with <<- knl idx (rpt. pattern)
985 !! ...)
986 !! min( ...
987 !! ... 1. offset of last o/p idx from centre of knl (lim)
988 !! ... 2. hghst o/p idx overlap with ->> knl idx (rpt. pattern)
989 !! ...)
990 #if defined(GFORTRAN)
991 lim_w(2,:) = max(lim(1,:)-[i,j], -this%hlf + &
992 mod(n_stp+this%knl-[i,j],this%stp))
993 lim_w(1,:) = min(lim(2,:)-[i,j], end_idx - &
994 mod(n_stp-1+[i,j],this%stp))
995 #else
996 1600 lim_w(2,1) = max(lim(1,1) - i, -this%hlf(1) + &
997
6/12
✗ Branch 0 not taken.
✓ Branch 1 taken 800 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 800 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 800 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 800 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 800 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 800 times.
800 mod(n_stp(1)+this%knl(1)-i,this%stp(1)))
998 1600 lim_w(2,2) = max(lim(1,2) - j, -this%hlf(2) + &
999
6/12
✗ Branch 0 not taken.
✓ Branch 1 taken 800 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 800 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 800 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 800 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 800 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 800 times.
800 mod(n_stp(2)+this%knl(2)-j,this%stp(2)))
1000 lim_w(1,1) = min(lim(2,1)-i, end_idx(1) - &
1001
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 800 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 800 times.
800 mod(n_stp(1)-1+i,this%stp(1)))
1002 lim_w(1,2) = min(lim(2,2)-j, end_idx(2) - &
1003
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 800 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 800 times.
800 mod(n_stp(2)-1+j,this%stp(2)))
1004 #endif
1005
4/6
✓ Branch 0 taken 1600 times.
✓ Branch 1 taken 800 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1600 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 800 times.
2400 if(any(lim_w(2,:).gt.lim_w(1,:))) cycle
1006
1007 !! set gradient bounds
1008 #if defined(GFORTRAN)
1009 lim_g(1,:) = max(1, [i,j] - offset)
1010 lim_g(2,:) = min(this%output_shape(:2), [i,j] - offset + this%knl - 1)
1011 #else
1012 800 lim_g(1,1) = max(1, i - offset(1))
1013 800 lim_g(1,2) = max(1, j - offset(2))
1014
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 800 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 800 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 800 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 800 times.
800 lim_g(2,1) = min(this%output_shape(1), i - offset(1) + this%knl(1) -1)
1015
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 800 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 800 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 800 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 800 times.
800 lim_g(2,2) = min(this%output_shape(2), j - offset(2) + this%knl(2) -1)
1016 #endif
1017
1018 !! apply full convolution to compute input gradients
1019 6400 this%di(i,j,m,s) = &
1020 6400 this%di(i,j,m,s) + &
1021 sum( &
1022
2/4
✗ Branch 9 not taken.
✓ Branch 10 taken 800 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 800 times.
1600 grad_dz( &
1023 lim_g(1,1):lim_g(2,1), &
1024 lim_g(1,2):lim_g(2,2),l,s) * &
1025
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 800 times.
800 this%weight(&
1026 1600 lim_w(1,1):lim_w(2,1):-this%stp(1), &
1027
59/104
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 25 times.
✓ Branch 3 taken 5 times.
✓ Branch 4 taken 100 times.
✓ Branch 5 taken 25 times.
✓ Branch 6 taken 800 times.
✓ Branch 7 taken 100 times.
✓ Branch 8 taken 800 times.
✓ Branch 9 taken 800 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 800 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 800 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 800 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 800 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 800 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 800 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 800 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 800 times.
✗ Branch 34 not taken.
✓ Branch 35 taken 800 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 800 times.
✗ Branch 40 not taken.
✓ Branch 41 taken 800 times.
✗ Branch 43 not taken.
✓ Branch 44 taken 800 times.
✗ Branch 46 not taken.
✓ Branch 47 taken 800 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 800 times.
✗ Branch 50 not taken.
✓ Branch 51 taken 800 times.
✗ Branch 52 not taken.
✓ Branch 53 taken 800 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 800 times.
✗ Branch 56 not taken.
✓ Branch 57 taken 800 times.
✗ Branch 58 not taken.
✓ Branch 59 taken 800 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 800 times.
✗ Branch 62 not taken.
✓ Branch 63 taken 800 times.
✗ Branch 64 not taken.
✓ Branch 65 taken 800 times.
✗ Branch 67 not taken.
✓ Branch 68 taken 800 times.
✗ Branch 70 not taken.
✓ Branch 71 taken 800 times.
✗ Branch 73 not taken.
✓ Branch 74 taken 800 times.
✗ Branch 76 not taken.
✓ Branch 77 taken 800 times.
✗ Branch 79 not taken.
✓ Branch 80 taken 800 times.
✗ Branch 82 not taken.
✓ Branch 83 taken 800 times.
✗ Branch 85 not taken.
✓ Branch 86 taken 800 times.
✗ Branch 88 not taken.
✓ Branch 89 taken 800 times.
✗ Branch 91 not taken.
✓ Branch 92 taken 800 times.
✗ Branch 94 not taken.
✓ Branch 95 taken 800 times.
✗ Branch 96 not taken.
✓ Branch 97 taken 800 times.
✗ Branch 98 not taken.
✓ Branch 99 taken 800 times.
✗ Branch 101 not taken.
✓ Branch 102 taken 800 times.
✗ Branch 104 not taken.
✓ Branch 105 taken 800 times.
✗ Branch 107 not taken.
✓ Branch 108 taken 800 times.
✓ Branch 110 taken 1440 times.
✓ Branch 111 taken 800 times.
✓ Branch 112 taken 2592 times.
✓ Branch 113 taken 1440 times.
✗ Branch 114 not taken.
✓ Branch 115 taken 800 times.
✗ Branch 117 not taken.
✓ Branch 118 taken 800 times.
✗ Branch 120 not taken.
✓ Branch 121 taken 800 times.
✗ Branch 123 not taken.
✓ Branch 124 taken 800 times.
✗ Branch 126 not taken.
✓ Branch 127 taken 800 times.
✗ Branch 129 not taken.
✓ Branch 130 taken 800 times.
✗ Branch 132 not taken.
✓ Branch 133 taken 800 times.
✗ Branch 135 not taken.
✓ Branch 136 taken 800 times.
8163 lim_w(1,2):lim_w(2,2):-this%stp(2),m,l) )
1028
1029 end do
1030 end if
1031
1032 2 end subroutine backward_4d
1033 !!!#############################################################################
1034
1035
92/130
✓ Branch 0 taken 40 times.
✓ Branch 1 taken 25 times.
✓ Branch 2 taken 40 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 53 times.
✓ Branch 5 taken 12 times.
✓ Branch 6 taken 29 times.
✓ Branch 7 taken 13 times.
✓ Branch 8 taken 41 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✓ Branch 11 taken 41 times.
✓ Branch 12 taken 1 times.
✓ Branch 13 taken 40 times.
✓ Branch 14 taken 1 times.
✓ Branch 15 taken 44 times.
✓ Branch 16 taken 2 times.
✓ Branch 17 taken 42 times.
✓ Branch 18 taken 2 times.
✓ Branch 19 taken 40 times.
✓ Branch 20 taken 14 times.
✓ Branch 21 taken 28 times.
✓ Branch 22 taken 26 times.
✓ Branch 23 taken 21 times.
✓ Branch 24 taken 33 times.
✓ Branch 25 taken 28 times.
✓ Branch 26 taken 14 times.
✓ Branch 27 taken 21 times.
✓ Branch 28 taken 21 times.
✓ Branch 29 taken 21 times.
✓ Branch 30 taken 21 times.
✓ Branch 31 taken 21 times.
✓ Branch 32 taken 21 times.
✓ Branch 33 taken 21 times.
✓ Branch 34 taken 21 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✓ Branch 38 taken 1 times.
✓ Branch 39 taken 1 times.
✓ Branch 40 taken 25 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 2 times.
✓ Branch 43 taken 39 times.
✓ Branch 44 taken 2 times.
✓ Branch 45 taken 24 times.
✓ Branch 46 taken 39 times.
✓ Branch 47 taken 2 times.
✓ Branch 48 taken 26 times.
✗ Branch 49 not taken.
✓ Branch 50 taken 2 times.
✓ Branch 51 taken 9 times.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 9 times.
✓ Branch 55 taken 2 times.
✓ Branch 56 taken 2 times.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✓ Branch 67 taken 24 times.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
✓ Branch 70 taken 24 times.
✓ Branch 71 taken 24 times.
✗ Branch 72 not taken.
✓ Branch 73 taken 3 times.
✓ Branch 74 taken 21 times.
✓ Branch 75 taken 24 times.
✗ Branch 76 not taken.
✓ Branch 77 taken 3 times.
✓ Branch 78 taken 21 times.
✓ Branch 79 taken 24 times.
✗ Branch 80 not taken.
✗ Branch 81 not taken.
✓ Branch 82 taken 24 times.
✗ Branch 83 not taken.
✓ Branch 84 taken 24 times.
✓ Branch 86 taken 24 times.
✗ Branch 87 not taken.
✗ Branch 88 not taken.
✓ Branch 89 taken 24 times.
✓ Branch 90 taken 24 times.
✗ Branch 91 not taken.
✗ Branch 92 not taken.
✓ Branch 93 taken 24 times.
✓ Branch 94 taken 24 times.
✗ Branch 95 not taken.
✗ Branch 96 not taken.
✓ Branch 97 taken 24 times.
✓ Branch 98 taken 24 times.
✗ Branch 99 not taken.
✗ Branch 100 not taken.
✓ Branch 101 taken 24 times.
✓ Branch 102 taken 24 times.
✗ Branch 103 not taken.
✗ Branch 104 not taken.
✓ Branch 105 taken 24 times.
✓ Branch 106 taken 24 times.
✗ Branch 107 not taken.
✓ Branch 108 taken 3 times.
✓ Branch 109 taken 21 times.
✓ Branch 110 taken 24 times.
✗ Branch 111 not taken.
✓ Branch 112 taken 5 times.
✓ Branch 113 taken 19 times.
✓ Branch 114 taken 24 times.
✗ Branch 115 not taken.
✓ Branch 116 taken 3 times.
✓ Branch 117 taken 21 times.
✓ Branch 118 taken 24 times.
✗ Branch 119 not taken.
✓ Branch 120 taken 5 times.
✓ Branch 121 taken 19 times.
✓ Branch 122 taken 24 times.
✗ Branch 123 not taken.
✓ Branch 124 taken 5 times.
✓ Branch 125 taken 19 times.
✓ Branch 126 taken 24 times.
✗ Branch 127 not taken.
✓ Branch 128 taken 5 times.
✓ Branch 129 taken 19 times.
✓ Branch 130 taken 24 times.
✗ Branch 131 not taken.
✓ Branch 132 taken 5 times.
✓ Branch 133 taken 19 times.
231 end module conv2d_layer
1036 !!!#############################################################################
1037