「@Author:Runsen」

当阅读一篇课文时,我们可以根据前面的单词来理解每个单词的,而不是从零开始理解每个单词。这可以称为记忆。卷积神经网络模型(CNN)不能实现这种记忆,因此引入了递归神经网络模型(RNN)来解决这一问题。RNN是带有循环的网络,允许信息持久存在。

RNN的应用有:

  • 情绪分析(多对一,顺序输入)

  • 机器翻译(多对多,顺序输入和顺序输出)

  • 语音识别(多对多) 它被广泛地用于处理序列数据的预测和自然语言处理。针对Vanilla-RNN存在短时记忆(梯度消失问题),引入LSTM和GRU来解决这一问题。特别是LSTM被广泛应用于深度学习模型中。

本博客介绍了如何通过PyTorch实现RNN和LSTM,并将其应用于比特币价格预测。

import torch
import torch.nn as nn
import torch.optim as optim
from torch.autograd import Variable
import torch.utils.data as Data
from torch.utils.data import DataLoaderimport torchvision
import torchvision.datasets as datasets
import torchvision.transforms as transforms
import torchvision.utils as vutilsimport numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import os
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(device) #cuda

比特币历史数据集

将通过比较RNN lstm 的性能,来处理时间序列数据,而不是语言数据。使用的数据来自Kaggle比特币历史数据. 比特币是一种加密区块链货币。

data = pd.read_csv("EtherPriceHistory(USD).csv")
data.tail()

然后我将绘制数据,以查看比特币价格的趋势。

plt.figure(figsize = (12, 8))
plt.plot(data["Date(UTC)"], data["Value"])
plt.xlabel("Date")
plt.ylabel("Price")
plt.title("Ethereum Price History")
plt.show()

# Hyper parameters
threshold = 116
window = 30input_size = 1
hidden_size = 50
num_layers = 3
output_size = 1learning_rate = 0.001
batch_size = 16train_data = data['Value'][:len(data) - threshold]
test_data = data['Value'][len(data) - threshold:]

下面的函数是生成一个滑动窗口,create_sequences扫描所有的训练数据。

def create_sequences(input_data, window):length = len(input_data)x = input_data[0:window].valuesy = input_data[1:window+1].valuesfor i in range(1, length - window):x = np.vstack((x, input_data[i:i+window].values))y = np.vstack((y, input_data[i+1:window+1+i].values))sequence = torch.from_numpy(x).type(torch.FloatTensor)label = torch.from_numpy(y).type(torch.FloatTensor)sequence = Data.TensorDataset(sequence, label)return sequence
train_data = create_sequences(train_data, window)
train_loader = Data.DataLoader(train_data, batch_size = batch_size, shuffle = False, drop_last = True)

建立RNN神经网络模型

