我想知道更多关于神经网络的知识,我正在开发一个制作神经网络的C++程序,但我被BackPropagation算法卡住了,很抱歉没有提供一些工作代码。
我知道有这么多的库可以用来创建多种语言的神经网络,但我更喜欢自己做一个。重点是,我不知道为了实现一个特定的目标,需要多少层和多少神经元,比如模式识别,或者函数近似,或者其他什么。
我的问题是:如果我想识别一些特定的模式,比如在图像检测中,需要多少层和每层神经元?假设我的图像都是8x8像素,我会自然地从64个神经元的输入层开始,但我不知道我必须在隐藏层和输出层中放置多少个神经元。比方说,我必须与猫和狗区分开来,或者不管你怎么想,输出层是怎么回事?我可以想象一个输出层-一个神经元使用经典逻辑函数(1/(1+exp(-x))输出介于0和1之间的值,当它接近0时,输入是一只猫,当接近1时,它是一只狗,但是……这是正确的吗?如果我添加一个像鱼一样的新模式呢?如果输入包含一只狗和一只猫( ..and a fish)呢?这使我认为输出层中的逻辑函数不太适合这样的模式识别,只是因为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,但我也想涉及神经网络的激活函数,这是最好的,什么是最好的。
提前感谢你的回答!
发布于 2016-05-07 21:17:00
你的问题很笼统,所以我只能给出一些一般性的建议:
您需要的层数取决于您要解决的问题的复杂程度。从给定输入获取输出所需的计算越多,所需的层就越多。
单层网络只能解决非常简单的问题。这些被称为线性可分的,通常是微不足道的。有了两层,它变得更好;有了三层,至少在理论上,如果层中有足够的单元,所有类型的分类任务都可以执行。然而,在实践中,将第四层或第五层添加到网络中,同时减少单层中的小区数量通常更好。
请注意,标准反向传播算法在超过4层或5层的情况下表现不佳。如果你需要更多的层次,可以看看深度学习。
每层中单元格的数量主要取决于输入的数量,如果您解决了分类任务,则取决于要检测的类别的数量。在实践中,从一层到另一层减少单元的数量是很常见的,但也有例外。
关于你关于输出函数的问题:在大多数情况下,你应该坚持使用一种类型的sigmoid函数。您描述的情况并不是真正的问题,因为您可以为"fish“类添加另一个输出单元格。选择特定的激活函数并不是那么关键。基本上,你使用的是一个可以有效计算其值和导数的函数。
发布于 2016-05-10 02:19:07
@Frank Puffer已经提供了一些不错的信息,但让我补充一下我的两点意见。首先,您所问的大部分内容都在hyperparameter optimization领域。尽管有各种“经验法则”,但实际情况是确定最佳架构(层的数量/大小、连接结构等)。而像学习率这样的其他参数通常需要广泛的实验。好消息是,这些超参数的参数化是神经网络实现的最简单方面之一。因此,我建议将重点放在构建您的软件上,以使层的数量、层的大小、学习率等都可以轻松配置。
现在,您特别询问了如何检测图像中的模式。值得一提的是,使用标准多层感知器(MLP)对原始图像数据执行分类的计算代价可能很高,特别是对于较大的图像。通常使用旨在提取有用的、空间局部特征的架构(即:Convolutional Neural Networks或CNN)。
为此,您仍然可以使用标准的MLP,但计算复杂性会使其成为一个站不住脚的解决方案。例如,CNN的稀疏连接性大大减少了需要优化的参数数量,同时构建了更适合于图像分类的表示的概念层次结构。
无论如何,我建议使用随机梯度下降来实现反向传播进行优化。这仍然是通常用于训练神经网络、CNN、RNN等的方法。
关于输出神经元的数量,这是一个确实有一个简单答案的问题:使用" one -hot“编码。对于你想要识别的每一类,你都有一个输出神经元。在您的狗、猫和鱼类的示例中,您有三个神经元。对于表示狗的输入图像,“狗”神经元的值应该是1,其他所有神经元的值都是0。然后,在推理过程中,您可以将输出解释为反映神经网络置信度的概率分布。例如,如果您得到输出狗:0.70,猫:0.25,鱼:0.05,那么您有70%的置信度确定图像是一只狗,依此类推。
对于激活函数,我看到的最新研究似乎表明,Rectified Linear Units通常是一个很好的选择,因为它们很容易区分和计算,而且它们避免了一个困扰更深层次网络的问题,称为“消失梯度问题”。
祝你好运!
https://stackoverflow.com/questions/37088687
复制相似问题