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

来源:互联网 发布:哪个cms好 编辑:程序博客网 时间:2024/05/01 15:53

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

  %%%使用BPTT算法完成Elman网络的训练%%%作者:xd.wp%%%时间:2016.10.06 16:44%% 程序说明%  1、数据为7天,四个时间点的空调功耗,用前三个推测第四个训练,依次类推。第七天作为检验%  2Elman网络输入结点为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:4000for 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;    endend%% 绘制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函数endoutput_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函数endt_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));  endfor 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)';endweight_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;    endendweight_hidden_output=weight_hidden_output_temp;weight_input_hidden=weight_input_hidden_temp;weight_prehidden_hidden=weight_prehidden_hidden_temp;end

程序结果图
预测第四天和第七天并与真实结果比对
Error_cost曲线图
Error_cost曲线图

程序说明:由于第一次预测(第四天),由于没有之前的反馈,导致推测值与真实值之间的差距较大。

1 0
原创粉丝点击