RNN循环神经网络
实现文本预测
RNN原理:
A -> Model -> B -> Model -> C -> …
所形成的句子[A, B, C, …]
先看结果:
预测 -> "不分开"
不分开 还知道多难 你心烦叫你也才有些天 别 爱着还是 说 外场米渐我知道 自己会太多走不走 一颗三废都不要我手 这样也和义 自己的受伤 让我刮 小用往 只要女生活能记不多 那果有在想要你们过去 我不能怕做 你否定不你 脑诉为要承透 融必我遇见你还是微笑 自然却没要让你看着我 想知到你去一遍想办得模样 我不开 小情掉在我情球 断于的弦 再怎么接 又上不见 你很快化没是 我不能听多久 如果说你的一样伴
训练情况:
结果是挺不满意的, 毕竟理解不是很深
基本思路框架
和以前线性模型比较相似
- 加载数据 – 处理数据
- 设置独热编码
- 分批数据
- 建立模型
- 训练模型
- 预测
正常导包
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
加载数据, 自己找篇文章啥的都可以
提前把"\n"和"\t"这两个字符转为空格
设置可以由文字转数字, 数字转文字的字典
encoded 就是我们的训练数据, 也就是一列表的的数字, 方便onehot矩阵的实现
with open("../input/jaychou_lyrics4703/jaychou_lyrics.txt", "r", encoding="utf-8") as f:
text = f.readlines()
text = "".join(text).replace("\n", " ").replace("\t", " ")[:30000]
char = list(set(text))
char_to_int = {
c: i for i, c in enumerate(char)}
int_to_char = {
i: c for i, c in enumerate(char)}
vocab_size = len(char_to_int)
encoded = [char_to_int[i] for i in text]
onehot 将输入的文本(刚刚已经转成数字了)实现成矩阵, 以便训练
onehot会输出一个二维矩阵
例: {a: 0, b: 1, c: 2}
input = “bac”
return [[0, 1, 0],
[1, 0, 0],
[0, 0, 1]]
def one_hot(text, n_class):
"""
text: 序列串, tensor
n_class: chars(dict) 长度
"""
res = torch.zeros(text.shape