精华内容
下载资源
问答
  • python为你写诗
    2020-11-26 02:29:09

    实验背景

    周末,早晨下了点小雨,淅淅沥沥,来到阳台坐了一会,看着雨有点发呆,真惬意,真想雨一直这么下着。

    下午雨就停了,太阳紧跟其后,普照万物。好吧,回到现实吧。

    回到正题,人工智能(AI)技术在各应用领域可以说是遍地开发,应用至上。最近看到用神经网络来写诗,今天和大家一起撸一撸,动手实验下。

    实验器材

    ●python

    ● LSTM

    ● tensorflow

    ● 唐诗

    实验内容

    数据获取

    深度学习技术能发挥其作用,最重要的是数据。没有数据再好的算法也没用。本实验要生成诗歌,训练样本为唐诗文本。总共4.3万首。

    首春

    寒随穷律变,春逐鸟声开。

    初风飘带柳,晚雪间花梅。

    碧林青旧竹,绿沼翠新苔。

    芝田初雁去,绮树巧莺来。

    简单原理说明

    自动生成文本可以理解成一个文字接着一个文字,不断连接的一个序列。针对序列数据,循环神经网络RNN是一个有效的建模方法。本实验采用LSTM(长短记忆网络)。

    传统的RNN模型主要用连接先前的信息到当前的任务上,如下:

    LSTM很好的解决了RNN的长期信息依赖的学习问题。通过forget gate丢弃本单元不需要的信息, 同时根据update gate 结合当前序列输入更新加入信息。然后将更新后的信息和当前信息相结合为输出信息。主要通过sigmoid和tanh来操作。

    详细信息可以访问:http://colah.github.io/posts/2015-08-Understanding-LSTMs/

    生成诗歌

    1.数据处理

    数据中为一行为一首诗,即为一个样本。

    统计每个字出现次数,对字进行编码(按照词频大小)

    关于输入x序列和输出y序列:y为x向前移动一个字。如

    生成batch的数据迭代器,64首诗为一个batch

    2.构建lstm网络

    本实验采用单向的LSTM进行训练。

    构建输入

    这里输入有点特殊,就是增加一个embedding层对输入字符id进行词向量表示:word2vec,来代替ont_hot。

    embedding通常可以采用预训练的参数,或者放在网络过程进行自己训练,本是采用第二种,自己训练。

    构建LSTM

    本实验采用tensorflow实现的LSTM模块。

    一个LSTM模块:

    one_cell = tf.contrib.rnn.BasicLSTMCell(self.rnn_size)//128个神经元

    通常一个LSTM需要包含多层的LSTM cell,即同一个输入x和输出(c和h)之间包含多个LSTM模块,前一个cell的输出为后一个cell的输入。如下:

    multi_cell = tf.contrib.rnn.MultiRNNCell( [one_cell] * self.num_layers, state_is_tuple=True)

    整个网络结构:

    self.initial_state = multi_cell.zero_state(self.batch_size, tf.float32)

    outputs, self.last_state = tf.nn.dynamic_rnn(multi_cell, self.inputs, initial_state=self.initial_state)

    构建softmax层和损失函数和优化器,采用Adam

    训练过程

    本实验训练20000个epoch,损失基本上就收敛了。

    3.生成诗歌

    利用已经训练好的模型,因为是输入是序列。 指定第一字为输入,利用模型输出第二个字,接着将第二个字为输入,利用模型输出第三个字,依此类推,指导输出终止符为止。 一首诗就完成了。

    这里模型的输出为softmax的概率,使用argmax取最大的概率就是预测的字符ID,再转换成字符。

    我们来欣赏下本实验生成的古代诗歌吧。

    芳柳花香翅,花泉暗里船

    宫残风落雾,红粉剧参差

    翠蜡鸡声动,馨香烧巢袪

    帷花侵乳落,唱警蜃芳来

    晓净阴窗峻,秦宫槿藓平

    应羡棋真栖,无将复难那

    秋雨西西路,岧荧在玉清

    哀堪进界缨,紫皓安须争

    举病难倾礼,习来未在禅

    楂舟雪上清,款检在虾瞳

    明日八十贵,传来已学禅

    清鸿问秦水,楚国高陀枝

    送昔晡心惑,全高何一秋

    心闲忙操命,雨复度花传

    暗尽霜光罩,新闲与马分

    仙城衰日远,窗栝初有风

    唯更临水上,提得亦延鼎

    无时西浦上,七尺与行踪

    实验结语

    本实验『WedO实验君』和大家用循环神经网络来实现一个自动生成诗歌的小应用,参考CharRNN。 内在的原理是利用网络来学习训练诗歌中字符出现的概率模型。

    更多相关内容
  • Python光速为你写诗

    2020-11-26 02:29:19
    宋无涯出同唐暗水才阳楼粒甫关尽头心雨上人‘公众号:我将在南极找寻后台回复“写诗”即可获取源码和用到的文本文件。今天咱们的主题是教写诗,不过不是我们写,而是教计算机写,想写几首写几首,先来看一下效果...

    宋无涯出同

    唐暗水才阳

    楼粒甫关尽

    头心雨上人‘

    公众号:我将在南极找寻你

    后台回复“写诗”即可获取源码和用到的文本文件。

    今天咱们的主题是教写诗,不过不是我们写,而是教计算机写,想写几首写几首,先来看一下效果

    本次利用python来实现自动写诗,需要安装“jieba”库,直接‘pip install jieba’就可以啦

    第一步. 下载训练文本

    这一步大家都会,从网上下载古诗素材即可,我下载了一个文本文件,将其命名为“poem.txt”,其内容如图所示

    第二步. 读取文本数据poem=open("/home/fantasy/Downloads/poems.txt",'r+')

    fr0=poem.read()

    在Python终端键入“fr0”,效果如图则表示已经读入

    第三步. 文本处理

    由于文本中包含书名号和问号和换行符等不需要的字符,所以需要将它们删掉(替换为空)

    首先去掉书名号和问号:

    fr1=re.sub('《.*?》','',fr0)

    fr2=re.sub('.*?(/?).*?','',fr1)

    然后进行分词:

    words=jieba.cut(fr2)

    c=','.join(words)

    cc=c.split(',')

    接下来去掉其它我们不需要的特殊字符串:

    word=[]

    for i in cc:

    if i=='?':

    del i

    elif i=='。':

    del i

    elif i==' ':

    del i

    elif i==',':

    del i

    elif i=='\n':

    del i

    elif i=='\u3000':

    del i

    else:

    word.append(i)

    到现在为止,文本文件变成了如下图所示的样子

    第四步. 拆词成字

    将所有的词拆开,提取出所有的汉字存入w列表中:

    w=[]

    for i in range(len(word)):

    for j in word[i]:

    w.append(j)

    第五步. 开始写诗啦

    定义一个写诗的函数,命名为“writepoem”:

    def writepoem():

    poe=[]

    for lensen in range(4):

    x=random.sample(w,5)

    one=''.join(x)

    poe.append(one)

    poe=','.join(poe)

    return poe

    第六步. 调用写诗函数进行创作

    def itemsnum():

    N=input('想写几首呢,告诉我吧:')

    for i in range(1,int(N)+1):

    print('~~~~~~~第',i,'首~~~~~~~~')

    print(writepoem())

    print('~~~~~最后一首了呢~~~~~~')

    以上便完成了机器写诗的全部步骤,现在我们来运行一下

    运行程序,在IDLE调用itemsnum函数写3首诗:

    是不是很有意思呢,嘿嘿。

    不过目前的程序还比较笨,不会押韵,下次可以考虑把相同韵脚的字放在一起,把意象相同的词放在一起,从而使诗句更有韵味。

    最后附上完整代码,大家也可以在公众号后台回复“写诗”获取源码和文本文件

    """

    运行本脚本,在你的IDE终端输入“itemsnum()”

    来调用写诗函数进行创作

    """

    print(__doc__)

    #导入用到的库

    import re #正则匹配

    import jieba #分词

    import random #随机选取

    #读取文本文件

    poem=open("/home/fantasy/Downloads/poems.txt",'r+') #这是我的文件路径,你在使用时需要改动此项为你的路径fr0=poem.read().strip()#去掉书名号和?fr1=re.sub('《.*?》','',fr0)

    fr2=re.sub('.*?(/?).*?','',fr1)

    #分词

    words=jieba.cut(fr2)

    c=','.join(words)

    cc=c.split(',')

    #去深度删除特殊字符串,代码写的有些鸡肋,大佬莫喷哈

    word=[]for i in cc:

    if i=='?':

    del i

    elif i=='。':

    del i

    elif i==' ':

    del i

    elif i==',':

    del i

    elif i=='\n':

    del i

    elif i=='\u3000':

    del i

    else:

    word.append(i)

    #拆词为字

    w=[]

    for i in range(len(word)):

    for j in word[i]:

    w.append(j)

    #开始写诗

    def writepoem():

    poe=[]

    for lensen in range(4):

    x=random.sample(w,5)

    one=''.join(x)

    poe.append(one)

    poe=','.join(poe)

    return poe

    #调用写诗函数

    def itemsnum():

    N=input('想写几首呢,告诉我吧:')

    for i in range(1,int(N)+1):

    print('~~~~~~~~~~~~~~~~~第',i,'首~~~~~~~~~~~~~~~~~~')

    print(writepoem())

    print('~~~~~~~~~~~~~~~~~最后一首了呢~~~~~~~~~~~~~~~~~~')

    展开全文
  • 初中人工智能第三节Python体验代码之“为你写诗”智能诗歌创作,压缩包含有源代码、诗歌记事本、测试运行说明笔记等,可以上传到https://python.jupyter.vip/在线运行,当然本地安装好环境和各种库也可以运行! ...
  • 为你写诗(LSTM 诗歌生成器)

    万次阅读 2018-11-07 21:31:36
    为你写诗,为你静止 ,为你做不可能的事。 为你写诗,你这不是为难我们直男直女的程序员们嘛。 虽然我写不出诗,但不代表我不能训练一个网络为你写诗,想要多少写多少! 所以今天的主题就是如何训练一个能自动写...

    为你写诗,为你静止 ,为你做不可能的事。

    为你写诗,你这不是为难我们直男直女的程序员们嘛。

    虽然我写不出诗,但不代表我不能训练一个网络为你写诗,想要多少写多少!

    所以今天的主题就是如何训练一个能自动写诗的LSTM模型。

    废话不多说,代码如下:

    爱情是一种怪事
    我开始全身不受控制
    爱情是一种本事
    我开始连自己都不是
    为你我做了太多的傻事
    第一件就是为你写诗
    为你写诗为你静止
    为你做不可能的事
    为你我学会弹琴写词
    为你失去理智
    为你写诗为你静止
    为你做不可能的事
    为你弹奏所有情歌的句子
    我忘了说最美的是你的名字

    呃呃呃好像不小心贴错代码了,重来:

    
    # coding: utf-8
    
    # In[1]:
    
    
    import re
    import random
    import pandas as pd
    import numpy as np
    from keras.preprocessing import sequence
    from keras.optimizers import SGD, RMSprop, Adagrad
    from keras.utils import np_utils
    from keras.models import Sequential
    from keras.layers.core import Dense, Dropout, Activation
    from keras.layers.embeddings import Embedding
    from keras.layers.recurrent import LSTM, GRU
    
    
    # In[2]:
    
    
    # 读取数据, 生成汉字列表
    
    with open('poetry.txt','r', encoding='UTF-8') as f:
        raw_text = f.read()
    lines = raw_text.split("\n")[:-1]
    poem_text = [i.split(':')[1] for i in lines]
    char_list = [re.findall('[\x80-\xff]{3}|[\w\W]', s) for s in poem_text]
    
    
    # In[3]:
    
    
    # 汉字 <-> 数字 映射
    
    all_words = []
    for i in char_list:
        all_words.extend(i)
    word_dataframe = pd.DataFrame(pd.Series(all_words).value_counts())
    word_dataframe['id'] = list(range(1,len(word_dataframe)+1))
    
    word_index_dict = word_dataframe['id'].to_dict()
    index_dict = {}
    for k in word_index_dict:
        index_dict.update({word_index_dict[k]:k})
        
    len(all_words), len(word_dataframe), len(index_dict)
    
    
    # In[4]:
    
    
    # 生成训练数据, x 为 前两个汉字, y 为 接下来的汉字 
    # 如: 明月几时有 会被整理成下面三条数据
    # 明月 -> 几  月几 -> 时  几时 -> 有
    
    seq_len = 2
    dataX = []
    dataY = []
    for i in range(0, len(all_words) - seq_len, 1):
        seq_in = all_words[i : i + seq_len]
        seq_out = all_words[i + seq_len]
        dataX.append([word_index_dict[x] for x in seq_in])
        dataY.append(word_index_dict[seq_out])
    
    len(dataY)
    
    
    # In[5]:
    
    
    X = np.array(dataX)
    y = np_utils.to_categorical(np.array(dataY))
    X.shape, y.shape
    
    
    # In[6]:
    
    
    model = Sequential()
    
    # Embedding 层将正整数(下标)转换为具有固定大小的向量,如[[4],[20]]->[[0.25,0.1],[0.6,-0.2]]
    # Embedding 层只能作为模型的第一层
    # input_dim:大或等于0的整数,字典长度
    # output_dim:大于0的整数,代表全连接嵌入的维度
    model.add(Embedding(len(word_dataframe), 512))
    
    # LSTM
    model.add(LSTM(512))
    
    # Dropout 防止过拟合
    model.add(Dropout(0.5))
    
    # output 为 y 的维度
    model.add(Dense(y.shape[1]))
    
    model.add(Activation('softmax'))
    model.compile(loss='categorical_crossentropy', optimizer='adam')
    
    model.summary()
    
    
    # In[7]:
    
    
    # 训练
    
    model.fit(X, y, batch_size=64, epochs=40)
    
    
    # In[8]:
    
    
    def get_predict_array(seed_text):
        chars = re.findall('[\x80-\xff]{3}|[\w\W]', seed_text)
        x = np.array([word_index_dict[k] for k in chars])
        proba = model.predict(x, verbose=0)
        return proba
    
    get_predict_array("明月")
    
    # 可以看到预测出来的结果是两个列表, 下一个字是第二个列表
    
    
    # In[9]:
    
    
    def gen_poetry(model, seed_text, rows=4, cols=5):
        '''
        生成诗词的函数
        输入: 两个汉字, 行数, 每行的字数 (默认为五言绝句)
        '''
        total_cols = cols + 1  # 加上标点符号
        chars = re.findall('[\x80-\xff]{3}|[\w\W]', seed_text)
        if len(chars) != seq_len: # seq_len = 2
            return ""
        arr = [word_index_dict[k] for k in chars]
        for i in range(seq_len, rows * total_cols):
            if (i+1) % total_cols == 0:  # 逗号或句号
                if (i+1) / total_cols == 2 or (i+1) / total_cols == 4:  # 句号的情况
                    arr.append(2)  # 句号在字典中的映射为 2
                else:
                    arr.append(1)  # 逗号在字典中的映射为 1
            else:
                proba = model.predict(np.array(arr[-seq_len:]), verbose=0)
                predicted = np.argsort(proba[1])[-5:]
                index = random.randint(0,len(predicted)-1)  # 在前五个可能结果里随机取, 避免每次都是同样的结果
                new_char = predicted[index]
                while new_char == 1 or new_char == 2:  # 如果是逗号或句号, 应该重新换一个
                    index = random.randint(0,len(predicted)-1)
                    new_char = predicted[index]
                arr.append(new_char)
        poem = [index_dict[i] for i in arr]
        return "".join(poem)
    
    
    # In[10]:
    
    
    print(gen_poetry(model, '明月'))
    print(gen_poetry(model, '悠然', rows=4, cols=7))
    print(gen_poetry(model, '长河', rows=4, cols=7))
    
    
    # In[11]:
    
    
    model.save(filepath='lstm_poetry.hdf5')
    
    
    # In[12]:
    
    
    # 试下 GRU
    
    gru = Sequential()
    gru.add(Embedding(len(word_dataframe), 512))
    gru.add(GRU(512))
    # gru.add(Dropout(0.5))
    gru.add(Dense(y.shape[1]))
    gru.add(Activation('softmax'))
    gru.compile(loss='categorical_crossentropy', optimizer='adam')
    
    
    # In[13]:
    
    
    gru.summary()
    
    
    # In[14]:
    
    
    gru.fit(X, y, batch_size=64, epochs=40)
    
    
    # In[15]:
    
    
    print(gen_poetry(gru, '明月'))
    print(gen_poetry(gru, '悠然', rows=4, cols=7))
    print(gen_poetry(gru, '长河', rows=4, cols=7))
    
    
    # In[16]:
    
    
    gru.save('gru_poetry.hdf5')
    
    

    其中poetry.txt文件里是一些训练用到的诗句数据,代码文件和poetry.txt文件可以从我的github上下载:https://github.com/qq604395564/LSTM-Poetry

    祝大家都能找到可以为她(他)写诗的人!

    展开全文
  • 运行方法:解压后打开写诗神器->exe->写诗神器.exe 在笔者本人电脑上运行通过。 注:在本人的电脑上,因为程序会播放语音并写入文件,会将其识别成病毒,需要自行关闭或调整。 ----------------------------------...
  • Python打造一个AI作家为你写诗(附源码)

    万次阅读 多人点赞 2018-03-26 00:00:00
    从短篇故事到长达5万词的小说,机器正以不可思议的方式“把玩”文字。网上已经涌现很多例子,越来越多人让机器创作文字作品。其实,由于自然语言处理(NLP)领域的重大进步,如今...那我们自己能创建这样一个会故事

    从短篇故事到长达5万词的小说,机器正以不可思议的方式“把玩”文字。网上已经涌现很多例子,越来越多人让机器创作文字作品。


    其实,由于自然语言处理(NLP)领域的重大进步,如今计算机的确能够理解上下文并自行编写故事。比如去年我们曾分享过美国一位程序员小哥,由于《冰与火之歌》迟迟不出第六部,于是自己忍不住让AI创作了第六部,结果虽然有些无厘头,但读起来也满满的“冰火”范儿。

    那我们自己能创建这样一个会写故事的 AI 吗?

    本文,我们将使用 Python 和文本生成的概念来构建一个机器学习模型,最后它可以用莎士比亚的风格写出十四行诗。


    我们开始吧!


    本文内容概览


    1. 什么是文本生成器?

    2. 文本生成的不同步骤

    • 导入环境依赖项

    • 加载数据

    • 创建字符/字映射

    • 数据预处理

    • 搭建模型

    • 生成文本

    3. 试验不同的模型

    • 更训练有素的模型

    • 更深层的模型

    • 更宽泛的模型

    • 一个巨大的模型


    什么是文本生成器?

    如今,有大量的数据可以归类为序列数据,常见形式为音频、视频、文本、时间序列、传感器数据等。这种类型数据有种特殊情况,如果在特定时间帧内发生两个事件,则在事件 B 之前发生事件 A 与在事件 B 之后发生事件 A 完全是两种不同的情况。


    但是,在传统的机器学习问题中,一个特定的数据点是否先于另一个数据点被记录下来并不重要。这种考虑让我们有不同的方式解决序列预测问题。


    文本,即一个接一个排列的一串串字符,其实是很难破解的。这是因为在处理文本时,用先前存在的序列训练的模型或许能做出非常准确的预测,但一旦出现一处错误的预测,就有可能使整个句子变得毫无意义。然而,如果出现数值序列预测问题,即使预测完全失败,仍然有可能被视为有效的预测(可能具有高偏差)。但是,这一点人们往往注意不到。

    这就是文本生成器的一大棘手问题!


    文本生成通常包含以下步骤:

    1.导入环境依赖项

    2.加载数据

    3.创建字符/字映射

    4.数据预处理

    5.创建模型

    6.生成文本

    我们来仔细看看每一个步骤。


    导入环境依赖项

    这一步没什么说的,我们需要导入我们研究所需的所有资料库。

    import numpy as npimport pandas as pdfrom keras.models import Sequentialfrom keras.layers import Densefrom keras.layers import Dropoutfrom keras.layers import LSTMfrom keras.utils import np_utils


    加载数据

    text=(open("/Users/pranjal/Desktop/text_generator/sonnets.txt").read())text=text.lower()


    这一步中,我们加载下载的所有莎士比亚十四行诗的合集

    http://www.gutenberg.org/ebooks/1041?msg=welcome_stranger

    我清洗了文件,删除了开始和结尾部分,你可以从我的 git 库上下载。文件格式为 text。然后将这些内容转换为小写字母,以尽可能减少单词数量(稍后会详细介绍)。


    创建字符/字词映射

    映射是我们为文本中的字符/单词分配任意数字的一个步骤。通过这种方式,会将每个字符/单词映射到一个数字上。这很重要,因为机器理解数字比理解文本要容易的多,并且这也会让训练过程更容易。

    characters = sorted(list(set(text)))n_to_char = {n:char for n, char in enumerate(characters)}char_to_n = {char:n for n, char in enumerate(characters)}


    我创建了一个字典,其中包含分配给文本中每个唯一字符的数字。所有唯一字符首先存为字符类型,然后变为枚举类型。


    这里还必须指出,我使用了字符级映射,而不是单词映射。但是,相比于基于字符的模型,基于单词的模型显示出更高的准确性。这是因为后一种模式需要一个更大的网络来学习长期相关关系,因为它不仅要记住单词的顺序,还必须学会去预测一个单词在语法上的正确性。但是,基于单词的模型已经可以满足后者(即:预测一个单词在语法上的正确性)。


    但由于这是一个小数据集(有17,670个单词),并且唯一单词的数量(4,605个数字)构成了大约四分之一的数据,所以在这样的映射上进行训练并不是一个明智的决定。这是因为如果我们假设所有唯一单词在数量上都是相同的(这不是真的),那么我们会在整个训练数据集中大约出现四次单词,这不足以构建文本生成器。


    数据预处理

    这是搭建 LSTM 模型时最棘手的部分。将手头的数据转换为可相互转换的格式是一项艰巨的任务。


    我把这个过程分解成更细小的部分,让你更容易理解。

    X = []Y = []length = len(text)seq_length = 100 for i in range(0, length-seq_length, 1):    sequence = text[i:i + seq_length]    label =text[i + seq_length]    X.append([char_to_n[char] for char in sequence])    Y.append(char_to_n[label])


    这里,X 是我们的训练数组,Y 是我们的目标数组。

    seq_length 是我们在预测特定字符之前要考虑的字符序列的长度。

    该 for 循环被用于迭代文本的整个长度,并创建此类序列(存储在X)和它们的真值(存储在Y)。现在,很难在这里看到真实值的概念。让我们以一个例子来理解这一点:


    对于长度为4的序列和文本“ hello india ”,我们可以使用我们的X和Y(不易编码为易理解的数字),如下所示:



    现在,LSTMs 以(number_of_sequences,length_of_sequence,number_of_features)形式接受输入,该输入不是数组的当前格式。另外,我们需要将数组 Y 转换为 one-hot 编码格式。

    X_modified = np.reshape(X, (len(X), seq_length, 1))X_modified = X_modified / float(len(characters))Y_modified = np_utils.to_categorical(Y)


    我们首先将数组 X 重塑成我们所需的维度(用来定义变量)。然后,我们调整 X_modified 的值,这样我们的神经网络可以训练得更快,而且陷入局部最小值的机会也更小。此外,我们的 Y_modified 是一种 one-hot 编码,用于删除可能在映射字符的过程中引入的任何序数关系。也就是说,与'z'相比,'a'可能被分配给较小的数字, 但这并不表明两者之间的任何关系。


    我们的最终数组将如下所示:


    搭建模型


    model = Sequential()model.add(LSTM(400, input_shape=(X_modified.shape[1], X_modified.shape[2]), return_sequences=True))model.add(Dropout(0.2))model.add(LSTM(400))model.add(Dropout(0.2))model.add(Dense(Y_modified.shape[1], activation='softmax'))model.compile(loss='categorical_crossentropy', optimizer='adam')


    我们需要搭建一个具有两个 LSTM 层的序列模型,每层有 400 个单元。第一层需要输入形状。为了让下一个 LSTM 层能够处理相同的序列,我们输入 return_sequences 参数为 True。


    此外,还添加了 dropout 率为 20% 的 dropout 层以检查其是否过拟合。最后一层输出一个提供了字符输出的独热编码矢量。


    生成文本

    string_mapped = X[99]# generating charactersfor i in range(seq_length):   x = np.reshape(string_mapped,(1,len(string_mapped), 1))   x = x / float(len(characters))   pred_index = np.argmax(model.predict(x, verbose=0))   seq = [n_to_char[value] for value in string_mapped]   string_mapped.append(pred_index)string_mapped = string_mapped[1:len(string_mapped)]


    我们从 X 数组中的随机行开始,它是一个由 100 个字符组成的数组。在此之后,我们的目标是预测 X 之后的另外 100 个字符。将输入进行重塑,按先前的方式缩放,这样就能预测出具有最大概率的下一个字符。


    Seq 用来存储迄今预测到的字符串的解码格式。接下来,会更新新的字符串,这样会移除第一个字符,并且被预测的新字符也包括在内。


    你可以到我的 git 库上查看完整代码。我也提供了训练文件,笔记和训练后的模型权重以供参考。(见文末)


    试验不同的模型

    以批次大小100训练1个周期后,基线模型输出结果如下:


    's the riper should by time decease,his tender heir might bear his memory:but thou, contracted toet she the the the the the the the thethi the the the the the the the the the the the the the the the the thethi the the the the the the the the the the the the the the the the thethi the the the the the the the the the the the the the the the the thethi the the the the the the the the the the the the the the the the thethi the the the the the the the the th'


    这个...


    这个输出很明显没有多大意义。这只不过是重复同样的预测,就好像它陷入循环一样。这是因为和我们已经训练过的微型模型相比,语言预测模型太复杂了。

    我们试试再训练这个模型,但训练时间再加长一点。


    更训练有素的模型

    这次我们以批次大小 50 将模型训练了 100 个周期,我们至少获得了一个不重复的字符序列,其中包含了很多合理的字词。此外,模型还学会了生成类似于十四行诗的词语结构。


    'The riper should by time decease,
    his tender heir might bear his memory:
    but thou, contracted to thine own besire,
    that in the breath ther doomownd wron to ray,
    dorh part nit backn oy steresc douh dxcel;
    for that i have beauty lekeng norirness,
    for all the foowing of a former sight,
    which in the remame douh a foure to his,
    that in the very bumees of toue mart detenese;
    how ap i am nnw love, he past doth fiamee.
    to diserace but in the orsths of are orider,
    waie agliemt would have me '


    但是,这种模式还不足以制作出高质量的内容。所以接下来我们会和其他人一样,当深度学习模式没有产生好的结果时,搭建更深层次的模型架构。


    更深层的模型

    鲁迅曾经说过:如果模型不好,增加层数!

    我的模型也要这样。我们再添加一个有 400 个单元的 LSTM 层,然后添加一个20% dropout率的 dropout 层,并查看我们得到的结果。


    "The riper should by time decease,
    his tender heir might bear his memory:
    but thou, contracted to the world's false sporoe,
    with eyes so dond touls be thy domfornds,
    which for memorion of the seasons new;
    mike own self-love to shou art constant
    how can i then be oy love doth give,
    the rose looks fair, but fairer bomments age.
    now with the seas that i have seen dychl
    that mot to teed of you, if h ho bontent,
    and all the ress of the heartai thee;
    the world will was iis bound and farty "


    结果很有趣。语法正确率大大增强,保持了十四行诗结构和标点符号的完整。但是,模型仍然需要很多改进。我们接着尝试探索更宽泛的、拥有更多单元的网络。


    更宽泛的模型

    我在两个 LSTM 层的每一层上又增加了700个单元。这样调整以后,模型写出了以下诗歌:


    "The riper should by time decease,
    his tender heir might bear his memory:
    but thou, contracted to thine own bright eyes,
    feed'st thy sigh aare so beuider poise,
    oor maty dis surre that gairs mot me love thee;
    when i braye the would and lays in the eesire.
    than thmu disgrmed stand with my bootr still nsentente;
    tell ia to thou art thou wilt woon'thy sook,
    and touain then tor, give thy soue semping.
    whose whod the better of your befaiss nu sante,
    though i, suoll oas, and i lose bouh twa"


    起初这有点令人失望,因为这些词语已经失去了意义。但是,有趣的是,我们可以看到正渐渐出现十四行诗的韵律。也就是说模型正试图理解诗歌!但是,我们不能用无意义的词写诗,对吧?我们接着把所有信息放入一个巨大的模型中。


    一个巨大的模型

    我把模型的层数增加到了三层,每层有 700 个单元,然后将模型训练了 100 个周期。最终模型生成了一首气势恢宏的诗歌,瞧一瞧:


    "The riper should by time decease,
    his tender heir might bear his memory:
    but thou, contracted to thine own bright eyes,
    feed'st thy light's flame with self-substantial fuel,
    my beept is she breat oe bath dasehr ill:
    tirse do i pine and turfeit day by day,
    or gluttoning on all, or all away.
    Lxxvi
    why is my verse so barren of new pride,
    so far from variation or quick change?
    why with the time do i not glance aside
    to new-found methods, and to compounds strange?
    why write i stil"



    其中一些诗句不仅读起来非常睿智,而且还学会了押韵。如果将输入模型的数据正确清洗的话,我们会得到一个更合乎情理的诗歌。但毕竟刚开始嘛,模型的性能已经很让人惊喜了。我们创造的这位 AI 诗人比我们很多人都有诗意!


    结尾笔记

    文本生成器是否有效,关键是它生成相关故事的能力。在输出层面上,许多模型正慢慢实现,能够生成真实的、与人类编写的文本区难以区分的语言文本。


    总之,从创建原创作品到重新生成遗失的内容,文本生成器可以得到很好的应用。这种文本生成器的一个革命性应用可能是我们可以训练它们编写和操作代码。想象一页,假如计算机程序和算法可以根据需要自行修改,这会是个怎样的世界。


    附本项目代码库:https://github.com/pranjal52/text_generators

    ∞∞∞


    IT派 - {技术青年圈}
    持续关注互联网、区块链、人工智能领域


    公众号回复“Python”

    邀你加入{ IT派Python技术群 } 

    展开全文
  • 数据科学家训练好模型以后往往需要找软件工程师把模型变成系统或者服务,通常把这个过程称之 model serving。函数计算无需运维和弹性伸缩的特性,正好符合数据科学家对高可用分布式系统的诉求。本文将介绍把一个 ...
  • Python实现的“为你写诗”,可用于体验学习! 体验流程 1、将诗句保存到同一个目录下的“poem.txt”文件,注意编码是UTF-8 2、运行以下程序:先是读入诗句,生成“poem.vex”,然后你就可以输入关键词得到相关诗句了...
  • 然后只需要执行上图中的三个步骤就可以快速地将“为你写诗”应用部署到函数计算平台。 函数计算在 AI 场景的优势 最后一部分,我们会通过不同维度与传统架构对比的方式来总结一下函数计算在 AI 场景的优势。 首先...
  • 将诗歌分句,形成字典:键(key)该句首字的拼音,值(value)该拼音对应的诗句,并将字典保存pickle文件; 读取pickle文件,编写程序,以exe文件形式运行该程序。 该项目实现的诗歌接龙,规则下一句的首字...
  • 一、亮出效果 世界上美好的事物很多,当我们想要表达时,总是感觉文化底蕴不够...这篇教程就是让人工智能学习大量的诗句,找到作的规律,然后给他几个关键字,他给一首。 看效果: 输入的关键词 输出的诗句
  • 本文 雷锋字幕组 编译的技术博客,原标题To a Poem is a Bott the Stranger,作者 Carly Stambaugh。翻译 | 于泽平 马雪洁 整理 | 凡江 编辑 | ...我想问,我能用代码写诗吗?我可不可以做一个可以写出原创诗歌...
  • 影视作品是艺术创作,创意最难。现在的综艺节目老被说抄袭,现在的电视剧老是翻拍,现在的电影套个经典歌名...·高晓松创作的大热民谣《同桌的》被拍成了电影,他任编剧。1994年的歌曲,电影2014年上映。九亿少女...
  • 原标题:牛逼了,用Python写个会做的机器人上一次的聊天机器人,大家关注度非常的高,阅读量破万了(不到20行代码,用Python做一个智能聊天机器人),通过简单的代码就能实现一个简单的聊天机器人,今天小编就带领...
  • ps:还不明白读取的函数,一直空集。只了复制的函数,直接读取了内容。 try: f = open("gushi.txt","w") f.write("床前明月光,疑是地上霜。举头望明月,低头思故乡。") print("写入成功!") try: f = ...
  • Python文件的读写操作

    2021-03-15 23:33:51
    Python的文件读取和相关方法介绍 python采用函数open来进行打开和读写 open的返回值: open()函数返回一个文件( file )对象·文件对象可迭代 ...name : 一个包含了要访问的文件名称的字符串值。 mode :
  • 原标题:如何利用深度学习诗歌(使用Python进行文本生成)报 名翻译:李雪冬编辑:李雪冬前 言从短篇小说到5万字的小说,机器不断涌现出前所未有的词汇。在web上有大量的例子可供开发人员使用机器学习来编写文本,...
  • 输入数字转换宋词的小程序 ###实在太懒,不想手动一个个输数字——所以我了一个小代码自动帮我把这些信息键入字典(U1S1我觉得这个挺方便的,以后更新字典词库也方便,比如) ###核心逻辑是: ###1)把字符串中...
  • 原标题:RPA交流——使用 python 一样的代码 (一)下载RPA请访问:www.i-search.com.cn学习RPA请访问:https://support.i-search.com.cn前言从我用 Python 编写第一行代码以来,就被它的简单性、出色的可读性和...
  • python教程:利用python基础知识取出对应诗句》由【张国维博客】于2020年05月09日整理发布!当今科技蓬勃发展的今天,我们学习一门编程语言是很有必要的。随着人工智能行业的兴起,python语言成为当今最热门的一门...
  • 作为一名运维工程师,也一直有一个学习开发的想法,值此之际,不知道博客的下一期目标在哪里,在这思考和犹豫的间隙想着学习和充实一下自己,学习一下python语言,python随着大数据和人工智能的兴起而日益火爆。...
  • Python 古诗写入、复制

    2021-11-26 17:27:04
    1,应用文件操作的相关知识,通过Python新建一个文件gushi.txt,选择一首古诗写入文件中 2,另一个函数,读取指定文件gushi.txt,将内容复制到copy.txt中,并在控制台输出“复制完毕”。 3,提示:分别定义两个...
  • Python爬虫之诗歌接龙

    2020-12-10 14:50:53
    介绍本文将展示如何利用Python爬虫来实现诗歌接龙。该项目的思路如下:利用爬虫爬取诗歌,制作诗歌语料库;将诗歌分句,形成字典:键(key)该句首字的拼音,值(value)该拼音对应的诗句,并将字典保存pickle文件...
  • 了解RPA: ...学习RPA ...下载RPA: ...前言 从我用 Python 编写第一行代码以来,就被它的简单性、出色的可读性和特别流行的一...可能有些还不知道,但对未来的 Python 项目很有用。 1、交换两个变量 a = 4 b = 5 a,b = b,a
  • Python 爬虫 之 爬取古代的诗歌,并保存本地(这里以爬取李白的所有诗歌例)(以备作为AI写诗的训练数据) 一、简单介绍 Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计...
  • Python读写Word文档入门

    千次阅读 2021-11-06 00:22:31
    最近有同事需要批量出500个Word文档,按照1个Word文档耗时1分钟来算也需要8.33小时足足有1天工时。于是,这位同事找到了才哥帮忙,才哥接过需求花了不到30分钟好脚本,运行脚本不...
  • python生成古诗藏头诗(简单思路学习)
  • 时隔多年终于实现了这个牛逼的作机器人。...牛逼大神一一为你解答!Screen Shot 2017-03-09 at 3.37.11 PM.png它已经不仅仅能够作古诗,还能模仿周杰伦创作歌词!!这是2017-03-9更新的功能,模...
  • 安装安装poetry的正式方法是通过:curl -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py | python这种方式允许poetry及其依赖项与依赖项分离。但是,在我看来,这不是一件好事,原因...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,261
精华内容 2,504
关键字:

python为你写诗