用RNN预测MNIST数据集(pytorch)

一、代码

import torch
from torch import nn
import torchvision.datasets as datasets
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
from torch.utils.data import DataLoader
#%matplotlib inline

# 超参数定义
EPOCH = 1
BATCH_SIZE = 64
TIME_STEP = 28
INPUT_SIZE = 28
LR = 0.001

# MNIST数据集下载
train_data = datasets.MNIST(root='./mnist', train=True, 
                            transform=transforms.ToTensor(),
                            download = True
                           )
test_data = datasets.MNIST(root='./mnist', train=False, 
                            transform=transforms.ToTensor(),
                            download = True
                           )

test_x = test_data.test_data.type(torch.FloatTensor)[:2000] / 255.
test_y = test_data.test_labels.numpy()[:2000]

print(train_data.train_data.size())
print(train_data.train_labels.size())
plt.imshow(train_data.train_data[0].numpy(), cmap='gray')
plt.show()
#print(train_data)

# 使用Dataloader进行分批
train_loader = DataLoader(dataset=train_data, batch_size=BATCH_SIZE, shuffle=True)

# 定义网络
class RNN(nn.Module):
    def __init__(self):
        super(RNN, self).__init__()
        self.rnn = nn.GRU(input_size=INPUT_SIZE, hidden_size=64, num_layers=1, batch_first=True)
        self.out = nn.Linear(64, 10) #10个分类

    def forward(self, x):
        # 前向传播
        r_out, _ = self.rnn(x)
        # 选择 r_out的最后一个时间步
        out = self.out(r_out[:,-1,:])
        return out

# 设置使用GPU
cuda = torch.device('cuda')
rnn = RNN()
rnn = rnn.cuda()
optimizer = torch.optim.Adam(rnn.parameters(), lr=LR)
loss_func = nn.CrossEntropyLoss()

# 训练&验证
for epoch in range(EPOCH):
    for step, (b_x, b_y) in enumerate(train_loader):
        b_x = b_x.view(-1, 28, 28)
        # 前向传播
        output = rnn(b_x.cuda())
        # 损失函数
        loss = loss_func(output, b_y.cuda())
        # 后向传播
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        
        if step % 100 == 0:
            test_output = rnn(test_x.cuda())
            pred_y = torch.max(test_output, 1)[1].data.cpu().numpy()
            # 计算准确率
            accuracy = float((pred_y == test_y).astype(int).sum()) / float(test_y.size)
            print ('Epoch: {}, Step: {}, loss: {}, accuracy: {}'.format(epoch, step, loss, accuracy))

# 从测试集选出10个,进行验证
test_x = test_x.cuda()
test_output = rnn(test_x[:10].view(-1, 28, 28))
pred_y = torch.max(test_output, 1)[1].data.cpu().numpy()
print('预测数字', pred_y)
print('实际数字', test_y[:10])

二、运行结果

在这里插入图片描述

Epoch: 0, Step: 0, loss: 2.3083088397979736, accuracy: 0.086
Epoch: 0, Step: 100, loss: 1.330346703529358, accuracy: 0.5135
Epoch: 0, Step: 200, loss: 0.956856369972229, accuracy: 0.6725
Epoch: 0, Step: 300, loss: 0.715281069278717, accuracy: 0.76
Epoch: 0, Step: 400, loss: 0.3689120411872864, accuracy: 0.792
Epoch: 0, Step: 500, loss: 0.4506811201572418, accuracy: 0.832
Epoch: 0, Step: 600, loss: 0.3698571026325226, accuracy: 0.855
Epoch: 0, Step: 700, loss: 0.4824417531490326, accuracy: 0.8655
Epoch: 0, Step: 800, loss: 0.5076820850372314, accuracy: 0.8745
Epoch: 0, Step: 900, loss: 0.2233055979013443, accuracy: 0.885
预测数字 [7 2 1 0 4 1 4 9 5 9]
实际数字 [7 2 1 0 4 1 4 9 5 9]
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用PyTorch来实现RNN模型进行股票价格的预测。以下是一个示例代码: ```python import torch import torch.nn as nn import numpy as np # 定义RNN模型 class StockPredictionRNN(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(StockPredictionRNN, self).__init__() self.hidden_size = hidden_size self.rnn = nn.RNN(input_size, hidden_size, batch_first=True) self.fc = nn.Linear(hidden_size, output_size) def forward(self, x): out, _ = self.rnn(x) out = self.fc(out[:, -1, :]) # 只取最后一个时间步的输出 return out # 数据准备 # 使用LSTM模型,需要将数据整理成三维张量:[batch_size, seq_length, input_size] # 这里假设已经准备好了训练数据train_data和对应的标签train_labels # 定义模型参数 input_size = 1 # 输入维度为1,即每个时间步只有一个特征 hidden_size = 16 # 隐藏层维度 output_size = 1 # 输出维度为1,即预测股票价格 # 初始化模型 model = StockPredictionRNN(input_size, hidden_size, output_size) # 定义损失函数和优化器 criterion = nn.MSELoss() optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # 训练模型 num_epochs = 100 for epoch in range(num_epochs): inputs = torch.from_numpy(train_data).float() labels = torch.from_numpy(train_labels).float() # 前向传播 outputs = model(inputs) loss = criterion(outputs, labels) # 反向传播和优化 optimizer.zero_grad() loss.backward() optimizer.step() if (epoch+1) % 10 == 0: print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, loss.item())) # 使用模型进行预测 # 假设已经准备好了测试数据test_data with torch.no_grad(): inputs = torch.from_numpy(test_data).float() outputs = model(inputs) predicted_prices = outputs.numpy() # 输出预测结果 print(predicted_prices) ``` 在这个示例中,我们首先定义了一个`StockPredictionRNN`类作为RNN模型的实现。然后我们准备好训练数据和标签,并使用`nn.MSELoss`作为损失函数,`torch.optim.Adam`作为优化器。在训练过程中,我们通过调用`model(inputs)`进行前向传播并计算损失,然后进行反向传播和优化。最后,我们使用训练好的模型对测试数据进行预测,并将预测结果存储在`predicted_prices`中。 请注意,这只是一个简单的示例,实际的股票价格预测可能需要更多的特征工程和调参来提高模型的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值