LSTM模型预测sin函数详解

注解:

fun_data()函数生成训练数据和标签,同时生成测试数据和测试标签HIDDEN_SIZE = 128,使用128维的精度来定义LSTM的状态和输出精度,就是LSTM中的h,c
lstm_model()函数定义了一个可重入的模型,分别由评估函数和训练函数调用,在训练前使用空模型预测并输出未训练数据并可视化通过with tf.variable_scope("lstm_model",reuse=tf.AUTO_REUSE) as scope:定义了在多次实例化模型的时候共享训练结果

run_eval()定义了评估函数:实现了训练及可视化结果
run_train()定义了训练函数:实现了训练过程。

如果还要提高拟合精度可以把TRAINING_STEPS设大些,不过比较耗时,我的电脑比较老,感觉训练一千次拟合精度就很高了,再训练已经没意义了,呵呵。

图一:还未训练之间的结果,拟合基本上不行图二:训练500-2000次基本就能很好的预测sin上的任何点了。




  1 # LSTM预测sin曲线
  2 #tensorflow 1.13.1
  3 #numpy 1.16.2
  4 import numpy as np
  5 import tensorflow as tf
  6 import matplotlib.pyplot as plt
  7 plt.rcParams[‘font.sans-serif‘]=[‘FangSong‘] # 用来正常显示中文标签
  8 plt.rcParams[‘axes.unicode_minus‘]=False# 用来正常显示负号
  9 ########################################################################################
 10 # RNN模型相关参数
 11 HIDDEN_SIZE = 128                           # LSTM中隐藏节点的个数,定义输出及状态的向量维度。
 12 NUM_LAYERS = 3                              # LSTM的层数。
 13 TIME_STEPS = 10                             # 循环神经网络的训练序列长度
 14 TRAINING_STEPS = 2000                       # 训练轮数。
 15 BATCH_SIZE = 32                             # batch大小。
 16 #数据样本数量
 17 TRAINING_EXAMPLES = 10000                   # 训练数据个数。
 18 TESTING_EXAMPLES = 1000                     # 测试数据个数。
 19 ########################################################################################
 20 def fun_data():
 21     # 用正弦函数生成训练和测试数据集合。
 22     SAMPLE_GAP = 0.01# 采样间隔。
 23     test_start = (TRAINING_EXAMPLES + TIME_STEPS) * SAMPLE_GAP
 24     test_end = test_start + (TESTING_EXAMPLES + TIME_STEPS) * SAMPLE_GAP
 25     MYTRAIN = np.sin(np.linspace(0, test_start, TRAINING_EXAMPLES + TIME_STEPS, dtype=np.float32))
 26     MYTEST  = np.sin(np.linspace(test_start, test_end, TESTING_EXAMPLES + TIME_STEPS, dtype=np.float32))
 27
 28     def generate_data(seq):
 29         X,Y = [],[]
 30         for i in range(len(seq) - TIME_STEPS):
 31             X.append([seq[i: i + TIME_STEPS]]) # 用[0]至[9]个特征
 32             Y.append([seq[i + TIME_STEPS]])    # 预测[10]这个值
 33         return np.array(X, dtype=np.float32), np.array(Y, dtype=np.float32)
 34
 35     #生成训练数据和测试数据
 36     #(10000, 1, 10) (10000, 1)
 37     train_x, train_y = generate_data(MYTRAIN)
 38     #(1000, 1, 10) (1000, 1)
 39     test_x, test_y = generate_data(MYTEST)
 40
 41     return train_x, train_y, test_x, test_y
 42
 43 def lstm_model(X, y):
 44     # 定义算法图:可重入,共享训练变量
 45     # 每调用一次lstm_model函数会在同一个系统缺省图
 46     # tf.variable_scope("lstm_model",reuse=tf.AUTO_REUSE)定义共享训练变量
 47     with tf.variable_scope("lstm_model",reuse=tf.AUTO_REUSE) as scope:
 48         #定义多层LSTM
 49         cell = tf.nn.rnn_cell.MultiRNNCell(
 50             [tf.nn.rnn_cell.LSTMCell(HIDDEN_SIZE) for _ in range(NUM_LAYERS)])
 51         #根据tf.nn.dynamic_rnn对数据的要求变换shape
 52         #XX (?, 10, 1),X(?, 1, 10)
 53         XX = tf.reshape(X,[-1, X.shape[-1], X.shape[-2]])
 54         # outputs (?, 10, 128)
 55         outputs, _ = tf.nn.dynamic_rnn(cell, XX, dtype=tf.float32)
 56         # 取TIME_STEPS最后一个单元上的输出作为预测值
 57         # output (?, 128)
 58         output = outputs[:, -1, :]
 59         # 加一层全连接直接输出预测值
 60         # predictions (?, 1)
 61         mypredictions = tf.layers.dense(output,1)
 62         # 平均平方差损失函数计算工时,用这个函数来求loss。
 63         loss = tf.losses.mean_squared_error(labels=y, predictions=mypredictions)
 64         # 使用AdamOptimizer进行优化
 65         train_op = tf.train.AdamOptimizer(0.01).minimize(loss)
 66     return mypredictions, loss, train_op
 67
 68 def run_eval(sess):
 69     # 评估算法
 70     ds = tf.data.Dataset.from_tensor_slices((self.test_X, self.test_y))
 71     ds = ds.batch(1)#一次取一个样本
 72     X, y = ds.make_one_shot_iterator().get_next()
 73     prediction, loss, train_op = lstm_model(X, y)
 74     predictions = []
 75     labels = []
 76     for i in range(TESTING_EXAMPLES):
 77         p, l = sess.run([prediction, y])
 78         predictions.append(p)
 79         labels.append(l)
 80     predictions = np.array(predictions).squeeze()
 81     labels = np.array(labels).squeeze()
 82
 83     #对预测的sin函数曲线进行绘图。
 84     plt.figure()
 85     plt.plot(predictions, label=‘预测‘,linestyle=‘solid‘, color=‘red‘)
 86     plt.plot(labels, label=‘真实数据‘,linestyle=‘dotted‘,color=‘black‘)
 87     plt.legend()
 88     plt.show()
 89
 90     return
 91
 92 def run_train(sess):
 93     #定义训练过程
 94     for ecoh in range(TRAINING_STEPS):
 95         myloss, _ = sess.run([self.loss, self.train_op])
 96         if ecoh % 100 == 0:
 97             print(‘训练次数:{:}损失函数值:{:}‘.format(ecoh,myloss))
 98     return
 99
