神经网络学习笔记4:CPN网络的实现
神经网络学习笔记4:CPN网络的实现
http://blog.csdn.net/laviewpbt/article/details/1396261
对向传播网络(Counter Propagation),简称CPN,是将Kohonen特征映射网络与Grossberg基本竞争型网络相结合,发挥各自长处的一种新型特征映射网络,被广泛的运用于模式分类,函数近似,数据压缩等方面。
CPN网络分为输入层,竞争层,隐含层。输入层与竞争层构成SOM网络,竞争层与输出层构成基本竞争 型网络,从整体上看,CPN网络属于有教师学习型网络,而由输入层和竞争层构成的SOM网络又属于典型的无教师网络,因此,这一网络既汲取了无教师型网络分类灵活,算法简练的特点,又采纳了有教师型网络分类精确的长处,使两种不同类型的网络结合起来。
至于CPN网络的学习算法,这里不打算多提,有兴趣的请参考相关书籍。这里给出一个简单的实现CPN网络的代码.
'作 者: laviewpbt
'联系方式: laviewpbt@sina.com
'QQ:33184777
'版本:Version 1.1.0
'说明:复制请保留源作者信息,转载请说明,欢迎大家提出意见和建议
Private mW1() As Double '隐含层的权值 S1 X R
Private mW2() As Double '输出层的权值 S2 X R
Private mErr() As Double '误差
Private mS1 As Long '隐含层的神经元个数 S1
Private mS2 As Long '输出层的神经元个数 S2
Private mR As Long '输入层神经元个数 R
Private mGoal As Double '收敛的精度
Private mLr As Double '隐含层学习速度
Private mGama As Double '输出层学习系数
Private mMaxEpochs As Long '最大的迭代次数
Private mIteration As Long '实际的迭代次数
'**************************************** 中间变量 *******************************************
Private HiddenOut() As Double '输出层的输出
Private OutCopy() As Double '比较的
Private Ts As Long '输入向量的总个数
Private Initialized As Boolean '是否已初始化
'**************************************** 属性 *******************************************
Public Property Get W1() As Double()
W1 = mW1
End Property
Public Property Get W2() As Double()
W2 = mW2
End Property
Public Property Get Err() As Double()
Err = mErr
End Property
Public Property Get S1() As Long
S1 = mS1
End Property
Public Property Let S1(Value As Long)
mS1 = Value
End Property
Public Property Get S2() As Long
S2 = mS2
End Property
Public Property Get Goal() As Double
Goal = mGoal
End Property
Public Property Let Goal(Value As Double)
mGoal = Value
End Property
Public Property Get Lr() As Double
Lr = mLr
End Property
Public Property Let Lr(Value As Double)
mLr = Value
End Property
Public Property Get Gama() As Double
Gama = mGama
End Property
Public Property Let Gama(Value As Double)
mGama = Value
End Property
Public Property Get MaxEpochs() As Long
MaxEpochs = mMaxEpochs
End Property
Public Property Let MaxEpochs(Value As Long)
mMaxEpochs = Value
End Property
Public Property Get Iteration() As Long
Iteration = mIteration
End Property
'**************************************** 初始化 *******************************************
Private Sub Class_Initialize()
mLr = 0.1
mGama = 0.1
mGoal = 0.0001
mMaxEpochs = 1000
End Sub
'*********************************** 初始化参数 ***********************************
'
'函 数 名: IniParameters
'参 数: 略
'说 明: 重新定义数组大小,初始化权值矩阵
'作 者: laviewpbt
'时 间: 2006-11-17
'
'*********************************** 初始化参数 ***********************************
Private Sub IniParameters(P() As Double, T() As Double)
Dim i As Integer, j As Integer
mS2 = UBound(T, 1)
Ts = UBound(T, 2)
mR = UBound(P, 1)
ReDim mW1(mS1, mR) As Double
ReDim mW2(mS2, mS1) As Double
ReDim HiddenOut(mS1) As Double
ReDim OutCopy(mS2, Ts) As Double
ReDim mErr(mMaxEpochs) As Double
For i = 1 To mSs
For j = 1 To Ts
OutCopy(i, j) = T(i, j) '复制原始输出
Next
Next
For i = 1 To mS1
For j = 1 To mR
mW1(i, j) = Rnd '初始正向权值
Next
Next
For i = 1 To mS2
For j = 1 To mS1
mW2(i, j) = Rnd '初始反向权值
Next
Next
Initialized = True
End Sub
'*********************************** 训练函数 ***********************************
'
'函 数 名: Train
'参 数: P - 输入矩阵
' T - 对应的输出矩阵
'返 回 值: 采用CPN训练算法训练网络
'作 者: laviewpbt
'时 间: 2006-11-19
'
'*********************************** 训练函数 ***********************************
Public Sub Train(P() As Double, T() As Double)
Dim i As Integer, j As Integer, k As Integer, m As Integer
Dim MaxIndex As Integer
Dim Sum As Double, Max As Double, Err As Double
IniParameters P, T '初始化数据
ReDim CopyP(mR, Ts) As Double
For i = 1 To mR
For j = 1 To Ts
CopyP(i, j) = P(i, j) '备份原始的输入数据,因为在训练中会破坏输入数据
Next
Next
For i = 1 To Ts
Sum = 0
For j = 1 To mR
Sum = Sum + CopyP(j, i) * CopyP(j, i)
Next
Sum = Sqr(Sum)
For j = 1 To mR
If Sum <> 0 Then '考虑到输入可能为[0 0 0 ]的形式
CopyP(j, i) = CopyP(j, i) / Sum '输入矩阵规一化处理
End If
Next
Next
mIteration = 0
For i = 1 To mMaxEpochs
mIteration = mIteration + 1
Err = 0
For j = 1 To Ts
For k = 1 To mS1
Sum = 0
For m = 1 To mR
Sum = Sum + mW1(k, m) * mW1(k, m) '规一化连接权向量
Next
Sum = Sqr(Sum)
For m = 1 To mR
mW1(k, m) = mW1(k, m) / Sum
Next
Next
For k = 1 To mS1
Sum = 0
For m = 1 To mR
Sum = Sum + CopyP(m, j) * mW1(k, m) '计算隐含层的输出
Next
HiddenOut(k) = Sum
Next
Max = -0.01
MaxIndex = 1
For k = 1 To mS1
If Max <= HiddenOut(k) Then '竞争
Max = HiddenOut(k)
MaxIndex = k
End If
Next
For k = 1 To mS1
HiddenOut(k) = 0
Next
HiddenOut(MaxIndex) = 1 '将竞争获胜的神经元的输出置为1,其他为0
For k = 1 To mR
mW1(MaxIndex, k) = mW1(MaxIndex, k) + mLr * (CopyP(k, j) - mW1(MaxIndex, k)) '隐含层权值调整
Next
Sum = 0
For k = 1 To mR
Sum = Sum + mW1(MaxIndex, k) * mW1(MaxIndex, k)
Next
Sum = Sqr(Sum)
For k = 1 To mR
mW1(MaxIndex, k) = mW1(MaxIndex, k) / Sum '重新规一化权值
Next
For k = 1 To mS2
mW2(k, MaxIndex) = mW2(k, MaxIndex) + mGama * (T(k, j) - OutCopy(k, j)) '输出层权值调整
Next
For k = 1 To mS2
OutCopy(k, j) = mW2(k, MaxIndex) ' 计算网络输出
Err = Err + (T(k, j) - OutCopy(k, j)) * (T(k, j) - OutCopy(k, j))
Next
Next
mErr(mIteration) = Sqr(Err)
If mErr(mIteration) < mGoal Then Exit Sub
Next
End Sub
'*********************************** 仿真函数 ***********************************
'
'函 数 名: Sim
'参 数: P - 输入矩阵
'返 回 值: 返回对应的输出矩阵
'作 者: laviewpbt
'时 间: 2006-11-19
'
'*********************************** 仿真函数 ***********************************
Public Function Sim(P() As Double) As Double()
Dim i As Integer, j As Integer, Ts As Integer
Dim MaxIndex As Integer
Dim Sum As Double, Max As Double
If Initialized = False Then Exit Function
Ts = UBound(P, 2)
ReDim CopyP(mR, Ts) As Double
ReDim HiddenOut(mS1) As Double
ReDim Out(mS2, Ts) As Double
For i = 1 To mR
For j = 1 To Ts
CopyP(i, j) = P(i, j) '复制原始数据
Next
Next
For i = 1 To Ts
Sum = 0
For j = 1 To mR
Sum = Sum + CopyP(j, i) * CopyP(j, i)
Next
Sum = Sqr(Sum)
For j = 1 To mR
If Sum <> 0 Then CopyP(j, i) = CopyP(j, i) / Sum '将输入规一化
Next
Next
For i = 1 To Ts
For j = 1 To mS1
Sum = 0
For k = 1 To mR
Sum = Sum + CopyP(k, i) * mW1(j, k)
Next
HiddenOut(j) = Sum '隐含层输出
Next
Max = -0.01
MaxIndex = 1
For j = 1 To mS1
If Max <= HiddenOut(j) Then
Max = HiddenOut(j)
MaxIndex = j
End If
Next
HiddenOut(MaxIndex) = 1 '竞争获胜
For k = 1 To mS2
Out(k, i) = mW2(k, MaxIndex) '输出
Next
Next
Sim = Out
End Function
'*********************************** 绘制误差曲线 ***********************************
'
'过 程 名: DrawErrorCurve
'参 数: pic - 曲线绘制的容器
' Color - 曲线的颜色
'作 者: laviewpbt
'时 间: 2006-11-15
'
'*********************************** 绘制误差曲线 ***********************************
Public Sub DrawErrorCurve(pic As PictureBox, Color As OLE_COLOR)
pic.AutoRedraw = True
pic.Cls
pic.BorderStyle = 0
pic.Scale (-0.15, 1)-(1.1, -0.1)
pic.Line (-0.15, 1)-(1.095, -0.095), vbBlue, B
Dim Max As Double, i As Long
For i = 1 To mIteration
If Max < mErr(i) Then Max = mErr(i)
Next
pic.Line (0, 0)-(0, 1), Color
pic.Line (0, 0)-(1.1, 0), Color
For i = 1 To mIteration - 1
pic.Line (i / mIteration, mErr(i) / Max)-((i + 1) / mIteration, mErr(i + 1) / Max), Color
Next
For i = 1 To 6
pic.CurrentY = -0.02
pic.CurrentX = 0.2 * (i - 1) - pic.TextWidth(mIteration / 5 * (i - 1))
pic.Print CInt(mIteration / 5 * (i - 1))
Next
For i = 1 To 6
pic.CurrentX = -0.13
pic.CurrentY = 0.2 * (i - 1) - pic.TextHeight("5") + 0.02
pic.Print Format(Max / 5 * (i - 1), "0.00")
Next
pic.CurrentX = 0.6 - pic.TextWidth("误差曲线")
pic.CurrentY = 0.95
pic.Print "误差曲线"
End Sub
'*********************************** 矩阵形式转为字符串 ***********************************
'
'函 数 名: MatrixToString
'参 数: mtxA - 待转换的矩阵
' sFormat - 显示的格式
'返 回 值: 返回转换后的字符串
'作 者: laviewpbt
'时 间: 2006-11-17
'
'*********************************** 矩阵形式转为字符串 ***********************************
Public Function MatrixToString(mtxA() As Double, sFormat As String) As String
Dim i As Integer, j As Integer, m As Integer, n As Integer
Dim s As String
m = UBound(mtxA, 1): n = UBound(mtxA, 2)
For i = 1 To m
For j = 1 To n
s = s + Format(mtxA(i, j), sFormat) + " "
Next j
s = s + vbCrLf
Next i
MatrixToString = s
End Function
'*********************************** 字符串转为矩阵形式 ***********************************
'
'函 数 名: StringToMatrix
'参 数: str - 待转换的字符
'返 回 值: 返回转换后的矩阵
'作 者: laviewpbt
'时 间: 2006-11-17
'
'*********************************** 字符串转为矩阵形式 ***********************************
Public Function StringToMatrix(str As String) As Double()
Dim i As Integer, m As Integer, n As Integer
Dim Temp1() As String, Temp2() As String, Data() As Double
Temp1 = Split(str, ";")
Temp2 = Split(Temp1(0), " ")
m = UBound(Temp1)
n = UBound(Temp2)
ReDim Data(1 To m + 1, 1 To n + 1) As Double
For i = 1 To m + 1
Temp2 = Split(Trim(Temp1(i - 1)), " ")
For j = 1 To n + 1
Data(i, j) = Val(Temp2(j - 1))
Next
Next
StringToMatrix = Data
End Function
应用
这里我们没有给出数据的现实意义,仅就数据本省而论。
Private Sub CmdYuce_Click()
Dim str1 As String
Dim str2 As String
Dim s As New CPN
Dim P() As Double, T() As Double, tt() As Double
str1 = "0 0.5 0 1 0.5 1;0 0.5 0.5 5 1 0.5"
str2 = "1 1 0 0 0 0;0 0 1 0 0 0;0 0 0 1 0 0;0 0 0 0 1 0;0 0 0 0 0 1"
P = s.StringToMatrix(str1)
T = s.StringToMatrix(str2)
s.S1 = 15
s.Lr = 0.1
s.Gama = 0.1
s.MaxEpochs = 3000
s.Train P, T
tt = s.Sim(P)
s.DrawErrorCurve Picture1, vbRed
MsgBox s.MatrixToString(tt, "0.00"), vbInformation
End Sub
结果图:
由结果可以看到,网络成功的学习了所输入的模式,并且具有迭代速度快的特点,另外注意由于该网络会在训练函数的内部对输入数据进行归一化,所以如果输入模式中由两个列向量成比例的话,必须修改其中一个列向量的参数以产生区别,如本例中的4原本为1,这样的话0.5 0.5 和1 1两列成比例,会对网络的训练造成误差,并且减慢网络训练的速度。
同样,该网络可以解决线性网络不能解决的异或问题。
Private Sub CmdXor_Click()
Dim P(2, 4) As Double
Dim T(1, 4) As Double
Dim tt() As Double
Dim s As New CPN
P(1, 1) = 0: P(2, 1) = 0
P(1, 2) = 0: P(2, 2) = 1
P(1, 3) = 1: P(2, 3) = 0
P(1, 4) = 1: P(2, 4) = 1
T(1, 1) = 0
T(1, 2) = 1
T(1, 3) = 1
T(1, 4) = 0
s.Gama = 0.2
s.S1 = 5
s.Lr = 0.8
s.MaxEpochs = 1000
s.Train P, T
tt = s.Sim(P)
s.DrawErrorCurve Picture1, vbRed
MsgBox s.MatrixToString(tt, "0.00"), vbInformation, "异或"
End Sub
All Rights Reserved!
神经网络学习笔记4:CPN网络的实现相关推荐
- 神经网络学习笔记3——Transformer、VIT与BoTNet网络
系列文章目录 神经网络学习笔记1--ResNet残差网络.Batch Normalization理解与代码 神经网络学习笔记2--VGGNet神经网络结构与感受野理解与代码 文章目录 系列文章目录 A ...
- 神经网络学习笔记-02-循环神经网络
神经网络学习笔记-02-循环神经网络 本文是根据WildML的Recurrent Neural Networks Tutorial写的学习笔记. 循环神经网络 循环神经网络适用于处理序列化信息,比如: ...
- 神经网络学习笔记(一) RBF径向基函数神经网络
神经网络学习笔记(一) RBF径向基函数神经网络 2018年08月06日 13:34:26 吃机智豆长大的少女乙 阅读数:2735 RBF径向基函数神经网络 初学神经网络,以下为综合其他博主学习材料及 ...
- 脉冲神经网络学习笔记(综述)
脉冲神经网络学习笔记 一. 基本框架 脉冲神经网络的监督算法目标是实现对脉冲序列中包含的时空模式的信息的学习,脉冲序列的定义: S(t)对一个Dirac函数进行求和,f代表发放的第f个脉冲,Dirac ...
- 径向基(Radial Basis Function:RBF)神经网络学习笔记
原创不易,转载前请注明博主的链接地址:Blessy_Zhu https://blog.csdn.net/weixin_42555080 一. 从BP神经网络到RDF神经网络 在上一篇文章BP(Back ...
- Linux+javaEE学习笔记之Linux网络环境配置
Linux+javaEE学习笔记之Linux网络环境配置 网络知识简单介绍: Ip地址是:IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物 ...
- 数通学习笔记1 - 数据通信网络基础
数通学习笔记1 - 数据通信网络基础 数据通信网络基础 数通学习笔记1 - 数据通信网络基础 前言 一.通信与网络 1. 什么是通信.什么是网络通信? 2. 信息传递过程 3. 数据通信网络 二.网络 ...
- Neutron学习笔记2-- Neutron的网络实现模型
Neutron学习笔记2-- Neutron的网络实现模型 Neutron的三类节点 计算节点 网络节点 控制节点 Neutron将在这三类节点中进行部署,Neutron在各个计算节点,网络节点中运行 ...
- 吴恩达 - 卷积神经网络 学习笔记(一)
转载来源:http://www.cnblogs.com/marsggbo/p/8166487.html DeepLearning.ai学习笔记(四)卷积神经网络 – week1 卷积神经网络基础知识介 ...
- python 网页爬虫作业调度_第3次作业-MOOC学习笔记:Python网络爬虫与信息提取
1.注册中国大学MOOC 2.选择北京理工大学嵩天老师的<Python网络爬虫与信息提取>MOOC课程 3.学习完成第0周至第4周的课程内容,并完成各周作业. 4.提供图片或网站显示的学习 ...
最新文章
- 密码技术应用--RSA文件签名验签
- android 监听安装来源_Flutter插件开发之APK自动安装
- Linux编程手册读书笔记第五章(20140408)
- c++ 不插入重复元素但也不排序_【每日一题】125. 对链表进行插入排序
- python壁纸4k_别人用钱,而我用python爬虫爬取了一年的4K高清壁纸!真实用!
- 有哪些值得实力推荐的高评分经典电影,VIP视频解析网站推荐十部
- HTML5游戏引擎(一)-egret引擎简介——一个开源免费的游戏框架
- python中format使用
- Java笔记 - 黑马程序员_07(多线程,线程同步,线程池,网络编程入门,UDP通信原理,TCP通信原理,commons-io工具类)
- 一文带你了解redux的工作流程——action/reducer/store
- 效果 - 收藏集 - 掘金
- 判断BIOS的启动模式和磁盘分区格式
- 取得平均薪水最高的部门的部门名称
- 微机原理——8086系统的概述与引脚介绍
- hdmi口不接显示器,teamviewer连接黑屏
- 蜡像 wax figure
- 如何把视频放进图片指定区域的剪辑技巧
- 常用查看系统信息TCODE
- 面试官说 “你还有什么问题想问的” ,作为一名程序员该如何回答?
- Java关于String常用方法(字符串转字符数组,字符数组转字符串)
热门文章
- 解决无法删除文件夹的情况:文件夹正在使用,操作无法完成,因为其中的文件,或文件夹已在另一个程序中打开...
- Delphi中小试Opencv--图像差异对比(大家来找茬辅助实现cvAbsDiff函数的使用)
- 十大免费cms建站系统介绍推荐
- android tv 盒子,安卓TV电视盒子推荐软件一览表(盒子端+手机端+电脑端+群晖端)...
- 用python编写猜数字游戏
- 计算机c语言与交通工程论文,交通仿真技术在道路交通工程中的应用研究
- CodeSonar网络研讨会
- 计算机控制系统机器人,机器人的控制系统
- 一个提供用emai订阅rss的中文网站
- 计算机网络拓扑结构及其主要特点