您好我正在编写一个c ++反向传播算法,它由1个输入层1隐藏层和1个输出层组成。 我很好奇如何初始化我的inputlayer,hiddenlayer和outputlayer。
这就是我得到的:
struct Neuron {
double activation;
double bias;
double *incomingWeights;
};
struct Network {
double *targetLayer;
Neuron *inputLayer;
Neuron *hiddenLayer;
Neuron *outputLayer;
};
ann.inputLayer = malloc(din * sizeof * Neuron); //ERROR
for (int i = 0; i < din; i++) {
ann.inputLayer[i].activation = 0;
ann.inputLayer[i].bias = 0;
ann.inputLayer[i].incomingWeights = NULL;
}
ann.outputLayer = malloc(dout * sizeof * Neuron); //ERROR
for (int i = 0; i < dout; i++) {
ann.outputLayer[i].activation = 0;
ann.outputLayer[i].bias = 0;
ann.outputLayer[i].incomingWeights = new double[dhid];
}
din表示输入图层中的神经元数量。 dhid表示隐藏层中的神经元数量。 dout表示输出层中的神经元数量。 我没有打扰显示我的隐藏层的初始化导致它不重要 谢谢
我根据我的IDE(netbeans)
在错误显示的行上写了// ERROR答案 0 :(得分:2)
首先,你永远不想在调用代码时进行默认初始化,你可以为你的struct创建一个构造函数并在那里执行:
struct Neuron {
Neuron() : activation(0.0), bias(0.0), incomingWeights(0) {}
double activation;
double bias;
double *incomingWeights;
};
然后(因为这是C ++)
for (int i = 0; i < din; i++) {
ann.inputLayer[i] = new Neuron[din];
您应该在C ++中使用new
而不是malloc
,但如果您确实需要malloc
,则需要修复您的陈述,以便:
ann.inputLayer = (Neuron*)malloc(din * sizeof(Neuron));
答案 1 :(得分:1)
作为对您所拥有的的最小改动,请更改此:
ann.inputLayer = malloc(din * sizeof * Neuron);
对此:
ann.inputLayer = new Neuron[din];
new
这里对于您的代码的读者更清楚,在需要时执行构造,并返回正确的指针类型。
(与dout
行相同)
编辑:
您还可能会发现std::vector
更容易管理指针。
答案 2 :(得分:0)
仅供记录:您遇到错误的原因是因为您正在使用C ++编译器编译C代码。 malloc
会返回void*
。在C中,这隐式转换为任何其他指针类型;在C ++中,您需要一个显式转换。
除此之外,正如其他人所说,你应该从不在C ++中使用malloc
(除非出于与C兼容的原因 - 即你将指针传递给写入的函数在C中将调用free
。实际上,在你所展示的那些中,应该没有指针,也没有动态分配:定义你的类型,添加构造函数,当你需要多个时,使用std::vector
。