在前系列笔记中已有了关于爱丽丝梦游仙境的例子,一直想进行中文方面的尝试,看看到底在无人干预的情况下,深度学习能够学习到很么程度,本文下载了射雕英雄传前5章,也尝试了一下简单神经网络SimpleRNN和LTSM长短期记忆网络,在完全无干预的情况下,可以做到文本自动输出,也有标点符号,部分内容也比较可观,但距离实用还有很大差距,后续得继续考虑引入分词、词的权重,剔除虚词等来提升文本可读性

代码示例

  1. # -*- coding: utf-8

  2. from __future__ import print_function

  3. from keras.callbacks import LambdaCallback

  4. from keras.models import Sequential

  5. from keras.layers import Dense, Activation,Dropout

  6. from keras.layers.recurrent import SimpleRNN

  7. from keras.layers import LSTM

  8. from keras.optimizers import RMSprop

  9. from keras.utils.data_utils import get_file

  10. import numpy as np

  11. import random

  12. import sys

  13. import io

  14. #从网上获取射雕英雄传文本前几章

  15. INPUT_FILE = "1.txt"

  16. text=open(INPUT_FILE,encoding="utf8").read()

  17. print(text)

  18. print('corpus length:', len(text))

  19. #27401

  20. chars = sorted(list(set(text)))

  21. print('chars=',chars)

  22. #['\n', '.', '‘', '’', '“', '”', '…', '、', '。', '《', '》', '一', '丁',]

  23. print('total chars:', len(chars))

  24. #1898

  25. char_indices = dict((c, i) for i, c in enumerate(chars))

  26. print('char_indices=',char_indices)

  27. #char_indices= {'\n': 0, '.': 1, '‘': 2, '’': 3, '“': 4, '”': 5, '…': 6, '、': 7, '。': 8, '《': 9, '》': 10,}

  28. indices_char = dict((i, c) for i, c in enumerate(chars))

  29. print('indices_char=',indices_char)

  30. #Indices_char= {0: '\n', 1: '.', 2: '‘', 3: '’', 4: '“', 5: '”', 6: '…', 7: '、', 8: '。', 9: '《', 10: '》'}

  31. # cut the text in semi-redundant sequences of maxlen characters

  32. # 文本切分

  33. maxlen = 40

  34. step = 3

  35. sentences = []

  36. next_chars = []

  37. for i in range(0, len(text) - maxlen, step):

  38. sentences.append(text[i: i + maxlen])

  39. next_chars.append(text[i + maxlen])

  40. print('sentences=',sentences)

  41. #四十个字一个句子,进行分割

  42. print('next_chars=',next_chars)

  43. #next_chars= ['十', '柏', '叶', '火', '红', '是', '天']

  44. print('nb sequences:', len(sentences))

  45. #nb sequences: 9121

  46. print('Vectorization...')

  47. x = np.zeros((len(sentences), maxlen, len(chars)), dtype=np.bool)

  48. y = np.zeros((len(sentences), len(chars)), dtype=np.bool)

  49. print('x=',x)

  50. print('y=',y)

  51. for i, sentence in enumerate(sentences):

  52. for t, char in enumerate(sentence):

  53. x[i, t, char_indices[char]] = 1

  54. y[i, char_indices[next_chars[i]]] = 1

  55. print('x=',x)

  56. print('y=',y)

  57. # --------------------基于LSTM模型----------------------

  58. print('Build model...')

  59. model = Sequential()

  60. model.add(LSTM(400, input_shape=(maxlen, len(chars)),return_sequences=True))

  61. model.add(Dropout(0.2))

  62. model.add(LSTM(400))

  63. model.add(Dropout(0.2))

  64. model.add(Dense(len(chars)))

  65. model.add(Activation('softmax'))

  66. optimizer = RMSprop(lr=0.01)

  67. model.compile(loss='categorical_crossentropy', optimizer=optimizer)

  68. # --------------------基于LSTM模型----------------------

  69. # --------------------基于SimpleRNN模型----------------------

  70. model = Sequential()

  71. #将RNN输出维度大小定义为128

  72. #选择值太小,模型不具有生成较好文本的有效容量,会看到重复字符或重复词组的长时运行

  73. #选择值太大,模型参数过多,需要很多数据才能有效训练

  74. model.add(SimpleRNN(128, return_sequences=False,

  75. input_shape=(maxlen, len(chars)),

  76. unroll=True))

  77. #创建一个全连接dense层,dense层有nb_chars个单元,为字典中每个字符发出评分

  78. model.add(Dense(len(chars)))

  79. #全连接层激活函数是softmax,把分数标准化为概率,概率最高的字符即成为预测字符。

  80. model.add(Activation("softmax"))

  81. #用分类输出中出色的分类交叉熵函数作为损失函数

  82. model.compile(loss="categorical_crossentropy", optimizer="rmsprop")

  83. # --------------------基于SimpleRNN模型----------------------

  84. def sample(preds, temperature=1.0):

  85. # helper function to sample an index from a probability array

  86. # 帮助从概率数组中采样索引的辅助函数

  87. preds = np.asarray(preds).astype('float64')

  88. preds = np.log(preds) / temperature

  89. exp_preds = np.exp(preds)

  90. preds = exp_preds / np.sum(exp_preds)

  91. probas = np.random.multinomial(1, preds, 1)

  92. return np.argmax(probas)

  93. def on_epoch_end(epoch, logs):

  94. # Function invoked at end of each epoch. Prints generated text.

  95. # 在每个周期的末尾调用函数。打印生成的文本。

  96. print()

  97. print('----- Generating text after Epoch: %d' % epoch)

  98. start_index = random.randint(0, len(text) - maxlen - 1)

  99. #for diversity in [0.2, 0.5, 1.0, 1.2]:

  100. for diversity in [ 1.0, 1.2]:

  101. print('----- diversity:', diversity)

  102. generated = ''

  103. sentence = text[start_index: start_index + maxlen]

  104. generated += sentence

  105. print('----- Generating with seed: "' + sentence + '"')

  106. sys.stdout.write(generated)

  107. for i in range(400):

  108. x_pred = np.zeros((1, maxlen, len(chars)))

  109. for t, char in enumerate(sentence):

  110. x_pred[0, t, char_indices[char]] = 1.

  111. preds = model.predict(x_pred, verbose=0)[0]

  112. next_index = sample(preds, diversity)

  113. next_char = indices_char[next_index]

  114. generated += next_char

  115. sentence = sentence[1:] + next_char

  116. sys.stdout.write(next_char)

  117. sys.stdout.flush()

  118. print()

  119. print_callback = LambdaCallback(on_epoch_end=on_epoch_end)

  120. model.fit(x, y,

  121. batch_size=128,

  122. epochs=60,

  123. callbacks=[print_callback])


