5分钟了解Ai 之 RNN循环神经网络 (tensorflow100行代码实现文章生成)

循环神经网络RNN

循环
input层
hidden层
output层

传统神经网络是从输入层到隐含层再到输出层的全连接,网络的传播是顺序的,且同层的节点之间无连接。这种网络几乎没有时序相关推理的能力,在文章生成、语音识别领域显得无能为力。
而RNN是一种循环神经网络,它可以保存上一节点输出的信息并向同层节点共享数据,通过对之前信息的记忆增加预测推理的参考。
RNN算法包含普通循环神经网络,双向循环神经网络等,本文仅实现普通RNN网络生成短句。

代码

开发环境:python3.9
库:tensorflow2,numpy,cv2

# index > value  index2char = {0:"a",1:"b",2:"c"}
index2char = dict((i, c) for i, c in enumerate(chars))  # 同上

SEQLEN = 10  # 输入序列的长度
STEP = 1  # 输入序列在整个时间序列数据上的跨度,滑动的步长
# 举个例子:假设整个序列是abcdefghijklmnopqrstuvw。

# 字符和标签
input_chars = []
label_chars = []
# 按seqlen的长度,逐步将所有字符分割成  len(文档中所有字符长度) - squlen(输入序列长度)个块并存入input_chars数组    label_chars存储最后一个字符
# 每隔一个字符,就保存一次。比如 abcdefg abc,bcd,cde,def,efg 这样保存。
for i in range(0, len(text) - SEQLEN, STEP):  # i=0;i <(训练字符总长度 - 输入序列长度);i+=STEP
    input_chars.append(text[i:i + SEQLEN])  # 获取text 从i开始到i+seqlen为止(不包含i + seqlen),中间的这些字符,存入input集合中
    label_chars.append(text[i + SEQLEN])  # label就是text【i+seqlen】最后一个字符

# 通过one-hot编码来向量化input和label,
X = np.zeros((len(input_chars), SEQLEN, chars_count), dtype=np.bool)  # 全部的标签长度,输入长度10,所有词汇长度,布尔  即是说这是由01组成的矩阵
Y = np.zeros((len(input_chars), chars_count), dtype=np.bool)  # 全部标签长度,所有词汇长度,布尔
for i, input_char in enumerate(input_chars):
    for j, c in enumerate(input_char):
        X[i, j, char2index[c]] = 1
    Y[i, char2index[label_chars[i]]] = 1

# 给训练好的模型一个随机的时间序列输入,得到一个字符的输出
# 然后去掉输入的第一个字符,加上那个输出的一个字符,当作新的序列输入

# 构建网络
model = tf.keras.models.Sequential([
    # simpleRNN   输入为:inputshape(SEQLEN = 10,charcount =1) (输入序列的长度、字符总数)
    tf.keras.layers.SimpleRNN(128, return_sequences=False, input_shape=(SEQLEN, chars_count), unroll=True),
    tf.keras.layers.Dense(chars_count, activation='softmax')
])
# 定义损失函数和优化器
model.compile(loss="categorical_crossentropy", optimizer="rmsprop")

# 获取模型 重复训练
if os.path.isfile(os.path.join('/', 't1.h5')):
    model = tf.keras.models.load_model('t1.h5')

#  按指定次数训练模型   (此处训练25次)
for iteration in range(25):
    # 打印当前训练进程
    print('Iteration : %d' % iteration)
    # 每十轮保存一次模型
    if iteration % 10 == 0:
        model.save('t1.h5')
        print("mdoel saved")
    # 训练
    model.fit(X, Y, batch_size=128, epochs=1)
    # 测试
    test_idx = np.random.randint(len(input_chars))  # 测试index
    test_chars = input_chars[test_idx]  # 测试字符
    print('test seed is : %s' % test_chars)
    print(test_chars, end='')  # ''换行, ' '空格, '1'字符1
    # 按指定次数生成新字符
    for i in range(300):
        # 测试序列向量化
        vec_test = np.zeros((1, SEQLEN, chars_count))
        for i, ch in enumerate(test_chars):
            vec_test[0, i, char2index[ch]] = 1
        # 预测
        pred = model.predict(vec_test, verbose=0)[0]
        pred_char = index2char[np.argmax(pred)]
        print(pred_char, end='')
        # 不断的加入新生成字符组成新的序列
        test_chars = test_chars[1:] + pred_char
    print('\n')
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
【资源说明】 基于TensorFlow2.0+循环神经网络的古诗生成器python源码+项目说明+超详细注释.zip - 使用唐诗数据集训练模型。 - 使用训练好的模型,随机生成一首古体诗。 - 使用训练好的模型,续写一首古体诗。 - 使用训练好的模型,随机生成一首藏头诗。 随机生成一首古体诗: ``` 金鹤有僧心,临天寄旧身。 石松惊枕树,红鸟发禅新。 不到风前远,何人怨夕时。 明期多尔处,闲此不依迟。 ``` ``` 水泉临鸟声,北去暮空。 林阁多开雪,楼庭起洞城。 夜来疏竹外,柳鸟暗苔清。 寂寂重阳里,悠悠一钓矶。 ``` 续写一首古体诗(以"床前明月光,"为例): ``` 床前明月光,翠席覆银丝。 岁气分龙阁,无人入鸟稀。 圣明无泛物,云庙逐雕旗。 永夜重江望,南风正送君。 ``` ``` 床前明月光,清水入寒云。 远景千山雨,萧花入翠微。 影云虚雪润,花影落云斜。 独去江飞夜,谁能作一花。 ``` 随机生成一首藏头诗(以"海阔天空"为例): ``` 海口多无定, 阔庭何所难。 天山秋色上, 空石昼尘连。 ``` ``` 海庭愁不定, 阔处到南关。 天阙青秋上, 空城雁渐催。 ``` # 快速开始 ## 1. 如何训练模型? - csdn下载项目到本地解压命名为tf2-rnn-poetry-generator。 - 安装依赖环境。 - 在`settings.py`中配置好相关路径。 - 在`tf2-rnn-poetry-generator`路径下,执命令`python3 train.py`。 ## 2. 如何使用训练好的模型生成古诗? - clone项目到本地。 - 安装依赖环境。 - 在`settings.py`中配置好相关路径。 - 在`tf2-rnn-poetry-generator`路径下,执命令`python3 eval.py`。 【备注】 1、该资源内项目代码都经过测试运成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还,也可在此代码基础上进修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

千年奇葩

从来没受过打赏,这玩意好吃吗?

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

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

打赏作者

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

抵扣说明:

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

余额充值