可以,但是网络规模太大,很臃肿,需要调整的参数过多,影响收敛速度。
关于隐层节点数:在BP网络中,隐层节点数的选择非常重要,它不仅对建立的神经网络模型的性能影响很大,而且是训练时出现“过拟合”的直接原因,但是目前理论上还没有一种科学的和普遍的确定方法。
目前多数文献中提出的确定隐层节点数的计算公式都是针对训练样本任意多的情况,而且多数是针对最不利的情况,一般工程实践中很难满足,不宜采用。事实上,各种计算公式得到的隐层节点数有时相差几倍甚至上百倍。
为尽可能避免训练时出现“过拟合”现象,保证足够高的网络性能和泛化能力,确定隐层节点数的最基本原则是:在满足精度要求的前提下取尽可能紧凑的结构,即取尽可能少的隐层节点数。
研究表明,隐层节点数不仅与输入/输出层的节点数有关,更与需解决的问题的复杂程度和转换函数的型式以及样本数据的特性等因素有关。
在确定隐层节点数时必须满足下列条件:(1)隐层节点数必须小于N-1(其中N为训练样本数),否则,网络模型的系统误差与训练样本的特性无关而趋于零,即建立的网络模型没有泛化能力,也没有任何实用价值。
同理可推得:输入层的节点数(变量数)必须小于N-1。(2)训练样本数必须多于网络模型的连接权数,一般为2~10倍,否则,样本必须分成几部分并采用“轮流训练”的方法才可能得到可靠的神经网络模型。
总之,若隐层节点数太少,网络可能根本不能训练或网络性能很差;若隐层节点数太多,虽然可使网络的系统误差减小,但一方面使网络训练时间延长,另一方面,训练容易陷入局部极小点而得不到最优点,也是训练时出现“过拟合”的内在原因。
因此,合理隐层节点数应在综合考虑网络结构复杂程度和误差大小的情况下用节点删除法和扩张法确定。
谷歌人工智能写作项目:爱发猫
对n-1层和n层而言n-1层的任意一个节点,都和第n层所有节点有连接好文案。即第n层的每个节点在进行计算的时候,激活函数的输入是n-1层所有节点的加权。
全连接是一种不错的模式,但是网络很大的时候,训练速度回很慢。部分连接就是认为的切断某两个节点直接的连接,这样训练时计算量大大减小。
输出神经元个数是按你的需要确定的,比如你需要模拟函数y=1/x,那么你的输入向量就是x,输出就是y=1/x,也就是一个输出。再比如你需要模拟水体中的cod,bod参数值,那么你的输出就是两个。
你的情况,比如说,你做符号识别的目的是将符号区分为正常符号和异常符号,那么你的输出就是2个,是由实际需要来的。
BP神经网络的训练集需要大样本吗?一般样本个数为多少?
BP神经网络样本数有什么影响学习神经网络这段时间,有一个疑问,BP神经网络中训练的次数指的网络的迭代次数,如果有a个样本,每个样本训练次数n,则网络一共迭代an次,在n>>a情况下,网络在不停的调整权值,减小误差,跟样本数似乎关系不大。
而且,a大了的话训练时间必然会变长。换一种说法,将你的数据集看成一个固定值,那么样本集与测试集也可以按照某种规格确定下来如7:3所以如何看待样本集的多少与训练结果呢?
或者说怎么使你的网络更加稳定,更加符合你的所需。
我尝试从之前的一个例子中看下区别如何用70行Java代码实现深度神经网络算法作者其实是实现了一个BP神经网络,不多说,看最后的例子一个运用神经网络的例子最后我们找个简单例子来看看神经网络神奇的效果。
为了方便观察数据分布,我们选用一个二维坐标的数据,下面共有4个数据,方块代表数据的类型为1,三角代表数据的类型为0,可以看到属于方块类型的数据有(1,2)和(2,1),属于三角类型的数据有(1,1),(2,2),现在问题是需要在平面上将4个数据分成1和0两类,并以此来预测新的数据的类型。
图片描述我们可以运用逻辑回归算法来解决上面的分类问题,但是逻辑回归得到一个线性的直线做为分界线,可以看到上面的红线无论怎么摆放,总是有一个样本被错误地划分到不同类型中,所以对于上面的数据,仅仅一条直线不能很正确地划分他们的分类,如果我们运用神经网络算法,可以得到下图的分类效果,相当于多条直线求并集来划分空间,这样准确性更高。
图片描述简单粗暴,用作者的代码运行后训练5000次。
根据训练结果来预测一条新数据的分类(3,1)预测值(3,1)的结果跟(1,2)(2,1)属于一类属于正方形这时如果我们去掉2个样本,则样本输入变成如下//设置样本数据,对应上面的4个二维坐标数据double[][]data=newdouble[][]{{1,2},{2,2}};//设置目标数据,对应4个坐标数据的分类double[][]target=newdouble[][]{{1,0},{0,1}};12341234则(3,1)结果变成了三角形,如果你选前两个点你会发现直接一条中间线就可以区分这时候的你的结果跟之前4个点时有区别so你得增加样本直到这些样本按照你所想要的方式分类,所以样本的多少重要性体现在,样本得能反映所有的特征值(也就是输入值),样本多少或者特征(本例子指点的位置特征)决定的你的网络的训练结果,!
!!这是我们反推出来的结果。这里距离深度学习好像近了一步。另外,这个70行代码的神经网络没有保存你训练的网络,所以你每次运行都是重新训练的网络。
其实,在你训练过后权值已经确定了下来,我们确定网络也就是根据权值,so只要把训练后的权值保存下来,将需要分类的数据按照这种权值带入网络,即可得到输出值,也就是一旦网络确定,权值也就确定,一个输入对应一个固定的输出,不会再次改变!
个人见解。
最后附上作者的源码,作者的文章见开头链接下面的实现程序可以直接拿去使用,import.Random;publicclassBpDeep{publicdouble[][]layer;//神经网络各层节点publicdouble[][]layerErr;//神经网络各节点误差publicdouble[][][]layer_weight;//各层节点权重publicdouble[][][]layer_weight_delta;//各层节点权重动量publicdoublemobp;//动量系数publicdoublerate;//学习系数publicBpDeep(int[]layernum,doublerate,doublemobp){=mobp;=rate;layer=newdouble[layernum.length][];layerErr=newdouble[layernum.length][];layer_weight=newdouble[layernum.length][][];layer_weight_delta=newdouble[layernum.length][][];Randomrandom=newRandom();for(intl=0;l。
在从14变成16的时候,不是一一对应的关系。16个featuremap中的每一个都是由前一层的14个和新的kernel卷积,然后把得到的14个结果变成1个featuremap。
下面的图或许可以帮你理解。(图片来源:网页链接)
一个最简单的分类,是在平面上画一条直线,左边为类0,右边为类1,直线表示为这是一个分类器,输入(x,y),那么,要求的参数有三个:a,b,c。另外注意c的作用,如果没有c,这条直线一定会过原点。
因此,我们可以设计一个简单的神经网络,包含两层,输入层有三个节点,代表x,y,1,三条线分别代表a,b,cg(z)对传入的值x进行判别,并输出结果。
但是,由于z的值可能为[],为了方便处理,需要将其压缩到一个合理的范围,还需sigmoid函数:这样的激励函数,能够将刚才的区间,压缩到。