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 fully connected (dense) layer | ||
6 | !!!############################################################################# | ||
7 | !!! Attribution statement: | ||
8 | !!! The following procedures are based on code from the neural-fortran library | ||
9 | !!! https://github.com/modern-fortran/neural-fortran/blob/main/src/nf/nf_layer.f90 | ||
10 | !!! procedures: | ||
11 | !!! - get_num_params* | ||
12 | !!! - get_params* | ||
13 | !!! - set_params* | ||
14 | !!! - get_gradients* | ||
15 | !!! - set_gradients* | ||
16 | !!!############################################################################# | ||
17 | module full_layer | ||
18 | use constants, only: real12 | ||
19 | ✗ | use base_layer, only: learnable_layer_type | |
20 | use custom_types, only: activation_type, initialiser_type | ||
21 | implicit none | ||
22 | |||
23 | |||
24 | !!!----------------------------------------------------------------------------- | ||
25 | !!! fully connected network layer type | ||
26 | !!!----------------------------------------------------------------------------- | ||
27 | type, extends(learnable_layer_type) :: full_layer_type | ||
28 | integer :: num_inputs, num_addit_inputs = 0 | ||
29 | integer :: num_outputs | ||
30 | real(real12), allocatable, dimension(:,:) :: weight | ||
31 | real(real12), allocatable, dimension(:,:,:) :: dw ! weight gradient | ||
32 | real(real12), allocatable, dimension(:,:) :: output, z !output and activation | ||
33 | real(real12), allocatable, dimension(:,:) :: di ! input gradient (i.e. delta) | ||
34 | contains | ||
35 | procedure, pass(this) :: get_num_params => get_num_params_full | ||
36 | procedure, pass(this) :: get_params => get_params_full | ||
37 | procedure, pass(this) :: set_params => set_params_full | ||
38 | procedure, pass(this) :: get_gradients => get_gradients_full | ||
39 | procedure, pass(this) :: set_gradients => set_gradients_full | ||
40 | procedure, pass(this) :: get_output => get_output_full | ||
41 | |||
42 | procedure, pass(this) :: print => print_full | ||
43 | procedure, pass(this) :: set_shape => set_shape_full | ||
44 | procedure, pass(this) :: init => init_full | ||
45 | procedure, pass(this) :: set_batch_size => set_batch_size_full | ||
46 | |||
47 | procedure, pass(this) :: forward => forward_rank | ||
48 | procedure, pass(this) :: backward => backward_rank | ||
49 | procedure, private, pass(this) :: forward_2d | ||
50 | procedure, private, pass(this) :: backward_2d | ||
51 | |||
52 | procedure, pass(this) :: reduce => layer_reduction | ||
53 | procedure, pass(this) :: merge => layer_merge | ||
54 | procedure :: add_t_t => layer_add !t = type, r = real, i = int | ||
55 | generic :: operator(+) => add_t_t !, public | ||
56 | end type full_layer_type | ||
57 | |||
58 | |||
59 | !!!----------------------------------------------------------------------------- | ||
60 | !!! interface for layer set up | ||
61 | !!!----------------------------------------------------------------------------- | ||
62 | interface full_layer_type | ||
63 | module function layer_setup( & | ||
64 | num_outputs, num_inputs, num_addit_inputs, batch_size, & | ||
65 | activation_function, activation_scale, & | ||
66 | kernel_initialiser, bias_initialiser) result(layer) | ||
67 | integer, intent(in) :: num_outputs | ||
68 | integer, optional, intent(in) :: num_inputs, num_addit_inputs | ||
69 | integer, optional, intent(in) :: batch_size | ||
70 | real(real12), optional, intent(in) :: activation_scale | ||
71 | character(*), optional, intent(in) :: activation_function, & | ||
72 | kernel_initialiser, bias_initialiser | ||
73 | type(full_layer_type) :: layer | ||
74 | end function layer_setup | ||
75 | end interface full_layer_type | ||
76 | |||
77 | |||
78 | private | ||
79 | public :: full_layer_type | ||
80 | public :: read_full_layer | ||
81 | |||
82 | |||
83 | contains | ||
84 | |||
85 | !!!############################################################################# | ||
86 | !!! layer reduction | ||
87 | !!!############################################################################# | ||
88 | 1 | subroutine layer_reduction(this, rhs) | |
89 | implicit none | ||
90 | class(full_layer_type), intent(inout) :: this | ||
91 | class(learnable_layer_type), intent(in) :: rhs | ||
92 | |||
93 | select type(rhs) | ||
94 | type is(full_layer_type) | ||
95 |
37/70✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 1 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 1 times.
✗ Branch 66 not taken.
✓ Branch 67 taken 1 times.
✗ Branch 69 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 72 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 75 not taken.
✓ Branch 76 taken 1 times.
✗ Branch 78 not taken.
✓ Branch 79 taken 1 times.
✓ Branch 81 taken 1 times.
✗ Branch 82 not taken.
✓ Branch 83 taken 1 times.
✗ Branch 84 not taken.
✓ Branch 85 taken 1 times.
✗ Branch 86 not taken.
✓ Branch 87 taken 1 times.
✗ Branch 88 not taken.
✗ Branch 89 not taken.
✗ Branch 90 not taken.
✓ Branch 91 taken 1 times.
✓ Branch 92 taken 1 times.
✓ Branch 93 taken 10 times.
✓ Branch 94 taken 1 times.
✓ Branch 95 taken 20 times.
✓ Branch 96 taken 10 times.
|
32 | this%dw = this%dw + rhs%dw |
96 | end select | ||
97 | |||
98 | 1 | end subroutine layer_reduction | |
99 | !!!############################################################################# | ||
100 | |||
101 | |||
102 | !!!############################################################################# | ||
103 | !!! layer addition | ||
104 | !!!############################################################################# | ||
105 | 1 | function layer_add(a, b) result(output) | |
106 | implicit none | ||
107 | class(full_layer_type), intent(in) :: a, b | ||
108 | type(full_layer_type) :: output | ||
109 | |||
110 |
19/38✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 1 times.
✗ 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.
|
1 | output = a |
111 |
37/70✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 1 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 1 times.
✗ Branch 66 not taken.
✓ Branch 67 taken 1 times.
✗ Branch 69 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 72 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 75 not taken.
✓ Branch 76 taken 1 times.
✗ Branch 78 not taken.
✓ Branch 79 taken 1 times.
✓ Branch 81 taken 1 times.
✗ Branch 82 not taken.
✓ Branch 83 taken 1 times.
✗ Branch 84 not taken.
✓ Branch 85 taken 1 times.
✗ Branch 86 not taken.
✓ Branch 87 taken 1 times.
✗ Branch 88 not taken.
✗ Branch 89 not taken.
✗ Branch 90 not taken.
✓ Branch 91 taken 1 times.
✓ Branch 92 taken 1 times.
✓ Branch 93 taken 10 times.
✓ Branch 94 taken 1 times.
✓ Branch 95 taken 20 times.
✓ Branch 96 taken 10 times.
|
32 | output%dw = output%dw + b%dw |
112 | |||
113 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
2 | end function layer_add |
114 | !!!############################################################################# | ||
115 | |||
116 | |||
117 | !!!############################################################################# | ||
118 | !!! layer merge | ||
119 | !!!############################################################################# | ||
120 | 3 | subroutine layer_merge(this, input) | |
121 | implicit none | ||
122 | class(full_layer_type), intent(inout) :: this | ||
123 | class(learnable_layer_type), intent(in) :: input | ||
124 | |||
125 | select type(input) | ||
126 | class is(full_layer_type) | ||
127 |
37/70✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 3 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 3 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 3 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 3 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 3 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 3 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 3 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 3 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 3 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 3 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 3 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 3 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 3 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 3 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 3 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 3 times.
✗ Branch 66 not taken.
✓ Branch 67 taken 3 times.
✗ Branch 69 not taken.
✓ Branch 70 taken 3 times.
✗ Branch 72 not taken.
✓ Branch 73 taken 3 times.
✗ Branch 75 not taken.
✓ Branch 76 taken 3 times.
✗ Branch 78 not taken.
✓ Branch 79 taken 3 times.
✓ Branch 81 taken 3 times.
✗ Branch 82 not taken.
✓ Branch 83 taken 3 times.
✗ Branch 84 not taken.
✓ Branch 85 taken 3 times.
✗ Branch 86 not taken.
✓ Branch 87 taken 3 times.
✗ Branch 88 not taken.
✗ Branch 89 not taken.
✗ Branch 90 not taken.
✓ Branch 91 taken 3 times.
✓ Branch 92 taken 3 times.
✓ Branch 93 taken 17 times.
✓ Branch 94 taken 3 times.
✓ Branch 95 taken 52 times.
✓ Branch 96 taken 17 times.
|
75 | this%dw = this%dw + input%dw |
128 | end select | ||
129 | |||
130 | 3 | end subroutine layer_merge | |
131 | !!!############################################################################# | ||
132 | |||
133 | |||
134 | !!!##########################################################################!!! | ||
135 | !!! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !!! | ||
136 | !!!##########################################################################!!! | ||
137 | |||
138 | |||
139 | !!!############################################################################# | ||
140 | !!! get number of parameters | ||
141 | !!! procedure modified from neural-fortran library | ||
142 | !!!############################################################################# | ||
143 | 5052 | pure function get_num_params_full(this) result(num_params) | |
144 | implicit none | ||
145 | class(full_layer_type), intent(in) :: this | ||
146 | integer :: num_params | ||
147 | |||
148 | 5052 | num_params = ( this%num_inputs + 1 )* this%num_outputs | |
149 | |||
150 | 5052 | end function get_num_params_full | |
151 | !!!############################################################################# | ||
152 | |||
153 | |||
154 | !!!############################################################################# | ||
155 | !!! get number of parameters | ||
156 | !!! procedure modified from neural-fortran library | ||
157 | !!!############################################################################# | ||
158 | 1006 | pure function get_params_full(this) result(params) | |
159 | implicit none | ||
160 | class(full_layer_type), intent(in) :: this | ||
161 | real(real12), allocatable, dimension(:) :: params | ||
162 | |||
163 |
4/6✓ Branch 0 taken 1006 times.
✓ Branch 1 taken 1006 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1006 times.
✓ Branch 5 taken 1006 times.
✗ Branch 6 not taken.
|
2012 | params = reshape(this%weight, [ (this%num_inputs+1) * this%num_outputs ]) |
164 | |||
165 | 1006 | end function get_params_full | |
166 | !!!############################################################################# | ||
167 | |||
168 | |||
169 | !!!############################################################################# | ||
170 | !!! get number of parameters | ||
171 | !!! procedure modified from neural-fortran library | ||
172 | !!!############################################################################# | ||
173 |
1/2✓ Branch 0 taken 1006 times.
✗ Branch 1 not taken.
|
1006 | subroutine set_params_full(this, params) |
174 | implicit none | ||
175 | class(full_layer_type), intent(inout) :: this | ||
176 | real(real12), dimension(:), intent(in) :: params | ||
177 | |||
178 |
12/20✗ Branch 0 not taken.
✓ Branch 1 taken 1006 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1006 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1006 times.
✓ Branch 9 taken 2012 times.
✓ Branch 10 taken 1006 times.
✓ Branch 12 taken 1006 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1006 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1006 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✓ Branch 20 taken 3501 times.
✓ Branch 21 taken 1006 times.
✓ Branch 22 taken 15984 times.
✓ Branch 23 taken 3501 times.
|
22503 | this%weight = reshape(params, [ this%num_inputs+1, this%num_outputs ]) |
179 | |||
180 | 1006 | end subroutine set_params_full | |
181 | !!!############################################################################# | ||
182 | |||
183 | |||
184 | !!!############################################################################# | ||
185 | !!! get number of parameters | ||
186 | !!! procedure modified from neural-fortran library | ||
187 | !!!############################################################################# | ||
188 | 1010 | pure function get_gradients_full(this, clip_method) result(gradients) | |
189 | use clipper, only: clip_type | ||
190 | implicit none | ||
191 | class(full_layer_type), intent(in) :: this | ||
192 | type(clip_type), optional, intent(in) :: clip_method | ||
193 | real(real12), allocatable, dimension(:) :: gradients | ||
194 | |||
195 | 12120 | gradients = reshape(sum(this%dw,dim=3)/this%batch_size, & | |
196 |
23/38✗ Branch 0 not taken.
✓ Branch 1 taken 1010 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1010 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1010 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1010 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1010 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1010 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1010 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 1010 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 1010 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 1010 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 1010 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 1010 times.
✓ Branch 36 taken 1010 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 3515 times.
✓ Branch 39 taken 1010 times.
✓ Branch 40 taken 16048 times.
✓ Branch 41 taken 3515 times.
✓ Branch 42 taken 16048 times.
✓ Branch 43 taken 16048 times.
✓ Branch 44 taken 1010 times.
✓ Branch 45 taken 1010 times.
✗ Branch 47 not taken.
✓ Branch 48 taken 1010 times.
✓ Branch 49 taken 1010 times.
✗ Branch 50 not taken.
|
37631 | [ (this%num_inputs+1) * this%num_outputs ]) |
197 | |||
198 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1010 times.
|
1010 | if(present(clip_method)) call clip_method%apply(size(gradients),gradients) |
199 | |||
200 | 1010 | end function get_gradients_full | |
201 | !!!############################################################################# | ||
202 | |||
203 | |||
204 | !!!############################################################################# | ||
205 | !!! set gradients | ||
206 | !!! procedure modified from neural-fortran library | ||
207 | !!!############################################################################# | ||
208 | 1010 | subroutine set_gradients_full(this, gradients) | |
209 | implicit none | ||
210 | class(full_layer_type), intent(inout) :: this | ||
211 | real(real12), dimension(..), intent(in) :: gradients | ||
212 | |||
213 | select rank(gradients) | ||
214 | rank(0) | ||
215 |
6/6✓ Branch 0 taken 1008 times.
✓ Branch 1 taken 1008 times.
✓ Branch 2 taken 3508 times.
✓ Branch 3 taken 1008 times.
✓ Branch 4 taken 16016 times.
✓ Branch 5 taken 3508 times.
|
21540 | this%dw = gradients |
216 | rank(1) | ||
217 | ✗ | this%dw = spread(reshape(gradients, shape(this%dw(:,:,1))), 3, & | |
218 |
29/46✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 4 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 4 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 4 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 4 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 4 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 4 times.
✓ Branch 26 taken 4 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 4 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✓ Branch 35 taken 2 times.
✓ Branch 36 taken 7 times.
✓ Branch 37 taken 2 times.
✓ Branch 38 taken 32 times.
✓ Branch 39 taken 7 times.
✓ Branch 40 taken 2 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 2 times.
✗ Branch 43 not taken.
✓ Branch 44 taken 2 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 49 not taken.
✓ Branch 50 taken 2 times.
✓ Branch 51 taken 2 times.
✓ Branch 52 taken 7 times.
✓ Branch 53 taken 2 times.
✓ Branch 54 taken 32 times.
✓ Branch 55 taken 7 times.
|
88 | this%batch_size) |
219 | end select | ||
220 | |||
221 | 1010 | end subroutine set_gradients_full | |
222 | !!!############################################################################# | ||
223 | |||
224 | |||
225 | !!!############################################################################# | ||
226 | !!! get layer outputs | ||
227 | !!!############################################################################# | ||
228 | 508 | pure subroutine get_output_full(this, output) | |
229 | implicit none | ||
230 | class(full_layer_type), intent(in) :: this | ||
231 | real(real12), allocatable, dimension(..), intent(out) :: output | ||
232 | |||
233 | select rank(output) | ||
234 | rank(1) | ||
235 | ✗ | output = reshape(this%output, [size(this%output)]) | |
236 | rank(2) | ||
237 |
18/36✗ Branch 0 not taken.
✓ Branch 1 taken 508 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 508 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 508 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 508 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 508 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 508 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 508 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 508 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 508 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✓ Branch 30 taken 508 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 508 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 508 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 508 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 508 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 508 times.
✓ Branch 41 taken 508 times.
✓ Branch 42 taken 1008 times.
✓ Branch 43 taken 508 times.
|
2024 | output = this%output |
238 | end select | ||
239 | |||
240 | 508 | end subroutine get_output_full | |
241 | !!!############################################################################# | ||
242 | |||
243 | |||
244 | !!!##########################################################################!!! | ||
245 | !!! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !!! | ||
246 | !!!##########################################################################!!! | ||
247 | |||
248 | |||
249 | !!!##########################################################################!!! | ||
250 | !!! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !!! | ||
251 | !!!##########################################################################!!! | ||
252 | |||
253 | |||
254 | !!!############################################################################# | ||
255 | !!! forward propagation assumed rank handler | ||
256 | !!!############################################################################# | ||
257 | 1027 | pure subroutine forward_rank(this, input) | |
258 | implicit none | ||
259 | class(full_layer_type), intent(inout) :: this | ||
260 | real(real12), dimension(..), intent(in) :: input | ||
261 | |||
262 | select rank(input); rank(2) | ||
263 | 1027 | call forward_2d(this, input) | |
264 | end select | ||
265 | 1027 | end subroutine forward_rank | |
266 | !!!############################################################################# | ||
267 | |||
268 | |||
269 | !!!############################################################################# | ||
270 | !!! backward propagation assumed rank handler | ||
271 | !!!############################################################################# | ||
272 | 1008 | pure subroutine backward_rank(this, input, gradient) | |
273 | implicit none | ||
274 | class(full_layer_type), intent(inout) :: this | ||
275 | real(real12), dimension(..), intent(in) :: input | ||
276 | real(real12), dimension(..), intent(in) :: gradient | ||
277 | |||
278 | select rank(input); rank(2) | ||
279 | 1008 | select rank(gradient); rank(2) | |
280 | 1008 | call backward_2d(this, input, gradient) | |
281 | end select | ||
282 | end select | ||
283 | 1008 | end subroutine backward_rank | |
284 | !!!############################################################################# | ||
285 | |||
286 | |||
287 | !!!##########################################################################!!! | ||
288 | !!! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !!! | ||
289 | !!!##########################################################################!!! | ||
290 | |||
291 | |||
292 | !!!############################################################################# | ||
293 | !!! set up layer | ||
294 | !!!############################################################################# | ||
295 | 32 | module function layer_setup( & | |
296 | num_outputs, num_inputs, num_addit_inputs, & | ||
297 | batch_size, & | ||
298 | activation_function, activation_scale, & | ||
299 | kernel_initialiser, bias_initialiser) result(layer) | ||
300 | use activation, only: activation_setup | ||
301 | use initialiser, only: get_default_initialiser | ||
302 | implicit none | ||
303 | integer, intent(in) :: num_outputs | ||
304 | integer, optional, intent(in) :: num_inputs, num_addit_inputs | ||
305 | integer, optional, intent(in) :: batch_size | ||
306 | real(real12), optional, intent(in) :: activation_scale | ||
307 | character(*), optional, intent(in) :: activation_function, & | ||
308 | kernel_initialiser, bias_initialiser | ||
309 | |||
310 | type(full_layer_type) :: layer | ||
311 | |||
312 | real(real12) :: scale | ||
313 | character(len=10) :: activation_function_ | ||
314 | |||
315 | |||
316 |
2/6✗ Branch 0 not taken.
✗ Branch 1 not taken.
✓ Branch 2 taken 32 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 32 times.
|
32 | layer%name = "full" |
317 | 32 | layer%input_rank = 1 | |
318 | !!-------------------------------------------------------------------------- | ||
319 | !! set activation and derivative functions based on input name | ||
320 | !!-------------------------------------------------------------------------- | ||
321 |
2/2✓ Branch 0 taken 13 times.
✓ Branch 1 taken 19 times.
|
32 | if(present(activation_function))then |
322 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 9 times.
|
13 | activation_function_ = activation_function |
323 | else | ||
324 | 19 | activation_function_ = "none" | |
325 | end if | ||
326 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 32 times.
|
32 | if(present(activation_scale))then |
327 | ✗ | scale = activation_scale | |
328 | else | ||
329 | 32 | scale = 1._real12 | |
330 | end if | ||
331 |
1/2✓ Branch 3 taken 32 times.
✗ Branch 4 not taken.
|
32 | write(*,'("FULL activation function: ",A)') trim(activation_function_) |
332 | ✗ | allocate(layer%transfer, & | |
333 |
4/8✗ Branch 0 not taken.
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 32 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 32 times.
✓ Branch 8 taken 32 times.
✗ Branch 9 not taken.
|
64 | source=activation_setup(activation_function_, scale)) |
334 | |||
335 | |||
336 | !!-------------------------------------------------------------------------- | ||
337 | !! initialise batch size | ||
338 | !!-------------------------------------------------------------------------- | ||
339 |
2/2✓ Branch 0 taken 22 times.
✓ Branch 1 taken 10 times.
|
32 | if(present(batch_size)) layer%batch_size = batch_size |
340 | |||
341 | |||
342 | !!-------------------------------------------------------------------------- | ||
343 | !! define weights (kernels) and biases initialisers | ||
344 | !!-------------------------------------------------------------------------- | ||
345 |
4/4✓ Branch 0 taken 21 times.
✓ Branch 1 taken 11 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 11 times.
|
32 | if(present(kernel_initialiser)) layer%kernel_initialiser =kernel_initialiser |
346 |
4/4✓ Branch 1 taken 21 times.
✓ Branch 2 taken 11 times.
✓ Branch 3 taken 11 times.
✓ Branch 4 taken 21 times.
|
32 | if(trim(layer%kernel_initialiser).eq.'') & |
347 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 11 times.
|
11 | layer%kernel_initialiser=get_default_initialiser(activation_function_) |
348 |
1/2✓ Branch 3 taken 32 times.
✗ Branch 4 not taken.
|
32 | write(*,'("FULL kernel initialiser: ",A)') trim(layer%kernel_initialiser) |
349 |
3/4✓ Branch 0 taken 9 times.
✓ Branch 1 taken 23 times.
✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
|
32 | if(present(bias_initialiser)) layer%bias_initialiser = bias_initialiser |
350 |
4/4✓ Branch 1 taken 9 times.
✓ Branch 2 taken 23 times.
✓ Branch 3 taken 23 times.
✓ Branch 4 taken 9 times.
|
32 | if(trim(layer%bias_initialiser).eq.'') & |
351 | layer%bias_initialiser = get_default_initialiser(& | ||
352 |
1/2✓ Branch 1 taken 23 times.
✗ Branch 2 not taken.
|
23 | activation_function_, is_bias=.true.) |
353 |
1/2✓ Branch 3 taken 32 times.
✗ Branch 4 not taken.
|
32 | write(*,'("FULL bias initialiser: ",A)') trim(layer%bias_initialiser) |
354 | |||
355 | |||
356 | !!-------------------------------------------------------------------------- | ||
357 | !! initialise layer shape | ||
358 | !!-------------------------------------------------------------------------- | ||
359 | 32 | layer%num_outputs = num_outputs | |
360 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 32 times.
|
32 | if(present(num_addit_inputs)) layer%num_addit_inputs = num_addit_inputs |
361 |
4/4✓ Branch 0 taken 26 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 26 times.
✓ Branch 3 taken 26 times.
|
58 | if(present(num_inputs)) call layer%init(input_shape=[num_inputs]) |
362 | |||
363 |
1/2✓ Branch 0 taken 32 times.
✗ Branch 1 not taken.
|
96 | end function layer_setup |
364 | !!!############################################################################# | ||
365 | |||
366 | |||
367 | !!!############################################################################# | ||
368 | !!! setup input layer shape | ||
369 | !!!############################################################################# | ||
370 |
1/2✓ Branch 0 taken 32 times.
✗ Branch 1 not taken.
|
32 | subroutine set_shape_full(this, input_shape) |
371 | implicit none | ||
372 | class(full_layer_type), intent(inout) :: this | ||
373 | integer, dimension(:), intent(in) :: input_shape | ||
374 | |||
375 | !!-------------------------------------------------------------------------- | ||
376 | !! initialise input shape | ||
377 | !!-------------------------------------------------------------------------- | ||
378 |
5/8✗ Branch 0 not taken.
✓ Branch 1 taken 32 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 32 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 32 times.
✓ Branch 9 taken 30 times.
✓ Branch 10 taken 2 times.
|
32 | if(size(input_shape,dim=1).eq.this%input_rank)then |
379 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 30 times.
|
30 | this%num_inputs = input_shape(1) + this%num_addit_inputs |
380 | else | ||
381 |
5/8✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ Branch 9 taken 7 times.
✓ Branch 10 taken 2 times.
|
9 | this%num_inputs = product(input_shape) + this%num_addit_inputs |
382 | !stop "ERROR: invalid size of input_shape in full, expected (1)" | ||
383 | end if | ||
384 |
4/8✗ Branch 0 not taken.
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 32 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 32 times.
✓ Branch 7 taken 32 times.
|
64 | this%input_shape = [this%num_inputs] |
385 | |||
386 | 32 | end subroutine set_shape_full | |
387 | !!!############################################################################# | ||
388 | |||
389 | |||
390 | !!!############################################################################# | ||
391 | !!! initialise layer | ||
392 | !!!############################################################################# | ||
393 |
1/2✓ Branch 0 taken 32 times.
✗ Branch 1 not taken.
|
32 | subroutine init_full(this, input_shape, batch_size, verbose) |
394 | use initialiser, only: initialiser_setup | ||
395 | implicit none | ||
396 | class(full_layer_type), intent(inout) :: this | ||
397 | integer, dimension(:), intent(in) :: input_shape | ||
398 | integer, optional, intent(in) :: batch_size | ||
399 | integer, optional, intent(in) :: verbose | ||
400 | |||
401 | integer :: verbose_ = 0 | ||
402 | 64 | class(initialiser_type), allocatable :: initialiser_ | |
403 | |||
404 | |||
405 | !!-------------------------------------------------------------------------- | ||
406 | !! initialise optional arguments | ||
407 | !!-------------------------------------------------------------------------- | ||
408 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 32 times.
|
32 | if(present(verbose)) verbose_ = verbose |
409 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 27 times.
|
32 | if(present(batch_size)) this%batch_size = batch_size |
410 | |||
411 | |||
412 | !!-------------------------------------------------------------------------- | ||
413 | !! initialise number of inputs | ||
414 | !!-------------------------------------------------------------------------- | ||
415 |
4/8✓ Branch 0 taken 32 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 32 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 32 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 32 times.
|
32 | if(.not.allocated(this%input_shape)) call this%set_shape(input_shape) |
416 |
4/8✗ Branch 0 not taken.
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 32 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 32 times.
✓ Branch 7 taken 32 times.
|
64 | this%output_shape = [this%num_outputs] |
417 | |||
418 | |||
419 | !!-------------------------------------------------------------------------- | ||
420 | !! allocate weight, weight steps (velocities), output, and activation | ||
421 | !!-------------------------------------------------------------------------- | ||
422 |
22/40✓ Branch 0 taken 32 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 32 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 32 times.
✓ Branch 6 taken 32 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 32 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 32 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 32 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 32 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 32 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 32 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 32 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 32 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 32 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 32 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 32 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 32 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 32 times.
✗ Branch 44 not taken.
✓ Branch 45 taken 32 times.
✓ Branch 47 taken 247 times.
✓ Branch 48 taken 32 times.
✓ Branch 49 taken 24542 times.
✓ Branch 50 taken 247 times.
|
24821 | allocate(this%weight(this%num_inputs+1,this%num_outputs), source=0._real12) |
423 | |||
424 | |||
425 | !!-------------------------------------------------------------------------- | ||
426 | !! initialise weights (kernels) | ||
427 | !!-------------------------------------------------------------------------- | ||
428 |
4/8✗ Branch 1 not taken.
✓ Branch 2 taken 32 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 32 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 32 times.
✓ Branch 10 taken 32 times.
✗ Branch 11 not taken.
|
64 | allocate(initialiser_, source=initialiser_setup(this%kernel_initialiser)) |
429 | 256 | call initialiser_%initialise(this%weight(:this%num_inputs,:), & | |
430 |
8/16✗ Branch 0 not taken.
✓ Branch 1 taken 32 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 32 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 32 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 32 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 32 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 32 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 32 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 32 times.
|
32 | fan_in=this%num_inputs+1, fan_out=this%num_outputs) |
431 |
2/4✗ Branch 0 not taken.
✓ Branch 1 taken 32 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 32 times.
|
32 | deallocate(initialiser_) |
432 | |||
433 | !! initialise biases | ||
434 | !!-------------------------------------------------------------------------- | ||
435 |
4/8✗ Branch 1 not taken.
✓ Branch 2 taken 32 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 32 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 32 times.
✓ Branch 10 taken 32 times.
✗ Branch 11 not taken.
|
64 | allocate(initialiser_, source=initialiser_setup(this%bias_initialiser)) |
436 | 128 | call initialiser_%initialise(this%weight(this%num_inputs+1,:), & | |
437 |
4/8✗ Branch 0 not taken.
✓ Branch 1 taken 32 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 32 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 32 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 32 times.
|
32 | fan_in=this%num_inputs+1, fan_out=this%num_outputs) |
438 |
2/4✗ Branch 0 not taken.
✓ Branch 1 taken 32 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 32 times.
|
32 | deallocate(initialiser_) |
439 | |||
440 | |||
441 | !!-------------------------------------------------------------------------- | ||
442 | !! initialise batch size-dependent arrays | ||
443 | !!-------------------------------------------------------------------------- | ||
444 |
2/2✓ Branch 0 taken 22 times.
✓ Branch 1 taken 10 times.
|
32 | if(this%batch_size.gt.0) call this%set_batch_size(this%batch_size) |
445 | |||
446 |
1/4✗ Branch 2 not taken.
✓ Branch 3 taken 32 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
96 | end subroutine init_full |
447 | !!!############################################################################# | ||
448 | |||
449 | |||
450 | !!!############################################################################# | ||
451 | !!! set batch size | ||
452 | !!!############################################################################# | ||
453 | 40 | subroutine set_batch_size_full(this, batch_size, verbose) | |
454 | implicit none | ||
455 | class(full_layer_type), intent(inout) :: this | ||
456 | integer, intent(in) :: batch_size | ||
457 | integer, optional, intent(in) :: verbose | ||
458 | |||
459 | integer :: verbose_ = 0 | ||
460 | |||
461 | |||
462 | !!-------------------------------------------------------------------------- | ||
463 | !! initialise optional arguments | ||
464 | !!-------------------------------------------------------------------------- | ||
465 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 40 times.
|
40 | if(present(verbose)) verbose_ = verbose |
466 | 40 | this%batch_size = batch_size | |
467 | |||
468 | |||
469 | !!-------------------------------------------------------------------------- | ||
470 | !! allocate arrays | ||
471 | !!-------------------------------------------------------------------------- | ||
472 |
1/2✓ Branch 0 taken 40 times.
✗ Branch 1 not taken.
|
40 | if(allocated(this%input_shape))then |
473 |
3/4✓ Branch 0 taken 12 times.
✓ Branch 1 taken 28 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 12 times.
|
40 | if(allocated(this%output)) deallocate(this%output) |
474 |
21/38✓ Branch 0 taken 40 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 40 times.
✓ Branch 4 taken 40 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 40 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 40 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 40 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 40 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 40 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 40 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 40 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 40 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 40 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 40 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 40 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 40 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 40 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 40 times.
✓ Branch 45 taken 51 times.
✓ Branch 46 taken 40 times.
✓ Branch 47 taken 339 times.
✓ Branch 48 taken 51 times.
|
430 | allocate(this%output(this%num_outputs, this%batch_size), source=0._real12) |
475 |
3/4✓ Branch 0 taken 12 times.
✓ Branch 1 taken 28 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 12 times.
|
40 | if(allocated(this%z)) deallocate(this%z) |
476 |
31/58✓ Branch 0 taken 40 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 40 times.
✓ Branch 4 taken 40 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 40 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 40 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 40 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 40 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 40 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 40 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 40 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 40 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 40 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 40 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 40 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 40 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 40 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 40 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 40 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 40 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 40 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 40 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 40 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 40 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 40 times.
✗ Branch 66 not taken.
✓ Branch 67 taken 40 times.
✗ Branch 69 not taken.
✓ Branch 70 taken 40 times.
✗ Branch 72 not taken.
✓ Branch 73 taken 40 times.
✓ Branch 75 taken 51 times.
✓ Branch 76 taken 40 times.
✓ Branch 77 taken 339 times.
✓ Branch 78 taken 51 times.
|
430 | allocate(this%z, source=this%output) |
477 |
3/4✓ Branch 0 taken 12 times.
✓ Branch 1 taken 28 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 12 times.
|
40 | if(allocated(this%dw)) deallocate(this%dw) |
478 | ✗ | allocate(this%dw(this%num_inputs+1,this%num_outputs, this%batch_size), & | |
479 |
30/54✓ Branch 0 taken 40 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 40 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 40 times.
✓ Branch 6 taken 40 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 40 times.
✓ Branch 10 taken 40 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 40 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 40 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 40 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 40 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 40 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 40 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 40 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 40 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 40 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 40 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 40 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 40 times.
✗ Branch 44 not taken.
✓ Branch 45 taken 40 times.
✗ Branch 47 not taken.
✓ Branch 48 taken 40 times.
✗ Branch 50 not taken.
✓ Branch 51 taken 40 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 40 times.
✗ Branch 56 not taken.
✓ Branch 57 taken 40 times.
✗ Branch 59 not taken.
✓ Branch 60 taken 40 times.
✓ Branch 62 taken 51 times.
✓ Branch 63 taken 40 times.
✓ Branch 64 taken 339 times.
✓ Branch 65 taken 51 times.
✓ Branch 66 taken 24272 times.
✓ Branch 67 taken 339 times.
|
24702 | source=0._real12) |
480 |
3/4✓ Branch 0 taken 12 times.
✓ Branch 1 taken 28 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 12 times.
|
40 | if(allocated(this%di)) deallocate(this%di) |
481 |
21/38✓ Branch 0 taken 40 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 40 times.
✓ Branch 4 taken 40 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 40 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 40 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 40 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 40 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 40 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 40 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 40 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 40 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 40 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 40 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 40 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 40 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 40 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 40 times.
✓ Branch 45 taken 51 times.
✓ Branch 46 taken 40 times.
✓ Branch 47 taken 876 times.
✓ Branch 48 taken 51 times.
|
967 | allocate(this%di(this%num_inputs, this%batch_size), source=0._real12) |
482 | end if | ||
483 | |||
484 | 40 | end subroutine set_batch_size_full | |
485 | !!!############################################################################# | ||
486 | |||
487 | |||
488 | !!!##########################################################################!!! | ||
489 | !!! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !!! | ||
490 | !!!##########################################################################!!! | ||
491 | |||
492 | |||
493 | !!!############################################################################# | ||
494 | !!! print layer to file | ||
495 | !!!############################################################################# | ||
496 | ✗ | subroutine print_full(this, file) | |
497 | implicit none | ||
498 | class(full_layer_type), intent(in) :: this | ||
499 | character(*), intent(in) :: file | ||
500 | |||
501 | integer :: i, unit | ||
502 | |||
503 | |||
504 | !! open file with new unit | ||
505 | !!-------------------------------------------------------------------------- | ||
506 | ✗ | open(newunit=unit, file=trim(file), access='append') | |
507 | |||
508 | !! write convolution initial parameters | ||
509 | !!-------------------------------------------------------------------------- | ||
510 | ✗ | write(unit,'("FULL")') | |
511 | ✗ | write(unit,'(3X,"NUM_INPUTS = ",I0)') this%num_inputs | |
512 | ✗ | write(unit,'(3X,"NUM_OUTPUTS = ",I0)') this%num_outputs | |
513 | |||
514 | ✗ | write(unit,'(3X,"ACTIVATION = ",A)') trim(this%transfer%name) | |
515 | ✗ | write(unit,'(3X,"ACTIVATION_SCALE = ",F0.9)') this%transfer%scale | |
516 | |||
517 | !! write fully connected weights and biases | ||
518 | !!-------------------------------------------------------------------------- | ||
519 | ✗ | write(unit,'("WEIGHTS")') | |
520 | ✗ | do i=1,this%num_outputs | |
521 | ✗ | write(unit,'(5(E16.8E2))') this%weight(:,i) | |
522 | end do | ||
523 | ✗ | write(unit,'("END WEIGHTS")') | |
524 | ✗ | write(unit,'("END FULL")') | |
525 | |||
526 | !! close unit | ||
527 | !!-------------------------------------------------------------------------- | ||
528 | ✗ | close(unit) | |
529 | |||
530 | ✗ | end subroutine print_full | |
531 | !!!############################################################################# | ||
532 | |||
533 | |||
534 | !!!############################################################################# | ||
535 | !!! read layer from file | ||
536 | !!!############################################################################# | ||
537 | ✗ | function read_full_layer(unit, verbose) result(layer) | |
538 | use infile_tools, only: assign_val, assign_vec | ||
539 | use misc, only: to_lower, icount | ||
540 | implicit none | ||
541 | integer, intent(in) :: unit | ||
542 | integer, optional, intent(in) :: verbose | ||
543 | |||
544 | class(full_layer_type), allocatable :: layer | ||
545 | |||
546 | integer :: stat, verbose_ = 0 | ||
547 | integer :: i, j, k, c, itmp1 | ||
548 | integer :: num_inputs, num_outputs | ||
549 | real(real12) :: activation_scale | ||
550 | logical :: found_weights = .false. | ||
551 | character(14) :: kernel_initialiser='', bias_initialiser='' | ||
552 | character(20) :: activation_function | ||
553 | character(256) :: buffer, tag | ||
554 | |||
555 | ✗ | real(real12), allocatable, dimension(:) :: data_list | |
556 | |||
557 | |||
558 | !!-------------------------------------------------------------------------- | ||
559 | !! initialise optional arguments | ||
560 | !!-------------------------------------------------------------------------- | ||
561 | ✗ | if(present(verbose)) verbose_ = verbose | |
562 | |||
563 | |||
564 | !!-------------------------------------------------------------------------- | ||
565 | !! loop over tags in layer card | ||
566 | !!-------------------------------------------------------------------------- | ||
567 | ✗ | tag_loop: do | |
568 | |||
569 | !! check for end of file | ||
570 | !!----------------------------------------------------------------------- | ||
571 | ✗ | read(unit,'(A)',iostat=stat) buffer | |
572 | ✗ | if(stat.ne.0)then | |
573 | ✗ | write(0,*) "ERROR: file encountered error (EoF?) before END FULL" | |
574 | ✗ | stop "Exiting..." | |
575 | end if | ||
576 | ✗ | if(trim(adjustl(buffer)).eq."") cycle tag_loop | |
577 | |||
578 | !! check for end of layer card | ||
579 | !!----------------------------------------------------------------------- | ||
580 | ✗ | if(trim(adjustl(buffer)).eq."END FULL")then | |
581 | ✗ | backspace(unit) | |
582 | ✗ | exit tag_loop | |
583 | end if | ||
584 | |||
585 | ✗ | tag=trim(adjustl(buffer)) | |
586 | ✗ | if(scan(buffer,"=").ne.0) tag=trim(tag(:scan(tag,"=")-1)) | |
587 | |||
588 | !! read parameters from file | ||
589 | !!----------------------------------------------------------------------- | ||
590 | ✗ | select case(trim(tag)) | |
591 | case("NUM_INPUTS") | ||
592 | ✗ | call assign_val(buffer, num_inputs, itmp1) | |
593 | case("NUM_OUTPUTS") | ||
594 | ✗ | call assign_val(buffer, num_outputs, itmp1) | |
595 | case("ACTIVATION") | ||
596 | ✗ | call assign_val(buffer, activation_function, itmp1) | |
597 | case("ACTIVATION_SCALE") | ||
598 | ✗ | call assign_val(buffer, activation_scale, itmp1) | |
599 | case("KERNEL_INITIALISER") | ||
600 | ✗ | call assign_val(buffer, kernel_initialiser, itmp1) | |
601 | case("BIAS_INITIALISER") | ||
602 | ✗ | call assign_val(buffer, bias_initialiser, itmp1) | |
603 | case("WEIGHTS") | ||
604 | ✗ | found_weights = .true. | |
605 | ✗ | kernel_initialiser = 'zeros' | |
606 | ✗ | bias_initialiser = 'zeros' | |
607 | ✗ | exit tag_loop | |
608 | case default | ||
609 | !! don't look for "e" due to scientific notation of numbers | ||
610 | !! ... i.e. exponent (E+00) | ||
611 | ✗ | if(scan(to_lower(trim(adjustl(buffer))),& | |
612 | 'abcdfghijklmnopqrstuvwxyz').eq.0)then | ||
613 | ✗ | cycle tag_loop | |
614 | ✗ | elseif(tag(:3).eq.'END')then | |
615 | ✗ | cycle tag_loop | |
616 | end if | ||
617 | ✗ | stop "Unrecognised line in input file: "//trim(adjustl(buffer)) | |
618 | end select | ||
619 | end do tag_loop | ||
620 | |||
621 | |||
622 | !!-------------------------------------------------------------------------- | ||
623 | !! allocate layer | ||
624 | !!-------------------------------------------------------------------------- | ||
625 | layer = full_layer_type( & | ||
626 | num_outputs = num_outputs, num_inputs = num_inputs, & | ||
627 | activation_function = activation_function, & | ||
628 | activation_scale = activation_scale, & | ||
629 | kernel_initialiser = kernel_initialiser, & | ||
630 | ✗ | bias_initialiser = bias_initialiser) | |
631 | |||
632 | !! check if WEIGHTS card was found | ||
633 | !!-------------------------------------------------------------------------- | ||
634 | ✗ | if(.not.found_weights)then | |
635 | ✗ | write(0,*) "WARNING: WEIGHTS card in FULL not found" | |
636 | else | ||
637 | ✗ | do i=1,num_outputs | |
638 | ✗ | allocate(data_list((num_inputs+1)), source=0._real12) | |
639 | ✗ | c = 1 | |
640 | ✗ | k = 1 | |
641 | ✗ | data_concat_loop: do while(c.le.num_inputs+1) | |
642 | ✗ | read(unit,'(A)',iostat=stat) buffer | |
643 | ✗ | if(stat.ne.0) exit data_concat_loop | |
644 | ✗ | k = icount(buffer) | |
645 | ✗ | read(buffer,*,iostat=stat) (data_list(j),j=c,c+k-1) | |
646 | ✗ | c = c + k | |
647 | end do data_concat_loop | ||
648 | ✗ | layer%weight(:,i) = data_list | |
649 | ✗ | deallocate(data_list) | |
650 | end do | ||
651 | |||
652 | !! check for end of weights card | ||
653 | !!----------------------------------------------------------------------- | ||
654 | ✗ | read(unit,'(A)') buffer | |
655 | ✗ | if(trim(adjustl(buffer)).ne."END WEIGHTS")then | |
656 | ✗ | write(*,*) trim(adjustl(buffer)) | |
657 | ✗ | stop "ERROR: END WEIGHTS not where expected" | |
658 | end if | ||
659 | end if | ||
660 | |||
661 | |||
662 | !!-------------------------------------------------------------------------- | ||
663 | !! check for end of layer card | ||
664 | !!-------------------------------------------------------------------------- | ||
665 | ✗ | read(unit,'(A)') buffer | |
666 | ✗ | if(trim(adjustl(buffer)).ne."END FULL")then | |
667 | ✗ | write(*,*) trim(adjustl(buffer)) | |
668 | ✗ | stop "ERROR: END FULL not where expected" | |
669 | end if | ||
670 | |||
671 | ✗ | end function read_full_layer | |
672 | !!!############################################################################# | ||
673 | |||
674 | |||
675 | !!!##########################################################################!!! | ||
676 | !!! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !!! | ||
677 | !!!##########################################################################!!! | ||
678 | |||
679 | |||
680 | !!!############################################################################# | ||
681 | !!! forward propagation | ||
682 | !!!############################################################################# | ||
683 | 1027 | pure subroutine forward_2d(this, input) | |
684 | implicit none | ||
685 | class(full_layer_type), intent(inout) :: this | ||
686 | real(real12), dimension(this%num_inputs, this%batch_size), & | ||
687 | intent(in) :: input | ||
688 | |||
689 | integer :: s | ||
690 | |||
691 | |||
692 | !! generate outputs from weights, biases, and inputs | ||
693 | 1027 | do concurrent(s=1:this%batch_size) | |
694 | 13351 | this%z(:,s) = this%weight(this%num_inputs+1,:) + & | |
695 |
28/52✓ Branch 0 taken 1027 times.
✓ Branch 1 taken 1027 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1027 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1027 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1027 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1027 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1027 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 1027 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 1027 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 1027 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 1027 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 1027 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 1027 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 1027 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 1027 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 1027 times.
✗ Branch 44 not taken.
✓ Branch 45 taken 1027 times.
✗ Branch 47 not taken.
✓ Branch 48 taken 1027 times.
✗ Branch 50 not taken.
✓ Branch 51 taken 1027 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 1027 times.
✗ Branch 56 not taken.
✓ Branch 57 taken 1027 times.
✗ Branch 59 not taken.
✓ Branch 60 taken 1027 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 1027 times.
✗ Branch 66 not taken.
✓ Branch 67 taken 1027 times.
✗ Branch 69 not taken.
✓ Branch 70 taken 1027 times.
✗ Branch 72 not taken.
✓ Branch 73 taken 1027 times.
✓ Branch 75 taken 3532 times.
✓ Branch 76 taken 1027 times.
|
5586 | matmul(input(:,s),this%weight(:this%num_inputs,:)) |
696 | end do | ||
697 | |||
698 | !! apply activation function to activation | ||
699 |
20/38✗ Branch 0 not taken.
✓ Branch 1 taken 1027 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1027 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1027 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1027 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1027 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 1027 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1027 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1027 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1027 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1027 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 1027 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 1027 times.
✓ Branch 24 taken 1027 times.
✗ Branch 25 not taken.
✓ Branch 27 taken 1027 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 1027 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 1027 times.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✓ Branch 35 taken 1027 times.
✓ Branch 36 taken 1027 times.
✓ Branch 37 taken 3532 times.
✓ Branch 38 taken 1027 times.
|
5586 | this%output = this%transfer%activate(this%z) |
700 | |||
701 | 1027 | end subroutine forward_2d | |
702 | !!!############################################################################# | ||
703 | |||
704 | |||
705 | !!!############################################################################# | ||
706 | !!! backward propagation | ||
707 | !!! method : gradient descent | ||
708 | !!!############################################################################# | ||
709 | 1008 | pure subroutine backward_2d(this, input, gradient) | |
710 | implicit none | ||
711 | class(full_layer_type), intent(inout) :: this | ||
712 | real(real12), dimension(this%num_inputs, this%batch_size), & | ||
713 | intent(in) :: input | ||
714 | real(real12), dimension(this%num_outputs, this%batch_size), & | ||
715 | intent(in) :: gradient | ||
716 | |||
717 | 2016 | real(real12), dimension(this%num_outputs, this%batch_size) :: delta | |
718 | real(real12), dimension(& | ||
719 | 2016 | this%num_inputs, this%num_outputs, this%batch_size) :: dw | |
720 | |||
721 | real(real12), dimension(1) :: bias_diff | ||
722 | |||
723 | integer :: s | ||
724 | |||
725 | |||
726 |
2/2✓ Branch 1 taken 1008 times.
✓ Branch 2 taken 1008 times.
|
2016 | bias_diff = this%transfer%differentiate([1._real12]) |
727 | |||
728 | !! the delta values are the error multipled by the derivative ... | ||
729 | !! ... of the transfer function | ||
730 | !! delta(l) = g'(a) * dE/dI(l) | ||
731 | !! delta(l) = differential of activation * error from next layer | ||
732 |
19/34✗ Branch 0 not taken.
✓ Branch 1 taken 1008 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1008 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1008 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1008 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1008 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1008 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1008 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 1008 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 1008 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 1008 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 1008 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 1008 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 1008 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 1008 times.
✓ Branch 42 taken 1008 times.
✗ Branch 43 not taken.
✓ Branch 45 taken 1008 times.
✓ Branch 46 taken 1008 times.
✓ Branch 47 taken 3508 times.
✓ Branch 48 taken 1008 times.
|
5524 | delta(:,:) = gradient * this%transfer%differentiate(this%z) |
733 | |||
734 | 1008 | do concurrent(s=1:this%batch_size) | |
735 | !! partial derivatives of error wrt weights | ||
736 | !! dE/dW = o/p(l-1) * delta | ||
737 |
20/40✗ Branch 0 not taken.
✓ Branch 1 taken 1008 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1008 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1008 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1008 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1008 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1008 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1008 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 1008 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 1008 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 1008 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 1008 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 1008 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 1008 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 1008 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 1008 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 1008 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 1008 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 1008 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 1008 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 1008 times.
|
1008 | dw(:,:,s) = matmul(input(:,s:s), transpose(delta(:,s:s))) |
738 | |||
739 | !! the errors are summed from the delta of the ... | ||
740 | !! ... 'child' node * 'child' weight | ||
741 | !! dE/dI(l-1) = sum(weight(l) * delta(l)) | ||
742 | !! this prepares dE/dI for when it is passed into the previous layer | ||
743 |
21/38✓ Branch 0 taken 1008 times.
✓ Branch 1 taken 1008 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1008 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1008 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1008 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1008 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1008 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 1008 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 1008 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 1008 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 1008 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 1008 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 1008 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 1008 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 1008 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 1008 times.
✗ Branch 44 not taken.
✓ Branch 45 taken 1008 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 1008 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 1008 times.
✓ Branch 54 taken 4008 times.
✓ Branch 55 taken 1008 times.
|
6024 | this%di(:,s) = matmul(this%weight(:this%num_inputs,:), delta(:,s)) |
744 | end do | ||
745 | |||
746 | !! sum weights and biases errors to use in batch gradient descent | ||
747 |
18/32✗ Branch 0 not taken.
✓ Branch 1 taken 1008 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1008 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1008 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1008 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1008 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1008 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1008 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 1008 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 1008 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 1008 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 1008 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 1008 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 1008 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 1008 times.
✓ Branch 42 taken 1008 times.
✓ Branch 43 taken 1008 times.
✓ Branch 44 taken 3508 times.
✓ Branch 45 taken 1008 times.
|
5524 | delta = delta * bias_diff(1) |
748 |
45/84✗ Branch 0 not taken.
✓ Branch 1 taken 1008 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1008 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1008 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1008 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1008 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1008 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1008 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 1008 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 1008 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 1008 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 1008 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 1008 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 1008 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 1008 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 1008 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 1008 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 1008 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 1008 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 1008 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 1008 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 1008 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 1008 times.
✗ Branch 66 not taken.
✓ Branch 67 taken 1008 times.
✗ Branch 69 not taken.
✓ Branch 70 taken 1008 times.
✗ Branch 72 not taken.
✓ Branch 73 taken 1008 times.
✗ Branch 75 not taken.
✓ Branch 76 taken 1008 times.
✗ Branch 78 not taken.
✓ Branch 79 taken 1008 times.
✗ Branch 81 not taken.
✓ Branch 82 taken 1008 times.
✗ Branch 84 not taken.
✓ Branch 85 taken 1008 times.
✗ Branch 87 not taken.
✓ Branch 88 taken 1008 times.
✗ Branch 90 not taken.
✓ Branch 91 taken 1008 times.
✗ Branch 93 not taken.
✓ Branch 94 taken 1008 times.
✗ Branch 96 not taken.
✓ Branch 97 taken 1008 times.
✗ Branch 99 not taken.
✓ Branch 100 taken 1008 times.
✗ Branch 102 not taken.
✓ Branch 103 taken 1008 times.
✗ Branch 105 not taken.
✓ Branch 106 taken 1008 times.
✗ Branch 108 not taken.
✓ Branch 109 taken 1008 times.
✗ Branch 111 not taken.
✓ Branch 112 taken 1008 times.
✗ Branch 114 not taken.
✓ Branch 115 taken 1008 times.
✓ Branch 117 taken 1008 times.
✓ Branch 118 taken 1008 times.
✓ Branch 119 taken 3508 times.
✓ Branch 120 taken 1008 times.
✓ Branch 121 taken 12508 times.
✓ Branch 122 taken 3508 times.
|
18032 | this%dw(:this%num_inputs,:,:) = this%dw(:this%num_inputs,:,:) + dw |
749 |
34/64✗ Branch 0 not taken.
✓ Branch 1 taken 1008 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1008 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1008 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1008 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1008 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1008 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1008 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 1008 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 1008 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 1008 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 1008 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 1008 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 1008 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 1008 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 1008 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 1008 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 1008 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 1008 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 1008 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 1008 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 1008 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 1008 times.
✗ Branch 66 not taken.
✓ Branch 67 taken 1008 times.
✗ Branch 69 not taken.
✓ Branch 70 taken 1008 times.
✗ Branch 72 not taken.
✓ Branch 73 taken 1008 times.
✗ Branch 75 not taken.
✓ Branch 76 taken 1008 times.
✗ Branch 78 not taken.
✓ Branch 79 taken 1008 times.
✗ Branch 81 not taken.
✓ Branch 82 taken 1008 times.
✗ Branch 84 not taken.
✓ Branch 85 taken 1008 times.
✗ Branch 87 not taken.
✓ Branch 88 taken 1008 times.
✓ Branch 90 taken 1008 times.
✓ Branch 91 taken 1008 times.
✓ Branch 92 taken 3508 times.
✓ Branch 93 taken 1008 times.
|
5524 | this%dw(this%num_inputs+1,:,:) = this%dw(this%num_inputs+1,:,:) + delta(:,:) |
750 | |||
751 | 1008 | end subroutine backward_2d | |
752 | !!!############################################################################# | ||
753 | |||
754 |
56/96✓ Branch 0 taken 55 times.
✓ Branch 1 taken 26 times.
✓ Branch 2 taken 54 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 68 times.
✓ Branch 5 taken 14 times.
✓ Branch 6 taken 1050 times.
✓ Branch 7 taken 14 times.
✓ Branch 8 taken 54 times.
✓ Branch 9 taken 1008 times.
✓ Branch 10 taken 2 times.
✓ Branch 11 taken 44 times.
✓ Branch 12 taken 12 times.
✓ Branch 13 taken 30 times.
✓ Branch 14 taken 532 times.
✓ Branch 15 taken 538 times.
✓ Branch 16 taken 24 times.
✓ Branch 17 taken 1057 times.
✓ Branch 18 taken 24 times.
✓ Branch 19 taken 1057 times.
✓ Branch 20 taken 24 times.
✓ Branch 21 taken 1027 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 1008 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 1008 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 1008 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 1008 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 1008 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 1008 times.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✓ Branch 40 taken 26 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 26 times.
✓ Branch 45 taken 26 times.
✓ Branch 46 taken 26 times.
✗ Branch 47 not taken.
✓ Branch 48 taken 26 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 26 times.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
✓ Branch 70 taken 26 times.
✓ Branch 71 taken 26 times.
✗ Branch 72 not taken.
✗ Branch 73 not taken.
✓ Branch 74 taken 26 times.
✓ Branch 75 taken 26 times.
✗ Branch 76 not taken.
✗ Branch 77 not taken.
✓ Branch 78 taken 26 times.
✓ Branch 79 taken 26 times.
✗ Branch 80 not taken.
✗ Branch 81 not taken.
✓ Branch 82 taken 26 times.
✗ Branch 83 not taken.
✓ Branch 84 taken 26 times.
✓ Branch 86 taken 26 times.
✗ Branch 87 not taken.
✗ Branch 88 not taken.
✓ Branch 89 taken 26 times.
✓ Branch 90 taken 26 times.
✗ Branch 91 not taken.
✓ Branch 92 taken 3 times.
✓ Branch 93 taken 23 times.
✓ Branch 94 taken 26 times.
✗ Branch 95 not taken.
✓ Branch 96 taken 3 times.
✓ Branch 97 taken 23 times.
✓ Branch 98 taken 26 times.
✗ Branch 99 not taken.
✓ Branch 100 taken 3 times.
✓ Branch 101 taken 23 times.
✓ Branch 102 taken 26 times.
✗ Branch 103 not taken.
✓ Branch 104 taken 3 times.
✓ Branch 105 taken 23 times.
|
4777 | end module full_layer |
755 | !!!############################################################################# | ||
756 |