RNN模型案例演示:
import torch
import torch.nn as nn
class RNN(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
"""
初始化函数中的三个参数,分别是输入层张量最后一维的尺寸大小,隐藏层张量最后一维的尺寸大小,输出层张量最后一维的尺寸大小
:param input_size: 入层张量最后一维的尺寸大小
:param hidden_size: 隐藏层张量最后一维的尺寸大小
:param output_size: 输出层张量最后一维的尺寸大小
"""
super(RNN, self).__init__()
# 传入隐藏层尺寸大小
self.hidden_size = hidden_size
"""
构建从输入层到隐藏层的线性变化,这个线性层的输入尺寸是 input_size + hidden_size
这是因为在循环网络中,每次输入都有两部分组成,分别是当前时刻的输入x(t)和上一时刻产生的输出h(t-1)
这个线性层的输出尺寸是 hidden_size
"""
self.i2h = nn.Linear(input_size + hidden_size, hidden_size)
"""
构建从输入层到输出层的线性变化,这个线性层的输入还是 input_size + hidden_size
这个线性层的输出尺寸是 output_size
"""
self.h2o = nn.Linear(input_size + hidden_size, output_size)
# 最后,需要对输出做 softmax 处理,获取得接货
self.softmax = nn.LogSoftmax(dim=-1)
def forward(self, input, hidden):
"""
在 forward 函数中,参数分别是规定尺寸的输入层张量,以及规定尺寸的初始化隐藏层张量
:param input: 规定尺寸的输入层张量
:param hidden: 规定尺寸的初始化隐藏层张量
:return: 输出张量和最后的隐藏层结果
"""
# 首先使用 torch.cat 将 input 和 hidden 进行张量拼接
combined = torch.cat(input, hidden)
# 通过输入层到影藏层变换获得 hidden 张量
hidden = self.i2h(combined)
# 通过输入层到输出层变换获得 output 张量
output = self.i2o(combined)
# 对输出进行 softmax 进行处理
output = self.softmax(output)
# 返回输出张量和最后的隐藏层结果
return output, hidden
def initHidden(self):
"""
隐藏层初始化函数
:return: 将隐藏层初始化为一个 1 x hidden_size 的全0张量
x:乘法符号
"""
return torch.zeros(1, self.hidden_size)