100 def run_main():
101
102     #准备数据
103     self.train_X, self.train_y,self.test_X, self.test_y = fun_data()
104     ds = tf.data.Dataset.from_tensor_slices((self.train_X, self.train_y))
105     ds = ds.repeat().shuffle(1000).batch(BATCH_SIZE)#一次取BATCH_SIZE个样本
106     X, y = ds.make_one_shot_iterator().get_next()
107
108     #定义模型
109     self.prediction, self.loss, self.train_op = lstm_model(X, y)
110     # 初始化方法定义
111     init = tf.group(tf.global_variables_initializer(), tf.local_variables_initializer())
112
113     with tf.Session() as sess:
114         sess.run(init)
115         # 测试在训练之前的模型效果。
116         run_eval(sess)
117         # 训练模型。
118         run_train(sess)
119         # 使用训练好的模型对测试数据进行预测。
120         run_eval(sess)
121     return
122
123 if __name__ == "__main__" :
124     run_main()

原文地址:https://www.cnblogs.com/ace007/p/11198311.html

时间: 2024-10-02 11:59:07

LSTM模型预测sin函数详解的相关文章

javascript 函数详解2 -- arguments

今天我们接着上篇文章来继续javascript函数这个主题.今天要讲的是函数对像中一个很重要的属性--arguments. 相关阅读: javascript 函数详解1 -- 概述 javascript 函数详解2 -- arguments Javascript 函数详解3 -- this对象 Javascript 函数详解4 -- 函数的其他属性 Javascript 函数详解5 -- 函数对象的内部函数 arguments对象参数数组引用 arguments是函数对象内部一个比较特殊的类数组

