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