20#define KASSERT(x, ...) \
22 printf("KASSERT: %s(%d): ", __FILE__, __LINE__); \
23 printf(__VA_ARGS__); \
28#define KASSERT_EQ(x, y, eps) \
29 if (std::fabs(x - y) > eps) { \
30 printf("KASSERT: Expected %f, got %f\n", y, x); \
35#define KDEBUG(x, ...) \
37 printf("%s(%d): ", __FILE__, __LINE__); \
38 printf(__VA_ARGS__); \
43#define KDEBUG(x, ...) ;
70 data_.resize(i * j * k);
73 void Resize(
int i,
int j,
int k,
int l) {
75 data_.resize(i * j * k * l);
79 KDEBUG(
dims_.size() > 0,
"Invalid tensor");
81 int elements =
dims_[0];
82 for (
unsigned int i = 1; i <
dims_.size(); i++) {
89 KDEBUG(
dims_.size() == 1,
"Invalid indexing for tensor");
90 KDEBUG(i <
dims_[0] && i >= 0,
"Invalid i: %d (max %d)", i,
dims_[0]);
96 KDEBUG(
dims_.size() == 2,
"Invalid indexing for tensor");
97 KDEBUG(i <
dims_[0] && i >= 0,
"Invalid i: %d (max %d)", i,
dims_[0]);
98 KDEBUG(j <
dims_[1] && j >= 0,
"Invalid j: %d (max %d)", j,
dims_[1]);
104 KDEBUG(
dims_.size() == 2,
"Invalid indexing for tensor");
105 KDEBUG(i <
dims_[0] && i >= 0,
"Invalid i: %d (max %d)", i,
dims_[0]);
106 KDEBUG(j <
dims_[1] && j >= 0,
"Invalid j: %d (max %d)", j,
dims_[1]);
112 KDEBUG(
dims_.size() == 3,
"Invalid indexing for tensor");
113 KDEBUG(i <
dims_[0] && i >= 0,
"Invalid i: %d (max %d)", i,
dims_[0]);
114 KDEBUG(j <
dims_[1] && j >= 0,
"Invalid j: %d (max %d)", j,
dims_[1]);
115 KDEBUG(k <
dims_[2] && k >= 0,
"Invalid k: %d (max %d)", k,
dims_[2]);
121 KDEBUG(
dims_.size() == 4,
"Invalid indexing for tensor");
122 KDEBUG(i <
dims_[0] && i >= 0,
"Invalid i: %d (max %d)", i,
dims_[0]);
123 KDEBUG(j <
dims_[1] && j >= 0,
"Invalid j: %d (max %d)", j,
dims_[1]);
124 KDEBUG(k <
dims_[2] && k >= 0,
"Invalid k: %d (max %d)", k,
dims_[2]);
125 KDEBUG(l <
dims_[3] && l >= 0,
"Invalid l: %d (max %d)", l,
dims_[3]);
130 inline void Fill(
float value) {
135 KASSERT(
dims_.size() >= 2,
"Invalid tensor");
136 std::vector<int> pack_dims =
137 std::vector<int>(
dims_.begin() + 1,
dims_.end());
138 int pack_size = std::accumulate(pack_dims.begin(), pack_dims.end(), 0);
140 std::vector<float>::const_iterator first =
141 data_.begin() + (row * pack_size);
142 std::vector<float>::const_iterator last =
143 data_.begin() + (row + 1) * pack_size;
147 x.
data_ = std::vector<float>(first, last);
161 "Cannot add tensors with different dimensions");
168 std::back_inserter(result.
data_),
169 [](
float x,
float y) { return x + y; });
176 "Cannot multiply elements with different dimensions");
183 std::back_inserter(result.
data_),
184 [](
float x,
float y) { return x * y; });
190 KDEBUG(
dims_.size() == 2,
"Invalid tensor dimensions");
191 KDEBUG(other.
dims_.size() == 2,
"Invalid tensor dimensions");
193 "Cannot multiply with different inner dimensions");
197 for (
int i = 0; i <
dims_[0]; i++) {
198 for (
int j = 0; j < other.
dims_[1]; j++) {
199 for (
int k = 0; k <
dims_[1]; k++) {
200 tmp(i, j) += (*this)(i, k) * other(k, j);
209 if (
dims_.size() == 1) {
211 for (
int i = 0; i <
dims_[0]; i++) {
212 printf(
"%f ", (*
this)(i));
215 }
else if (
dims_.size() == 2) {
217 for (
int i = 0; i <
dims_[0]; i++) {
219 for (
int j = 0; j <
dims_[1]; j++) {
220 printf(
"%f ", (*
this)(i, j));
225 }
else if (
dims_.size() == 3) {
227 for (
int i = 0; i <
dims_[0]; i++) {
229 for (
int j = 0; j <
dims_[1]; j++) {
231 for (
int k = 0; k <
dims_[2]; k++) {
232 printf(
"%f ", (*
this)(i, j, k));
239 }
else if (
dims_.size() == 4) {
241 for (
int i = 0; i <
dims_[0]; i++) {
243 for (
int j = 0; j <
dims_[1]; j++) {
245 for (
int k = 0; k <
dims_[2]; k++) {
247 for (
int l = 0; l <
dims_[3]; l++) {
248 printf(
"%f ", (*
this)(i, j, k, l));
262 for (
unsigned int i = 0; i <
dims_.size(); i++) {
264 printf(
"%ld ",
dims_[i]);
266 printf(
"%d ",
dims_[i]);
302 bool LoadLayer(std::ifstream* file)
override;
316 bool LoadLayer(std::ifstream* file)
override;
333 bool LoadLayer(std::ifstream* file)
override;
350 bool LoadLayer(std::ifstream* file)
override;
363 bool LoadLayer(std::ifstream* file)
override;
377 bool LoadLayer(std::ifstream* file)
override;
382 unsigned int pool_size_j_;
383 unsigned int pool_size_k_;
392 bool LoadLayer(std::ifstream* file)
override;
414 bool return_sequences_ =
false;
423 bool LoadLayer(std::ifstream* file)
override;
447 for (
unsigned int i = 0; i < layers_.size(); i++) {
452 virtual bool LoadModel(
const std::string& filename);
457 std::vector<KerasLayer*> layers_;
464 void Start() { start_ = std::chrono::high_resolution_clock::now(); }
467 std::chrono::time_point<std::chrono::high_resolution_clock> now =
468 std::chrono::high_resolution_clock::now();
470 std::chrono::duration<double> diff = now - start_;
476 std::chrono::time_point<std::chrono::high_resolution_clock> start_;
~KerasLayerActivation() override
bool LoadLayer(std::ifstream *file) override
bool Apply(Tensor *in, Tensor *out) override
bool Apply(Tensor *in, Tensor *out) override
~KerasLayerConvolution2d() override
bool LoadLayer(std::ifstream *file) override
KerasLayerConvolution2d()
bool LoadLayer(std::ifstream *file) override
bool Apply(Tensor *in, Tensor *out) override
~KerasLayerDense() override
bool Apply(Tensor *in, Tensor *out) override
~KerasLayerElu() override
bool LoadLayer(std::ifstream *file) override
bool Apply(Tensor *in, Tensor *out) override
~KerasLayerEmbedding() override
bool LoadLayer(std::ifstream *file) override
bool Apply(Tensor *in, Tensor *out) override
bool LoadLayer(std::ifstream *file) override
~KerasLayerFlatten() override
~KerasLayerLSTM() override
bool Apply(Tensor *in, Tensor *out) override
bool LoadLayer(std::ifstream *file) override
bool LoadLayer(std::ifstream *file) override
bool Apply(Tensor *in, Tensor *out) override
~KerasLayerMaxPooling2d() override
virtual bool Apply(Tensor *in, Tensor *out)=0
virtual bool LoadLayer(std::ifstream *file)=0
virtual bool LoadModel(const std::string &filename)
virtual bool Apply(Tensor *in, Tensor *out)
std::vector< float > data_
float & operator()(int i, int j, int k)
Tensor Select(int row) const
float & operator()(int i, int j)
Tensor Multiply(const Tensor &other)
void Resize(int i, int j, int k, int l)
float & operator()(int i)
Tensor Unpack(int row) const
Tensor Dot(const Tensor &other)
Tensor(int i, int j, int k, int l)
float operator()(int i, int j) const
Tensor(int i, int j, int k)
void Resize(int i, int j)
Tensor operator+(const Tensor &other)
void Resize(int i, int j, int k)
float & operator()(int i, int j, int k, int l)