ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

spaCy 如何注册自定义架构并在训练配置中引用?

spaCy 如何注册自定义架构并在训练配置中引用? spaCy 如何注册自定义架构并在训练配置中引用【免费下载链接】spaCy Industrial-strength Natural Language Processing (NLP) in Python项目地址: https://gitcode.com/GitHub_Trending/sp/spaCy如果你用 spaCy 训练流水线时内置组件比如tagger、textcat默认附带的神经网络不满足需求你需要用自己的网络来驱动某个可训练组件。spaCy 的组件从不自己构造Model实例它只通过配置系统接收一个架构函数你用spacy.registry.architectures装饰器把自己的架构函数注册进architectures注册表在config.cfg的组件model块里用architectures按注册名引用它再用spacy train --code指向自定义代码文件即可开始训练。本文以「给tagger换上一个用 PyTorch 实现的自定义架构」为主线给出从注册、引用到训练验证的完整路径架构逻辑也可以完全用 Thinc 原生层实现原理相同。架构函数是如何被组件使用的一个**模型架构model architecture**就是一个装配 ThincModel实例的函数它描述了组件内部运行的神经网络。要替换某个组件的架构不需要子类化组件只需要更新配置让它指向另一个已注册的函数。两个关键约束组件一经创建架构就不能再改。架构是网络的配方组件从配置创建后其Model实例就已分配想换架构只能新建组件实例。类型签名决定能否拼装。Thinc 的Model是泛型类型例如Tagger期望Model[List[Doc], List[Floats2d]]每个 token 一行概率TextCategorizer期望Model[List[Doc], Floats2d]。类型不匹配时几乎肯定不兼容配置在训练开始时会被校验确认所有类型匹配正确。第一步实现并注册自定义架构函数自定义架构通常放在一个独立的 Python 文件里下文用functions.py。下面这个示例来自 spaCy 官方文档 Layers and Model Architectures实现了一个用 PyTorch 定义隐藏层、用 spaCy 的CharacterEmbed做字符嵌入的架构并用PyTorchWrapper把 PyTorch 模型包成 ThincModelfrom typing import List from thinc.types import Floats2d from thinc.api import Model, PyTorchWrapper, chain, with_array import spacy from spacy.tokens.doc import Doc from spacy.ml import CharacterEmbed from torch import nn spacy.registry.architectures(CustomTorchModel.v1) def create_torch_model( nO: int, width: int, hidden_width: int, embed_size: int, nM: int, nC: int, dropout: float, ) - Model[List[Doc], List[Floats2d]]: char_embed CharacterEmbed(width, embed_size, nM, nC) torch_model nn.Sequential( nn.Linear(width, hidden_width), nn.ReLU(), nn.Dropout2d(dropout), nn.Linear(hidden_width, nO), nn.ReLU(), nn.Dropout2d(dropout), nn.Softmax(dim1) ) wrapped_pt_model PyTorchWrapper(torch_model) model chain(char_embed, with_array(wrapped_pt_model)) return model几个要点spacy.registry.architectures(CustomTorchModel.v1)把函数注册进architecturesregistry注册名就是之后配置里引用的字符串。文档推荐给注册函数带版本号v1、v2因为架构通常会被迭代修改版本名能让引用v1的配置和引用v2的配置明确指向不同函数。函数的每个参数都会由配置以关键字参数传入。函数签名和类型标注会参与校验。如果你给参数写了默认值运行init fill-config时 spaCy 可以自动补全配置。返回值类型Model[List[Doc], List[Floats2d]]决定了它能塞进哪类组件这里是Tagger这类按 token 出分的组件。可选分支也可以完全用 Thinc 原生层Relu、Dropout、Softmax等加chain组合实现架构不依赖 PyTorch/TensorFlowThinc 层注意输出维度nO是第一个参数与 PyTorch 的in_features/out_features顺序相反。详见 Custom models with Thinc 一节。第二步在 config.cfg 中引用架构在组件的[components.name.model]块中用architectures指定注册名块内其余键值全部作为关键字参数传给架构函数[components.tagger] factory tagger [components.tagger.model] architectures CustomTorchModel.v1 nO 50 width 96 hidden_width 48 embed_size 2000 nM 64 nC 8 dropout 0.2配置会被解析成普通字典并自底向上解析、校验注册函数收到的参数会对照函数签名和类型标注检查函数返回值还可以作为另一个函数的参数例如子层配置。官方文档明确提醒最好不依赖任何隐式的默认值保证训练配置完整、实验可复现——上例就是把create_torch_model的全部 7 个参数都显式写进了配置。第三步用 --code 加载自定义代码并训练spacy train支持可选参数--code指向一个 Python 文件。该文件在训练开始前被导入你注册进函数注册表的自定义架构、函数或组件随后可被config.cfg引用$ python -m spacy train config.cfg --code functions.py训练成功启动后控制台会打印流水线信息和每个 epoch 的指标表格。下面这段来自官方文档的控制台输出示例示例结果具体数值随你的数据变化ℹ Using CPU ℹ Loading config and nlp from: config.cfg ℹ Pipeline: [tok2vec, tagger] ℹ Start training ℹ Training. Initial learn rate: 0.0 E # LOSS TOK2VEC LOSS TAGGER TAG_ACC SCORE --- ------ ------------ ----------- ------- ------ 0 0 0.00 86.20 0.22 0.00 0 200 3.08 18968.78 34.00 0.34判断训练是否走上正轨可以对照 training 文档给出的指标含义Loss 应当下降但不一定降到0TAG_ACC 这类准确率应当上升。如果在训练启动阶段配置校验失败架构名未注册、参数缺失、类型不匹配问题就出在注册文件没有随--code导入或model块里的参数与函数签名对不上。限制与打包注意事项训练产出的未打包模型是数据目录不包含自定义代码。spacy train得到的模型目录里没有functions.py的内容加载它之前必须在脚本里先导入这段自定义代码spacy.load从目录加载时不会替你导入。用spacy package打包时可以指定要随包发布的 Python 文件它们会被打进包里并在包的__init__.py中导入这样自定义架构会在加载流水线时自动注册$ python -m spacy package ./model-best ./packages --code functions.py使用 PyTorch 或 TensorFlow 模型时官方文档建议在训练配置中相应设置 GPU 内存分配器让 cupy 通过对应库分配内存避免另一库内存池有可用空间时出现 OOM[training] gpu_allocator pytorch完成以上步骤后你的组件就跑在自己注册的网络上架构名和参数在config.cfg中可审计、可复现自定义代码通过--code或打包入口随流水线走。如果要继续深入了解所有内置架构及其子层替换方式例如把tok2vec的embed子层换成spacy.CharacterEmbed.v2见 预定义架构参考 和 Swapping model architectures 一节。【免费下载链接】spaCy Industrial-strength Natural Language Processing (NLP) in Python项目地址: https://gitcode.com/GitHub_Trending/sp/spaCy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表