c++ 虚函数详解

下面是对C++的虚函数的理解. 一,定义 简单地说,那些被virtual关键字修饰的成员函数,就是虚函数.虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离:用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略.下面来看一段简单的代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 classA { publi

ThinkPHP内置函数详解D、F、S、C、L、A、I

ThinkPHP内置函数详解D.F.S.C.L.A.I 单字母函数D.F.S.C.L.A.I 他们都在ThinkPHP核心的ThinkPHP/Mode/Api/functions.php这个文件中定义. 下面我分别说明一下他们的功能: D() 加载Model类 M() 加载Model类 A() 加载Action类 L() 获取语言定义 C() 获取配置值    用法就是   C("这里填写在配置文件里数组的下标") S() 全局缓存配置 用法S(“这里相当于一个唯一的标识”) F()

Netsuite Formula > Oracle函数列表速查(PL/SQL单行函数和组函数详解).txt

PL/SQL单行函数和组函数详解 函数是一种有零个或多个参数并且有一个返回值的程序.在SQL中Oracle内建了一系列函数,这些函数都可被称为SQL或PL/SQL语句,函数主要分为两大类: 单行函数 组函数 本文将讨论如何利用单行函数以及使用规则. SQL中的单行函数 SQL和PL/SQL中自带很多类型的函数,有字符.数字.日期.转换.和混合型等多种函数用于处理单行数据,因此这些都可被统称为单行函数.这些函数均可用于SELECT,WHERE.ORDER BY等子句中,例如下面的例子中就包含了TO

时间序列深度学习:状态 LSTM 模型预测太阳黑子

时间序列深度学习:状态 LSTM 模型预测太阳黑子 本文翻译自<Time Series Deep Learning: Forecasting Sunspots With Keras Stateful Lstm In R> 原文链接 由于数据科学机器学习和深度学习的发展,时间序列预测在预测准确性方面取得了显着进展.随着这些 ML/DL 工具的发展,企业和金融机构现在可以通过应用这些新技术来解决旧问题,从而更好地进行预测.在本文中,我们展示了使用称为 LSTM(长短期记忆)的特殊类型深度学习模型,

070:【Django数据库】ORM聚合函数详解-准备工作

ORM聚合函数详解-准备工作: 如果你用原生SQL,则可以使用聚合函数来提取数据.比如提取某个商品销售的数量,那么可以使用count,如果想要知道商品销售的平均价格,那么可以使用avg.聚合函数是通过aggregate方法来实现的.在讲解这些聚合函数的用法的时候,都是基于以下的模型对象来实现的. 创建如下models: from django.db import models class Author(models.Model): """作者模型""&qu

072:【Django数据库】ORM聚合函数详解-aggregate和annotate

ORM聚合函数详解-aggregate和annotate: aggregate和annotate的区别: 1.aggregate :返回使用聚合函数后的字段和值.2.annotate :在原来模型字段的基础之上添加一个使用了聚合函数的字段,并且在使用聚合函数的时候,会使用当前这个模型的主键进行分组(group by).比如以上 Sum 的例子,如果使用的是 annotate ,那么将在每条图书的数据上都添加一个字段叫做 total ,计算这本书的销售总额.而如果使用的是 aggregate ,那

075: 【Django数据库】ORM聚合函数详解-Sum

ORM聚合函数详解-Sum: Sum :求指定对象的总和.比如要求图书的销售总额.那么可以使用以下代码实现: from djang.db.models import Sum result = Book.objects.annotate(total=Sum("bookstore__price")).values("name","total") 以上的代码 annotate 的意思是给 Book 表在查询的时候添加一个字段叫做 total ,这个字段

php socket函数详解

转自:http://blog.163.com/[email protected]/blog/static/2889641420138213514298/ 最近在用socket实现服务端向客户端主动推送消息函数名 描述socket_accept() 接受一个Socket连接socket_bind() 把socket绑定在一个IP地址和端口上socket_clear_error() 清除socket的错误或最后的错误代码socket_close() 关闭一个socket资源socket_connec