1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 人工智能PK高鹗 续写《红楼梦》

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

时间:2020-04-27 10:54:11

相关推荐

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

1.前言

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

2.环境准备

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

2.框架使用tensorflow2.1版本

3.代码

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

import tensorflow as tfimport numpy as npimport osimport timetext = 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 = 100sequences = 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)

pile(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 / temperaturepredicted_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.我的一天

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

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。