GCC Code Coverage Report


Directory: src/lib/
File: src/lib/mod_dropout_layer.f90
Date: 2024-06-28 12:51:18
Exec Total Coverage
Lines: 61 99 61.6%
Functions: 0 0 -%
Branches: 240 566 42.4%

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 dropout layer
6 !!!#############################################################################
7 !!! Dropout reference: ...
8 !!! ... https://www.cs.toronto.edu/~rsalakhu/papers/srivastava14a.pdf
9 !!!#############################################################################
10 module dropout_layer
11 use constants, only: real12
12 use base_layer, only: drop_layer_type
13 implicit none
14
15
16 type, extends(drop_layer_type) :: dropout_layer_type
17 !! num_masks -- number of unique masks = number of samples in batch
18 !! idx -- temp index of sample (doesn't need to be accurate)
19 !! keep_prob -- typical = 0.75-0.95
20 integer :: idx = 0
21 integer :: num_masks
22 logical, allocatable, dimension(:,:) :: mask
23 real(real12), allocatable, dimension(:,:) :: output
24 real(real12), allocatable, dimension(:,:) :: di ! gradient of input (i.e. delta)
25 contains
26 procedure, pass(this) :: get_output => get_output_dropout
27 procedure, pass(this) :: init => init_dropout
28 procedure, pass(this) :: set_batch_size => set_batch_size_dropout
29 procedure, pass(this) :: print => print_dropout
30 procedure, pass(this) :: forward => forward_rank
31 procedure, pass(this) :: backward => backward_rank
32 procedure, private, pass(this) :: forward_2d
33 procedure, private, pass(this) :: backward_2d
34 procedure, pass(this) :: generate_mask => generate_dropout_mask
35 end type dropout_layer_type
36
37
38 interface dropout_layer_type
39 module function layer_setup( &
40 rate, num_masks, &
41 input_shape, batch_size) result(layer)
42 integer, intent(in) :: num_masks
43 real(real12), intent(in) :: rate
44 integer, dimension(:), optional, intent(in) :: input_shape
45 integer, optional, intent(in) :: batch_size
46 type(dropout_layer_type) :: layer
47 end function layer_setup
48 end interface dropout_layer_type
49
50
51 private
52 public :: dropout_layer_type
53 public :: read_dropout_layer
54
55
56 contains
57
58 !!!#############################################################################
59 !!! get layer outputs
60 !!!#############################################################################
61 3 pure subroutine get_output_dropout(this, output)
62 implicit none
63 class(dropout_layer_type), intent(in) :: this
64 real(real12), allocatable, dimension(..), intent(out) :: output
65
66 select rank(output)
67 rank(1)
68
7/10
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 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.
4 output = reshape(this%output, [size(this%output)])
69 rank(2)
70
18/36
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 12 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 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✓ Branch 30 taken 2 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 2 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 2 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 2 times.
✓ Branch 41 taken 2 times.
✓ Branch 42 taken 12 times.
✓ Branch 43 taken 2 times.
16 output = this%output
71 end select
72
73 3 end subroutine get_output_dropout
74 !!!#############################################################################
75
76
77 !!!##########################################################################!!!
78 !!! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !!!
79 !!!##########################################################################!!!
80
81
82 !!!#############################################################################
83 !!! forward propagation assumed rank handler
84 !!!#############################################################################
85 1 pure subroutine forward_rank(this, input)
86 implicit none
87 class(dropout_layer_type), intent(inout) :: this
88 real(real12), dimension(..), intent(in) :: input
89
90 select rank(input); rank(2)
91 1 call forward_2d(this, input)
92 end select
93 1 end subroutine forward_rank
94 !!!#############################################################################
95
96
97 !!!#############################################################################
98 !!! backward propagation assumed rank handler
99 !!!#############################################################################
100 1 pure subroutine backward_rank(this, input, gradient)
101 implicit none
102 class(dropout_layer_type), intent(inout) :: this
103 real(real12), dimension(..), intent(in) :: input
104 real(real12), dimension(..), intent(in) :: gradient
105
106 select rank(input); rank(2)
107 1 select rank(gradient); rank(2)
108 1 call backward_2d(this, input, gradient)
109 end select
110 end select
111 1 end subroutine backward_rank
112 !!!#############################################################################
113
114
115 !!!##########################################################################!!!
116 !!! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !!!
117 !!!##########################################################################!!!
118
119
120 !!!#############################################################################
121 !!! set up layer
122 !!!#############################################################################
123 2 module function layer_setup( &
124 rate, num_masks, &
125
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 input_shape, batch_size) result(layer)
126 implicit none
127 integer, intent(in) :: num_masks
128 real(real12), intent(in) :: rate
129 integer, dimension(:), optional, intent(in) :: input_shape
130 integer, optional, intent(in) :: batch_size
131
132 type(dropout_layer_type) :: layer
133
134
135
3/8
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
2 layer%name = "dropout"
136 2 layer%input_rank = 1
137 !!--------------------------------------------------------------------------
138 !! initialise batch size
139 !!--------------------------------------------------------------------------
140
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 if(present(batch_size)) layer%batch_size = batch_size
141
142
143 !!--------------------------------------------------------------------------
144 !! initialise layer rate and number of masks
145 !!--------------------------------------------------------------------------
146 2 layer%num_masks = num_masks
147 2 layer%rate = rate
148
149
150 !!--------------------------------------------------------------------------
151 !! initialise layer shape
152 !!--------------------------------------------------------------------------
153
5/10
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
2 if(present(input_shape)) call layer%init(input_shape=input_shape)
154
155
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
4 end function layer_setup
156 !!!#############################################################################
157
158
159 !!!#############################################################################
160 !!! initialise layer
161 !!!#############################################################################
162
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 subroutine init_dropout(this, input_shape, batch_size, verbose)
163 implicit none
164 class(dropout_layer_type), intent(inout) :: this
165 integer, dimension(:), intent(in) :: input_shape
166 integer, optional, intent(in) :: batch_size
167 integer, optional, intent(in) :: verbose
168
169 integer :: verbose_ = 0
170
171
172 !!--------------------------------------------------------------------------
173 !! initialise optional arguments
174 !!--------------------------------------------------------------------------
175
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if(present(verbose)) verbose_ = verbose
176
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if(present(batch_size)) this%batch_size = batch_size
177
178
179 !!--------------------------------------------------------------------------
180 !! initialise input shape
181 !!--------------------------------------------------------------------------
182
4/8
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
2 if(.not.allocated(this%input_shape)) call this%set_shape(input_shape)
183
184
185 !!-----------------------------------------------------------------------
186 !! set up number of channels, width, height
187 !!-----------------------------------------------------------------------
188
10/20
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 2 times.
✓ Branch 23 taken 2 times.
4 this%output_shape = this%input_shape
189
190
191 !!-----------------------------------------------------------------------
192 !! allocate mask
193 !!-----------------------------------------------------------------------
194
23/42
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 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 taken 2 times.
✓ Branch 52 taken 2 times.
✓ Branch 53 taken 12 times.
✓ Branch 54 taken 2 times.
16 allocate(this%mask(this%input_shape(1), this%num_masks), source=.true.)
195
196
197 !!-----------------------------------------------------------------------
198 !! generate mask
199 !!-----------------------------------------------------------------------
200 2 call this%generate_mask()
201
202
203 !!--------------------------------------------------------------------------
204 !! initialise batch size-dependent arrays
205 !!--------------------------------------------------------------------------
206
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 if(this%batch_size.gt.0) call this%set_batch_size(this%batch_size)
207
208 2 end subroutine init_dropout
209 !!!#############################################################################
210
211
212 !!!#############################################################################
213 !!! set batch size
214 !!!#############################################################################
215 2 subroutine set_batch_size_dropout(this, batch_size, verbose)
216 implicit none
217 class(dropout_layer_type), intent(inout) :: this
218 integer, intent(in) :: batch_size
219 integer, optional, intent(in) :: verbose
220
221 integer :: verbose_ = 0
222
223
224 !!--------------------------------------------------------------------------
225 !! initialise optional arguments
226 !!--------------------------------------------------------------------------
227
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if(present(verbose)) verbose_ = verbose
228 2 this%batch_size = batch_size
229
230
231 !!--------------------------------------------------------------------------
232 !! allocate arrays
233 !!--------------------------------------------------------------------------
234
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 if(allocated(this%input_shape))then
235
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2 if(allocated(this%output)) deallocate(this%output)
236 allocate(this%output( &
237 4 this%output_shape(1), &
238
23/42
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 2 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 2 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 2 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 2 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 2 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 2 times.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✗ Branch 47 not taken.
✓ Branch 48 taken 2 times.
✓ Branch 50 taken 2 times.
✓ Branch 51 taken 2 times.
✓ Branch 52 taken 12 times.
✓ Branch 53 taken 2 times.
16 this%batch_size), source=0._real12)
239
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2 if(allocated(this%di)) deallocate(this%di)
240
31/58
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✓ Branch 11 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 63 not taken.
✓ Branch 64 taken 2 times.
✗ Branch 66 not taken.
✓ Branch 67 taken 2 times.
✗ Branch 69 not taken.
✓ Branch 70 taken 2 times.
✗ Branch 72 not taken.
✓ Branch 73 taken 2 times.
✓ Branch 75 taken 2 times.
✓ Branch 76 taken 2 times.
✓ Branch 77 taken 12 times.
✓ Branch 78 taken 2 times.
16 allocate(this%di, source=this%output)
241 end if
242
243 2 end subroutine set_batch_size_dropout
244 !!!#############################################################################
245
246
247 !!!#############################################################################
248 !!! generate masks
249 !!!#############################################################################
250 2 subroutine generate_dropout_mask(this)
251 implicit none
252 class(dropout_layer_type), intent(inout) :: this
253 2 real(real12), allocatable, dimension(:,:) :: mask_real
254
255
256 !! generate masks
257
9/18
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✓ Branch 11 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.
2 allocate(mask_real(size(this%mask,1), size(this%mask,2)))
258 2 call random_number(mask_real) ! Generate random values in [0..1]
259
15/28
✗ 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 taken 2 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 2 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 2 times.
✓ Branch 33 taken 2 times.
✓ Branch 34 taken 12 times.
✓ Branch 35 taken 2 times.
16 this%mask = mask_real > this%rate
260
261 2 this%idx = 0
262
263
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 end subroutine generate_dropout_mask
264 !!!#############################################################################
265
266
267 !!!##########################################################################!!!
268 !!! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !!!
269 !!!##########################################################################!!!
270
271
272 !!!#############################################################################
273 !!! print layer to file
274 !!!#############################################################################
275 subroutine print_dropout(this, file)
276 implicit none
277 class(dropout_layer_type), intent(in) :: this
278 character(*), intent(in) :: file
279
280 integer :: unit
281
282
283 !! open file with new unit
284 !!--------------------------------------------------------------------------
285 open(newunit=unit, file=trim(file), access='append')
286
287 !! write convolution initial parameters
288 !!--------------------------------------------------------------------------
289 write(unit,'("DROPOUT")')
290 write(unit,'(3X,"INPUT_SHAPE = ",3(1X,I0))') this%input_shape
291 write(unit,'(3X,"RATE = ",F0.9)') this%rate
292 write(unit,'(3X,"NUM_MASKS = ",I0)') this%num_masks
293 write(unit,'("END DROPOUT")')
294
295 !! close unit
296 !!--------------------------------------------------------------------------
297 close(unit)
298
299 end subroutine print_dropout
300 !!!#############################################################################
301
302
303 !!!#############################################################################
304 !!! read layer from file
305 !!!#############################################################################
306 function read_dropout_layer(unit) result(layer)
307 use infile_tools, only: assign_val, assign_vec
308 use misc, only: to_lower, icount
309 implicit none
310 integer, intent(in) :: unit
311
312 class(dropout_layer_type), allocatable :: layer
313
314 integer :: stat
315 integer :: itmp1
316 integer :: num_masks
317 real(real12) :: rate
318 integer, dimension(3) :: input_shape
319 character(256) :: buffer, tag
320
321
322 !! loop over tags in layer card
323 tag_loop: do
324
325 !! check for end of file
326 read(unit,'(A)',iostat=stat) buffer
327 if(stat.ne.0)then
328 write(0,*) "ERROR: file encountered error (EoF?) before END DROPOUT"
329 stop "Exiting..."
330 end if
331 if(trim(adjustl(buffer)).eq."") cycle tag_loop
332
333 !! check for end of convolution card
334 if(trim(adjustl(buffer)).eq."END DROPOUT")then
335 backspace(unit)
336 exit tag_loop
337 end if
338
339 tag=trim(adjustl(buffer))
340 if(scan(buffer,"=").ne.0) tag=trim(tag(:scan(tag,"=")-1))
341
342 !! read parameters from save file
343 select case(trim(tag))
344 case("INPUT_SHAPE")
345 call assign_vec(buffer, input_shape, itmp1)
346 case("RATE")
347 call assign_val(buffer, rate, itmp1)
348 case("NUM_MASKS")
349 call assign_val(buffer, num_masks, itmp1)
350 case default
351 !! don't look for "e" due to scientific notation of numbers
352 !! ... i.e. exponent (E+00)
353 if(scan(to_lower(trim(adjustl(buffer))),&
354 'abcdfghijklmnopqrstuvwxyz').eq.0)then
355 cycle tag_loop
356 elseif(tag(:3).eq.'END')then
357 cycle tag_loop
358 end if
359 stop "Unrecognised line in input file: "//trim(adjustl(buffer))
360 end select
361 end do tag_loop
362
363 !! set transfer activation function
364
365 layer = dropout_layer_type(rate = rate, num_masks = num_masks, &
366 input_shape = input_shape)
367
368 !! check for end of layer card
369 read(unit,'(A)') buffer
370 if(trim(adjustl(buffer)).ne."END DROPOUT")then
371 write(*,*) trim(adjustl(buffer))
372 stop "ERROR: END DROPOUT not where expected"
373 end if
374
375 end function read_dropout_layer
376 !!!#############################################################################
377
378
379 !!!##########################################################################!!!
380 !!! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !!!
381 !!!##########################################################################!!!
382
383
384 !!!#############################################################################
385 !!! forward propagation
386 !!!#############################################################################
387 3 pure subroutine forward_2d(this, input)
388 implicit none
389 class(dropout_layer_type), intent(inout) :: this
390
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 real(real12), dimension( &
391 this%input_shape(1), this%batch_size), &
392 intent(in) :: input
393
394 integer :: s
395
396
397 1 select case(this%inference)
398 case(.true.)
399 !! do not perform the drop operation
400 this%output = input * ( 1._real12 - this%rate )
401 case default
402 !! perform the drop operation
403 1 this%idx = this%idx + 1
404
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 do concurrent(s=1:this%batch_size)
405 7 this%output(:,s) = merge( &
406
1/2
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
1 input(:,s), 0._real12, &
407 7 this%mask(:,this%idx)) / &
408
24/42
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 1 times.
✗ Branch 40 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 43 not taken.
✓ Branch 44 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 47 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 50 taken 1 times.
✓ Branch 52 taken 6 times.
✓ Branch 53 taken 1 times.
✓ Branch 54 taken 3 times.
✓ Branch 55 taken 3 times.
8 ( 1._real12 - this%rate )
409 end do
410 end select
411
412 1 end subroutine forward_2d
413 !!!#############################################################################
414
415
416 !!!#############################################################################
417 !!! backward propagation
418 !!!#############################################################################
419 3 pure subroutine backward_2d(this, input, gradient)
420 implicit none
421 class(dropout_layer_type), intent(inout) :: this
422 real(real12), dimension( &
423 this%input_shape(1), this%batch_size), &
424 intent(in) :: input
425 real(real12), &
426
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 dimension(this%output_shape(1), this%batch_size), &
427 intent(in) :: gradient
428
429
430 !! compute gradients for input feature map
431
20/36
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 1 times.
✓ Branch 48 taken 1 times.
✓ Branch 49 taken 1 times.
✓ Branch 50 taken 6 times.
✓ Branch 51 taken 1 times.
8 this%di(:,:) = gradient(:,:)
432
433 1 end subroutine backward_2d
434 !!!#############################################################################
435
436
29/78
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 3 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 3 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ 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 not taken.
✓ Branch 82 taken 1 times.
✓ Branch 83 taken 1 times.
✗ Branch 84 not taken.
✗ Branch 85 not taken.
✓ Branch 86 taken 1 times.
✓ Branch 87 taken 1 times.
✗ Branch 88 not taken.
✗ Branch 89 not taken.
✓ Branch 90 taken 1 times.
14 end module dropout_layer
437 !!!#############################################################################
438