diff --git a/chapters/ar/chapter0/1.mdx b/chapters/ar/chapter0/1.mdx index 7951b9d94..8cec15b6e 100644 --- a/chapters/ar/chapter0/1.mdx +++ b/chapters/ar/chapter0/1.mdx @@ -105,7 +105,7 @@ ls -a source .env/bin/activate # Deactivate the virtual environment -source .env/bin/deactivate +deactivate ```
diff --git a/chapters/bn/chapter0/1.mdx b/chapters/bn/chapter0/1.mdx index ab323044e..9235ad8a3 100644 --- a/chapters/bn/chapter0/1.mdx +++ b/chapters/bn/chapter0/1.mdx @@ -87,7 +87,7 @@ ls -a source .env/bin/activate # virtual environment টি deactivate করার কমান্ড -source .env/bin/deactivate +deactivate ``` `which python` কমান্ড চালিয়ে নিশ্চিত করতে পারেন যে virtual environment টি activate হয়েছে কিনা। diff --git a/chapters/de/chapter0/1.mdx b/chapters/de/chapter0/1.mdx index 9d1610de4..9b9fd8805 100644 --- a/chapters/de/chapter0/1.mdx +++ b/chapters/de/chapter0/1.mdx @@ -86,7 +86,7 @@ Mit den Skripten "activate" und "deactivate" kannst du in deine virtuelle Umgebu source .env/bin/activate # Deaktivieren der virtuellen Umgebung -source .env/bin/deactivate +deactivate ``` Du kannst dich vergewissern, dass die Umgebung aktiviert ist, indem du den Befehl `which python` ausführst: Wenn er auf die virtuelle Umgebung verweist, dann hast du sie erfolgreich aktiviert! diff --git a/chapters/en/chapter0/1.mdx b/chapters/en/chapter0/1.mdx index 0f8bac262..40e21bf91 100644 --- a/chapters/en/chapter0/1.mdx +++ b/chapters/en/chapter0/1.mdx @@ -86,7 +86,7 @@ You can jump in and out of your virtual environment with the `activate` and `dea source .env/bin/activate # Deactivate the virtual environment -source .env/bin/deactivate +deactivate ``` You can make sure that the environment is activated by running the `which python` command: if it points to the virtual environment, then you have successfully activated it! diff --git a/chapters/en/chapter7/6.mdx b/chapters/en/chapter7/6.mdx index 6c6418c75..44551f15d 100644 --- a/chapters/en/chapter7/6.mdx +++ b/chapters/en/chapter7/6.mdx @@ -383,13 +383,13 @@ Now we can use the `prepare_tf_dataset()` method to convert our datasets to Tens ```python tf_train_dataset = model.prepare_tf_dataset( - tokenized_dataset["train"], + tokenized_datasets["train"], collate_fn=data_collator, shuffle=True, batch_size=32, ) tf_eval_dataset = model.prepare_tf_dataset( - tokenized_dataset["valid"], + tokenized_datasets["valid"], collate_fn=data_collator, shuffle=False, batch_size=32, @@ -726,9 +726,9 @@ Let's start with the dataloaders. We only need to set the dataset's format to `" ```py from torch.utils.data.dataloader import DataLoader -tokenized_dataset.set_format("torch") -train_dataloader = DataLoader(tokenized_dataset["train"], batch_size=32, shuffle=True) -eval_dataloader = DataLoader(tokenized_dataset["valid"], batch_size=32) +tokenized_datasets.set_format("torch") +train_dataloader = DataLoader(tokenized_datasets["train"], batch_size=32, shuffle=True) +eval_dataloader = DataLoader(tokenized_datasets["valid"], batch_size=32) ``` Next, we group the parameters so that the optimizer knows which ones will get an additional weight decay. Usually, all bias and LayerNorm weights terms are exempt from this; here's how we can do this: diff --git a/chapters/es/chapter0/1.mdx b/chapters/es/chapter0/1.mdx index 47b77485a..cf5aab097 100644 --- a/chapters/es/chapter0/1.mdx +++ b/chapters/es/chapter0/1.mdx @@ -86,7 +86,7 @@ Puedes entrar y salir de tu entorno virtual con los scripts `activate` y `deacti source .env/bin/activate # Desactiva el entorno virtual -source .env/bin/deactivate +deactivate ``` Puedes asegurarte de que el entorno está activado ejecutando el comando `which python`: si apunta al entorno virtual, entonces lo has activado con éxito. diff --git a/chapters/fa/chapter0/1.mdx b/chapters/fa/chapter0/1.mdx index d46295940..9f9cd475f 100644 --- a/chapters/fa/chapter0/1.mdx +++ b/chapters/fa/chapter0/1.mdx @@ -115,7 +115,7 @@ source .env/bin/activate \# Deactivate the virtual environment - source .env/bin/deactivate + deactivate ```
diff --git a/chapters/fr/chapter0/1.mdx b/chapters/fr/chapter0/1.mdx index 47bfa9809..e47bd6044 100644 --- a/chapters/fr/chapter0/1.mdx +++ b/chapters/fr/chapter0/1.mdx @@ -86,7 +86,7 @@ Vous pouvez entrer et sortir de votre environnement virtuel avec les scripts `ac source .env/bin/activate # Deactivate the virtual environment -source .env/bin/deactivate +deactivate ``` Vous pouvez vous assurer que l'environnement est activé en exécutant la commande `which python` : si elle pointe vers l'environnement virtuel, alors vous l'avez activé avec succès ! diff --git a/chapters/gj/chapter0/1.mdx b/chapters/gj/chapter0/1.mdx index de32bfdb2..c62b588e1 100644 --- a/chapters/gj/chapter0/1.mdx +++ b/chapters/gj/chapter0/1.mdx @@ -86,7 +86,7 @@ ls -a source .env/bin/activate # Deactivate the virtual environment -source .env/bin/deactivate +deactivate ``` જો તમે verify કરવા માંગતા હોવ તો `which python` command run કરો. એ તમરા virtual environment ના ફોલ્ડર ને આઉટપુટ માં આપશે. આ એવું સાબિત કરે છે કે virtual environment સફળાપૂર્વક active છે.! diff --git a/chapters/he/chapter0/1.mdx b/chapters/he/chapter0/1.mdx index 9d9861223..ffc29378e 100644 --- a/chapters/he/chapter0/1.mdx +++ b/chapters/he/chapter0/1.mdx @@ -108,7 +108,7 @@ ls -a source .env/bin/activate # Deactivate the virtual environment -source .env/bin/deactivate +deactivate ``` diff --git a/chapters/hi/chapter0/1.mdx b/chapters/hi/chapter0/1.mdx index 6a9490ee0..9af4ab08d 100644 --- a/chapters/hi/chapter0/1.mdx +++ b/chapters/hi/chapter0/1.mdx @@ -86,7 +86,7 @@ ls -a source .env/bin/activate # Deactivate the virtual environment -source .env/bin/deactivate +deactivate ``` आप यह सुनिश्चित कर सकते हैं कि `which python` आदेश चलाकर कौन सा पर्यावरण सक्रिय है: यदि यह आभासी वातावरण की ओर इशारा करता है, तो आपने इसे सफलतापूर्वक सक्रिय कर दिया है! diff --git a/chapters/id/chapter0/1.mdx b/chapters/id/chapter0/1.mdx index 0f49326d9..b8efdcaa9 100644 --- a/chapters/id/chapter0/1.mdx +++ b/chapters/id/chapter0/1.mdx @@ -86,7 +86,7 @@ Instruksi dibawah adalah instruksi untuk mengaktifkan dan menonaktifkan _virtual source .env/bin/activate # Menonaktifkan virtual environment -source .env/bin/deactivate +deactivate ``` Anda bisa memastikan bahwa anda menggunakan Python versi _virtual environment_ dengan mengeksekusi `which python` di terminal: jika balasan terminal adalah Python di dalam folder *.env*, maka _virtual environment_ anda sudah aktif! diff --git a/chapters/it/chapter0/1.mdx b/chapters/it/chapter0/1.mdx index 844edc4f1..ac48cd479 100644 --- a/chapters/it/chapter0/1.mdx +++ b/chapters/it/chapter0/1.mdx @@ -86,7 +86,7 @@ Puoi entrare e uscire dall'ambiente virtuale utilizzando gli script `activate` e source .env/bin/activate # Deactivate the virtual environment -source .env/bin/deactivate +deactivate ``` Assicurati che l'ambiente sia configurato correttamente eseguendo il comando `which python`: se come risposta ottieni l'ambiente virtuale, significa che l'hai attivato bene! diff --git a/chapters/ja/chapter0/1.mdx b/chapters/ja/chapter0/1.mdx index fea5d0d10..83b678d0b 100644 --- a/chapters/ja/chapter0/1.mdx +++ b/chapters/ja/chapter0/1.mdx @@ -86,7 +86,7 @@ ls -a source .env/bin/activate # Deactivate the virtual environment -source .env/bin/deactivate +deactivate ``` 仮想環境が有効になっているかどうかは、`which python`というコマンドを実行することで確認することができます。もし以下のように仮想環境であることを示していれば、正常に有効化できています! diff --git a/chapters/ko/chapter0/1.mdx b/chapters/ko/chapter0/1.mdx index 0a8dd7735..90aa72de2 100644 --- a/chapters/ko/chapter0/1.mdx +++ b/chapters/ko/chapter0/1.mdx @@ -86,7 +86,7 @@ ls -a source .env/bin/activate # Deactivate the virtual environment -source .env/bin/deactivate +deactivate ``` 환경이 제대로 활성화 되었는지 `which python` 명령어를 실행하여 확인해 봅시다. 아래와 같이 가상 환경을 보여준다면 제대로 활성화가 것입니다! diff --git a/chapters/ko/chapter1/9.mdx b/chapters/ko/chapter1/9.mdx index 9fee845cc..1eff01f0d 100644 --- a/chapters/ko/chapter1/9.mdx +++ b/chapters/ko/chapter1/9.mdx @@ -13,4 +13,4 @@ | --- | --- | --- | | 인코더 | ALBERT, BERT, DistilBERT, ELECTRA, RoBERTa | 문장 분류, 개체명 인식, 추출 질의 응답 | | 디코더 | CTRL, GPT, GPT-2, Transformer XL | 텍스트 생성 | -| 인코더-디코더 | BART, T5, Marian, mBART | 오약, 번역, 생성 질의 응답 | \ No newline at end of file +| 인코더-디코더 | BART, T5, Marian, mBART | 요약, 번역, 생성 질의 응답 | diff --git a/chapters/ko/chapter2/2.mdx b/chapters/ko/chapter2/2.mdx index 3f246f672..7468ea435 100644 --- a/chapters/ko/chapter2/2.mdx +++ b/chapters/ko/chapter2/2.mdx @@ -60,7 +60,7 @@ classifier( -각 단게에 대해 빠르게 살펴보겠습니다. +각 단계에 대해 빠르게 살펴보겠습니다. ## 토크나이저를 이용한 전처리[[preprocessing-with-a-tokenizer]] diff --git a/chapters/pt/chapter0/1.mdx b/chapters/pt/chapter0/1.mdx index c0fd3cc96..1476cd56d 100644 --- a/chapters/pt/chapter0/1.mdx +++ b/chapters/pt/chapter0/1.mdx @@ -87,7 +87,7 @@ Você pode acessar e sair do seu ambiente virtual com os scripts `activate` e `d source .env/bin/activate # Deactivate the virtual environment -source .env/bin/deactivate +deactivate ``` Você pode ter certeza que seu ambiente virtual está ativado rodando o comando `which python`: se ele apontar para o ambiente virtual, então você conseguiu ativa-lo com sucesso! diff --git a/chapters/ru/chapter0/1.mdx b/chapters/ru/chapter0/1.mdx index 72fce3460..f2f9f5215 100644 --- a/chapters/ru/chapter0/1.mdx +++ b/chapters/ru/chapter0/1.mdx @@ -85,7 +85,7 @@ ls -a source .env/bin/activate # Деактивировать окружение -source .env/bin/deactivate +deactivate ``` Вы можете убедиться, что окружение активировано с помощью команды `which python`: если ее результат указывает на виртуальное окружение, значит, вы успешно активировали его! diff --git a/chapters/th/chapter0/1.mdx b/chapters/th/chapter0/1.mdx index 126c706be..f4f3e2304 100644 --- a/chapters/th/chapter0/1.mdx +++ b/chapters/th/chapter0/1.mdx @@ -88,7 +88,7 @@ ls -a source .env/bin/activate # Deactivate the virtual environment -source .env/bin/deactivate +deactivate ``` คุณสามารถตรวจสอบได้ว่า คุณอยู่ใน environment ใดได้ด้วยคำสั่ง `which python` ระบบจะแสดงผล environment ที่คุณกำลังใช้งานอยู่ diff --git a/chapters/tr/chapter0/1.mdx b/chapters/tr/chapter0/1.mdx index 54ffbbd66..eb9e9c49c 100644 --- a/chapters/tr/chapter0/1.mdx +++ b/chapters/tr/chapter0/1.mdx @@ -86,7 +86,7 @@ ls -a source .env/bin/activate # Deactivate the virtual environment -source .env/bin/deactivate +deactivate ``` `which python` komutunu kullanarak hangi Python kurulumunda olduğunuzu öğrenebilirsiniz: Eğer sanal ortamı gösteriyorsa sizi tebrik ederim başarıyla sanal ortam kurmuşsunuz demektir! diff --git a/chapters/vi/chapter0/1.mdx b/chapters/vi/chapter0/1.mdx index 6dbefb5ca..256b82c4c 100644 --- a/chapters/vi/chapter0/1.mdx +++ b/chapters/vi/chapter0/1.mdx @@ -94,7 +94,7 @@ Bạn có thể vào và thoát ra khỏi môi trường ảo của mình bằng source .env/bin/activate # Huỷ kích hoạt môi trường ảo -source .env/bin/deactivate +deactivate ``` Bạn có thể đảm bảo rằng môi trường đã được kích hoạt bằng cách chạy lệnh `which python`: nếu nó trỏ đến môi trường ảo thì bạn đã kích hoạt nó thành công! diff --git a/chapters/zh-CN/_toctree.yml b/chapters/zh-CN/_toctree.yml index 08335aaf7..0ce25e361 100644 --- a/chapters/zh-CN/_toctree.yml +++ b/chapters/zh-CN/_toctree.yml @@ -57,7 +57,7 @@ title: 使用 Trainer API 或者 Keras 微调一个模型 local_fw: { pt: chapter3/3, tf: chapter3/3_tf } - local: chapter3/4 - title: 一个完成的训练过程 + title: 一个完整的训练过程 - local: chapter3/5 title: 微调,章节回顾! - local: chapter3/6 diff --git a/chapters/zh-CN/chapter0/1.mdx b/chapters/zh-CN/chapter0/1.mdx index 45af8dfc9..8bac2386f 100644 --- a/chapters/zh-CN/chapter0/1.mdx +++ b/chapters/zh-CN/chapter0/1.mdx @@ -1,6 +1,6 @@ # 课程简介 [[课程简介]] -欢迎来到拥抱脸课程!本介绍将指导您设置工作环境。如果您刚开始学习本课程,我们建议您先阅读[第一章](/course/chapter1), 然后再回来设置您的环境,以便您可以自己尝试运行代码。 +欢迎来到Hugging Face课程!本介绍将指导您设置工作环境。如果您刚开始学习本课程,我们建议您先阅读[第一章](/course/chapter1), 然后再回来设置您的环境,以便您可以自己尝试运行代码。 我们将在本课程中使用的所有库都以 Python 包的形式提供,因此在这里我们将向您展示如何设置 Python 环境并安装您需要的特定库。 @@ -50,9 +50,9 @@ import transformers 如果您更喜欢使用 Python 虚拟环境,那么第一步是在您的系统上安装 Python。我们建议您按照[这个教程](https://realpython.com/installing-python/)进行配置。 -安装 Python 后,您应该能够在终端中运行 Python 命令。您可以先运行以下命令来检验爱装是否正确,然后再继续下一步:**python --version**。这应该会打印出您系统上现在可用的 Python 版本。 +安装 Python 后,您应该能够在终端中运行 Python 命令。您可以先运行以下命令来检验爱装是否正确,然后再继续下一步:`python --version`。这应该会打印出您系统上现在可用的 Python 版本。 -在终端中运行 Python 命令(例如 **python --version**)时,您应该将运行命令的这个Python视为系统上的“默认”Python。我们建议保持这个默认的Python安装程序没有任何包,当运行某个程序的时候就为那个程序创建一个单独的运行环境 - 这样,每个应用程序都可以有自己的依赖项和包,您无需担心与其他应用程序潜在的兼容性问题。 +在终端中运行 Python 命令(例如 `python --version`)时,您应该将运行命令的这个Python视为系统上的“默认”Python。我们建议保持这个默认的Python安装程序没有任何包,当运行某个程序的时候就为那个程序创建一个单独的运行环境 - 这样,每个应用程序都可以有自己的依赖项和包,您无需担心与其他应用程序潜在的兼容性问题。 在 Python 中,这是通过 [*虚拟环境*](https://docs.python.org/3/tutorial/venv.html)实现的,虚拟环境会创建许多目录树,每个目录树都包含具有特定 Python 版本的 Python 安装以及应用程序所需的所有包。可以使用许多不同的工具来创建这样的虚拟环境,但在此我们将使用官方 Python 包:[`venv`](https://docs.python.org/3/library/venv.html#module-venv). @@ -86,7 +86,7 @@ ls -a source .env/bin/activate # Deactivate the virtual environment -source .env/bin/deactivate +deactivate ``` 您可以通过运行 `which python` 命令来检测虚拟环境是否被激活:如果它指向虚拟环境,那么您已经成功激活了它! diff --git a/chapters/zh-CN/chapter1/1.mdx b/chapters/zh-CN/chapter1/1.mdx index 18d638949..1300aa63b 100644 --- a/chapters/zh-CN/chapter1/1.mdx +++ b/chapters/zh-CN/chapter1/1.mdx @@ -68,14 +68,14 @@ - **如果我有问题,我可以在哪里提问?** 如果您对课程的任何部分有疑问,只需单击页面顶部的“*提问*”横幅,系统就会自动重定向到 [Hugging Face 论坛](https:// discuss.huggingface.co/): -拥抱脸论坛链接 +Hugging Face论坛链接 请注意,如果您想在完成课程后进行更多练习,论坛上还提供了[项目灵感](https://discuss.huggingface.co/c/course/course-event/25) 列表。 - **我在哪里可以获得课程的代码?** 对于每个部分,单击页面顶部的横幅可以在 Google Colab 或 Amazon SageMaker Studio Lab 中运行代码: -拥抱脸课程笔记本链接 +Hugging Face课程笔记本链接 包含课程所有代码的 Jupyter 笔记本托管在 [`huggingface/notebooks`](https://github.com/huggingface/notebooks) 仓库中。 如果您希望在本地生成它们,请查看 GitHub 上 [`course`](https://github.com/huggingface/course#-jupyter-notebooks) 仓库中的说明。 diff --git a/chapters/zh-CN/chapter1/3.mdx b/chapters/zh-CN/chapter1/3.mdx index 917ff91db..119f15600 100644 --- a/chapters/zh-CN/chapter1/3.mdx +++ b/chapters/zh-CN/chapter1/3.mdx @@ -17,7 +17,8 @@ ## Transformer被应用于各个方面! [[Transformer被应用于各个方面!]] Transformer 模型用于解决各种 NLP 任务,就像上一节中提到的那样。以下是一些使用 Hugging Face 和 Transformer 模型的公司和组织,他们也通过分享他们的模型回馈社区: -![使用 Hugging Face 的公司](https://huggingface.co/course/static/chapter1/companies.PNG) +使用 Hugging Face 的公司 + [🤗 Transformers 库](https://github.com/huggingface/transformers)提供了创建和使用这些共享模型的功能。[模型中心(hub)](https://huggingface.co/models)包含数千个任何人都可以下载和使用的预训练模型。您还可以将自己的模型上传到 Hub! @@ -65,15 +66,15 @@ classifier( 目前[可用的一些pipeline](https://huggingface.co/transformers/main_classes/pipelines.html)是: -* **特征提取**(获取文本的向量表示) -* **填充空缺** -* **ner**(命名实体识别) -* **问答** -* **情感分析** -* **文本摘要** -* **文本生成** -* **翻译** -* **零样本分类** +* `feature-extraction`(获取文本的向量表示) +* `fill-mask` +* `ner`(命名实体识别) +* `question-answering` +* `sentiment-analysis` +* `summarization` +* `text-generation` +* `translation` +* `zero-shot-classification` 让我们来看看其中的一些吧! @@ -97,7 +98,7 @@ classifier( 此pipeline称为zero-shot,因为您不需要对数据上的模型进行微调即可使用它。它可以直接返回您想要的任何标签列表的概率分数! -✏️**快来试试吧!**使用您自己的序列和标签,看看模型的行为。 +✏️**快来试试吧!** 使用您自己的序列和标签,看看模型的行为。 ## 文本生成 [[文本生成]] @@ -119,7 +120,7 @@ generator("In this course, we will teach you how to") 您可以使用参数 **num_return_sequences** 控制生成多少个不同的序列,并使用参数 **max_length** 控制输出文本的总长度。 -✏️**快来试试吧!**使用 num_return_sequences 和 max_length 参数生成两个句子,每个句子 15 个单词。 +✏️**快来试试吧!** 使用 num_return_sequences 和 max_length 参数生成两个句子,每个句子 15 个单词。 ## 在pipeline中使用 Hub 中的其他模型 [[在pipeline中使用 Hub 中的其他模型]] @@ -148,7 +149,7 @@ generator( 通过单击选择模型后,您会看到有一个小组件,可让您直接在线试用。通过这种方式,您可以在下载之前快速测试模型的功能。 -✏️**快来试试吧!**使用标签筛选查找另一种语言的文本生成模型。使用小组件测试并在pipeline中使用它! +✏️**快来试试吧!** 使用标签筛选查找另一种语言的文本生成模型。使用小组件测试并在pipeline中使用它! ## 推理 API [[推理 API]] @@ -177,7 +178,7 @@ unmasker("This course will teach you all about models.", top_k=2) **top_k** 参数控制要显示的结果有多少种。请注意,这里模型填充了特殊的< **mask** >词,它通常被称为掩码标记。其他掩码填充模型可能有不同的掩码标记,因此在探索其他模型时要验证正确的掩码字是什么。检查它的一种方法是查看小组件中使用的掩码。 -✏️**快来试试吧!**在 Hub 上搜索基于 bert 的模型并在推理 API 小组件中找到它的掩码。这个模型对上面pipeline示例中的句子预测了什么? +✏️**快来试试吧!** 在 Hub 上搜索基于 bert 的模型并在推理 API 小组件中找到它的掩码。这个模型对上面pipeline示例中的句子预测了什么? ## 命名实体识别 [[命名实体识别]] @@ -199,7 +200,7 @@ ner("My name is Sylvain and I work at Hugging Face in Brooklyn.") 我们在pipeline创建函数中传递选项 **grouped_entities=True** 以告诉pipeline将对应于同一实体的句子部分重新组合在一起:这里模型正确地将“Hugging”和“Face”分组为一个组织,即使名称由多个词组成。事实上,正如我们即将在下一章看到的,预处理甚至会将一些单词分成更小的部分。例如,**Sylvain** 分割为了四部分:**S、##yl、##va** 和 **##in**。在后处理步骤中,pipeline成功地重新组合了这些部分。 -✏️**快来试试吧!**在模型中心(hub)搜索能够用英语进行词性标注(通常缩写为 POS)的模型。这个模型对上面例子中的句子预测了什么? +✏️**快来试试吧!** 在模型中心(hub)搜索能够用英语进行词性标注(通常缩写为 POS)的模型。这个模型对上面例子中的句子预测了什么? ## 问答系统 [[问答系统]] @@ -280,7 +281,7 @@ translator("Ce cours est produit par Hugging Face.") -✏️**快来试试吧!**搜索其他语言的翻译模型,尝试将前一句翻译成几种不同的语言。 +✏️**快来试试吧!** 搜索其他语言的翻译模型,尝试将前一句翻译成几种不同的语言。 diff --git a/chapters/zh-CN/chapter2/1.mdx b/chapters/zh-CN/chapter2/1.mdx index e68a74f0d..4f7f407bc 100644 --- a/chapters/zh-CN/chapter2/1.mdx +++ b/chapters/zh-CN/chapter2/1.mdx @@ -9,15 +9,14 @@ 创建🤗 Transformers库就是为了解决这个问题。它的目标是提供一个API,通过它可以加载、训练和保存任何Transformer模型。这个库的主要特点是: - **易于使用**:下载、加载和使用最先进的NLP模型进行推理只需两行代码即可完成。 -- **灵活**:所有型号的核心都是简单的PyTorch **nn.Module** 或者 TensorFlow **tf.kears.Model**,可以像它们各自的机器学习(ML)框架中的任何其他模型一样进行处理。 -- **简单**:当前位置整个库几乎没有任何摘要。“都在一个文件中”是一个核心概念:模型的正向传递完全定义在一个文件中,因此代码本身是可以理解的,并且是可以破解的。 +- **灵活**:所有模型的核心都是简单的PyTorch **nn.Module** 或者 TensorFlow **tf.kears.Model**类,可以像在其各自的机器学习 (ML) 框架中的任何其他模型一样方便地进行处理。 +- **简单**:库中几乎没有任何抽象。 “All in one file”(所有代码在一个文件中)是一个核心概念:模型的前向传播完全定义在一个文件中,因此代码本身易于理解和修改 -最后一个特性使🤗 Transformers与其他ML库截然不同。这些模型不是基于通过文件共享的模块构建的;相反,每一个模型都有自己的菜单。除了使模型更加容易接受和更容易理解,这还允许你轻松地在一个模型上实验,而且不影响其他模型。 +最后一个特性使🤗 Transformers与其他ML库截然不同。这些模型不是基于通过文件共享的模块构建的;相反,每一个模型都有自己的网络结构(layers)。除了使模型更加容易接受和更容易理解,这还允许你轻松地在一个模型上实验,而且不影响其他模型。 -本章将从一个端到端的示例开始,在该示例中,我们一起使用模型和tokenizer分词器来复制[Chapter 1](/course/chapter1)中引入的函数pipeline(). 接下来,我们将讨论模型API:我们将深入研究模型和配置类,并向您展示如何加载模型以及如何将数值输入处理为输出预测。 - -然后我们来看看标记器API,它是pipeline()函数的另一个主要组件。它是作用分词器负责第一个和最后一个处理步骤,处理从文本到神经网络数字输入的转换,以及在需要时转换回文本。最后,我们将向您展示如何处理在一个准备好的批处理中通过一个模型发送多个句子的问题,然后详细介绍pipeline()函数。 +本章将从一个端到端的示例开始,在该示例中,我们一起使用模型和*tokenizer*分词器来复制[Chapter 1](/course/chapter1)中引入的函数`pipeline()`. 接下来,我们将讨论模型API:我们将深入研究模型和配置类,并向您展示如何加载模型以及如何将数值输入处理为输出预测。 +接下来,我们将介绍 *tokenizer* API,它是 `pipeline()` 函数的另一个主要组件。*tokenizer* 负责第一个和最后一个处理步骤,处理从文本到神经网络数值输入的转换,以及在需要时将数值转换回文本。最后,我们将向您展示如何处理将多个句子作为一个准备好的批次发送到模型中,然后通过更深入地了解高级 `tokenizer()` 函数来总结所有内容。 -⚠️ 为了从模型集线器和🤗Transformers的所有可用功能中获益,我们建议creating an account. +⚠️ 为了从Model Hub和🤗Transformers的所有可用功能中获益,我们建议创建帐户. \ No newline at end of file diff --git a/chapters/zh-CN/chapter2/2.mdx b/chapters/zh-CN/chapter2/2.mdx index bebc97b26..c0242bb79 100644 --- a/chapters/zh-CN/chapter2/2.mdx +++ b/chapters/zh-CN/chapter2/2.mdx @@ -53,7 +53,7 @@ classifier( {'label': 'NEGATIVE', 'score': 0.9994558095932007}] ``` -正如我们在[Chapter 1](/course/chapter1)中看到的,此管道将三个步骤组合在一起:预处理、通过模型传递输入和后处理: +正如我们在[Chapter 1](/course/chapter1)中看到的,这个 pipeline 集成了三个步骤:预处理、模型推理和后处理:
The full NLP pipeline: tokenization of text, conversion to IDs, and inference through the Transformer model and the model head. @@ -64,15 +64,19 @@ classifier( ## 使用分词器进行预处理 [[使用分词器进行预处理]] -与其他神经网络一样,Transformer模型无法直接处理原始文本, 因此我们管道的第一步是将文本输入转换为模型能够理解的数字。 为此,我们使用*tokenizer*(标记器),负责: +与其他神经网络一样,Transformer模型无法直接处理原始文本, 因此pipeline的第一步是将文本输入转换为模型能够理解的数字。 为此,我们使用*tokenizer*(分词器),负责: - 将输入拆分为单词、子单词或符号(如标点符号),称为标记(*token*) - 将每个标记(token)映射到一个整数 -- 添加可能对模型有用的其他输入 +- 添加其他可能对模型有用的输入:例如,位置编码等信息。 +- - 位置编码:指示每个词元在句子中的位置。 +- - 段落标记:区分不同段落的文本。 +- - 特殊标记:例如 [CLS] 和 [SEP] 标记,用于标识句子的开头和结尾。 -所有这些预处理都需要以与模型预训练时完全相同的方式完成,因此我们首先需要从[Model Hub](https://huggingface.co/models)中下载这些信息。为此,我们使用`AutoTokenizer`类及其`from_pretrained()`方法。使用我们模型的检查点名称,它将自动获取与模型的标记器相关联的数据,并对其进行缓存(因此只有在您第一次运行下面的代码时才会下载)。 -因为`sentiment-analysis`(情绪分析)管道的默认检查点是`distilbert-base-uncased-finetuned-sst-2-english`(你可以看到它的模型卡[here](https://huggingface.co/distilbert-base-uncased-finetuned-sst-2-english)),我们运行以下程序: +所有预处理都需要以与模型预训练时完全相同的方式完成(保持分词方式的一致性非常重要,可以确保模型的性能和准确性),因此我们首先需要从[Model Hub](https://huggingface.co/models)中下载这些信息。为此,我们使用`AutoTokenizer`类及其`from_pretrained()`方法。使用我们模型的检查点名称,它将自动获取与模型的标记器相关联的数据,并对其进行缓存(因此只有在您第一次运行下面的代码时才会下载)。 + +因为`sentiment-analysis`(情绪分析)Pipeline的默认检查点是`distilbert-base-uncased-finetuned-sst-2-english`(你可以看到它的模型介绍页[here](https://huggingface.co/distilbert-base-uncased-finetuned-sst-2-english)),我们运行以下程序: ```python from transformers import AutoTokenizer @@ -81,9 +85,9 @@ checkpoint = "distilbert-base-uncased-finetuned-sst-2-english" tokenizer = AutoTokenizer.from_pretrained(checkpoint) ``` -一旦我们有了标记器,我们就可以直接将我们的句子传递给它,然后我们就会得到一本字典,它可以提供给我们的模型!剩下要做的唯一一件事就是将输入ID列表转换为张量。 +一旦我们有了tokenizer,就可以直接将句子传递给它,然后我们会得到一个字典,它包含了可以输入到模型的数据。接下来,我们只需要将输入 ID 列表转换为张量即可。 -您可以使用🤗 Transformers,而不必担心哪个ML框架被用作后端;它可能是PyTorch或TensorFlow,或Flax。但是,Transformers型号只接受*张量*作为输入。如果这是你第一次听说张量,你可以把它们想象成NumPy数组。NumPy数组可以是标量(0D)、向量(1D)、矩阵(2D)或具有更多维度。它实际上是张量;其他ML框架的张量行为类似,通常与NumPy数组一样易于实例化。 +使用 🤗 Transformers 时,您无需担心它背后的机器学习框架,它可以是 PyTorch、TensorFlow或 Flax。不过,Transformer 模型只接受*张量*作为输入。如果您不熟悉张量,可以把它看作 NumPy 数组。NumPy 数组可以是标量 (0D)、向量 (1D)、矩阵 (2D) 或更高维度的数组,本质上就是一个张量。其他机器学习框架中的张量也类似,通常与 NumPy 数组一样容易创建。 要指定要返回的张量类型(PyTorch、TensorFlow或plain NumPy),我们使用`return_tensors`参数: @@ -107,7 +111,7 @@ print(inputs) ``` {/if} -现在不要担心填充和截断;我们稍后会解释这些。这里要记住的主要事情是,您可以传递一个句子或一组句子,还可以指定要返回的张量类型(如果没有传递类型,您将得到一组列表)。 +暂时不用担心填充和截断,我们稍后会解释它们。这里主要需要记住的是,您可以传入单个句子或句子列表,并指定想要返回的张量类型(如果不指定类型,则会返回嵌套列表)。 {#if fw === 'pt'} @@ -145,12 +149,11 @@ print(inputs) ``` {/if} -输出本身是一个包含两个键的字典,`input_ids`和`attention_mask`。`input_ids`包含两行整数(每个句子一行),它们是每个句子中标记的唯一标记(token)。我们将在本章后面解释什么是`attention_mask`。 - -## 浏览模型 [[浏览模型]] +输出本身是一个包含两个键的字典,`input_ids` 和 `attention_mask`。 `input_ids` 包含两行整数(每个句子一行),它们是每个句子中各个 token 的唯一标识符。我们将在本章后面解释 `attention_mask` 的作用。 +## 模型推理 [[模型推理]] {#if fw === 'pt'} -我们可以像使用标记器一样下载预训练模型。🤗 Transformers提供了一个`AutoModel`类,该类还具有`from_pretrained()`方法: +我们可以像使用*tokenizer*一样下载预训练模型。🤗 Transformers提供了一个`AutoModel`类,该类也有`from_pretrained()`方法: ```python from transformers import AutoModel @@ -159,35 +162,33 @@ checkpoint = "distilbert-base-uncased-finetuned-sst-2-english" model = AutoModel.from_pretrained(checkpoint) ``` {:else} -我们可以像使用标记器一样下载预训练模型。🤗 Transformers提供了一个`TFAutoModel`类,该类还具有`from_pretrained()`方法: +我们可以像使用*tokenizer*一样下载预训练模型。🤗 Transformers提供了一个`AutoModel`类,该类也有`from_pretrained()`方法: ```python -from transformers import TFAutoModel +from transformers import AutoModel checkpoint = "distilbert-base-uncased-finetuned-sst-2-english" -model = TFAutoModel.from_pretrained(checkpoint) +model = AutoModel.from_pretrained(checkpoint) ``` {/if} -在这个代码片段中,我们下载了之前在管道中使用的相同检查点(它实际上应该已经被缓存),并用它实例化了一个模型。 +在这段代码中,我们加载了之前在 pipeline 中使用的相同检查点(实际上它应该已经被缓存)并用它实例化了一个模型。 -这个架构只包含基本转换器模块:给定一些输入,它输出我们将调用的内容*隐藏状态(hidden states)*,亦称*特征(features)*。对于每个模型输入,我们将检索一个高维向量,表示**Transformer模型对该输入的上下文理解**。 - -如果这不合理,不要担心。我们以后再解释。 - -虽然这些隐藏状态本身可能很有用,但它们通常是模型另一部分(称为*头部(head)*)的输入。 在[Chapter 1](/course/chapter1)中,可以使用相同的体系结构执行不同的任务,但这些任务中的每个任务都有一个与之关联的不同头。 +这个架构只包含基本的 Transformer 模块:给定一些输入,它会输出我们称之为*隐藏状态 (hidden states)* 的内容,也称为*特征 (features)*。对于每个模型输入,我们将检索一个高维向量,该向量表示 **Transformer 模型对该输入的上下文理解**。 +如果你现在对隐藏状态和上下文理解的概念还不理解,也不用担心,我们会在后续的内容中详细解释这些概念,并举例说明它们是如何工作的。 +虽然这些隐藏状态本身可能很有用,但它们通常作为下游任务的输入,例如模型*头部(head)*的输入。在[Chapter 1](/course/chapter1)中,我们介绍了可以使用相同的架构执行不同的任务,但每个任务都会有不同的头部与之关联。 ### 高维向量? [[高维向量?]] -Transformers模块的矢量输出通常较大。它通常有三个维度: +Transformers模块的向量输出通常较大。它通常有三个维度: -- **Batch size**: 一次处理的序列数(在我们的示例中为2)。 -- **Sequence length**: 序列的数值表示的长度(在我们的示例中为16)。 -- **Hidden size**: 每个模型输入的向量维度。 +- **批次大小(Batch size)**: 一次处理的序列数(在我们的示例中为2)。 +- **序列长度 (Sequence length)**: 序列的数值表示的长度(在我们的示例中为16)。 +- **隐藏层维度(Hidden size)**: 每个模型输入的向量维度。 -由于最后一个值,它被称为“高维”。隐藏的大小可能非常大(768通常用于较小的型号,而在较大的型号中,这可能达到3072或更大)。 +之所以说它是“高维度”的,是因为最后一个维度值。隐藏层维度可以非常大(对于较小的模型768 是常见的,而在较大的模型中,它可以达到 3072 或更多)。 -如果我们将预处理的输入输入到模型中,我们可以看到这一点: +我们可以通过将预处理后的输入数据传递给模型来验证这一点: {#if fw === 'pt'} ```python @@ -209,12 +210,10 @@ print(outputs.last_hidden_state.shape) ``` {/if} -注意🤗 Transformers模型的输出与`namedtuple`或词典相似。您可以通过属性(就像我们所做的那样)或键(`输出["last_hidden_state"]`)访问元素,甚至可以通过索引访问元素,前提是您确切知道要查找的内容在哪里(`outputs[0]`)。 - -### 模型头:数字的意义 [[模型头:数字的意义]] - -模型头将隐藏状态的高维向量作为输入,并将其投影到不同的维度。它们通常由一个或几个线性层组成: +🤗 Transformers 模型的输出类似于 `namedtuple` 或字典。您可以通过属性 (就像我们之前所做的那样) 或键 (例如` outputs["last_hidden_state"]`) 来访问元素,甚至可以通过索引访问元素 (例如 `outputs[0]`),前提是您知道要查找的内容的位置。 +### 模型头:数值的意义 [[模型头:从数值中提取意义]] +模型头接收隐藏状态的高维向量作为输入,并将其映射到另一个维度。它们通常由一个或几个线性层构成:
A Transformer network alongside its head. @@ -238,8 +237,10 @@ Transformers模型的输出直接发送到模型头进行处理。 - 以及其他 🤗 {#if fw === 'pt'} -对于我们的示例,我们需要一个带有序列分类头的模型(能够将句子分类为肯定或否定)。因此,我们实际上不会使用`AutoModel`类,而是使用`AutoModelForSequenceClassification`: +对于我们的示例,我们需要一个带有序列分类头部的模型(能够将句子分类为肯定或否定)。 因此,我们实际上不会使用 `AutoModel` 类,而是使用 `AutoModelForSequenceClassification`(`AutoModel` 类只包含基本的 Transformer 模块,它可以提取文本的特征,但不能进行分类。 +`AutoModelForSequenceClassification` 类在 `AutoModel` 的基础上添加了一个序列分类头部,可以将文本分类为不同的类别。 +): ```python from transformers import AutoModelForSequenceClassification @@ -259,8 +260,8 @@ outputs = model(inputs) ``` {/if} -现在,如果我们观察输出的形状,维度将低得多:模型头将我们之前看到的高维向量作为输入,并输出包含两个值的向量(每个标签一个): - +现在,如果我们观察输出的shape,维度将低得多:模型头将我们之前看到的高维向量作为输入,并输出包含两个值的向量(每个标签一个): +正如您所见,输出向量的尺寸与输入向量相比要小得多。这是因为模型头将输入向量中的信息压缩成两个值,每个标签一个 ```python print(outputs.logits.shape) ``` @@ -279,7 +280,7 @@ torch.Size([2, 2]) {/if} -因为我们只有两个句子和两个标签,所以我们从模型中得到的结果是2 x 2的形状。 +因为我们只有两个句子和两个标签,所以我们从模型中得到的结果是2 x 2的维度。 ## 对输出进行后处理 [[对输出进行后处理]] @@ -302,8 +303,7 @@ tensor([[-1.5607, 1.6123], ``` {/if} -我们的模型预测第一句为`[-1.5607, 1.6123]`,第二句为`[ 4.1692, -3.3464]`。这些不是概率,而是*logits*,即模型最后一层输出的原始非标准化分数。要转换为概率,它们需要经过[SoftMax](https://en.wikipedia.org/wiki/Softmax_function)层(所有🤗Transformers模型输出logits,因为用于训练的损耗函数通常会将最后的激活函数(如SoftMax)与实际损耗函数(如交叉熵)融合): - +我们的模型预测第一句为 `[-1.5607, 1.6123]`,第二句为 `[4.1692, -3.3464]`。这些不是概率,而是 *logits*,即模型最后一层输出的原始、未经归一化的分数。为了将其转换为概率,它们需要经过[SoftMax](https://en.wikipedia.org/wiki/Softmax_function)层(所有 🤗 Transformers 模型都输出 logits,因为用于训练的损失函数通常会将最后的激活函数(例如 SoftMax)与实际的损失函数(例如交叉熵)融合在一起。 {#if fw === 'pt'} ```py import torch @@ -333,9 +333,12 @@ tf.Tensor( ``` {/if} -现在我们可以看到,模型预测第一句为`[0.0402, 0.9598]`,第二句为`[0.9995, 0.0005]`。这些是可识别的概率分数。 +现在我们可以看到,模型预测第一句为`[0.0402, 0.9598]`,第二句为`[0.9995, 0.0005]`。这些数字代表了模型预测每个类别(否定或肯定)的概率分值。 为了获得每个位置对应的标签,我们可以检查模型配置的`id2label`属性(下一节将对此进行详细介绍): +为了将这些概率分值转换为可识别的标签(“否定”或“肯定”),我们需要参考模型配置中的 id2label 属性。该属性将每个模型输出的 ID 映射到相应的标签。 + + ```python model.config.id2label @@ -345,13 +348,13 @@ model.config.id2label {0: 'NEGATIVE', 1: 'POSITIVE'} ``` -现在我们可以得出结论,该模型预测了以下几点: - +根据 id2label 属性,我们可以得出以下结论: + + - 第一句:否定:0.0402,肯定:0.9598 - 第二句:否定:0.9995,肯定:0.0005 -我们已经成功地复制了管道的三个步骤:使用标记化器进行预处理、通过模型传递输入以及后处理!现在,让我们花一些时间深入了解这些步骤中的每一步。 - +至此,我们已经成功完成了文本分类任务的三个步骤:使用*tokenizer*对文本进行预处理;将预处理后的文本输入到模型中;对模型的输出结果进行后处理,并将预测结果转换为可识别的标签。接下来,我们将对这三个步骤进行更详细的解释。 ✏️ **试试看!** 选择两个(或更多)你自己的文本并在管道中运行它们。然后自己复制在这里看到的步骤,并检查是否获得相同的结果! diff --git a/chapters/zh-CN/chapter2/3.mdx b/chapters/zh-CN/chapter2/3.mdx index 3b163660f..47a19592e 100644 --- a/chapters/zh-CN/chapter2/3.mdx +++ b/chapters/zh-CN/chapter2/3.mdx @@ -30,19 +30,19 @@ {#if fw === 'pt'} 在本节中,我们将更详细地了解如何创建和使用模型。我们将使用 -AutoModel类,当您希望从检查点实例化任何模型时,这非常方便。 +AutoModel类,它极大程度的方便您从*checkpoint*实例化任何模型。 -这个AutoModel类及其所有相关项实际上是对库中各种可用模型的简单包装。它是一个聪明的包装器,因为它可以自动猜测检查点的适当模型体系结构,然后用该体系结构实例化模型。 +AutoModel 类与其相关类本质上是对库中各种模型的简化包装。其智能之处在于能够自动识别检查点所对应的模型架构,并据此实例化相应的模型。 {:else} 在本节中,我们将更详细地了解如何创建和使用模型。我们将使用 -AutoModel类,当您希望从检查点实例化任何模型时,这非常方便。 +AutoModel类,它极大程度的方便您从*checkpoint*实例化任何模型。 -这个AutoModel类及其所有相关项实际上是对库中各种可用模型的简单包装。它是一个聪明的包装器,因为它可以自动猜测检查点的适当模型体系结构,然后用该体系结构实例化模型。 +AutoModel 类与其相关类本质上是对库中各种模型的简化包装。其智能之处在于能够自动识别检查点所对应的模型架构,并据此实例化相应的模型。 {/if} -但是,如果您知道要使用的模型类型,则可以使用直接定义其体系结构的类。让我们看看这是如何与BERT模型一起工作的。 +如果您知道要使用的模型类型,则可以使用直接定义其体系结构的类。让我们看看这是如何与BERT模型一起工作的。 ## 创建转换器 [[创建转换器]] @@ -88,7 +88,7 @@ BertConfig { } ``` -虽然您还没有看到所有这些属性都做了什么,但您应该认识到其中的一些属性:hidden_size属性定义了hidden_状态向量的大小,num_hidden_layers定义了Transformer模型的层数。 +虽然您还没有看到所有这些属性都做了什么,但您应该认识到其中的一些属性:`hidden_size`属性定义了`hidden_states`向量的大小,`num_hidden_layers`定义了Transformer模型的层数。 ### 不同的加载方式 [[不同的加载方式]] @@ -116,12 +116,12 @@ model = TFBertModel(config) {/if} -该模型可以在这种状态下使用,但会输出胡言乱语;首先需要对其进行训练。我们可以根据手头的任务从头开始训练模型,但正如您在 +该模型可以在这种状态下使用,但会输出胡言乱语;首先需要对其进行训练,我们可以根据手头的任务从头开始训练模型,但正如您在 [Chapter 1](/course/chapter1) -,这将需要很长的时间和大量的数据,并将产生不可忽视的环境影响。为了避免不必要的重复工作,必须能够共享和重用已经训练过的模型。 +所见,这将需要很长的时间和大量的数据,并将产生不可忽视的环境影响。为了避免不必要的重复工作,必须能够共享和重用已经训练过的模型。 -加载已经训练过的Transformers模型很简单-我们可以使用from_pretrained() +加载已经训练过的Transformers模型很简单-我们可以使用`from_pretrained()` 方法: {#if fw === 'pt'} @@ -131,7 +131,7 @@ from transformers import BertModel model = BertModel.from_pretrained("bert-base-cased") ``` -正如您之前看到的,我们可以用等效的AutoModel类替换Bert模型。从现在开始,我们将这样做,因为这会产生检查点不可知的代码;如果您的代码适用于一个检查点,那么它应该与另一个检查点无缝地工作。即使体系结构不同,这也适用,只要检查点是针对类似任务(例如,情绪分析任务)训练的。 +正如您之前看到的,我们可以用等效的`AutoModel`类替换`BertModel`类。从现在开始,我们将这样做,因为这会产生检查点不可知的代码;如果您的代码适用于一个*checkpoint*,那么它应该与另一个*checkpoint*无缝地工作。即使体系结构不同,这也适用,只要检查点是针对类似任务(例如,情绪分析任务)训练的。 {:else} ```py @@ -140,18 +140,16 @@ from transformers import TFBertModel model = TFBertModel.from_pretrained("bert-base-cased") ``` -正如您之前看到的,我们可以用等效的AutoModel类替换Bert模型。从现在开始,我们将这样做,因为这会产生检查点不可知的代码;如果您的代码适用于一个检查点,那么它应该与另一个检查点无缝地工作。即使体系结构不同,这也适用,只要检查点是针对类似任务(例如,情绪分析任务)训练的。 +正如您之前看到的,我们可以用等效的`AutoModel`替换`BertModel`类。从现在开始,我们将这样做,因为这会产生检查点不可知的代码;如果您的代码适用于一个*checkpoint*,那么它应该与另一个*checkpoint*无缝地工作。即使体系结构不同,这也适用,只要检查点是针对类似任务(例如,情绪分析任务)训练的。 {/if} -在上面的代码示例中,我们没有使用BertConfig - -,而是通过Bert base cased标识符加载了一个预训练模型。这是一个模型检查点,由BERT的作者自己训练;您可以在 +在上面的代码示例中,我们没有使用BertConfig,而是通过`bert-base-cased`标识符加载了一个预训练模型。这是一个模型检查点,由`BERT`的作者自己训练;您可以在 [model card](https://huggingface.co/bert-base-cased)中找到更多细节. -该模型现在使用检查点的所有权重进行初始化。它可以直接用于对训练过的任务进行推理,也可以对新任务进行微调。通过预先训练重量而不是从头开始的训练,我们可以很快取得好的效果。 +该模型现在使用*checkpoint*的所有权重进行初始化。它可以直接用于对训练过的任务进行推理,也可以对新任务进行微调。通过预先训练重量而不是从头开始的训练,我们可以很快取得好的效果。 @@ -163,7 +161,7 @@ HF_HOME -用于加载模型的标识符可以是模型中心Hub上任何模型的标识符,只要它与BERT体系结构兼容。可以找到可用的BERT检查点的完整列表 +用于加载模型的标识符可以是模型中心Hub上任何模型的标识符,只要它与`BERT`体系结构兼容。可以找到可用的`BERT`*checkpoint*的完整列表 [here](https://huggingface.co/models?filter=bert) . ### 保存模型 [[保存模型]] @@ -196,21 +194,21 @@ config.json tf_model.h5 如果你看一下 config.json -文件,您将识别构建模型体系结构所需的属性。该文件还包含一些元数据,例如检查点的来源以及上次保存检查点时使用的🤗 Transformers版本。 +文件,您将识别构建模型体系结构所需的属性。该文件还包含一些元数据,例如*checkpoint*的来源以及上次保存检查点时使用的🤗 Transformers版本。 {#if fw === 'pt'} -这个 *pytorch_model.bin* 文件就是众所周知的*state dictionary*; 它包含模型的所有权重。这两个文件齐头并进;配置是了解模型体系结构所必需的,而模型权重是模型的参数。 +这个 *pytorch_model.bin* 文件就是众所周知的*state dictionary*; 它包含模型的所有权重。这两个文件密切相关;这个配置是了解您的模型架构所必需的,而模型权重则是您模型的参数。 {:else} -这个 *tf_model.h5* 文件就是众所周知的*state dictionary*; 它包含模型的所有权重。这两个文件齐头并进;配置是了解模型体系结构所必需的,而模型权重是模型的参数。 +这个 *tf_model.h5* 文件就是众所周知的*state dictionary*; 它包含模型的所有权重。这两个文件密切相关;这个配置是了解您的模型架构所必需的,而模型权重则是您模型的参数。 {/if} ### 使用Transformers模型进行推理 [[使用Transformers模型进行推理]] -既然您知道了如何加载和保存模型,那么让我们尝试使用它进行一些预测。Transformer模型只能处理数字——分词器生成的数字。但在我们讨论标记化器之前,让我们先探讨模型接受哪些输入。 +既然您知道了如何加载和保存模型,那么让我们尝试使用它进行一些预测。Transformer模型只能处理数字——分词器生成的数字。但在我们讨论*Tokenizer*之前,让我们先探讨模型接受哪些输入。 -标记化器可以将输入转换为适当的框架张量,但为了帮助您了解发生了什么,我们将快速了解在将输入发送到模型之前必须做什么。 +*Tokenizer*可以将输入转换为适当的框架张量,但为了帮助您了解发生了什么,我们将快速了解在将输入发送到模型之前必须做什么。 假设我们有几个序列: @@ -218,8 +216,8 @@ config.json sequences = ["Hello!", "Cool.", "Nice!"] ``` -分词器将这些转换为词汇表索引,通常称为 -input IDs +*Tokenizer*将这些转换为词汇表索引,通常称为 +*input IDs* . 每个序列现在都是一个数字列表!结果是: ```py no-format @@ -230,7 +228,7 @@ encoded_sequences = [ ] ``` -这是一个编码序列列表:一个列表列表。张量只接受矩形(想想矩阵)。此“数组”已为矩形,因此将其转换为张量很容易: +这是一个编码序列的列表:一个嵌套列表(列表的列表)。张量只接受矩形形状(可以想象成矩阵)。这个“数组”已经是矩形形状,因此将其转换为张量很容易: {#if fw === 'pt'} ```py @@ -259,6 +257,5 @@ output = model(model_inputs) -虽然模型接受许多不同的参数,但只需要 -input IDs。我们稍后将解释其他参数的作用以及何时需要它们,但首先我们需要更仔细地了解 -Transformer模型可以理解的输入的标记 + +虽然模型接受许多不同的参数,但只有输入 ID 是必需的。 我们将在后面解释其他参数的作用以及何时需要它们,但首先我们需要仔细研究构建 Transformer 模型可以理解的输入的*tokenizer*。 \ No newline at end of file diff --git a/chapters/zh-CN/chapter2/5.mdx b/chapters/zh-CN/chapter2/5.mdx index 2f35dbcb9..576835144 100644 --- a/chapters/zh-CN/chapter2/5.mdx +++ b/chapters/zh-CN/chapter2/5.mdx @@ -189,7 +189,7 @@ batched_ids = [ids, ids] -✏️ **Try it out!** 试试看!将此列表转换为张量并通过模型传递。检查您是否获得与之前相同的登录(但是只有两次) +✏️ **试试看!** 将此列表转换为张量并通过模型传递。检查您是否获得与之前相同的登录(但是只有两次) 批处理允许模型在输入多个句子时工作。使用多个序列就像使用单个序列构建批一样简单。不过,还有第二个问题。当你试图将两个(或更多)句子组合在一起时,它们的长度可能不同。如果您以前使用过张量,那么您知道它们必须是矩形,因此无法将输入ID列表直接转换为张量。为了解决这个问题,我们通常填充输入。 @@ -326,7 +326,7 @@ tf.Tensor( -✏️ 试试看!在第2节中使用的两个句子上手动应用标记化(“我一生都在等待拥抱课程。”和“我非常讨厌这个!”)。通过模型传递它们,并检查您是否获得与第2节中相同的登录。现在使用填充标记将它们批处理在一起,然后创建适当的注意掩码。检查通过模型时是否获得相同的结果! +✏️ 试试看!在第2节中使用的两个句子上手动应用标记化(“我一生都在等待Hugging Face课程。”和“我非常讨厌这个!”)。通过模型传递它们,并检查您是否获得与第2节中相同的登录。现在使用填充标记将它们批处理在一起,然后创建适当的注意掩码。检查通过模型时是否获得相同的结果! diff --git a/chapters/zh-CN/chapter3/2.mdx b/chapters/zh-CN/chapter3/2.mdx index fbe6d00d3..03f5e61c0 100644 --- a/chapters/zh-CN/chapter3/2.mdx +++ b/chapters/zh-CN/chapter3/2.mdx @@ -321,8 +321,6 @@ samples = {k: v for k, v in samples.items() if k not in ["idx", "sentence1", "se 毫无疑问,我们得到了不同长度的样本,从32到67。动态填充意味着该批中的所有样本都应该填充到长度为67,这是该批中的最大长度。如果没有动态填充,所有的样本都必须填充到整个数据集中的最大长度,或者模型可以接受的最大长度。让我们再次检查**data_collator**是否正确地动态填充了这批样本: -```py: - ```py batch = data_collator(samples) {k: v.shape for k, v in batch.items()} diff --git a/chapters/zh-CN/chapter3/6.mdx b/chapters/zh-CN/chapter3/6.mdx index 06f6dbccd..bf93482ba 100644 --- a/chapters/zh-CN/chapter3/6.mdx +++ b/chapters/zh-CN/chapter3/6.mdx @@ -11,11 +11,12 @@ Test what you learned in this chapter! -### 1.“情绪”数据集包含标记有情绪的 Twitter 消息。在[ Hub ]( https://huggingface.co/datasets 集线器)中搜索它,然后读取数据集卡。哪一个不是它的基本情感? + +### 1.`emotion`数据集包含标记有情绪的 Twitter 消息。在[Hub](https://huggingface.co/datasets)中搜索它,然后读取数据集卡。哪一个不是它的基本情感? -### 2.在[ Hub ]( https://huggingface.co/datasets 集线器)中搜索‘ ar _ sarcasm’数据集,它支持哪个任务? +### 2.在[Hub](https://huggingface.co/datasets)中搜索`ar_sarcasm`数据集,它支持哪个任务? dataset card !" + explain: "不是这样的ーー再看看 数据集卡 !" }, { text: "命名实体识别", - explain: "不是这样的ーー再看看 < a href =’https://huggingface.co/datasets/ar _ sarcasm’> dataset card !" + explain: "不是这样的ーー再看看 数据集卡 !" }, { text: "回答问题", - explain: "Alas, this question was not answered correctly. 再试一次!" + explain: "哎呀, 问题回答不正确. 再试一次!" } ]} /> -### 3.BERT 模型期望如何处理一对句子? +### 3.BERT模型期望如何处理一对句子? [SEP]标记来分割两个句子,但这并不是唯一的需求!" }, { - text: "表示句子的记号表示句子的记号", - explain: "一个 < code > [ CLS ] 特殊令牌在开始时是必需的,但是这不是唯一的事情!" + text: "[CLS]句子1 句子2", + explain: "确实在最开始需要一个[CLS]标记的,但是这不是唯一的事情!" }, { - text: "表示句子1[ SEP ]的符号表示句子2[ SEP ]", + text: "[CLS]句子1 [SEP] 句子2 [SEP]", explain: "没错!", correct: true }, { - text: "表示句子1[ SEP ]的符号表示句子2", - explain: "开头需要一个 < code > [ CLS ] 特殊标记,还需要一个 < code > [ SEP ] 特殊标记来分隔两个句子,但这还不是全部!" + text: "[CLS]句子1 [SEP] 句子2", + explain: "开头需要一个[CLS]特殊标记,还需要一个[SEP]特殊标记来分隔两个句子,但这还不是全部!" } ]} /> {#if fw === 'pt'} -### 4.‘ Dataset.map ()’方法的好处是什么? +### 4.`Dataset.map()`方法的好处是什么? @@ -126,25 +127,25 @@ Test what you learned in this chapter! choices={[ { text: "它确保数据集中的所有序列具有相同的长度。", - explain: "校对函数用于处理单个批处理,而不是整个数据集。此外,我们讨论的是通用的校对函数,而不是特定的 < code > > DataCollatorWithPadding 。" + explain: "校对函数用于处理单个批次,而不是整个数据集。此外,我们讨论的是通用的排序函数,而不是专门讨论DataCollatorWithPadding。" }, { - text: "它把所有的样品一批一批地放在一起。", - explain: "正确! You can pass the collate function as an argument of a DataLoader. We used the DataCollatorWithPadding function, which pads all items in a batch so they have the same length.", + text: "它把所有的样品放在一起成一批", + explain: "正确的!可以将校对函数作为DataLoader的参数传递。我们使用了DataCollatorWithPadding函数,该函数填充批处理中的所有项,使它们具有相同的长度。", correct: true }, { - text: "它预处理整个数据集。", + text: "它对整个数据集进行预处理。", explain: "这将是一个预处理函数,而不是校对函数。" }, { text: "它截断数据集中的序列。", - explain: "校对函数用于处理单个批处理,而不是整个数据集。如果您对截断感兴趣,可以使用 < code > tokenizer 的 < truncate 参数。" + explain: "校对函数用于处理单个批次,而不是整个数据集。如果您对截断感兴趣,可以使用标记器truncate参数。" } ]} /> -### 7.当你用一个预先训练过的语言模型(例如‘ bert-base-uncased’)实例化一个‘ AutoModelForXxx’类,这个类对应于一个不同于它所被训练的任务时会发生什么? +### 7.当你用一个预先训练过的语言模型(例如`bert-base-uncased`)实例化一个`AutoModelForXxx`类,这个类对应于一个不同于它所被训练的任务时会发生什么? Trainer 所做的,而不是 Accelerate 库。再试一次!", + explain: "正确的。例如,当我们使用AutoModelForSequenceClassification配合bert-base-uncase 时,我们在实例化模型时会得到警告。预训练的头部不用于序列分类任务,因此它被丢弃,并用随机权重实例化一个新的头部。", correct: true }, { text: "丢弃预先训练好的模型头部。", - explain: "Something else needs to happen. 再试一次!" + explain: "还有其他事情需要发生。 再试一次!" }, { - text: "没有,因为模型仍然可以针对不同的任务进行微调。", - explain: "这个经过训练的模特的头没有经过训练来解决这个问题,所以我们应该丢掉这个头!" + text: "无事发生,因为模型仍然可以针对不同的任务进行微调。", + explain: "预训练模型的头部没有被训练来解决这个任务,所以我们应该丢弃头部!!" } ]} /> -### 8.训练争论的目的是什么? +### 8.`TrainingArguments`的目的是什么? 训练器进行训练和评估的所有超参数。", explain: "正确!", correct: true }, { text: "它指定模型的大小。", - explain: "模型大小是由模型配置定义的,而不是类 < code > TrainingArguments 。" + explain: "模型大小是由模型配置定义的,而不是类TrainingArguments。" }, { text: "它只包含用于评估的超参数。", - explain: "In the example, we specified where the model and its checkpoints will be saved. 再试一次!" + explain: "在举例中,我们指定了模型及其检查点的保存位置。再试一次!" }, { - text: "您可以轻松地计算与数据集相关的指标。", - explain: "In the example, we used an evaluation_strategy as well, so this impacts evaluation. 再试一次!" + text: "它只包含用于训练的超参数。", + explain: "在举例中,我们还使用了求值策略,因此这会影响求值。再试一次!" } ]} /> -### 9.为什么要使用 Accelerate 库? +### 9.为什么要使用 🤗Accelerate 库? Trainer, not the 🤗 Accelerate library. 再试一次!" + explain: "这是我们在Trainer所做的,而不是🤗Accelerate库。再试一次!”" }, { text: "它使我们的训练循环工作在分布式策略上", - explain: "正确! 随着加速,你的训练循环将为多个 gpu 和 TPUs 工作。", + explain: "正确! 随着🤗Accelerate库,你的训练循环将为多个GPU和TPU工作。", correct: true }, { text: "它提供了更多的优化功能。", - explain: "不,Accelerate 库不提供任何优化功能。" + explain: "不,🤗Accelerate 库不提供任何优化功能。" } ]} /> {:else} -### 4.当你用一个预先训练过的语言模型(例如‘ bert-base-uncased’)实例化一个‘ tfautoodelforxxx’类时,会发生什么? +### 4.当你用一个预先训练过的语言模型(例如`bert-base-uncased`)实例化一个`TFAutoModelForXxx`类时,会发生什么? TFAutoModelForSequenceClassification配合bert-base-uncase时,我们在实例化模型时会得到警告。预训练的头部不用于序列分类任务,因此它被丢弃,并用随机权重实例化一个新的头部。", correct: true }, { text: "丢弃预先训练好的模型头部。", - explain: "Something else needs to happen. 再试一次!" + explain: "还有其他事情需要发生。 再试一次!" }, { - text: "没有,因为模型仍然可以针对不同的任务进行微调。", - explain: "这个经过训练的模特的头没有经过训练来解决这个问题,所以我们应该丢掉这个头!" + text: "无事发生,因为模型仍然可以针对不同的任务进行微调。", + explain: "预训练模型的头部没有被训练来解决这个任务,所以我们应该丢弃头部!!" } ]} /> -### 5.来自“变压器”的 TensorFlow 模型已经是 Keras 模型,这有什么好处? +### 5.来自`transfomers`的 TensorFlow 模型已经是 Keras 模型,这有什么好处? TPUStrategy scope 中的所有内容,包括模型的初始化。" + text: "这些模型在一个开箱即用的TPU上工作。", + explain: "差不多了!还需要进行一些小的额外更改。例如,您需要在TPUStrategy范围内运行所有内容,包括模型的初始化。" }, { - text: "您可以利用现有的方法,如 < code > compile () 、 < code > fit () 和 < code > predict () 。", + text: "您可以利用现有的方法,如compile()fit()predict() 。", explain: "正确! 一旦你有了这些数据,在这些数据上进行培训只需要很少的工作。", correct: true }, { - text: "你可以学习 Keras 和变形金刚。", + text: "你可以学习 Keras 和 transformers库。", explain: "没错,但我们要找的是别的东西:)", correct: true }, { - text: "困惑", - explain: "Keras 帮助我们训练和评估模型,而不是计算与数据集相关的度量。" + text: "您可以轻松地计算与数据集相关的指标。", + explain: "Keras 帮助我们训练和评估模型,而不是计算与数据集相关的指标。" } ]} /> -### 6.如何定义自己的定制度量? +### 6.如何定义自己的定制指标? tfkeras.metrics. Metric 。", + text: "通过子类化tf.keras.metrics.Metric。", explain: "太好了!", correct: true }, @@ -274,7 +275,7 @@ Test what you learned in this chapter! explain: "再试一次!" }, { - text: "通过使用带签名的可调用 < code > metric _ fn (y _ true,y _ pred) 。", + text: "通过使用带签名的可调用metric_fn(y_true, y_pred) 。", explain: "正确!", correct: true }, diff --git a/chapters/zh-CN/chapter4/3.mdx b/chapters/zh-CN/chapter4/3.mdx index 9be4ff273..ba5e26550 100644 --- a/chapters/zh-CN/chapter4/3.mdx +++ b/chapters/zh-CN/chapter4/3.mdx @@ -49,9 +49,9 @@ {/if} -将文件上传到集线器的最简单方法是利用 **push_to_hub** API 接口。 +将文件上传到模型中心的最简单方法是利用 **push_to_hub** API 接口。 -在继续之前,您需要生成一个身份验证令牌,以便 **huggingface_hub** API 知道您是谁以及您对哪些名称空间具有写入权限。确保你在一个环境中 **transformers** 已安装(见[Setup](/course/chapter0))。如果您在笔记本中,可以使用以下功能登录: +在继续之前,您需要生成一个身份验证令牌,以便 **huggingface_hub** API 知道您是谁以及您对哪些名称空间具有写入权限。确保你在一个环境中 **transformers** 已安装(见[安装](/course/chapter0))。如果您在笔记本中,可以使用以下功能登录: ```python from huggingface_hub import notebook_login @@ -65,7 +65,7 @@ notebook_login() huggingface-cli login ``` -在这两种情况下,系统都会提示您输入用户名和密码,这与您用于登录 Hub 的用户名和密码相同。如果您还没有 Hub 配置文件,则应该创建一个[here](https://huggingface.co/join)。 +在这两种情况下,系统都会提示您输入用户名和密码,这与您用于登录 Hub 的用户名和密码相同。如果您还没有 Hub 配置文件,则应该创建一个[创建一个账户](https://huggingface.co/join)。 好的!您现在已将身份验证令牌存储在缓存文件夹中。让我们创建一些存储库! @@ -81,7 +81,7 @@ training_args = TrainingArguments( ) ``` -你声明 **trainer.train()** 的时候, 这 **Trainer** 然后每次将您的模型保存到您的命名空间中的存储库中时(这里是每个时代),它将上传到集线器。该存储库将命名为您选择的输出目录(此处 **bert-finetuned-mrpc** ) 但您可以选择不同的名称 **hub_model_id = a_different_name** 。 +你声明 **trainer.train()** 的时候, 这 **Trainer** 然后每次将您的模型保存到您的命名空间中的存储库中时(这里是每个时代),它将上传到模型中心。该存储库将命名为您选择的输出目录(此处 **bert-finetuned-mrpc** ) 但您可以选择不同的名称 **hub_model_id = a_different_name** 。 要将您的模型上传到您所属的组织,只需将其传递给 **hub_model_id = my_organization/my_repo_name** 。 @@ -193,7 +193,7 @@ tokenizer.push_to_hub("dummy-model", organization="huggingface", use_auth_token= ## 使用 huggingface_hub python库 [[使用 huggingface_hub python库]] 这 **huggingface_hub** Python 库是一个包,它为模型和数据集中心提供了一组工具。它为常见任务提供了简单的方法和类,例如 -获取有关集线器上存储库的信息并对其进行管理。它提供了在 git 之上工作的简单 API 来管理这些存储库的内容并集成 Hub +获取有关模型中心上存储库的信息并对其进行管理。它提供了在 git 之上工作的简单 API 来管理这些存储库的内容并集成 Hub 在您的项目和库中。 类似于使用 **push_to_hub** API,这将要求您将 API 令牌保存在缓存中。为此,您需要使用 **login** 来自 CLI 的命令,如上一节所述(同样,确保在这些命令前面加上 **!** 字符(如果在 Google Colab 中运行): @@ -229,7 +229,7 @@ from huggingface_hub import ( 此外,它还提供了非常强大的 **Repository** 用于管理本地存储库的类。我们将在接下来的几节中探讨这些方法和该类,以了解如何利用它们。 -这 **create_repo** 方法可用于在集线器上创建新存储库: +这 **create_repo** 方法可用于在模型中心上创建新存储库: ```py @@ -348,7 +348,7 @@ repo.git_tag() 另外!我们建议您查看 **Repository** 可用文件[here](https://github.com/huggingface/huggingface_hub/tree/main/src/huggingface_hub#advanced-programmatic-repository-management)有关所有可用方法的概述。 -目前,我们有一个模型和一个标记器,我们希望将其推送到集线器。我们已经成功克隆了存储库,因此我们可以将文件保存在该存储库中。 +目前,我们有一个模型和一个标记器,我们希望将其推送到模型中心。我们已经成功克隆了存储库,因此我们可以将文件保存在该存储库中。 我们首先通过拉取最新更改来确保我们的本地克隆是最新的: @@ -363,7 +363,7 @@ model.save_pretrained("") tokenizer.save_pretrained("") ``` -这 **path_to_dummy_folder** 现在包含所有模型和标记器文件。我们遵循通常的 git 工作流程,将文件添加到暂存区,提交它们并将它们推送到集线器: +这 **path_to_dummy_folder** 现在包含所有模型和标记器文件。我们遵循通常的 git 工作流程,将文件添加到暂存区,提交它们并将它们推送到模型中心: ```py repo.git_add() @@ -414,7 +414,7 @@ README.md 如果您刚刚使用 Hugging Face Hub 创建了您的存储库 **create_repo** 方法,这个文件夹应该只包含一个隐藏的 **.gitattributes** 文件。如果您按照上一节中的说明使用 Web 界面创建存储库,则该文件夹应包含一个自述文件文件旁边的隐藏 **.gitattributes** 文件,如图所示。 -添加一个常规大小的文件,例如配置文件、词汇文件,或者基本上任何几兆字节以下的文件,就像在任何基于 git 的系统中所做的一样。但是,更大的文件必须通过 git-lfs 注册才能将它们推送到拥抱脸。 +添加一个常规大小的文件,例如配置文件、词汇文件,或者基本上任何几兆字节以下的文件,就像在任何基于 git 的系统中所做的一样。但是,更大的文件必须通过 git-lfs 注册才能将它们推送到Hugging Face。 让我们回到 Python 来生成我们想要提交到我们的虚拟存储库的模型和标记器: @@ -570,7 +570,7 @@ Objects not staged for commit: {/if} -Let's proceed to the final steps, committing and pushing to 让我们继续最后的步骤,提交并推动拥抱脸远程仓库: +让我们继续最后的步骤,提交并推送到Hugging Face远程仓库: ```bash git commit -m "First model version" diff --git a/chapters/zh-CN/chapter4/6.mdx b/chapters/zh-CN/chapter4/6.mdx index 806ab4352..8308af695 100644 --- a/chapters/zh-CN/chapter4/6.mdx +++ b/chapters/zh-CN/chapter4/6.mdx @@ -102,28 +102,28 @@ ]} /> -### 5.哪些🤗 Transformers 库的对象可以直接在 Hub 上通过push _ to _ Hub ()共享? +### 5.哪些🤗 Transformers 库的对象可以直接在 Hub 上通过`push_to_Hub()`共享? {#if fw === 'pt'} push_to_hub方法,使用该方法将把所有标记器文件(词汇表、标记器的架构等)推送到给定的存储库。不过,这不是唯一正确的答案!", correct: true }, { text: "模型配置", - explain: "对!所有模型配置都有 push _ to _ hub 方法,使用这个方法可以将它们推送到给定的存储库。你还有其他能共享的吗?", + explain: "对!所有模型配置都有push_to_hub方法,使用这个方法可以将它们推送到给定的存储库。你还有其他能共享的吗?", correct: true }, { text: "一个模型", - explain: "正确! 所有模型都有 push_to_hub 方法,使用它会将它们及其配置文件推送到给定的存储库。不过,这并不是您可以共享的全部内容。", + explain: "正确! 所有模型都有push_to_hub方法,使用它会将它们及其配置文件推送到给定的存储库。不过,这并不是您可以共享的全部内容。", correct: true }, { text: "Trainer", - explain: "没错————Trainer也实现了push _ to _ hub方法,并且使用它将模型、配置、标记器和模型卡草稿上传到给定的存储器。试试其他答案!", + explain: "没错————Trainer也实现了push_to_hub方法,并且使用它将模型、配置、标记器和模型卡草稿上传到给定的存储器。试试其他答案!", correct: true } ]} @@ -133,29 +133,29 @@ choices={[ { text: "一个标记器", - explain: "正确! 所有标记器都有push_to_hub方法,使用该方法将把所有标记器文件(词汇表、标记器的架构等)推送到给定的存储库。不过,这不是唯一正确的答案!", + explain: "正确! 所有标记器都有push_to_hub方法,使用该方法将把所有标记器文件(词汇表、标记器的架构等)推送到给定的存储库。不过,这不是唯一正确的答案!", correct: true }, { text: "模型配置", - explain: "对!所有模型配置都有 push _ to _ hub 方法,使用这个方法可以将它们推送到给定的存储库。你还有其他能共享的吗?", + explain: "对!所有模型配置都有push_to_hub方法,使用这个方法可以将它们推送到给定的存储库。你还有其他能共享的吗?", correct: true }, { text: "一个模型", - explain: "正确! 所有模型都有 push_to_hub 方法,使用它会将它们及其配置文件推送到给定的存储库。不过,这并不是您可以共享的全部内容。", + explain: "正确! 所有模型都有push_to_hub方法,使用它会将它们及其配置文件推送到给定的存储库。不过,这并不是您可以共享的全部内容。", correct: true }, { text: "以上都有专用的回调函数", - explain: "正确————在训练期间,PushToHubCallback会定期将所有这些对象发送到存储器。", + explain: "正确————在训练期间,PushToHubCallback会定期将所有这些对象发送到存储器。", correct: true } ]} /> {/if} -### 6.当使用push _ to _ hub ()方法或 CLI 工具时,第一步是什么? +### 6.当使用`push_to_hub()`方法或 CLI 工具时,第一步是什么? huggingface _ hub 实用程序: 不需要额外的包装!" + text: "在 Python 运行时中,将它们包装在huggingface_hub实用程序中。", + explain: "模型和标记器已经受益于huggingface_hub 实用程序: 不需要额外的包装!" }, { - text: "将它们保存到磁盘并调用 < code > transformers-cli upload-model ", - explain: "命令 < code > upload-model 不存在。" + text: "将它们保存到磁盘并调用 transformers-cli upload-model", + explain: "命令 upload-model 不存在。" } ]} /> -### 8.您可以使用'Repository'类执行哪些 git 操作? +### 8.您可以使用`Repository`类执行哪些 git 操作? git _ commit () 方法就是为此而存在的。", + explain: "正确,git_commit() 方法就是为此而存在的。", correct: true }, { - text: "拉一下", - explain: "这就是 < code > git _ pull () 方法的目的。", + text: "拉取", + explain: "这就是 git_pull() 方法的目的。", correct: true }, { - text: "推一下", - explain: "方法 < code > git _ push () 可以做到这一点。", + text: "推送", + explain: "方法 git_push() 可以做到这一点。", correct: true }, { diff --git a/chapters/zh-CN/chapter5/6.mdx b/chapters/zh-CN/chapter5/6.mdx index f3a1044e9..6ded366a9 100644 --- a/chapters/zh-CN/chapter5/6.mdx +++ b/chapters/zh-CN/chapter5/6.mdx @@ -177,7 +177,7 @@ Dataset({ -✏️ **Try it out!** 看看能不能不用pandas就可以完成列的扩充; 这有点棘手; 你可能会发现 🤗 Datasets 文档的 ["Batch mapping"](https://huggingface.co/docs/datasets/about_map_batch#batch-mapping) 对这个任务很有用。 +✏️ **试试看!** 看看能不能不用pandas就可以完成列的扩充; 这有点棘手; 你可能会发现 🤗 Datasets 文档的 ["Batch mapping"](https://huggingface.co/docs/datasets/about_map_batch#batch-mapping) 对这个任务很有用。 diff --git a/chapters/zh-CN/chapter5/8.mdx b/chapters/zh-CN/chapter5/8.mdx index 502c0d8b5..503108c9c 100644 --- a/chapters/zh-CN/chapter5/8.mdx +++ b/chapters/zh-CN/chapter5/8.mdx @@ -44,8 +44,8 @@ dataset = load_dataset("glue", "mrpc", split="train") dataset.sample (50) ", - explain: "这是不正确的——没有 < code > Dataset.sample () 方法。" + text: "dataset.sample(50)", + explain: "这是不正确的——没有 Dataset.sample() 方法。" }, { text: "dataset.shuffle().select(range(50))", @@ -63,17 +63,17 @@ dataset = load_dataset("glue", "mrpc", split="train") pets _ dataset. filter (lambda x: x ['name'] . startswith ('L')) ", + text: "pets_dataset.filter(lambda x: x['name'].startswith('L'))", explain: "正确! 为这些快速过滤使用 Python lambda 函数是一个好主意。你还能想到其他解决方案吗?", correct: true }, { - text: "< code > pets _ dataset. filter (lambda x ['name'] . startswith ('L') ", - explain: "这是不正确的—— lambda 函数采用通用格式 < code > lambda * arguments * : * expression * , 因此在这种情况下需要提供参数。" + text: "pets_dataset.filter(lambda x['name'].startswith('L')", + explain: "这是不正确的—— lambda 函数采用通用格式 lambda * arguments * : * expression * , 因此在这种情况下需要提供参数。" }, { - text: "创建一个类似于 < code > def filter _ names (x) : return x ['name'] . startswith ('L') 的函数并运行 < code > pets _ dataset. filter (filter _ names) 。", - explain: "正确!就像使用 < code > Dataset.map () 一样,你可以将显式函数传递给 < code > Dataset.filter () 。当你有一些不适合于简短 lambda 函数的复杂逻辑时,这是非常有用的。其他解决方案中还有哪一个可行?", + text: "创建一个类似于 def filter_names(x) : return x['name'].startswith('L') 的函数并运行 pets_dataset.filter(filter_names) 。", + explain: "正确!就像使用 Dataset.map() 一样,你可以将显式函数传递给 Dataset.filter() 。当你有一些不适合于简短 lambda 函数的复杂逻辑时,这是非常有用的。其他解决方案中还有哪一个可行?", correct: true } ]} @@ -133,13 +133,13 @@ dataset[0] explain: "这是不正确的---- 流数据集是动态解压的, 你可以用非常小的RAM处理TB大小的数据集!", }, { - text: "它尝试访问 < code > IterableDataset 。", - explain: "正确! < code > IterableDataset 是一个生成器, 而不是一个容器, 因此你应该使用 < code > next (iter (dataset)) 来访问它的元素。", + text: "它尝试访问 IterableDataset 。", + explain: "正确! IterableDataset 是一个生成器, 而不是一个容器, 因此你应该使用 next(iter(dataset)) 来访问它的元素。", correct: true }, { - text: "数据集 < code > allocine 没有分割< code >训练集。", - explain: "这是不正确的---- 查看 Hub 上的[ < code > allocine dataset card ]( https://huggingface.co/datasets/allocine ), 看看它包含哪些拆分。" + text: "数据集 allocine 没有分割train。", + explain: "这是不正确的---- 查看 Hub 上的[allocine数据集卡](https://huggingface.co/datasets/allocine), 看看它包含哪些拆分。" } ]} /> diff --git a/chapters/zh-CN/chapter7/5.mdx b/chapters/zh-CN/chapter7/5.mdx index 0fbba71a7..95d18d246 100644 --- a/chapters/zh-CN/chapter7/5.mdx +++ b/chapters/zh-CN/chapter7/5.mdx @@ -663,7 +663,7 @@ trainer.push_to_hub(commit_message="Training complete", tags="summarization") 'https://huggingface.co/huggingface-course/mt5-finetuned-amazon-en-es/commit/aa0536b829b28e73e1e4b94b8a5aacec420d40e0' ``` -这会将检查点和配置文件保存到 **output_dir** , 在将所有文件上传到集线器之前。通过指定 **tags** 参数,我们还确保集线器上的小部件将是一个用于汇总管道的小部件,而不是与 mT5 架构关联的默认文本生成小部件(有关模型标签的更多信息,请参阅[🤗 Hub 文档](https://huggingface.co/docs/hub/main#how-is-a-models-type-of-inference-api-and-widget-determined))。输出来自 **trainer.push_to_hub()** 是 Git 提交哈希的 URL,因此您可以轻松查看对模型存储库所做的更改! +这会将检查点和配置文件保存到 **output_dir** , 在将所有文件上传到模型中心之前。通过指定 **tags** 参数,我们还确保模型中心上的小部件将是一个用于汇总管道的小部件,而不是与 mT5 架构关联的默认文本生成小部件(有关模型标签的更多信息,请参阅[🤗 Hub 文档](https://huggingface.co/docs/hub/main#how-is-a-models-type-of-inference-api-and-widget-determined))。输出来自 **trainer.push_to_hub()** 是 Git 提交哈希的 URL,因此您可以轻松查看对模型存储库所做的更改! 在结束本节之前,让我们看一下如何使用 🤗 Accelerate 提供的底层API对 mT5 进行微调。 diff --git a/chapters/zh-TW/_toctree.yml b/chapters/zh-TW/_toctree.yml index ddbeae3b5..cb40a3984 100644 --- a/chapters/zh-TW/_toctree.yml +++ b/chapters/zh-TW/_toctree.yml @@ -57,7 +57,7 @@ title: 使用 Trainer API 或者 Keras 微調一個模型 local_fw: { pt: chapter3/3, tf: chapter3/3_tf } - local: chapter3/4 - title: 一個完成的訓練過程 + title: 一個完整的訓練過程 - local: chapter3/5 title: 微調,章節回顧! - local: chapter3/6 diff --git a/chapters/zh-TW/chapter0/1.mdx b/chapters/zh-TW/chapter0/1.mdx index 95d80cf5f..05d6f8f35 100644 --- a/chapters/zh-TW/chapter0/1.mdx +++ b/chapters/zh-TW/chapter0/1.mdx @@ -89,7 +89,7 @@ ls -a source .env/bin/activate # Deactivate the virtual environment -source .env/bin/deactivate +deactivate ``` 你可以執行 `which python` 指令來確認你的虛擬環境是否有被啟用:如果它指向虛擬環境的目錄,那表示你的虛擬環境已經啟用了! diff --git a/chapters/zh-TW/chapter1/3.mdx b/chapters/zh-TW/chapter1/3.mdx index 31e4c8296..206c7dd68 100644 --- a/chapters/zh-TW/chapter1/3.mdx +++ b/chapters/zh-TW/chapter1/3.mdx @@ -17,7 +17,8 @@ ## Transformer被應用於各個方面! Transformer 模型用於解決各種 NLP 任務,就像上一節中提到的那樣。以下是一些使用 Hugging Face 和 Transformer 模型的公司和組織,他們也通過分享他們的模型回饋社區: -![使用 Hugging Face 的公司](https://huggingface.co/course/static/chapter1/companies.PNG) +使用 Hugging Face 的公司 + [🤗 Transformers 庫](https://github.com/huggingface/transformers)提供了創建和使用這些共享模型的功能。[模型中心(hub)](https://huggingface.co/models)包含數千個任何人都可以下載和使用的預訓練模型。您還可以將自己的模型上傳到 Hub! @@ -65,15 +66,15 @@ classifier( 目前[可用的一些pipeline](https://huggingface.co/transformers/main_classes/pipelines.html)是: -* **特徵提取**(獲取文本的向量表示) -* **填充空缺** -* **ner**(命名實體識別) -* **問答** -* **情感分析** -* **文本摘要** -* **文本生成** -* **翻譯** -* **零樣本分類** +* `feature-extraction`(獲取文本的向量表示) +* `fill-mask` +* `ner`(命名實體識別) +* `question-answering` +* `sentiment-analysis` +* `summarization` +* `text-generation` +* `translation` +* `zero-shot-classification` 讓我們來看看其中的一些吧! @@ -97,7 +98,7 @@ classifier( 此pipeline稱為zero-shot,因為您不需要對數據上的模型進行微調即可使用它。它可以直接返回您想要的任何標籤列表的概率分數! -✏️**快來試試吧!**使用您自己的序列和標籤,看看模型的行為。 +✏️**快來試試吧!** 使用您自己的序列和標籤,看看模型的行為。 ## 文本生成 @@ -119,7 +120,7 @@ generator("In this course, we will teach you how to") 您可以使用參數 **num_return_sequences** 控制生成多少個不同的序列,並使用參數 **max_length** 控制輸出文本的總長度。 -✏️**快來試試吧!**使用 num_return_sequences 和 max_length 參數生成兩個句子,每個句子 15 個單詞。 +✏️**快來試試吧!** 使用 num_return_sequences 和 max_length 參數生成兩個句子,每個句子 15 個單詞。 ## 在pipeline中使用 Hub 中的其他模型 @@ -148,7 +149,7 @@ generator( 通過單擊選擇模型後,您會看到有一個小組件,可讓您直接在線試用。通過這種方式,您可以在下載之前快速測試模型的功能。 -✏️**快來試試吧!**使用標籤篩選查找另一種語言的文本生成模型。使用小組件測試並在pipeline中使用它! +✏️**快來試試吧!** 使用標籤篩選查找另一種語言的文本生成模型。使用小組件測試並在pipeline中使用它! ## 推理 API @@ -177,7 +178,7 @@ unmasker("This course will teach you all about models.", top_k=2) **top_k** 參數控制要顯示的結果有多少種。請注意,這裡模型填充了特殊的< **mask** >詞,它通常被稱為掩碼標記。其他掩碼填充模型可能有不同的掩碼標記,因此在探索其他模型時要驗證正確的掩碼字是什麼。檢查它的一種方法是查看小組件中使用的掩碼。 -✏️**快來試試吧!**在 Hub 上搜索基於 bert 的模型並在推理 API 小組件中找到它的掩碼。這個模型對上面pipeline示例中的句子預測了什麼? +✏️**快來試試吧!** 在 Hub 上搜索基於 bert 的模型並在推理 API 小組件中找到它的掩碼。這個模型對上面pipeline示例中的句子預測了什麼? ## 命名實體識別 @@ -199,7 +200,7 @@ ner("My name is Sylvain and I work at Hugging Face in Brooklyn.") 我們在pipeline創建函數中傳遞選項 **grouped_entities=True** 以告訴pipeline將對應於同一實體的句子部分重新組合在一起:這裡模型正確地將「Hugging」和「Face」分組為一個組織,即使名稱由多個詞組成。事實上,正如我們即將在下一章看到的,預處理甚至會將一些單詞分成更小的部分。例如,**Sylvain** 分割為了四部分:**S、##yl、##va** 和 **##in**。在後處理步驟中,pipeline成功地重新組合了這些部分。 -✏️**快來試試吧!**在模型中心(hub)搜索能夠用英語進行詞性標注(通常縮寫為 POS)的模型。這個模型對上面例子中的句子預測了什麼? +✏️**快來試試吧!** 在模型中心(hub)搜索能夠用英語進行詞性標注(通常縮寫為 POS)的模型。這個模型對上面例子中的句子預測了什麼? ## 問答系統 @@ -280,7 +281,7 @@ translator("Ce cours est produit par Hugging Face.") -✏️**快來試試吧!**搜索其他語言的翻譯模型,嘗試將前一句翻譯成幾種不同的語言。 +✏️**快來試試吧!** 搜索其他語言的翻譯模型,嘗試將前一句翻譯成幾種不同的語言。 diff --git a/chapters/zh-TW/chapter2/1.mdx b/chapters/zh-TW/chapter2/1.mdx index 70ce241f2..618d780bb 100644 --- a/chapters/zh-TW/chapter2/1.mdx +++ b/chapters/zh-TW/chapter2/1.mdx @@ -9,15 +9,15 @@ 創建 🤗Transformers 庫就是為了解決這個問題。它的目標是提供一個API,通過它可以加載、訓練和保存任何Transformer模型。這個庫的主要特點是: - **易於使用**:下載、加載和使用最先進的NLP模型進行推理只需兩行代碼即可完成。 -- **靈活**:所有型號的核心都是簡單的 PyTorch **nn.Module** 或者 TensorFlow **tf.kears.Model**,可以像它們各自的機器學習(ML)框架中的任何其他模型一樣進行處理。 +- **靈活**:所有模型的核心都是簡單的 PyTorch **nn.Module** 或者 TensorFlow **tf.kears.Model**,可以像它們各自的機器學習(ML)框架中的任何其他模型一樣進行處理。 - **簡單**:當前位置整個庫幾乎沒有任何摘要。“都在一個文件中”是一個核心概念:模型的正向傳遞完全定義在一個文件中,因此代碼本身是可以理解的,並且是可以破解的。 -最後一個特性使🤗 Transformers與其他ML庫截然不同。這些模型不是基於通過文件共享的模塊構建的;相反,每一個模型都有自己的菜單。除了使模型更加容易接受和更容易理解,這還允許你輕鬆地在一個模型上實驗,而且不影響其他模型。 +最後一個特性使🤗 Transformers與其他ML庫截然不同。這些模型不是基於通過文件共享的模塊構建的;相反,每一個模型都有自己的網絡結構(layers)。除了使模型更加容易接受和更容易理解,這還允許你輕鬆地在一個模型上實驗,而且不影響其他模型。 本章將從一個端到端的示例開始,在該示例中,我們一起使用模型和tokenizer分詞器來複制[Chapter 1](/course/chapter1)中引入的函數 pipeline(). 接下來,我們將討論模型API:我們將深入研究模型和配置類,並向您展示如何加載模型以及如何將數值輸入處理為輸出預測。 然後我們來看看標記器API,它是 pipeline() 函數的另一個主要組件。它是作用分詞器負責第一個和最後一個處理步驟,處理從文本到神經網絡數字輸入的轉換,以及在需要時轉換回文本。最後,我們將向您展示如何處理在一個準備好的批處理中通過一個模型發送多個句子的問題,然後詳細介紹 pipeline() 函數。 -⚠️ 為了從模型集線器和 🤗Transformers 的所有可用功能中獲益,我們建議creating an account. +⚠️ 為了從模型中心和 🤗Transformers 的所有可用功能中獲益,我們建議creating an account. \ No newline at end of file diff --git a/chapters/zh-TW/chapter2/5.mdx b/chapters/zh-TW/chapter2/5.mdx index dd09f943d..add0490a6 100644 --- a/chapters/zh-TW/chapter2/5.mdx +++ b/chapters/zh-TW/chapter2/5.mdx @@ -189,7 +189,7 @@ batched_ids = [ids, ids] -✏️ **Try it out!** 試試看!將此列表轉換為張量並通過模型傳遞。檢查您是否獲得與之前相同的登錄(但是隻有兩次) +✏️ **試試看!** 將此列表轉換為張量並通過模型傳遞。檢查您是否獲得與之前相同的登錄(但是隻有兩次) 批處理允許模型在輸入多個句子時工作。使用多個序列就像使用單個序列構建批一樣簡單。不過,還有第二個問題。當你試圖將兩個(或更多)句子組合在一起時,它們的長度可能不同。如果您以前使用過張量,那麼您知道它們必須是矩形,因此無法將輸入ID列表直接轉換為張量。為了解決這個問題,我們通常填充輸入。 @@ -326,7 +326,7 @@ tf.Tensor( -✏️ 試試看!在第2節中使用的兩個句子上手動應用標記化(“我一生都在等待擁抱課程。”和“我非常討厭這個!”)。通過模型傳遞它們,並檢查您是否獲得與第2節中相同的登錄。現在使用填充標記將它們批處理在一起,然後創建適當的注意掩碼。檢查通過模型時是否獲得相同的結果! +✏️ 試試看!在第2節中使用的兩個句子上手動應用標記化(“我一生都在等待Hugging Face課程。”和“我非常討厭這個!”)。通過模型傳遞它們,並檢查您是否獲得與第2節中相同的登錄。現在使用填充標記將它們批處理在一起,然後創建適當的注意掩碼。檢查通過模型時是否獲得相同的結果! diff --git a/chapters/zh-TW/chapter3/6.mdx b/chapters/zh-TW/chapter3/6.mdx index 9f90c3fc3..b0a72ac28 100644 --- a/chapters/zh-TW/chapter3/6.mdx +++ b/chapters/zh-TW/chapter3/6.mdx @@ -11,7 +11,7 @@ Test what you learned in this chapter! -### 1.「情緒」數據集包含標記有情緒的 Twitter 消息。在[ Hub ]( https://huggingface.co/datasets 集線器)中搜索它,然後讀取數據集卡。哪一個不是它的基本情感? +### 1.「情緒」數據集包含標記有情緒的 Twitter 消息。在[模型中心](https://huggingface.co/datasets)中搜索它,然後讀取數據集卡。哪一個不是它的基本情感? -### 2.在[ Hub ]( https://huggingface.co/datasets 集線器)中搜索‘ ar _ sarcasm’數據集,它支持哪個任務? +### 2.在[模型中心](https://huggingface.co/datasets)中搜索‘ ar _ sarcasm’數據集,它支持哪個任務? ") tokenizer.save_pretrained("") ``` -這 **path_to_dummy_folder** 現在包含所有模型和標記器文件。我們遵循通常的 git 工作流程,將文件添加到暫存區,提交它們並將它們推送到集線器: +這 **path_to_dummy_folder** 現在包含所有模型和標記器文件。我們遵循通常的 git 工作流程,將文件添加到暫存區,提交它們並將它們推送到模型中心: ```py repo.git_add() @@ -414,7 +414,7 @@ README.md 如果您剛剛使用 Hugging Face Hub 創建了您的存儲庫 **create_repo** 方法,這個文件夾應該只包含一個隱藏的 **.gitattributes** 文件。如果您按照上一節中的說明使用 Web 界面創建存儲庫,則該文件夾應包含一個自述文件文件旁邊的隱藏 **.gitattributes** 文件,如圖所示。 -添加一個常規大小的文件,例如配置文件、詞彙文件,或者基本上任何幾兆字節以下的文件,就像在任何基於 git 的系統中所做的一樣。但是,更大的文件必須通過 git-lfs 註冊才能將它們推送到擁抱臉。 +添加一個常規大小的文件,例如配置文件、詞彙文件,或者基本上任何幾兆字節以下的文件,就像在任何基於 git 的系統中所做的一樣。但是,更大的文件必須通過 git-lfs 註冊才能將它們推送到Hugging Face。 讓我們回到 Python 來生成我們想要提交到我們的虛擬存儲庫的模型和標記器: @@ -570,7 +570,7 @@ Objects not staged for commit: {/if} -Let's proceed to the final steps, committing and pushing to 讓我們繼續最後的步驟,提交併推動擁抱臉遠程倉庫: +讓我們繼續最後的步驟,提交併推送到Hugging Face遠程倉庫: ```bash git commit -m "First model version" diff --git a/chapters/zh-TW/chapter5/6.mdx b/chapters/zh-TW/chapter5/6.mdx index 24bb8e9dd..8f578f8f6 100644 --- a/chapters/zh-TW/chapter5/6.mdx +++ b/chapters/zh-TW/chapter5/6.mdx @@ -188,7 +188,7 @@ Dataset({ -✏️ **Try it out!** 看看能不能不用pandas就可以完成列的擴充; 這有點棘手; 你可能會發現 🤗 Datasets 文檔的 ["Batch mapping"](https://huggingface.co/docs/datasets/about_map_batch#batch-mapping) 對這個任務很有用。 +✏️ **試試看!** 看看能不能不用pandas就可以完成列的擴充; 這有點棘手; 你可能會發現 🤗 Datasets 文檔的 ["Batch mapping"](https://huggingface.co/docs/datasets/about_map_batch#batch-mapping) 對這個任務很有用。 diff --git a/chapters/zh-TW/chapter7/5.mdx b/chapters/zh-TW/chapter7/5.mdx index eeab998ed..49f6cdd4a 100644 --- a/chapters/zh-TW/chapter7/5.mdx +++ b/chapters/zh-TW/chapter7/5.mdx @@ -665,7 +665,7 @@ trainer.push_to_hub(commit_message="Training complete", tags="summarization") 'https://huggingface.co/huggingface-course/mt5-finetuned-amazon-en-es/commit/aa0536b829b28e73e1e4b94b8a5aacec420d40e0' ``` -這會將檢查點和配置文件保存到 **output_dir** , 在將所有文件上傳到集線器之前。通過指定 **tags** 參數,我們還確保集線器上的小部件將是一個用於彙總管道的小部件,而不是與 mT5 架構關聯的默認文本生成小部件(有關模型標籤的更多信息,請參閱[🤗 Hub 文檔](https://huggingface.co/docs/hub/main#how-is-a-models-type-of-inference-api-and-widget-determined))。輸出來自 **trainer.push_to_hub()** 是 Git 提交哈希的 URL,因此您可以輕鬆查看對模型存儲庫所做的更改! +這會將檢查點和配置文件保存到 **output_dir** , 在將所有文件上傳到模型中心之前。通過指定 **tags** 參數,我們還確保模型中心上的小部件將是一個用於彙總管道的小部件,而不是與 mT5 架構關聯的默認文本生成小部件(有關模型標籤的更多信息,請參閱[🤗 Hub 文檔](https://huggingface.co/docs/hub/main#how-is-a-models-type-of-inference-api-and-widget-determined))。輸出來自 **trainer.push_to_hub()** 是 Git 提交哈希的 URL,因此您可以輕鬆查看對模型存儲庫所做的更改! 在結束本節之前,讓我們看一下如何使用 🤗 Accelerate 提供的底層API對 mT5 進行微調。 diff --git a/utils/generate_notebooks.py b/utils/generate_notebooks.py index f4e77cd62..9ed74f976 100644 --- a/utils/generate_notebooks.py +++ b/utils/generate_notebooks.py @@ -131,6 +131,7 @@ def build_notebook(fname, title, output_dir="."): """ sections = read_and_split_frameworks(fname) sections_with_accelerate = [ + "chapter3/3", # "Fine-tuning a model with the Trainer API or Keras", "chapter3/4", # "A full training", "chapter7/2_pt", # "Token classification (PyTorch)", "chapter7/3_pt", # "Fine-tuning a masked language model (PyTorch)"