【RNN从入门到实战】GRU入门到实战

1、GRU 有两个门(重置门与更新门),而 LSTM 有三个门(输入门、遗忘门和输出门)。

2、GRU 并不会控制并保留内部记忆(c_t),且没有 LSTM 中的输出门。

3、LSTM 中的输入与遗忘门对应于 GRU 的更新门,重置门直接作用于前面的隐藏状态。

4、在计算输出时并不应用二阶非线性。

如何选择?

================================================================

由于 GRU 参数更少,收敛速度更快,因此其实际花费时间要少很多,这可以大大加速了我们的迭代过程。 而从表现上讲,二者之间孰优孰劣并没有定论,这要依据具体的任务和数据集而定,而实际上,二者之间的 performance 差距往往并不大,远没有调参所带来的效果明显,我通常的做法,首先选择GRU作为基本的单元,因为其收敛速度快,可以加速试验进程,快速迭代,而我认为快速迭代这一特点很重要。如果实现没其余优化技巧,才会尝试将 GRU 换为 LSTM,看看有没有变化。

实战——使用GRU预测股票

========================================================================

制作数据集


数据的下载地址:http://quotes.money.163.com/trade/lsjysj_zhishu_000001.html

首先选择查询数据的范围,然后选择下载数据:

在这里插入图片描述

点击下载数据后,弹出个框,这个框里可以看到起止日期,数据的列,默认勾选全部,然后单击下载。

在这里插入图片描述

将下载后的数据放到工程的根目录下面,然后做一些处理。

第一步 读入csv文件,编码方式设置为gbk。

第二步 将日期列转为“年-月-日”这样的格式。

第三步 根据日期排序,数据默认是从降序,改为升序。

最后 保存到“sh.csv”中。

代码如下:

import pandas as pd

df = pd.read_csv(“000001.csv”, encoding=‘gbk’)

df[“日期”] = pd.to_datetime(df[“日期”], format=“%Y-%m-%d”)

df.sort_values(by=[“日期”], ascending=True)

df = df.sort_values(by=[“日期”], ascending=True)

df.to_csv(“sh.csv”, index=False, sep=‘,’)

到这里数据集制作完成了

读入数据集,构建时序数据。


generate_df_affect_by_n_days函数,通过一个序列来生成一个矩阵(用于处理时序的数据)。就是把当天的前n天作为参数,当天的数据作为label。

readData中的文件名为:sh.csv ,参数column,代表选用的数据,本次预测只用了一列数据,列名就是column,参数n就是之前模型中所说的n,代表column前n天的数据。train_end表示的是后面多少个数据作为测试集。

import pandas as pd

import matplotlib.pyplot as plt

import datetime

import torch

import torch.nn as nn

import numpy as np

from torch.utils.data import Dataset, DataLoader

def generate_df_affect_by_n_days(series, n, index=False):

if len(series) <= n:

raise Exception(“The Length of series is %d, while affect by (n=%d).” % (len(series), n))

df = pd.DataFrame()

for i in range(n):

df[‘c%d’ % i] = series.tolist()[i:-(n - i)]

df[‘y’] = series.tolist()[n:]

if index:

df.index = series.index[n:]

return df

def readData(column=‘收盘价’, n=30, all_too=True, index=False, train_end=-300):

df = pd.read_csv(“sh.csv”, index_col=0, encoding=‘utf-8’)

df.fillna(0, inplace=True)

df.replace(to_replace=“None”, value=0)

del df[“股票代码”]

del df[“名称”]

df.index = list(map(lambda x: datetime.datetime.strptime(x, “%Y-%m-%d”).date(), df.index))

df_column = df[column].copy()

df_column_train, df_column_test = df_column[:train_end], df_column[train_end - n:]

df_generate_from_df_column_train = generate_df_affect_by_n_days(df_column_train, n, index=index)

print(df_generate_from_df_column_train)

if all_too:

return df_generate_from_df_column_train, df_column, df.index.tolist()

return df_generate_from_df_column_train

构建模型


模型见RNN类,采用GRU+全连接。隐藏层设置64,GRU的输出是64维的,所以设置全连接也是64。

TrainSet是数据读取类,将输出数据的最后一列做标签,前面的列做输入,类的写法是Pytorch的固定模式。

class RNN(nn.Module):

def init(self, input_size):

super(RNN, self).init()

self.rnn = nn.GRU(

input_size=input_size,

hidden_size=64,

num_layers=1,

batch_first=True,

)

self.out = nn.Sequential(

nn.Linear(64, 1),

)

self.hidden = None

def forward(self, x):

r_out, self.hidden = self.rnn(x) # None 表示 hidden state 会用全0的 state

out = self.out(r_out)

return out

class TrainSet(Dataset):

def init(self, data):

定义好 image 的路径

self.data, self.label = data[:, :-1].float(), data[:, -1].float()

def getitem(self, index):

return self.data[index], self.label[index]

def len(self):

return len(self.data)

训练与测试


n为模型中的n

LR是模型的学习率

EPOCH是多次循环

train_end这个在之前的数据集中有提到。(注意是负数)

n = 30

LR = 0.0001

EPOCH = 100

train_end = -500

loss选用mse

预测的数据选择“收盘价”

n = 10

LR = 0.0001

EPOCH = 100

train_end = -500

数据集建立

df, df_all, df_index = readData(‘收盘价’, n=n, train_end=train_end)

df_all = np.array(df_all.tolist())

plt.plot(df_index, df_all, label=‘real-data’)

df_numpy = np.array(df)

df_numpy_mean = np.mean(df_numpy)

df_numpy_std = np.std(df_numpy)

df_numpy = (df_numpy - df_numpy_mean) / df_numpy_std

df_tensor = torch.Tensor(df_numpy)

trainset = TrainSet(df_tensor)

trainloader = DataLoader(trainset, batch_size=16, shuffle=True)

rnn = RNN(n)

optimizer = torch.optim.Adam(rnn.parameters(), lr=LR) # optimize all cnn parameters

loss_func = nn.MSELoss()

for step in range(EPOCH):

for tx, ty in trainloader:

output = rnn(torch.unsqueeze(tx, dim=0))

loss = loss_func(torch.squeeze(output), ty)

optimizer.zero_grad() # clear gradients for this training step

loss.backward() # back propagation, compute gradients

optimizer.step()

print(step, loss)

if step % 10:

torch.save(rnn, ‘rnn.pkl’)

torch.save(rnn, ‘rnn.pkl’)

generate_data_train = []

generate_data_test = []

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python爬虫全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:python)
img

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python爬虫全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:python)
[外链图片转存中…(img-Hq0v2kFE-1710884301010)]

  • 17
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值