-3

您好,我正在用 C++ 编写反向传播算法,它由 1 个输入层、1 个隐藏层和 1 个输出层组成。我很好奇如何初始化我的输入层、隐藏层和输出层。

这就是我得到的:

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

4

3 回答 3

3

首先,您永远不想在调用代码中进行默认初始化,您可以为您的结构创建一个构造函数并在那里执行:

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++ 中使用newover malloc,但如果您确实需要malloc您的语句,则需要修复:

ann.inputLayer = (Neuron*)malloc(din * sizeof(Neuron)); 
于 2013-04-14T19:10:03.490 回答
1

不要malloc在 C++ 中使用。

作为对您所拥有的内容的最小更改,请更改以下内容:

ann.inputLayer = malloc(din * sizeof * Neuron);

对此:

ann.inputLayer = new Neuron[din];

new这里对您的代码的读者来说更清楚,在需要时执行构造,并返回正确的指针类型。

(与dout线路相同)

编辑:

您还可能会发现管理指针要容易std::vector 得多。

于 2013-04-14T19:08:47.517 回答
0

仅作记录:您收到错误的原因是因为您正在使用 C++ 编译器编译 C 代码。 malloc返回一个void*。在 C 中, this 隐式转换为任何其他指针类型;在 C++ 中,您需要显式转换。

除此之外,正如其他人所说,您永远不应该在 C++ 中使用malloc(除非出于与 C 兼容的原因,即您将指针传递给用 C 编写的函数,该函数将调用free它)。事实上,在你所展示的小部分中,不应该有任何指针和动态分配:定义你的类型,添加构造函数,当你需要多个时,使用std::vector.

于 2013-04-14T19:17:46.857 回答