循环神经网络(RNN)

基本概念

时序数据

时间序列数据,根据同一指标按时间顺序记录的数据列。比如,我们所说的自然语言,在计算机视觉中的视频是按时间推移而演变的一系列图像内容;在语音识别中,处理音频信号;又比如在生物检测中的生物信号等等,这些都是时序数据。

循环神经网络(RNN)

在这里插入图片描述

循环神经网络是一类对时序数据建模而设计的神经网络体系结构。基本思想是每个新元素都贡献一些新的信息,这些信息更新了模型的当前状态。在上图中,在时间点t上,网络观察输入xt(句子中的一个单词),并将状态向量由ht-1更新为ht;当出入新的输入(下一个单词时),它将以某种依赖于ht方式完成,从而由后向前依次依赖于序列前面所有的输入。

长短时记忆(LSTM)神经网络

在这里插入图片描述
长短时记忆结构是RNN的变体,是为了解决梯度消失问题而设计的,也是第一个引入门机制的深度学习算法。将状态向量分成两半,一半作为内存单元,另一半作为工作内存。在每个输入状态,门用来决定有多少新的输入应该写入存储单元,以及当前存储单元的内容是否应该被遗忘。

在这里插入图片描述
在上图中,输入门用来决定什么值应该更新,遗忘门用来决定需要丢弃的信息,输出门输出我们确定输出的那部分,这个输出会基于当前的细胞状态,是一个过滤后的版本。其中,细胞状态会基于输入门和遗忘门的内容来更新。

门控循环网络(GRU)

门控循环网络可以说是简化的LSTM,GRU把内部状态向量和输出向量合并,统一为状态向量,门控数量也较少,只有复位门和更新门两个。

在这里插入图片描述

复位门决定了如何将新的输入信息与前面的记忆相结合,更新门用于控制前一时刻的状态信息被带入到当前状态中的程度,也就是更新门帮助模型决定到底要将多少过去的信息传递到未来,简单来说就是用于更新记忆。

测试代码

import collections
import numpy as np
import tensorflow as tf

# 自动写诗
# 获取数据集文件中的字典
ix2word_dict = dict(np.load("ix2word.npy", allow_pickle=True).reshape(1)[0])
# 获取数据集文件中的数组
dataset = np.load("data.npy")
dataset = dataset[: 2000]
cols = dataset.shape[1]
# 取数组中的前2000行,并将数字映射为字符
dataset = np.array(list(map(lambda index: ix2word_dict.get(index), dataset.flatten())))
dataset = dataset.reshape((-1, cols))
rows, cols = dataset.shape
# 获取所有字符
all_words = []
for row in range(rows):
    for col in range(cols):
        all_words.append(dataset[row][col])
# 统计各个字符出现的频率
word_count = collections.Counter(all_words)
# 转换成一个列表,里面的每一项是一个元组
word_count1 = sorted(word_count.items(), key=lambda x: -x[1])
# 分别获取字符和出现次数
words, counts = zip(*word_count1)
# 得到将每个字符映射为一个id的字典
word2ix_dict = dict(zip(words, range(len(words))))
ix2word_dict = {value: key for key, value in word2ix_dict.items()}
# 将数组中的字符映射为新字典对应的索引
dataset = np.array(list(map(lambda word: word2ix_dict.get(word), dataset.flatten())))
dataset = dataset.reshape((-1, cols))
print(word2ix_dict)
x_train = dataset
y_train = dataset.copy()
y_train[:, : -1] = x_train[:, 1:]

model = tf.keras.models.Sequential([
    tf.keras.layers.Embedding(len(words), 125),
    tf.keras.layers.LSTM(125, return_sequences=True),
    tf.keras.layers.LSTM(125, return_sequences=True),
    tf.keras.layers.TimeDistributed(tf.keras.layers.Dense(len(words), activation="softmax"))
])
model.compile(optimizer="adam",
              loss="sparse_categorical_crossentropy",
              metrics=["accuracy"])
model.fit(x_train, y_train, epochs=20)

data = [3, 6]
text = "山"
for i in range(256):
    prob = model.predict([data])[0, -1]
    t = np.cumsum(prob)
    p = np.sum(prob)
    index = int(np.searchsorted(t, np.random.rand(1) * p))
    data.append(index)
    text += ix2word_dict.get(index)
print(text)

测试结果

山起翔远连谷山,通陌出栽酒如。毛衣禽水暝吟地。发珠衲如拜事来。可复色整心携良,学蹑萋脱在穷时。北何方偷封师脸,故其肯未净训壑,诗且酷播官且玉。庆雀倍泉邵犹动,从生羽此轩发鸟。看皆有亦诗尘早,翼阴为远邑无马。幼览沐月与醺衣。如水士霰十功荷,柳更亭子佳骑书。久风山思市诏屐,雪矣不丘见中干。金稍青来当惜东,不谈出素讵上飔。。服未遂柳涯。跻鸡铭老还凌,当岸吾一怜不。有空银石胆歇,诗泉满注搜就陵。子日舒哀争数独,妓在食如圃山得。梦辰起子不樽詶卖。丞嫌十稍韶越驿,洛岂书江瘴禁驰,凌一对情便小欺。声上竹时称与瑞,两吾木

结果分析

在这里插入图片描述

在这里插入图片描述

模型一共训练二十轮,可以看出模型已经基本拥有能够自己断句的能力。但是,有些地方还有不足,存在标点符号过度使用的状况,可以适当增加训练次数或者增加数据集来使模型具有更强的判断错误的能力。还有,由于训练次数较少,模型的准确率并不是很高。

测试数据

https://download.csdn.net/download/weixin_49346755/85125142

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不负韶华ღ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值