递归神经网络RNN原理——Elman网络原理——结合实例MATLAB(BPTT算法)实现
2016-10-07 15:21
831 查看
最近正在看递归神经网络,看了网上很多博文,算是鱼龙混杂,并且基本都是使用Python实现,要不就是使用Matlab中的函数库newelm()等。对于使用Matlab的同学,甚为不方便。所以我将结合实例,使用matlab语言,完成Elman递归神经网络程序的编写(BPTT)。本人菜鸡一枚,如有错误还望各路大神,指正教导。另外,关于理论推导算法步骤,等我过几天有时间更新。
一、问题描述
二、相关数据
三、程序代码:`
Elman_BPTT_mian.m
Elman_data_process.m
updata_weight.m
程序结果图
Error_cost曲线图
程序说明:由于第一次预测(第四天),由于没有之前的反馈,导致推测值与真实值之间的差距较大。
一、问题描述
二、相关数据
三、程序代码:`
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曲线图
程序说明:由于第一次预测(第四天),由于没有之前的反馈,导致推测值与真实值之间的差距较大。
相关文章推荐
- 递归神经网络LSTM原理——结合实例MATLAB实现
- 卷积神经网络CNN原理——结合实例matlab实现
- matlab使用layrecnet实现循环神经网络rnn。
- 主成分分析(PCA)原理与故障诊断(SPE、T^2以及结合二者的综合指标)-MATLAB实现
- 基于RNN神经网络和BPTT算法实现的简单二进制计数器
- Matlab 实现神经网络实例
- 【神经网络】7:RNN递归神经网络实现MNIST数字识别
- 自组织神经网络SOM原理——结合例子MATLAB实现
- 自组织神经网络SOM原理——结合例子MATLAB实现
- 第2章 单层前向网络及LMS学习算法仿真实例 Matlab 实现
- 以命名管道方式实现网络进程间通信的一个实例
- (一)Java EE 5实现Web服务(Web Services)及多种客户端实例-原理
- (一)Java EE 5实现Web服务(Web Services)及多种客户端实例-原理
- (一)Java EE 5实现Web服务(Web Services)及多种客户端实例-原理
- (一)Java EE 5实现Web服务(Web Services)及多种客户端实例-原理
- (一)Java EE 5实现Web服务(Web Services)及多种客户端实例-原理
- (一)Java EE 5实现Web服务(Web Services)及多种客户端实例-原理
- (一)Java EE 5实现Web服务(Web Services)及多种客户端实例-原理
- (一)Java EE 5实现Web服务(Web Services)及多种客户端实例-原理
- (一)Java EE 5实现Web服务(Web Services)及多种客户端实例-原理