algorithm - 神经网络的层和神经元

标签 algorithm neural-network

我想了解更多关于神经网络的知识,我正在开发一个 C++ 程序来制作神经网络,但我坚持使用反向传播算法,很抱歉没有提供一些工作代码。
我知道有很多库可以用多种语言创建神经网络,但我更喜欢自己做一个。关键是我不知道实现特定目标(例如模式识别或函数逼近等)需要多少层和多少个神经元。
我的问题是:如果我想识别一些细节模式,比如在图像检测中,应该需要多少层和每层神经元?假设我的图像都是 8x8 像素,我自然会从 64 个神经元的输入层开始,但我不知道我必须在隐藏层和输出层中放置多少个神经元。比方说我必须区分猫和狗,或者不管你怎么想,输出层怎么可能?我可以想象一个只有一个神经元的输出层使用经典逻辑函数 (1/(1+exp(-x)) 输出 0 和 1 之间的值,当它接近 0 时,输入是一只猫,当接近 1 时它是一只狗,但是......它是正确的吗?如果我添加像鱼这样的新模式怎么办?如果输入包含一只狗和一只猫(......和一条鱼)怎么办?这让我想到输出层的logistic函数不太适合这样的模式识别,只是因为1/(1+exp(-x))的范围在(0,1)。我是否必须改变激活函数或者可能向输出层添加一些其他神经元?是否有其他一些激活函数更准确地做到这一点?每一层中的每个神经元是否具有相同的激活函数,或者层与层之间不同?

很抱歉提出所有这些问题,但这个主题对我来说不是很清楚。 我在互联网上阅读了很多,我发现图书馆都尚未实现且难以阅读,还有许多关于 NN 可以做什么的解释,但没有说明它如何做。
我从https://mattmazur.com/2015/03/17/a-step-by-step-backpropagation-example/读了很多和 http://neuralnetworksanddeeplearning.com/chap1.html ,在这里我了解了如何逼近一个函数(因为一层中的每个神经元都可以被认为是一个阶梯函数,具有特定的权重和偏差步长)以及反向传播算法的工作原理,但其他教程和类似教程更侧重于在预先存在的库上。我也看了这个问题Determining the proper amount of Neurons for a Neural Network但我还想涉及神经网络的激活函数,这是最好的,也是最好的。

预先感谢您的回答!

最佳答案

你的问题很笼统,所以我只能给出一些笼统的建议:

您需要的层数取决于您要解决的问题的复杂程度。从给定输入获得输出所需的计算越多,您需要的层数就越多。

单层网络只能解决非常简单的问题。这些被称为线性可分的并且通常是微不足道的。使用两层会更好,如果使用三层,至少在理论上,如果层中有足够的单元格,则可以执行各种分类任务。然而在实践中,通常最好向网络添加第 4 或第 5 层,同时减少单层内的单元数。

请注意,标准反向传播算法在超过 4 层或 5 层时表现不佳。如果您需要更多层,请查看深度学习

每一层内的细胞数量主要取决于输入的数量,如果您解决分类任务,还取决于您要检测的类的数量。在实践中,逐层减少单元格的数量是很常见的,但也有异常(exception)。

关于您关于输出函数的问题:在大多数情况下,您应该坚持使用一种类型的 sigmoid 函数。您描述的情况并不是真正的问题,因为您可以为“鱼”类添加另一个输出单元格。具体激活函数的选择并不是那么关键。基本上,您使用一个可以有效计算其值和导数的方法。

关于algorithm - 神经网络的层和神经元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37088687/

相关文章:

algorithm - 如何输出无向图的所有双连通分量?

模拟突发错误的算法

python - 如何在 Theano 上启用并行处理?无 GPU

python - 将Conv2DLayer与lasagne NeuralNet一起使用时出错

matlab - 如何使神经网络训练图表具有对数纵轴?

c++ - OpenCV 3 中的神经网络权重

java - 使用分布式编程的字符计数

java - Java中Dijkstra算法的实现

r - 除了 Logistic,RSNNS 包中还有哪些激活函数?

algorithm - 与多边形相交并修剪线