利用ANN作图——自组织特征映射网络(SOFM)探究及实现

利用ANN作图——自组织特征映射网络(SOFM)探究及实现


在研究生的《人工智能》课堂上学习了利用人工神经网络( ANN)解决问题的基本思想与方法,在学习了自组织特征映射网络( SOFM)之后,老师提出了这么一个问题:
利用ANN作图——自组织特征映射网络(SOFM)探究及实现_第1张图片

如何利用人工神经网络的方法将如左图一张包含随机像素的图片变成右图一张貌似有规律的抽象派图片?本博文选取自组织特征映射网络的方法,实现其算法的 Python 程序,得到了初步的实验效果图。

完整代码可在 @DiamonJoy下载

1. 自组织特征映射网络
自组织特征映射网络(Self-Organizing Feature Map)只有两层:输入层和竞争层,竞争层神经元的排列有多种形式:一维线阵、二维平面、三维栅格等等。
权值调整方法是在胜者为王基础上改进的,即优胜领域内的神经元都可以调整权值。理论上应该是离胜者越近,学习率的越大。优胜领域开始定的很大,随着训练次数的增加,最终应该收缩到0。
SOFM 分为训练阶段和工作阶段,要训练阶段,权向量被训练为输入样本空间的聚类中心。在工作阶段,当输入向量与某个竞争层的内某权值相似时,自然会被分到对应的聚类上去。因此SOFM可用作模式分类器。注意当输入模式在训练集中从未出现过时,只能将它归入最接近的模式分类中去。

2. 输出层
输出神经元的排列结构一般要反应实际问题的物理意义。例如对于旅行商问题,二维平面比较直观;对于一般分类问题,一维线阵意义明确且结构简章;对于机械手臂控制问题,用三维栅格更能反应其空间轨迹特征。
在此问题中,由于输出是一张图片,因此定义与输出图片尺寸相同的 M×N 的全互连神经元作为输出层,输出值为 RGB 权重值:
利用ANN作图——自组织特征映射网络(SOFM)探究及实现_第2张图片

3. 权值初始化
一种简单易行的方法是从训练集中随机抽取 m 个输入样本作为初始权值,另一种方法是先计算全体输入向量的质心,再在质心的基础上叠加小随机值作为初始权向量。
本文采用随机初始权值,即对应图片为以下效果:
利用ANN作图——自组织特征映射网络(SOFM)探究及实现_第3张图片 利用ANN作图——自组织特征映射网络(SOFM)探究及实现_第4张图片

4. 优胜领域
优胜领域的设计原则是不断缩小,通常凭借经验,下面给出两种计算方法:

在本中,采用第一种与迭代次数成线性关系的方法:
# 计算领域范围半径
R2=(int)(((float)(self.radius)*(1.0-times)/2.0))+1

5. 学习率
η(t) 在训练开始时取很大,之后快速下降,这样有利于快速捕捉到输入向量的大致结构。然后 η(t) 又在较小的值上缓降至趋于0的值,这样可以精细地调整权值,使之符合输入空间的样本分布结构。比如可用下式:


同时将领域内的神经元相对中心竞争元的距离考虑,得到调整后的学习率:
# 计算到中心点的距离并归一化
outer=Node(i,j)
distance=self.distance(center,outer)
distance/= d_normalize
# 度量学习率
t=(float)(exp(-1.0*distance**2/0.15))
# 计算随迭代次数减少的程度
t/=(times*4.0+1.0)

6. 实验效果
我们采用三种图片作为样本输入,每次从样本图片随机选取像素点作为输入值,接着获取最佳竞争神经元,然后更新竞争元及其领域的权值,迭代一定次数后输出图片,流程如下:
    # 循环迭代
    while(True):
        
        if times<1.0:

            # 获取随机样本
            random_x=randint(0,myimage_with-1)
            random_y=randint(0,myimage_height-1)
            r_sample=mypix[random_x,random_y]
            # 获取最优竞争者
            bmu_loc=mySom.get_bmu(r_sample)
            print u"-----------"+str(int(100*times))+u"%"+u"-----------"
            print u"sample.x:",random_x,u"sample.y:",random_y,u"sample.R:",r_sample[0],u"sample.G:",r_sample[1],u"sample.B:",r_sample[2]
            print u"bmu.x:",bmu_loc.X,u"bmu.y:",bmu_loc.Y,u"bmu.R:",bmu_loc.R,u"bmu.G:",bmu_loc.G,u"bmu.B:",bmu_loc.B
            # 更新领域值
            mySom.scale_neighbors(bmu_loc,r_sample,times)
            print u""
            # 更新当前迭代次数
            times+=T_INC
            
        else:
            print u"-----------"u"100%"+u"-----------"
            print u"程序结束"
            break
输入:
利用ANN作图——自组织特征映射网络(SOFM)探究及实现_第5张图片  利用ANN作图——自组织特征映射网络(SOFM)探究及实现_第6张图片  利用ANN作图——自组织特征映射网络(SOFM)探究及实现_第7张图片

输出:
利用ANN作图——自组织特征映射网络(SOFM)探究及实现_第8张图片  利用ANN作图——自组织特征映射网络(SOFM)探究及实现_第9张图片  利用ANN作图——自组织特征映射网络(SOFM)探究及实现_第10张图片



你可能感兴趣的:(人工智能,机器学习,Machine,Learning,SOFM,自组织特征映射网络)