《精通Matlab神经网络》书中示例10-16,在创建BP网络时,原来的写法是:

  net = newff(minmax(alphabet),[S1 S2],{'logsig' 'logsig'},'traingdx');

 

因为运行过程中有提示,自然想改成新写法(参考之前的随笔《MATLAB神经网络函数NEWFF()新旧用法差异》):

  net = newff(alphabet, targets, S1, {'logsig', 'logsig'}, 'traingdx');

     net.divideFcn = '';

很不幸的是,结局惨不忍睹:

于是开始对比研究……最终发现,新式写法还需要去掉输入输出的处理函数。

于是,到目前为止,为了让新式写法等价于旧式写法,在newff()之后还需要添加以下几笔:

  net.divideFcn = '';
  net.inputs{1}.processFcns = {};
  net.outputs{2}.processFcns = {};      % 若有n个隐层,则此处下标为n+1

 

【浅析】新式实现中,newff()的默认处理函数有:fixunknowns, removeconstantrows, mapminmax。其中罪魁祸首是mapminmax,因为它把[0,1]的输入数据映射到了[-1,1]区间。而

我们根据问题的实际情况,即二值图像像素值范围是[0,1],从而使用了定义域也[0,1]的传递函数logsig(),和mapminmax()是不匹配的。