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