《动手学深度学习》(PyTorch版)代码注释 - 35 【GRU_with_simple_way】

说明

本博客代码来自开源项目:《动手学深度学习》(PyTorch版)
并且在博主学习的理解上对代码进行了大量注释,方便理解各个函数的原理和用途

配置环境

使用环境:python3.8
平台:Windows10
IDE:PyCharm

此节说明

此节对应书本上6.7节
此节功能为:门控循环单元(GRU)的简单实现
由于次节相对容易理解,代码注释量较少

代码

# 本书链接https://tangshusen.me/Dive-into-DL-PyTorch/#/chapter03_DL-basics/3.8_mlp
# 6.7 门控循环单元(GRU)
# 注释:黄文俊
# E-mail:hurri_cane@qq.com


import numpy as np
import torch
from torch import nn, optim
import torch.nn.functional as F

import sys
sys.path.append("..")
import d2lzh_pytorch as d2l
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

(corpus_indices, char_to_idx, idx_to_char, vocab_size) = d2l.load_data_jay_lyrics()



num_inputs, num_hiddens, num_outputs = vocab_size, 256, vocab_size
print('will use', device)


num_epochs, num_steps, batch_size, lr, clipping_theta = 160, 35, 32, 1e2, 1e-2
pred_period, pred_len, prefixes = 40, 50, ['分开', '不分开']



# 简洁实现
lr = 1e-2 # 注意调整学习率
gru_layer = nn.GRU(input_size=vocab_size, hidden_size=num_hiddens)
model = d2l.RNNModel(gru_layer, vocab_size).to(device)
d2l.train_and_predict_rnn_pytorch(model, num_hiddens, vocab_size, device,
                                corpus_indices, idx_to_char, char_to_idx,
                                num_epochs, num_steps, lr, clipping_theta,
                                batch_size, pred_period, pred_len, prefixes)




print("*"*50)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
首先,我们需要准备数据集。假设我们要预测房价,我们可以使用UCI Machine Learning Repository中的波士顿房价数据集。 接下来,我们可以定义我们的模型。CNN-GRU-Attention模型主要由三部分组成:卷积神经网络层(CNN)、门控循环单元层(GRU)和注意力机制层(Attention)。代码如下: ```python import torch.nn as nn class CNN_GRU_Attention(nn.Module): def __init__(self, input_dim, hidden_dim, output_dim): super(CNN_GRU_Attention, self).__init__() # 定义卷积神经网络层 self.conv_layer = nn.Sequential( nn.Conv1d(in_channels=input_dim, out_channels=32, kernel_size=3), nn.ReLU(), nn.Conv1d(in_channels=32, out_channels=64, kernel_size=3), nn.ReLU(), nn.Conv1d(in_channels=64, out_channels=128, kernel_size=3), nn.ReLU() ) # 定义门控循环单元层 self.gru_layer = nn.GRU(input_size=128, hidden_size=hidden_dim, num_layers=1, batch_first=True) # 定义注意力机制层 self.attention_layer = nn.Sequential( nn.Linear(hidden_dim, 64), nn.Tanh(), nn.Linear(64, 1) ) # 定义输出层 self.output_layer = nn.Linear(hidden_dim, output_dim) def forward(self, x): # 卷积神经网络层 x = self.conv_layer(x) # 将输出转换为GRU的输入格式 x = x.permute(0, 2, 1) # GRU层 output, hidden = self.gru_layer(x) # 注意力机制层 attention_weights = nn.functional.softmax(self.attention_layer(output), dim=1) attention_output = (output * attention_weights).sum(dim=1) # 输出层 output = self.output_layer(attention_output) return output ``` 接下来,我们可以定义损失函数和优化器,并开始训练我们的模型。这里我们使用均方误差(Mean Squared Error)作为损失函数,Adam优化器进行优化。代码如下: ```python import torch.optim as optim # 定义损失函数和优化器 criterion = nn.MSELoss() optimizer = optim.Adam(model.parameters(), lr=0.001) # 开始训练 num_epochs = 100 for epoch in range(num_epochs): # 训练模式 model.train() # 循环批次 for batch_idx, (data, target) in enumerate(train_loader): # 清空梯度 optimizer.zero_grad() # 前向传播 output = model(data) # 计算损失 loss = criterion(output, target) # 反向传播 loss.backward() # 更新参数 optimizer.step() # 测试模式 model.eval() # 计算测试集上的损失 test_loss = 0.0 with torch.no_grad(): for data, target in test_loader: output = model(data) test_loss += criterion(output, target).item() * data.size(0) test_loss /= len(test_loader.dataset) # 打印损失 print('Epoch: {}, Training Loss: {:.6f}, Testing Loss: {:.6f}'.format(epoch+1, loss.item(), test_loss)) ``` 最后,我们可以使用训练好的模型进行预测。代码如下: ```python # 使用模型进行预测 model.eval() with torch.no_grad(): output = model(test_data) # 打印预测结果 print('Prediction:', output.item()) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hurri_cane

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值