Tensorflow:基于LSTM生成藏头诗

Tensorflow:基于LSTM生成藏头诗

最近在学习TensorFlow,学习到了RNN这一块,相关的资料不是很多,了解到使用RNN可以生成藏头诗之后,我就决定拿这个下手啦!
本文不介绍RNN以及LSTM的相关基本知识,如要了解,请自行百度。
本文是在学习了 TensorFlow7: 基于RNN生成古诗词
这一篇博客之后继续在其基础上修改的代码,若要了解相关内容可以先去上面的博客去看一下。

【注:本博客所使用的数据、代码、模型文件均已放在百度云上:
链接: https://pan.baidu.com/s/1qY4mt1y 密码: 47y2】

模型生成

首先我们要训练好模型。这里采用的是2层的LSTM框架,每层有128个隐藏层节点,batch_size设为64。训练数据来源于全唐诗(可在上面百度云资源分享当中找到)。特别注意到的一点是这里每训练完一次就对训练数据做shuffle。
源代码如下:

#!/usr/bin/python3
#-*- coding: UTF-8 -*-
import collections  
import numpy as np  
import tensorflow as tf  

#-------------------------------数据预处理---------------------------#  

poetry_file ='poetry.txt'  

# 诗集  
poetrys = []  
with open(poetry_file, "r") as f:  
    for line in f:  
        try:  
            line = line.decode('UTF-8')
            line = line.strip(u'\n')
            title, content = line.strip(u' ').split(u':')  
            content = content.replace(u' ',u'')  
            if u'_' in content or u'(' in content or u'(' in content or u'《' in content or u'[' in content:  
                continue  
            if len(content) < 5 or len(content) > 79:  
                continue  
            content = u'[' + content + u']'  
            poetrys.append(content)  
        except Exception as e:   
            pass  

# 按诗的字数排序  
poetrys = sorted(poetrys,key=lambda line: len(line))  
print('唐诗总数: ', len(poetrys))  

# 统计每个字出现次数  
all_words = []  
for poetry in poetrys:  
    all_words += [word for word in poetry]  
counter = collections.Counter(all_words)  
count_pairs = sorted(counter.items(), key=lambda x: -x[1])  
words, _ = zip(*count_pairs)  

# 取前多少个常用字  
words = words[:len(words)] + (' ',)  
# 每个字映射为一个数字ID  
word_num_map = dict(zip(words, range(len(words))))  
# 把诗转换为向量形式,参考TensorFlow练习1  
to_num = lambda word: word_num_map.get(word, len(words))  
poetrys_vector = [ list(map(to_num, poetry)) for poetry in poetrys]  
#[[314, 3199, 367, 1556, 26, 179, 680, 0, 3199, 41, 506, 40, 151, 4, 98, 1],  
#[339, 3, 133, 31, 302, 653, 512, 0, 37, 148, 294, 25, 54, 833, 3, 1, 965, 1315, 377, 1700, 562, 21, 37, 0, 2, 1253, 21, 36, 264, 877, 809, 1]  
#....]  

# 每次取64首诗进行训练  
batch_size = 64
n_chunk = len(poetrys_vector) // batch_size  

class DataSet(object):
    def __init__(self,data_size):
        self._data_size = data_size
        self._epochs_completed = 0
        self._index_in_epoch = 0
        self._data_index = np.arange(data_size)

    def next_batch(self,batch_size):
        start = self._index_in_epoch
        if start + batch_size > self._data_size:
            np.random.shuffle(self._data_index)
            self._epochs_completed = self._epochs_completed + 1
           
具:Git和SVN等版本控制工具可用于管理代码版本和协作开发。 7. 设计工具:Sketch、Adobe XD和Figma等设计工具可用于设计应用的用户界面和用户体验。 8这个警告信息表示,TensorFlow 在使用 LSTM 层时没有使用 cuDNN 内核,而是使用通用的 GPU. 测试工具:Appium、XCTest和Espresso等测试工具可用于测试应用的功能和性能。 内核。这通常是由于 LSTM 层的超参数设置不满足 cuDNN 内核的要求,例如,以上是App开发的一些相关技术和工具,开发者可以根据自己的需求和技能了不支持 cuDNN 内核的激活函数或者循环偏置。 虽然这个警告不会影响模型的训练和推断,但是使用 cuDNN 内核通常可以提高模型的训练速度和性能。如果想要使用 cuDNN 内核,可以尝试以下方法: 1. 更改 LSTM 层的超参数:可以尝试使用 cuDNN 支持的激活函数和循环偏置,或者调整 LSTM 层的其他超参数,例如 dropout 等,以满足 cuDNN 内核的要求。 2. 更新 TensorFlow 版本:可以尝试更新 TensorFlow 版本,以获得更好的 cuDNN 支持。通常情况下,较新的 TensorFlow 版本会提供更好的 cuDNN 支持。 3. 禁用 GPU 加速:如果无法满足 cuDNN 内核的要求,可以尝试禁用 GPU 加速,以使用 CPU 内核运行 LSTM 层。可以在创建 TensorFlow session 时设置以下环境变量来禁用 GPU 加速: ``` import os os.environ['CUDA_VISIBLE_DEVICES'] = '-1' ``` 这将使用 CPU 内核运行 TensorFlow,而不使用 GPU 加速。 希望这些方法可以帮助你解决警告问题并使用 cuDNN 内核。如果你需要更多帮助,可以查阅 TensorFlow 和 cuDNN 的官方文档,或者向相关社区寻求帮助。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值