[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-bojone--bert4keras":3,"tool-bojone--bert4keras":61},[4,18,26,36,44,53],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":17},4358,"openclaw","openclaw\u002Fopenclaw","OpenClaw 是一款专为个人打造的本地化 AI 助手，旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚，能够直接接入你日常使用的各类通讯渠道，包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息，OpenClaw 都能即时响应，甚至支持在 macOS、iOS 和 Android 设备上进行语音交互，并提供实时的画布渲染功能供你操控。\n\n这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地，用户无需依赖云端服务即可享受快速、私密的智能辅助，真正实现了“你的数据，你做主”。其独特的技术亮点在于强大的网关架构，将控制平面与核心助手分离，确保跨平台通信的流畅性与扩展性。\n\nOpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者，以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力（支持 macOS、Linux 及 Windows WSL2），即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你",349277,3,"2026-04-06T06:32:30",[13,14,15,16],"Agent","开发框架","图像","数据工具","ready",{"id":19,"name":20,"github_repo":21,"description_zh":22,"stars":23,"difficulty_score":10,"last_commit_at":24,"category_tags":25,"status":17},3808,"stable-diffusion-webui","AUTOMATIC1111\u002Fstable-diffusion-webui","stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面，旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点，将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。\n\n无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师，还是想要深入探索模型潜力的开发者与研究人员，都能从中获益。其核心亮点在于极高的功能丰富度：不仅支持文生图、图生图、局部重绘（Inpainting）和外绘（Outpainting）等基础模式，还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外，它内置了 GFPGAN 和 CodeFormer 等人脸修复工具，支持多种神经网络放大算法，并允许用户通过插件系统无限扩展能力。即使是显存有限的设备，stable-diffusion-webui 也提供了相应的优化选项，让高质量的 AI 艺术创作变得触手可及。",162132,"2026-04-05T11:01:52",[14,15,13],{"id":27,"name":28,"github_repo":29,"description_zh":30,"stars":31,"difficulty_score":32,"last_commit_at":33,"category_tags":34,"status":17},1381,"everything-claude-code","affaan-m\u002Feverything-claude-code","everything-claude-code 是一套专为 AI 编程助手（如 Claude Code、Codex、Cursor 等）打造的高性能优化系统。它不仅仅是一组配置文件，而是一个经过长期实战打磨的完整框架，旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。\n\n通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能，everything-claude-code 能显著提升 AI 在复杂任务中的表现，帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略，使得模型响应更快、成本更低，同时有效防御潜在的攻击向量。\n\n这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库，还是需要 AI 协助进行安全审计与自动化测试，everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目，它融合了多语言支持与丰富的实战钩子（hooks），让 AI 真正成长为懂上",145895,2,"2026-04-08T11:32:59",[14,13,35],"语言模型",{"id":37,"name":38,"github_repo":39,"description_zh":40,"stars":41,"difficulty_score":32,"last_commit_at":42,"category_tags":43,"status":17},2271,"ComfyUI","Comfy-Org\u002FComfyUI","ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎，专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式，采用直观的节点式流程图界面，让用户通过连接不同的功能模块即可构建个性化的生成管线。\n\n这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景，也能自由组合模型、调整参数并实时预览效果，轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性，不仅支持 Windows、macOS 和 Linux 全平台，还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构，并率先支持 SDXL、Flux、SD3 等前沿模型。\n\n无论是希望深入探索算法潜力的研究人员和开发者，还是追求极致创作自由度的设计师与资深 AI 绘画爱好者，ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",108111,"2026-04-08T11:23:26",[14,15,13],{"id":45,"name":46,"github_repo":47,"description_zh":48,"stars":49,"difficulty_score":32,"last_commit_at":50,"category_tags":51,"status":17},4721,"markitdown","microsoft\u002Fmarkitdown","MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具，专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片（含 OCR）、音频（含语音转录）、HTML 乃至 YouTube 链接等多种格式的解析，能够精准提取文档中的标题、列表、表格和链接等关键结构信息。\n\n在人工智能应用日益普及的今天，大语言模型（LLM）虽擅长处理文本，却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点，它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式，成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外，它还提供了 MCP（模型上下文协议）服务器，可无缝集成到 Claude Desktop 等 LLM 应用中。\n\n这款工具特别适合开发者、数据科学家及 AI 研究人员使用，尤其是那些需要构建文档检索增强生成（RAG）系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性，但其核心优势在于为机器",93400,"2026-04-06T19:52:38",[52,14],"插件",{"id":54,"name":55,"github_repo":56,"description_zh":57,"stars":58,"difficulty_score":10,"last_commit_at":59,"category_tags":60,"status":17},4487,"LLMs-from-scratch","rasbt\u002FLLMs-from-scratch","LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目，旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型（LLM）。它不仅是同名技术著作的官方代码库，更提供了一套完整的实践方案，涵盖模型开发、预训练及微调的全过程。\n\n该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型，却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码，用户能够透彻掌握 Transformer 架构、注意力机制等关键原理，从而真正理解大模型是如何“思考”的。此外，项目还包含了加载大型预训练权重进行微调的代码，帮助用户将理论知识延伸至实际应用。\n\nLLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API，而是渴望探究模型构建细节的技术人员而言，这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计：将复杂的系统工程拆解为清晰的步骤，配合详细的图表与示例，让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础，还是为未来研发更大规模的模型做准备",90106,"2026-04-06T11:19:32",[35,15,13,14],{"id":62,"github_repo":63,"name":64,"description_en":65,"description_zh":66,"ai_summary_zh":66,"readme_en":67,"readme_zh":68,"quickstart_zh":69,"use_case_zh":70,"hero_image_url":71,"owner_login":72,"owner_name":73,"owner_avatar_url":74,"owner_bio":75,"owner_company":76,"owner_location":76,"owner_email":76,"owner_twitter":76,"owner_website":77,"owner_url":78,"languages":79,"stars":84,"forks":85,"last_commit_at":86,"license":87,"difficulty_score":32,"env_os":88,"env_gpu":89,"env_ram":88,"env_deps":90,"category_tags":97,"github_topics":76,"view_count":32,"oss_zip_url":76,"oss_zip_packed_at":76,"status":17,"created_at":98,"updated_at":99,"faqs":100,"releases":136},5676,"bojone\u002Fbert4keras","bert4keras","keras implement of transformers for humans","bert4keras 是一个专为 Keras 用户打造的轻量级 Transformer 模型库，旨在用清晰、简洁的代码实现 BERT、RoBERTa、ALBERT、T5、GPT 等主流预训练模型的加载与应用。它解决了开发者在 Keras 框架下灵活定制和微调复杂 Transformer 架构时面临的代码冗余与环境兼容难题，让结合前沿 NLP 技术与经典深度学习框架变得更加顺畅。\n\n该项目非常适合需要快速验证想法的 AI 研究人员、希望深入理解模型内部机制的开发者，以及需要在生产环境中进行模型微调的工程团队。无论是从零开始预训练，还是基于现有权重进行下游任务适配，bert4keras 都提供了丰富的示例代码和完善的文档支持。\n\n其独特亮点在于极高的灵活性与广泛的兼容性：不仅支持 Google 原版及多个中文社区优化版的模型权重，还完美适配 TensorFlow 1.x 与 2.x 环境（包括 tf.keras）。此外，项目持续更新，近期优化了显存占用并提升了在高性能显卡上的训练速度，同时支持 TPU 和多 GPU 分布式训练，是连接学术研究与工程落地的实用桥梁。","# bert4keras\n- Our light reimplement of bert for keras\n- 更清晰、更轻量级的keras版bert\n- 个人博客：https:\u002F\u002Fkexue.fm\u002F\n- 在线文档：http:\u002F\u002Fbert4keras.spaces.ac.cn\u002F （还在构建中）\n\n## 说明\n这是笔者重新实现的keras版的transformer模型库，致力于用尽可能清爽的代码来实现结合transformer和keras。\n\n本项目的初衷是为了修改、定制上的方便，所以可能会频繁更新。\n\n因此欢迎star，但不建议fork，因为你fork下来的版本可能很快就过期了。\n\n## 功能\n目前已经实现：\n- 加载bert\u002Froberta\u002Falbert的预训练权重进行finetune；\n- 实现语言模型、seq2seq所需要的attention mask；\n- 丰富的\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbojone\u002Fbert4keras\u002Ftree\u002Fmaster\u002Fexamples\">examples\u003C\u002Fa>；\n- 从零预训练代码（支持TPU、多GPU，请看\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbojone\u002Fbert4keras\u002Ftree\u002Fmaster\u002Fpretraining\">pretraining\u003C\u002Fa>）；\n- 兼容keras、tf.keras\n\n## 使用\n安装稳定版：\n```shell\npip install bert4keras\n```\n安装最新版：\n```shell\npip install git+https:\u002F\u002Fwww.github.com\u002Fbojone\u002Fbert4keras.git\n```\n\n使用例子请参考\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbojone\u002Fbert4keras\u002Fblob\u002Fmaster\u002Fexamples\">examples\u003C\u002Fa>目录。\n\n之前基于keras-bert给出的\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbojone\u002Fbert_in_keras\">例子\u003C\u002Fa>，仍适用于本项目，只需要将`bert_model`的加载方式换成本项目的。\n\n理论上兼容Python2和Python3，兼容tensorflow 1.14+和tensorflow 2.x，实验环境是Python 2.7、Tesorflow 1.14+以及Keras 2.3.1（已经在2.2.4、2.3.0、2.3.1、tf.keras下测试通过）。\n\n**为了获得最好的体验，建议你使用Tensorflow 1.14 + Keras 2.3.1组合。**\n\n\u003Cblockquote>\u003Cstrong>关于环境组合\u003C\u002Fstrong>\n  \n- 支持tf+keras和tf+tf.keras，后者需要提前传入环境变量TF_KERAS=1。\n\n- 当使用tf+keras时，建议2.2.4 \u003C= keras \u003C= 2.3.1，以及 1.14 \u003C= tf \u003C= 2.2，不能使用tf 2.3+。\n\n- keras 2.4+可以用，但事实上keras 2.4.x基本上已经完全等价于tf.keras了，因此如果你要用keras 2.4+，倒不如直接用tf.keras。\n\u003C\u002Fblockquote>\n\n当然，乐于贡献的朋友如果发现了某些bug的话，也欢迎指出修正甚至Pull Requests～\n\n## 权重\n\n目前支持加载的权重：\n- \u003Cstrong>Google原版bert\u003C\u002Fstrong>: https:\u002F\u002Fgithub.com\u002Fgoogle-research\u002Fbert\n- \u003Cstrong>brightmart版roberta\u003C\u002Fstrong>: https:\u002F\u002Fgithub.com\u002Fbrightmart\u002Froberta_zh\n- \u003Cstrong>哈工大版roberta\u003C\u002Fstrong>: https:\u002F\u002Fgithub.com\u002Fymcui\u002FChinese-BERT-wwm\n- \u003Cstrong>Google原版albert\u003C\u002Fstrong>\u003Csup>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbojone\u002Fbert4keras\u002Fissues\u002F29#issuecomment-552188981\">[例子]\u003C\u002Fa>\u003C\u002Fsup>: https:\u002F\u002Fgithub.com\u002Fgoogle-research\u002FALBERT\n- \u003Cstrong>brightmart版albert\u003C\u002Fstrong>: https:\u002F\u002Fgithub.com\u002Fbrightmart\u002Falbert_zh\n- \u003Cstrong>转换后的albert\u003C\u002Fstrong>: https:\u002F\u002Fgithub.com\u002Fbojone\u002Falbert_zh\n- \u003Cstrong>华为的NEZHA\u003C\u002Fstrong>: https:\u002F\u002Fgithub.com\u002Fhuawei-noah\u002FPretrained-Language-Model\u002Ftree\u002Fmaster\u002FNEZHA-TensorFlow\n- \u003Cstrong>华为的NEZHA-GEN\u003C\u002Fstrong>: https:\u002F\u002Fgithub.com\u002Fhuawei-noah\u002FPretrained-Language-Model\u002Ftree\u002Fmaster\u002FNEZHA-Gen-TensorFlow\n- \u003Cstrong>自研语言模型\u003C\u002Fstrong>: https:\u002F\u002Fgithub.com\u002FZhuiyiTechnology\u002Fpretrained-models\n- \u003Cstrong>T5模型\u003C\u002Fstrong>: https:\u002F\u002Fgithub.com\u002Fgoogle-research\u002Ftext-to-text-transfer-transformer\n- \u003Cstrong>GPT_OpenAI\u003C\u002Fstrong>: https:\u002F\u002Fgithub.com\u002Fbojone\u002FCDial-GPT-tf\n- \u003Cstrong>GPT2_ML\u003C\u002Fstrong>: https:\u002F\u002Fgithub.com\u002Fimcaspar\u002Fgpt2-ml\n- \u003Cstrong>Google原版ELECTRA\u003C\u002Fstrong>: https:\u002F\u002Fgithub.com\u002Fgoogle-research\u002Felectra\n- \u003Cstrong>哈工大版ELECTRA\u003C\u002Fstrong>: https:\u002F\u002Fgithub.com\u002Fymcui\u002FChinese-ELECTRA\n- \u003Cstrong>CLUE版ELECTRA\u003C\u002Fstrong>: https:\u002F\u002Fgithub.com\u002FCLUEbenchmark\u002FELECTRA\n- \u003Cstrong>LaBSE（多国语言BERT）\u003C\u002Fstrong>: https:\u002F\u002Fgithub.com\u002Fbojone\u002Flabse\n- \u003Cstrong>Chinese-GEN项目下的模型\u003C\u002Fstrong>: https:\u002F\u002Fgithub.com\u002Fbojone\u002Fchinese-gen\n- \u003Cstrong>T5.1.1\u003C\u002Fstrong>: https:\u002F\u002Fgithub.com\u002Fgoogle-research\u002Ftext-to-text-transfer-transformer\u002Fblob\u002Fmaster\u002Freleased_checkpoints.md#t511\n- \u003Cstrong>Multilingual T5\u003C\u002Fstrong>: https:\u002F\u002Fgithub.com\u002Fgoogle-research\u002Fmultilingual-t5\u002F\n\n\u003Cstrong>注意事项\u003C\u002Fstrong>\n- 注1：brightmart版albert的开源时间早于Google版albert，这导致早期brightmart版albert的权重与Google版的不完全一致，换言之两者不能直接相互替换。为了减少代码冗余，bert4keras的0.2.4及后续版本均只支持加载\u003Cu>Google版\u003C\u002Fu>以brightmart版中\u003Cu>带Google字眼\u003C\u002Fu>的权重。如果要加载早期版本的权重，请用\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbojone\u002Fbert4keras\u002Freleases\u002Ftag\u002Fv0.2.3\">0.2.3版本\u003C\u002Fa>，或者考虑作者转换过的\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbojone\u002Falbert_zh\">albert_zh\u003C\u002Fa>。\n- 注2：下载下来的ELECTRA权重，如果没有json配置文件的话，参考\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fymcui\u002FChinese-ELECTRA\u002Fissues\u002F3\">这里\u003C\u002Fa>自己改一个（需要加上`type_vocab_size`字段）。\n\n## 更新\n- \u003Cstrong>2023.03.06\u003C\u002Fstrong>: [无穷大改np.inf；优化显存占用](https:\u002F\u002Fgithub.com\u002Fbojone\u002Fbert4keras\u002Fcommit\u002F20a46946156b4bc15ceaa00671fcd00c8b702640)。将无穷大改为np.inf，运算更加准确，而且在低精度运算时不容易出错；同时合并了若干mask算子，减少了显存占用。实测在A100上训练base和large级别模型时，速度有明显加快，显存占用也有降低。\n- \u003Cstrong>2022.03.20\u003C\u002Fstrong>: 增加[RoFormerV2](https:\u002F\u002Fkexue.fm\u002Farchives\u002F8998)。\n- \u003Cstrong>2022.02.28\u003C\u002Fstrong>: 增加[GatedAttentionUnit](https:\u002F\u002Fkexue.fm\u002Farchives\u002F8934)。\n- \u003Cstrong>2021.04.23\u003C\u002Fstrong>: 增加[GlobalPointer](https:\u002F\u002Fkexue.fm\u002Farchives\u002F8373)。\n- \u003Cstrong>2021.03.23\u003C\u002Fstrong>: 增加[RoFormer](https:\u002F\u002Fkexue.fm\u002Farchives\u002F8265)。\n- \u003Cstrong>2021.01.30\u003C\u002Fstrong>: 发布0.9.9版，完善多GPU支持，增加多GPU例子：[task_seq2seq_autotitle_multigpu.py](https:\u002F\u002Fgithub.com\u002Fbojone\u002Fbert4keras\u002Fblob\u002Fmaster\u002Fexamples\u002Ftask_seq2seq_autotitle_multigpu.py)。\n- \u003Cstrong>2020.12.29\u003C\u002Fstrong>: 增加`residual_attention_scores`参数来实现RealFormer，只需要在`build_transformer_model`中传入参数`residual_attention_scores=True`启用。\n- \u003Cstrong>2020.12.04\u003C\u002Fstrong>: `PositionEmbedding`引入层次分解，可以让BERT直接处理超长文本，在`build_transformer_model`中传入参数`hierarchical_position=True`启用。\n- \u003Cstrong>2020.11.19\u003C\u002Fstrong>: 支持GPT2模型，参考[CPM_LM_bert4keras](https:\u002F\u002Fgithub.com\u002Fbojone\u002FCPM_LM_bert4keras)项目。\n- \u003Cstrong>2020.11.14\u003C\u002Fstrong>: 新增分参数学习率`extend_with_parameter_wise_lr`，可用于给每层设置不同的学习率。\n- \u003Cstrong>2020.10.27\u003C\u002Fstrong>: 支持\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fgoogle-research\u002Ftext-to-text-transfer-transformer\u002Fblob\u002Fmaster\u002Freleased_checkpoints.md#t511\">T5.1.1\u003C\u002Fa>和\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fgoogle-research\u002Fmultilingual-t5\u002F\">Multilingual T5\u003C\u002Fa>。\n- \u003Cstrong>2020.08.28\u003C\u002Fstrong>: 支持\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbojone\u002FCDial-GPT-tf\">GPT_OpenAI\u003C\u002Fa>。\n- \u003Cstrong>2020.08.22\u003C\u002Fstrong>: 新增`WebServing`类，允许简单地将模型转换为Web接口，详情请参考该类的\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbojone\u002Fbert4keras\u002Fblob\u002F8d55512a12e4677262363ac189ebf504fc451716\u002Fbert4keras\u002Fsnippets.py#L580\">说明\u003C\u002Fa>。\n- \u003Cstrong>2020.07.14\u003C\u002Fstrong>: `Transformer`类加入`prefix`参数；`snippets.py`引入`to_array`函数；`AutoRegressiveDecoder`修改`rtype='logits'`时的一个隐藏bug。\n- \u003Cstrong>2020.06.06\u003C\u002Fstrong>: 强迫症作祟：将`Tokenizer`原来的`max_length`参数重命名为`maxlen`，同时保留向后兼容性，建议大家用新参数名。\n- \u003Cstrong>2020.04.29\u003C\u002Fstrong>: 增加重计算（参考\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbojone\u002Fkeras_recompute\">keras_recompute\u003C\u002Fa>），可以通过时间换空间，通过设置环境变量`RECOMPUTE=1`启用。\n- \u003Cstrong>2020.04.25\u003C\u002Fstrong>: 优化tf2下的表现。\n- \u003Cstrong>2020.04.16\u003C\u002Fstrong>: 所有example均适配tensorflow 2.0。\n- \u003Cstrong>2020.04.06\u003C\u002Fstrong>: 增加UniLM预训练模式（测试中）。\n- \u003Cstrong>2020.04.06\u003C\u002Fstrong>: 完善`rematch`方法。\n- \u003Cstrong>2020.04.01\u003C\u002Fstrong>: `Tokenizer`增加`rematch`方法，给出分词结果与原序列的映射关系。\n- \u003Cstrong>2020.03.30\u003C\u002Fstrong>: 尽量统一py文件的写法。\n- \u003Cstrong>2020.03.25\u003C\u002Fstrong>: 支持ELECTRA。\n- \u003Cstrong>2020.03.24\u003C\u002Fstrong>: 继续加强`DataGenerator`，允许传入迭代器时进行局部shuffle。\n- \u003Cstrong>2020.03.23\u003C\u002Fstrong>: 增加调整Attention的`key_size`的选项。\n- \u003Cstrong>2020.03.17\u003C\u002Fstrong>: 增强`DataGenerator`；优化模型写法。\n- \u003Cstrong>2020.03.15\u003C\u002Fstrong>: 支持\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fimcaspar\u002Fgpt2-ml\">GPT2_ML\u003C\u002Fa>。\n- \u003Cstrong>2020.03.10\u003C\u002Fstrong>: 支持Google的\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fgoogle-research\u002Ftext-to-text-transfer-transformer\">T5\u003C\u002Fa>模型。\n- \u003Cstrong>2020.03.05\u003C\u002Fstrong>: 将`tokenizer.py`更名为`tokenizers.py`。\n- \u003Cstrong>2020.03.05\u003C\u002Fstrong>: `application='seq2seq'`改名为`application='unilm'`。\n- \u003Cstrong>2020.03.05\u003C\u002Fstrong>: `build_bert_model`更名为`build_transformer_model`。\n- \u003Cstrong>2020.03.05\u003C\u002Fstrong>: 重写`models.py`结构。\n- \u003Cstrong>2020.03.04\u003C\u002Fstrong>: 将`bert.py`更名为`models.py`。\n- \u003Cstrong>2020.03.02\u003C\u002Fstrong>: 重构mask机制（用回Keras自带的mask机制），以便更好地编写更复杂的应用。\n- \u003Cstrong>2020.02.22\u003C\u002Fstrong>: 新增`AutoRegressiveDecoder`类，统一处理Seq2Seq的解码问题。\n- \u003Cstrong>2020.02.19\u003C\u002Fstrong>: transformer block的前缀改为Transformer（本来是Encoder），使得其含义局限性更少。\n- \u003Cstrong>2020.02.13\u003C\u002Fstrong>: 优化`load_vocab`函数；将`build_bert_model`中的`keep_words`参数更名为`keep_tokens`，此处改动可能会对部分脚本产生影响。\n- \u003Cstrong>2020.01.18\u003C\u002Fstrong>: 调整文本处理方式，去掉codecs的使用。\n- \u003Cstrong>2020.01.17\u003C\u002Fstrong>: 各api日趋稳定，为了方便大家使用，打包到\u003Ca href=\"https:\u002F\u002Fpypi.org\u002Fproject\u002Fbert4keras\u002F\">pypi\u003C\u002Fa>，首个打包版本号为0.4.6。\n- \u003Cstrong>2020.01.10\u003C\u002Fstrong>: 重写模型mask方案，某种程度上让代码更为简练清晰；后端优化。\n- \u003Cstrong>2019.12.27\u003C\u002Fstrong>: 重构预训练代码，减少冗余；目前支持RoBERTa和GPT两种预训练方式，详见\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbojone\u002Fbert4keras\u002Ftree\u002Fmaster\u002Fpretraining\u002F\">pretraining\u003C\u002Fa>。\n- \u003Cstrong>2019.12.17\u003C\u002Fstrong>: 适配华为的\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fhuawei-noah\u002FPretrained-Language-Model\u002Ftree\u002Fmaster\u002FNEZHA\">nezha\u003C\u002Fa>权重，只需要在`build_bert_model`函数里加上`model='nezha'`；此外原来albert的加载方式`albert=True`改为`model='albert'`。\n- \u003Cstrong>2019.12.16\u003C\u002Fstrong>: 通过跟keras 2.3+版本类似的思路给低版本引入层中层功能，从而恢复对低于2.3.0版本的keras的支持。\n- \u003Cstrong>2019.12.14\u003C\u002Fstrong>: 新增Conditional Layer Normalization及相关demo。\n- \u003Cstrong>2019.12.09\u003C\u002Fstrong>: 各example的data_generator规范化；修复application='lm'时的一个错误。\n- \u003Cstrong>2019.12.05\u003C\u002Fstrong>: 优化tokenizer的do_lower_case，同时微调各个example。\n- \u003Cstrong>2019.11.23\u003C\u002Fstrong>: 将train.py重命名为optimizers.py，更新大量优化器实现，全面兼容keras和tf.keras。\n- \u003Cstrong>2019.11.19\u003C\u002Fstrong>: 将utils.py重命名为tokenizer.py。\n- \u003Cstrong>2019.11.19\u003C\u002Fstrong>: 想来想去，最后还是决定把snippets放到\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbojone\u002Fbert4keras\u002Fblob\u002Fmaster\u002Fbert4keras\u002Fsnippets.py\">bert4keras.snippets\u003C\u002Fa>下面去好了。\n- \u003Cstrong>2019.11.18\u003C\u002Fstrong>: 优化预训练权重加载逻辑，增加保存模型权重至Bert的checkpoint格式方法。\n- \u003Cstrong>2019.11.17\u003C\u002Fstrong>: \u003Cdel>分离一些与Bert本身不直接相关的常用代码片段到\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbojone\u002Fpython-snippets\">python_snippets\u003C\u002Fa>，供其它项目共用。\u003C\u002Fdel>\n- \u003Cstrong>2019.11.11\u003C\u002Fstrong>: 添加NSP部分。\n- \u003Cstrong>2019.11.05\u003C\u002Fstrong>: 适配\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fgoogle-research\u002Fgoogle-research\u002Ftree\u002Fmaster\u002Falbert\">google版albert\u003C\u002Fa>，不再支持\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbrightmart\u002Falbert_zh\">非Google版albert_zh\u003C\u002Fa>。\n- \u003Cstrong>2019.11.05\u003C\u002Fstrong>: 以RoBERTa为例子的预训练代码开发完毕，同时支持TPU\u002F多GPU训练，详见\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbojone\u002Fbert4keras\u002Ftree\u002Fmaster\u002Fpretraining\u002Froberta\u002F\">roberta\u003C\u002Fa>。欢迎在此基础上构建更多的预训练代码。\n- \u003Cstrong>2019.11.01\u003C\u002Fstrong>: 逐步增加预训练相关代码，详见\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbojone\u002Fbert4keras\u002Ftree\u002Fmaster\u002Fpretraining\">pretraining\u003C\u002Fa>。\n- \u003Cstrong>2019.10.28\u003C\u002Fstrong>: 支持使用基于\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fsentencepiece\">sentencepiece\u003C\u002Fa>的tokenizer。\n- \u003Cstrong>2019.10.25\u003C\u002Fstrong>: 引入原生tokenizer。\n- \u003Cstrong>2019.10.22\u003C\u002Fstrong>: 引入梯度累积优化器。\n- \u003Cstrong>2019.10.21\u003C\u002Fstrong>: 为了简化代码结构，决定放弃keras 2.3.0之前的版本的支持，目前只支持keras 2.3.0+以及tf.keras。\n- \u003Cstrong>2019.10.20\u003C\u002Fstrong>: 应网友要求，现支持直接用`model.save`保存模型结构，用`load_model`加载整个模型（只需要在`load_model`之前执行`from bert4keras.layers import *`，不需要额外写`custom_objects`）。\n- \u003Cstrong>2019.10.09\u003C\u002Fstrong>: 已兼容tf.keras，同时在tf 1.13和tf 2.0下的tf.keras测试通过，通过设置环境变量`TF_KERAS=1`来切换tf.keras。\n- \u003Cstrong>2019.10.09\u003C\u002Fstrong>: 已兼容Keras 2.3.x，但只是临时方案，后续可能直接移除掉2.3之前版本的支持。\n- \u003Cstrong>2019.10.02\u003C\u002Fstrong>: 适配albert，能成功加载\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbrightmart\u002Falbert_zh\">albert_zh\u003C\u002Fa>的权重，只需要在`load_pretrained_model`函数里加上`albert=True`。\n\n## 背景\n之前一直用CyberZHG大佬的\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FCyberZHG\u002Fkeras-bert\">keras-bert\u003C\u002Fa>，如果纯粹只是为了在keras下对bert进行调用和fine tune来说，keras-bert已经足够能让人满意了。\n\n然而，如果想要在加载官方预训练权重的基础上，对bert的内部结构进行修改，那么keras-bert就比较难满足我们的需求了，因为keras-bert为了代码的复用性，几乎将每个小模块都封装为了一个单独的库，比如keras-bert依赖于keras-transformer，而keras-transformer依赖于keras-multi-head，keras-multi-head依赖于keras-self-attention，这样一重重依赖下去，改起来就相当头疼了。\n\n所以，我决定重新写一个keras版的bert，争取在几个文件内把它完整地实现出来，减少这些依赖性，并且保留可以加载官方预训练权重的特性。\n\n## 鸣谢\n感谢CyberZHG大佬实现的\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FCyberZHG\u002Fkeras-bert\">keras-bert\u003C\u002Fa>，本实现有不少地方参考了keras-bert的源码，在此衷心感谢大佬的无私奉献。\n\n## 相关\n\n[bert4torch](https:\u002F\u002Fgithub.com\u002FTongjilibo\u002Fbert4torch)：一个跟bert4keras风格很相似的pytorch-based的transofrmer库，使用pytorch的读者可以尝试。\n\n## 引用\n\n```\n@misc{bert4keras,\n  title={bert4keras},\n  author={Jianlin Su},\n  year={2020},\n  howpublished={\\url{https:\u002F\u002Fbert4keras.spaces.ac.cn}},\n}\n```\n","# bert4keras\n- 我们对bert的轻量级keras实现\n- 更清晰、更轻量级的keras版bert\n- 个人博客：https:\u002F\u002Fkexue.fm\u002F\n- 在线文档：http:\u002F\u002Fbert4keras.spaces.ac.cn\u002F （还在构建中）\n\n## 说明\n这是笔者重新实现的keras版的transformer模型库，致力于用尽可能清爽的代码来实现结合transformer和keras。\n\n本项目的初衷是为了修改、定制上的方便，所以可能会频繁更新。\n\n因此欢迎star，但不建议fork，因为你fork下来的版本可能很快就过期了。\n\n## 功能\n目前已经实现：\n- 加载bert\u002Froberta\u002Falbert的预训练权重进行finetune；\n- 实现语言模型、seq2seq所需要的attention mask；\n- 丰富的\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbojone\u002Fbert4keras\u002Ftree\u002Fmaster\u002Fexamples\">examples\u003C\u002Fa>；\n- 从零预训练代码（支持TPU、多GPU，请看\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbojone\u002Fbert4keras\u002Ftree\u002Fmaster\u002Fpretraining\">pretraining\u003C\u002Fa>）；\n- 兼容keras、tf.keras\n\n## 使用\n安装稳定版：\n```shell\npip install bert4keras\n```\n安装最新版：\n```shell\npip install git+https:\u002F\u002Fwww.github.com\u002Fbojone\u002Fbert4keras.git\n```\n\n使用例子请参考\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbojone\u002Fbert4keras\u002Fblob\u002Fmaster\u002Fexamples\">examples\u003C\u002Fa>目录。\n\n之前基于keras-bert给出的\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbojone\u002Fbert_in_keras\">例子\u003C\u002Fa>，仍适用于本项目，只需要将`bert_model`的加载方式换成本项目的。\n\n理论上兼容Python2和Python3，兼容tensorflow 1.14+和tensorflow 2.x，实验环境是Python 2.7、Tesorflow 1.14+以及Keras 2.3.1（已经在2.2.4、2.3.0、2.3.1、tf.keras下测试通过）。\n\n**为了获得最好的体验，建议你使用Tensorflow 1.14 + Keras 2.3.1组合。**\n\n\u003Cblockquote>\u003Cstrong>关于环境组合\u003C\u002Fstrong>\n  \n- 支持tf+keras和tf+tf.keras，后者需要提前传入环境变量TF_KERAS=1。\n\n- 当使用tf+keras时，建议2.2.4 \u003C= keras \u003C= 2.3.1，以及 1.14 \u003C= tf \u003C= 2.2，不能使用tf 2.3+。\n\n- keras 2.4+可以用，但事实上keras 2.4.x基本上已经完全等价于tf.keras了，因此如果你要用keras 2.4+，倒不如直接用tf.keras。\n\u003C\u002Fblockquote>\n\n当然，乐于贡献的朋友如果发现了某些bug的话，也欢迎指出修正甚至Pull Requests～\n\n## 权重\n\n目前支持加载的权重：\n- \u003Cstrong>Google原版bert\u003C\u002Fstrong>: https:\u002F\u002Fgithub.com\u002Fgoogle-research\u002Fbert\n- \u003Cstrong>brightmart版roberta\u003C\u002Fstrong>: https:\u002F\u002Fgithub.com\u002Fbrightmart\u002Froberta_zh\n- \u003Cstrong>哈工大版roberta\u003C\u002Fstrong>: https:\u002F\u002Fgithub.com\u002Fymcui\u002FChinese-BERT-wwm\n- \u003Cstrong>Google原版albert\u003C\u002Fstrong>\u003Csup>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbojone\u002Fbert4keras\u002Fissues\u002F29#issuecomment-552188981\">[例子]\u003C\u002Fa>\u003C\u002Fsup>: https:\u002F\u002Fgithub.com\u002Fgoogle-research\u002FALBERT\n- \u003Cstrong>brightmart版albert\u003C\u002Fstrong>: https:\u002F\u002Fgithub.com\u002Fbrightmart\u002Falbert_zh\n- \u003Cstrong>转换后的albert\u003C\u002Fstrong>: https:\u002F\u002Fgithub.com\u002Fbojone\u002Falbert_zh\n- \u003Cstrong>华为的NEZHA\u003C\u002Fstrong>: https:\u002F\u002Fgithub.com\u002Fhuawei-noah\u002FPretrained-Language-Model\u002Ftree\u002Fmaster\u002FNEZHA-TensorFlow\n- \u003Cstrong>华为的NEZHA-GEN\u003C\u002Fstrong>: https:\u002F\u002Fgithub.com\u002Fhuawei-noah\u002FPretrained-Language-Model\u002Ftree\u002Fmaster\u002FNEZHA-Gen-TensorFlow\n- \u003Cstrong>自研语言模型\u003C\u002Fstrong>: https:\u002F\u002Fgithub.com\u002FZhuiyiTechnology\u002Fpretrained-models\n- \u003Cstrong>T5模型\u003C\u002Fstrong>: https:\u002F\u002Fgithub.com\u002Fgoogle-research\u002Ftext-to-text-transfer-transformer\n- \u003Cstrong>GPT_OpenAI\u003C\u002Fstrong>: https:\u002F\u002Fgithub.com\u002Fbojone\u002FCDial-GPT-tf\n- \u003Cstrong>GPT2_ML\u003C\u002Fstrong>: https:\u002F\u002Fgithub.com\u002Fimcaspar\u002Fgpt2-ml\n- \u003Cstrong>Google原版ELECTRA\u003C\u002Fstrong>: https:\u002F\u002Fgithub.com\u002Fgoogle-research\u002Felectra\n- \u003Cstrong>哈工大版ELECTRA\u003C\u002Fstrong>: https:\u002F\u002Fgithub.com\u002Fymcui\u002FChinese-ELECTRA\n- \u003Cstrong>CLUE版ELECTRA\u003C\u002Fstrong>: https:\u002F\u002Fgithub.com\u002FCLUEbenchmark\u002FELECTRA\n- \u003Cstrong>LaBSE（多国语言BERT）\u003C\u002Fstrong>: https:\u002F\u002Fgithub.com\u002Fbojone\u002Flabse\n- \u003Cstrong>Chinese-GEN项目下的模型\u003C\u002Fstrong>: https:\u002F\u002Fgithub.com\u002Fbojone\u002Fchinese-gen\n- \u003Cstrong>T5.1.1\u003C\u002Fstrong>: https:\u002F\u002Fgithub.com\u002Fgoogle-research\u002Ftext-to-text-transfer-transformer\u002Fblob\u002Fmaster\u002Freleased_checkpoints.md#t511\n- \u003Cstrong>Multilingual T5\u003C\u002Fstrong>: https:\u002F\u002Fgithub.com\u002Fgoogle-research\u002Fmultilingual-t5\u002F\n\n\u003Cstrong>注意事项\u003C\u002Fstrong>\n- 注1：brightmart版albert的开源时间早于Google版albert，这导致早期brightmart版albert的权重与Google版的不完全一致，换言之两者不能直接相互替换。为了减少代码冗余，bert4keras的0.2.4及后续版本均只支持加载\u003Cu>Google版\u003C\u002Fu>以brightmart版中\u003Cu>带Google字眼\u003C\u002Fu>的权重。如果要加载早期版本的权重，请用\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbojone\u002Fbert4keras\u002Freleases\u002Ftag\u002Fv0.2.3\">0.2.3版本\u003C\u002Fa>，或者考虑作者转换过的\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbojone\u002Falbert_zh\">albert_zh\u003C\u002Fa>。\n- 注2：下载下来的ELECTRA权重，如果没有json配置文件的话，参考\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fymcui\u002FChinese-ELECTRA\u002Fissues\u002F3\">这里\u003C\u002Fa>自己改一个（需要加上`type_vocab_size`字段）。\n\n## 更新\n- \u003Cstrong>2023.03.06\u003C\u002Fstrong>: [无穷大改np.inf；优化显存占用](https:\u002F\u002Fgithub.com\u002Fbojone\u002Fbert4keras\u002Fcommit\u002F20a46946156b4bc15ceaa00671fcd00c8b702640)。将无穷大改为np.inf，运算更加准确，而且在低精度运算时不容易出错；同时合并了若干mask算子，减少了显存占用。实测在A100上训练base和large级别模型时，速度有明显加快，显存占用也有降低。\n- \u003Cstrong>2022.03.20\u003C\u002Fstrong>: 增加[RoFormerV2](https:\u002F\u002Fkexue.fm\u002Farchives\u002F8998)。\n- \u003Cstrong>2022.02.28\u003C\u002Fstrong>: 增加[GatedAttentionUnit](https:\u002F\u002Fkexue.fm\u002Farchives\u002F8934)。\n- \u003Cstrong>2021.04.23\u003C\u002Fstrong>: 增加[GlobalPointer](https:\u002F\u002Fkexue.fm\u002Farchives\u002F8373)。\n- \u003Cstrong>2021.03.23\u003C\u002Fstrong>: 增加[RoFormer](https:\u002F\u002Fkexue.fm\u002Farchives\u002F8265)。\n- \u003Cstrong>2021.01.30\u003C\u002Fstrong>: 发布0.9.9版，完善多GPU支持，增加多GPU例子：[task_seq2seq_autotitle_multigpu.py](https:\u002F\u002Fgithub.com\u002Fbojone\u002Fbert4keras\u002Fblob\u002Fmaster\u002Fexamples\u002Ftask_seq2seq_autotitle_multigpu.py)。\n- \u003Cstrong>2020.12.29\u003C\u002Fstrong>: 增加`residual_attention_scores`参数来实现RealFormer，只需要在`build_transformer_model`中传入参数`residual_attention_scores=True`启用。\n- \u003Cstrong>2020.12.04\u003C\u002Fstrong>: `PositionEmbedding`引入层次分解，可以让BERT直接处理超长文本，在`build_transformer_model`中传入参数`hierarchical_position=True`启用。\n- \u003Cstrong>2020.11.19\u003C\u002Fstrong>: 支持GPT2模型，参考[CPM_LM_bert4keras](https:\u002F\u002Fgithub.com\u002Fbojone\u002FCPM_LM_bert4keras)项目。\n- \u003Cstrong>2020.11.14\u003C\u002Fstrong>: 新增分参数学习率`extend_with_parameter_wise_lr`，可用于给每层设置不同的学习率。\n- \u003Cstrong>2020.10.27\u003C\u002Fstrong>: 支持\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fgoogle-research\u002Ftext-to-text-transfer-transformer\u002Fblob\u002Fmaster\u002Freleased_checkpoints.md#t511\">T5.1.1\u003C\u002Fa>和\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fgoogle-research\u002Fmultilingual-t5\u002F\">Multilingual T5\u003C\u002Fa>。\n- \u003Cstrong>2020.08.28\u003C\u002Fstrong>: 支持\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbojone\u002FCDial-GPT-tf\">GPT_OpenAI\u003C\u002Fa>。\n- \u003Cstrong>2020.08.22\u003C\u002Fstrong>: 新增`WebServing`类，允许简单地将模型转换为Web接口，详情请参考该类的\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbojone\u002Fbert4keras\u002Fblob\u002F8d55512a12e4677262363ac189ebf504fc451716\u002Fbert4keras\u002Fsnippets.py#L580\">说明\u003C\u002Fa>。\n- \u003Cstrong>2020.07.14\u003C\u002Fstrong>: `Transformer`类加入`prefix`参数；`snippets.py`引入`to_array`函数；`AutoRegressiveDecoder`修改`rtype='logits'`时的一个隐藏bug。\n- \u003Cstrong>2020.06.06\u003C\u002Fstrong>: 强迫症作祟：将`Tokenizer`原来的`max_length`参数重命名为`maxlen`，同时保留向后兼容性，建议大家用新参数名。\n- \u003Cstrong>2020.04.29\u003C\u002Fstrong>: 增加重计算（参考\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbojone\u002Fkeras_recompute\">keras_recompute\u003C\u002Fa>），可以通过时间换空间，通过设置环境变量`RECOMPUTE=1`启用。\n- \u003Cstrong>2020.04.25\u003C\u002Fstrong>: 优化tf2下的表现。\n- \u003Cstrong>2020.04.16\u003C\u002Fstrong>: 所有example均适配tensorflow 2.0。\n- \u003Cstrong>2020.04.06\u003C\u002Fstrong>: 增加UniLM预训练模式（测试中）。\n- \u003Cstrong>2020.04.06\u003C\u002Fstrong>: 完善`rematch`方法。\n- \u003Cstrong>2020.04.01\u003C\u002Fstrong>: `Tokenizer`增加`rematch`方法，给出分词结果与原序列的映射关系。\n- \u003Cstrong>2020.03.30\u003C\u002Fstrong>: 尽量统一py文件的写法。\n- \u003Cstrong>2020.03.25\u003C\u002Fstrong>: 支持ELECTRA。\n- \u003Cstrong>2020.03.24\u003C\u002Fstrong>: 继续加强`DataGenerator`，允许传入迭代器时进行局部shuffle。\n- \u003Cstrong>2020.03.23\u003C\u002Fstrong>: 增加调整Attention的`key_size`的选项。\n- \u003Cstrong>2020.03.17\u003C\u002Fstrong>: 增强`DataGenerator`；优化模型写法。\n- \u003Cstrong>2020.03.15\u003C\u002Fstrong>: 支持\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fimcaspar\u002Fgpt2-ml\">GPT2_ML\u003C\u002Fa>。\n- \u003Cstrong>2020.03.10\u003C\u002Fstrong>: 支持Google的\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fgoogle-research\u002Ftext-to-text-transfer-transformer\">T5\u003C\u002Fa>模型。\n- \u003Cstrong>2020.03.05\u003C\u002Fstrong>: 将`tokenizer.py`更名为`tokenizers.py`。\n- \u003Cstrong>2020.03.05\u003C\u002Fstrong>: `application='seq2seq'`改名为`application='unilm'`。\n- \u003Cstrong>2020.03.05\u003C\u002Fstrong>: `build_bert_model`更名为`build_transformer_model`。\n- \u003Cstrong>2020.03.05\u003C\u002Fstrong>: 重写`models.py`结构。\n- \u003Cstrong>2020.03.04\u003C\u002Fstrong>: 将`bert.py`更名为`models.py`。\n- \u003Cstrong>2020.03.02\u003C\u002Fstrong>: 重构mask机制（用回Keras自带的mask机制），以便更好地编写更复杂的应用。\n- \u003Cstrong>2020.02.22\u003C\u002Fstrong>: 新增`AutoRegressiveDecoder`类，统一处理Seq2Seq的解码问题。\n- \u003Cstrong>2020.02.19\u003C\u002Fstrong>: transformer block的前缀改为Transformer（本来是Encoder），使得其含义局限性更少。\n- \u003Cstrong>2020.02.13\u003C\u002Fstrong>: 优化`load_vocab`函数；将`build_bert_model`中的`keep_words`参数更名为`keep_tokens`，此处改动可能会对部分脚本产生影响。\n- \u003Cstrong>2020.01.18\u003C\u002Fstrong>: 调整文本处理方式，去掉codecs的使用。\n- \u003Cstrong>2020.01.17\u003C\u002Fstrong>: 各api日趋稳定，为了方便大家使用，打包到\u003Ca href=\"https:\u002F\u002Fpypi.org\u002Fproject\u002Fbert4keras\u002F\">pypi\u003C\u002Fa>，首个打包版本号为0.4.6。\n- \u003Cstrong>2020.01.10\u003C\u002Fstrong>: 重写模型mask方案，某种程度上让代码更为简练清晰；后端优化。\n- \u003Cstrong>2019.12.27\u003C\u002Fstrong>: 重构预训练代码，减少冗余；目前支持RoBERTa和GPT两种预训练方式，详见\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbojone\u002Fbert4keras\u002Ftree\u002Fmaster\u002Fpretraining\u002F\">pretraining\u003C\u002Fa>。\n- \u003Cstrong>2019.12.17\u003C\u002Fstrong>: 适配华为的\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fhuawei-noah\u002FPretrained-Language-Model\u002Ftree\u002Fmaster\u002FNEZHA\">nezha\u003C\u002Fa>权重，只需要在`build_bert_model`函数里加上`model='nezha'`；此外原来albert的加载方式`albert=True`改为`model='albert'`。\n- \u003Cstrong>2019.12.16\u003C\u002Fstrong>: 通过跟keras 2.3+版本类似的思路给低版本引入层中层功能，从而恢复对低于2.3.0版本的keras的支持。\n- \u003Cstrong>2019.12.14\u003C\u002Fstrong>: 新增Conditional Layer Normalization及相关demo。\n- \u003Cstrong>2019.12.09\u003C\u002Fstrong>: 各example的data_generator规范化；修复application='lm'时的一个错误。\n- \u003Cstrong>2019.12.05\u003C\u002Fstrong>: 优化tokenizer的do_lower_case，同时微调各个example。\n- \u003Cstrong>2019.11.23\u003C\u002Fstrong>: 将train.py重命名为optimizers.py，更新大量优化器实现，全面兼容keras和tf.keras。\n- \u003Cstrong>2019.11.19\u003C\u002Fstrong>: 将utils.py重命名为tokenizer.py。\n- \u003Cstrong>2019.11.19\u003C\u002Fstrong>: 想来想去，最后还是决定把snippets放到\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbojone\u002Fbert4keras\u002Fblob\u002Fmaster\u002Fbert4keras\u002Fsnippets.py\">bert4keras.snippets\u003C\u002Fa>下面去好了。\n- \u003Cstrong>2019.11.18\u003C\u002Fstrong>: 优化预训练权重加载逻辑，增加保存模型权重至Bert的checkpoint格式方法。\n- \u003Cstrong>2019.11.17\u003C\u002Fstrong>: \u003Cdel>分离一些与Bert本身不直接相关的常用代码片段到\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbojone\u002Fpython-snippets\">python_snippets\u003C\u002Fa>，供其它项目共用。\u003C\u002Fdel>\n- \u003Cstrong>2019.11.11\u003C\u002Fstrong>: 添加NSP部分。\n- \u003Cstrong>2019.11.05\u003C\u002Fstrong>: 适配\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fgoogle-research\u002Fgoogle-research\u002Ftree\u002Fmaster\u002Falbert\">google版albert\u003C\u002Fa>，不再支持\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbrightmart\u002Falbert_zh\">非Google版albert_zh\u003C\u002Fa>。\n- \u003Cstrong>2019.11.05\u003C\u002Fstrong>: 以RoBERTa为例子的预训练代码开发完毕，同时支持TPU\u002F多GPU训练，详见\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbojone\u002Fbert4keras\u002Ftree\u002Fmaster\u002Fpretraining\u002Froberta\u002F\">roberta\u003C\u002Fa>。欢迎在此基础上构建更多的预训练代码。\n- \u003Cstrong>2019.11.01\u003C\u002Fstrong>: 逐步增加预训练相关代码，详见\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbojone\u002Fbert4keras\u002Ftree\u002Fmaster\u002Fpretraining\u002F\">pretraining\u003C\u002Fa>。\n- \u003Cstrong>2019.10.28\u003C\u002Fstrong>: 支持使用基于\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fsentencepiece\">sentencepiece\u003C\u002Fa>的tokenizer。\n- \u003Cstrong>2019.10.25\u003C\u002Fstrong>: 引入原生tokenizer。\n- \u003Cstrong>2019.10.22\u003C\u002Fstrong>: 引入梯度累积优化器。\n- \u003Cstrong>2019.10.21\u003C\u002Fstrong>: 为了简化代码结构，决定放弃keras 2.3.0之前的版本的支持，目前只支持keras 2.3.0+以及tf.keras。\n- \u003Cstrong>2019.10.20\u003C\u002Fstrong>: 应网友要求，现支持直接用`model.save`保存模型结构，用`load_model`加载整个模型（只需要在`load_model`之前执行`from bert4keras.layers import *`，不需要额外写`custom_objects`）。\n- \u003Cstrong>2019.10.09\u003C\u002Fstrong>: 已兼容tf.keras，同时在tf 1.13和tf 2.0下的tf.keras测试通过，通过设置环境变量`TF_KERAS=1`来切换tf.keras。\n- \u003Cstrong>2019.10.09\u003C\u002Fstrong>: 已兼容Keras 2.3.x，但只是临时方案，后续可能直接移除掉2.3之前版本的支持。\n- \u003Cstrong>2019.10.02\u003C\u002Fstrong>: 适配albert，能成功加载\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbrightmart\u002Falbert_zh\">albert_zh\u003C\u002Fa>的权重，只需要在`load_pretrained_model`函数里加上`albert=True`。\n\n## 背景\n之前一直用CyberZHG大佬的\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FCyberZHG\u002Fkeras-bert\">keras-bert\u003C\u002Fa>，如果纯粹只是为了在keras下对bert进行调用和fine tune来说，keras-bert已经足够能让人满意了。\n\n然而，如果想要在加载官方预训练权重的基础上，对bert的内部结构进行修改，那么keras-bert就比较难满足我们的需求了，因为keras-bert为了代码的复用性，几乎将每个小模块都封装为了一个单独的库，比如keras-bert依赖于keras-transformer，而keras-transformer依赖于keras-multi-head，keras-multi-head依赖于keras-self-attention，这样一重重依赖下去，改起来就相当头疼了。\n\n所以，我决定重新写一个keras版的bert，争取在几个文件内把它完整地实现出来，减少这些依赖性，并且保留可以加载官方预训练权重的特性。\n\n## 致谢\n感谢CyberZHG大佬实现的\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FCyberZHG\u002Fkeras-bert\">keras-bert\u003C\u002Fa>，本实现有不少地方参考了keras-bert的源码，在此衷心感谢大佬的无私奉献。\n\n## 相关\n\n[bert4torch](https:\u002F\u002Fgithub.com\u002FTongjilibo\u002Fbert4torch)：一个跟bert4keras风格很相似的pytorch-based的transofrmer库，使用pytorch的读者可以尝试。\n\n## 引用\n\n```\n@misc{bert4keras,\n  title={bert4keras},\n  author={Jianlin Su},\n  year={2020},\n  howpublished={\\url{https:\u002F\u002Fbert4keras.spaces.ac.cn}},\n}\n```","# bert4keras 快速上手指南\n\nbert4keras 是一个更清晰、更轻量级的 Keras 版 Transformer 模型库，致力于用清爽的代码实现 BERT、RoBERTa、ALBERT、T5、GPT 等模型的加载、微调及预训练。\n\n## 环境准备\n\n### 系统要求\n- **Python**: 支持 Python 2.7 及 Python 3.x\n- **TensorFlow**: 支持 TensorFlow 1.14+ 及 2.x\n- **Keras**: 支持 standalone Keras (2.2.4 - 2.3.1) 或 `tf.keras`\n\n### 推荐组合\n为了获得最佳体验和稳定性，官方推荐以下环境组合：\n- **TensorFlow 1.14 + Keras 2.3.1**\n- 若使用 TensorFlow 2.x + `tf.keras`，需设置环境变量 `TF_KERAS=1`\n\n> **注意**：若使用 Keras 2.4+，其内核已基本等价于 `tf.keras`，建议直接使用 `tf.keras` 方案。\n\n## 安装步骤\n\n### 方式一：安装稳定版（推荐）\n通过 PyPI 安装最新稳定版本：\n```shell\npip install bert4keras\n```\n*国内用户可使用清华源加速：*\n```shell\npip install bert4keras -i https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple\n```\n\n### 方式二：安装最新版（开发版）\n如需体验最新功能（如 RoFormerV2, GatedAttentionUnit 等），可直接从 GitHub 安装：\n```shell\npip install git+https:\u002F\u002Fwww.github.com\u002Fbojone\u002Fbert4keras.git\n```\n\n### 环境变量配置（仅针对 tf.keras 用户）\n如果你使用的是 TensorFlow 2.x 且希望配合 `tf.keras` 使用，请在运行代码前设置环境变量：\n```bash\nexport TF_KERAS=1\n```\n*(Windows CMD: `set TF_KERAS=1`)*\n\n## 基本使用\n\n以下示例展示如何加载 Google 原版 BERT 预训练权重并进行简单的推理。\n\n### 1. 准备配置文件和权重\n确保你已下载好 BERT 的配置文件（`bert_config.json`）和权重文件（`bert_model.ckpt`）。\n\n### 2. 代码示例\n\n```python\nfrom bert4keras.tokenizers import Tokenizer\nfrom bert4keras.models import build_transformer_model\n\n# 1. 配置路径\nconfig_path = 'path\u002Fto\u002Fbert_config.json'\ncheckpoint_path = 'path\u002Fto\u002Fbert_model.ckpt'\ndict_path = 'path\u002Fto\u002Fvocab.txt'\n\n# 2. 建立分词器\ntokenizer = Tokenizer(dict_path, do_lower_case=True)\n\n# 3. 建立模型\n# model='bert' 也可替换为 'roberta', 'albert', 'nezha', 't5', 'gpt2' 等\nmodel = build_transformer_model(\n    config_path=config_path,\n    checkpoint_path=checkpoint_path,\n    model='bert',\n    return_keras_model=False,  # 返回 keras 模型对象\n)\n\n# 4. 文本处理与预测\ntext = 'bert4keras 是一个非常轻量的工具'\ntokens = tokenizer.encode(text)[0]  # 获取 token ids\nsegment_ids = [0] * len(tokens)     # 构建 segment ids\n\n# 执行预测 (以获取最后一层隐藏状态为例)\noutput = model.predict([tokens, segment_ids])\n\nprint(output.shape)\n```\n\n### 3. 进阶提示\n- **多模型支持**：只需更改 `build_transformer_model` 中的 `model` 参数即可切换架构（如 `model='albert'`）。\n- **Seq2Seq 任务**：对于生成式任务，可结合 `AutoRegressiveDecoder` 类使用，详见项目 `examples` 目录。\n- **自定义修改**：由于代码结构扁平，你可以直接修改源码中的 Layer 定义来定制 Attention 机制或嵌入层。\n\n更多详细用例请参考官方 [examples](https:\u002F\u002Fgithub.com\u002Fbojone\u002Fbert4keras\u002Ftree\u002Fmaster\u002Fexamples) 目录。","某金融科技公司算法团队需要在 TensorFlow 1.x 环境下，快速将哈工大版的 RoBERTa 模型迁移至内部 Keras 架构中，以构建高精度的中文舆情情感分析系统。\n\n### 没有 bert4keras 时\n- **代码耦合严重**：官方原生实现多基于 PyTorch 或复杂的 TF Estimator，强行嵌入现有 Keras 项目需重写大量底层算子，维护成本极高。\n- **权重加载繁琐**：不同来源（如 brightmart、哈工大）的预训练权重格式不一，手动编写转换脚本极易出错，且难以兼容 Google 原版 BERT 结构。\n- **定制开发困难**：若需修改 Attention Mask 机制或调整 Seq2Seq 结构，往往需要深入源码修改核心逻辑，缺乏清晰的扩展接口。\n- **环境适配痛苦**：在 TensorFlow 1.14 与 Keras 2.3.1 的特定组合下，常遇到版本冲突导致的显存溢出或算子不兼容问题。\n\n### 使用 bert4keras 后\n- **无缝集成架构**：bert4keras 提供清爽的 Keras 原生实现，仅需几行代码即可加载哈工大 RoBERTa 权重并嵌入现有流水线，无需重构底层。\n- **统一权重支持**：内置对 Google BERT、哈工大 RoBERTa、NEZHA 等十余种主流模型权重的直接加载支持，自动处理格式差异，消除转换痛点。\n- **灵活定制模型**：通过清晰的代码结构，开发人员可轻松修改 Attention Mask 或添加自定义层，快速实现针对金融文本的特殊序列建模需求。\n- **性能与稳定兼得**：针对低精度运算和显存占用进行了专门优化（如合并 Mask 算子），在 A100 等显卡上训练速度显著提升且运行稳定。\n\nbert4keras 通过极简的代码设计打通了预训练模型与 Keras 生态的壁垒，让复杂模型的微调与定制变得像搭积木一样高效直观。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fbojone_bert4keras_55d0e880.png","bojone","苏剑林(Jianlin Su)","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Fbojone_451a784b.png","科学爱好者",null,"https:\u002F\u002Fkexue.fm","https:\u002F\u002Fgithub.com\u002Fbojone",[80],{"name":81,"color":82,"percentage":83},"Python","#3572A5",100,5421,922,"2026-03-30T15:49:54","Apache-2.0","未说明","非必需，但支持多 GPU 和 TPU 加速。2023 年更新提及在 A100 上测试通过，显存占用已优化，具体需求视模型大小（Base\u002FLarge）而定。",{"notes":91,"python":92,"dependencies":93},"1. 推荐最佳环境组合：TensorFlow 1.14 + Keras 2.3.1。2. 若使用 TensorFlow 2.x 配合 tf.keras，需设置环境变量 TF_KERAS=1。3. 不支持 TensorFlow 2.3+ 配合独立 Keras 包。4. 可通过设置环境变量 RECOMPUTE=1 启用重计算以节省显存。5. 支持加载多种预训练权重（BERT, RoBERTa, ALBERT, T5, GPT, ELECTRA 等）。","理论上兼容 Python 2.7 和 Python 3.x（实验环境为 Python 2.7）",[94,95,96],"tensorflow>=1.14","keras>=2.2.4, \u003C=2.3.1 (或使用 tf.keras)","numpy",[35,14],"2026-03-27T02:49:30.150509","2026-04-09T05:24:02.812310",[101,106,111,116,121,126,131],{"id":102,"question_zh":103,"answer_zh":104,"source_url":105},25752,"加载保存的模型时提示缺少自定义层（如 TokenEmbedding）怎么办？","加载模型时需要传入 custom_objects 参数来注册自定义层。可以使用 `get_bert_custom_objects()` 获取 bert4keras 所需的自定义对象，并合并其他自定义层（如 MaskedGlobalPool1D）。示例代码：\n`custom_objects = {'MaskedGlobalPool1D': MaskedGlobalPool1D}`\n`custom_objects.update(get_bert_custom_objects())`\n`model = load_model('model_dir', custom_objects=custom_objects)`。\n如果预测效果不佳，建议检查模型结构定义是否与训练时一致，或尝试升级 bert4keras 版本（如 0.2.3+）。","https:\u002F\u002Fgithub.com\u002Fbojone\u002Fbert4keras\u002Fissues\u002F25",{"id":107,"question_zh":108,"answer_zh":109,"source_url":110},25753,"如何将 Keras 的 h5 模型文件转换为 TensorFlow 的 pb 文件以便部署？","在 TensorFlow 2.0 环境下，可以直接使用 `tf.keras.models.save_model` 并指定 `save_format='tf'` 来保存为 SavedModel 格式（可转换为 pb）：\n`tf.keras.models.save_model(model, \"model_save_path\", save_format='tf')`\n注意：此方法在 TF 1.x 中不可用。转换过程中可能会出现警告，通常不影响部署。如果是 bert4keras 加载的预训练模型，同样适用此方法，但需确保环境为 TF 2.x。","https:\u002F\u002Fgithub.com\u002Fbojone\u002Fbert4keras\u002Fissues\u002F83",{"id":112,"question_zh":113,"answer_zh":114,"source_url":115},25754,"如何正确加载预训练权重并将其转换为新的检查点格式？","若需加载旧权重并保存为新格式，请按以下步骤操作：\n1. 使用 `build_transformer_model` 构建与之前完全相同的模型结构；\n2. 调用 `bert.model.load_weights('old_weights.h5')` 加载旧权重；\n3. 调用 `bert.save_weights_as_checkpoint('new_checkpoint_dir')` 保存为新的检查点格式。\n如果遇到问题，建议查阅 `bert4keras\u002Fmodels.py` 源码以理解权重加载机制。","https:\u002F\u002Fgithub.com\u002Fbojone\u002Fbert4keras\u002Fissues\u002F84",{"id":117,"question_zh":118,"answer_zh":119,"source_url":120},25755,"调用 model.save() 时出现 'TypeError: a bytes-like object is required, not str' 错误如何解决？","这是 `h5py` 库的一个已知 Bug（参考 h5py#1732）。解决方法是升级或回退 `h5py` 的版本。可以尝试执行：\n`pip install --upgrade h5py`\n或者安装特定稳定版本：\n`pip install h5py==2.10.0`\n更改版本后重新运行保存代码即可。","https:\u002F\u002Fgithub.com\u002Fbojone\u002Fbert4keras\u002Fissues\u002F246",{"id":122,"question_zh":123,"answer_zh":124,"source_url":125},25756,"如何使用多 GPU 进行训练以提高利用率？","bert4keras 支持通过 TensorFlow Strategy 进行多 GPU 训练。可以参考官方提供的多 GPU 示例代码：\n`https:\u002F\u002Fgithub.com\u002Fbojone\u002Fbert4keras\u002Fblob\u002Fmaster\u002Fexamples\u002Ftask_seq2seq_autotitle_multigpu.py`\n在使用时，需确保数据集（Dataset）的构建方式也适配多卡模式，否则可能出现只有一张显卡在计算而其他显卡仅占用显存的情况。建议使用 TF 2.2.0+ 版本以获得更好的多卡支持。","https:\u002F\u002Fgithub.com\u002Fbojone\u002Fbert4keras\u002Fissues\u002F154",{"id":127,"question_zh":128,"answer_zh":129,"source_url":130},25757,"加载 ALBERT 预训练模型时报维度不匹配错误（Layer weight shape not compatible）怎么办？","该错误通常由环境缓存、版本不兼容或模型文件损坏引起。建议采取以下措施：\n1. 删除所有已下载的 bert、bert4keras 相关缓存及模型文件（包括 albert_tiny_489k），重新下载；\n2. 确保使用的 bert4keras 版本与模型匹配，可尝试切换到稳定版本（如 v0.2.3）；\n3. 检查代码中是否正确设置了 `set_gelu('tanh')`（针对 ALBERT 模型）；\n4. 确认 config_path 和 checkpoint_path 指向的文件完整且未损坏。","https:\u002F\u002Fgithub.com\u002Fbojone\u002Fbert4keras\u002Fissues\u002F31",{"id":132,"question_zh":133,"answer_zh":134,"source_url":135},25758,"在 BERT 输出后接 Conv1D 层时提示不支持 masking 错误如何解决？","这是因为 BERT 的输出带有 mask 信息，而 Conv1D 层默认不支持 masking。解决方法是在连接 Conv1D 之前，先去除 [CLS] 和 [SEP] 标记或提取特定 token 的向量，从而切断 mask 传递。例如：\n`output = Lambda(lambda x: x[:, 0])(albert_output)` # 仅取 [CLS] 向量\n或者手动处理去掉不需要的时间步，确保输入到 Conv1D 的张量不再携带 mask 属性。","https:\u002F\u002Fgithub.com\u002Fbojone\u002Fbert4keras\u002Fissues\u002F151",[137,142,147,152,156,161,166,171,175,180,185,190,195,200,205,210,215,220,225,230],{"id":138,"version":139,"summary_zh":140,"released_at":141},163069,"v0.11.1","稳定版本v0.11.1","2022-03-22T06:40:36",{"id":143,"version":144,"summary_zh":145,"released_at":146},163070,"v0.10.8","稳定版本v0.10.8","2021-10-25T02:43:04",{"id":148,"version":149,"summary_zh":150,"released_at":151},163071,"v0.9.9","还行吧，完善了多GPU支持。","2021-01-30T03:28:58",{"id":153,"version":154,"summary_zh":76,"released_at":155},163072,"v0.9.7","2020-12-26T09:01:17",{"id":157,"version":158,"summary_zh":159,"released_at":160},163073,"v0.9.6","应该是一个兼容性比较好的版本了。","2020-12-15T10:43:05",{"id":162,"version":163,"summary_zh":164,"released_at":165},163074,"v0.9.2","稳定版本v0.9.2","2020-11-14T04:29:00",{"id":167,"version":168,"summary_zh":169,"released_at":170},163075,"v0.8.3","推荐使用版本","2020-07-17T14:38:45",{"id":172,"version":173,"summary_zh":76,"released_at":174},163076,"0.7.4","2020-04-25T14:32:49",{"id":176,"version":177,"summary_zh":178,"released_at":179},163077,"v0.6.6","2020年3月28日：调整优化器的写法。 2020年3月25日：支持ELECTRA模型。 2020年3月24日：继续强化DataGenerator，允许在传入迭代器时进行局部打乱。 2020年3月23日：增加调整Attention层key_size的选项。","2020-03-27T16:05:29",{"id":181,"version":182,"summary_zh":183,"released_at":184},163078,"v0.6.1","2020年3月17日：增强DataGenerator；优化模型写法。 2020年3月15日：支持GPT2_ML。 2020年3月10日：支持Google的T5模型。","2020-03-17T14:45:13",{"id":186,"version":187,"summary_zh":188,"released_at":189},163079,"v0.5.8","- 将tokenizer.py重命名为tokenizers.py；\n- 将application='seq2seq'改为application='unilm'；\n- 将build_bert_model重命名为build_transformer_model；\n- 重新编写models.py的结构。","2020-03-05T04:35:44",{"id":191,"version":192,"summary_zh":193,"released_at":194},163080,"v0.5.7","将bert.py重命名为models.py","2020-03-04T14:49:38",{"id":196,"version":197,"summary_zh":198,"released_at":199},163081,"v0.5.6","修复在keras \u003C 2.3时的死循环bug","2020-03-03T05:05:39",{"id":201,"version":202,"summary_zh":203,"released_at":204},163082,"v0.5.3","新增AutoRegressiveDecoder类，统一处理Seq2Seq的解码问题","2020-02-22T15:24:31",{"id":206,"version":207,"summary_zh":208,"released_at":209},163083,"v0.5.2"," transformer block的前缀改为Transformer（本来是Encoder），此处改动可能会对部分脚本产生影响。","2020-02-20T02:51:01",{"id":211,"version":212,"summary_zh":213,"released_at":214},163084,"v0.5.0","优化load_vocab函数；将build_bert_model中的keep_words参数更名为keep_tokens，此处改动可能会对部分脚本产生影响。","2020-02-13T09:51:32",{"id":216,"version":217,"summary_zh":218,"released_at":219},163085,"v0.4.9","发现codecs.open在某些情况下会出现异常，遂自定义了open函数","2020-02-05T04:33:24",{"id":221,"version":222,"summary_zh":223,"released_at":224},163086,"v0.4.6","打包发布到pypi","2020-01-17T03:16:59",{"id":226,"version":227,"summary_zh":228,"released_at":229},163087,"v0.4.3","重写模型mask方案，某种程度上让代码更为简练清晰；后端优化。","2020-01-10T16:00:38",{"id":231,"version":232,"summary_zh":233,"released_at":234},163088,"v0.4.2","兼容keras\u003C 2.3，日常代码优化。","2019-12-26T07:03:55"]