1、GRU 有两个门(重置门与更新门),而 LSTM 有三个门(输入门、遗忘门和输出门)。
2、GRU 并不会控制并保留内部记忆(c_t),且没有 LSTM 中的输出门。
3、LSTM 中的输入与遗忘门对应于 GRU 的更新门,重置门直接作用于前面的隐藏状态。
4、在计算输出时并不应用二阶非线性。
================================================================
由于 GRU 参数更少,收敛速度更快,因此其实际花费时间要少很多,这可以大大加速了我们的迭代过程。 而从表现上讲,二者之间孰优孰劣并没有定论,这要依据具体的任务和数据集而定,而实际上,二者之间的 performance 差距往往并不大,远没有调参所带来的效果明显,我通常的做法,首先选择GRU作为基本的单元,因为其收敛速度快,可以加速试验进程,快速迭代,而我认为快速迭代这一特点很重要。如果实现没其余优化技巧,才会尝试将 GRU 换为 LSTM,看看有没有变化。
========================================================================
数据的下载地址: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)
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python爬虫全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:python)
[外链图片转存中…(img-Hq0v2kFE-1710884301010)]