主页 > imtoken下载钱包 > 【小白学习PyTorch教程】9.基于Pytorch训练第一个RNN模型

【小白学习PyTorch教程】9.基于Pytorch训练第一个RNN模型

imtoken下载钱包 2023-06-20 07:28:59

“@作者:润森”

在阅读课文时,我们可以根据上面的词组来理解每个词组,而不是从头理解每个词组。 这可以称为内存。 卷积神经网络模型(CNN)无法实现这些记忆比特币教学教程,因此引入循环神经网络模型(RNN)来解决这个问题。 RNN 是具有允许信息持久存在的循环的网络。

2016 比特币挖矿教程_比特币教学教程_外国的比特币便宜中国的比特币贵为什么?

RNN的应用有:

这篇博客描述了如何通过 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 DataLoader

import torchvision
import torchvision.datasets as datasets
import torchvision.transforms as transforms
import torchvision.utils as vutils

import 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()

外国的比特币便宜中国的比特币贵为什么?_2016 比特币挖矿教程_比特币教学教程

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

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()

比特币教学教程_2016 比特币挖矿教程_外国的比特币便宜中国的比特币贵为什么?

# Hyper parameters
threshold = 116
window = 30

input_size = 1
hidden_size = 50
num_layers = 3
output_size = 1

learning_rate = 0.001
batch_size = 16

train_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].values
    y = input_data[1:window+1].values
    
    for 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_size
        self.hidden_size = hidden_size
        self.num_layers = num_layers
        self.output_size = output_size
        
        self.hidden = torch.zeros(num_layers, 1, hidden_size)
        
        self.rnn = nn.RNN(input_size, 
                          hidden_size, 
                          num_layers,             # number of recurrent layers
                          batch_first = True,    # Default: False
                                                  # If True, layer does not use bias weights
                          nonlinearity = '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 out
    
    def 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

2016 比特币挖矿教程_比特币教学教程_外国的比特币便宜中国的比特币贵为什么?

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)

2016 比特币挖矿教程_外国的比特币便宜中国的比特币贵为什么?_比特币教学教程

def evaluation(model):
    model.eval()
    model.init_hidden(1)
    
    val_day = 30
    dates = 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].values
    
    plt.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()

比特币教学教程_2016 比特币挖矿教程_外国的比特币便宜中国的比特币贵为什么?

预测价格一般跟随价格变动趋势,但价格的绝对值与实际价格相差不大。 因此,鉴于价格点的巨大变化,这是一个不错的预测。 可以通过改变模型参数和超参数来改进。

# 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')

比特币教学教程_2016 比特币挖矿教程_外国的比特币便宜中国的比特币贵为什么?
往期精彩回顾




本站qq群851320808比特币教学教程,请扫码加入微信群:

2016 比特币挖矿教程_外国的比特币便宜中国的比特币贵为什么?_比特币教学教程