手把手教你使用Tensorflow2.0搭建循环神经网络

循环神经网络

实验代码链接提取码-6666

综述

在前面我们学习了前馈神经网络以及卷积神经神经网络,它们在离散型的数据中表现效果非常好,然而,现实生活中存在着连续的数据,如:时序数据,即上一时刻的数据和下一时刻的数据紧密联系,前馈神经网络和卷积神经网络仅强调空间上的特征提取,却忽视了时间上的关系,为了解决这一问题循环神经网络就此诞生,让神经网络具备记忆通过记忆体提取历史数据的特征,预测出接下来可能发生的结果

循环神经网络

  • 循环神经网络的核心在于循环核,相比于卷积神经网络的卷积核,循环核实现参数在时间上的共享,循环层提取时间信息;
  • 循环神经网络借助循环核提取时间特征后,送入全连接神经网络;(简单理解循环神经网络就是:记忆体中每个时刻都根据当前的输入而更新,当前的预测推理是根据以往的积累,用“固化”下来的参数矩阵进行推理判断
    在这里插入图片描述

循环神经网络Tensorflow表示

简单RNN

tf.keras.layers.SimpleRNN(
	${记忆体个数}, 
	activation=${'激活函数'},
	return_sequences=True/False
)

参数说明

  • 记忆体:可以理解成隐藏层输出的维度
  • activation:选择激活函数,通常默认的激活函数为 t a n h tanh tanh
  • return_sequences:当取值为True时,要求各时间步输出 h t h_t ht,反之仅在最后时间步输出 h t h_t ht

LSTM

tf.keras.layers.LSTM(
	${记忆体个数}, 
	activation=${'激活函数'},
	return_sequences=True/False
)

参数说明

  • 记忆体:可以理解成隐藏层输出的维度
  • activation:选择激活函数,通常默认的激活函数为 t a n h tanh tanh
  • return_sequences:当取值为True时,要求各时间步输出 h t h_t ht,反之仅在最后时间步输出 h t h_t ht

GRU

tf.keras.layers.GRU(
	${记忆体个数}, 
	activation=${'激活函数'},
	return_sequences=True/False
)

参数说明

  • 记忆体:可以理解成隐藏层输出的维度
  • activation:选择激活函数,通常默认的激活函数为 t a n h tanh tanh
  • return_sequences:当取值为True时,要求各时间步输出 h t h_t ht,反之仅在最后时间步输出 h t h_t ht

代码案例

以贵州茅台的股票价格变化作为数据集来训练RNN,预测股票增长的趋势

下载数据集

import tushare as ts

# 贵州茅台的股票数据
df1 = ts.get_k_data('600519',ktype='D',start='2010-04-26',end='2020-04-26')
datapath1 = "./SH600519.csv"
df1.to_csv(datapath1)

导入第三方库

import numpy as np
import tensorflow as tf
from tensorflow.keras.layers import Dense, Dropout, SimpleRNN
import matplotlib.pyplot as plt
import os
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error, mean_absolute_error
import math

加载数据集并划分训练/测试集

  • 读取.csv文件将时序数据按照时间顺序断开成两个部分,最后300天的数据作为数据的测试集,其余的序列划分为训练集,这个时候并不是将整个序列放入网络中去训练

    # 数据集选择茅台股票数据
    maotai = pd.read_csv('./data/SH600519.csv')
    
    # 数据集划分
    training_set = maotai.iloc[0:2426-300,2:3].values # 训练集
    test_set = maotai.iloc[2426-300:,2:3].values      # 测试集(最后300天的数据作为数据的测试集)
    
    # 归一化
    sc = MinMaxScaler(feature_range=(0,1))
    training_set_scaled = sc.fit_transform(training_set)
    test_set = sc.transform(test_set)
    
    x_train,y_train = [],[]
    x_test,y_test = [],[]
    
  • 构造训练集和测试集的方法:我们可以将其转换成训练图像数据的思想把时序数据切分为一个个相同维度的数据构造成构造成训练集和测试集;在本次实验中我们将连续60天的序列作为一个数据的特征,切分的方法如图所示
    在这里插入图片描述
    每一条序列的标签:该序列最后一个时刻的下一时刻的特征值

    # 构造训练集
    for i in range(60,len(training_set_scaled)):
        x_train.append(training_set_scaled[i-60:i,0]) # 选择连续60天的序列作为一个训练集的特征
        y_train.append(training_set_scaled[i,0])      # 选择连续60天的后一天的数据作为该训练集的标签
    
    # 构造测试集
    for i in range(60, len(test_set)):
        x_test.append(test_set[i-60:i,0])
        y_test.append(test_set[i,0])
    
  • 构造好的数据集,在送入RNN之前需要对其数据的维度结构进行调整满足符合RNN网络输入的维度:reshape的形式 [样本的个数,循环核展开的步数,每步输入特征的维度],本次实验我们的要求是循环核展开60步,每步输入一个特征

    # 将训练集转换成array格式
    x_train,y_train = np.array(x_train),np.array(y_train)
    
    # 注意在将训练集x_train输入到RNN的时候必须要reshape
    ## reshape成的形式[样本的个数,循环核展开的步数,每步输入特征的维度]
    x_train = np.reshape(x_train,(x_train.shape[0],60,1))
    
    # 打乱训练集
    np.random.seed(7)
    np.random.shuffle(x_train)
    np.random.seed(7)
    np.random.shuffle(y_train)
    
    # 将测试集转换成array格式
    x_test,y_test = np.array(x_test),np.array(y_test)
    x_test = np.shape(x_test,(x_test.shape[0],60,1))
    
  • 加载模型(我们选择RNN模型,也可以选择LSTM和GRU参数不懂只是换一个函数名),训练模型(设置训练的参数以及保存模型的路径)

    # 训练模型
    model = tf.keras.Sequential([
        SimpleRNN(80,return_sequences=True), # 选择True,让每一个时间步的ht输出,作为下一层循环层的输入
        Dropout(0.2),
        SimpleRNN(100),                      # 默认选择False,最后一个时间步输出ht
        Dropout(0.2),
        Dense(1)
    ])
    
    # 模型训练参数
    model.compile(optimizer=tf.keras.optimizers.Adam(0.001),
                  loss='mean_squared_error') # 选择均方差损失函数
    
    # 模型保存的路径
    checkpoint_save_path = "./checkpoint/rnn_stock.ckpt"
    if os.path.exists(checkpoint_save_path + '.index'):
        print('-------------load the model-----------------')
        model.load_weights(checkpoint_save_path)
    
    cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_save_path,
                                                     save_weights_only=True,
                                                     save_best_only=True,
                                                     monitor='val_loss')
    
    # 开始训练模型
    history = model.fit(x_train, y_train, batch_size=64, epochs=50, validation_data=(x_test, y_test), validation_freq=1,
                        callbacks=[cp_callback])
    
    model.summary()
    
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值