Niedawno obejrzałem wideo, które zainspirowało mnie do napisania własnego systemu sieci neuronowej, i chciałem, aby ilość węzłów w sieci była regulowana.Klasa z typami zależnymi od szablonów variadycznych
Najpierw osiągnąłem to w czasie wykonywania, analizując tablicę liczb węzłów, ale zastanawiałem się, czy mógłbym to zrobić w czasie kompilacji. Oto przykład tego, co miałem nadzieję osiągnąć.
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
};
W bardziej szczegółowym przykładzie Net<784, 16, 16, 10> n;
n.m_weight powinien mieć type
tuple<Eigen::Matrix<float, 784, 16>,
Eigen::Matrix<float, 16, 16>,
Eigen::Matrix<float, 16, 10>>
Z tego, co wiem o C++ i constexpr, powinno to być możliwe.
Dodam, że jestem w stanie zrobić
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());
}
};
Ale ja po prostu ponownie stosując dynamiczne matricies i że nie jest to, co miałem nadzieję.
Wszelkie porady lub przykłady pracy byłyby mile widziane.
nawiasem mówiąc, linia 'm (* (i ++), * i)' niezdefiniowanej zachowanie wywołuje aż do C++ 14, nie określone w C++ 17 –
* bezwstydny samo promowanie * można wybrać [ to repo] (https://github.com/liammcinroy/MetaTemplateNeuralNet) jest interesujące –