RNN 具有时序信息记忆能力,参考前向时间内的信息进行后向预测。 RNN 模型的提出也是为了解决时序预测问题。样例以 sin() 函数预测为例,音频信号等一维时序电子信号处理方式同理。
# -*- coding: utf-8 -*-
"""
@ File: rnn_example_sin_predict.py
@ Brief: 循环神经网络样例程序——预测 sin 函数
@ Env: python 3.5 + TensorFlow 1.4.0, win10 + pycharm
@ Author: 攀援的井蛙
@ Date: 2020-09-13
"""
import numpy as np
import tensorflow as tf
# 加载 matplotlib 工具包,使用该工具可以对预测的 sin 函数曲线进行绘图
import matplotlib as mpl
mpl.use('TkAgg')
from matplotlib import pyplot as plt
HIDDEN_SIZE = 30 # LSTM 中隐藏的节点个数
NUM_LAYERS = 2 # LSTM 的层数
TIMESTEPS = 10 # 循环神经网络中的训练序列长度
TRAINING_STEPS = 10000 # 训练轮数
BATCH_SIZE = 32 # batch 大小
TRAINING_EXAMPLES = 10000 # 训练数据个数
TESTING_EXAMPLES = 1000 # 测试数据个数
SAMPLE_GAP = 0.01 # 采样间隔
"""
@ brief: 生成数据序列
@ return: x,y数据序列(时序序列、值序列)
@ param seq:
"""
def generate_data(seq):
X = []
y = []
# 序列的第 i 项和后面的 TIMESTEPS-1 项合在一起作为输入;第 i+TIMIESTEPS 项作为输出。
# 即用 sin 函数前面的 TIMESTEPS 个点的信息,预测第 i+TIMESTEPS 个点的函数值。
for i in range(len(seq) - TIMESTEPS):
X.append([seq[i: i + TIMESTEPS]])
y.append([seq[i + TIMESTEPS]])
return np.array(X, dtype=np.float32), np.array(y, dtype=np.float32)
"""
@ brief: LSTM 模型实现函数
@ return: 预测时返回预测结果;训练时返回预测结果、损失函数、模型优化器
@ param X: 时序序列
@ param y: 值序列
@ param is_training: 是否是训练过程
"""
def lstm_model(X, y, is_training):