51 real function predict_number(qc, qr, qi, qs, pres, temp, w, predict_nc)
53 real,
intent(in) :: qc, qr, qi, qs, pres, temp, w
54 logical,
intent(in) :: predict_nc
55 type(
mldata),
dimension(2) :: get_ml_data
57 integer,
parameter :: input_rows = 1
58 real,
allocatable,
dimension(:,:) :: input, input_transformed
59 real,
allocatable,
dimension(:,:) :: output00, output00activ
60 real,
allocatable,
dimension(:,:) :: output01, output01activ
61 real,
parameter :: logmin = -6.0
62 real,
parameter :: logmax = 9.3010299957
63 double precision :: predictexp
66 call tempo_save_or_read_ml_data(ml_data_out=get_ml_data)
69 ml_data = get_ml_data(1)
71 ml_data = get_ml_data(2)
75 if (.not.
allocated(input))
then
76 allocate(input(input_rows, ml_data%input_size))
78 if (.not.
allocated(input_transformed))
then
79 allocate(input_transformed(input_rows, ml_data%input_size))
92 call standard_scaler_transform(mean=ml_data%transform_mean, var=ml_data%transform_var, &
93 raw_data=input, transformed_data=input_transformed)
96 if (.not.
allocated(output00))
then
97 allocate(output00(ml_data%node_size, ml_data%output_size))
99 if (.not.
allocated(output00activ))
then
100 allocate(output00activ(ml_data%node_size, ml_data%output_size))
102 if (.not.
allocated(output01))
then
103 allocate(output01(ml_data%output_size, ml_data%output_size))
105 if (.not.
allocated(output01activ))
then
106 allocate(output01activ(ml_data%output_size, ml_data%output_size))
111 output00 = matmul(transpose(ml_data%weights00), transpose(input_transformed)) + &
112 reshape(ml_data%bias00, (/
size(ml_data%bias00), ml_data%output_size/))
113 call relu_activation(input=output00, output=output00activ)
116 output01 = matmul(transpose(ml_data%weights01), output00activ) + &
117 reshape(ml_data%bias01, (/
size(ml_data%bias01), ml_data%output_size/))
118 call relu_activation(input=output01, output=output01activ)
121 predictexp = min(logmax, max(logmin, output01activ(1,1)))
122 predict_number = 10.**predictexp
128 subroutine predict_number_sub(kts, kte, qc, qr, qi, qs, pres, temp, w, predict_number, predict_nc)
130 integer,
intent(in) :: kts, kte
131 real,
dimension(kts:kte),
intent(in) :: qc, qr, qi, qs, pres, temp, w
132 double precision,
dimension(kts:kte),
intent(inout) :: predict_number
133 logical,
intent(in) :: predict_nc
134 type(
mldata),
dimension(2) :: get_ml_data
136 integer,
parameter :: input_rows = 1
137 real,
allocatable,
dimension(:,:) :: input, input_transformed
138 real,
allocatable,
dimension(:,:) :: output00, output00activ, reshaped_bias00
139 real,
allocatable,
dimension(:,:) :: output01, output01activ, reshaped_bias01
140 real,
parameter :: logmin = -6.0
141 real,
parameter :: logmax = 9.3010299957
142 double precision :: predictexp
146 call tempo_save_or_read_ml_data(ml_data_out=get_ml_data)
149 ml_data = get_ml_data(1)
151 ml_data = get_ml_data(2)
155 if (.not.
allocated(input))
then
156 allocate(input(ml_data%input_size, kte))
158 if (.not.
allocated(input_transformed))
then
159 allocate(input_transformed(ml_data%input_size, kte))
172 call standard_scaler_transform(mean=ml_data%transform_mean, var=ml_data%transform_var, &
173 raw_data=input, transformed_data=input_transformed)
176 if (.not.
allocated(output00))
then
177 allocate(output00(ml_data%node_size, kte))
179 if (.not.
allocated(output00activ))
then
180 allocate(output00activ(ml_data%node_size, kte))
182 if (.not.
allocated(reshaped_bias00))
then
183 allocate(reshaped_bias00(ml_data%node_size, kte))
186 if (.not.
allocated(output01))
then
187 allocate(output01(ml_data%output_size, kte))
189 if (.not.
allocated(output01activ))
then
190 allocate(output01activ(ml_data%output_size, kte))
192 if (.not.
allocated(reshaped_bias01))
then
193 allocate(reshaped_bias01(ml_data%output_size, kte))
197 reshaped_bias00(:,k) = ml_data%bias00
198 reshaped_bias01(1,k) = ml_data%bias01(1)
203 output00 = matmul(ml_data%weights00, input_transformed) + reshaped_bias00
204 call relu_activation(input=output00, output=output00activ)
207 output01 = matmul(ml_data%weights01, output00activ) + reshaped_bias01
208 call relu_activation(input=output01, output=output01activ)
212 predictexp = min(logmax, max(logmin, output01activ(1,k)))
213 predict_number(k) = 10.**predictexp
220 subroutine standard_scaler_transform(mean, var, raw_data, transformed_data)
221 real,
dimension(:,:),
intent(in) :: raw_data
222 real,
dimension(:),
intent(in) :: mean, var
223 real,
intent(out) :: transformed_data(size(raw_data, 1), size(raw_data, 2))
226 do i = 1,
size(raw_data, 1)
227 transformed_data(i,:) = (raw_data(i,:) - mean(i)) / sqrt(var(i))