您的位置:首页 > 理论基础 > 计算机网络

递归神经网络RNN原理——Elman网络原理——结合实例MATLAB(BPTT算法)实现

2016-10-07 15:21 831 查看
最近正在看递归神经网络,看了网上很多博文,算是鱼龙混杂,并且基本都是使用Python实现,要不就是使用Matlab中的函数库newelm()等。对于使用Matlab的同学,甚为不方便。所以我将结合实例,使用matlab语言,完成Elman递归神经网络程序的编写(BPTT)。本人菜鸡一枚,如有错误还望各路大神,指正教导。另外,关于理论推导算法步骤,等我过几天有时间更新。

一、问题描述



二、相关数据



三、程序代码:`

Elman_BPTT_mian.m

%%%使用BPTT算法完成Elman网络的训练
%%%作者:xd.wp
%%%时间:2016.10.06 16:44
%% 程序说明
%  1、数据为7天,四个时间点的空调功耗,用前三个推测第四个训练,依次类推。第七天作为检验
%  2、Elman网络输入结点为12,输出结点为4个,隐藏结点18个
clear all;
clc;
%% 加载数据并进行归一化处理
[train_data,test_data]=Elman_data_process();

data_length=size(train_data,1);            %每个样本的长度
data_num=size(train_data,2);               %样本数目
%% 网络参数初始化
%结点数目设置
input_layer_num=data_length;
hidden_layer_num=18;
output_layer_num=size(test_data,1);
%权重初始化
weight_input_hidden=rand(hidden_layer_num,input_layer_num)/1000;
weight_prehidden_hidden=rand(hidden_layer_num,hidden_layer_num)/1000;
weight_hidden_output=rand(output_layer_num,hidden_layer_num)/1000;
output_state=zeros(output_layer_num,3);
%% 网络训练学习部分  采用BPTT算法
yita=0.001;              %每次迭代的步进
for num=1:4000
for t=1:3       %%时间步,使用三推一
%从输入到隐层
if (t==1)
pre_hidden_state=weight_input_hidden*train_data(:,t);
else
pre_hidden_state=weight_input_hidden*train_data(:,t)+weight_prehidden_hidden*hidden_state(:,t-1);
end

%从隐层到输出
for n=1:hidden_layer_num
hidden_state(n,t)=1/(1+exp(-pre_hidden_state(n,:)));              %%通过sigmoid函数
end
output_state(:,t)=weight_hidden_output*hidden_state(:,t);

%误差计算
Error=output_state(:,t)-test_data(:,t);
Error_cost(1,num)=sum((output_state(:,t)-test_data(:,t)).^2);
if(Error_cost(1,num)<1e-4)
break;
end
%权值更新
[weight_input_hidden,weight_prehidden_hidden,weight_hidden_output]=updata_weight(t,yita,Error,train_data,hidden_state,weight_input_hidden,weight_prehidden_hidden,weight_hidden_output);

end
if(Error_cost(1,num)<1e-4)
break;
end
end
%% 绘制COST曲线
for n=1:1:num
text(n,Error_cost(1,n),'*');
axis([0,num,0,1]);
title('Error-cost曲线图');
end
%% 结果检验
%%由1-3天=>第四天
pre_hidden_state=weight_input_hidden*train_data(:,1);
for n=1:hidden_layer_num
hidden_state(n,1)=1/(1+exp(-pre_hidden_state(n,:)));              %%通过sigmoid函数
end
output_state(:,1)=weight_hidden_output*hidden_state(:,1);
fprintf('前三天推测第四天的结果%d \n真实第四天结果%d \n', output_state(:,1), test_data(:,1));
% %由1-3天=>第四天
% train_data(:,3);
% pre_hidden_state=weight_input_hidden*train_data(:,3)+weight_prehidden_hidden*hidden_state(:,2);
% for n=1:hidden_layer_num
%     hidden_state(n,3)=1/(1+exp(-pre_hidden_state(n,:)));              %%通过sigmoid函数
% end
% output_state(:,3)=weight_hidden_output*hidden_state(:,3);
%
% test_data(:,3)
%使用第七组检验
test_final=[0.4557 0.4790 0.7019 0.8211 0.4601 0.4811 0.7101 0.8298 0.4612 0.4845 0.7188 0.8312]';
test_final=test_final/sqrt(sum(test_final.^2));
test_output=test_data(:,4);
pre_hidden_state=weight_input_hidden*test_final+weight_prehidden_hidden*hidden_state(:,3);
for n=1:hidden_layer_num
hidden_state1(n,1)=1/(1+exp(-pre_hidden_state(n,:)));              %%通过sigmoid函数
end
t_output=weight_hidden_output*hidden_state1(:,1)
test_output


Elman_data_process.m

function [train_data,test_data]=Elman_data_process()
%% 数据加载并完成初始归一化
train_data_initial= [0.4413 0.4707 0.6953 0.8133 0.4379 0.4677 0.6981 0.8002 0.4517 0.4725 0.7006 0.8201;
0.4379 0.4677 0.6981 0.8002 0.4517 0.4725 0.7006 0.8201 0.4557 0.4790 0.7019 0.8211;
0.4517 0.4725 0.7006 0.8201 0.4557 0.4790 0.7019 0.8211 0.4601 0.4911 0.7101 0.8298]';
% train_data_initial=[ 0.4413 0.4707 0.6953 0.8133;
%                      0.4379 0.4677 0.6981 0.8002;
%                      0.4517 0.4725 0.7006 0.8201;
%                      0.4557 0.4790 0.7019 0.8211;
%                      0.4601 0.4811 0.7101 0.8298;
%                      0.4612 0.4845 0.7188 0.8312]';
test_data_initial=[0.4557 0.4790 0.7019 0.8211;
0.4612 0.4845 0.7188 0.8312;
0.4601 0.4811 0.7101 0.8298;
0.4615 0.4891 0.7201 0.8330]';

data_length=size(train_data_initial,1);            %每个样本的长度
data_num=size(train_data_initial,2);               %样本数目

%%归一化过程
for n=1:data_num
train_data(:,n)=train_data_initial(:,n)/sqrt(sum(train_data_initial(:,n).^2));
end
for m=1:size(test_data_initial,2)
test_data(:,m)=test_data_initial(:,m)/sqrt(sum(test_data_initial(:,m).^2));
end


updata_weight.m

function [weight_input_hidden,weight_prehidden_hidden,weight_hidden_output]=updata_weight(t,yita,Error,train_data,hidden_state,weight_input_hidden,weight_prehidden_hidden,weight_hidden_output)
%%
weight_hidden_output_temp=weight_hidden_output;
weight_input_hidden_temp=weight_input_hidden;
weight_prehidden_hidden_temp=weight_prehidden_hidden;

%% weight_hidden_output权重更新
for n=1:size(Error,1)
delta_weight_ho(n,:)=2*Error(n,1).*hidden_state(:,1)';
end
weight_hidden_output_temp=weight_hidden_output_temp-yita*delta_weight_ho;

%% weight_input_hidden权重更新
for n=1:size(Error,1)
for m=1:size(hidden_state,1)
delta_weight_ih(:,m)=2*Error(n,1).*weight_hidden_output(n,m)*train_data(:,1);
end
weight_input_hidden_temp=weight_input_hidden_temp-yita*delta_weight_ih';
end

%% weight_prehidden_hidden权重更新(t=1时,这个权重不更新)
if (t~=1)
for n=1:size(Error,1)
for m=1:size(hidden_state,1)
delta_weight_hh(m,:)=2*Error(n,1).*weight_hidden_output(n,m)*hidden_state(:,t-1)';
end
weight_prehidden_hidden_temp=weight_prehidden_hidden_temp-yita*delta_weight_hh;
end
end
weight_hidden_output=weight_hidden_output_temp;
weight_input_hidden=weight_input_hidden_temp;
weight_prehidden_hidden=weight_prehidden_hidden_temp;
end


程序结果图



Error_cost曲线图



程序说明:由于第一次预测(第四天),由于没有之前的反馈,导致推测值与真实值之间的差距较大。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息