关于深度学习SimpleRNN的文本输出

  1. #SimpleRNN学习到43轮的输出
  2. 包惜弱道:“到哪里去呀鸡只是昏得兵听不了。”说着大半从心中一来,那时剑提到了大为的直事事重胆。”他说出声,着几个个命,有天上都白,刮得他连早出就,就好心中今家不及,那么?”
  3. 杨铁心问道:“这里是刀的,是一个他进一光下,金兵的能三脚令这里里但入了大污转三年,是个是费显是天好,却是不是在绿手腕…”郭啸天道:“好,先叫甚么个年去有了。
  4. 郭啸天与买了旺那个人大怒。把
  5. 杨铁心过去皇帝个夫人近的当下,算是他:“我大哥!”中铁心的出斗如家上一抓,好下那,不好,却是不是他脚如飞,这两兵名没放放,烘这里的边然传,敌,要是他身两个杨家枪法,这道是西了死吗?”
  6. 杨铁心相招你到好,却是无北一下,便把先时下慢,却好叹几人心,一个个女他痛骂去。
  7. 颜烈从并地回家,提不炽过?”说道人及笑:“这月小人无奈之后,只见他三个夫人都是,连是先江,心下虽然了个道:“正是!””颜烈了看尖运出来。官兵众大惊。杨铁心包惜弱待起身子,随一人,命觉


关于深度学习LTSM的文本输出

  1. #LTSM学习到50轮的输出

  2. 伸手猛抓敌腕,左子拿向敌人肘部,这一手是“分筋错骨手”中的“壮士断腕”,只要敌好他”出他大突声他毒些:位靖成头己他江我那弟他我着他哪言了江他这:声便年这仇他之身头他下道现马,那这弟突声已哪向,动他这马,那是:头我他江见马,到道江他他声不哪柯突声对老好不是好道立他道洪之身,别声身突那他夫我不向都他首他道哪给,夫:头我拳,声他:他是

  3. 仇来哥,夫们镇是我他成柯道他生,身驹,,你围他那江,这跃江江道他是那向之知他年夫向他个个身手人声是柯江郭三:不身这:她木中命四这那夫突突突哪札那发他韩围我知大到一向哪来这那:江此见好柯必江郭好向他未身要来这们这他么他弟本之身不是人:头见史他道有之他古大四:弟柯好处这他他年己马““他己。不我弟哪对郭一弟仇子…处虽突地似我这时开突在突知:了声昆头入江时江道杀哪马突是是之江哪他见声这身他法史弟马马右韩头江,神高道对气郭在江

  4. 身来发你甚靖上“已:。”身是知明现弟江本金脚南一江不一,,这声这有人,哪弟铁身阵足,之身心知,忙:见我,那哪江经之但那起铁:

关于深度学习系列笔记三(射雕英雄传)_深度学习