人工智能PK高鹗,续写《红楼梦》

1.前言

既然曹老爷子的后四十回丢了,那么对于每个热爱她的人来说,续写红楼都是一件让人热血沸腾的事儿。正好最近不是很忙,作为一个自然语言处理的小学生,我大胆尝试着使用人工智能来实现我的愿望。

2.环境准备

1.整体模型使用T1080 训练了10分钟左右,当然是一个比较简单的模型
2.框架使用tensorflow2.1版本

3.代码

使用方式,给定第一个字,自动生成固定长度的文本。

import tensorflow as tf
import numpy as np
import os
import time
text = open('honglou.txt','r',encoding='gb18030').read()
vocab = sorted(set(text))
char2idx = {u:i for i,u in enumerate(vocab)}
text_as_int = np.array([char2idx[t] for t in text])
char_dataset = tf.data.Dataset.from_tensor_slices(text_as_int)
seq_length = 100
sequences = char_dataset.batch(seq_length+1,drop_remainder=True)

def split_input_target(chunk):
input_text = chunk[:-1]
target_text = chunk[1:]
return input_text,target_text
dataset = sequences.map(split_input_target)
BATCH_SIZE = 64
dataset = dataset.shuffle(1000).batch(BATCH_SIZE,drop_remainder=True)

#词集的长度
vocab_size = len(vocab)
#嵌入的维度
embedding_dim = 256
#RNN 的单元数量
rnn_units = 1024
def build_model(vocab_size, embedding_dim, rnn_units, batch_size):
model = tf.keras.Sequential([
tf.keras.layers.Embedding(vocab_size, embedding_dim,
batch_input_shape=[batch_size, None]),
tf.keras.layers.GRU(rnn_units,
return_sequences=True,
stateful=True,
recurrent_initializer=‘glorot_uniform’),
tf.keras.layers.Dense(vocab_size)
])
return model
model = build_model(vocab_size = len(vocab),embedding_dim=embedding_dim,rnn_units=rnn_units,batch_size=BATCH_SIZE)

for input_example_batch, target_example_batch in dataset.take(1):
example_batch_predictions = model(input_example_batch)
def loss(labels, logits):
return tf.keras.losses.sparse_categorical_crossentropy(labels, logits, from_logits=True)
example_batch_loss = loss(target_example_batch, example_batch_predictions)
model.compile(optimizer=‘adam’, loss=loss)

#检查点保存至的目录
checkpoint_dir = ‘./training_checkpoints’
#检查点的文件名
checkpoint_prefix = os.path.join(checkpoint_dir, “ckpt_{epoch}”)
checkpoint_callback=tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_prefix,save_weights_only=True)

EPOCHS = 150
model.fit(dataset,epochs=EPOCHS,callbacks=[checkpoint_callback])

#使用模型
tf.train.latest_checkpoint(checkpoint_dir)
model = build_model(vocab_size,embedding_dim,rnn_units,1)
model.load_weights(tf.train.latest_checkpoint(checkpoint_dir))
model.build(tf.TensorShape([1, None]))

def generate_text(model, start_string):

评估步骤(用学习过的模型生成文本)

要生成的字符个数

num_generate = 1000

将起始字符串转换为数字(向量化)

input_eval = [char2idx[s] for s in start_string]
input_eval = tf.expand_dims(input_eval, 0)

空字符串用于存储结果

text_generated = []

低温度会生成更可预测的文本

较高温度会生成更令人惊讶的文本

可以通过试验以找到最好的设定

temperature = 1.0

这里批大小为 1

model.reset_states()
idx2char = np.array(vocab)
for i in range(num_generate):
predictions = model(input_eval)
# 删除批次的维度
predictions = tf.squeeze(predictions, 0)

  # 用分类分布预测模型返回的字符
  predictions = predictions / temperature
  predicted_id = tf.random.categorical(predictions, num_samples=1)[-1,0].numpy()

  # 把预测字符和前面的隐藏状态一起传递给模型作为下一个输入
  input_eval = tf.expand_dims([predicted_id], 0)
 
  text_generated.append(idx2char[predicted_id])

return (start_string + ‘’.join(text_generated))
print(generate_text(model, start_string=u"话说金桂听了"))

4.我的一天

我去使用饮水机打水,刚开始的时候水杯发出的声音很大,一度会担心吵到别人。随着杯子中水量的增加,声音越来越小,直到最后听不见,我就将水关掉了。这就是人们常说的满瓶不响半瓶响吧!是说一个人没有什么水平的时候,总是表现的特别高调,等到这个人成熟了,见过大的世面,就懂得谦逊和低调。可是我不禁的去想,为什么我们总是在空瓶的时候,希望它的声音小一点。对于不成熟的人,高调不是一件很正常的事情吗?既然大自然不嫌弃会响的空瓶,我们有什么资格嫌弃那些不成熟的人呢?这种嫌弃的心才是真的应该被嫌弃的吧!算了,不想了,继续努力工作吧!在我工作的累的时候,我就听会儿个放松一下。这时候突然想起了一个农民,大热的天他在田地里辛苦的劳动,这时候也累了找个树荫处休息休息,吹吹风。再看看我的四周,我还真是羡慕那个农民。突然间觉得土地无比的亲切,我想家了,想回到自己出生的地方去,听听田里蟋蟀的声音。

愣着干什么?进来选老婆!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值