9.5.dataset
为了防止词表太大,将低频词元替换为 <unk>
最后生成的 iter 接口为:
```py
train_iter, src_vocab, tgt_vocab = load_data_nmt(batch_size=2, num_steps=8)
for X, X_valid_len, Y, Y_valid_len in train_iter:
print('X:', X.type(torch.int32))
print('X的有效长度:', X_valid_len)
print('Y:', Y.type(torch.int32))
print('Y的有效长度:', Y_valid_len)
break
# X: (2, 8) (n, ns)
# Y: 也是 (n, ns)
# 小批量中训练数据的长度统一为 num_steps(上面有),不足的用 1 即 <pad> 填充
X: tensor([[62, 25, 4, 3, 1, 1, 1, 1],
[99, 10, 4, 3, 1, 1, 1, 1]], dtype=torch.int32)
# 可能代表的数据形如 [["I", "try", ".", <eos>, <pad>, <pad>, <pad>, <pad>], ["This", "is", ".", <eos>, <pad>, <pad>, <pad>, <pad>]]
X的有效长度: tensor([4, 4])
Y: tensor([[186, 5, 3, 1, 1, 1, 1, 1],
[ 0, 8, 4, 3, 1, 1, 1, 1]], dtype=torch.int32)
Y的有效长度: tensor([3, 4])
# <bos> 在 train_seq2seq() 中再加入
注意这并非要求网络输入层维数为 num_steps,比如 rnn 中也有 num_steps 但输入层维数就是词表大小(即一个单词的独热编码)