B站 刘二大人 传送门 循环神经网络(基础篇)
课件链接:https://pan.baidu.com/s/1vZ27gKp8Pl-qICn_p2PaSw
提取码:cxe4
模型还是将输入“hello”训练输出为“ohlol”,用GRU网络实现。按照计算图实现GRU之后,像前面一样又尝试了加入embedding的方法,效果略有改进。
GRU的网络结构示意图和公式:
下面的公式和上面一样,就是写法不同。
首先看公式有6个线性层,之后又进行了非线性运算,所以模型定义了6个linear。输入是4维向量(h、e、l、o),不打算改变维度,所以输出也都是4维。只有5个输入,所以批量设为1.向前传播根据计算公式和计算图,返回hidden继续在下一轮计算继续用。和上一篇LSTM大同小异,只有网络结构和网络输出上有点不一样。
import torch
input_size = 4
batch_size = 1
class GRU(torch.nn.Module):
def __init__(self):
super(GRU, self).__init__()
self.linearrx = torch.nn.Linear(4, 4)
self.linearzx = torch.nn.Linear(4, 4)
self.linearnx = torch.nn.Linear(4, 4)
self.linearrh = torch.nn.Linear(4, 4)
self.linearzh = torch.nn.Linear(4, 4)
self.linearnh = torch.nn.Linear(4, 4)
self.sigmoid = torch.nn.Sigmoid()
self.tanh = torch.nn.Tanh()
def forward(self, x, hidden):
r = self.sigmoid(self.linearrx(x) + self.linearrh(hidden))
z = self.sigmoid(self.linearzx(x) + self.linearzh(hidden))
n = self.tanh(self.linearnx(x) + r * self.linearnh(hidden)