diff --git a/RTNeural/dense/dense_eigen.h b/RTNeural/dense/dense_eigen.h index b3c5c8e..875cc0e 100644 --- a/RTNeural/dense/dense_eigen.h +++ b/RTNeural/dense/dense_eigen.h @@ -19,12 +19,11 @@ class Dense : public Layer Dense(int in_size, int out_size) : Layer(in_size, out_size) { - weights = Eigen::Matrix::Zero(out_size, in_size + 1); + weights = Eigen::Matrix::Zero(out_size, in_size); - inVec = Eigen::Matrix::Zero(in_size + 1); + inVec = Eigen::Matrix::Zero(in_size); outVec = Eigen::Matrix::Zero(out_size); - - inVec(in_size, 0) = (T)1; + bias = Eigen::Matrix::Zero(out_size); } Dense(std::initializer_list sizes) @@ -50,17 +49,15 @@ class Dense : public Layer /** Performs forward propagation for this layer. */ inline void forward(const T* input, T* out) noexcept override { - for (int i = 0; i < Layer::in_size; ++i) - inVec(i, 0) = input[i]; + inVec = Eigen::Map, RTNeuralEigenAlignment>(input, Layer::in_size); - /** - * out = | w b | * | input | - * | 1 | - */ - outVec.noalias() = weights * inVec; + outVec.noalias() += weights * inVec; - for (int i = 0; i < Layer::out_size; ++i) - out[i] = outVec(i, 0); + for(int i = 0; i < Layer::out_size; ++i) + { + out[i] = outVec(i); + outVec(i) = bias(i); + } } /** @@ -96,17 +93,21 @@ class Dense : public Layer void setBias(const T* b) { for(int i = 0; i < Layer::out_size; ++i) - weights(i, Layer::in_size) = b[i]; + { + bias(i) = b[i]; + outVec(i) = b[i]; + } } /** Returns the weights value at the given indices. */ T getWeight(int i, int k) const noexcept { return weights(i, k); } /** Returns the bias value at the given index. */ - T getBias(int i) const noexcept { return weights(i, Layer::in_size); } + T getBias(int i) const noexcept { return bias(i); } private: Eigen::Matrix weights; + Eigen::Matrix bias; Eigen::Matrix inVec; Eigen::Matrix outVec; @@ -121,8 +122,7 @@ template class DenseT { using out_vec_type = Eigen::Matrix; - using in_vec_type = Eigen::Matrix; - using mat_type = Eigen::Matrix; + using mat_type = Eigen::Matrix; public: static constexpr auto in_size = in_sizet; @@ -132,8 +132,7 @@ class DenseT : outs(outs_internal) { weights = mat_type::Zero(); - ins_internal = in_vec_type::Zero(); - ins_internal(in_size, 0) = (T)1; + bias = out_vec_type::Zero(); outs = out_vec_type::Zero(); } @@ -149,14 +148,8 @@ class DenseT /** Performs forward propagation for this layer. */ inline void forward(const Eigen::Matrix& ins) noexcept { - for (int i = 0; i < in_size; ++i) - ins_internal(i, 0) = ins(i, 0); - - /** - * out = | w b | * | input | - * | 1 | - */ - outs.noalias() = weights * ins_internal; + outs = bias; + outs.noalias() += weights * ins; } /** @@ -192,16 +185,16 @@ class DenseT void setBias(const T* b) { for(int i = 0; i < out_size; ++i) - weights(i, in_size) = b[i]; + bias(i) = b[i]; } Eigen::Map outs; private: T outs_internal alignas(RTNEURAL_DEFAULT_ALIGNMENT)[out_size]; - in_vec_type ins_internal; mat_type weights; + out_vec_type bias; }; } // namespace RTNeural