0 写在前面
- 以前的卷积神经网络受到生物视觉细胞的启发,同样,循环神经网络受到生物记忆能力的启发。
1 RNN 简单描述
- 普通神经网络和循环神经网络
- 普通神经网络:输入层经过隐藏层再输出
- 循环神经网络:输入层输出数据经过隐藏层后也作为下一个输入的一部分,循环传输
2 RNN 的数学表达
- 首先初始化一个RNN单元,该单元的输入特征维度5,隐藏向量的特征维度7
import torch
from torch import nn
rnn_cell = nn.RNNCell(input_size=5, hidden_size=7)
rnn_cell
RNNCell(5, 7)
- 将前一时刻输出的隐藏向量,和该时刻的输入向量进行线性边变换并相加,然后经过非线性层(这里用的是tanh函数),得到该时刻的隐藏向量。
- 所以说,确定一个RNN_cell需要一个input_size,需要一个hidden_size,
说白了,就相当于一个线性层。
3 设计输入输出的size
- 假设 batch_size=1 , seqlen=3 , input_size=4 , hidden_size=2
- 那么输入的Tensor的形状: input.shape=(batch_size,input_size)
- 输出的Tensor的形状: output.shape=(batch_size,hidden_size)
4 RNNcell 与 RNN
- RNNCell在处理一个序列的输入向量时,必须采用循环的方式逐个向量进行输入;
- 而PyTorch中定义了一个RNN模块,可以直接将序列当成输入。
- RNNCell 代码
import torch
batch_size = 1
seq_len = 3
input_size = 4
hidden_size = 2
cell = torch.nn.RNNCell(input_size=input_size, hidden_size=hidden_size)
#(seq, batch, features)
dataset = torch.randn(seq_len, batch_size, input_size)
hidden = torch.zeros(batch_size, hidden_size)
for idx, input in enumerate(dataset):
print('=' * 20, idx, '=' * 20)
print('Input size: ', input.shape)
hidden = cell(input, hidden)
print('outputs size ', hidden_size)
print(hidden)
- RNN 代码
import torch
batch_size = 1
seq_len = 3
input_size = 4
hidden_size = 2
num_layers = 1
cell = torch.nn.RNN(input_size=input_size, hidden_size=hidden_size,
num_layers=num_layers, batch_first=True)
# (seq, batch, features)
inputs = torch.randn(batch_size, seq_len, input_size)
hidden = torch.zeros(num_layers, batch_size, hidden_size)
out, hidden = cell(inputs, hidden)
print('Output size: ', out.shape)
print('Output: ', out)
print('Hidden size: ', hidden_size)
print('Hidden: ', hidden)
- 总结:RNN和RNNCell的区别在于:RNN可以同时处理一串序列,并且同时返回输出向量序列和隐藏向量。
5 举例——hello转换为
文章出处登录后可见!
已经登录?立即刷新