《动手学深度学习》 RNN & GRU & LSTM with gluon

RNN

循环神经网络,时间步t的隐藏变量的计算由当前时间步的输入和上一个时间步的隐藏状态共同决定。

GRU

门控循环单元,引入了重置门和更新门的概念。
重置门输出R与上一时间步的隐藏状态按元素乘法,产生候选隐藏状态,决定是否drop上一时间步的隐藏状态。
更新们对上一步的隐藏状态以及候选隐藏状态做加权平均,产生当前时间步的隐藏状态。

LSTM

长短期记忆,引入输入门,遗忘门,输出门。
记住有6个公式。
三个门的输出I,F,O均由当前时间步的输入以及上一时间步的隐藏状态通过加权偏置并sigmoid后得到。
候选记忆细胞由当前时间步的输入以及上一时间步的隐藏状态通过加权偏置并tanh后得到。
记忆细胞由F与上一时间步的记忆细胞按元素相乘加上I与候选记忆细胞按元素相乘,F趋近于1而I趋近于0代表时间序列上有较长的依赖关系。
当前时间步的隐藏状态由O与tanh(记忆细胞)按元素相乘得到,可以控制当前是直接使用记忆细胞里的信息还是留在之后再使用。

代码

import d2lzh as d2l
import math
from mxnet import autograd, gluon, init, nd
from mxnet.gluon import loss as gloss, nn, rnn

(corpus_indices, char_to_idx, idx_to_char,
 vocab_size) = d2l.load_data_jay_lyrics()

num_inputs, num_hiddens, num_outputs = vocab_size, 256, vocab_size
ctx = d2l.try_gpu()

num_epochs, num_steps, batch_size, lr, clipping_theta = 500, 35, 32, 1e2, 1e-2
pred_period, pred_len, prefixes = 50, 50, ['分开', '不分开']

rnn_layer = rnn.RNN(num_hiddens)
gru_layer = rnn.GRU(num_hiddens)
lstm_layer = rnn.LSTM(num_hiddens)
layer = [rnn_layer, gru_layer, lstm_layer]
for layer in layer:
	model = d2l.RNNModel(layer, vocab_size)
	d2l.train_and_predict_rnn_gluon(model, num_hiddens, vocab_size, ctx,
                                corpus_indices, idx_to_char, char_to_idx,
                                num_epochs, num_steps, lr, clipping_theta,
                                batch_size, pred_period, pred_len, prefixes)

结果

结果就放一个gru呗
epoch 50, perplexity 112.992608, time 0.07 sec

  • 分开 我想你的让我疯 你不能你的可爱女人 爱我的让我疯狂的可爱女人 坏坏的让我疯狂的可爱女人 坏坏的让
  • 不分开 你不能你的爱爱人 说有你的让我疯的可爱女 爱我的让我疯狂的可爱女人 坏坏的让我疯狂的可爱女人
    epoch 100, perplexity 12.726447, time 0.07 sec
  • 分开 我想要这样 我不要再想 我不能再想 我不能再想你 爱你的手不听 我爱你 你我的肩婆 一壶悲剧 你在
  • 不分开 我不能再想 我不能再想 我不能再想你 爱你的手不听 我爱你 你我的肩婆 一壶悲剧 你在那空 一直走
    epoch 150, perplexity 1.847564, time 0.07 sec
  • 分开 我想带这样牵着你的手不放开 爱能不能以简简单单没有伤害 你 靠着我的肩膀 你 在我胸口睡著 像这样
  • 不分开 没有你烦我有多烦恼多难熬 拜托 我想是你的脑袋有问题 随便说说 其实我早已经猜透看透不想多说 只
    epoch 200, perplexity 1.072998, time 0.07 sec
  • 分开 飞弄堂 是属于那年代白墙黑瓦的淡淡的忧伤 消失的 旧时光 一九四三 回头看 的片段 有一些风霜 老
  • 不分开 你已经离开我 不知不觉 我跟了这节奏 后知后觉 后知后觉 迷迷蒙蒙 你给的梦 出现裂缝 隐隐作痛
    epoch 250, perplexity 1.032255, time 0.07 sec
  • 分开 我弄轻的叹息 后悔着对不起 藤蔓植物 爬满了伯爵的坟墓 古堡里一片荒芜 长满杂草的泥土 不会骑扫把
  • 不分开 你已经离开我 不知不觉 我跟了这节奏 后知后觉 又过了一个秋 后知后觉 我该好好生活 我该好好生活
    epoch 300, perplexity 1.028258, time 0.07 sec
  • 分开 飞弄堂 是属于那年代白墙黑瓦的淡淡的忧伤 消失的 旧时光 一九四三 回头看 的片段 有一些风霜 老
  • 不分开 你已经离开我 不知不觉 我跟了这节奏 后知后觉 又过了一个秋 后知后觉 我该好好生活 我该好好生活
    epoch 350, perplexity 1.022875, time 0.07 sec
  • 分开 飞弄堂 是属于那年代白墙黑瓦的淡淡的忧伤 消失的 旧时光 一九四三 回头看 的片段 有一些风霜 老
  • 不分开 你已经离开我 不知不觉 我跟了这节奏 后知后觉 又过了一个秋 后知后觉 我该好好生活 我该好好生活
    epoch 400, perplexity 1.021813, time 0.07 sec
  • 分开 我弄好的叹息 后悔着对不起 藤蔓植物 爬满了伯爵的坟墓 古堡里一片荒芜 长满杂草的泥土 不会骑扫把
  • 不分开 你已经离开我 不知不觉 我跟了这节奏 后知后觉 又过了一个秋 后知后觉 我该好好生活 我该好好生活
    epoch 450, perplexity 1.023025, time 0.07 sec
  • 分开 我弄轻的叹息 后悔着对不起 藤蔓植物 爬满了伯爵的坟墓 古堡里一片荒芜 长满杂草的泥土 不会骑扫把
  • 不分开 你已经离开我 不知不觉 我跟了这节奏 后知后觉 又过了一个秋 后知后觉 我该好好生活 我该好好生活
    epoch 500, perplexity 1.021318, time 0.07 sec
  • 分开 我弄轻的叹息 后悔着对不起 藤蔓植物 爬满了伯爵的坟墓 古堡里一片荒芜 长满杂草的泥土 不会骑扫把
  • 不分开 你已经离开我 不知不觉 我跟了这节奏 后知后觉 又过了一个秋 后知后觉 我该好好生活 我该好好生活

你可能感兴趣的:(d2lzh)