Tenncor
ulayer.hpp
Go to the documentation of this file.
1 
10 #include "eteq/generated/api.hpp"
11 
12 #include "layr/layer.hpp"
13 
14 #ifndef LAYR_ULAYER_HPP
15 #define LAYR_ULAYER_HPP
16 
17 namespace layr
18 {
19 
20 struct ULayer;
21 
23 using UnaryF = std::function<NodeptrT(
24  const ULayer&,NodeptrT)>;
25 
27 struct ULayerBuilder final : public iLayerBuilder
28 {
29  ULayerBuilder (std::string act_type, std::string label) :
30  utype_(act_type), label_(label) {}
31 
33  void set_tensor (teq::TensptrT tens, std::string target) override {}
34 
36  void set_sublayer (LayerptrT layer) override {} // activation has no sublayer
37 
39  LayerptrT build (void) const override;
40 
41 private:
42  std::string utype_;
43 
44  std::string label_;
45 };
46 
48 const std::string sigmoid_layer_key =
50 [](std::string extra_info) -> LBuilderptrT
51 {
52  return std::make_shared<ULayerBuilder>(sigmoid_layer_key, "");
53 });
54 
56 const std::string tanh_layer_key =
58 [](std::string extra_info) -> LBuilderptrT
59 {
60  return std::make_shared<ULayerBuilder>(tanh_layer_key, "");
61 });
62 
64 const std::string softmax_layer_key =
66 [](std::string extra_info) -> LBuilderptrT
67 {
68  return std::make_shared<ULayerBuilder>(softmax_layer_key, extra_info);
69 });
70 
72 const std::string maxpool2d_layer_key =
74 [](std::string extra_info) -> LBuilderptrT
75 {
76  return std::make_shared<ULayerBuilder>(maxpool2d_layer_key, extra_info);
77 });
78 
80 const std::string meanpool2d_layer_key =
82 [](std::string extra_info) -> LBuilderptrT
83 {
84  return std::make_shared<ULayerBuilder>(meanpool2d_layer_key, extra_info);
85 });
86 
89 NodeptrT softmax_from_layer (const ULayer& layer, NodeptrT input);
90 
91 NodeptrT maxpool_from_layer (const ULayer& layer, NodeptrT input);
92 
93 NodeptrT meanpool_from_layer (const ULayer& layer, NodeptrT input);
94 
96 const std::unordered_map<std::string,UnaryF> unaries =
97 {
99  [](const ULayer& layer, NodeptrT input)
100  { return tenncor::sigmoid<PybindT>(input); }},
102  [](const ULayer& layer, NodeptrT input)
103  { return tenncor::tanh<PybindT>(input); }},
107 };
108 
110 struct ULayer final : public iLayer
111 {
112  ULayer (const std::string& ulayer_type, const std::string& extra_info = "") :
113  label_(extra_info),
114  utype_(ulayer_type),
115  unary_(estd::must_getf(unaries, ulayer_type,
116  "failed to find unary function `%s`", ulayer_type.c_str())),
117  placeholder_(eteq::make_constant_scalar<PybindT>(0, {}))
118  {
119  tag(placeholder_->get_tensor(), LayerId());
120  }
121 
122  ULayer (const ULayer& other,
123  std::string label_prefix = "") :
124  label_(label_prefix + other.get_label()),
125  utype_(other.utype_),
126  unary_(other.unary_),
127  placeholder_(eteq::make_constant_scalar<PybindT>(0, {}))
128  {
129  tag(placeholder_->get_tensor(), LayerId());
130  }
131 
132  ULayer& operator = (const ULayer& other) = default;
133 
134  ULayer (ULayer&& other) = default;
135 
136  ULayer& operator = (ULayer&& other) = default;
137 
139  ULayer* clone (std::string label_prefix = "") const
140  {
141  return static_cast<ULayer*>(this->clone_impl(label_prefix));
142  }
143 
145  size_t get_ninput (void) const override
146  {
147  return 0;
148  }
149 
151  size_t get_noutput (void) const override
152  {
153  return 0;
154  }
155 
157  std::string get_ltype (void) const override
158  {
159  return utype_;
160  }
161 
163  std::string get_label (void) const override
164  {
165  return label_;
166  }
167 
169  teq::TensptrsT get_contents (void) const override
170  {
171  return {placeholder_->get_tensor()};
172  }
173 
175  NodeptrT connect (NodeptrT input) const override
176  {
177  auto out = unary_(*this, input);
178  recursive_tag(out->get_tensor(), {
179  input->get_tensor().get(),
180  }, LayerId());
181  return out;
182  }
183 
184 private:
185  iLayer* clone_impl (const std::string& label_prefix) const override
186  {
187  return new ULayer(*this, label_prefix);
188  }
189 
190  std::string label_;
191 
192  std::string utype_;
193 
195 
197 };
198 
200 using UnaryptrT = std::shared_ptr<ULayer>;
201 
203 UnaryptrT sigmoid (void);
204 
206 UnaryptrT tanh (void);
207 
210 
212 UnaryptrT maxpool2d (std::pair<teq::DimT,teq::DimT> dims = {0, 1});
213 
215 UnaryptrT meanpool2d (std::pair<teq::DimT,teq::DimT> dims = {0, 1});
216 
217 }
218 
219 #endif // LAYR_ULAYER_HPP
UnaryptrT meanpool2d(std::pair< teq::DimT, teq::DimT > dims={0, 1})
Return pooling layer using mean aggregation.
const std::string tanh_layer_key
Identifier for tanh activation layer.
Definition: ulayer.hpp:56
ULayer * clone(std::string label_prefix="") const
Return deep copy of this layer with prefixed label.
Definition: ulayer.hpp:139
NodeptrT< T > make_constant_scalar(T scalar, teq::Shape shape)
Return constant node given scalar and shape.
Definition: constant.hpp:146
UnaryptrT softmax(teq::RankT dim)
Return activation layer using softmax of specified dimension.
LayerRegistry & get_layer_reg(void)
Return global layer registry reference.
void set_sublayer(LayerptrT layer) override
Implementation of iLayerBuilder.
Definition: ulayer.hpp:36
Layer implementation to apply activation and pooling functions.
Definition: ulayer.hpp:110
UnaryptrT tanh(void)
Return activation layer using tanh.
size_t get_noutput(void) const override
Implementation of iLayer.
Definition: ulayer.hpp:151
Definition: constant.hpp:17
NodeptrT placeholder_
Definition: ulayer.hpp:196
std::string get_ltype(void) const override
Implementation of iLayer.
Definition: ulayer.hpp:157
uint8_t RankT
Type used for shape rank.
Definition: shape.hpp:23
std::string register_tagr(std::string key, LayerBuildF builder)
Definition: layer.hpp:198
void recursive_tag(teq::TensptrT root, teq::TensSetT ignores, LayerId subs) const
Definition: conv.hpp:16
std::string label_
Definition: ulayer.hpp:190
std::shared_ptr< iLayerBuilder > LBuilderptrT
Layer builder smart pointer.
Definition: layer.hpp:179
std::shared_ptr< ULayer > UnaryptrT
Smart pointer of unary layer.
Definition: ulayer.hpp:200
NodeptrT meanpool_from_layer(const ULayer &layer, NodeptrT input)
const std::string sigmoid_layer_key
Identifier for sigmoid activation layer.
Definition: ulayer.hpp:48
ULayer(const ULayer &other, std::string label_prefix="")
Definition: ulayer.hpp:122
void set_tensor(teq::TensptrT tens, std::string target) override
Implementation of iLayerBuilder.
Definition: ulayer.hpp:33
const std::string layers_key_prefix
String prefixed to every layer key.
Definition: layer.hpp:25
UnaryptrT maxpool2d(std::pair< teq::DimT, teq::DimT > dims={0, 1})
Return pooling layer using max aggregation.
UnaryptrT sigmoid(void)
Return activation layer using sigmoid.
size_t get_ninput(void) const override
Implementation of iLayer.
Definition: ulayer.hpp:145
iLayer * clone_impl(const std::string &label_prefix) const override
Definition: ulayer.hpp:185
Definition: layer.hpp:164
ULayer & operator=(const ULayer &other)=default
teq::TensptrsT get_contents(void) const override
Implementation of iLayer.
Definition: ulayer.hpp:169
std::string utype_
Definition: ulayer.hpp:42
std::string label_
Definition: ulayer.hpp:44
std::string get_label(void) const override
Implementation of iLayer.
Definition: ulayer.hpp:163
void tag(teq::TensptrT tensor, LayerId subs) const
std::shared_ptr< iTensor > TensptrT
Tensor smart pointer.
Definition: itensor.hpp:51
std::vector< TensptrT > TensptrsT
Vector of tensor smart pointers.
Definition: itensor.hpp:60
Sublayer type, label, and index encapsulation.
Definition: layer.hpp:35
ULayer(const std::string &ulayer_type, const std::string &extra_info="")
Definition: ulayer.hpp:112
const std::string maxpool2d_layer_key
Identifier for max pooling layer.
Definition: ulayer.hpp:72
ULayerBuilder(std::string act_type, std::string label)
Definition: ulayer.hpp:29
std::function< NodeptrT(const ULayer &, NodeptrT)> UnaryF
Function that takes corresponding unary layer and node.
Definition: ulayer.hpp:24
UnaryF unary_
Definition: ulayer.hpp:194
const std::string meanpool2d_layer_key
Identifier for mean pooling layer.
Definition: ulayer.hpp:80
const std::string softmax_layer_key
Identifier for softmax activation layer.
Definition: ulayer.hpp:64
std::shared_ptr< iNode< T > > NodeptrT
Smart pointer of node.
Definition: inode.hpp:63
NodeptrT softmax_from_layer(const ULayer &layer, NodeptrT input)
const std::unordered_map< std::string, UnaryF > unaries
Map unary layer identifier to connection function.
Definition: ulayer.hpp:96
NodeptrT maxpool_from_layer(const ULayer &layer, NodeptrT input)
LayerptrT build(void) const override
Implementation of iLayerBuilder.
std::shared_ptr< iLayer > LayerptrT
Smart pointer of layer.
Definition: layer.hpp:159
NodeptrT connect(NodeptrT input) const override
Implementation of iLayer.
Definition: ulayer.hpp:175
std::string utype_
Definition: ulayer.hpp:192
Definition: layer.hpp:121
Builder implementation for activation layer.
Definition: ulayer.hpp:27