使用 spacy 3.0 进行预训练时出错 raw_text 到底是什么?

问题描述

在 Spacy 管道中预训练自定义权重会出错。

当我使用 jupyter notebook 运行它时:

!python -m spacy pretrain config.cfg ./output_pretrain --paths.raw_text ./data.jsonl

出现以下错误

[i] Using cpu
[i] Loading config from: config.cfg
[x] Error parsing config overrides
paths -> raw_text   not a section value that can be overwritten

我的环境

  • 操作系统:Windows 10.0.19041
  • 使用的 Python 版本:3.8.8
  • 使用的 spaCy 版本:3.0.5

解决方法

spacy pretrain 命令的工作方式是这样的:您为其提供一个 config 文件和一个输出目录。或者,您可以在命令行上覆盖配置文件中的某些设置。例如,如果您的配置文件将包含此块:

[paths]
train = null
dev = null
raw_text = "path/to/toy_data"

然后在命令行上,您可以执行 --raw_text="path/to/production_data" 来更改该特定值。

现在,您收到此错误消息似乎是因为您在 raw_text 块中没有条目 paths,因此您无法覆盖它。

事实上,我想知道您是否在配置文件中定义了 pretraining 块? 如果没有 - 看看 spacy init config。您可以为它提供选项 -pt,该选项将填充 pretraining step 的默认值,特别是它会创建如下内容(在其他“正常”设置中):

[paths]
raw_text = null
...

[pretraining]
max_epochs = 1000
dropout = 0.2
n_save_every = null
component = "tok2vec"
layer = ""
corpus = "corpora.pretrain"

[pretraining.batcher]
@batchers = "spacy.batch_by_words.v1"
size = 3000
discard_oversize = false
tolerance = 0.2
get_length = null

[pretraining.objective]
@architectures = "spacy.PretrainCharacters.v1"
maxout_pieces = 3
hidden_size = 300
n_characters = 4

[pretraining.optimizer]
@optimizers = "Adam.v1"
beta1 = 0.9
beta2 = 0.999
L2_is_weight_decay = true
L2 = 0.01
grad_clip = 1.0
use_averages = true
eps = 0.00000001
learn_rate = 0.001
...

[corpora.pretrain]
@readers = "spacy.JsonlCorpus.v1"
path = ${paths.raw_text}
min_length = 5
max_length = 500
limit = 0

注意 raw_text 变量是如何被语料库阅读器使用的,它将为您的预训练步骤流式传输原始文本。因此,在运行预训练之前,您需要确保所有这些都正确连接。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...