我正在 PyBrain 中创建一个简单的前馈神经网络来分类字符(26 个小写字母、26 个大写字母和 10 个数字)
有两种不同的文件——一种只有大写字母和数字,另一种有小写字母、数字和大写字母。
我必须创建两个不同的网络吗?在处理第一个文档时,有什么方法可以禁用大写节点?如果以后有更多的文档(文档的图像)集成到项目中,也会有其他的组合。为他们创建新的网络似乎很乏味。
提前致谢
PS:有人知道关于 pyBrain 的任何非常(非常)好的教程吗?我是初学者,文档仅涉及非常简单的示例。
我正在 PyBrain 中创建一个简单的前馈神经网络来分类字符(26 个小写字母、26 个大写字母和 10 个数字)
有两种不同的文件——一种只有大写字母和数字,另一种有小写字母、数字和大写字母。
我必须创建两个不同的网络吗?在处理第一个文档时,有什么方法可以禁用大写节点?如果以后有更多的文档(文档的图像)集成到项目中,也会有其他的组合。为他们创建新的网络似乎很乏味。
提前致谢
PS:有人知道关于 pyBrain 的任何非常(非常)好的教程吗?我是初学者,文档仅涉及非常简单的示例。
难怪每个单独的网络在其训练过的相应训练集上产生更好的性能。但是这些预测误差值具有误导性,因为在训练集上最小化误差是一个不适定问题。您的最终目标是最大化模型的泛化性能,使其在训练期间未见过的新数据上表现良好。想象一个网络,它只记住每个字符,因此功能更像一个哈希表。这样的网络将在训练数据上产生 0 错误,但在其他数据上表现不佳。
衡量泛化性能的一种方法是从可用数据中提取一小部分(例如 10%)并将其用作测试集。您在训练期间不使用此测试集,仅用于测量。
此外,您应该检查网络的拓扑。你使用多少个隐藏层和每个隐藏层有多少个神经元?确保您的拓扑足够大,以便它可以解决您的问题的复杂性。
还可以查看其他提高网络泛化性能的技术,例如L1 正则化(在每个训练步骤后减去一小部分固定的权重绝对值)、L2 正则化(在每次训练后减去一小部分权重step)或Dropout(在训练期间随机关闭隐藏单元,并在训练完成后立即将权重向量减半)。此外,您应该考虑更有效的训练算法,例如RPROP-或RMSProp,而不是简单的反向传播(请参阅Geoffrey Hinton 的神经网络课程)。您还应该考虑包含书面数字 0-9 的 MNIST 数据集来测试您的设置(您应该很容易在测试集上实现少于 300 个错误分类)。
要回答有关如何省略某些输出神经元的原始问题,您可以创建自己的层模块。看一下 SoftmaxLayer,但在应用 softmax 激活函数之前,将所有属于您要省略的类的输出神经元设置为 0。您需要outbuf
在_forwardImplementation
. 如果您想在训练期间使用它,请确保将这些类的错误信号设置为零,然后再将错误反向传播到前一层(通过操纵_backwardImplementation
)。这可能很有用,例如,如果您有不完整的数据并且不想丢弃仅包含一个 NaN 值的每个样本。但在你的情况下,你实际上不需要这个。
你不需要两个网络,一个就足够了。您将需要 62 个标签(26 个上、26 个下和 10 个数字)和一个更大的数据集来训练这些标签。您可能可以使用这两个文档来构建数据集。
Prog Ng 在他的 coursera 课程中提供了一个非常好的手写识别教程(Lectures 3 and 4 at http://www.ml-class.org)。我想这门课很快就要开始了,你会发现它在分类手写数字方面非常有用