GCC Code Coverage Report


Directory: src/lib/
File: src/lib/mod_batchnorm3d_layer.f90
Date: 2024-06-28 12:51:18
Exec Total Coverage
Lines: 148 240 61.7%
Functions: 0 0 -%
Branches: 994 2148 46.3%

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