反馈型神经网络

反馈型神经网络(recurrent networks)是一种从输出到输入具有反馈连接的神经网络,其结构比前馈网络要复杂得多。典型的反馈型神经网络有Elman网络和Hopfield网络。Elman网络是两层反向传播网络,隐层和输入向量连接的神经元,其输出不仅作为输出层的输入,而且还连接隐层内的另外也一些神经元,反馈到隐层的输入。由于其输入表示了信号的空域信息,而反馈支路是一个延迟单元,反映了信号的时序信息,所以Elman网络可以在时域和空域上进行模式识别。

Hopfield网络又称为联想记忆网络,它常常存储一个或多个稳定的目标向量,当网络输入端输入相似的向量时,这些稳定的目标向量将“唤醒”网络记忆的模式,并通过输出呈现出来。

一、反馈神经网络的函数

1. 创建函数

1.1 newhop函数

该函数用于创建一个离散的Hopfield神经网络,函数的调用格式为:

net = newhop(T)

其中,T为目标向量,net为生成的神经网络。newhop返回反馈网络的权值偏差。向量元素的取值为-1或1,函数返回创建好的hopfield网络,并在给定的向量上有稳定的平衡点,且需要使为平衡点尽可能少。

1.2 newelm函数

该函数用于创建一个Elman函数。函数的调用格式为:

net =

newelm(P,T[S1,S2,...S(N-1)],{TF1,TF2,...,TFN1},BTF,BLF,PF,IPF,OPF,DDF)

其中,P为Q1组R维的输入向量矩阵;T为Q2组SN维的输出向量矩阵;Si为各层神经元的个数;TFi为各层的传递函数,默认为tansig函数;BTF网络的训练函数,默认为trainlm函数;BLF为BP学习算法,默认为learngdm函数;PF网络的性能函数,默认为mse函数;IPF为输入处理函数的行单元阵列,默认为fixunknowns、removeconstantrows和mapminmax函数;OPF为输出处理函数的行单元阵列,默认为removeconstantrows和mapminmax函数;DDF为数据函数,默认为dividerand函数;net为生成的新Elman网络。

clear all;
clc;
T1=1:80;
x1=cos(1:20);
x2=3*cos(1:20);
t1=ones(1,20);
t2=3*ones(1,20);
p=[x1 x2 x1 x2];
t=[t1 t2 t1 t2];
x=con2seq(p);%将矩阵信号转换为序列信号
T=con2seq(t);
plot(T1,cat(2,x{:}),':',T1,cat(2,T{:}),'-');
[r,n]=size(x);
[s2,n2]=size(t);
s1=10;
net=newelm(x,T,[s1 s2],{'tansig','purelin'},'trainlm');
net.trainParam.epochs=500;
[net,tr]=train(net,x,T);
y=sim(net,x);
hold on
plot(T1,cat(2,y{:}),'o',T1,cat(2,T{:}),'p');
legend('输入信号曲线','目标信号曲线','输出信号曲线','目标信号曲线');

1.3 patternnet函数

用于创建识别神经网络。函数的调用格式为:

patternnet(hiddenSizes,trainFxn,performFcn)

其中,参数hiddenSizes为隐含层的大小,是一个行向量,默认值为10;trainFcn表示hi函数的字符串,默认值为’trainscg’;performFcn为一个性能函数,默认值为‘crossentropy’。

1.4 elmannet函数

elmannet函数创建的Elman神经网络是局部反馈网络,在计算时采用staticderiv函数计算导数,其调用格式为:

elmannet(layerdelays,hiddenSizes,trainFcn)

其中,参数layerdelays表示网络层延迟的行向量,可取的值为0或整数,默认值为1:2;hiddenSizes为隐含层的大小,是一个行向量,默认值为10;trainFcn表示训练函数的字符串,默认值为‘trainlm’。

2. 传递函数

2.1 satlin函数

该函数为饱和线性传递函数,是神经网络的传递函数,它用神经元的网络输入计算网络输出。

2.2 satlins函数

该函数表示对称饱和传递函数。

二、反馈神经网络的应用

1. 离散Hopfield神经网络

设计一个Hopfield网络,使其具有联想记忆功能,能正确是被阿拉伯数字,当数字被噪声污染后仍可以正确识别。

clear all;
clc;
ones=[-1 -1 -1 -1 1 1 -1 -1 -1 -1;...
    -1 -1 -1 -1 1 1 -1 -1 -1 -1;...
    -1 -1 -1 -1 1 1 -1 -1 -1 -1;...
    -1 -1 -1 -1 1 1 -1 -1 -1 -1;...
    -1 -1 -1 -1 1 1 -1 -1 -1 -1;...
    -1 -1 -1 -1 1 1 -1 -1 -1 -1;...
    -1 -1 -1 -1 1 1 -1 -1 -1 -1;...
    -1 -1 -1 -1 1 1 -1 -1 -1 -1;...
    -1 -1 -1 -1 1 1 -1 -1 -1 -1;...
    -1 -1 -1 -1 1 1 -1 -1 -1 -1];
twos=[-1 1 1 1 1 1 1 1 1 -1;...
    -1 1 1 1 1 1 1 1 1 -1;...
    -1 -1 -1 -1 -1 -1 -1 -1 1 1;...
    -1 -1 -1 -1 -1 -1 -1 -1 1 1;...
    -1 1 1 1 1 1 1 1 1 -1;...
    -1 1 1 1 1 1 1 1 1 -1;...
    -1 1 1 -1 -1 -1 -1 -1 -1 -1;...
    -1 1 1 -1 -1 -1 -1 -1 -1 -1;...
    -1 1 1 1 1 1 1 1 1 -1;...
    -1 1 1 1 1 1 1 1 1 -1];
