tensorflow LSTM实现sin(x)预测

时间:2021-05-29 19:06:50

1.实验设计

  • 数据格式
    X,y=(x1,..,x10),x11
  • 数据生成
    使用np.linespace(0,100,10000)生成一个数组, 再用np.sin()得到时序数据. 因为 Δx=0.01 , 所以得到的sin(x) 序列足够光滑.
    接下来生成样本集. 用 i 作游标, 像滑动窗口一样, 取连续的10个数据作 X, 第11个数据作 y.

2.网络设计

输入层是10维的, 所以设计NUM_UNITS=10, NUM_LAYERS=2.

  • 隐层设计
lstm_cell = tf.nn.rnn_cell.BasicLSTMCell(NUM_UNITS, state_is_tuple=True)
cell = tf.nn.rnn_cell.MultiRNNCell([lstm_cell] * NUM_LAYERS)
  • 输入层
output, _ = tf.nn.dynamic_rnn(cell, features, dtype=tf.float32)
output = tf.reshape(output, [-1, NUM_UNITS])
  • 输出层
    # 创建一个全连接层,因为是回归问题, 输出的维度为1,None指的是不使用激活函数
predictions = tf.contrib.layers.fully_connected(output, 1, None)

# 将predictions和labels调整统一的shape
labels = tf.reshape(labels, [-1])
predictions=tf.reshape(predictions, [-1])
  • 损失函数与优化方法
    loss = tf.losses.mean_squared_error(predictions, labels)

train_op = tf.contrib.layers.optimize_loss(
loss, tf.contrib.framework.get_global_step(),
optimizer="Adagrad", learning_rate=0.1)

3.代码

Github: predict_six_x.py

下面是作出的图像:

tensorflow LSTM实现sin(x)预测
图1 测试集中真实值与预测值的曲线, 几乎完全重叠.

tensorflow LSTM实现sin(x)预测
图 2 基于图1顶部的放大, 看一下不重合的部分