【发布时间】:2019-10-08 19:16:03
【问题描述】:
我正在尝试实现神经网络。为此,我认为我可以对大多数超参数使用模板参数。它开始变得困难,我怀疑它可能无法实现我想要的。
我有一个基本的神经元类
class NeuronBase { /* virtual output method */ };
我有一个输入神经元
class InputNeuron : public NeuronBase { /* overrides output */ };
以及大多数层中使用的适当神经元类型
template<std::size_t NumInputs>
class Neuron : public NeuronBase
{
public:
Neuron(std::array<NeuronBase*,NumInputs> prevLayer)
:
m_inputLayer(prevLayer)
{}
/* override output method */
protected:
std::array<NeuronBase*,NumInputs> m_inputLayer;
};
这些都包含在一个层中:
template<std::size_t NumNeurons>
class Layer
{
public:
typedef std::array<NeuronBase*,NumNeurons> NeuronArray;
Layer(NeuronArray neurons)
:
m_neurons(neurons)
{}
NeuronArray& GetNeurons() const { return m_neurons; }
protected:
NeuronArray m_neurons;
};
这些层被网络封装:
template<std::size_t NumInputs, std::size_t NumOutputs, std::size_t... HiddenSizes>
class NeuralNetwork
{
public:
NeuralNetwork()
:
m_hiddenLayers(/* WTF do I do?? */)
{
}
protected:
std::array<InputNeuron,NumInputs> m_inputLayer;
Layer<NumOutputs> m_outputLayer;
std::tuple<Layer<HiddenSizes>...> m_hiddenLayers;
};
会这样创建:
int main()
{
NeuralNetwork<126,7,252,63> nn;
return 0;
}
这导致一个具有 126 个输入、7 个输出和两个隐藏层的网络,第一个隐藏层 252 个,第二个隐藏层有 63 个神经元。
我省略了一些你通常会在神经网络中看到的东西。
我遇到的问题是初始化网络中的层。 m_hiddenLayers 需要使用引用输入层的第一个元素进行初始化,其余元素使用std::tuple 中的前一项进行初始化,并且还需要使用正确的类型创建它们,即Neuron 而不是NeuronBase .
我怎样才能做到这一点?
【问题讨论】: