长短时记忆神经网络python代码_LSTM(长短期记忆网络)及其tensorflow代码应用

本文详细介绍了长短时记忆网络(LSTM)的原理,包括其门控结构、曲线拟合示例、在分类问题中的应用,以及如何通过LSTM缓解梯度消失问题。通过Python代码展示了LSTM在网络结构、股票价格预测和正弦曲线拟合中的应用,强调了LSTM在网络中保存和传递信息的能力,有助于处理长期依赖问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文主要包括:

一、什么是LSTM

二、LSTM的曲线拟合

三、LSTM的分类问题

四、为什么LSTM有助于消除梯度消失

一、什么是LSTM

Long Short Term 网络即为LSTM,是一种循环神经网络(RNN),可以学习长期依赖问题。RNN 都具有一种重复神经网络模块的链式的形式。在标准的 RNN 中,这个重复的模块只有一个非常简单的结构,例如一个 tanh 层。

如上为标准的RNN神经网络结构,LSTM则与此不同,其网络结构如图:

其中,网络中各个元素图标为:

LSTM 通过精心设计的称作为“门”的结构来去除或者增加信息到细胞状态的能力。门是一种让信息选择式通过的方法。他们包含一个 sigmoid 神经网络层和一个 pointwise 乘法操作。LSTM 拥有三个门,来保护和控制细胞状态。

首先是忘记门:

如上,忘记门中需要注意的是,训练的是一个wf的权值,而且上一时刻的输出和当前时刻的输入是一个concat操作。忘记门决定我们会从细胞状态中丢弃什么信息,因为sigmoid函数的输出是一个小于1的值,相当于对每个维度上的值做一个衰减。

然后是信息增加门,决定了什么新的信息到细胞状态中:

其中,sigmoid决定了什么值需要更新,tanh创建一个新的细胞状态的候选向量Ct,该过程训练两个权值Wi和Wc。经过第一个和第二个门后,可以确定传递信息的删除和增加,即可以进行“细胞状态”的更新。

第三个门就是信息输出门:

通过sigmoid确定细胞状态那个部分将输出,tanh处理细胞状态得到一个-1到1之间的值,再将它和sigmoid门的输出相乘,输出程序确定输出的部分。

二、LSTM的曲线拟合

2.1 股票价格预测

下面介绍一个网上常用的利用LSTM做股票价格的回归例子,数据:

如上,可以看到用例包含:index_code,date,open,close,low,high,volume,money,change这样几个特征。提取特征从open-change个特征,作为神经网络的输入,输出即为label。整个代码如下:

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

import tensorflow as tf

#定义常量

rnn_unit=10 #hidden layer units

input_size=7

output_size=1

lr=0.0006 #学习率

#——————————————————导入数据——————————————————————

f=open('dataset_2.csv')

df=pd.read_csv(f) #读入股票数据

data=df.iloc[:,2:10].values #取第3-10列

#获取训练集

def get_train_data(batch_size=60,time_step=20,train_begin=0,train_end=5800):

batch_index=[]

data_train=data[train_begin:train_end]

normalized_train_data=(data_train-np.mean(data_train,axis=0))/np.std(data_train,axis=0) #标准化

train_x,train_y=[],[] #训练集

for i in range(len(normalized_train_data)-time_step):

if i % batch_size==0:

batch_index.append(i)

x=normalized_train_data[i:i+time_step,:7]

y=normalized_train_data[i:i+time_step,7,np.newaxis]

train_x.append(x.tolist())

train_y.append(y.tolist())

batch_index.append((len(normalized_train_data)-time_step))

return batch_index,train_x,train_y

#获取测试集

def get_test_data(time_step=20,test_begin=5800):

data_test=data[test_begin:]

mean=np.mean(data_test,axis=0)

std=np.std(data_test,axis=0)

normalized_test_data=(data_test-mean)/std #标准化

size=(len(normalized_test_data)+time_step-1)//time_step #有size个sample

test_x,test_y=[],[]

for i in range(size-1):

x=normalized_test_data[i*time_step:(i+1)*time_step,:7]

y=normalized_test_data[i*time_step:(i+1)*time_step,7]

test_x.append(x.tolist())

test_y.extend(y)

test_x.append((normalized_test_data[(i+1)*time_step:,:7]).tolist())

test_y.extend((normalized_test_data[(i+1)*time_step:,7]).tolist())

return mean,std,test_x,test_y

#——————————————————定义神经网络变量——————————————————

#输入层、输出层权重、偏置

weights={

'in':tf.Variable(tf.random_normal([input_size,rnn_unit])),

'out':tf.Variable(tf.random_normal([rnn_unit,1]))

}

biases={

'in':tf.Variable(tf.constant(0.1,shape=[rnn_unit,])),

'out':tf.Variable(tf.constant(0.1,shape=[1,]))

}

#——————————————————定义神经网络变量—

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值