elman神经网络的实现

article/2025/9/24 1:05:47

在看文章时,一篇文章提到了使用elman神经网络来对癫痫病人的脑电信号与正常人的脑电信号进行区分,并且取得了较好的分类结果。于是就想自己写一个elman神经网络demo看看效果。

elman神经网络和感知机的差别通过下面的图片可以很明显的看出哪里不一样,elman在隐藏层多了一个“context units“,用来保存隐藏层的输出,并作用到下一次隐藏层的计算中,关于elman原理的说明,大家可以自己查阅一些资料,这里不再赘述。(图片来自维基百科https://en.wikipedia.org/wiki/Recurrent_neural_network)


""" 
coding: utf-8
@author: zhangxiang
"""
"""
在对脑电信号进行分类的时候,发现一篇文章对健康人,癫痫患者未发作时的脑电信号和癫痫发作时的脑电信号的分类使用了基于时序的
elman_RNN 神经网络进行建模,于是想在预测麻醉深度类别及其它时序相关的分类问题上使用这一模型。
就写了一个demo
"""
import numpy as npclass ELMAN_RNN(object):def __init__(self, input_num, hidden_num, output_num, learning_rate):self.input_num = input_numself.hidden_num = hidden_numself.output_num = output_numself.learning_rate = learning_rateself.hidden_weights = np.random.random((self.input_num, self.hidden_num))self.output_weights = np.random.random((self.hidden_num, self.output_num))self.rnn_weights = np.random.random((self.hidden_num, self.hidden_num))self.hidden_bias = np.random.rand(1)self.output_bias = np.random.rand(1)self.hidden_output = np.zeros((1, self.hidden_num))def training(self, train_input, train_output):"""training one time"""output = self.feed_forward(train_input)self.bptt(train_input, output, train_output)def calculate_the_cross_entropy(self, training_set):"""get the total error loss"""loss = 0for i in range(np.array(training_set).shape[0]):x, y = training_set[i]y = np.array(y).reshape(1,2)result = self.feed_forward(x)loss += self.get_the_total_error(y, result)return lossdef get_the_total_error(self, y, result):"""loss = -∑yi*ln(ai), y is the real label, result is the softmax result"""loss = -np.sum(y*np.log(result))return lossdef feed_forward(self, input):"""calculate feed_forward value"""self.hidden_output = self.sigmoid(np.dot(np.array(input).reshape(1,2), self.hidden_weights) + np.dot(self.hidden_output, self.rnn_weights) + self.hidden_bias)return self.softmax(np.dot(self.hidden_output, self.output_weights) + self.output_bias)def bptt(self,input, output, train_output):"""update the weights of all layers"""# claculate delta of output layersdelta_of_output_layers = [0]*self.output_numfor i in range(self.output_num):delta_of_output_layers[i] = self.calculate_output_wrt_rawout(output[0, i], train_output[i])# caculate delta of hidden layersdelta_of_hidden_layers = [0]*self.hidden_numfor i in range(self.hidden_num):d_error_wrt_hidden_output = 0.0for o in range(self.output_num):d_error_wrt_hidden_output += delta_of_output_layers[o]*self.output_weights[i, o]delta_of_hidden_layers[i] = d_error_wrt_hidden_output*self.calculate_output_wrt_netinput(self.hidden_output[0,i])# get the δw of output layers and update the weightsfor i in range(self.output_num):for weight_j in range(self.output_weights.shape[0]):delta_wrt_weight_j = delta_of_output_layers[i]*self.hidden_output[0,weight_j]self.output_weights[weight_j, i] -= self.learning_rate*delta_wrt_weight_j# get the δw of hidden layers and update the weightsfor i in range(self.hidden_num):for weight_j in range(self.hidden_weights.shape[0]):delta_wrt_weight_j = delta_of_hidden_layers[i]*input[weight_j]self.hidden_weights[weight_j, i] -= self.learning_rate*delta_wrt_weight_jdef sigmoid(self, x):"""activation function"""return 1.0/(1.0 + np.exp(-x))def softmax(self, x):"""the activation for multiple output function"""return np.exp(x)/np.sum(np.exp(x))def calculate_output_wrt_rawout(self, output, train_output):"""derivative of softmax function, actually in classification train_output equal to 1"""return (output - train_output)def calculate_output_wrt_netinput(self, output):"""the derivative of sigmoid function"""return output*(1 - output)if __name__ == "__main__":import matplotlib.pyplot as pltelman = ELMAN_RNN(input_num=2, hidden_num=4, output_num=2, learning_rate=0.02)train_x = [[1,2], [1,1], [1.5, 1.5], [2,1], [-1,-1], [-0.5, -0.5], [-1, -2], [-2, -1.5]]label_y = [[1,0], [1,0], [1,0], [1,0], [0,1], [0,1], [0,1], [0,1]]training_sets = [[[2,2],[1,0]], [[0.2, 0.8], [1,0]], [[-0.5, -0.8], [0, 1]], [[-1.2, -0.5], [0, 1]]]loss = []for i in range(1000):for x, y in zip(train_x, label_y):elman.training(x, y)loss.append(elman.calculate_the_cross_entropy(training_sets))plt.figure()plt.plot(loss)plt.title('the loss with the training')plt.show()print('training finished!')

loss函数的变化如下:



http://chatgpt.dhexx.cn/article/DgZrgW83.shtml

相关文章

【预测模型-ELAMN预测】基于遗传算法优化ELMAN神经网络实现数据回归预测matlab代码

1 简介 风能,作为一种重要,有潜力,无污染,可再生、可持续的能源,已经成为全球发电最为迅速的能源之一,越来越受到世界各国的青睐。近年来,为缓解能源短缺问题,改善环境,实现经济乃至人类的可持续发展,世界各国纷纷大力发展风能资源。然而,在实际操作中,风能固有的波动性和间歇…

【预测模型】基于Elman神经网络预测电力负荷matlab代码

​1 简介 为提高甘肃电网负荷预测精度,提出了一种基于神经网络的负荷预测方法.针对甘肃电力系统负荷数据的非线性和动态特性,在多层前向BP网络中引入特殊关联层,形成有"记忆"能力的Elman神经网络,从而可以映射系统的非线性和动态特性.在网络训练算法中,采用自适应学…

粒子群算法优化BP和Elman神经网络-matlab源码

粒子群优化算法是一种智能优化算法,又称微粒群算法,它通过模拟自然界鸟群捕食和鱼群捕食的过程。通过群体中的协作寻找到问题的全局最优解。 收敛性的数学证明帮助了PSO的发展和应用,但此内分析具有很大的局限性。为PSO加入正交学习后&#…

基于鲸鱼算法优化的Elman神经网络数据预测-附代码

基于鲸鱼算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于鲸鱼算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于鲸鱼优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要:针…

基于小波Elman神经网络的短期风电功率预测

风力发电在全球范围内快速发展,装机容量逐年增加,截止2013 年底,中国风电新增装机容量约 16.1GW,较 2012 年的 12.96GW 大幅提高了 24%,中国风电累计装机已超过 90GW。 风力发电并网运行是实现大规模风能发利用的有效途径。但是与常规能源不…

基于灰狼算法优化的Elman神经网络数据预测

基于灰狼算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于灰狼算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于灰狼优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要:针…

Elman神经网络

newelm()函数: clear ; close all; clc %原始数据 data[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;...0.4615,…

Elman神经网络与自适应共振网络(ART)

这几天在回过头看一些比较基础的东西,发现了两个早期研究的神经网络,Elman与ART网络,类似于上世纪80年代的hopfield神经网络,BM/RBM/DBN,RBF,SOM,以及同时期的SVM算法等等,虽然那个时…

Elman神经网络原理

Elman神经网络 近期开题,阅读到了一篇文章关于故障诊断的,其中用到了Elman神经网络,具体是结合EMD、PCA-SOM的Elman的性能评估/预测故障诊断,对Elman神经网络有点陌生,网上资源也讲的特别杂,来做个汇总Int…

【神经网络第一期】Elman神经网络基本原理

1. Elman神经网络概述 根据神经网络运行过程中的信息流向,可将神经网络可分为前馈式和反馈式两种基本类型。前馈式网络通过引人隐藏层以及非线性转移函数可以实现复杂的非线性映射功能。但前馈式网络的输出仅由当前输入和权矩阵决定,而与网络先前的输出…

回归预测 基于ELMAN递归神经网络预测及其matlab代码实现

文章目录 1. ELMAN神经网络的简介和算法描述1.1 Elman网络介绍1.2 Elman结构组成 1.3 ELMAN训练界面的参数解读2. 建立ELMAN神经网络的步骤3. 编写MATLAB代码4. ELMAN程序运行结果4.1 各层的神经元个数的确定过程4.2 预测值和真实值的误差计算(SSE、MAE、MSE、RMSE、…

Elman神经网络介绍以及Matlab实现

Elman神经网络介绍 1.特点 Elman神经网络是一种典型的动态递归神经网络,它是在BP网络基本结构的基础上,在隐含层增加一个承接层,作为一步延时算子,达到记忆的目的,从而使系统具有适应时变特性的能力,增强了…

数据库命名规范--通用

分段式的 1.1 基本命名原则 以下基本原则适用于所有数据库对象命名,如无特别说明则为强制规范。规范:遵循行业规范 当有相关国家/行业强制性数据结构标准规范存在时,用于存储某业务数据的业务表在表名命名上原则上应该遵从标准规定&#xf…

数据库命名规范

数据库命名规范 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 开发工具与关键技术:SQL Server 2014 Management Studio 作者:朱海恩 撰写时间:2019年7月12日 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~…

【数据库】命名规范

鸣谢: 命规范_码农书生的博客-CSDN博客_数据库字段名称命名规则一、数据库命名规范1.1 数据库命名规范采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线_组成,命名简洁明确,多个单词用下划线_分隔,一个项目一个数据库&…

ESP8266 WIFI 模块串口调试过程-实现通过互联网实现数据远程传输(结尾含驱动代码链接)

一、 ESP8266 WIFI模块调试(串口发送AT指令调试)。 ESP8266 WIFI模块的调试算是最复杂的了,虽然通信是简单的串口通信,但是要设置ESP8266连接服务器并稳定无误的将数据上传,还是非常不容易的。 在前期模块调试阶段我…

串口转无线WiFi模块——WizFi210-EVB操作手册

1. 产品介绍 特点 - 通过串行主机接口,进行WiFi连接 - 快速开机时间:少于20毫秒 - 超低功耗,通过动态电源管理(待机模式34μA) - 速度高达to11Mbps(802.11b)的标准的802.11b/g/n接入点 - 安全…

sever串口wifi拓展板_什么是串口WIFI模块

展开全部 串口WiFi模块多是以邮票孔的62616964757a686964616fe59b9ee7ad9431333365646263形式作为管脚引出控制引脚,主要采取焊接的方式来实现接入电路控制板。 串口WiFi模块是多种WiFi模块中的一类,功能是将串口或TTL电平转换为符合Wi-Fi无线网络通信标…

【沧海拾昧】WiFi串口通信ESP8266模块基本介绍(附野火WiFi透传实例)

#C0104 沧海茫茫千钟粟,且拾吾昧一微尘 ——《沧海拾昧集》CuPhoenix 【阅前敬告】 沧海拾昧集仅做个人学习笔记之用,所述内容不专业不严谨不成体系 【如有问题必是本集记录有谬,切勿深究】 目录 前言一、ESP8266模块基本连线二、ESP8266固件…

ESP8266串口WiFi模块

参考和学习《ESP8266串口WIFI模块的基本使用》点击打开链接 ESP8266是一款超低功耗的UART-WiFi 透传模块,可将用户的物理设备连接到Wi-Fi 无线网络上,进行互联网或局域网通信,实现联网功能。 把硬件联网之后,就再也不是“玩单机”了。配合服务器端的Socket网络编程,可以…