平安夜,给女同学写了份不得了的代码

Posted K同学啊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了平安夜,给女同学写了份不得了的代码相关的知识,希望对你有一定的参考价值。

本文已加入 🚀 Python AI 计划,从一个Python小白到一个AI大神,你所需要的所有知识都在 这里 了。

🚀 我的环境:

  • 语言环境:Python3.6.5
  • 编译器:jupyter notebook
  • 深度学习环境:TensorFlow2.4.1
  • 数据和代码:📌【传送门】

🚀 来自专栏:《深度学习100例》

如果你是一名深度学习小白可以先看看我这个专门为你写的专栏:《小白入门深度学习》


一、导入数据

from tensorflow       import keras
from tensorflow.keras import datasets, layers, models
import os,PIL
import numpy             as np
import pandas            as pd

#隐藏警告
import warnings
warnings.filterwarnings('ignore')

import tensorflow as tf
gpus = tf.config.list_physical_devices("GPU")

if gpus:
    gpu0 = gpus[0] #如果有多个GPU,仅使用第0个GPU
    tf.config.experimental.set_memory_growth(gpu0, True) #设置GPU显存用量按需使用
    tf.config.set_visible_devices([gpu0],"GPU")
    
print(gpus)
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]

1. 导入文件

text        = open("30640.txt", 'rb').read().decode(encoding='utf-8')
vocab       = sorted(set(text))
print(vocab[100:120])
['乐', '乖', '乘', '乙', '九', '乞', '也', '习', '乡', '书', '买', '乱', '乳', '乾', '了', '予', '争', '事', '二', '于']

2. 文本数字化

# 数字化
char2idx    = u: i for i, u in enumerate(vocab)
idx2char    = np.array(vocab)
text_as_int = np.array([char2idx[c] for c in text])
len(text_as_int)
3253148
BATCH_SIZE     = 128  # 批大小

# 设定每个输入句子长度的最大值
seq_length = 500
examples_per_epoch = len(text) // seq_length
char_dataset       = tf.data.Dataset.from_tensor_slices(text_as_int)
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)
dataset = dataset.batch(BATCH_SIZE, drop_remainder=True) #.shuffle(1000)

二、构建GRU模型

embedding_dim  = 256 # 嵌入的维度

def build_model(embedding_dim, batch_size):
    model = tf.keras.Sequential([
        tf.keras.layers.Embedding(len(vocab), embedding_dim, batch_input_shape=[batch_size, None]),
        tf.keras.layers.GRU(1024, return_sequences=True, stateful=True, recurrent_initializer='glorot_uniform'),
        tf.keras.layers.Dense(len(vocab))
    ])
    return model

model = build_model(embedding_dim=embedding_dim, batch_size=BATCH_SIZE)
model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
embedding (Embedding)        (128, None, 256)          980480    
_________________________________________________________________
gru (GRU)                    (128, None, 1024)         3938304   
_________________________________________________________________
dense (Dense)                (128, None, 3830)         3925750   
=================================================================
Total params: 8,844,534
Trainable params: 8,844,534
Non-trainable params: 0
_________________________________________________________________

三、编译

def loss(labels, logits):
    return tf.keras.losses.sparse_categorical_crossentropy(labels, logits,from_logits=True)

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  = 200  #训练次数
history = model.fit(dataset, epochs=EPOCHS, callbacks=[checkpoint_callback])
Epoch 1/200
50/50 [==============================] - 15s 237ms/step - loss: 6.1918
Epoch 2/200
50/50 [==============================] - 12s 235ms/step - loss: 5.2278
......
50/50 [==============================] - 12s 233ms/step - loss: 1.0495
Epoch 196/200
50/50 [==============================] - 12s 244ms/step - loss: 1.0472
Epoch 197/200
50/50 [==============================] - 12s 233ms/step - loss: 1.0511
Epoch 198/200
50/50 [==============================] - 12s 233ms/step - loss: 1.0502
Epoch 199/200
50/50 [==============================] - 12s 233ms/step - loss: 1.0498
Epoch 200/200
50/50 [==============================] - 12s 233ms/step - loss: 1.0477

五、重新加载模型

tf.train.latest_checkpoint(checkpoint_dir)

model = build_model(embedding_dim, batch_size=1)

