C++ FANN fann_run 总是产生相同的输出
C++ FANN fann_run always produce same output
我正在使用 FANN 库构建神经网络来处理回归问题。问题是,一旦网络在相关训练集上接受了训练(这似乎工作得很好),每个单独的测试输出完全相同的输出。换句话说,给定我的 16 个预测变量的任何状态,根据 ANN,我的预测输出是相同的。
我的猜测是网络正确地计算了计算的第一行,然后总是在其他计算中输出这个结果,不管我给它什么(因为它似乎在第一个训练示例中做得很好,给出准确的预测)。
例如,我的第一个训练示例变量是:
1 1 13.5 13.5 13.5 14.5 14.4 14.3 14.3 14.2 14.5 13 11.7 12.2 12.2 11.3
我的目标输出是 14.5,在每次测试中,网络输出介于 14.69 和 14.7 之间(由于计算时间短,而且我只是在玩这个包,我每次都训练它 运行 代码)。
所以,这个输出对于那组数据来说似乎是完全合法的。
问题是,当我尝试在其他几个输入上 运行 时,我总是得到相同的 14.69/14.7(即使是最小的数字也有相同的输出)。
由于网络似乎正确地处理了训练样例,学习了关系并在一个新的测试样例上正确计算,我倾向于相信所有训练部分都是正确的。由于网络没有理由总是输出相同的值,我的猜测是我的测试方式不正确。
我的问题是:在新数据集上测试 FANN 神经网络的确切语法是什么?而且,我如何 print/save 相应的输出?
这是我的代码的当前状态:
fann_type *calc_out;
fann_type input[16];
for (int i = 0; i < 20; i++)
{
if (!rowHasNA(timeSerie, i))
{
cout << "Input : ";
for (int j = 1; j < 17; j++)
{
input[j - 1] = timeSerie(i, j);
cout << input[j - 1] << " ";
}
cout << endl;
calc_out = fann_run(ann, input);
cout << "Input " << i << " gives : " << calc_out[0] << endl;
}
}
其中:
rowHasNA
是我用来判断我的例子是否至少有一个 NA 的自定义函数
ann
是一个 fann*
已经被训练过
timeSerie
是一个 matrix<double>
其中每一行都是一个测试示例
我对 FANN 包的工作原理仍然有些困惑,因为我没有找到关于如何训练和测试网络的真正清晰的文档。我很难理解 fann_type
是如何工作的。
提前致谢。
可能与谁有关。
上面写的代码是正确的:在网络经过适当训练的情况下,它设法为不同的输入输出不同的值。
主要问题是训练网络。由于它给了我一个正确的答案(14.7,非常接近预期的 14.5),我认为它已经过适当的训练。实际上,它不是,而是给出了与训练目标相对应的"best mean value"。由于我的训练集方差很小,无论输入什么输入,总是输出相同的值,给出了一个不错的 MSE(虽然,比我在 R 和 Octave 中的差很多,但因为我从未使用过 FANN,所以我做了不知道会发生什么)。
解决方法很简单,我早该想到的:特征缩放。
鉴于我在 Internet 上看到的一些文献,我认为该软件包正在自行扩展功能。使用最基本的代码来训练网络,特征缩放不适用于训练集。
我建议在 0 和 1 之间缩放特征(x - 最小值/最大值 - 最小值)。
我正在使用 FANN 库构建神经网络来处理回归问题。问题是,一旦网络在相关训练集上接受了训练(这似乎工作得很好),每个单独的测试输出完全相同的输出。换句话说,给定我的 16 个预测变量的任何状态,根据 ANN,我的预测输出是相同的。
我的猜测是网络正确地计算了计算的第一行,然后总是在其他计算中输出这个结果,不管我给它什么(因为它似乎在第一个训练示例中做得很好,给出准确的预测)。
例如,我的第一个训练示例变量是:
1 1 13.5 13.5 13.5 14.5 14.4 14.3 14.3 14.2 14.5 13 11.7 12.2 12.2 11.3
我的目标输出是 14.5,在每次测试中,网络输出介于 14.69 和 14.7 之间(由于计算时间短,而且我只是在玩这个包,我每次都训练它 运行 代码)。 所以,这个输出对于那组数据来说似乎是完全合法的。
问题是,当我尝试在其他几个输入上 运行 时,我总是得到相同的 14.69/14.7(即使是最小的数字也有相同的输出)。
由于网络似乎正确地处理了训练样例,学习了关系并在一个新的测试样例上正确计算,我倾向于相信所有训练部分都是正确的。由于网络没有理由总是输出相同的值,我的猜测是我的测试方式不正确。
我的问题是:在新数据集上测试 FANN 神经网络的确切语法是什么?而且,我如何 print/save 相应的输出?
这是我的代码的当前状态:
fann_type *calc_out;
fann_type input[16];
for (int i = 0; i < 20; i++)
{
if (!rowHasNA(timeSerie, i))
{
cout << "Input : ";
for (int j = 1; j < 17; j++)
{
input[j - 1] = timeSerie(i, j);
cout << input[j - 1] << " ";
}
cout << endl;
calc_out = fann_run(ann, input);
cout << "Input " << i << " gives : " << calc_out[0] << endl;
}
}
其中:
rowHasNA
是我用来判断我的例子是否至少有一个 NA 的自定义函数
ann
是一个fann*
已经被训练过timeSerie
是一个matrix<double>
其中每一行都是一个测试示例
我对 FANN 包的工作原理仍然有些困惑,因为我没有找到关于如何训练和测试网络的真正清晰的文档。我很难理解 fann_type
是如何工作的。
提前致谢。
可能与谁有关。
上面写的代码是正确的:在网络经过适当训练的情况下,它设法为不同的输入输出不同的值。
主要问题是训练网络。由于它给了我一个正确的答案(14.7,非常接近预期的 14.5),我认为它已经过适当的训练。实际上,它不是,而是给出了与训练目标相对应的"best mean value"。由于我的训练集方差很小,无论输入什么输入,总是输出相同的值,给出了一个不错的 MSE(虽然,比我在 R 和 Octave 中的差很多,但因为我从未使用过 FANN,所以我做了不知道会发生什么)。
解决方法很简单,我早该想到的:特征缩放。
鉴于我在 Internet 上看到的一些文献,我认为该软件包正在自行扩展功能。使用最基本的代码来训练网络,特征缩放不适用于训练集。
我建议在 0 和 1 之间缩放特征(x - 最小值/最大值 - 最小值)。