DaNNet
dnn_layer_cost.h
Go to the documentation of this file.
1 // Copyright 2019 Claes Rolen (www.rolensystems.com)
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #pragma once
16 namespace dnn
17 {
21 
26 class layer_cost: public layer
27 {
28 protected:
29  const arma::Mat<DNN_Dtype>* data_labels;
30  arma::Mat<DNN_Dtype> T;
31  arma::Mat<DNN_Dtype> T1;
32  arma::uword data_len;
33  arma::uword data_ix;
34 public:
38  layer_cost(void):layer()
39  {
40  type = "Output";
41  id = type;
42  }
43 
49  virtual void init(void)
50  {
51  layer::init();
56 
57  data_len = 0;
58  data_ix = 0;
59  }
60 
67  virtual void upd_buf_size(arma::uword nmb)
68  {
69  N_batch = nmb;
70  Y. zeros(N_right, nmb);
71  Y1. zeros(N_right, 1);
72  T. zeros(N_right, nmb);
73  T1. zeros(N_right, 1);
74  Dleft.zeros(N_left, nmb);
75  }
76 
80  virtual arma::Mat<DNN_Dtype> get_T_1(void)
81  {
82  return T1;
83  }
84 
88  virtual void set_data(const arma::Mat<DNN_Dtype>* data)
89  {
90  data_labels = data;
91  data_len = data->n_cols;
92  data_ix = 0;
93  }
94 
98  virtual void reset_batch_ctr(void)
99  {
100  data_ix = 0;
101  }
102 
108  virtual void prop(void)
109  {
110  arma::Mat<DNN_Dtype> X_1 = left->get_Y1();
111  Y1 = X_1;
112  T1 = data_labels->col(data_ix);
113  data_ix++;
114  if(data_ix >= data_len)
115  data_ix = 0; // Wrap data
116  }
117 
123  virtual void prop_mb(void)
124  {
125  Y = *(left->get_Y_ptr());
126  if( (data_ix+N_batch)>=data_len )
127  {
128  // We are at the end, wrap data
129  for (arma::uword k=0 ; k<N_batch ; k++ )
130  {
131  T.col(k) = data_labels->col(data_ix++);
132  if(data_ix >= data_len)
133  data_ix = 0; // Wrap data
134  }
135  }
136  else
137  {
138  T = data_labels->cols(data_ix,data_ix+N_batch-1);
139  data_ix+=N_batch;
140  }
141  }
142 
143  virtual void backprop(void)=0;
144  virtual DNN_Dtype get_cost(void) =0;
145 
152  virtual DNN_Dtype get_acc(void)
153  {
154  arma::uword res=0;
155  for(arma::uword n=0; n<N_batch; n++)
156  {
157  arma::uword A=Y.col(n).index_max();
158  arma::uword B=T.col(n).index_max();
159  if(A==B)
160  {
161  res++;
162  }
163  }
164  return res/DNN_Dtype(N_batch);
165  }
166 
170  virtual void disp(void)
171  {
172  layer::disp();
173  std::cout << "Nr of classes: " << get_nrof_outputs() << std::endl;
174  }
175 
176 }; // End class layer_cost
177 
178 
183 class cost_MSE: public layer_cost
184 {
185 public:
189  {
190  id = type+" MSE";
191  }
192 
198  void backprop(void)
199  {
200  Dleft = Y-T;
201  }
202 
210  {
211  return (DNN_Dtype)0.5*arma::accu((Y-T)%(Y-T))/DNN_Dtype(N_batch);
212  }
213 
217  void disp(void)
218  {
220  std::cout << "Loss function: MSE" << std::endl;
221  }
222 
223 }; // End class cost_MSE
224 
230 {
231 public:
233  {
234  id = type+" MSE sigm";
235  }
236 
242  void prop(void)
243  {
244  arma::Mat<DNN_Dtype> X_1 = left->get_Y1();
245  Y1 = sigmoid(X_1);
246  T1 = data_labels->col(data_ix);
247  data_ix++;
248  if(data_ix >= data_len)
249  data_ix = 0; // Wrap data
250  }
251 
257  void prop_mb(void)
258  {
259  Y = sigmoid(*(left->get_Y_ptr()));
260 
261  if( (data_ix+N_batch)>=data_len )
262  {
263  // We are at the end, wrap data
264  for (arma::uword k=0 ; k<N_batch ; k++ )
265  {
266  T.col(k) = data_labels->col(data_ix++);
267  if(data_ix >= data_len)
268  data_ix = 0; // Wrap data
269  }
270  }
271  else
272  {
273  T = data_labels->cols(data_ix,data_ix+N_batch-1);
274  data_ix+=N_batch;
275  }
276  }
277 
283  void backprop(void)
284  {
285  Dleft = sigmoid(*(left->get_Y_ptr()))%(1-sigmoid(*(left->get_Y_ptr())))%(Y-T);
286  }
287 
295  {
296  return (DNN_Dtype)0.5*arma::accu((Y-T)%(Y-T))/DNN_Dtype(N_batch);
297  }
298 
302  void disp(void)
303  {
305  std::cout << "Loss function: MSE" << std::endl;
306  }
307 
308 }; // End class cost_MSE_sigmoid
309 
310 
315 class cost_CE: public layer_cost
316 {
317 public:
319  {
320  id = type+" CE cost";
321  }
322 
328  void prop(void)
329  {
330  arma::Mat<DNN_Dtype> X_1 = left->get_Y1();
331  Y1 = X_1;
332  T1 = data_labels->col(data_ix);
333  data_ix++;
334  if(data_ix == data_len)
335  data_ix = 0; // Wrap data
336  }
337 
343  void prop_mb(void)
344  {
345  Y = *(left->get_Y_ptr());
346  if( (data_ix+N_batch)>=data_len )
347  {
348  // We are at the end, wrap data
349  for (arma::uword k=0 ; k<N_batch ; k++ )
350  {
351  T.col(k) = data_labels->col(data_ix++);
352  if(data_ix >= data_len)
353  data_ix = 0; // Wrap data
354  }
355  }
356  else
357  {
358  T = data_labels->cols(data_ix,data_ix+N_batch-1);
359  data_ix+=N_batch;
360  }
361  }
362 
368  void backprop(void)
369  {
370  Dleft = Y-T;
371  }
372 
380  {
381  return -arma::sum(arma::sum(T%arma::trunc_log(Y),0))/DNN_Dtype(N_batch);
382  }
383 
387  void disp(void)
388  {
390  std::cout << "Loss function: CE with softmax activation" << std::endl;
391  }
392 }; // End class cost_CE
393 
394 
400 {
401 public:
403  {
404  id = type+" CE sigm";
405  }
406 
412  void prop(void)
413  {
414  arma::Mat<DNN_Dtype> X_1 = left->get_Y1();
415  Y1 = sigmoid(X_1);
416  T1 = data_labels->col(data_ix);
417  data_ix++;
418  if(data_ix == data_len)
419  data_ix = 0; // Wrap data
420  }
421 
427  void prop_mb(void)
428  {
429  Y = sigmoid(*(left->get_Y_ptr()));
430 
431  if( (data_ix+N_batch)>=data_len )
432  {
433  // We are at the end, wrap data
434  for (arma::uword k=0 ; k<N_batch ; k++ )
435  {
436  T.col(k) = data_labels->col(data_ix++);
437  if(data_ix >= data_len)
438  data_ix = 0; // Wrap data
439  }
440  }
441  else
442  {
443  T = data_labels->cols(data_ix,data_ix+N_batch-1);
444  data_ix+=N_batch;
445  }
446  }
447 
453  void backprop(void)
454  {
455  Dleft = Y-T;
456  }
457 
465  {
466  DNN_Dtype cost=0;
467  for (arma::uword c=0 ; c<T.n_cols ; c++ )
468  {
469  for (arma::uword r=0 ; r<T.n_rows ; r++ )
470  {
471  if(T(r,c))
472  cost+= -arma::trunc_log(Y.at(r,c));
473  else
474  cost+= -arma::trunc_log(1-Y.at(r,c));
475  }
476  }
477  cost/=DNN_Dtype(N_batch);
478  return cost;
479  }
480 
484  void disp(void)
485  {
487  std::cout << "Loss function: CE with sigmoid activation" << std::endl;
488  }
489 
490 }; // End class cost_CE_sigmoid
491 
492 
498 {
499 public:
501  {
502  id = type+" CE softmax";
503  }
504 
510  void prop(void)
511  {
512  arma::Mat<DNN_Dtype> X_1 = left->get_Y1();
513  Y1 = softmax(X_1);
514  T1 = data_labels->col(data_ix);
515  data_ix++;
516  if(data_ix == data_len)
517  data_ix = 0; // Wrap data
518  }
519 
525  void prop_mb(void)
526  {
527  Y = softmax(*(left->get_Y_ptr()));
528  if( (data_ix+N_batch)>=data_len )
529  {
530  // We are at the end, wrap data
531  for (arma::uword k=0 ; k<N_batch ; k++ )
532  {
533  T.col(k) = data_labels->col(data_ix++);
534  if(data_ix >= data_len)
535  data_ix = 0; // Wrap data
536  }
537  }
538  else
539  {
540  T = data_labels->cols(data_ix,data_ix+N_batch-1);
541  data_ix+=N_batch;
542  }
543  }
544 
550  void backprop(void)
551  {
552  Dleft = Y-T;
553  }
554 
562  {
563  return -arma::sum(arma::sum(T%arma::trunc_log(Y),0))/DNN_Dtype(N_batch);
564  }
565 
569  void disp(void)
570  {
572  std::cout << "Loss function: CE with softmax activation" << std::endl;
573  }
574 }; // End class cost_CE_softmax
576 } // End namespace dnn
virtual void prop_mb(void)
Forward mini batch propagation though layer.
virtual void disp(void)
Display info about layer.
void disp(void)
Display info about layer.
std::string type
Layer type string.
arma::Mat< DNN_Dtype > Y
Output buffer mini batch [N_right,N_batch].
Cross Entropy cost/output layer class with sigmoid activation.
void backprop(void)
Backpropagation of mini batch propagation though layer.
virtual void set_data(const arma::Mat< DNN_Dtype > *data)
Set new target/label data.
virtual arma::Mat< DNN_Dtype > get_T_1(void)
Get target buffer.
virtual void init(void)
Initialization of layer.
Cross Entropy cost/output layer class with softmax activation.
arma::uword N_channels_right
Output channels, number of filters.
void prop_mb(void)
Forward mini batch propagation though layer.
void prop_mb(void)
Forward mini batch propagation though layer.
arma::Mat< DNN_Dtype > Dleft
Error buffer [N_left,N_batch].
Layer base class.
Cost/output layer base class.
arma::Mat< DNN_Dtype > Y1
Output buffer [N_right,1].
void backprop(void)
Backpropagation of mini batch propagation though layer.
arma::Mat< DNN_Dtype > T1
virtual arma::uword get_nrof_outputs(void)
Get total number of layer outputs.
Mean Square Error cost/output layer class.
virtual arma::Mat< DNN_Dtype > get_Y1(void)
Get output buffer.
virtual void init(void)
Initialize layer.
DNN_Dtype get_cost(void)
Get cost.
arma::uword data_len
arma::Mat< DNN_Dtype > B
Bias.
void backprop(void)
Backpropagation of mini batch propagation though layer.
void disp(void)
Display info about layer.
virtual arma::uword get_nrof_channels(void)
Get output buffer channel/layer size.
void disp(void)
Display info about layer.
void prop_mb(void)
Forward mini batch propagation though layer.
arma::Mat< DNN_Dtype > T
DNN_Dtype sigmoid(const DNN_Dtype x)
Sigmoid function - scalar.
virtual DNN_Dtype get_acc(void)
Get accuracy.
cost_MSE(void)
MSE cost layer constructor.
virtual void disp(void)
Display info about layer.
float DNN_Dtype
Data type used in the network (float or double)
Definition: dnn.h:28
void prop(void)
Forward propagation though layer.
arma::uword N_left
Total size left.
arma::uword N_rows_right
Output rows.
void backprop(void)
Backpropagation of mini batch propagation though layer.
void backprop(void)
Backpropagation of mini batch propagation though layer.
const arma::Mat< DNN_Dtype > * data_labels
virtual void prop(void)
Forward propagation though layer.
arma::uword data_ix
void prop(void)
Forward propagation though layer.
DNN_Dtype get_cost(void)
Get cost.
void prop(void)
Forward propagation though layer.
DNN_Dtype get_cost(void)
Get cost.
virtual arma::uword get_nrof_cols(void)
Get output buffer column size.
void disp(void)
Display info about layer.
arma::uword N_batch
Mini batch size.
void prop(void)
Forward propagation though layer.
Definition: dnn.h:22
Mean Square Error cost/output layer class with sigmoid activation.
layer_cost(void)
Dense layer constructor.
DNN_Dtype get_cost(void)
Get cost.
virtual void upd_buf_size(arma::uword nmb)
Updates the buffer sizes.
DNN_Dtype get_cost(void)
Get cost.
virtual void backprop(void)=0
Back propagation.
virtual arma::uword get_nrof_rows(void)
Get output buffer row size.
void prop_mb(void)
Forward mini batch propagation though layer.
arma::uword N_right
Total size right.
void disp(void)
Display info about layer.
layer * left
Pointer to previous layer.
arma::uword N_cols_right
Output cols.
virtual arma::Mat< DNN_Dtype > * get_Y_ptr(void)
Get output buffer pointer - mini batch.
arma::Mat< DNN_Dtype > softmax(const arma::Mat< DNN_Dtype > &x)
Softmax function - matrix.
Cross Entropy cost/output layer class with linear activation.
virtual DNN_Dtype get_cost(void)=0
virtual void reset_batch_ctr(void)
Reset batch counter.