% 利用这两个数字点阵构成训练样本T
T=[ones;twos]';
% 利用newhop函数创建一个离散型hopfield神经网络
net=newhop(T);
noisy_one=ones;
noisy_two=twos;
for i =1:100
    a=rand;
 if a<0.15
        noisy_one(i)=-ones(i);
        noisy_two(i)=-twos(i);
 end
end
% 仿真测试
noisy_one2={(noisy_one)'};
identify_one=sim(net,{10,10},{},noisy_one2);
identify_one{10}'  %获取复原后数字1点阵
noisy_two2={(noisy_two)'};
identify_two=sim(net,{10,10},{},noisy_two2);
identify_two{10}'  %获取复原后数字1点阵
% 以图行的形式将点阵数字绘制出
subplot(321);one = imresize(ones,20);
imshow(one);title('原始数据1');
subplot(322);two = imresize(twos,20);
imshow(two);title('原始数据2');
subplot(323);noisy_one = imresize(noisy_one,20);
imshow(noisy_one);title('带噪声数据1');
subplot(324);noisy_two = imresize(noisy_two,20);
imshow(noisy_two);title('带噪声数据2');
subplot(325);one2 = imresize(identify_one{10}',20);
imshow(one2);title('复原数据1');
subplot(326);identify_two = imresize(identify_two{10}',20);
imshow(identify_two);title('复原数据2');

2. Elman神经网络预测

clear all;
load stock1
%归一化处理
mi=min(stock1);
ma=max(stock1);
stock1=(stock1-mi)/(ma-mi);
% 划分训练数据与测试数据,前210个为训练样本,后210个为测试样本
traindata=stock1(1:210);
p=[];
for i=1:210-5
    p=[p;traindata(i:i+4)];
end
p=p';
t=traindata(6:210);%期望输出
%穿件Elman网络
threshold=[0 1;0 1;0 1;0 1;0 1];
net=newelm(threshold,[0 1],[20,1],{'tansig','purelin'});
% 开始训练
net.trainParam.epochs=1000;
% 初始化
net = init(net);
net = train(net,p,t);
save stock2 net
y=sim(net,p);
error=y-t;
mse(error);
fprintf('error = %f\n',error);
t=t*(ma-mi)+mi;
y=y*(ma-mi)+mi;
plot(6:210,t,'b-',6:210,y,'r-');
title('使用原始数据测试');
legend('真实值','测试数据');
clear all;
% 加载数据
load stock2%读取elman网络
load stock1
%归一化处理
mi=min(stock1);
ma=max(stock1);
testdata=stock1(211:420);
testdata=(testdata-mi)/(ma-mi);
% 用后面210个数据进行测试
pt=[];
for i=1:210-5
    pt=[pt;testdata(i:i+4)];
end
pt=pt';
% 测试
yt=sim(net,pt);
% 还原数据
yyt=yt*(ma-mi)+mi;
figure 
plot(216:420,stock1(216:420),'r',216:420,yyt,'b');
legend('真实值','测试结果');

原文发布于微信公众号 - 瓜大三哥(xiguazai_tortoise)

原文发表时间:2017-12-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据文摘

【自测】斯坦福深度学习课程第五弹:作业与解答2

2949
来自专栏老秦求学

[Deep-Learning-with-Python] Keras高级概念

目前为止,介绍的神经网络模型都是通过Sequential模型来实现的。Sequential模型假设神经网络模型只有一个输入一个输出,而且模型的网络层是线性堆叠在...

1581
来自专栏程序生活

机器学习(十三)缺失值处理的处理方法总结

1672
来自专栏书山有路勤为径

卡尔曼滤波器(Kalman Filters)

卡尔曼滤波器,这是一种使用噪声传感器测量(和贝叶斯规则)来生成未知量的可靠估计的算法(例如车辆可能在3秒内的位置)。

3393
来自专栏大数据挖掘DT机器学习

Python写算法:二元决策树

二元决策树就是基于属性做一系列的二元(是/否)决策。每次决策对应于从两种可能性中选择一个。每次决策后,要么引出另外一个决策,要么生成最终的结果。一个实际训练...

2924
来自专栏梦里茶室

TensorFlow深度学习笔记 文本与序列的深度模型

Deep Models for Text and Sequence Rare Event 与其他机器学习不同,在文本分析里,陌生的东西(rare event)往...

21810
来自专栏ArrayZoneYour的专栏

使用TensorFlow实现股票价格预测深度学习模型

Sebastian Heinz. A simple deep learning model for stock price prediction using T...

5.4K10
来自专栏Petrichor的专栏

论文阅读: ResNet

ResNet论文是里程碑级的basemodel,因此获得了 CVPR 2016 Best Paper,并统领江湖至今:

3303
来自专栏机器之心

教程 | 使用MNIST数据集,在TensorFlow上实现基础LSTM网络

选自GitHub 机器之心编译 参与:刘晓坤、路雪 本文介绍了如何在 TensorFlow 上实现基础 LSTM 网络的详细过程。作者选用了 MNIST 数据集...

31410
来自专栏机器之心

教程 | 仅需六步,从零实现机器学习算法!

从头开始写机器学习算法能够获得很多经验。当你最终完成时,你会惊喜万分,而且你明白这背后究竟发生了什么。

1152

扫码关注云+社区

领取腾讯云代金券