model.load_weights(tf.train.latest_checkpoint(checkpoint_dir))
model.build(tf.TensorShape([1, None]))
# 查看模型
model.summary()
Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
embedding_1 (Embedding)      (1, None, 256)            980480    
_________________________________________________________________
gru_1 (GRU)                  (1, None, 1024)           3938304   
_________________________________________________________________
dense_1 (Dense)              (1, None, 3830)           3925750   
=================================================================
Total params: 8,844,534
Trainable params: 8,844,534
Non-trainable params: 0
_________________________________________________________________

六、生成文本

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->小:生成更可预测的文本
    temperature->大:生成更令人惊讶的文本
    """
    temperature = 0.5
    # 这里批大小为 1
    model.reset_states()
    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))

# 生成文本
result = str(generate_text(model, start_string="唐三"))
print(result)
唐三猜测过……”

    唐三微微一笑,道:“爸,您是什么人?”

    唐三赶忙道:“前辈,您说的没错。如果不能亲和前辈分,我只问您一句,你说的是,叔叔会无视你,还是为了脱离这个原因。”

    “是。”

    唐三心中一动,“你回去吧。后面的将来,我还要谢谢你。”

    唐三正拍卖场专门解『药』。此时再走,集中自己睡于虚无旁,要不是他手里能够相当的,就算是自己的父亲,也未必就留他们一起去活泼生。那么曾经给自己留学院的小白告诉过他们。他们都想看看,这些本就是他们大恩特殊的魂兽,这次就是她自己的母亲。她也同意不清自保是外欺自己的。怎么说她也是一万天才可以的。如果说一个月的话,他对我们有什么好处呢?只是,她告诉我,这个地方,我留着小舞,年龄、生生、工钱,才能有四成把握。同等级的工夫我还保守超过我,这岂不是去请取得我么?”

    唐三微微一笑,道:“那就走吧,我们去那里吧。这里也就是我们四个人中消融的东西。我们走吧。”

    说到这里,小舞忍不住道:“妈妈,你不该说她是神?但是,我现还不到十二岁,我们还都处于身边的人,还有额外的痛快他吧?”

    唐三微微一笑,道:“是。等你们休息休息休息。他们看到了,你们还都不休息休息。”

    “哦?”这次轮到唐三悲愤的声音,很明显,这个声音是他的话,但也同时不敢反应过来,眼底气怒这似乎并不算太多,但眼前这个人实不能平静,唐三想继续向瀑布问问,而是他手中抓住的。

    “不离开小舞,你这是怎么了?怎么了?”唐三吓了一跳。赶忙跑过去,可他地身体却是那样的虚弱,小舞身上鼓起的相貌,一双有什么似的,向她吐了吐血吐去。

    “小三醒过来了,我们现都还活着。”小舞的脸『色』看上去都有些怪异,但很重哭,他甚至丢下都有些怪听,声音中,她仿佛想要将自己幸运才到了唐三面前,“你一个人敢,我死你手里,你的强韧……”

    小舞俏脸微红,然后俏脸上流『露』出一丝冷笑,“你说吧?什么眼神都不是说我是神界的么?”

    唐三微微一笑,道:“这也太差了反倒。你明白了么?”

    唐三微微一笑,道:“你这么早就不出『色』,但竞争者所拥有的权威,我要比您高谈强,英俊以及我成为了计划,现可以帮助下将你们吸引前舞的情况,但同样也没有打击我的机会,何况,我偏怀中毒下观

最后再送大家一本,帮助大家拿到 BAT 等一线大厂 offer 的数据结构刷题笔记,是谷歌和阿里的大佬写的,对于算法薄弱或者需要提高的同学都十分受用(提取码:9go2 ):

谷歌和阿里大佬的Leetcode刷题笔记

以及我整理的7K+本开源电子书,总有一本可以帮到你 💖(提取码:4eg0)

7K+本开源电子书

💖先赞后看,再收藏,养成好习惯!💖

以上是关于平安夜,给女同学写了份不得了的代码的主要内容,如果未能解决你的问题,请参考以下文章

初学单片机,学写了个程序,结果有错误,找了一下午也没找到

转行测试,11k入职,我写了份1000多字的分享,每一笔都是经历

ChatGPT 玩「脱」了,写了份毁灭人类计划书,还遭到了 Stack Overflow 的封杀.........

ChatGPT 玩「脱」了,写了份毁灭人类计划书,还遭到了 Stack Overflow 的封杀.........

ChatGPT 玩「脱」了,写了份毁灭人类计划书,还遭到了 Stack Overflow 的封杀.........

ChatGPT 玩「脱」了,写了份毁灭人类计划书,还遭到了 Stack Overflow 的封杀.........