文章目录
本文记录学习循环神经网络layer 使用,是时间序列学习(3) 。
1 输入数据的维度表示
输入数据x: [seq, batch, feature_len]
seq
:表示一句话有几个单词batch
:表示一次输入几句话feature_len
: 表示每个单词用feature_len 维的向量来表示
例如: [10, 3, 100]
表示10个单词一句话,一次性输入3句话,每个单词用100d的向量表示。
每个单元的 x t x_t xt 表示,[batch, feature_len], 例如 [3, 100]
所以,最开始的
h
0
h_0
h0 必须要初始化为 [batch, hidden] 才能作为 memory 往后传。
2 介绍nn.RNN
2.1 __init__函数
- 注意,输入的x的size: [seq, batch, vec]**
input_size
: 就是每个词向量的维数,也就是输入x中的vec(100d)hidden_size
: 特征深度num_layers
: 默认是1
2.2 out, ht = forward(x, h0)
- 注意这里的返回值是两个
x
x
x : [seq_len, b, word_vec]
h
o
和
h
t
h_o 和h_t
ho和ht :[num_layers, b, h_dim]
o
u
t
out
out : [seq_len, b, h_dim]
注意:out是一个聚合过的信息,每一个单词都会有一个输出
3 单层single layer RNN
import torch
from torch import nn
# 定义一个单层的RNN
rnn_layer = nn.RNN(input_size=100, hidden_size=20, num_layers=1)
print(rnn_layer)
x = torch.rand(10, 3, 100)
out, h = rnn_layer(x, torch.zeros(1, 3, 20)) # h0也可以不写
print(out.shape, h.shape)
- 输出情况:
RNN(100, 20)
torch.Size([10, 3, 20]) torch.Size([1, 3, 20])
3.1 分析 输出out的shape
- [10, 3, 20] : 表示每个句子10个单词, 一共是3个句子,然后用20d来表示每个单词
3.2 分析 输出h 的shape
- [1, 3, 20] : 1是lay_num, 3表示是3个句子, 20表示的是每个词的特征维度。这是一层RNN的输出 h
4 多个RNN 层
- 最后输出的h,代表的是所有RNN 输出的h
- 最后输出的out, 是最后一个memory输出的out, 中间的状态是没有的
4 简单时序预测问题
- 比如说,正弦函数的波形的预测