28 #include "tiny_dnn/util/util.h"
37 template<
typename Activation>
40 CNN_USE_LAYER_MEMBERS;
49 explicit linear_layer(serial_size_t dim, float_t scale = float_t(1), float_t bias = float_t(0))
50 :
Base({vector_type::data}),
51 dim_(dim), scale_(scale), bias_(bias) {}
53 std::vector<shape3d>
in_shape()
const override {
61 std::string
layer_type()
const override {
return "linear"; }
64 std::vector<tensor_t*>& out_data)
override {
65 const tensor_t& in = *in_data[0];
66 tensor_t& out = *out_data[0];
67 tensor_t& a = *out_data[1];
70 CNN_UNREFERENCED_PARAMETER(out);
74 for (serial_size_t sample = 0, sample_count =
static_cast<serial_size_t
>(in.size()); sample < sample_count; ++sample)
75 a[sample][i] = scale_ * in[sample][i] + bias_;
77 this->forward_activation(*out_data[0], *out_data[1]);
81 const std::vector<tensor_t*>& out_data,
82 std::vector<tensor_t*>& out_grad,
83 std::vector<tensor_t*>& in_grad)
override {
84 tensor_t& prev_delta = *in_grad[0];
85 tensor_t& curr_delta = *out_grad[1];
87 CNN_UNREFERENCED_PARAMETER(in_data);
89 this->backward_activation(*out_grad[0], *out_data[0], curr_delta);
92 for (serial_size_t sample = 0; sample < static_cast<serial_size_t>(prev_delta.size()); ++sample) {
94 prev_delta[sample][i] = curr_delta[sample][i] * scale_;
99 template <
class Archive>
100 static void load_and_construct(Archive & ar, cereal::construct<linear_layer> & construct) {
104 ar(cereal::make_nvp(
"in_size", dim), cereal::make_nvp(
"scale", scale), cereal::make_nvp(
"bias", bias));
106 construct(dim, scale, bias);
109 template <
class Archive>
110 void serialize(Archive & ar) {
111 layer::serialize_prolog(ar);
112 ar(cereal::make_nvp(
"in_size", dim_), cereal::make_nvp(
"scale", scale_), cereal::make_nvp(
"bias", bias_));
117 float_t scale_, bias_;
single-input, single-output network with activation function
Definition: feedforward_layer.h:37
bool parallelize_
Flag indicating whether the layer/node operations ara paralellized.
Definition: layer.h:696
element-wise operation: f(x) = h(scale*x+bias)
Definition: linear_layer.h:38
std::vector< shape3d > in_shape() const override
array of input shapes (width x height x depth)
Definition: linear_layer.h:53
linear_layer(serial_size_t dim, float_t scale=float_t(1), float_t bias=float_t(0))
Definition: linear_layer.h:49
std::vector< shape3d > out_shape() const override
array of output shapes (width x height x depth)
Definition: linear_layer.h:57
std::string layer_type() const override
name of layer, should be unique for each concrete class
Definition: linear_layer.h:61
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: linear_layer.h:80
void forward_propagation(const std::vector< tensor_t * > &in_data, std::vector< tensor_t * > &out_data) override
Definition: linear_layer.h:63