28 #include "tiny_dnn/util/util.h"
29 #include "tiny_dnn/layers/layer.h"
43 :
layer(std::vector<vector_type>(num_args, vector_type::data), {vector_type::data}), num_args_(num_args), dim_(dim) {}
46 return "elementwise-add";
49 std::vector<shape3d>
in_shape()
const override {
50 return std::vector<shape3d>(num_args_,
shape3d(dim_,1,1));
58 std::vector<tensor_t*>& out_data)
override {
59 const tensor_t& in1 = *in_data[0];
60 tensor_t& out = *out_data[0];
65 for (
size_t sample = 0; sample < in1.size(); ++sample) {
66 for (serial_size_t i = 1; i < num_args_; i++) {
67 std::transform((*in_data[i])[sample].begin(),
68 (*in_data[i])[sample].end(),
71 [](float_t x, float_t y){
return x + y; });
77 const std::vector<tensor_t*>& out_data,
78 std::vector<tensor_t*>& out_grad,
79 std::vector<tensor_t*>& in_grad)
override {
80 CNN_UNREFERENCED_PARAMETER(in_data);
81 CNN_UNREFERENCED_PARAMETER(out_data);
82 for (serial_size_t i = 0; i < num_args_; i++)
83 *in_grad[i] = *out_grad[0];
86 template <
class Archive>
87 static void load_and_construct(Archive & ar, cereal::construct<elementwise_add_layer> & construct) {
88 serial_size_t num_args, dim;
90 ar(cereal::make_nvp(
"num_args", num_args), cereal::make_nvp(
"dim", dim));
91 construct(num_args, dim);
94 template <
class Archive>
95 void serialize(Archive & ar) {
96 layer::serialize_prolog(ar);
97 ar(cereal::make_nvp(
"num_args", num_args_), cereal::make_nvp(
"dim", dim_));
100 serial_size_t num_args_;
element-wise add N vectors y_i = x0_i + x1_i + ...
Definition: arithmetic_layer.h:36
std::vector< shape3d > in_shape() const override
array of input shapes (width x height x depth)
Definition: arithmetic_layer.h:49
void back_propagation(const std::vector< tensor_t * > &in_data, const std::vector< tensor_t * > &out_data, std::vector< tensor_t * > &out_grad, std::vector< tensor_t * > &in_grad) override
return delta of previous layer (delta=\frac{dE}{da}, a=wx in fully-connected layer)
Definition: arithmetic_layer.h:76
std::vector< shape3d > out_shape() const override
array of output shapes (width x height x depth)
Definition: arithmetic_layer.h:53
elementwise_add_layer(serial_size_t num_args, serial_size_t dim)
Definition: arithmetic_layer.h:42
std::string layer_type() const override
name of layer, should be unique for each concrete class
Definition: arithmetic_layer.h:45
void forward_propagation(const std::vector< tensor_t * > &in_data, std::vector< tensor_t * > &out_data) override
Definition: arithmetic_layer.h:57
base class of all kind of NN layers
Definition: layer.h:62