
教程深度学习【免费下载链接】stanford-tensorflow-tutorialsThis repository contains code examples for the Stanfords course: TensorFlow for Deep Learning Research.项目地址https://gitcode.com/gh_mirrors/st/stanford-tensorflow-tutorials点击查看免费下载本文以斯坦福 CS 20SITensorFlow for Deep Learning Research课程作业 3 的 chatbot 项目为主体系统讲解如何基于 Sequence-to-Sequence 模型与注意力解码器attentional decoder构建一个可直接运行的全功能神经网络聊天机器人。文中将完整复现该项目的训练与对话流程并结合 2017/assignments/chatbot 目录下的源码逐层剖析数据预处理、模型构建、断点续训与交互式对话的实现细节。读完本文你将能够独立完成从 Cornell 电影对话语料下载、数据预处理到模型训练、命令行聊天交互的全链路实操并理解每个关键超参数的作用。项目背景与定位该项目是 CS 20SITensorFlow for Deep Learning Research 课程作业 3 的 starter code由 Chip Huyen 创建收录在本仓库的 2017/assignments/chatbot 目录下。它是一个**功能完整fully functional**的神经网络聊天机器人核心架构基于两个经典工作Cho et al.2014提出的序列到序列Sequence-to-Sequence模型带有注意力机制attention的解码器其实现直接参考了 TensorFlow 官方 Google Translate 模型中的embedding_attention_seq2seq。从仓库根目录的 2017/README.md 可以看到聊天机器人属于assignments文件夹中的两个课程作业之一另一个是 Style Transfer且该 README 特别注明截至 2017 年 7 月 11 日代码库已更新到 TensorFlow 1.2 与 Python 3唯独 chatbot 代码尚未同步更新因此在运行本示例时需注意其基于 TensorFlow 1.x API如tf.nn.seq2seq、tf.nn.rnn_cell的适用前提。整个项目的代码结构非常精简仅由 4 个核心文件组成文件职责config.py集中管理全部数据路径与模型超参数data.pyCornell 语料的预处理、分词、词表构建与批数据生成model.py构建 seq2seq 模型图placeholder、注意力解码、损失、优化器chatbot.py训练与聊天两个模式的入口脚本对话效果示例README 中给出了一段典型的真实对话记录HUMAN为用户输入BOT为模型输出HUMAN hi BOT hi . what s your name ? HUMAN im chip BOT please . HUMAN please what? BOT i don t know what to say . HUMAN where are you from? BOT california . HUMAN do you like california? BOT i m okay . HUMAN i like california a lot BOT of what ? HUMAN i live here BOT and what is it ? HUMAN california BOT i don t know what to say . HUMAN im a student here BOT and get it out of here . HUMAN what do you like to do in your free time? BOT and what about the gun ? HUMAN do you have a gun? BOT yes . HUMAN youre dangerous! BOT i m not . HUMAN do you go hunting? BOT i can do . HUMAN what do you hunt? BOT virgin . HUMAN thats very bad BOT and you in love ? HUMAN no im not BOT please - - HUMAN okay, i am BOT and you are good . HUMAN yeah i am good too. BOT good good to you . HUMAN are you in love? BOT i m ready . HUMAN ready for what? BOT for what ? HUMAN for what? BOT i don t know what to say . HUMAN tell me BOT i can do it . HUMAN okay, tell me what youre ready for BOT i m doing you . HUMAN no youre not BOT please ! HUMAN this is a strange conversation BOT i don t know what to say . HUMAN are you a guy? BOT of what ? HUMAN are you a boy? BOT i m fine . HUMAN are you a man? BOT i m a little . HUMAN whats your name? BOT chris - HUMAN chris who? BOT cornelius . HUMAN so i guess youre a guy. BOT i am . HUMAN okay BOT okay ? HUMAN do you have a girlfriend? BOT i m sure . HUMAN whats her name? BOT let s talk about something else .从这段对话可以直观感受到这类早期 seq2seq 聊天机器人的典型特征能回答问候、地点、姓名等高频问题如californiachriscornelius但也频繁输出训练语料中的高频兜底句i don t know what to say .、let s talk about something else .。更多对话样本可以查看本仓库的 output_convo.txt其中包含多轮完整聊天记录例如HUMAN how old are you? BOT eighteen . HUMAN what time is it? BOT 5 9 6 9 1 4 5 .注意输出中数字会被替换为#如# # # # # # # .这正是 data.py 中basic_tokenizer的normalize_digitsTrue默认行为——把所有数字归一化为#以控制词表规模。环境准备与快速上手Step 1获取 Cornell Movie-Dialogs 语料在项目目录下创建一个数据文件夹从 Cornell Movie-Dialogs Corpus 官方网站下载该数据集README 中给出了官方页面下载后解压。数据集解压后应包含两个关键文件其文件名在 config.py 中被引用movie_lines.txt电影中每一行台词及其元数据movie_conversations.txt按电影组织的连续对话序列。Step 2修改 config.py 中的数据路径下载解压完成后需要修改 config.py 中的DATA_PATH将其指向你实际存放语料的目录源码中默认值指向作者本机的 macOS 路径必须改成你自己的路径DATA_PATH /Users/Chip/data/cornell movie-dialogs corpus同时该文件还定义了预处理产物的输出位置与文件名CONVO_FILE movie_conversations.txt LINE_FILE movie_lines.txt OUTPUT_FILE output_convo.txt PROCESSED_PATH processed CPT_PATH checkpoints也就是说预处理后的数据会写入项目下的processed/目录模型权重断点保存在checkpoints/目录聊天记录则追加写入processed/output_convo.txt。Step 3运行数据预处理在项目目录下执行python data.pydata.py 的__main__分支会依次调用prepare_raw_data()和process_data()完成 Cornell 语料的全部预处理工作详见后文数据预处理流水线一节。Step 4训练与聊天预处理完成后通过--mode参数切换训练与对话两种模式python chatbot.py --mode train # 训练模型 python chatbot.py --mode chat # 与机器人对话关于--mode参数需要注意以下几点与 chatbot.py 中的main()实现一致--mode的取值只能是train或chat未指定时默认为train断点续训若采用train模式模型默认会从checkpoints/目录恢复此前训练好的权重如果存在并在此基础上继续训练从零开始训练若想彻底重训请先删除checkpoints/文件夹中的所有 checkpoint 文件聊天模式--mode chat会进入与机器人的交互式命令行对话输入空行直接回车即可退出对话记录自动保存默认情况下你与机器人的所有对话都会以追加a方式写入processed/目录下的output_convo.txt文件每条记录用HUMAN 与BOT 前缀区分每次会话结束后写入一行分隔符见 chatbot.py 的chat()函数。另外main()中还有一处便捷逻辑如果检测到processed/目录尚不存在会自动调用data.prepare_raw_data()与data.process_data()完成预处理再继续创建checkpoints/目录并进入对应模式。数据预处理流水线深度解析data.py 承担了从原始语料到模型可读数据的全部转换工作其流水线可分为四个阶段阶段一解析原始语料。get_lines()读取movie_lines.txt按$分隔符切分每一行构建line_id - 台词文本的映射get_convos()读取movie_conversations.txt解析每条对话中引用的台词 ID 序列。阶段二构造问答对并划分训练/测试集。question_answers()将每条对话中相邻两句台词组织成(question, answer)对prepare_dataset()用random.sample随机抽取TESTSET_SIZE 25000个问答对作为测试集其余作为训练集分别写入train.enc、train.dec、test.enc、test.dec四个文件enc 为输入句dec 为目标回复句。阶段三分词与词表构建。basic_tokenizer()实现基础分词统一转小写、去除u、/u、方括号等标记按([.,!?\-:;)(])正则切分标点并将数字归一化为#。build_vocab()统计词频后写出词表文件vocab.enc与vocab.dec文件前四行固定为四个特殊标记其索引在 config.py 中定义特殊标记ID含义pad0PAD_ID填充占位符unk1UNK_ID未登录词s2START_ID解码起始符\s3EOS_ID句子结束符build_vocab()还有一个值得注意的行为词频低于THRESHOLD 2的词不会进入词表而是把当前词表大小即ENC_VOCAB/DEC_VOCAB的数值以追加方式写回config.py文件本身供后续模型构建时引用。这是该课程作业 starter code 特有的自动配置回写设计——也就是说运行完data.py后config.py中会出现ENC_VOCAB与DEC_VOCAB两个动态生成的超参数。阶段四句子转 ID。token2id()将文本转换为整数序列并写入train_ids.enc、train_ids.dec等文件。对于解码端dec还会在句子前后自动拼接s2与\s3标记作为解码器的起止信号编码端则不添加起止符。批数据生成。load_data()按config.BUCKETS中定义的长度区间将问答对分桶bucketget_batch()每次从指定桶中随机抽取一个 batch对编码输入做倒序list(reversed(...))并填充到桶长解码输入填充到桶长并附带decoder_masks——掩码在目标位置为 PAD 时置 0用于在损失计算中忽略填充位见 data.py 的get_batch与_reshape_batch实现。数据全部按 batch-major时间步为轴、batch 为内维的 np 数组形式喂给模型。模型架构与核心超参数模型结构注意力 seq2seq 分桶训练model.py 中的ChatBotModel类构建了完整的模型图编码器/解码器输入_create_placeholders()按最大桶长创建一系列tf.int32placeholderencoder_inputs、decoder_inputs、decoder_masks解码端占位符比编码端多一个位置且self.targets self.decoder_inputs[1:]——即目标序列是解码输入右移一位以忽略开头的s符循环单元_inference()中采用GRUCell(HIDDEN_SIZE)堆叠NUM_LAYERS层构成MultiRNNCell核心算子_create_loss()调用tf.nn.seq2seq.embedding_attention_seq2seq构建带嵌入层与注意力机制的解码器并通过tf.nn.seq2seq.model_with_buckets针对每个桶分别建立前向feed_previous按模式开关与损失计算子图实现变长序列的分桶并行训练sampled softmax当NUM_SAMPLES 0且小于DEC_VOCAB时为输出层创建投影矩阵proj_w、proj_b并采用tf.nn.sampled_softmax_loss做负采样损失以缓解大词表下 softmax 的计算压力解码时再将投影后的 logits 乘回投影矩阵得到最终输出见_create_loss()中if self.output_projection:分支优化器_creat_optimizer()中训练模式下为每个桶分别计算梯度并做tf.clip_by_global_norm全局范数裁剪上限为MAX_GRAD_NORM再通过GradientDescentOptimizer应用更新同时维护一个不可训练的global_step变量用于记录全局迭代次数与断点保存编号。超参数一览config.py 中集中定义了所有超参数理解它们是调优与复现的关键超参数默认值说明THRESHOLD2词频低于该值的词不进入词表TESTSET_SIZE25000从问答对中随机抽出的测试集规模BUCKETS[(16, 19)]编码/解码长度桶区间源码注释中保留了三组候选如[(6,8),(8,10),...]、[(8,10),(12,14),(16,19)]并附有对应桶的样本数统计注释表明这些桶大小看起来效果最好NUM_LAYERS3多层 RNN 的层数HIDDEN_SIZE256隐层单元数同时用作词嵌入维度BATCH_SIZE64训练批次大小LR0.5学习率SGDMAX_GRAD_NORM5.0梯度裁剪的全局范数上限NUM_SAMPLES512sampled softmax 的负样本采样数关于BUCKETS源码注释给出了不同桶划分下训练样本的分布统计例如[(16, 19)]对应约 11883 个训练样本提示桶的设计直接决定分桶后的样本利用率——桶越宽填充的 PAD 越多训练效率越低桶越窄落在桶外的长句越多越容易被丢弃。训练流程从断点续训到定期评估chatbot.py 的train()函数实现了完整的训练循环加载数据_get_buckets()调用data.load_data(train_ids.enc, train_ids.dec)与data.load_data(test_ids.enc, test_ids.dec)并基于各桶样本数计算train_buckets_scale——一个单调递增的累积比例数组用于后续按样本量加权随机选桶构建模型以forward_onlyFalse实例化ChatBotModel即同时构造前向与反向路径恢复或初始化参数_check_restore_parameters()通过tf.train.get_checkpoint_state查找checkpoints/目录下的断点文件存在则saver.restore恢复否则输出Initializing fresh parameters迭代训练每个 step 随机选桶_get_random_bucket、取一个 batch、执行run_step返回梯度范数与损失每累计一定迭代次数_get_skip_step前 100 次迭代每 30 步保存一次之后每 100 步保存一次打印平均损失并调用saver.save保存断点到checkpoints/chatbot定期评估每隔10 * skip_step次迭代_eval_test_set()会在测试集上以前向模式跑一遍输出每个桶的 loss 与耗时。其中run_step()是训练/推理共用的单步执行函数训练时输出[train_op, gradient_norm, loss]前向forward_onlyTrue时输出[loss]与每个解码时间步的 logits。值得一提的是它在输入 feed 中把model.decoder_inputs[decoder_size]即多出的最后一个解码占位符填零这是该翻译模板代码的一个实现细节。聊天模式贪心解码的交互实现chatbot.py 的chat()函数实现了交互式对话加载编码词表vocab.enc与解码词表vocab.dec以forward_onlyTrue、batch_size1构建模型并恢复断点打开processed/output_convo.txt的追加写入句柄打印欢迎语Welcome to TensorBro. Say something. Enter to exit. Max length is 最大桶长然后循环读取标准输入用户输入通过data.sentence2id(enc_vocab, line)转成 token ID 序列若超过最大桶长config.BUCKETS[-1][0]默认 16会提示Max length I can handle is并跳过用_find_right_bucket()按长度找到最合适的桶构造单元素 batch 后执行run_step得到各时间步的输出 logits_construct_response()采用贪心解码对每个时间步的 logits 取argmax得到词 ID若遇到EOS_ID3则截断最后用解码词表映射回文本并打印同时写入output_convo.txt。输入空行直接回车即可结束本次会话并关闭记录文件。这种贪心解码是早期 seq2seq 聊天的标准做法——它不保证全局最优但在词表与数据规模有限的前提下足以支撑 README 中所展示的交互效果。运行注意事项与适用前提基于仓库现状运行本项目时有几点需要特别留意API 版本限制模型代码依赖 TensorFlow 1.x 的tf.nn.seq2seq、tf.nn.rnn_cell、tf.compat.as_str等接口2017/README.md 已明确说明代码基线为 TensorFlow 1.2 / Python 3且 chatbot 部分尚未同步更新在更高版本尤其是 TensorFlow 2.x中直接运行会报错config.py 会被自动改写data.py的build_vocab()会把ENC_VOCAB/DEC_VOCAB追加写入 config.py因此预处理应在模型构建之前完成且不要把config.py当作只读文件路径依赖DATA_PATH必须指向解压后的 Cornell 语料目录PROCESSED_PATHprocessed/与CPT_PATHcheckpoints/会自动创建从零重训若要清空历史训练结果需要手动删除checkpoints/目录下的所有 checkpoint 文件README 中的明确建议对话记录所有聊天记录会追加写入processed/output_convo.txt仓库中已附带的 output_convo.txt 即此类记录的真实样本可用来了解模型在不同训练阶段的输出水平。总结本项目以极简的四文件结构完整实现了数据预处理 → 分桶 seq2seq 注意力模型训练 → 断点续训 → 命令行贪心对话的闭环是理解 TensorFlow 1.x 时代 seq2seq 聊天机器人的绝佳教学样例。通过本文的梳理你可以清楚看到每个超参数BUCKETS、NUM_LAYERS、HIDDEN_SIZE、NUM_SAMPLES等在 config.py 中的位置与作用也能在 data.py、model.py、chatbot.py 中找到从原始语料到最终对话响应的每一条调用链。若想进一步深入可以尝试调整桶划分、层数、隐层大小或学习率观察它们对训练损失与对话质量的影响——这也正是该课程作业鼓励的探索方向。赞分享教程深度学习【免费下载链接】stanford-tensorflow-tutorialsThis repository contains code examples for the Stanfords course: TensorFlow for Deep Learning Research.项目地址https://gitcode.com/gh_mirrors/st/stanford-tensorflow-tutorials点击查看免费下载相关推荐基于序列到序列注意力模型的 TensorFlow 神经聊天机器人实战stanford-tensorflow-tutorials 指南基于序列到序列注意力模型的 TensorFlow 神经聊天机器人实战stanford tensorflow tutorials 指南 本篇技术指南以仓库 as教程深度学习BladeOne缓存机制揭秘MODE_AUTO、MODE_SLOW、MODE_FAST三种模式详解BladeOne缓存机制揭秘MODE_AUTO、MODE_SLOW、MODE_FAST三种模式详解 BladeOne作为一款高性能的PHP模板引擎其 缓存机stanford-tensorflow-tutorials循环神经网络状态管理动态序列长度处理stanford tensorflow tutorials循环神经网络状态管理动态序列长度处理 在自然语言处理、时间序列预测等领域输入数据往往具有可变长度的教程深度学习创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考