class RNN(nn.Module):def __init__(self, input_size, hidden_size, num_layers, output_size):super(RNN, self).__init__()self.input_size = input_sizeself.hidden_size = hidden_sizeself.num_layers = num_layersself.output_size = output_sizeself.hidden = torch.zeros(num_layers, 1, hidden_size)self.rnn = nn.RNN(input_size, hidden_size, num_layers,             # number of recurrent layersbatch_first = True,    # Default: False# If True, layer does not use bias weightsnonlinearity = 'relu',  # 'tanh' or 'relu'#dropout = 0.5)self.fc = nn.Linear(hidden_size, output_size)def forward(self, x):# input shape of (batch, seq_len, input_size)# output shape of (batch, seq_len, hidden_size)out, hidden = self.rnn(x, self.hidden)self.hidden = hidden# output shape of (batch_, seq_len, output_size)out = self.fc(out)return outdef init_hidden(self, batch_size):# hidden shape of (num_layers, batch, hidden_size)self.hidden = torch.zeros(self.num_layers, batch_size, self.hidden_size)
rnn = RNN(input_size, hidden_size, num_layers, output_size).to(device)
rnn

MSELoss表示均方损失,Adam表示学习率为0.001的Adam优化器。与CNN模型的训练不同,添加了nn.utils.clip_grad_norm_来防止梯度爆炸问题。

def train(model, num_epochs):criterion = nn.MSELoss()optimizer = optim.Adam(model.parameters(), lr = learning_rate)for epoch in range(num_epochs):for i, (sequences, labels) in enumerate(train_loader):model.init_hidden(batch_size)sequences = sequences.view(-1, window, 1)labels = labels.view(-1, window, 1)pred = model(sequences)cost = criterion(pred[-1], labels[-1])optimizer.zero_grad()cost.backward()#防止梯度爆炸问题nn.utils.clip_grad_norm_(model.parameters(), 5)optimizer.step()print("Epoch [%d/%d] Loss %.4f"%(epoch+1, num_epochs, cost.item()))print("Training Finished!")train(rnn, 10)

def evaluation(model):model.eval()model.init_hidden(1)val_day = 30dates = data['Date(UTC)'][1049+window:1049+window+val_day]pred_X = []for i in range(val_day):X = torch.from_numpy(test_data[i:window+i].values).type(torch.FloatTensor)X = X.view(1, window, 1).to(device)pred = model(X)pred = pred.reshape(-1)pred = pred.cpu().data.numpy()pred_X.append(pred[-1])y = test_data[window:window+val_day].valuesplt.figure(figsize = (12, 8))plt.plot(dates, y, 'o-', alpha = 0.7, label = 'Real')plt.plot(dates, pred, '*-', alpha = 0.7, label = 'Predict')plt.xticks(rotation = 45)plt.xlabel("Date")plt.ylabel("Ethereum Price (USD)")plt.legend()plt.title("Comparison between Prediction and Real Ethereum BitCoin Price")plt.show()

预测价格大致遵循价格变动趋势,但价格绝对值与实际价格相差不大。因此,考虑到价格的巨大变化,但实际它的预测并不坏。可以通过修改模型参数和超参数来改进。

# Save the model checkpoint
save_path = './model/'if not os.path.exists(save_path):os.makedirs(save_path)torch.save(rnn.state_dict(), 'rnn.ckpt')

往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑黄海广老师《机器学习课程》课件合集
本站qq群851320808,加入微信群请扫码:

【小白学习PyTorch教程】九、基于Pytorch训练第一个RNN模型相关推荐

  1. 【小白学习tensorflow教程】四、使用 tfhub中的模型EfficientDet-Lite2 进行对象检测

    @Author:Runsen tfhub是tensorflow官方提供训练好的模型的一个仓库.今天,我使用 tfhub中的模型EfficientDet-Lite2 进行对象检测 选择的模型是Effic ...

  2. 深度学习和目标检测系列教程 10-300:通过torch训练第一个Faster-RCNN模型

    @Author:Runsen 上次介绍了Faster-RCNN模型,那么今天就开始训练第一个Faster-RCNN模型. 本文将展示如何在水果图像数据集上使用Faster-RCNN模型. 代码的灵感来 ...

  3. 【小白学习PyTorch教程】十、基于大型电影评论数据集训练第一个LSTM模型

    「@Author:Runsen」 本博客对原始IMDB数据集进行预处理,建立一个简单的深层神经网络模型,对给定数据进行情感分析. 数据集下载 here. 原始数据集,没有进行处理here. impor ...

  4. 清华大学开源迁移学习算法库:基于PyTorch实现,支持轻松调用已有算法

    机器之心报道 编辑:魔王 作者:清华大学大数据研究中心 近日,清华大学大数据研究中心机器学习研究部开源了一个高效.简洁的迁移学习算法库 Transfer-Learn,并发布了第一个子库--深度领域自适 ...

  5. 清华大学开源迁移学习算法库:基于PyTorch实现已有算法

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:机器之心 AI博士笔记系列推荐 周志华<机器学习> ...

  6. 学习笔记:深度学习(8)——基于PyTorch的BERT应用实践

    学习时间:2022.04.26~2022.04.30 文章目录 7. 基于PyTorch的BERT应用实践 7.1 工具选取 7.2 文本预处理 7.3 使用BERT模型 7.3.1 数据输入及应用预 ...

  7. 【Pytorch(七)】基于 PyTorch 实现残差神经网络 ResNet

    基于 PyTorch 实现残差神经网络 ResNet 文章目录 基于 PyTorch 实现残差神经网络 ResNet 0. 概述 1. 数据集介绍 1.1 数据集准备 1.2 分析分类难度:CIFAR ...

  8. 【深度学习】SETR:基于视觉 Transformer 的语义分割模型

    Visual Transformer Author:louwill Machine Learning Lab 自从Transformer在视觉领域大火之后,一系列下游视觉任务应用研究也随之多了起来.基 ...

  9. 大力出奇迹!6144块TPU,5400亿参数,会改bug、解读笑话,谷歌刚刚用Pathways训练了一个大模型...

    机器之心报道 机器之心编辑部 谷歌的下一代架构 Pathways 已经用来训练大模型了. ‍ 随着规模的增加,模型在处理多个任务时的性能逐渐提高,而且还在不断解锁新的能力. 在探讨现有 AI 模型的局 ...

最新文章

  1. android开发之Parcelable使用详解
  2. android浮于上方布局,android-在FrameLayout中使RecyclerView上方的视图...
  3. C/C++冷门知识点你知道多少呢?
  4. 国家普通话水平智能测试软件,国家普通话水平智能测试系统注意事项
  5. dynamo python修改多个参数_python之函数
  6. Eclipse导入GitHub上面项目的两处报错处理
  7. 网页中使用的特殊字体(webdings, wingdings 2)
  8. python 包管理工具 —— setuptools
  9. 【vscode】去除黄色波浪下划线
  10. 将 iOS 软件移植到 Windows 10 的桥梁将很快打通
  11. quartz配置详解
  12. 个性化推荐算法(推荐系统)概要
  13. Cocos2d-x 3.x基础学习: 拖尾渐隐效果MotionStreak
  14. 自增 ID 用完了怎么办 ?
  15. 解决iPhone发送短信显示红色感叹号:尚未送达
  16. 5G无线技术基础自学系列 | 新多址接入
  17. 设备驱动安装不上怎么办?
  18. 如何在Adobe Illustrator中创建复古风格的室内场景
  19. DSR评分对 搜索权重 、转化率、淘宝活动、是否成为金牌卖家的影响
  20. jude(java建模软件)_JUDE(JAVA建模软件)

热门文章

  1. C#开启线程的四种方式
  2. SpringBoot之Servlet、Filter、Listener配置
  3. 20170728xlVBA改转置一例
  4. Button的点击事件
  5. SQL注入攻击再度肆虐殃及大量网站
  6. java 文件指定位置插入_java 中利用io流将一个文件插入到另一个文件中的指定位置,指定位置...
  7. unity 200.8m yoy_【Unity文档】Realtime GI介绍(一)
  8. 科研地图来了,看看你的研究领域在哪里!中国科学院科技战略咨询研究院发布《科学结构图谱2021》
  9. 一文读懂CoIP实验:原理、实验流程、遇到的问题
  10. C++std::vector指定位置插入