GCC Code Coverage Report


Directory: src/lib/
File: src/lib/mod_batchnorm2d_layer.f90
Date: 2024-06-28 12:51:18
Exec Total Coverage
Lines: 144 235 61.3%
Functions: 0 0 -%
Branches: 897 1928 46.5%

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 batch normalisation layer
6 !!!#############################################################################
7 module batchnorm2d_layer
8 use constants, only: real12
9 use base_layer, only: batch_layer_type, learnable_layer_type
10 use custom_types, only: initialiser_type
11 implicit none
12
13
14 type, extends(batch_layer_type) :: batchnorm2d_layer_type
15 real(real12), allocatable, dimension(:,:,:,:) :: output
16 real(real12), allocatable, dimension(:,:,:,:) :: di ! gradient of input (i.e. delta)
17 contains
18 procedure, pass(this) :: get_output => get_output_batchnorm2d
19 procedure, pass(this) :: init => init_batchnorm2d
20 procedure, pass(this) :: set_batch_size => set_batch_size_batchnorm2d
21 procedure, pass(this) :: print => print_batchnorm2d
22
23 procedure, pass(this) :: forward => forward_rank
24 procedure, pass(this) :: backward => backward_rank
25 procedure, private, pass(this) :: forward_4d
26 procedure, private, pass(this) :: backward_4d
27
28 procedure, pass(this) :: reduce => layer_reduction
29 procedure, pass(this) :: merge => layer_merge
30 procedure :: add_t_t => layer_add !t = type, r = real, i = int
31 generic :: operator(+) => add_t_t !, public
32 end type batchnorm2d_layer_type
33
34
35 interface batchnorm2d_layer_type
36 module function layer_setup( &
37 input_shape, batch_size, &
38 momentum, epsilon, &
39 gamma_init_mean, gamma_init_std, &
40 beta_init_mean, beta_init_std, &
41 kernel_initialiser, bias_initialiser, &
42 moving_mean_initialiser, moving_variance_initialiser &
43 ) result(layer)
44 integer, dimension(:), optional, intent(in) :: input_shape
45 integer, optional, intent(in) :: batch_size
46 real(real12), optional, intent(in) :: momentum, epsilon
47 real(real12), optional, intent(in) :: gamma_init_mean, gamma_init_std
48 real(real12), optional, intent(in) :: beta_init_mean, beta_init_std
49 character(*), optional, intent(in) :: &
50 kernel_initialiser, bias_initialiser, &
51 moving_mean_initialiser, moving_variance_initialiser
52 type(batchnorm2d_layer_type) :: layer
53 end function layer_setup
54 end interface batchnorm2d_layer_type
55
56
57 private
58 public :: batchnorm2d_layer_type
59 public :: read_batchnorm2d_layer
60
61
62 contains
63
64 !!!#############################################################################
65 !!! layer reduction
66 !!!#############################################################################
67 1 subroutine layer_reduction(this, rhs)
68 implicit none
69 class(batchnorm2d_layer_type), intent(inout) :: this
70 class(learnable_layer_type), intent(in) :: rhs
71
72 select type(rhs)
73 class is(batchnorm2d_layer_type)
74
12/24
✗ 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 taken 1 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 1 times.
✓ Branch 32 taken 1 times.
2 this%dg = this%dg + rhs%dg
75
14/28
✗ 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 taken 1 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✓ Branch 35 taken 1 times.
✓ Branch 36 taken 1 times.
3 this%db = this%db + rhs%db
76 end select
77
78 1 end subroutine layer_reduction
79 !!!#############################################################################
80
81
82 !!!#############################################################################
83 !!! layer addition
84 !!!#############################################################################
85 1 function layer_add(a, b) result(output)
86 implicit none
87 class(batchnorm2d_layer_type), intent(in) :: a, b
88 type(batchnorm2d_layer_type) :: output
89
90
25/50
✓ 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 not taken.
✓ Branch 7 taken 1 times.
✓ 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 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 1 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 1 times.
✗ 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.
1 output = a
91
13/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 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 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✓ Branch 33 taken 1 times.
✓ Branch 34 taken 1 times.
2 output%dg = output%dg + b%dg
92
13/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 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 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✓ Branch 33 taken 1 times.
✓ Branch 34 taken 1 times.
2 output%db = output%db + b%db
93
94
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 end function layer_add
95 !!!#############################################################################
96
97
98 !!!#############################################################################
99 !!! layer merge
100 !!!#############################################################################
101 1 subroutine layer_merge(this, input)
102 implicit none
103 class(batchnorm2d_layer_type), intent(inout) :: this
104 class(learnable_layer_type), intent(in) :: input
105
106 select type(input)
107 class is(batchnorm2d_layer_type)
108
12/24
✗ 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 taken 1 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 1 times.
✓ Branch 32 taken 1 times.
2 this%dg = this%dg + input%dg
109
14/28
✗ 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 taken 1 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✓ Branch 35 taken 1 times.
✓ Branch 36 taken 1 times.
3 this%db = this%db + input%db
110 end select
111
112 1 end subroutine layer_merge
113 !!!#############################################################################
114
115
116 !!!##########################################################################!!!
117 !!! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !!!
118 !!!##########################################################################!!!
119
120
121 !!!#############################################################################
122 !!! get layer outputs
123 !!!#############################################################################
124 4 pure subroutine get_output_batchnorm2d(this, output)
125 implicit none
126 class(batchnorm2d_layer_type), intent(in) :: this
127 real(real12), allocatable, dimension(..), intent(out) :: output
128
129 select rank(output)
130 rank(1)
131
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)])
132 rank(2)
133 output = &
134
11/18
✗ 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 3 times.
✓ Branch 13 taken 1 times.
✓ Branch 14 taken 2 times.
✓ Branch 15 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
6 reshape(this%output, [product(this%output_shape),this%batch_size])
135 rank(4)
136
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 6 times.
✓ Branch 79 taken 2 times.
✓ Branch 80 taken 48 times.
✓ Branch 81 taken 6 times.
✓ Branch 82 taken 384 times.
✓ Branch 83 taken 48 times.
442 output = this%output
137 end select
138
139 4 end subroutine get_output_batchnorm2d
140 !!!#############################################################################
141
142
143 !!!##########################################################################!!!
144 !!! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !!!
145 !!!##########################################################################!!!
146
147
148 !!!#############################################################################
149 !!! forward propagation assumed rank handler
150 !!!#############################################################################
151 2 pure subroutine forward_rank(this, input)
152 implicit none
153 class(batchnorm2d_layer_type), intent(inout) :: this
154 real(real12), dimension(..), intent(in) :: input
155
156 select rank(input); rank(4)
157 2 call forward_4d(this, input)
158 end select
159 2 end subroutine forward_rank
160 !!!#############################################################################
161
162
163 !!!#############################################################################
164 !!! backward propagation assumed rank handler
165 !!!#############################################################################
166 1 pure subroutine backward_rank(this, input, gradient)
167 implicit none
168 class(batchnorm2d_layer_type), intent(inout) :: this
169 real(real12), dimension(..), intent(in) :: input
170 real(real12), dimension(..), intent(in) :: gradient
171
172 select rank(input); rank(4)
173 1 select rank(gradient); rank(4)
174 1 call backward_4d(this, input, gradient)
175 end select
176 end select
177 1 end subroutine backward_rank
178 !!!#############################################################################
179
180
181 !!!##########################################################################!!!
182 !!! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !!!
183 !!!##########################################################################!!!
184
185
186 !!!#############################################################################
187 !!! set up layer
188 !!!#############################################################################
189 4 module function layer_setup( &
190
2/4
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
4 input_shape, batch_size, &
191 momentum, epsilon, &
192 gamma_init_mean, gamma_init_std, &
193 beta_init_mean, beta_init_std, &
194 kernel_initialiser, bias_initialiser, &
195 moving_mean_initialiser, moving_variance_initialiser &
196 ) result(layer)
197 use initialiser, only: get_default_initialiser
198 implicit none
199 integer, dimension(:), optional, intent(in) :: input_shape
200 integer, optional, intent(in) :: batch_size
201 real(real12), optional, intent(in) :: momentum, epsilon
202 real(real12), optional, intent(in) :: gamma_init_mean, gamma_init_std
203 real(real12), optional, intent(in) :: beta_init_mean, beta_init_std
204 character(*), optional, intent(in) :: &
205 kernel_initialiser, bias_initialiser, &
206 moving_mean_initialiser, moving_variance_initialiser
207
208 type(batchnorm2d_layer_type) :: layer
209
210
211
3/8
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 4 times.
4 layer%name = "batchnorm2d"
212 4 layer%input_rank = 3
213 !!--------------------------------------------------------------------------
214 !! initialise batch size
215 !!--------------------------------------------------------------------------
216
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
4 if(present(batch_size)) layer%batch_size = batch_size
217
218
219 !!--------------------------------------------------------------------------
220 !! set up momentum and epsilon
221 !!--------------------------------------------------------------------------
222
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
4 if(present(momentum))then
223 1 layer%momentum = momentum
224 else
225 3 layer%momentum = 0._real12
226 end if
227
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
4 if(present(epsilon))then
228 1 layer%epsilon = epsilon
229 else
230 3 layer%epsilon = 1.E-5_real12
231 end if
232
233
234 !!--------------------------------------------------------------------------
235 !! set up initialiser mean and standard deviations
236 !!--------------------------------------------------------------------------
237
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
4 if(present(gamma_init_mean)) layer%gamma_init_mean = gamma_init_mean
238
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
4 if(present(gamma_init_std)) layer%gamma_init_std = gamma_init_std
239
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
4 if(present(beta_init_mean)) layer%beta_init_mean = beta_init_mean
240
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
4 if(present(beta_init_std)) layer%beta_init_std = beta_init_std
241
242
243 !!--------------------------------------------------------------------------
244 !! define gamma and beta initialisers
245 !!--------------------------------------------------------------------------
246
3/4
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
4 if(present(kernel_initialiser)) layer%kernel_initialiser = kernel_initialiser
247
4/4
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 1 times.
4 if(trim(layer%kernel_initialiser).eq.'') &
248 3 layer%kernel_initialiser = 'ones'
249 !get_default_initialiser("batch")
250 write(*,'("BATCHNORM2D kernel (gamma) initialiser: ",A)') &
251
1/2
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
4 trim(layer%kernel_initialiser)
252
3/4
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
4 if(present(bias_initialiser)) layer%bias_initialiser = bias_initialiser
253
4/4
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 1 times.
4 if(trim(layer%bias_initialiser).eq.'') &
254 3 layer%bias_initialiser = 'zeros'
255 !get_default_initialiser("batch")
256 write(*,'("BATCHNORM2D bias (beta) initialiser: ",A)') &
257
1/2
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
4 trim(layer%bias_initialiser)
258
259
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
4 if(present(moving_mean_initialiser)) &
260
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 layer%moving_mean_initialiser = moving_mean_initialiser
261
4/4
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 1 times.
4 if(trim(layer%moving_mean_initialiser).eq.'') &
262 3 layer%moving_mean_initialiser = 'zeros'
263 !get_default_initialiser("batch")
264 write(*,'("BATCHNORM2D moving mean initialiser: ",A)') &
265
1/2
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
4 trim(layer%moving_mean_initialiser)
266
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
4 if(present(moving_variance_initialiser)) &
267
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 layer%moving_variance_initialiser = moving_variance_initialiser
268
4/4
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 1 times.
4 if(trim(layer%moving_variance_initialiser).eq.'') &
269 3 layer%moving_variance_initialiser = 'ones'
270 !get_default_initialiser("batch")
271 write(*,'("BATCHNORM2D moving variance initialiser: ",A)') &
272
1/2
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
4 trim(layer%moving_variance_initialiser)
273
274
275 !!--------------------------------------------------------------------------
276 !! initialise layer shape
277 !!--------------------------------------------------------------------------
278
6/10
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 3 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 3 times.
4 if(present(input_shape)) call layer%init(input_shape=input_shape)
279
280
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
8 end function layer_setup
281 !!!#############################################################################
282
283
284 !!!#############################################################################
285 !!! initialise layer
286 !!!#############################################################################
287
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 subroutine init_batchnorm2d(this, input_shape, batch_size, verbose)
288 use initialiser, only: initialiser_setup
289 implicit none
290 class(batchnorm2d_layer_type), intent(inout) :: this
291 integer, dimension(:), intent(in) :: input_shape
292 integer, optional, intent(in) :: batch_size
293 integer, optional, intent(in) :: verbose
294
295 integer :: verbose_ = 0
296 6 class(initialiser_type), allocatable :: t_initialiser
297
298
299 !!--------------------------------------------------------------------------
300 !! initialise optional arguments
301 !!--------------------------------------------------------------------------
302
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 if(present(verbose)) verbose_ = verbose
303
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 if(present(batch_size)) this%batch_size = batch_size
304
305
306 !!--------------------------------------------------------------------------
307 !! initialise input shape
308 !!--------------------------------------------------------------------------
309
4/8
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 3 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 3 times.
3 if(.not.allocated(this%input_shape)) call this%set_shape(input_shape)
310
311
312 !!-----------------------------------------------------------------------
313 !! set up number of channels, width, height
314 !!-----------------------------------------------------------------------
315
10/20
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✓ Branch 16 taken 3 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 3 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 3 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 9 times.
✓ Branch 23 taken 3 times.
12 this%output_shape = this%input_shape
316
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
3 this%num_channels = this%input_shape(this%input_rank)
317
318
319 !!-----------------------------------------------------------------------
320 !! allocate mean, variance, gamma, beta, dg, db
321 !!-----------------------------------------------------------------------
322
13/24
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 3 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 3 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 3 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 3 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 3 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 3 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 3 times.
✓ Branch 29 taken 5 times.
✓ Branch 30 taken 3 times.
8 allocate(this%mean(this%num_channels), source=0._real12)
323
18/34
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 3 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 3 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 3 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 3 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 3 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 3 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 3 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 3 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 3 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 3 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 3 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 3 times.
✓ Branch 44 taken 5 times.
✓ Branch 45 taken 3 times.
8 allocate(this%variance, source=this%mean)
324
18/34
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 3 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 3 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 3 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 3 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 3 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 3 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 3 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 3 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 3 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 3 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 3 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 3 times.
✓ Branch 44 taken 5 times.
✓ Branch 45 taken 3 times.
8 allocate(this%gamma, source=this%mean)
325
18/34
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 3 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 3 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 3 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 3 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 3 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 3 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 3 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 3 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 3 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 3 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 3 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 3 times.
✓ Branch 44 taken 5 times.
✓ Branch 45 taken 3 times.
8 allocate(this%beta, source=this%mean)
326
18/34
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 3 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 3 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 3 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 3 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 3 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 3 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 3 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 3 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 3 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 3 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 3 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 3 times.
✓ Branch 44 taken 5 times.
✓ Branch 45 taken 3 times.
8 allocate(this%dg, source=this%mean)
327
18/34
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 3 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 3 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 3 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 3 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 3 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 3 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 3 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 3 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 3 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 3 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 3 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 3 times.
✓ Branch 44 taken 5 times.
✓ Branch 45 taken 3 times.
8 allocate(this%db, source=this%mean)
328
329
330 !!-----------------------------------------------------------------------
331 !! initialise gamma
332 !!-----------------------------------------------------------------------
333
4/8
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 3 times.
✓ Branch 10 taken 3 times.
✗ Branch 11 not taken.
6 allocate(t_initialiser, source=initialiser_setup(this%kernel_initialiser))
334 3 t_initialiser%mean = this%gamma_init_mean
335 3 t_initialiser%std = this%gamma_init_std
336 12 call t_initialiser%initialise(this%gamma, &
337 fan_in =this%num_channels, &
338
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
3 fan_out=this%num_channels)
339
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
3 deallocate(t_initialiser)
340
341 !! initialise beta
342 !!-----------------------------------------------------------------------
343
4/8
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 3 times.
✓ Branch 10 taken 3 times.
✗ Branch 11 not taken.
6 allocate(t_initialiser, source=initialiser_setup(this%bias_initialiser))
344 3 t_initialiser%mean = this%beta_init_mean
345 3 t_initialiser%std = this%beta_init_std
346 12 call t_initialiser%initialise(this%beta, &
347 fan_in =this%num_channels, &
348
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
3 fan_out=this%num_channels)
349
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
3 deallocate(t_initialiser)
350
351
352 !!-----------------------------------------------------------------------
353 !! initialise moving mean
354 !!-----------------------------------------------------------------------
355 allocate(t_initialiser, &
356
4/8
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✓ Branch 9 taken 3 times.
✗ Branch 10 not taken.
6 source=initialiser_setup(this%moving_mean_initialiser))
357 12 call t_initialiser%initialise(this%mean, &
358 fan_in =this%num_channels, &
359
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
3 fan_out=this%num_channels)
360
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
3 deallocate(t_initialiser)
361
362 !! initialise moving variance
363 !!-----------------------------------------------------------------------
364 allocate(t_initialiser, &
365
4/8
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✓ Branch 9 taken 3 times.
✗ Branch 10 not taken.
6 source=initialiser_setup(this%moving_variance_initialiser))
366 12 call t_initialiser%initialise(this%variance, &
367 fan_in =this%num_channels, &
368
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
3 fan_out=this%num_channels)
369
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
3 deallocate(t_initialiser)
370
371
372 !!--------------------------------------------------------------------------
373 !! initialise batch size-dependent arrays
374 !!--------------------------------------------------------------------------
375
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 if(this%batch_size.gt.0) call this%set_batch_size(this%batch_size)
376
377
1/4
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
15 end subroutine init_batchnorm2d
378 !!!#############################################################################
379
380
381 !!!#############################################################################
382 !!! set batch size
383 !!!#############################################################################
384 3 subroutine set_batch_size_batchnorm2d(this, batch_size, verbose)
385 implicit none
386 class(batchnorm2d_layer_type), intent(inout) :: this
387 integer, intent(in) :: batch_size
388 integer, optional, intent(in) :: verbose
389
390 integer :: verbose_ = 0
391
392
393 !!--------------------------------------------------------------------------
394 !! initialise optional arguments
395 !!--------------------------------------------------------------------------
396
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 if(present(verbose)) verbose_ = verbose
397 3 this%batch_size = batch_size
398
399
400 !!--------------------------------------------------------------------------
401 !! set norm
402 !!--------------------------------------------------------------------------
403 this%norm = real( &
404 this%batch_size * &
405
6/10
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
✓ Branch 12 taken 6 times.
✓ Branch 13 taken 3 times.
9 product(this%input_shape(1:this%input_rank-1) ),real12)
406
407
408 !!--------------------------------------------------------------------------
409 !! allocate arrays
410 !!--------------------------------------------------------------------------
411
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 if(allocated(this%input_shape))then
412
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
3 if(allocated(this%output)) deallocate(this%output)
413 allocate(this%output( &
414 6 this%output_shape(1), &
415 6 this%output_shape(2), this%num_channels, &
416 this%batch_size), &
417
41/74
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✓ Branch 6 taken 3 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 3 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 3 times.
✓ Branch 16 taken 3 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 3 times.
✓ Branch 20 taken 3 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 3 times.
✓ Branch 24 taken 3 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 3 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 3 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 3 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 3 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 3 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 3 times.
✗ Branch 40 not taken.
✓ Branch 41 taken 3 times.
✗ Branch 43 not taken.
✓ Branch 44 taken 3 times.
✗ Branch 46 not taken.
✓ Branch 47 taken 3 times.
✗ Branch 49 not taken.
✓ Branch 50 taken 3 times.
✗ Branch 52 not taken.
✓ Branch 53 taken 3 times.
✗ Branch 55 not taken.
✓ Branch 56 taken 3 times.
✗ Branch 58 not taken.
✓ Branch 59 taken 3 times.
✗ Branch 61 not taken.
✓ Branch 62 taken 3 times.
✗ Branch 64 not taken.
✓ Branch 65 taken 3 times.
✗ Branch 67 not taken.
✓ Branch 68 taken 3 times.
✗ Branch 70 not taken.
✓ Branch 71 taken 3 times.
✗ Branch 73 not taken.
✓ Branch 74 taken 3 times.
✗ Branch 76 not taken.
✓ Branch 77 taken 3 times.
✗ Branch 79 not taken.
✓ Branch 80 taken 3 times.
✗ Branch 82 not taken.
✓ Branch 83 taken 3 times.
✗ Branch 85 not taken.
✓ Branch 86 taken 3 times.
✓ Branch 88 taken 3 times.
✓ Branch 89 taken 3 times.
✓ Branch 90 taken 5 times.
✓ Branch 91 taken 3 times.
✓ Branch 92 taken 28 times.
✓ Branch 93 taken 5 times.
✓ Branch 94 taken 200 times.
✓ Branch 95 taken 28 times.
239 source=0._real12)
418
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
3 if(allocated(this%di)) deallocate(this%di)
419
57/106
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✓ Branch 8 taken 3 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 3 times.
✓ Branch 12 taken 3 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 3 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 3 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 3 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 3 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 3 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 3 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 3 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 3 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 3 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 3 times.
✗ Branch 44 not taken.
✓ Branch 45 taken 3 times.
✗ Branch 47 not taken.
✓ Branch 48 taken 3 times.
✗ Branch 50 not taken.
✓ Branch 51 taken 3 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 3 times.
✗ Branch 56 not taken.
✓ Branch 57 taken 3 times.
✗ Branch 59 not taken.
✓ Branch 60 taken 3 times.
✗ Branch 62 not taken.
✓ Branch 63 taken 3 times.
✗ Branch 65 not taken.
✓ Branch 66 taken 3 times.
✗ Branch 68 not taken.
✓ Branch 69 taken 3 times.
✗ Branch 71 not taken.
✓ Branch 72 taken 3 times.
✗ Branch 74 not taken.
✓ Branch 75 taken 3 times.
✗ Branch 77 not taken.
✓ Branch 78 taken 3 times.
✗ Branch 80 not taken.
✓ Branch 81 taken 3 times.
✗ Branch 83 not taken.
✓ Branch 84 taken 3 times.
✗ Branch 86 not taken.
✓ Branch 87 taken 3 times.
✗ Branch 89 not taken.
✓ Branch 90 taken 3 times.
✗ Branch 92 not taken.
✓ Branch 93 taken 3 times.
✗ Branch 95 not taken.
✓ Branch 96 taken 3 times.
✗ Branch 98 not taken.
✓ Branch 99 taken 3 times.
✗ Branch 101 not taken.
✓ Branch 102 taken 3 times.
✗ Branch 104 not taken.
✓ Branch 105 taken 3 times.
✗ Branch 107 not taken.
✓ Branch 108 taken 3 times.
✗ Branch 110 not taken.
✓ Branch 111 taken 3 times.
✗ Branch 113 not taken.
✓ Branch 114 taken 3 times.
✗ Branch 116 not taken.
✓ Branch 117 taken 3 times.
✗ Branch 119 not taken.
✓ Branch 120 taken 3 times.
✗ Branch 122 not taken.
✓ Branch 123 taken 3 times.
✗ Branch 125 not taken.
✓ Branch 126 taken 3 times.
✗ Branch 128 not taken.
✓ Branch 129 taken 3 times.
✗ Branch 131 not taken.
✓ Branch 132 taken 3 times.
✗ Branch 134 not taken.
✓ Branch 135 taken 3 times.
✓ Branch 137 taken 3 times.
✓ Branch 138 taken 3 times.
✓ Branch 139 taken 5 times.
✓ Branch 140 taken 3 times.
✓ Branch 141 taken 28 times.
✓ Branch 142 taken 5 times.
✓ Branch 143 taken 200 times.
✓ Branch 144 taken 28 times.
239 allocate(this%di, source=this%output)
420 end if
421
422 3 end subroutine set_batch_size_batchnorm2d
423 !!!#############################################################################
424
425
426 !!!##########################################################################!!!
427 !!! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !!!
428 !!!##########################################################################!!!
429
430
431 !!!#############################################################################
432 !!! print layer to file
433 !!!#############################################################################
434 subroutine print_batchnorm2d(this, file)
435 implicit none
436 class(batchnorm2d_layer_type), intent(in) :: this
437 character(*), intent(in) :: file
438
439 integer :: unit
440 integer :: m
441
442 !! open file with new unit
443 !!--------------------------------------------------------------------------
444 open(newunit=unit, file=trim(file), access='append')
445
446 !! write convolution initial parameters
447 !!--------------------------------------------------------------------------
448 write(unit,'("BATCHNORM2D")')
449 write(unit,'(3X,"INPUT_SHAPE = ",3(1X,I0))') this%input_shape
450 write(unit,'(3X,"MOMENTUM = ",F0.9)') this%momentum
451 write(unit,'(3X,"EPSILON = ",F0.9)') this%epsilon
452 write(unit,'(3X,"NUM_CHANNELS = ",I0)') this%num_channels
453 write(unit,'("GAMMA")')
454 do m=1,this%num_channels
455 write(unit,'(5(E16.8E2))') this%gamma(m)
456 end do
457 write(unit,'("END GAMMA")')
458 write(unit,'("BETA")')
459 do m=1,this%num_channels
460 write(unit,'(5(E16.8E2))') this%beta(m)
461 end do
462 write(unit,'("END BETA")')
463 write(unit,'("END BATCHNORM2D")')
464
465 !! close unit
466 !!--------------------------------------------------------------------------
467 close(unit)
468
469 end subroutine print_batchnorm2d
470 !!!#############################################################################
471
472
473 !!!#############################################################################
474 !!! read layer from file
475 !!!#############################################################################
476 function read_batchnorm2d_layer(unit, verbose) result(layer)
477 use infile_tools, only: assign_val, assign_vec
478 use misc, only: to_lower, icount
479 implicit none
480 integer, intent(in) :: unit
481 integer, optional, intent(in) :: verbose
482
483 class(batchnorm2d_layer_type), allocatable :: layer
484
485 integer :: stat, verbose_ = 0
486 integer :: itmp1, c, i, j, k
487 integer :: num_channels
488 real(real12) :: momentum = 0._real12, epsilon = 1.E-5_real12
489 logical :: found_gamma=.false., found_beta=.false.
490 character(14) :: kernel_initialiser='', bias_initialiser=''
491 character(256) :: buffer, tag
492
493 integer, dimension(3) :: input_shape
494 real(real12), allocatable, dimension(:) :: data_list
495
496
497 !!--------------------------------------------------------------------------
498 !! initialise optional arguments
499 !!--------------------------------------------------------------------------
500 if(present(verbose)) verbose_ = verbose
501
502
503 !!--------------------------------------------------------------------------
504 !! loop over tags in layer card
505 !!--------------------------------------------------------------------------
506 tag_loop: do
507
508 !! check for end of file
509 read(unit,'(A)',iostat=stat) buffer
510 if(stat.ne.0)then
511 write(0,*) "ERROR: file encountered error (EoF?) before END BATCHNORM2D"
512 stop "Exiting..."
513 end if
514 if(trim(adjustl(buffer)).eq."") cycle tag_loop
515
516 !! check for end of convolution card
517 if(trim(adjustl(buffer)).eq."END BATCHNORM2D")then
518 backspace(unit)
519 exit tag_loop
520 end if
521
522 tag=trim(adjustl(buffer))
523 if(scan(buffer,"=").ne.0) tag=trim(tag(:scan(tag,"=")-1))
524
525 !! read parameters from save file
526 select case(trim(tag))
527 case("INPUT_SHAPE")
528 call assign_vec(buffer, input_shape, itmp1)
529 case("MOMENTUM")
530 call assign_val(buffer, momentum, itmp1)
531 case("EPSILON")
532 call assign_val(buffer, epsilon, itmp1)
533 case("KERNEL_INITIALISER")
534 call assign_val(buffer, kernel_initialiser, itmp1)
535 case("BIAS_INITIALISER")
536 call assign_val(buffer, bias_initialiser, itmp1)
537 case("GAMMA")
538 found_gamma = .true.
539 kernel_initialiser = 'zeros'
540 bias_initialiser = 'zeros'
541 exit tag_loop
542 case("beta")
543 found_beta = .true.
544 kernel_initialiser = 'zeros'
545 bias_initialiser = 'zeros'
546 exit tag_loop
547 case default
548 !! don't look for "e" due to scientific notation of numbers
549 !! ... i.e. exponent (E+00)
550 if(scan(to_lower(trim(adjustl(buffer))),&
551 'abcdfghijklmnopqrstuvwxyz').eq.0)then
552 cycle tag_loop
553 elseif(tag(:3).eq.'END')then
554 cycle tag_loop
555 end if
556 stop "Unrecognised line in input file: "//trim(adjustl(buffer))
557 end select
558 end do tag_loop
559
560
561 !!--------------------------------------------------------------------------
562 !! set transfer activation function
563 !!--------------------------------------------------------------------------
564 num_channels = input_shape(size(input_shape,1))
565 layer = batchnorm2d_layer_type( input_shape=input_shape, &
566 momentum = momentum, epsilon = epsilon &
567 )
568
569
570 !!--------------------------------------------------------------------------
571 !! check if WEIGHTS card was found
572 !!--------------------------------------------------------------------------
573 allocate(data_list(num_channels), source=0._real12)
574 do i=1,2
575 if(found_gamma.or.found_beta)then
576 c = 1
577 k = 1
578 data_list = 0._real12
579 data_concat_loop: do while(c.le.num_channels)
580 read(unit,'(A)',iostat=stat) buffer
581 if(stat.ne.0) exit data_concat_loop
582 k = icount(buffer)
583 read(buffer,*,iostat=stat) (data_list(j),j=c,c+k-1)
584 c = c + k
585 end do data_concat_loop
586 if(found_gamma)then
587 layer%gamma = data_list
588 found_gamma = .false.
589 elseif(found_beta)then
590 layer%beta = data_list
591 found_beta = .false.
592 end if
593 read(unit,'(A)',iostat=stat) buffer
594 if(index(trim(adjustl(buffer)),"GAMMA").eq.1) found_gamma = .true.
595 if(index(trim(adjustl(buffer)),"BETA").eq.1) found_beta = .true.
596 end if
597 end do
598 deallocate(data_list)
599
600
601 !! check for end of layer card
602 !!-----------------------------------------------------------------------
603 read(unit,'(A)') buffer
604 if(trim(adjustl(buffer)).ne."END BATCHNORM2D")then
605 write(*,*) trim(adjustl(buffer))
606 stop "ERROR: END BATCHNORM2D not where expected"
607 end if
608
609 end function read_batchnorm2d_layer
610 !!!#############################################################################
611
612
613 !!!##########################################################################!!!
614 !!! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !!!
615 !!!##########################################################################!!!
616
617
618 !!!#############################################################################
619 !!! forward propagation
620 !!!#############################################################################
621 10 pure subroutine forward_4d(this, input)
622 implicit none
623 class(batchnorm2d_layer_type), intent(inout) :: this
624
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
2 real(real12), dimension( &
625
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
2 this%input_shape(1), &
626 this%input_shape(2), &
627 this%num_channels, this%batch_size), &
628 intent(in) :: input
629
630 integer :: m
631 4 real(real12), dimension(this%num_channels) :: t_mean, t_variance
632
633
634 2 select case(this%inference)
635 case(.true.)
636 do concurrent(m=1:this%num_channels)
637 !! normalize each feature
638 this%output(:,:,m,:) = this%gamma(m) * (input(:,:,m,:) - this%mean(m)) / &
639 sqrt( &
640 this%batch_size / (this%batch_size - 1) * this%variance(m) + &
641 this%epsilon) + &
642 this%beta(m)
643 end do
644 case default
645
5/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 taken 6 times.
✓ Branch 10 taken 2 times.
8 t_mean = 0._real12
646
5/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 taken 6 times.
✓ Branch 10 taken 2 times.
8 t_variance = 0._real12
647
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 do concurrent(m=1:this%num_channels)
648 !! calculate current mean and variance
649
19/32
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 6 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 6 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 6 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 6 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 6 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 6 times.
✓ Branch 33 taken 6 times.
✓ Branch 34 taken 6 times.
✓ Branch 35 taken 48 times.
✓ Branch 36 taken 6 times.
✓ Branch 37 taken 384 times.
✓ Branch 38 taken 48 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 6 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 6 times.
444 t_mean(m) = sum(input(:,:,m,:)) / this%norm
650
21/36
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 6 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 6 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 6 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 6 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 6 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 6 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 6 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 6 times.
✓ Branch 39 taken 6 times.
✓ Branch 40 taken 6 times.
✓ Branch 41 taken 48 times.
✓ Branch 42 taken 6 times.
✓ Branch 43 taken 384 times.
✓ Branch 44 taken 48 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 6 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 6 times.
444 t_variance(m) = sum((input(:,:,m,:) - t_mean(m))**2._real12) / this%norm
651
652 !! CONVERT TO USING inverse square root of variance (i.e. inverse std)
653 !! would also need to include epsilon in the sqrt denominator
654
655 !! update running averages
656
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 if(this%momentum.gt.1.E-8_real12)then
657 this%mean(m) = this%momentum * this%mean(m) + &
658 (1._real12 - this%momentum) * t_mean(m)
659 this%variance(m) = this%momentum * this%variance(m) + &
660 (1._real12 - this%momentum) * t_variance(m)
661 else
662
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 6 times.
6 this%mean(m) = t_mean(m)
663
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 6 times.
6 this%variance(m) = t_variance(m)
664 end if
665
666 !! normalize each feature
667
1/2
✗ Branch 10 not taken.
✓ Branch 11 taken 6 times.
6 this%output(:,:,m,:) = this%gamma(m) * (input(:,:,m,:) - this%mean(m)) / &
668
43/78
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 6 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 6 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 6 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 6 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 6 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 6 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 6 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 6 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 6 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 6 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 6 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 6 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 6 times.
✗ Branch 44 not taken.
✓ Branch 45 taken 6 times.
✗ Branch 47 not taken.
✓ Branch 48 taken 6 times.
✗ Branch 50 not taken.
✓ Branch 51 taken 6 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 6 times.
✗ Branch 56 not taken.
✓ Branch 57 taken 6 times.
✗ Branch 59 not taken.
✓ Branch 60 taken 6 times.
✗ Branch 62 not taken.
✓ Branch 63 taken 6 times.
✗ Branch 65 not taken.
✓ Branch 66 taken 6 times.
✗ Branch 68 not taken.
✓ Branch 69 taken 6 times.
✗ Branch 71 not taken.
✓ Branch 72 taken 6 times.
✗ Branch 74 not taken.
✓ Branch 75 taken 6 times.
✗ Branch 77 not taken.
✓ Branch 78 taken 6 times.
✗ Branch 80 not taken.
✓ Branch 81 taken 6 times.
✗ Branch 83 not taken.
✓ Branch 84 taken 6 times.
✗ Branch 86 not taken.
✓ Branch 87 taken 6 times.
✗ Branch 89 not taken.
✓ Branch 90 taken 6 times.
✗ Branch 91 not taken.
✓ Branch 92 taken 6 times.
✗ Branch 94 not taken.
✓ Branch 95 taken 6 times.
✓ Branch 97 taken 6 times.
✓ Branch 98 taken 6 times.
✓ Branch 99 taken 48 times.
✓ Branch 100 taken 6 times.
✓ Branch 101 taken 384 times.
✓ Branch 102 taken 48 times.
452 sqrt(this%variance(m) + this%epsilon) + this%beta(m)
669
670 end do
671 end select
672
673 2 end subroutine forward_4d
674 !!!#############################################################################
675
676
677 !!!#############################################################################
678 !!! backward propagation
679 !!!#############################################################################
680 9 pure subroutine backward_4d(this, input, gradient)
681 implicit none
682 class(batchnorm2d_layer_type), intent(inout) :: this
683
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 real(real12), dimension( &
684
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 this%input_shape(1), &
685 this%input_shape(2), &
686 this%num_channels,this%batch_size), &
687 intent(in) :: input
688
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 real(real12), dimension( &
689
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 this%output_shape(1), &
690 this%output_shape(2), &
691 this%num_channels,this%batch_size), &
692 intent(in) :: gradient
693
694 integer :: m
695 4 real(real12), dimension( &
696 4 this%input_shape(1), &
697 this%input_shape(2), &
698
8/16
✗ 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.
1 this%num_channels,this%batch_size) :: x_hat, dx_hat
699
700
701 1 do concurrent(m=1:this%num_channels)
702 !! recalculate x_hat (i.e. normalised input)
703
2/4
✗ Branch 22 not taken.
✓ Branch 23 taken 3 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 3 times.
6 x_hat(:,:,m,:) = (input(:,:,m,:) - this%mean(m)) / &
704
33/60
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 3 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 3 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 3 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 3 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 3 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 3 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 3 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 3 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 3 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 3 times.
✗ Branch 34 not taken.
✓ Branch 35 taken 3 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 3 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 3 times.
✗ Branch 40 not taken.
✓ Branch 41 taken 3 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 3 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 3 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 3 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 3 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 3 times.
✗ Branch 56 not taken.
✓ Branch 57 taken 3 times.
✓ Branch 58 taken 3 times.
✓ Branch 59 taken 3 times.
✓ Branch 60 taken 24 times.
✓ Branch 61 taken 3 times.
✓ Branch 62 taken 192 times.
✓ Branch 63 taken 24 times.
228 sqrt(this%variance(m) + this%epsilon)
705
706 !! calculate gradient of normalised input
707
33/60
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 3 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 3 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 3 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 3 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 3 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 3 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 3 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 3 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 3 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 3 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 3 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 3 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 3 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 3 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 3 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 3 times.
✗ Branch 66 not taken.
✓ Branch 67 taken 3 times.
✗ Branch 69 not taken.
✓ Branch 70 taken 3 times.
✗ Branch 72 not taken.
✓ Branch 73 taken 3 times.
✗ Branch 75 not taken.
✓ Branch 76 taken 3 times.
✗ Branch 78 not taken.
✓ Branch 79 taken 3 times.
✓ Branch 81 taken 3 times.
✓ Branch 82 taken 3 times.
✓ Branch 83 taken 24 times.
✓ Branch 84 taken 3 times.
✓ Branch 85 taken 192 times.
✓ Branch 86 taken 24 times.
222 dx_hat(:,:,m,:) = gradient(:,:,m,:) * this%gamma(m)
708
709 !! calculate gradient of inputs
710 51 this%di(:,:,m,:) = &
711 6 1._real12 / (this%norm * sqrt(this%variance(m) + this%epsilon)) * &
712
1/2
✗ Branch 10 not taken.
✓ Branch 11 taken 3 times.
3 ( this%norm * dx_hat(:,:,m,:) - &
713
2/4
✗ Branch 22 not taken.
✓ Branch 23 taken 3 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 3 times.
6 sum(dx_hat(:,:,m,:)) - x_hat(:,:,m,:) * &
714
95/172
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 3 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 3 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 3 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 3 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 3 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 3 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 3 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 3 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 3 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 3 times.
✗ Branch 34 not taken.
✓ Branch 35 taken 3 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 3 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 3 times.
✗ Branch 40 not taken.
✓ Branch 41 taken 3 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 3 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 3 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 3 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 3 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 3 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 3 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 3 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 3 times.
✗ Branch 66 not taken.
✓ Branch 67 taken 3 times.
✗ Branch 69 not taken.
✓ Branch 70 taken 3 times.
✗ Branch 72 not taken.
✓ Branch 73 taken 3 times.
✗ Branch 75 not taken.
✓ Branch 76 taken 3 times.
✗ Branch 78 not taken.
✓ Branch 79 taken 3 times.
✗ Branch 81 not taken.
✓ Branch 82 taken 3 times.
✗ Branch 84 not taken.
✓ Branch 85 taken 3 times.
✗ Branch 87 not taken.
✓ Branch 88 taken 3 times.
✗ Branch 90 not taken.
✓ Branch 91 taken 3 times.
✗ Branch 93 not taken.
✓ Branch 94 taken 3 times.
✗ Branch 95 not taken.
✓ Branch 96 taken 3 times.
✗ Branch 97 not taken.
✓ Branch 98 taken 3 times.
✗ Branch 99 not taken.
✓ Branch 100 taken 3 times.
✗ Branch 101 not taken.
✓ Branch 102 taken 3 times.
✗ Branch 103 not taken.
✓ Branch 104 taken 3 times.
✗ Branch 105 not taken.
✓ Branch 106 taken 3 times.
✗ Branch 107 not taken.
✓ Branch 108 taken 3 times.
✗ Branch 109 not taken.
✓ Branch 110 taken 3 times.
✗ Branch 111 not taken.
✓ Branch 112 taken 3 times.
✓ Branch 113 taken 3 times.
✓ Branch 114 taken 3 times.
✓ Branch 115 taken 24 times.
✓ Branch 116 taken 3 times.
✓ Branch 117 taken 192 times.
✓ Branch 118 taken 24 times.
✗ Branch 119 not taken.
✓ Branch 120 taken 3 times.
✗ Branch 122 not taken.
✓ Branch 123 taken 3 times.
✗ Branch 125 not taken.
✓ Branch 126 taken 3 times.
✗ Branch 128 not taken.
✓ Branch 129 taken 3 times.
✗ Branch 131 not taken.
✓ Branch 132 taken 3 times.
✗ Branch 134 not taken.
✓ Branch 135 taken 3 times.
✗ Branch 137 not taken.
✓ Branch 138 taken 3 times.
✗ Branch 140 not taken.
✓ Branch 141 taken 3 times.
✗ Branch 143 not taken.
✓ Branch 144 taken 3 times.
✗ Branch 146 not taken.
✓ Branch 147 taken 3 times.
✗ Branch 149 not taken.
✓ Branch 150 taken 3 times.
✗ Branch 152 not taken.
✓ Branch 153 taken 3 times.
✗ Branch 155 not taken.
✓ Branch 156 taken 3 times.
✗ Branch 158 not taken.
✓ Branch 159 taken 3 times.
✗ Branch 161 not taken.
✓ Branch 162 taken 3 times.
✗ Branch 164 not taken.
✓ Branch 165 taken 3 times.
✗ Branch 167 not taken.
✓ Branch 168 taken 3 times.
✗ Branch 170 not taken.
✓ Branch 171 taken 3 times.
✗ Branch 173 not taken.
✓ Branch 174 taken 3 times.
✗ Branch 176 not taken.
✓ Branch 177 taken 3 times.
✗ Branch 179 not taken.
✓ Branch 180 taken 3 times.
✗ Branch 182 not taken.
✓ Branch 183 taken 3 times.
✗ Branch 185 not taken.
✓ Branch 186 taken 3 times.
✗ Branch 188 not taken.
✓ Branch 189 taken 3 times.
✗ Branch 191 not taken.
✓ Branch 192 taken 3 times.
✓ Branch 194 taken 3 times.
✓ Branch 195 taken 3 times.
✓ Branch 196 taken 24 times.
✓ Branch 197 taken 3 times.
✓ Branch 198 taken 192 times.
✓ Branch 199 taken 24 times.
✗ Branch 200 not taken.
✓ Branch 201 taken 3 times.
✗ Branch 202 not taken.
✓ Branch 203 taken 3 times.
✗ Branch 204 not taken.
✓ Branch 205 taken 3 times.
✗ Branch 207 not taken.
✓ Branch 208 taken 3 times.
✓ Branch 210 taken 3 times.
✓ Branch 211 taken 3 times.
✓ Branch 212 taken 24 times.
✓ Branch 213 taken 3 times.
✓ Branch 214 taken 192 times.
✓ Branch 215 taken 24 times.
669 sum(dx_hat(:,:,m,:) * x_hat(:,:,m,:)))
715
716 !! calculate gradient of gamma and beta
717
33/60
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 3 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 3 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 3 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 3 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 3 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 3 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 3 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 3 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 3 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 3 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 3 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 3 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 3 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 3 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 3 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 3 times.
✗ Branch 66 not taken.
✓ Branch 67 taken 3 times.
✗ Branch 69 not taken.
✓ Branch 70 taken 3 times.
✗ Branch 72 not taken.
✓ Branch 73 taken 3 times.
✓ Branch 75 taken 3 times.
✓ Branch 76 taken 3 times.
✓ Branch 77 taken 24 times.
✓ Branch 78 taken 3 times.
✓ Branch 79 taken 192 times.
✓ Branch 80 taken 24 times.
✗ Branch 81 not taken.
✓ Branch 82 taken 3 times.
✗ Branch 84 not taken.
✓ Branch 85 taken 3 times.
222 this%dg(m) = sum(gradient(:,:,m,:) * x_hat(:,:,m,:))
718
21/34
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 3 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 3 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 3 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 3 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 3 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 3 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 3 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 3 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 3 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 3 times.
✓ Branch 35 taken 3 times.
✓ Branch 36 taken 3 times.
✓ Branch 37 taken 24 times.
✓ Branch 38 taken 3 times.
✓ Branch 39 taken 192 times.
✓ Branch 40 taken 24 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 3 times.
✗ Branch 44 not taken.
✓ Branch 45 taken 3 times.
223 this%db(m) = sum(gradient(:,:,m,:))
719 end do
720
721 1 end subroutine backward_4d
722 !!!#############################################################################
723
724
66/106
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 7 times.
✓ Branch 5 taken 3 times.
✓ Branch 6 taken 5 times.
✓ Branch 7 taken 6 times.
✓ Branch 8 taken 1 times.
✓ Branch 9 taken 9 times.
✓ Branch 10 taken 2 times.
✓ Branch 11 taken 4 times.
✓ Branch 12 taken 5 times.
✓ Branch 13 taken 4 times.
✓ Branch 14 taken 5 times.
✓ Branch 15 taken 4 times.
✓ Branch 16 taken 5 times.
✓ Branch 17 taken 4 times.
✓ Branch 18 taken 4 times.
✓ Branch 19 taken 4 times.
✓ Branch 20 taken 4 times.
✓ Branch 21 taken 4 times.
✓ Branch 22 taken 4 times.
✓ Branch 23 taken 4 times.
✓ Branch 24 taken 4 times.
✓ Branch 25 taken 4 times.
✓ Branch 26 taken 4 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✓ Branch 40 taken 2 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 2 times.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✓ Branch 48 taken 2 times.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 55 not taken.
✗ Branch 56 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 2 times.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
✓ Branch 70 taken 2 times.
✓ Branch 71 taken 2 times.
✗ Branch 72 not taken.
✓ Branch 73 taken 1 times.
✓ Branch 74 taken 1 times.
✓ Branch 75 taken 2 times.
✗ Branch 76 not taken.
✓ Branch 77 taken 1 times.
✓ Branch 78 taken 1 times.
✓ Branch 79 taken 2 times.
✗ Branch 80 not taken.
✓ Branch 81 taken 2 times.
✗ Branch 82 not taken.
✗ Branch 83 not taken.
✗ Branch 84 not taken.
✓ Branch 86 taken 2 times.
✗ Branch 87 not taken.
✓ Branch 88 taken 1 times.
✓ Branch 89 taken 1 times.
✓ Branch 90 taken 2 times.
✗ Branch 91 not taken.
✓ Branch 92 taken 1 times.
✓ Branch 93 taken 1 times.
✓ Branch 94 taken 2 times.
✗ Branch 95 not taken.
✓ Branch 96 taken 1 times.
✓ Branch 97 taken 1 times.
✓ Branch 98 taken 2 times.
✗ Branch 99 not taken.
✓ Branch 100 taken 1 times.
✓ Branch 101 taken 1 times.
✓ Branch 102 taken 2 times.
✗ Branch 103 not taken.
✓ Branch 104 taken 1 times.
✓ Branch 105 taken 1 times.
✓ Branch 106 taken 2 times.
✗ Branch 107 not taken.
✓ Branch 108 taken 1 times.
✓ Branch 109 taken 1 times.
✓ Branch 110 taken 2 times.
✗ Branch 111 not taken.
✓ Branch 112 taken 1 times.
✓ Branch 113 taken 1 times.
✓ Branch 114 taken 2 times.
✗ Branch 115 not taken.
✓ Branch 116 taken 1 times.
✓ Branch 117 taken 1 times.
32 end module batchnorm2d_layer
725 !!!#############################################################################
726