【问题标题】:Disable certain output nodes in PyBrain在 PyBrain 中禁用某些输出节点
【发布时间】:2013-03-21 07:07:15
【问题描述】:

我正在 PyBrain 中创建一个简单的前馈神经网络来分类字符(26 个小写字母、26 个大写字母和 10 个数字)

有两种不同的文档——一种只有大写字母和数字,另一种有小写字母、数字和大写字母。

我必须创建两个不同的网络吗?在处理第一个文档时,有什么方法可以禁用大写节点?如果以后有更多的文档(文档的图像)集成到项目中,也会有其他的组合。为他们创建新的网络似乎很乏味。

提前致谢

PS:有谁知道关于 pyBrain 的任何真正(真正)好的教程?我是初学者,文档仅针对非常简单的示例。

【问题讨论】:

  • 但是当只给出小写输入时,它如何禁用大写节点呢?我的数据集非常小(大约 1000 个字符),而且这种预测几乎总是错误的。 (即一个网络)我目前有2个网络,预测更好。

标签: python neural-network ocr pybrain


【解决方案1】:

您不需要两个网络,一个就足够了。您将需要 62 个标签(26 个上、26 个下和 10 个数字)和一个更大的数据集来训练这些标签。您可能可以通过使用这两个文档来构建数据集。

Prog Ng 在他的 coursera 课程中提供了一个非常好的手写识别教程(讲座 3 和 4,http://www.ml-class.org)。我想这门课马上就要开课了,你会发现它对手写数字的分类非常有用

【讨论】:

    【解决方案2】:

    难怪每个单独的网络在其训练过的相应训练集上产生更好的性能。但是这些预测误差值具有误导性,因为在训练集上最小化误差是一个病态问题。您的最终目标是最大化模型的泛化性能,使其在训练期间未见过的新数据上表现良好。想象一个网络,它只记住每个字符,因此功能更像一个哈希表。这样的网络会在训练数据上产生 0 错误,但在其他数据上表现不佳。

    衡量泛化性能的一种方法是从可用数据中提取一小部分(例如 10%)并将其用作测试集。您在训练期间不使用此测试集,仅用于测量。

    此外,您应该检查网络的拓扑。你使用多少个隐藏层和每个隐藏层有多少个神经元?确保您的拓扑足够大,以便它可以解决您的问题的复杂性。

    还可以看看其他提高网络泛化性能的技术,例如 L1 正则化(在每个训练步骤后减去一小部分固定的权重绝对值), L2 正则化(在每个训练步骤后减去一小部分权重)或Dropout(在训练期间随机关闭隐藏单元,并在训练完成后立即将权重向量减半)。此外,您应该考虑更有效的训练算法,例如 RPROP-RMSProp,而不是简单的反向传播(参见 Geoffrey Hinton's coursera course on neural networks)。您还应该考虑包含书面数字 0-9 的 MNIST 数据集来测试您的设置(您应该很容易在测试集上实现少于 300 个错误分类)。

    要回答您关于如何省略某些输出神经元的原始问题,您可以创建一个自己的层模块。看一下 SoftmaxLayer,但在应用 softmax 激活函数之前,将所有属于您要省略的类的输出神经元设置为 0。您需要操作_forwardImplementation 中的outbuf 变量。如果您想在训练期间使用它,请确保在将错误反向传播到前一层之前将这些类的错误信号设置为零(通过操作_backwardImplementation)。这可能很有用,例如如果您有不完整的数据并且不想丢弃仅包含一个 NaN 值的每个样本。但在你的情况下,你实际上不需要这个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      相关资源
      最近更新 更多