Art1神经网络是Art家族里最年轻的也是结构和算法方面最简单的成员,网络采用非监督机制的竞争学习方法,能够在不给定目标输出的情况下通过连结两层神经元权值的自适应改变实现对输入模式的自组织学习并形成知识(记忆),进而支持模式识别和预测等行为。就像上一篇说过的那样,这个小程序纯属熟悉Art网络的学习过程以及编程实现方法,过一阵子就要像Art2正式进攻了。
程序内容仅仅是关于实现《神经网络设计》上面一个3*3的Art1网络的学习过程的例子,不涉及输入模式相关的数学模型建立和归一化等等Art2一定要处理的问题,简单来说就是一个函数调用和分支语句而已。但是感觉和去年那个五节点潮流计算程序一样陌生,当然,好在这次也是完全可以验证程序执行情况的。下面是有一搭没一搭的各种感想:
(菜鸟重操旧业,经验仅供参考!偏颇之处,尽请拍砖!!)
一、Matlab和C还是不一样的,Matlab中的变量不要定义和声明,我昨天就傻*的想求个严谨,把所有的变量,向量矩阵都声明了结果一run,command
window里就错误一大堆:“ The method char/int will be removed in a future
relase. Use sym/int instead. For example
int(sym('x^2'))”,Matlab里是完全没有必要声明变量的,直接用就好!!可能有人会转念一想觉着这个很自由,但是自由肯定是有代价的——后来单步调试发现由于变量不用定义,变量生存期短的可怜,经常出了if或者for就内存释放了;程序大了的话,变量重名,覆盖,甚至向量维度变化都是比较难以察觉的隐患。对于Matlab这个编译机制真的得小心了。
二、关于Matlab和C语言还有一点比较不幸的是在我现在想要研究的神经网络里,Matlab语言和C语言在某些领域如signal
processing对接的非常好的现象并不存在。说简单点就是用Matlab玩神经网络的话,就死了那份把Matlab转成C语言的心吧!基本上都得靠自己写函数了,而且是编译机制与C差别较大的Matlab的。
三、编写自定义的子函数时一旦子函数里面出了问题,在父函数或.m文件里调用函数的那个语句也会显示错误。这个是正常的,方便追踪。还有通过参数传递给子函数的情况下不能在子函数里开始run,会显示传递进来的变量未定义,我的程序传了好些参数,不知道为什么就总是S1,S2老是提示这样的错误。反正还是到最上面一级的.m文件那里开始run吧!
四、都说了重操旧业,高度暂时跟程序猿是没法比的。除了上面的有点泛的东西之外,当然还会碰到很傻很天真同时也很烦很挠头的小问题啦,看吧:
1、写Matlab程序是没有大括号的,不管是函数,if,for等等代码块要结束的话统统都是end,但是break,continue,return,确实和C语言一样的,前面两个都是重新循环/跳出循环,后面一个是跳出函数。在这里用这几个好像没有C那么危险;
2、单引号“'”表示转置,在更新权值矩阵W1_2,W1_2的时候运行出了问题,反正看到Error
里面有dimension的就要好好检查维度是否对应的上了。
3、norm这个有点难缠,求二范数的,不知道为什么单单求norm(a1)却老是提示错误"the....must
be single or double" ,但变成norm(double(a))就没事了。
4、Matlab中的max和min函数都有取最大元素和最大元素所在下标的功能:[mv,mi]
= max(...)元素存在在mv里,对应的下标存在mi变量里。注意二者都是唯一(just
one)的,如果有多个最大值的话mi就取下标最小的那个。我拿这个用于匹配度判断条件的时候就注意了刚好||a1||^2/||p||^2=ρ的情况。另外有一个值得一提的功能相近的自带函数就是sort了,用它来排序再好不过。源码
“[m_w,m_i] = sort(W1_2*a1,'descend')”,descend
降序,m_w向量存排好序的元素,m_i存下标。有相同的元素处理方式同max。
5、当然太久没碰了也遇到了很多其他的更小的问题,比如“ctrl+i”代码对齐,变量取名尽量贴近书上的算法提示,数字变量小写、举证向量大写、注释等等都有助于得到一个满意的程序。不知道这股热情能持续到什么时候,管他呢,干吧!