【发布时间】:2018-04-09 22:32:23
【问题描述】:
我最近看了一个视频,启发我编写自己的神经网络系统,我希望网络中的节点数量可以调整。
起初我在运行时通过解析节点数数组来实现这一点,但我想知道是否可以在编译时这样做。这是我希望完成的事情的一个例子。
template<int FirstNodes, int SecondNodes, int... OtherNodes>
class Net
{
tuple<Eigen::Matrix<float, FirstNodes, SecondNodes>, ...> m_weights;
// More matricies with the values from the OtherNodes
};
作为一个更详细的例子,Net<784, 16, 16, 10> n;n.m_weight 应该有类型
tuple<Eigen::Matrix<float, 784, 16>,
Eigen::Matrix<float, 16, 16>,
Eigen::Matrix<float, 16, 10>>
根据我对 C++ 和 constexpr 的了解,这应该是可能的。
我应该补充一点,我能够做到
template<int FirstNodes, int SecondNodes, int... OtherNodes>
class Net
{
public:
Net()
{
auto nodes = {FirstNodes, SecondNodes, OtherNodes...};
auto i = nodes.begin();
do
{
// Eigen::Matrix<float, Dynamic, Dynamic>
Eigen::MatrixXf m(*(i++), *i);
} while (i+1 != nodes.end());
}
};
但是我只是再次使用动态矩阵,这不是我所希望的。
任何建议或工作示例将不胜感激。
【问题讨论】:
-
顺便说一句,
m(*(i++), *i)行调用了直到 c++14 的未定义行为,在 c++17 中未指定 -
无耻的自我推销你可能会觉得this repo很有趣
标签: c++ c++11 templates variadic-templates template-meta-programming