master
/ .ipynb_checkpoints / intro-checkpoint.ipynb

intro-checkpoint.ipynb @81e1308

3dfba31
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "bulgarian-legislature",
   "metadata": {},
   "source": [
    "<h3 align=\"center\" color='blue' class='test'> 第一回合:春 </h3>\n",
    "\n",
    "<p align=\"center\"> 《春晓》孟浩然 </p>\n",
    "\n",
    "<div class='textWrap'>\n",
    "  <div>春眠不觉晓,处处闻啼鸟。 </div>\n",
    "  <div>夜来风雨声,花落知多少。 </div>\n",
    "</div>\n",
    "\n",
    "\n",
    "<p align=\"center\"> 《春眠啼鸟》Mo </p>\n",
    "<div class='textWrap'>\n",
    " <div><span class='poetry'>春</span>去两三杯,</div>\n",
    " <div><span class='poetry'>眠</span>宵远樵者。</div>\n",
    " <div><span class='poetry'>啼</span>风容发初,</div>\n",
    " <div><span class='poetry'>鸟</span>雀鸣山色。</div>\n",
    "</div>\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "<h3 align=\"center\" color='blue' class='test'> 第二回合:夏 </h3>  \n",
    "<p align=\"center\"> 《晓出净慈寺送林子方》杨万里  </p>\n",
    "\n",
    "<div class='textWrap'>\n",
    "  <div>毕竟西湖六月中,风光不与四时同。</div>\n",
    "  <div>接天莲叶无穷碧,映日荷花别样红。 </div>\n",
    "</div>\n",
    "\n",
    "\n",
    "\n",
    "<p align=\"center\"> 《映日荷花》Mo     </p>\n",
    "<div class='textWrap'>\n",
    " <div><span class='poetry'>映</span>真林下逢来会,</div>\n",
    " <div><span class='poetry'>日</span>日宁令物俗情。</div>\n",
    " <div><span class='poetry'>荷</span>馆浓香春欲尽,</div>\n",
    " <div><span class='poetry'>花</span>开花落月明新。</div>\n",
    "</div>\n",
    "\n",
    "\n",
    "\n",
    "<h3 align=\"center\" color='blue' class='test'> 第三回合:秋 </h3>  \n",
    "\n",
    "<p align=\"center\"> 《山居秋暝》王维 </p>\n",
    "<div class='textWrap'>\n",
    "  <div>空山新雨后,天气晚来秋。</div>\n",
    "  <div>明月松间照,清泉石上流。</div>\n",
    "  <div>竹喧归浣女,莲动下渔舟。</div>\n",
    "  <div>随意春芳歇,王孙自可留。</div>\n",
    "</div>\n",
    "\n",
    "\n",
    "\n",
    "<p align=\"center\" > 《空山新雨》Mo </p>\n",
    "<div class='textWrap'>\n",
    " <div><span class='poetry'>空</span>窗增达趣,</div>\n",
    " <div><span class='poetry'>山</span>静步萝丛。 </div>\n",
    " <div><span class='poetry'>新</span>幄寻池上,</div>\n",
    " <div><span class='poetry'>雨</span>声清夜钟。</div>\n",
    "</div>\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "<h3 align=\"center\" color='blue' class='test'> 第四回合:冬 </h3>  \n",
    "<p align=\"center\"> 《江雪》柳宗元  </p>\n",
    "<div class='textWrap'>\n",
    " <div>千山鸟飞绝,万径人踪灭。 </div>\n",
    " <div>孤舟蓑笠翁,独钓寒江雪。</div>\n",
    "</div>\n",
    "\n",
    "\n",
    "\n",
    "<p align=\"center\"> 《千山江雪》Mo </p>\n",
    "\n",
    "<div class='textWrap'>\n",
    "  <div><span class='poetry'>千</span>里青台头粉掌,</div>\n",
    "  <div><span class='poetry'>山</span>光青黛落如烟。</div>\n",
    "  <div><span class='poetry'>江</span>月最烧墙数望,</div>\n",
    "  <div><span class='poetry'>雪</span>中无事不相看。</div>\n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "buried-relation",
   "metadata": {},
   "source": [
    "怎么样,AI 没有让你失望吧?Mo 写出的诗句不仅和四季相关,还从“对手”的诗句中提取了关键词进行藏头,这波666的操作想不佩服都不难!下面让我们一起来了解 AI 写诗背后的奥秘——深度学习算法。\n",
    "\n",
    "<h3 align=\"center\" color='blue' class='test'> 深度学习 </h3> \n",
    "\n",
    "深度学习是一类机器学习方法,可实例化为深度学习器,所对应的设计、训练和使用方法集合称为深度学习。深度学习器由若干处理层组成,每层包含至少一个处理单元,每层输出为数据的一种表征,且表征层次随处理层次增加而提高。\n",
    "\n",
    "深度的定义是相对的。针对某具体场景和学习任务,若学习器的处理单元总数和层数分别为 M 和 N ,学习器所保留的信息量或任务性能超过任意层数小于 N 且单元总数为 M 的学习器,则该学习器为严格的或狭义的深度学习器,其对应的设计、训练和使用方法集合为严格的或狭义的深度学习。\n",
    "\n",
    "深度学习听起来高深,落地的应用却可以很浪漫。比如作诗、作曲、人脸美容美妆等都可以实现。下面我们以古诗词生成器为例,一步一步带你从数据处理到模型搭建,再到训练出古诗词生成模型。\n",
    "\n",
    "<h3 align=\"center\" color='blue' class='test'> LSTM 介绍 </h3> \n",
    "\n",
    "像诗词文本这样的数据,文字的前后文存在关联性被称为序列化数据,即前一数据和后一个数据有顺序关系。深度学习中有一个重要的分支是专门用来处理这样的数据的——循环神经网络。循环神经网络广泛应用在自然语言处理领域( NLP ),今天我们带你介绍循环神经网络一个重要的改进算法模型 - LSTM。这里不对 LSTM 的原理进行深入,想要深入理解 LSTM 的可以戳这里[《[译] 理解 LSTM 网络》](https://www.jianshu.com/p/9dc9f41f0b29)。\n",
    "\n",
    "\n",
    "<h3 align=\"center\" color='blue' class='test'> 数据处理 </h3>  \n",
    "\n",
    "我们使用76748首古诗词作为数据集数据集[下载链接](http://www.momodel.cn:8899/#/explore/5c00a6e21afd942b66b36ba8?type=dataset)原始的古诗词的存储形式如下:\n",
    "\n",
    "<img src='https://user-images.githubusercontent.com/43362551/51824023-221ea180-231c-11e9-8577-6595844d752f.png' width=80% height=80%>\n",
    "\n",
    "\n",
    "我们可以看到原始的古诗词是文本符号的形式无法直接进行机器学习所以我们第一步需要把文本信息转换为数据形式这种转换方式就叫词嵌入(word embedding)我们采用一种常用的词嵌套(word embedding)算法 - Word2vec 对古诗词进行编码关于 Word2Vec 这里不详细讲解有兴趣的可以参考[《[NLP] 秒懂词向量Word2vec的本质》](https://zhuanlan.zhihu.com/p/26306795)在词嵌套过程中为了避免最终的分类数过于庞大可以选择去掉出现频率较小的字比如可以去掉只出现过一次的字Word2vec 算法经过训练后会产生一个模型文件我们就可以利用这个模型文件对古诗词文本进行词嵌套编码。\n",
    "\n",
    "\n",
    "经过第一步的处理已经把古诗词词语转换为可以机器学习建模的数字形式因为我们采用 LSTM 算法进行古诗词生成所以还需要构建输入到输出的映射处理例如:“[长河落日圆]作为 train_data而相应的 train_label 就是长河落日圆]]”,也就是[”->“长”,“长”->“河”,“河”->“落”,“落”->“日”,“日”->“圆”,“圆”->“]”,“]”->“]”,这样子先后顺序一一对相这也是循环神经网络的一个重要的特征这里的[”和“]是开始符和结束符用于生成古诗的开始与结束标记。\n",
    "\n",
    "总结一下数据处理的步骤:\n",
    "- 读取原始的古诗词文本统计出所有不同的字使用 Word2Vec 算法进行对应编码;\n",
    "- 对于每首诗将每个字标点都转换为字典中对应的编号构成神经网络的输入数据 train_data;\n",
    "- 将输入数据左移动构成输出标签 train_label;\n",
    "\n",
    "经过数据处理后我们得到以下数据文件 \n",
    "- poems_edge_split.txt原始古诗词文件按行排列每行为一首诗词;\n",
    "- vectors_poem.bin利用 Word2Vec 训练好的词向量模型</s>开头按词频排列去除低频词;\n",
    "- poem_ids.txt按输入输出关系映射处理之后的语料库文件;\n",
    "- rhyme_words.txt 押韵词存储用于押韵诗的生成;\n",
    "\n",
    "<h3 align=\"center\" color='blue' class='test'> 模型构建及训练 </h3> \n",
    "\n",
    "这里我们使用2层的 LSTM 框架每层有128个隐藏层节点我们使用 tensorflow.nn 模块库来定义网络结构层其中 RNNcell  tensorflow 中实现 RNN 的基本单元是一个抽象类在实际应用中多用 RNNcell 的实现子类 BasicRNNCell 或者 BasicLSTMCell BasicGRUCell如果需要构建多层的 RNN TensorFlow 可以使用 tf.nn.rnn_cell.MultiRNNCell 函数对 RNNCell 进行堆叠模型网络的第一层要对输入数据进行 embedding可以理解为数据的维度变换经过两层 LSTM 接着 softMax 得到一个在全字典上的输出概率模型网络结构如下:\n",
    "\n",
    "<img src='https://user-images.githubusercontent.com/43362551/51891576-8142eb80-23da-11e9-84c4-66ffdf971818.png' width=80% height=80%>\n",
    "\n",
    "训练时可以定义 batch_size 的值是否进行 dropout为了结果的多样性训练时在 softmax 输出层每次可以选择 topK 概率的字符作为输出训练完成后可以使用 tensorboard 对网络结构和训练过程可视化展示这里推荐用咱们自家建模平台 Mo带有完整的 Python 和机器学习框架运行环境并且有免费的 GPU 可以使用大家可以自己试试哦。\n",
    "\n",
    "\n",
    "<h3 align=\"center\" color='blue' class='test'> 诗词生成 </h3> \n",
    "\n",
    "调用前面训练好的模型我们就可以实现一个古诗词的应用了刚刚 Mo 写的诗就是这样生成的:\n",
    "\n",
    "<img src='http://imgbed.momodel.cn/20190610105837.png' width=80% height=80%>\n",
    "<img src='http://imgbed.momodel.cn/20190610105941.png' width=80% height=80%>\n",
    "<img src='http://imgbed.momodel.cn/20190610110054.png' width=80% height=80%>\n",
    "<img src='http://imgbed.momodel.cn/20190610110404.png' width=80% height=80%>"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}