Neural Network
Started on implementing neural network from NNFS. I've done ReLU and stopped at p.104. Softmax is not ready.
This commit is contained in:
@@ -2,12 +2,16 @@
|
||||
#define _matrix_n_
|
||||
|
||||
#include "./utils/vector.h"
|
||||
#include "./utils/random.h"
|
||||
|
||||
#ifdef _OPENMP
|
||||
#include <omp.h>
|
||||
#endif
|
||||
|
||||
|
||||
#include <initializer_list>
|
||||
|
||||
|
||||
#include <iomanip>
|
||||
|
||||
namespace utils{
|
||||
@@ -25,6 +29,72 @@ public:
|
||||
: rows_(rows), cols_(cols), data_(rows * cols, value) {}
|
||||
|
||||
|
||||
// Construct from list-of-lists:
|
||||
// utils::Mf A{{1,2,3}, {4,5,6}};
|
||||
Matrix(std::initializer_list<std::initializer_list<T>> init) {
|
||||
rows_ = static_cast<uint64_t>(init.size());
|
||||
if (rows_ > 0) {
|
||||
cols_ = static_cast<uint64_t>(init.begin()->size());
|
||||
} else {
|
||||
cols_ = 0;
|
||||
}
|
||||
|
||||
// Validate all rows have the same length
|
||||
for (const auto& row : init) {
|
||||
if (row.size() != cols_) {
|
||||
throw std::runtime_error("Matrix(list of lists): ragged rows");
|
||||
}
|
||||
}
|
||||
|
||||
data_.resize(rows_ * cols_);
|
||||
uint64_t r = 0;
|
||||
for (uint64_t i = 0; i < init.size(); ++i, ++r){
|
||||
const std::initializer_list<T>& row = *(init.begin() + i);
|
||||
|
||||
uint64_t c = 0;
|
||||
for (uint64_t j = 0; j < row.size(); ++j, ++c){
|
||||
const T& val = *(row.begin() + j);
|
||||
data_[r * cols_ + c] = val;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Assign from list-of-lists after default construction:
|
||||
// utils::Md M; M = {{1,2},{3,4}};
|
||||
Matrix& operator=(std::initializer_list<std::initializer_list<T>> init) {
|
||||
// Set sizes
|
||||
rows_ = static_cast<uint64_t>(init.size());
|
||||
if (rows_ > 0) {
|
||||
cols_ = static_cast<uint64_t>((init.begin())->size());
|
||||
} else {
|
||||
cols_ = 0;
|
||||
}
|
||||
|
||||
// Validate: all rows must have same length
|
||||
for (uint64_t i = 0; i < rows_; ++i) {
|
||||
const std::initializer_list<T>& row = *(init.begin() + i);
|
||||
if (row.size() != cols_) {
|
||||
throw std::runtime_error("Matrix(list of lists): ragged rows");
|
||||
}
|
||||
}
|
||||
|
||||
// Allocate storage
|
||||
data_.resize(rows_ * cols_);
|
||||
|
||||
// Copy data row by row
|
||||
for (uint64_t i = 0; i < rows_; ++i) {
|
||||
const std::initializer_list<T>& row = *(init.begin() + i);
|
||||
for (uint64_t j = 0; j < cols_; ++j) {
|
||||
const T& val = *(row.begin() + j);
|
||||
data_[i * cols_ + j] = val;
|
||||
}
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
//# MATRIX: basic properties #
|
||||
uint64_t rows() const noexcept {return rows_;}
|
||||
uint64_t cols() const noexcept {return cols_;}
|
||||
@@ -45,6 +115,20 @@ public:
|
||||
|
||||
}
|
||||
|
||||
void random(uint64_t rows, uint64_t cols, const T& lower, const T& higher){
|
||||
rows_ = rows;
|
||||
cols_ = cols;
|
||||
data_.resize(rows_*cols_, 0);
|
||||
|
||||
// Copy data row by row
|
||||
for (uint64_t i = 0; i < rows_; ++i) {
|
||||
for (uint64_t j = 0; j < cols_; ++j) {
|
||||
data_[i * cols_ + j] = utils::random(lower, higher);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
//# MATRIX: row helpers (copy out) #
|
||||
// Read whole row as an owning Vector<T>
|
||||
|
||||
Reference in New Issue
Block a user