如何判断一个神经网络?

how to judge a neural network?

我写了一个神经网络, 它主要基于(修复错误)James McCaffrey https://visualstudiomagazine.com/articles/2015/04/01/back-propagation-using-c.aspx 的神经网络,我遇到了各种 Git 项目和书籍,使用他的代码 当他为 MS 研究工作时,我认为他的工作会很好,也许不是最重要的(它不是在 cuda 之上的 运行 左右)但我可以阅读它的代码,虽然我不喜欢它的科学方面。他的示例在与我的问题非常相似的数据集上工作。

我的目标是解决一些图像分类问题(基于像素信息的数据集) 这个问题不容易重现,但我设法创建了一个包含 50 个好场景和 50 个坏场景的数据集。当在散点图中绘制测量值时,两组都有很多模糊的边界重叠。我自己无法从中得到一些东西,它是模糊的 me.As 我每个样本有 5 个输入,我想知道神经网络是否能够找到内部关系并解决我的模糊数据分类问题。

好吧,确实如此..好吧,我猜。
取决于权重的播种(我达到了 80%)、节点数量和学习时间;我的训练分数在 90% 到 85% 左右,最近达到了 95%

首先我尝试了权重的随机初始化。 然后我玩了节点的数量。 我玩过学习率、动量和权重衰减。 他们从(得分 85% 到 90%):

// as in the example code i used
int maxEpochs = 100000;
double learnRate = 0.05;
double momentum = 0.01;
double weightDecay = 0.0001;

至(得分 95%)

int maxEpochs = 100000;
double learnRate = 0.02;  //had a huge effect
double momentum = 0.01;
double weightDecay = 0.001; //had a huge effect

与更改网络的随机初始化和更改上述常量相比,节点数量的影响较小,这让我感到有些惊讶。

然而这让我很奇怪。

首先,如果我没有理解正确,请见谅,但看起来您有 100 个训练示例,但没有验证/测试集。这对于训练集来说相当小,这使得神经网络很容易对其进行过度训练。你似乎也选择了一个小的 NN,所以也许你实际上并没有过拟合。最好的检查方法是有一个测试集。

关于您的问题:

  • "good score" 是什么完全取决于您的问题。例如,在 MNIST(广泛使用的数字识别数据集)上,这会被认为是非常糟糕的,最好的分数超过 99.7%(并且使用 ConvNet 获得 99% 并不难),但是在 ImageNet 上,这将是非常棒的.了解你是否优秀的一个好方法是以某种方式与人类表现进行比较。达到它通常很难,所以低于它是好的,高于它是很好的,远低于它是不好的。同样,这是主观的,取决于您的问题。

  • 您应该明确地尝试最小化隐藏节点的数量,遵循 Occam's rasor 规则:在多个模型中,最简单的就是最好的。它有 2 个主要优点:它 运行 更快,并且泛化效果更好(如果两个模型在您的训练集上表现相似,那么最简单的模型很可能在新的测试集上表现更好)。

  • 众所周知,初始化会改变很多结果。然而,最大的区别在于不同的初始化方法:常量/简单随机(广泛使用,通常是 (t运行cated) 正态分布)/更聪明的随机(例如 Xavier 初始化)/"cleverer"初始化(预先计算的功能等。更难使用)。在以完全相同的方式生成的两个随机初始化之间,性能差异应该不会那么大。我的猜测是,在某些情况下,您只是没有训练足够长的时间(正确训练所需的时间可能会因初始化而有很大变化)。我的另一个猜测是您的数据集和网络的规模较小,使得评估比通常更依赖于初始权重。

学习率和权重衰减对结果的影响很大是正常的,但是要有效地找到最佳值可能很困难。