From 3b96652d87a9b5a110d0c51eecc0a8c25a55838a Mon Sep 17 00:00:00 2001 From: "localizeflow[bot]" Date: Wed, 8 Jul 2026 19:30:56 +0000 Subject: [PATCH] chore(i18n): sync translations with latest source changes (chunk 1/1, 17 changes) --- translations/ja/.co-op-translator.json | 37 ++++- translations/ja/CONTRIBUTING.md | 29 ++++ translations/ja/examples/README.md | 68 ++++----- .../ja/lessons/0-course-setup/how-to-run.md | 50 +++---- .../TransferLearningTF.ipynb | 133 ++++++++--------- translations/ja/lessons/5-NLP/README.md | 74 +++++----- translations/zh-HK/.co-op-translator.json | 37 ++++- translations/zh-HK/CONTRIBUTING.md | 29 ++++ translations/zh-HK/examples/README.md | 74 +++++----- .../lessons/0-course-setup/how-to-run.md | 60 ++++---- .../TransferLearningTF.ipynb | 136 +++++++++--------- translations/zh-HK/lessons/5-NLP/README.md | 70 ++++----- translations/zh-TW/.co-op-translator.json | 42 +++++- translations/zh-TW/examples/README.md | 64 +++++---- .../lessons/0-course-setup/how-to-run.md | 48 +++---- .../TransferLearningTF.ipynb | 135 ++++++++--------- translations/zh-TW/lessons/5-NLP/README.md | 80 ++++++----- 17 files changed, 665 insertions(+), 501 deletions(-) create mode 100644 translations/ja/CONTRIBUTING.md create mode 100644 translations/zh-HK/CONTRIBUTING.md diff --git a/translations/ja/.co-op-translator.json b/translations/ja/.co-op-translator.json index 8dbacf23..3a450047 100644 --- a/translations/ja/.co-op-translator.json +++ b/translations/ja/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "ja" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T19:30:51+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "ja" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T15:51:59+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "ja" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "ja", + "failure_date": "2026-07-08T19:30:14+00:00", + "status": "failed", + "error_type": "TranslationIncompleteError", + "error_message": "Markdown translation remained incomplete for chunk 1.1.1 of 'LICENSE.md', and the chunk could not be split further.", + "translator_version": "0.20.0", + "failure_policy_version": 1 + } + }, "etc/CODE_OF_CONDUCT.md": { "original_hash": "c06b12caf3c901eb3156e3dd5b0aea56", "translation_date": "2025-08-24T21:20:36+00:00", @@ -54,8 +73,8 @@ "language_code": "ja" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-10-03T11:28:09+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T19:24:51+00:00", "source_file": "examples/README.md", "language_code": "ja" }, @@ -66,8 +85,8 @@ "language_code": "ja" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-15T12:09:55+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T19:25:18+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "ja" }, @@ -191,6 +210,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "ja" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T19:15:06+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "ja" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-08-24T21:12:31+00:00", @@ -330,8 +355,8 @@ "language_code": "ja" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-08-24T21:03:20+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T19:25:48+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "ja" }, diff --git a/translations/ja/CONTRIBUTING.md b/translations/ja/CONTRIBUTING.md new file mode 100644 index 00000000..29019af1 --- /dev/null +++ b/translations/ja/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# AI-For-Beginnersへの貢献について + +AI-For-Beginnersへの貢献に関心を持っていただきありがとうございます!翻訳、レッスンの修正、フォーマットの訂正を歓迎します。 + +## Microsoft コントリビューターライセンス契約 (CLA) + +このプロジェクトは貢献や提案を歓迎しています。ほとんどの貢献には、貢献物の利用権を実際に付与できること、および付与していることを宣言するコントリビューターライセンス契約 (CLA) への同意が必要です。詳細は [https://cla.microsoft.com](https://cla.microsoft.com) をご覧ください。 + +プルリクエストを送信すると、CLAボットが自動的にCLAの提出が必要かどうかを判断し、プルリクエストに適切なラベルやコメントなどを付けます。ボットの指示に従ってください。全リポジトリで一度だけ行えば済みます。 + +## 貢献方法 + +### 1. 誤字・タイプミスやコードエラーの修正 +任意のJupyterノートブックやレッスマークダウンファイルで誤字やバグを見つけた場合: +1. リポジトリをフォークします。 +2. 誤字や壊れたリンクを修正します。 +3. 修正内容を明確に説明したプルリクエストを提出します。 + +### 2. 翻訳の提出 +レッスンの他言語への翻訳を歓迎します!翻訳は既存のフォルダ名に従い、`translations/` ディレクトリの下に配置してください(例:`translations/es/`、`translations/pt-BR/`、`translations/zh-CN/`)。 + +詳細は [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md) をご参照ください。 + +--- + + +**免責事項**: +本書類は AI 翻訳サービス [Co-op Translator](https://github.com/Azure/co-op-translator) を使用して翻訳されています。正確性を期していますが、自動翻訳には誤りや不正確な部分が含まれる可能性があることをご承知おきください。原文の原語版が正式な情報源とみなされるべきです。重要な情報については、専門の人間による翻訳を推奨します。本翻訳の利用により生じたいかなる誤解や解釈違いについても、当方は責任を負いかねます。 + \ No newline at end of file diff --git a/translations/ja/examples/README.md b/translations/ja/examples/README.md index b259c312..7f1175eb 100644 --- a/translations/ja/examples/README.md +++ b/translations/ja/examples/README.md @@ -1,38 +1,38 @@ # 初心者向けAI例 -ようこそ!このディレクトリには、AIや機械学習を始めるためのシンプルで独立した例が含まれています。各例は初心者向けに設計されており、詳細なコメントやステップバイステップの説明が付いています。 +ようこそ!このディレクトリには、AIや機械学習を始めるためのシンプルで独立した例が含まれています。各例は詳細なコメントと段階的な説明があり、初心者に優しい設計です。 ## 📚 例の概要 | 例 | 説明 | 難易度 | 前提条件 | -|----|------|--------|----------| -| [Hello AI World](../../../examples/01-hello-ai-world.py) | 初めてのAIプログラム - シンプルなパターン認識 | ⭐ 初心者 | Pythonの基本 | -| [Simple Neural Network](../../../examples/02-simple-neural-network.py) | ニューラルネットワークをゼロから構築 | ⭐⭐ 初心者+ | Python、基礎数学 | -| [Image Classifier](./03-image-classifier.ipynb) | 事前学習済みモデルで画像を分類 | ⭐⭐ 初心者+ | Python、numpy | -| [Text Sentiment](../../../examples/04-text-sentiment.py) | テキストの感情分析(ポジティブ/ネガティブ) | ⭐⭐ 初心者+ | Python | +|---------|-------------|------------|---------------| +| [Hello AI World](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/01-hello-ai-world.py) | はじめてのAIプログラム - シンプルなパターン認識 | ⭐ 初心者 | Pythonの基本 | +| [Simple Neural Network](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | ニューラルネットワークをゼロから作成 | ⭐⭐ 初心者+ | Python、基礎数学 | +| [Image Classifier](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | 事前学習済みモデルで画像分類 | ⭐⭐ 初心者+ | Python、numpy | +| [Text Sentiment](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/04-text-sentiment.py) | テキストの感情分析(ポジティブ/ネガティブ) | ⭐⭐ 初心者+ | Python | -## 🚀 始め方 +## 🚀 はじめに ### 前提条件 -Pythonがインストールされていることを確認してください(推奨バージョンは3.8以上)。必要なパッケージをインストールします: +Pythonがインストールされていることを確認してください(3.8以上を推奨)。必要なパッケージをインストールします: ```bash -# For Python scripts +# Pythonスクリプト用 pip install numpy -# For Jupyter notebooks (image classifier) +# Jupyterノートブック用(画像分類器) pip install jupyter numpy pillow tensorflow ``` -または、メインカリキュラムのconda環境を使用してください: +またはメインカリキュラムのconda環境を使用してください: ```bash conda env create --name ai4beg --file ../environment.yml conda activate ai4beg ``` -### 例の実行方法 +### 実行方法 **Pythonスクリプト(.pyファイル)の場合:** ```bash @@ -44,42 +44,44 @@ python 01-hello-ai-world.py jupyter notebook 03-image-classifier.ipynb ``` -## 📖 学習パス +## 📖 学習の流れ -例を順番に進めることをお勧めします: +以下の順番で例を進めることをおすすめします: -1. **「Hello AI World」から始める** - パターン認識の基本を学ぶ -2. **シンプルなニューラルネットワークを構築する** - ニューラルネットワークの仕組みを理解する -3. **画像分類器を試す** - 実際の画像でAIを体験する -4. **テキスト感情分析を行う** - 自然言語処理を探求する +1. **「Hello AI World」から始める** - パターン認識の基礎を学ぶ +2. シンプルなニューラルネットワークを作る - ニューラルネットワークの仕組みを理解する +3. **Image Classifierに挑戦** - 実際の画像でAIを体験する +4. テキストの感情分析を行う - 自然言語処理を探求する -## 💡 初心者へのヒント +## 💡 初心者向けのヒント -- **コードコメントをよく読む** - 各行が何をしているか説明されています -- **試してみる!** - 値を変更して結果を確認してみましょう -- **すべてを理解しようとしない** - 学習には時間がかかります -- **質問する** - [Discussion board](https://github.com/microsoft/AI-For-Beginners/discussions)を活用してください +- コードのコメントをよく読む - 各行の意味を説明しています +- **実験してみる!** - 値を変えて何が起きるか試しましょう +- すべてを理解しようと焦らないで - 学習は時間がかかります +- 質問をする - [ディスカッションボード](https://github.com/microsoft/AI-For-Beginners/discussions)を利用しましょう ## 🔗 次のステップ -これらの例を完了したら、完全なカリキュラムを探求してください: -- [AIの導入](../lessons/1-Intro/README.md) +これらの例を終えたら、完全なカリキュラムを探求してください: +- [AI入門](../lessons/1-Intro/README.md) - [ニューラルネットワーク](../lessons/3-NeuralNetworks/README.md) - [コンピュータビジョン](../lessons/4-ComputerVision/README.md) - [自然言語処理](../lessons/5-NLP/README.md) -## 🤝 コントリビューション +## 🤝 貢献 -これらの例が役に立ったと感じたら、改善にご協力ください: -- 問題を報告したり改善案を提案する -- 初心者向けの例を追加する -- ドキュメントやコメントを改善する +これらの例が役立ったと思ったら、改善にご協力ください: +- 問題の報告や改善提案 +- 初心者向けの例をもっと追加 +- ドキュメントやコメントの改善 --- -*覚えておいてください:すべての専門家はかつて初心者でした。学習を楽しんでください! 🎓* +*覚えておいてください:すべての専門家もかつては初心者でした。楽しい学習を! 🎓* --- -**免責事項**: -この文書は、AI翻訳サービス[Co-op Translator](https://github.com/Azure/co-op-translator)を使用して翻訳されています。正確性を期すよう努めておりますが、自動翻訳には誤りや不正確な部分が含まれる可能性があります。原文(元の言語で記載された文書)を公式な情報源としてご参照ください。重要な情報については、専門の人間による翻訳をお勧めします。本翻訳の利用に起因する誤解や誤認について、当方は一切の責任を負いかねます。 \ No newline at end of file + +**免責事項**: +本書類は AI 翻訳サービス [Co-op Translator](https://github.com/Azure/co-op-translator) を使用して翻訳されています。正確性を期していますが、自動翻訳には誤りや不正確な部分が含まれる可能性があることをご承知おきください。原文の原語版が正式な情報源とみなされるべきです。重要な情報については、専門の人間による翻訳を推奨します。本翻訳の利用により生じたいかなる誤解や解釈違いについても、当方は責任を負いかねます。 + \ No newline at end of file diff --git a/translations/ja/lessons/0-course-setup/how-to-run.md b/translations/ja/lessons/0-course-setup/how-to-run.md index 9b2f4c9b..730e6b0a 100644 --- a/translations/ja/lessons/0-course-setup/how-to-run.md +++ b/translations/ja/lessons/0-course-setup/how-to-run.md @@ -1,12 +1,12 @@ # コードの実行方法 -このカリキュラムには、多くの実行可能な例とラボが含まれており、それらを実行したいと思うでしょう。そのためには、このカリキュラムの一部として提供されるJupyterノートブックでPythonコードを実行する能力が必要です。コードを実行する方法はいくつかあります: +このカリキュラムには、多くの実行可能な例やラボが含まれており、それらを実行したくなるでしょう。これを行うには、このカリキュラムの一部として提供されるJupyterノートブック内でPythonコードを実行する能力が必要です。コードを実行するためのいくつかの選択肢があります: -## お使いのコンピューターでローカルに実行する +## コンピューター上でローカルに実行する -お使いのコンピューターでコードをローカルに実行するには、Pythonのインストールが必要です。おすすめの一つは**[miniconda](https://conda.io/en/latest/miniconda.html)**のインストールです。これは比較的軽量なインストールで、異なるPythonの**仮想環境**用の`conda`パッケージマネージャーをサポートします。 +コンピューター上でコードをローカルに実行するには、Pythonのインストールが必要です。おすすめの一つは **[miniconda](https://conda.io/en/latest/miniconda.html)** のインストールです。これは比較的軽量なインストールで、さまざまなPythonの仮想環境用に `conda` パッケージマネージャーをサポートします。 -minicondaをインストールした後に、リポジトリをクローンし、このコース用に仮想環境を作成します: +minicondaをインストールした後、リポジトリをクローンし、このコースで使用する仮想環境を作成します: ```bash git clone http://github.com/microsoft/ai-for-beginners @@ -15,57 +15,57 @@ conda env create --name ai4beg --file .devcontainer/environment.yml conda activate ai4beg ``` -### Python拡張機能を使ったVisual Studio Codeの利用 +### Python拡張機能付きVisual Studio Codeの使用 -このカリキュラムは、[Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste)で[Python拡張機能](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste)を開いて使うのが最適です。 +このカリキュラムは、[Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) と [Python Extension](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste) を使って開くと最も効果的に利用できます。 -> **注意**: リポジトリをクローンしてVS Codeでディレクトリを開くと、自動的にPython拡張機能のインストールを提案されます。また、上記のようにminicondaもインストールしておく必要があります。 +> 注意: リポジトリをクローンしVS Codeでディレクトリを開くと、自動的にPython拡張機能のインストールを提案されます。また、上記のようにminicondaのインストールも必要です。 -> **注意**: VS Codeがリポジトリをコンテナで再オープンするよう提案してきた場合は、ローカルのPythonインストールを利用するためにこれを拒否してください。 +> 注意: VS Codeがリポジトリをコンテナ内で再オープンすることを提案した場合は、ローカルのPythonインストールを使うためにこれを拒否してください。 -### ブラウザーでのJupyterの使用 +### ブラウザでJupyterを使う -ご自身のコンピューターのブラウザーからJupyter環境を使うこともできます。従来のJupyterとJupyterHubの両方が、コード補完やコードのハイライトなど便利な開発環境を提供します。 +自分のコンピューター上のブラウザからJupyter環境を使うこともできます。古典的なJupyterもJupyterHubも、オートコンプリートやコードハイライトなど便利な開発環境を提供します。 -ローカルでJupyterを開始するには、コースのディレクトリに移動して、以下を実行します: +ローカルでJupyterを開始するには、コースのディレクトリに移動し、以下を実行します: ```bash jupyter notebook ``` - または +または ```bash jupyterhub ``` -`.ipynb`ファイルに移動して開き、作業を始めることができます。 +その後、任意の `.ipynb` ファイルに移動し、開いて作業を始めることができます。 -### コンテナでの実行 +### コンテナ内での実行 -Pythonのインストールの代替案として、コードをコンテナで実行する方法があります。本リポジトリは、このリポジトリ用のコンテナ作成方法を指示する特別な`.devcontainer`フォルダーを提供しており、VS Codeはコードをコンテナで再オープンする機能を提供しています。これはDockerのインストールが必要で、より複雑になるため、経験豊富なユーザー向けをお勧めします。 +Pythonのインストールの代替として、コンテナ内でコードを実行する方法があります。当リポジトリはこのリポジトリ用のコンテナのビルド方法を指示する特別な `.devcontainer` フォルダーを提供しているため、VS Codeはコードをコンテナ内で再オープンする機能を提供しています。これにはDockerのインストールが必要で、より複雑になるため、より経験豊富なユーザーに推奨します。 ## クラウドでの実行 -Pythonをローカルにインストールしたくない場合やクラウドリソースにアクセスできる場合、クラウドでコードを実行する良い代替手段があります。いくつかの方法を紹介します: +ローカルにPythonをインストールしたくなく、クラウドリソースにアクセスできる場合は、クラウド上でコードを実行するのも良い選択肢です。いくつかの方法があります: -* **[GitHub Codespaces](https://github.com/features/codespaces)**を利用する。これはGitHub上に用意された仮想環境で、VS Codeのブラウザーインターフェースからアクセス可能です。Codespacesにアクセスできる場合、リポジトリの**Code**ボタンをクリックしてCodespaceを開始し、すぐに作業を始められます。 -* **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**を利用する。[Binder](https://mybinder.org)は、GitHub上のコードを試すために無料でクラウドの計算資源を提供します。リポジトリのフロントページにあるボタンからBinderに移動でき、即座に基盤となるコンテナを構築してJupyterのウェブインターフェースをシームレスに開始します。 +* **[GitHub Codespaces](https://github.com/features/codespaces)** を使用する。これはGitHub上に作成され、VS Codeのブラウザインターフェースからアクセス可能な仮想環境です。Codespacesにアクセスできる場合は、リポジトリのCodeボタンをクリックしてCodespaceを開始し、すぐに作業を始められます。 +* **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)** を使用する。[Binder](https://mybinder.org) は、GitHub上のコードをテストするために無料のクラウド計算資源を提供します。リポジトリのフロントページにあるボタンでBinder内にリポジトリを開けます。これにより基盤となるコンテナが構築され、Jupyterウェブインターフェースがシームレスに開始されます。 -> **注意**: 不正使用防止のため、Binderは一部のウェブリソースへのアクセスをブロックしています。これにより、モデルやデータセットをパブリックインターネットから取得するコードの一部が動作しない場合があります。回避策を検討する必要があるかもしれません。また、Binderの提供する計算資源はかなり基本的なものなので、特に複雑な後のレッスンのトレーニングは遅くなります。 +> 注意: 悪用防止のため、Binderは一部のウェブリソースへのアクセスを制限しています。これにより、モデルやデータセットをパブリックインターネットから取得するコードの一部が動作しない可能性があります。回避策を見つける必要があるかもしれません。また、Binderの計算資源は非常に基本的なものなので、特に後半のより複雑なレッスンでのトレーニングは遅くなります。 ## GPU付きクラウドでの実行 -このカリキュラムの後半のレッスンではGPUサポートがあると大いに役立ちます。例えばモデルのトレーニングは、そうでないと非常に遅くなります。特に[Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste)や所属機関を通じてクラウドにアクセスできる場合、次のような選択肢があります: +このカリキュラムの後半のいくつかのレッスンでは、GPUサポートがあると非常に有利です。例えば、モデルのトレーニングはそうでなければ非常に遅くなります。特に、[Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) や所属機関を通じてクラウドにアクセスできる場合には、以下の選択肢があります: -* [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste)を作成し、Jupyterを通じて接続します。マシンにリポジトリをクローンして学習を始められます。NCシリーズVMはGPUサポートがあります。 +* [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) を作成し、Jupyter経由で接続します。リポジトリをそのままマシンにクローンし、学習を開始できます。NCシリーズのVMはGPUをサポートしています。 -> **注意**: Azure for Studentsを含む一部のサブスクリプションはGPUサポートを標準で提供していません。追加のGPUコアを技術サポートにリクエストする必要がある場合があります。 +> 注意: Azure for Studentsを含む一部のサブスクリプションでは、GPUサポートが標準で提供されていません。技術サポートリクエストで追加のGPUコアを申請する必要がある場合があります。 -* [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste)を作成し、そこでノートブック機能を使用します。[このビデオ](https://azure-for-academics.github.io/quickstart/azureml-papers/)は、Azure MLノートブックにリポジトリをクローンして使い始める方法を示しています。 +* [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) を作成し、そこでノートブック機能を使用します。[この動画](https://azure-for-academics.github.io/quickstart/azureml-papers/) は、Azure MLノートブックにリポジトリをクローンし、使用を開始する方法を示しています。 -またGoogle Colabも、無料のGPUサポートが付いており、Jupyterノートブックを一つずつアップロードして実行できます。 +また、Google Colabを使うこともできます。これは無料のGPUサポートが含まれており、Jupyterノートブックを1つずつアップロードして実行できます。 --- **免責事項**: -本書類はAI翻訳サービス「Co-op Translator」(https://github.com/Azure/co-op-translator)を使用して翻訳されています。正確性には努めておりますが、自動翻訳は誤りや不正確な部分を含む可能性があります。原文の言語による原文書が正式な情報源とみなされるべきです。重要な情報については、専門の人間翻訳を推奨します。本翻訳の利用によって生じたいかなる誤解や誤訳についても、当方は一切責任を負いかねます。 +本書類は AI 翻訳サービス [Co-op Translator](https://github.com/Azure/co-op-translator) を使用して翻訳されています。正確性を期していますが、自動翻訳には誤りや不正確な部分が含まれる可能性があることをご承知おきください。原文の原語版が正式な情報源とみなされるべきです。重要な情報については、専門の人間による翻訳を推奨します。本翻訳の利用により生じたいかなる誤解や解釈違いについても、当方は責任を負いかねます。 \ No newline at end of file diff --git a/translations/ja/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/ja/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index 7de569ff..7d46586e 100644 --- a/translations/ja/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/ja/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -6,9 +6,9 @@ "source": [ "# 事前学習済みモデルと転移学習\n", "\n", - "CNNのトレーニングには多くの時間がかかり、そのためには大量のデータが必要です。しかし、ネットワークが画像からパターンを抽出するために使用する最適な低レベルフィルターを学習することに多くの時間が費やされます。そこで自然に生じる疑問は、あるデータセットで学習したニューラルネットワークを使って、完全なトレーニングプロセスを経ずに異なる画像を分類することができるのか、ということです。\n", + "CNNのトレーニングには多くの時間がかかり、そのために大量のデータが必要です。しかし、多くの時間はネットワークが画像からパターンを抽出するために使用する最適な低レベルフィルターを学習することに費やされます。ここで自然な疑問が生まれます — あるデータセットでトレーニングされたニューラルネットワークを使い、完全なトレーニングプロセスなしで異なる画像の分類に適応させることは可能でしょうか?\n", "\n", - "このアプローチは**転移学習**と呼ばれます。これは、あるニューラルネットワークモデルから別のモデルへ知識を転移することを意味します。転移学習では通常、事前学習済みモデルから始めます。このモデルは、例えば**ImageNet**のような大規模な画像データセットで学習されています。これらのモデルはすでに一般的な画像からさまざまな特徴を抽出するのに優れた性能を発揮しており、多くの場合、それらの抽出された特徴の上に分類器を構築するだけで良い結果を得ることができます。\n" + "この方法は転移学習と呼ばれ、あるニューラルネットワークモデルから別のモデルに知識の一部を転送するためです。転移学習では、通常、ImageNetのような大規模な画像データセットでトレーニングされた事前学習済みモデルから始めます。これらのモデルは既に一般的な画像からさまざまな特徴をうまく抽出でき、多くの場合、抽出された特徴の上に単に分類器を構築するだけで良好な結果を得ることができます。\n" ] }, { @@ -29,11 +29,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 猫 vs. 犬 データセット\n", + "## 猫と犬のデータセット\n", "\n", - "このユニットでは、猫と犬の画像を分類するという実際の問題を解決します。そのために、[Kaggle Cats vs. Dogs Dataset](https://www.kaggle.com/c/dogs-vs-cats) を使用します。このデータセットは [Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste) からもダウンロード可能です。\n", + "このユニットでは、猫と犬の画像を分類する実際の問題を解決します。そのために、[Kaggle Cats vs. Dogs Dataset](https://www.kaggle.com/c/dogs-vs-cats) を使用します。また、このデータセットは [Microsoftから](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste) ダウンロードすることもできます。\n", "\n", - "このデータセットをダウンロードして `data` ディレクトリに展開しましょう(このプロセスには時間がかかる場合があります!):\n" + "このデータセットをダウンロードして、`data` ディレクトリに展開しましょう(この処理には少し時間がかかる場合があります!):\n" ] }, { @@ -64,7 +64,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "残念ながら、データセット内にいくつかの破損した画像ファイルがあります。破損したファイルを確認するために迅速なクリーニングを行う必要があります。このチュートリアルを混乱させないようにするため、データセットを検証するコードをモジュールに移動しました。\n" + "残念ながら、データセットには破損した画像ファイルがいくつかあります。破損ファイルをチェックするために簡単なクリーニングを行う必要があります。このチュートリアルを壊さないように、データセットを検証するコードをモジュールに移動しました。\n" ] }, { @@ -335,11 +335,11 @@ "source": [ "## データセットの読み込み\n", "\n", - "これまでの例では、Kerasに組み込まれているデータセットを読み込んでいました。今回は、自分自身のデータセットを扱うことになり、画像のディレクトリからデータを読み込む必要があります。\n", + "これまでの例では、Kerasに組み込まれているデータセットを読み込んでいました。ここでは、自分たちのデータセットを扱うことになり、画像のディレクトリから読み込む必要があります。\n", "\n", - "実際のところ、画像データセットのサイズは非常に大きくなることがあり、すべてのデータがメモリに収まるとは限りません。そのため、データセットは通常、トレーニングに適したミニバッチを返すことができる**ジェネレーター**として表現されます。\n", + "実際には、画像データセットのサイズは非常に大きくなることがあり、すべてのデータをメモリに収められるとは限りません。そのため、データセットは学習に適したミニバッチでデータを返すことができるジェネレーターとして表現されることが多いです。\n", "\n", - "画像分類を扱うために、Kerasには特別な関数`image_dataset_from_directory`が含まれています。この関数は、異なるクラスに対応するサブディレクトリから画像を読み込むことができます。この関数は画像のスケーリングも処理し、さらにデータセットをトレーニング用とテスト用のサブセットに分割することも可能です。\n" + "画像分類に対応するために、Kerasには `image_dataset_from_directory` という特別な関数が用意されており、異なるクラスに対応するサブディレクトリから画像を読み込むことができます。この関数は画像のスケーリングも行い、また、データセットを訓練用とテスト用に分割することも可能です:\n" ] }, { @@ -383,9 +383,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "両方の呼び出しで同じ`seed`値を設定することが重要です。これは、画像が訓練データセットとテストデータセットに分割される方法に影響を与えるためです。\n", + "両方の呼び出しで同じ`seed`値を設定することは重要です。これは画像の訓練データセットとテストデータセットへの分割に影響するためです。\n", "\n", - "データセットは自動的にディレクトリからクラス名を取得し、必要に応じて以下の方法でアクセスすることができます:\n" + "Datasetはディレクトリからクラス名を自動的に取得し、必要に応じて以下を呼び出してアクセスできます:\n" ] }, { @@ -412,7 +412,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "取得したデータセットは、モデルを訓練するために `fit` 関数に直接渡すことができます。それらには対応する画像とラベルの両方が含まれており、以下の構造を使用してループ処理することができます:\n" + "取得したデータセットは、そのまま `fit` 関数に渡してモデルの訓練に使用できます。これらには対応する画像とラベルの両方が含まれており、以下の構文でループ処理が可能です:\n" ] }, { @@ -453,7 +453,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "> **注意**: データセット内のすべての画像は、範囲が0〜255の浮動小数点テンソルとして表されています。これらの値をニューラルネットワークに渡す前に、0〜1の範囲にスケールする必要があります。画像をプロットする際には、同じ操作を行うか、値を`int`型に変換する必要があります(上記のコードで行っているように)。これにより、`matplotlib`に元のスケールされていない画像をプロットしたいことを示すことができます。\n" + "> 注意: データセット内のすべての画像は0-255の範囲の浮動小数点テンソルとして表されます。ニューラルネットワークに渡す前に、それらの値を0-1の範囲にスケーリングする必要があります。画像をプロットする際には、同じ処理を行うか、値を`int`型に変換する必要があります(上記のコードではそうしています)。これは、`matplotlib`に元のスケーリングされていない画像をプロットしたいことを示すためです。\n" ] }, { @@ -462,7 +462,7 @@ "source": [ "## 事前学習済みモデル\n", "\n", - "多くの画像分類タスクにおいて、事前学習済みのニューラルネットワークモデルを利用することができます。これらのモデルの多くは`keras.applications`名前空間内で利用可能であり、さらに多くのモデルがインターネット上で見つかります。最もシンプルなVGG-16モデルをどのようにロードして使用するか見てみましょう:\n" + "多くの画像分類タスクにおいて、事前学習済みのニューラルネットワークモデルを見つけることができます。これらのモデルの多くは `keras.applications` 名前空間内で利用可能であり、さらに多くのモデルがインターネット上にも存在します。ここでは、最も単純な VGG-16 モデルの読み込みと使用方法を見てみましょう:\n" ] }, { @@ -497,7 +497,17 @@ } ], "source": [ - "vgg = keras.applications.VGG16()\n", + "# SHA-256 of VGG16 weights (with top)\n", + "VGG16_WEIGHTS_SHA256 = '64373286793e3c8b2b4e3219cbf3544bce2f55ab4682710a29f5e7af8f5e4f61'\n", + "\n", + "_weights_path = keras.utils.get_file(\n", + " 'vgg16_weights_tf_dim_ordering_tf_kernels.h5',\n", + " 'https://storage.googleapis.com/tensorflow/keras-applications/vgg16/vgg16_weights_tf_dim_ordering_tf_kernels.h5',\n", + " file_hash=VGG16_WEIGHTS_SHA256,\n", + " hash_algorithm='sha256',\n", + ")\n", + "\n", + "vgg = keras.applications.VGG16(weights=_weights_path)\n", "inp = keras.applications.vgg16.preprocess_input(x_sample[:1])\n", "\n", "res = vgg(inp)\n", @@ -510,17 +520,17 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "いくつか重要なポイントがあります:\n", - "* 事前学習済みネットワークに入力を渡す前に、特定の方法で前処理を行う必要があります。これは対応する`preprocess_input`関数を呼び出すことで行われます。この関数は画像のバッチを受け取り、それらを処理した形式で返します。VGG-16の場合、画像は正規化され、各チャンネルに対して事前定義された平均値が引かれます。これは、VGG-16が元々この前処理を用いて学習されたためです。\n", - "* ニューラルネットワークは入力バッチに適用され、その結果として各クラスの確率を示す1000要素のテンソルのバッチが得られます。このテンソルに対して`argmax`を呼び出すことで、最も確率の高いクラス番号を見つけることができます。\n", - "* 得られた結果は[`ImageNet`クラスの番号](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a)です。この結果を理解するために、`decode_predictions`関数を使用することもできます。この関数は、上位nクラスとその名前を返します。\n" + "ここで重要なポイントがいくつかあります:\n", + "* どの事前学習済みネットワークに入力を渡す前にも、特定の方法で前処理を行う必要があります。これは対応する `preprocess_input` 関数を呼び出すことで行われ、画像のバッチを受け取り、その処理済みの形式を返します。VGG-16の場合、画像は正規化され、各チャネルに対して事前定義された平均値が引かれます。これはVGG-16が元々この前処理で訓練されたためです。\n", + "* ニューラルネットワークは入力バッチに適用され、その結果として各クラスの確率を示す1000要素のテンソルのバッチが得られます。このテンソルに対して `argmax` を呼び出すことで、最も確率の高いクラス番号を見つけることができます。\n", + "* 得られた結果は [「ImageNet」クラスの番号](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a) です。この結果を理解するために、クラス名とともに上位 n クラスを返す `decode_predictions` 関数を使うこともできます。\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "VGG-16ネットワークのアーキテクチャも見てみましょう:\n" + "VGG-16 ネットワークのアーキテクチャも見てみましょう:\n" ] }, { @@ -597,9 +607,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## GPU計算\n", + "## GPU 計算\n", "\n", - "VGG-16やその他の最新のアーキテクチャのような深層ニューラルネットワークは、実行するためにかなりの計算能力を必要とします。GPUアクセラレーションが利用可能であれば、それを活用するのは理にかなっています。幸いなことに、KerasはGPUが利用可能な場合、自動的に計算を高速化してくれます。TensorflowがGPUを使用できるかどうかは、以下のコードで確認できます:\n" + "VGG-16 のような深いニューラルネットワークや、その他のより最新のアーキテクチャは、実行にかなりの計算能力を必要とします。利用可能であれば、GPU アクセラレーションを使用するのが理にかなっています。幸いなことに、Keras は GPU が利用可能な場合、自動的に計算を高速化します。Tensorflow が GPU を使用できるかどうかは、以下のコードで確認できます:\n" ] }, { @@ -626,9 +636,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## VGG特徴の抽出\n", "\n", - "画像から特徴を抽出するためにVGG-16を使用したい場合、最終的な分類層を含まないモデルが必要です。以下のコードを使用して、トップ層を除いたVGG-16モデルをインスタンス化できます。\n" + "## VGG特徴量の抽出\n", + "\n", + "VGG-16を使って画像から特徴量を抽出したい場合は、最終の分類層を含まないモデルが必要です。以下のコードでトップ層なしのVGG-16モデルをインスタンス化できます:\n" ] }, { @@ -680,9 +691,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "特徴テンソルの次元は7x7x512ですが、視覚化するために2D形式に変形する必要がありました。\n", + "特徴テンソルの次元は7x7x512ですが、可視化するために2D形式に変形する必要がありました。\n", "\n", - "次に、これらの特徴が画像分類に使用できるかどうか試してみましょう。手動で画像の一部(今回は50ミニバッチ)を取り出し、それらの特徴ベクトルを事前に計算します。この処理にはTensorflowの**dataset** APIを使用できます。`map`関数はデータセットを受け取り、指定されたラムダ関数を適用して変換します。この仕組みを利用して、元の画像ではなくVGGで抽出された特徴を含む新しいデータセット、`ds_features_train`と`ds_features_test`を構築します。\n" + "では、これらの特徴が画像を分類するために使えるか試してみましょう。画像の一部(今回の場合は50のミニバッチ)を手動で取り出し、それらの特徴ベクトルを事前に計算します。これにはTensorflowのdataset APIを使うことができます。`map`関数はデータセットを受け取り、指定したラムダ関数を適用して変換します。この仕組みを使って、元の画像の代わりにVGGで抽出した特徴を含む新しいデータセット `ds_features_train` と `ds_features_test` を構築します。\n" ] }, { @@ -712,9 +723,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "デモの速度を上げるために、データセットのサイズを制限するために `.take(50)` を使用しました。もちろん、完全なデータセットでこの実験を行うことも可能です。\n", + "デモの高速化のために、データセットのサイズを制限するために `.take(50)` を使いました。もちろん、この実験は完全なデータセットで実行することもできます。\n", "\n", - "特徴が抽出されたデータセットが準備できたので、猫と犬を区別するためのシンプルな密結合分類器を訓練することができます。このネットワークは形状 (7,7,512) の特徴ベクトルを入力として受け取り、犬または猫のいずれかに対応する1つの出力を生成します。これは二値分類であるため、`sigmoid` 活性化関数と `binary_crossentropy` 損失関数を使用します。\n" + "特徴量を抽出したデータセットができたので、簡単な全結合分類器を訓練して猫と犬を区別できます。このネットワークは形状 (7,7,512) の特徴ベクトルを受け取り、犬または猫のどちらかに対応する1つの出力を生成します。これは二値分類なので、活性化関数に `sigmoid`、損失関数に `binary_crossentropy` を使用します。\n" ] }, { @@ -743,13 +754,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "結果は素晴らしく、猫と犬をほぼ95%の確率で区別できるようになりました!しかし、このアプローチはすべての画像のサブセットでしかテストしていません。なぜなら、手動で特徴を抽出するのにかなりの時間がかかるからです。\n", + "結果は素晴らしく、猫と犬をほぼ95%の確率で区別することができます!しかし、手動で特徴を抽出するのに多くの時間がかかるようなので、このアプローチはすべての画像ではなくその一部にしかテストしていません。\n", "\n", - "## VGGネットワークを使った転移学習\n", + "## 1つのVGGネットワークを使った転移学習\n", "\n", - "手動で特徴を事前計算する手間を省くために、トレーニング中に元のVGG-16ネットワーク全体を使用し、ネットワークの最初の層として特徴抽出器を追加する方法もあります。\n", + "トレーニング中に特徴抽出器をネットワークの最初のレイヤーとして追加し、元のVGG-16ネットワーク全体を使用することで、特徴の手動事前計算を避けることもできます。\n", "\n", - "Kerasのアーキテクチャの素晴らしい点は、上で定義したVGG-16モデルを別のニューラルネットワークの層としても使用できることです!VGG-16の上に密結合の分類器を構築し、バックプロパゲーションを使ってネットワーク全体をトレーニングするだけで済みます。\n" + "Kerasのアーキテクチャの素晴らしい点は、上で定義したVGG-16モデルが別のニューラルネットワークのレイヤーとしても使えることです!その上に全結合の分類器を構築し、逆伝播を使ってネットワーク全体をトレーニングするだけです。\n" ] }, { @@ -793,13 +804,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "このモデルは、画像を入力として受け取り、クラスを返すエンドツーエンドの分類ネットワークのように見えます。しかし、重要な点は、VGG16を特徴抽出器として使用し、再学習させないことです。そのため、**畳み込み特徴抽出器の重みを固定する**必要があります。ネットワークの最初のレイヤーには`model.layers[0]`を呼び出すことでアクセスでき、`trainable`プロパティを`False`に設定するだけで済みます。\n", + "このモデルは、画像を入力としてクラスを返すエンドツーエンドの分類ネットワークのように見えます。しかし、難しいのは、VGG16を特徴抽出器として機能させたいということで、再訓練は行いません。したがって、畳み込み特徴抽出器の重みを凍結する必要があります。ネットワークの最初のレイヤーには `model.layers[0]` を呼び出してアクセスでき、`trainable` プロパティを `False` に設定するだけです。\n", "\n", - "> **Note**: 特徴抽出器の重みを固定する必要があるのは、そうしないと未学習の分類層が畳み込み抽出器の元の学習済み重みを破壊してしまう可能性があるためです。\n", + "> 注意:特徴抽出器の重みを凍結する必要があるのは、そうしないと未訓練の分類層が元の事前学習済みの畳み込み抽出器の重みを破壊してしまう可能性があるためです。\n", "\n", - "ネットワーク全体のパラメータ数が約1500万である一方で、実際に学習しているのはわずか25,000パラメータであることに気付くでしょう。トップレベルの畳み込みフィルターのその他のパラメータはすべて学習済みです。これは良いことで、少ない数の例で少ない数のパラメータを微調整することが可能になります。\n", + "ネットワークの総パラメーター数が約1500万であるのに対し、訓練されるパラメーターはわずか2万5千であることに気づくでしょう。他のすべてのパラメーターは最上位の畳み込みフィルターで事前学習済みです。これは良いことで、より少ない例でより少ないパラメーターを微調整できるということです。\n", "\n", - "これからネットワークを学習させ、どれだけ良い結果が得られるか確認します。実行時間がかなり長くなることを予想してください。また、処理が一時的に停止しているように見えても心配しないでください。\n" + "これからネットワークを訓練して、どれくらい良くなるかを見てみましょう。実行時間がかなり長くなることを予想し、しばらくの間実行が止まっているように見えても心配しないでください。\n" ] }, { @@ -824,11 +835,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "猫と犬を分類するモデルがかなり正確にできたようです!\n", + "かなり正確な猫対犬の分類器を得られたようです!\n", "\n", "## モデルの保存と読み込み\n", "\n", - "モデルをトレーニングした後は、モデルのアーキテクチャと学習済みの重みをファイルに保存して、将来利用できるようにします:\n" + "モデルの訓練が完了したら、将来の使用のためにモデルの構造と訓練済み重みをファイルに保存できます:\n" ] }, { @@ -852,7 +863,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "次の実験でモデルが破壊される場合に備えて、いつでもファイルからモデルを読み込むことができます。最初からやり直す必要がなくなるため、便利だと感じるかもしれません。\n" + "次の実験でモデルが破損してしまう可能性がある場合に便利なので、いつでもファイルからモデルを読み込むことができます。最初からやり直す必要がなくなります。\n" ] }, { @@ -868,15 +879,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 転移学習のファインチューニング\n", + "## ファインチューニングによる転移学習\n", "\n", - "前のセクションでは、最終的な分類器層をトレーニングし、自分のデータセット内の画像を分類しました。しかし、特徴抽出部分は再トレーニングせず、モデルがImageNetデータで学習した特徴に依存していました。もし対象のオブジェクトが一般的なImageNet画像と視覚的に異なる場合、この特徴の組み合わせは最適に機能しない可能性があります。そのため、畳み込み層のトレーニングを開始するのが理にかなっています。\n", + "前のセクションでは、独自のデータセットの画像を分類するために最終の分類器層を訓練しました。しかし、特徴抽出器は再訓練せず、モデルはImageNetデータで学習した特徴に依存していました。対象の物体の見た目が通常のImageNet画像と異なる場合、この特徴の組み合わせは最適でない可能性があります。したがって、畳み込み層の訓練も始めるのが合理的です。\n", "\n", - "そのためには、以前に固定していた畳み込みフィルタのパラメータを解凍する必要があります。\n", + "そのために、以前に凍結した畳み込みフィルターのパラメータの凍結を解除できます。\n", "\n", - "> **Note:** 最初にパラメータを固定し、分類層の重みを安定させるために数エポックのトレーニングを行うことが重要です。もし最初からパラメータを解凍した状態でエンドツーエンドのネットワークをトレーニングし始めると、大きな誤差が畳み込み層の事前学習済みの重みを破壊する可能性があります。\n", + "> **Note:** まずパラメータを凍結し、分類層の重みを安定させるために数エポック分の訓練を行うことが重要です。パラメータ凍結解除の状態で直ちにエンドツーエンドの訓練を開始すると、大きな誤差が畳み込み層の事前学習済み重みを破壊しやすくなります。\n", "\n", - "畳み込みVGG-16モデルは最初の層に含まれており、それ自体が多くの層で構成されています。その構造を確認してみましょう:\n" + "私たちの畳み込みVGG-16モデルは最初の層の中にあり、それ自体多くの層で構成されています。その構造を見てみましょう:\n" ] }, { @@ -945,7 +956,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "畳み込みベースのすべての層を解除できます。\n" + "畳み込みベースのすべての層の凍結を解除できます:\n" ] }, { @@ -961,7 +972,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "しかし、すべてを一度に解凍するのは最善の方法ではありません。まず、いくつかの最終的な畳み込み層だけを解凍することができます。これらの層は、私たちの画像に関連する高次のパターンを含んでいるからです。例えば、最初に最後の4層を除いてすべての層を凍結することができます。\n" + "しかし、それらすべてを一度にアンフリーズするのは最良の方法ではありません。まずは画像に関連するより高レベルのパターンを含む、畳み込みの最後の数層だけをアンフリーズすることができます。例えば、最初は最後の4層を除いてすべての層をフリーズすることができます:\n" ] }, { @@ -1000,11 +1011,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "学習可能なパラメータの数が大幅に増加しましたが、それでも全パラメータの約50%程度にとどまっています。\n", + "学習可能なパラメーターの数が大幅に増加したことに注目してください。ただし、それでも全パラメーターの約50%程度です。\n", "\n", - "凍結解除後、数エポックの追加トレーニングを行うことができます(この例では1エポックのみ行います)。また、事前学習済みの重みへの影響を最小限に抑えるために、学習率を低く設定することも可能です。ただし、学習率を低くしても、トレーニングの初期段階では精度が一時的に低下することが予想されます。その後、最終的には固定された重みの場合よりもわずかに高いレベルに達するでしょう。\n", + "アンフリーズ後は、もう少しエポック数を増やして学習を行うことができます(この例では1回だけ行います)。また、事前学習済みの重みに与える影響を最小限にするために、学習率を下げることもできます。しかし、学習率が低くても、学習の初めには精度が低下し、その後固定重みで学習した場合よりもわずかに高いレベルに達することが期待されます。\n", "\n", - "> **Note:** このトレーニングは非常に遅く進行します。なぜなら、ネットワークの多くの層を通じて勾配を逆伝播させる必要があるからです!\n" + "> **注:** この学習は非常に遅く進行します。ネットワークの多くの層を通して勾配を逆伝播させる必要があるためです!\n" ] }, { @@ -1028,18 +1039,18 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "私たちは、より多くのパラメーターを持つ強力なネットワークを使用しているため、トレーニング精度が高くなる可能性がありますが、検証精度の向上はそれほど大きくないでしょう。\n", + "より多くのパラメーターを持つより強力なネットワークを使用しているため、トレーニング精度はより高くなる可能性がありますが、検証精度はそれほど上がらないでしょう。\n", "\n", - "ネットワークのいくつかの層をさらにアンフリーズしてトレーニングを続け、より高い精度を達成できるか試してみてください!\n" + "ネットワークのいくつかの層の凍結を解除してさらにトレーニングし、より高い精度が達成できるかどうか試してみてください!\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## 他のコンピュータビジョンモデル\n", + "## その他のコンピュータビジョンモデル\n", "\n", - "VGG-16は最もシンプルなコンピュータビジョンのアーキテクチャの一つです。Kerasはさらに多くの事前学習済みネットワークを提供しています。その中でも最も頻繁に使用されるのは、Microsoftが開発した**ResNet**アーキテクチャと、Googleによる**Inception**です。例えば、最もシンプルなResNet-50モデルのアーキテクチャを見てみましょう(ResNetは異なる深さを持つモデルのファミリーであり、非常に深いモデルを見たい場合はResNet-152を試してみることができます)。\n" + "VGG-16は最もシンプルなコンピュータビジョンアーキテクチャの一つです。Kerasはさらに多くの事前学習済みネットワークを提供しています。その中で最もよく使われているものは、Microsoftが開発したResNetアーキテクチャとGoogleのInceptionです。例えば、最もシンプルなResNet-50モデルのアーキテクチャを見てみましょう(ResNetは異なる深さのモデルのファミリーで、実際に非常に深いモデルがどのようなものか見たい場合はResNet-152を試してみることもできます):\n" ] }, { @@ -1441,11 +1452,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "モデルにはおなじみの構成要素が含まれています:畳み込み層、プーリング層、そして最終的な密結合分類器。このモデルは、VGG-16を転移学習に使用してきたのと全く同じ方法で利用することができます。上記のコードを使って、異なるResNetモデルをベースモデルとして試してみたり、精度がどのように変化するかを確認してみてください。\n", + "ご覧のとおり、このモデルは同じおなじみの構成要素を含んでいます:畳み込み層、プーリング層、最終的な全結合分類器です。このモデルは、VGG-16を転移学習で使用していたのとまったく同じ方法で使用できます。上記のコードを使って、異なるResNetモデルをベースモデルとして試し、精度がどのように変化するかを実験してみてください。\n", "\n", "## バッチ正規化\n", "\n", - "このネットワークにはもう一つのタイプの層が含まれています:**バッチ正規化**。バッチ正規化のアイデアは、ニューラルネットワークを通過する値を適切な範囲に収めることです。通常、ニューラルネットワークはすべての値が[-1,1]または[0,1]の範囲にあるときに最も良く機能します。そのため、入力データをスケール/正規化するのです。しかし、深層ネットワークの学習中に、値がこの範囲を大きく外れることがあり、それが学習を困難にする原因となります。バッチ正規化層は現在のミニバッチのすべての値について平均と標準偏差を計算し、それらを使用して信号を正規化してからニューラルネットワーク層に渡します。これにより、深層ネットワークの安定性が大幅に向上します。\n" + "このネットワークにはもう一つのタイプの層があります:バッチ正規化です。バッチ正規化のアイデアは、ニューラルネットワークを流れる値を適切な範囲に収めることです。通常、ニューラルネットワークはすべての値が[-1,1]または[0,1]の範囲にあるときに最も良く機能し、そのため入力データを適切にスケーリング/正規化しています。しかし、深いネットワークの訓練中に、値がこの範囲から大きく外れることがあり、これが訓練を困難にします。バッチ正規化層は、現在のミニバッチのすべての値の平均と標準偏差を計算し、それらを使って信号をニューラルネットワーク層に渡す前に正規化します。これにより、深いネットワークの安定性が大幅に向上します。\n" ] }, { @@ -1454,16 +1465,16 @@ "source": [ "## 要点\n", "\n", - "転移学習を活用することで、カスタムオブジェクト分類タスクのための分類器を迅速に構築し、高い精度を達成することができました。しかし、この例は完全に公平ではありませんでした。というのも、元のVGG-16ネットワークは猫と犬を認識するように事前学習されており、ネットワーク内に既に存在しているパターンの多くを再利用しただけだからです。工場の生産ラインの詳細や異なる種類の木の葉など、より特殊なドメイン固有のオブジェクトでは、精度が低下することが予想されます。\n", + "転移学習を使用することで、カスタムオブジェクト分類タスクの分類器を迅速に組み立て、高い精度を達成できました。ただし、この例は完全に公平ではありませんでした。なぜなら、元のVGG-16ネットワークは猫と犬を認識するように事前学習されており、ネットワークに既に存在していたパターンの多くを再利用していただけだからです。生産ラインの詳細や異なる樹木の葉など、より特殊なドメイン固有のオブジェクトでは精度が低くなることが予想されます。\n", "\n", - "現在解決しようとしているより複雑なタスクでは、より高い計算能力が必要となり、CPUだけでは簡単に解決することができません。次のユニットでは、より軽量な実装を使用して、同じモデルを低い計算リソースでトレーニングし、わずかに精度が低下する結果を得る方法を試してみます。\n" + "現在解決しているより複雑なタスクは、より高い計算能力を必要とし、CPU上で簡単に解決できないことがわかります。次の単元では、より軽量な実装を使用して同じモデルをより少ない計算資源で訓練し、わずかに精度が低下する結果になる方法を試みます。\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**免責事項**: \nこの文書は、AI翻訳サービス [Co-op Translator](https://github.com/Azure/co-op-translator) を使用して翻訳されています。正確性を追求しておりますが、自動翻訳には誤りや不正確な部分が含まれる可能性があります。元の言語で記載された文書を正式な情報源としてお考えください。重要な情報については、専門の人間による翻訳を推奨します。この翻訳の使用に起因する誤解や誤った解釈について、当方は一切の責任を負いません。\n" + "---\n\n\n**免責事項**:\n本書類は AI 翻訳サービス [Co-op Translator](https://github.com/Azure/co-op-translator) を使用して翻訳されています。正確性を期していますが、自動翻訳には誤りや不正確な部分が含まれる可能性があることをご承知おきください。原文の原語版が正式な情報源とみなされるべきです。重要な情報については、専門の人間による翻訳を推奨します。本翻訳の利用により生じたいかなる誤解や解釈違いについても、当方は責任を負いかねます。\n\n" ] } ], @@ -1484,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-08-30T09:09:33+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "ja" } }, "nbformat": 4, diff --git a/translations/ja/lessons/5-NLP/README.md b/translations/ja/lessons/5-NLP/README.md index e827a66e..eae991d1 100644 --- a/translations/ja/lessons/5-NLP/README.md +++ b/translations/ja/lessons/5-NLP/README.md @@ -1,51 +1,51 @@ # 自然言語処理 -![NLPタスクの概要を示すイラスト](../../../../translated_images/ja/ai-nlp.b22dcb8ca4707cea.webp) +![NLPタスクの概要の落書き](../../../../translated_images/ja/ai-nlp.b22dcb8ca4707cea.webp) -このセクションでは、**自然言語処理 (NLP)** に関連するタスクを扱うためにニューラルネットワークを使用する方法に焦点を当てます。コンピュータに解決してほしい多くのNLP問題があります。 +このセクションでは、自然言語処理(NLP)に関連するタスクを扱うためにニューラルネットワークを使うことに焦点を当てます。コンピューターに解決してほしい多くのNLP問題があります: -* **テキスト分類**は、テキストシーケンスに関する典型的な分類問題です。例として、電子メールをスパムか非スパムに分類したり、記事をスポーツ、ビジネス、政治などに分類することが挙げられます。また、チャットボットを開発する際には、ユーザーが何を言いたかったのかを理解する必要があります。この場合、**意図分類**を扱うことになります。意図分類では、多くのカテゴリを扱う必要があることがよくあります。 -* **感情分析**は典型的な回帰問題であり、文の意味がどれだけポジティブ/ネガティブであるかを示す数値(感情)を割り当てる必要があります。感情分析のより高度なバージョンとして、**側面ベース感情分析** (ABSA) があります。これは、文全体ではなくその異なる部分(側面)に感情を割り当てるものです。例: *このレストランでは料理は気に入ったが、雰囲気はひどかった*。 -* **固有表現抽出** (NER) は、テキストから特定のエンティティを抽出する問題を指します。例えば、*明日パリに飛びたい*というフレーズでは、*明日*が日付 (DATE) を指し、*パリ*が場所 (LOCATION) を指していることを理解する必要があります。 -* **キーワード抽出**はNERに似ていますが、特定のエンティティタイプを事前学習することなく、文の意味に重要な単語を自動的に抽出する必要があります。 -* **テキストクラスタリング**は、例えば技術サポートの会話で似たリクエストをグループ化したい場合に役立ちます。 -* **質問応答**は、モデルが特定の質問に答える能力を指します。モデルはテキストの一部と質問を入力として受け取り、質問の答えが含まれるテキスト内の場所を提供する必要があります(場合によっては答えのテキストを生成することもあります)。 -* **テキスト生成**は、モデルが新しいテキストを生成する能力です。これは、*テキストプロンプト*に基づいて次の文字や単語を予測する分類タスクと見なすことができます。GPT-3のような高度なテキスト生成モデルは、[プロンプトプログラミング](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0)や[プロンプトエンジニアリング](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29)と呼ばれる技術を使用して、分類などの他のNLPタスクを解決することができます。 -* **テキスト要約**は、コンピュータに長いテキストを「読んで」数文に要約させたい場合の技術です。 -* **機械翻訳**は、一つの言語でのテキスト理解と別の言語でのテキスト生成を組み合わせたものと見なすことができます。 +* テキスト分類 はテキストシーケンスに関する典型的な分類問題です。例としては、メールメッセージをスパムか非スパムに分類したり、記事をスポーツ、ビジネス、政治などに分類したりすることです。また、チャットボットを開発する際にはユーザーが何を言いたかったのかを理解する必要があり、この場合は 意図分類 を扱います。意図分類では多くのカテゴリを扱う必要があることが多いです。 + 感情分析 は典型的な回帰問題で、文の意味のポジティブ/ネガティブの度合いに対応する数値(感情)を割り当てる必要があります。より高度な感情分析は アスペクトベース感情分析 (ABSA) で、文全体ではなく異なる部分(アスペクト)に対して感情を割り当てます。例:このレストランでは料理は好みでしたが、雰囲気はひどかった* などです。 + 固有表現抽出 (NER) はテキストから特定の実体を抽出する問題を指します。例えば、明日パリに飛ばなければならない というフレーズでは 明日 は日時を表し、パリ* は場所を表していると理解する必要があります。 +* キーワード抽出 はNERに似ていますが、特定の実体タイプの事前学習なしに文の意味に重要な単語を自動的に抽出する必要があります。 +* テキストクラスタリング は、技術サポートの会話における類似の要求など、類似した文をまとめたい場合に役立ちます。 +* 質問応答 は、モデルが特定の質問に答える能力を指します。モデルはテキストの通過部分と質問を入力として受け取り、質問の答えが含まれるテキストの部分を提供する(または時には答えのテキストを生成する)必要があります。 +* テキスト生成 は、モデルが新しいテキストを生成する能力です。テキストの一部に基づいて次の文字や単語を予測する分類タスクと見なせます。GPT-3のような高度なテキスト生成モデルは、[prompt programming](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0)や[prompt engineering](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29)という技術を用いて分類など他のNLPタスクも解決可能です。 +* テキスト要約 は、長いテキストをコンピューターに「読ませ」、数文に要約させる技術です。 +* 機械翻訳 は一言語でのテキスト理解と別言語でのテキスト生成の組み合わせと見ることができます。 -初期の頃は、ほとんどのNLPタスクが文法などの従来の方法で解決されていました。例えば、機械翻訳では、初期の文を構文木に変換するためにパーサーが使用され、その後、文の意味を表す高次の意味構造が抽出され、この意味とターゲット言語の文法に基づいて結果が生成されました。現在では、多くのNLPタスクがニューラルネットワークを使用することでより効果的に解決されています。 +当初、多くのNLPタスクは文法解析のような従来の方法で解決されていました。例えば、機械翻訳ではパーサーを使って初期の文を構文木に変換し、そこから文の意味を表す高レベルの意味構造を抽出し、その意味と目的言語の文法に基づいて結果を生成していました。現在、多くのNLPタスクはニューラルネットワークを用いた方が効果的に解決されています。 -> 多くの古典的なNLP手法は、Pythonライブラリの[自然言語処理ツールキット (NLTK)](https://www.nltk.org) に実装されています。異なるNLPタスクをNLTKを使用して解決する方法をカバーした素晴らしい[NLTKの本](https://www.nltk.org/book/)がオンラインで利用可能です。 +> 多くの古典的なNLP手法は [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) Pythonライブラリに実装されています。NLTKを使った様々なNLPタスクの解決方法を扱った素晴らしい [NLTK Book](https://www.nltk.org/book/) がオンラインで利用可能です。 -このコースでは、主にニューラルネットワークを使用したNLPに焦点を当て、必要に応じてNLTKを使用します。 +当コースでは主にニューラルネットワークを使ったNLPに焦点を当て、必要に応じてNLTKを使用します。 -これまでに、表形式データや画像を扱うためのニューラルネットワークの使用方法を学びました。これらのデータタイプとテキストの主な違いは、テキストが可変長のシーケンスであるのに対し、画像の場合は入力サイズが事前にわかっていることです。畳み込みネットワークは入力データからパターンを抽出できますが、テキストのパターンはより複雑です。例えば、否定が主語から任意の多くの単語で分離される場合があります(例: *私はオレンジが好きではありません* vs. *私はあの大きくてカラフルで美味しいオレンジが好きではありません*)。これでも一つのパターンとして解釈されるべきです。そのため、言語を扱うには、*リカレントネットワーク*や*トランスフォーマー*などの新しいニューラルネットワークタイプを導入する必要があります。 +すでにニューラルネットワークを使って表形式データや画像を扱う方法を学びました。それらのデータタイプとテキストの主な違いは、テキストが可変長のシーケンスであるのに対し、画像の入力サイズは事前に分かっている点です。畳み込みネットワークは入力データからパターンを抽出できますが、テキストのパターンはより複雑です。例えば、否定が主語から離れて多くの単語を挟む場合でも(例:*I do not like oranges*、または *I do not like those big colorful tasty oranges*)それは一つのパターンとして解釈されるべきです。したがって言語処理には、リカレントネットワークトランスフォーマー といった新しいタイプのニューラルネットワークを導入する必要があります。 ## ライブラリのインストール -このコースをローカルのPython環境で実行する場合、以下のコマンドを使用してNLPに必要なライブラリをインストールする必要があります。 +ローカルのPython環境でこのコースを実行する場合、以下のコマンドでNLPに必要なすべてのライブラリをインストールする必要があるかもしれません: -**PyTorchの場合** +**PyTorch用** ```bash -pip install -r requirements-torch.txt +pip install -r requirements-pytorch.txt ``` -**TensorFlowの場合** +**TensorFlow用** ```bash pip install -r requirements-tf.txt ``` -> TensorFlowを使用したNLPを試したい場合は、[Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste)をご覧ください。 +> TensorFlowでのNLPを試す場合は、[Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste) を参照してください -## GPUに関する注意 +## GPUに関する警告 -このセクションでは、一部の例で非常に大きなモデルをトレーニングします。 -* **GPU対応のコンピュータを使用する**: 大きなモデルを扱う際の待機時間を短縮するために、GPU対応のコンピュータでノートブックを実行することをお勧めします。 -* **GPUメモリの制約**: GPUで実行すると、大きなモデルをトレーニングする際にGPUメモリが不足する状況が発生する可能性があります。 -* **GPUメモリ消費量**: トレーニング中のGPUメモリ消費量は、ミニバッチサイズなどのさまざまな要因によって異なります。 -* **ミニバッチサイズを最小化する**: GPUメモリの問題が発生した場合、コード内のミニバッチサイズを減らすことを検討してください。 -* **TensorFlowのGPUメモリ解放**: 古いバージョンのTensorFlowでは、1つのPythonカーネル内で複数のモデルをトレーニングする際にGPUメモリが正しく解放されないことがあります。GPUメモリ使用量を効果的に管理するには、必要に応じてGPUメモリを割り当てるようTensorFlowを設定できます。 -* **コードの追加**: 必要に応じてGPUメモリ割り当てを増やすようTensorFlowを設定するには、以下のコードをノートブックに追加してください。 +このセクションの一部の例では、かなり大きなモデルを訓練します。 +* **GPU対応のコンピューターを使用する**: 大きなモデルを扱う際の待ち時間を短縮するために、GPU対応のコンピューターでノートブックを実行することをおすすめします。 +* **GPUメモリの制約**: GPUで実行すると、特に大きなモデルを訓練する際にGPUメモリ不足になることがあります。 +* **GPUメモリ消費量**: 訓練時に消費されるGPUメモリ量は、ミニバッチサイズを含む様々な要因に依存します。 +* ミニバッチサイズを最小化する: GPUメモリ問題に直面した場合、解決策としてコード内のミニバッチサイズを減らすことを検討してください。 +* **TensorFlowのGPUメモリ解放**: 古いバージョンのTensorFlowは、一つのPythonカーネル内で複数のモデルを訓練するとGPUメモリを正しく解放しないことがあります。GPUメモリの使用を効果的に管理するために、TensorFlowのGPUメモリを必要に応じて割り当てる設定が可能です。 +* コードの挿入: TensorFlowを必要に応じてGPUメモリを割り当てるモードに設定するには、ノートブックに以下のコードを含めてください: ```python physical_devices = tf.config.list_physical_devices('GPU') @@ -53,17 +53,21 @@ if len(physical_devices)>0: tf.config.experimental.set_memory_growth(physical_devices[0], True) ``` -古典的な機械学習の観点からNLPを学びたい場合は、[このレッスン集](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP)をご覧ください。 +クラシックな機械学習の視点からNLPを学びたい場合は、[このレッスンスイート](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) を参照してください -## このセクションで学ぶ内容 -このセクションでは以下について学びます: +## このセクションで学ぶこと +このセクションでは以下のことを学びます: * [テキストをテンソルとして表現する](13-TextRep/README.md) * [単語埋め込み](14-Emdeddings/README.md) -* [言語モデリング](15-LanguageModeling/README.md) +* [言語モデル](15-LanguageModeling/README.md) * [リカレントニューラルネットワーク](16-RNN/README.md) -* [生成ネットワーク](17-GenerativeNetworks/README.md) +* [生成モデル](17-GenerativeNetworks/README.md) * [トランスフォーマー](18-Transformers/README.md) -**免責事項**: -この文書は、AI翻訳サービス [Co-op Translator](https://github.com/Azure/co-op-translator) を使用して翻訳されています。正確性を追求しておりますが、自動翻訳には誤りや不正確な部分が含まれる可能性があることをご承知おきください。元の言語で記載された文書が公式な情報源とみなされるべきです。重要な情報については、専門の人間による翻訳を推奨します。この翻訳の使用に起因する誤解や誤認について、当方は一切の責任を負いません。 \ No newline at end of file +--- + + +**免責事項**: +本書類は AI 翻訳サービス [Co-op Translator](https://github.com/Azure/co-op-translator) を使用して翻訳されています。正確性を期していますが、自動翻訳には誤りや不正確な部分が含まれる可能性があることをご承知おきください。原文の原語版が正式な情報源とみなされるべきです。重要な情報については、専門の人間による翻訳を推奨します。本翻訳の利用により生じたいかなる誤解や解釈違いについても、当方は責任を負いかねます。 + \ No newline at end of file diff --git a/translations/zh-HK/.co-op-translator.json b/translations/zh-HK/.co-op-translator.json index a3f9ab06..2b70448e 100644 --- a/translations/zh-HK/.co-op-translator.json +++ b/translations/zh-HK/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "zh-HK" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T19:30:26+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "zh-HK" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T15:47:30+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "zh-HK" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "zh-HK", + "failure_date": "2026-07-08T19:20:03+00:00", + "status": "failed", + "error_type": "TranslationIncompleteError", + "error_message": "Markdown translation remained incomplete for chunk 1.1.1 of 'LICENSE.md', and the chunk could not be split further.", + "translator_version": "0.20.0", + "failure_policy_version": 1 + } + }, "etc/CODE_OF_CONDUCT.md": { "original_hash": "c06b12caf3c901eb3156e3dd5b0aea56", "translation_date": "2025-08-24T22:17:55+00:00", @@ -54,8 +73,8 @@ "language_code": "zh-HK" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-10-03T11:27:49+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T19:15:45+00:00", "source_file": "examples/README.md", "language_code": "zh-HK" }, @@ -66,8 +85,8 @@ "language_code": "zh-HK" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-15T11:59:59+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T19:16:09+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "zh-HK" }, @@ -191,6 +210,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "zh-HK" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T19:11:32+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "zh-HK" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-08-24T22:03:37+00:00", @@ -330,8 +355,8 @@ "language_code": "zh-HK" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-08-24T21:43:23+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T19:16:35+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "zh-HK" }, diff --git a/translations/zh-HK/CONTRIBUTING.md b/translations/zh-HK/CONTRIBUTING.md new file mode 100644 index 00000000..ad44e186 --- /dev/null +++ b/translations/zh-HK/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# 為 AI 初學者 貢獻 + +感謝您有興趣為 AI-For-Beginners 貢獻!我們歡迎翻譯、課程修正及格式更正。 + +## 微軟貢獻者授權協議 (CLA) + +本專案歡迎貢獻和建議。大多數貢獻者必須同意貢獻者授權協議(CLA),聲明您有權利並確實授權我們使用您的貢獻。詳情請參閱 [https://cla.microsoft.com](https://cla.microsoft.com)。 + +當您提交拉取請求時,CLA 機器人會自動判斷您是否需要提供 CLA 並對 PR 做出適當標記(如標籤、評論)。只需依照機器人指示操作。您在所有使用我們 CLA 的倉庫中只需執行一次此操作。 + +## 如何貢獻 + +### 1. 修正拼字錯誤/程式碼錯誤 +如果您發現任何 Jupyter 筆記本或課程 markdown 檔案裡有拼字或錯誤: +1. 分叉該倉庫。 +2. 修正拼字錯誤或損壞連結。 +3. 提交拉取請求時附上明確的修正說明。 + +### 2. 提交翻譯 +我們歡迎將課程翻譯成其他語言!請將翻譯放置於 `translations/` 目錄下,使用現有的資料夾名稱(例如 `translations/es/`、`translations/pt-BR/`、`translations/zh-CN/`)。 + +更多詳情,請參考 [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md)。 + +--- + + +**免責聲明**: +本文件由 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 翻譯而成。雖然我們致力於確保準確性,但請注意,機器自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於重要資訊,建議進行專業人工翻譯。我們不對因使用本翻譯而產生的任何誤解或誤釋承擔責任。 + \ No newline at end of file diff --git a/translations/zh-HK/examples/README.md b/translations/zh-HK/examples/README.md index 12eedce6..5deeed27 100644 --- a/translations/zh-HK/examples/README.md +++ b/translations/zh-HK/examples/README.md @@ -1,31 +1,31 @@ -# 初學者友善的 AI 範例 +# 適合初學者的 AI 範例 -歡迎!此目錄包含簡單、獨立的範例,幫助你開始學習 AI 和機器學習。每個範例都設計得易於理解,並附有詳細的註解和逐步解說。 +歡迎!此目錄包含簡單的獨立範例,幫助你入門 AI 和機器學習。每個範例均設計為適合初學者,並附有詳細的註解和逐步說明。 -## 📚 範例概覽 +## 📚 範例總覽 -| 範例 | 描述 | 難度 | 先決條件 | -|------|------|------|----------| -| [Hello AI World](../../../examples/01-hello-ai-world.py) | 你的第一個 AI 程式 - 簡單的模式識別 | ⭐ 初學者 | Python 基礎 | -| [Simple Neural Network](../../../examples/02-simple-neural-network.py) | 從零開始建立一個神經網絡 | ⭐⭐ 初學者+ | Python、基礎數學 | -| [Image Classifier](./03-image-classifier.ipynb) | 使用預訓練模型進行圖片分類 | ⭐⭐ 初學者+ | Python、numpy | -| [Text Sentiment](../../../examples/04-text-sentiment.py) | 分析文字情感(正面/負面) | ⭐⭐ 初學者+ | Python | +| 範例 | 說明 | 難度 | 預備知識 | +|---------|-------------|------------|---------------| +| [Hello AI World](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/01-hello-ai-world.py) | 你的第一個 AI 程式 - 簡單的模式識別 | ⭐ 初學者 | Python 基礎 | +| [Simple Neural Network](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | 從零建立神經網絡 | ⭐⭐ 初學者+ | Python、基礎數學 | +| [Image Classifier](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | 利用預訓練模型分類影像 | ⭐⭐ 初學者+ | Python、numpy | +| [Text Sentiment](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/04-text-sentiment.py) | 分析文本情緒(正面/負面) | ⭐⭐ 初學者+ | Python | ## 🚀 開始使用 -### 先決條件 +### 預備條件 -請確保已安裝 Python(建議使用 3.8 或更高版本)。安裝所需的套件: +請確保已安裝 Python(建議 3.8 以上)。安裝所需套件: ```bash -# For Python scripts +# 適用於 Python 腳本 pip install numpy -# For Jupyter notebooks (image classifier) +# 適用於 Jupyter 筆記本(圖像分類器) pip install jupyter numpy pillow tensorflow ``` -或者使用主課程中的 conda 環境: +或使用主要課程中的 conda 環境: ```bash conda env create --name ai4beg --file ../environment.yml @@ -34,35 +34,35 @@ conda activate ai4beg ### 執行範例 -**對於 Python 腳本 (.py 檔案):** +**對於 Python 腳本(.py 檔案):** ```bash python 01-hello-ai-world.py ``` -**對於 Jupyter 筆記本 (.ipynb 檔案):** +**對於 Jupyter 筆記本(.ipynb 檔案):** ```bash jupyter notebook 03-image-classifier.ipynb ``` -## 📖 學習路徑 +## 📖 學習路線 -我們建議按照以下順序學習範例: +建議依序完成以下範例: -1. **從 "Hello AI World" 開始** - 學習模式識別的基礎 -2. **建立一個簡單的神經網絡** - 理解神經網絡的運作方式 -3. **嘗試圖片分類器** - 使用真實圖片體驗 AI 的應用 -4. **分析文字情感** - 探索自然語言處理 +1. **從「Hello AI World」開始** - 學習模式識別基礎 +2. 建立簡單神經網絡 - 了解神經網絡運作方式 +3. 嘗試影像分類器 - 見識 AI 實際應用於真實影像 +4. 分析文本情緒 - 探索自然語言處理 -## 💡 初學者提示 +## 💡 初學者小提示 -- **仔細閱讀程式碼註解** - 它們解釋了每一行的作用 -- **多嘗試!** - 嘗試更改數值並觀察結果 -- **不用擔心完全理解** - 學習是需要時間的 -- **提出問題** - 使用 [討論板](https://github.com/microsoft/AI-For-Beginners/discussions) +- 仔細閱讀程式註解 - 這些會說明每行程式碼的作用 +- **多做實驗!** - 嘗試更改數值,觀察結果變化 +- 不用擔心一下子全部都懂 - 學習需要時間 +- 勇於提問 - 使用 [討論區](https://github.com/microsoft/AI-For-Beginners/discussions) -## 🔗 下一步 +## 🔗 後續步驟 -完成這些範例後,探索完整課程: +完成這些範例後,可探索完整課程: - [AI 簡介](../lessons/1-Intro/README.md) - [神經網絡](../lessons/3-NeuralNetworks/README.md) - [電腦視覺](../lessons/4-ComputerVision/README.md) @@ -70,16 +70,18 @@ jupyter notebook 03-image-classifier.ipynb ## 🤝 貢獻 -覺得這些範例有幫助嗎?幫助我們改進: -- 回報問題或提出改進建議 -- 添加更多適合初學者的範例 -- 改善文件和註解 +覺得這些範例有幫助嗎?歡迎幫助我們改進: +- 回報問題或建議改進 +- 新增更多適合初學者的範例 +- 改善文件與註解 --- -*記住:每位專家都曾是初學者。祝學習愉快! 🎓* +*記住:每位專家都曾是初學者。祝你學習愉快!🎓* --- -**免責聲明**: -本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於重要資訊,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋概不負責。 \ No newline at end of file + +**免責聲明**: +本文件由 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 翻譯而成。雖然我們致力於確保準確性,但請注意,機器自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於重要資訊,建議進行專業人工翻譯。我們不對因使用本翻譯而產生的任何誤解或誤釋承擔責任。 + \ No newline at end of file diff --git a/translations/zh-HK/lessons/0-course-setup/how-to-run.md b/translations/zh-HK/lessons/0-course-setup/how-to-run.md index fcc13997..1f9a284a 100644 --- a/translations/zh-HK/lessons/0-course-setup/how-to-run.md +++ b/translations/zh-HK/lessons/0-course-setup/how-to-run.md @@ -1,12 +1,12 @@ -# 如何執行程式碼 +# 如何執行代碼 -本課程包含了很多可執行的範例和實驗室,你會想要運行它們。為此,你需要能在本課程提供的 Jupyter 筆記本中執行 Python 程式碼。你有幾種選擇來執行程式碼: +本課程包含許多可執行的範例和實驗室,您會想要運行它們。要做到這一點,您需要能夠在本課程附帶的 Jupyter 筆記本中執行 Python 代碼。您有幾種運行代碼的選項: -## 在你的電腦本地執行 +## 在您的電腦本地運行 -要在你的電腦本地執行程式碼,需要安裝 Python。推薦安裝 **[miniconda](https://conda.io/en/latest/miniconda.html)** —— 它是個相當輕量的安裝,支援 `conda` 套件管理器來處理不同的 Python **虛擬環境**。 +為了在您的電腦本地運行代碼,需要安裝 Python。建議安裝 **[miniconda](https://conda.io/en/latest/miniconda.html)** —— 它是一個相當輕量的安裝包,支援使用 `conda` 套件管理器來管理不同的 Python 虛擬環境。 -安裝 miniconda 後,請複製這個資料庫並建立一個虛擬環境,用於本課程: +安裝 miniconda 後,請克隆此倉庫並創建一個該課程使用的虛擬環境: ```bash git clone http://github.com/microsoft/ai-for-beginners @@ -15,61 +15,57 @@ conda env create --name ai4beg --file .devcontainer/environment.yml conda activate ai4beg ``` +### 使用 Visual Studio Code 搭配 Python 擴展 -### 使用含 Python 擴充功能的 Visual Studio Code +本課程最佳使用方式是打開 [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) 並安裝 [Python 擴展](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste)。 -本課程最適合在 [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) 中開啟,並搭配 [Python 擴充功能](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste) 使用。 +> 注意: 當您克隆並在 VS Code 打開目錄時,它會自動建議您安裝 Python 擴展。您還需要依照上述說明安裝 miniconda。 -> **注意**:當你複製並在 VS Code 中開啟目錄後,它會自動建議你安裝 Python 擴充功能。你也需要照上述說明安裝 miniconda。 - -> **注意**:如果 VS Code 建議你在容器中重新開啟倉庫,請拒絕此建議以使用本地 Python 安裝。 +> 注意: 如果 VS Code 提示您重新在容器中打開該倉庫,您應該拒絕此提議,以便使用本地的 Python 安裝。 ### 在瀏覽器中使用 Jupyter -你也可以在自己的電腦瀏覽器中使用 Jupyter 環境。傳統 Jupyter 和 JupyterHub 都提供方便的開發環境,包括自動補全、程式碼高亮等功能。 +您也可以在自己電腦的瀏覽器中使用 Jupyter 環境。無論是經典 Jupyter 還是 JupyterHub,都提供了方便的開發環境,擁有自動完成功能、代碼高亮等。 -要在本地啟動 Jupyter,前往課程目錄並執行: +若要在本地啟動 Jupyter,請進入課程目錄並執行: ```bash jupyter notebook ``` - 或 +或 ```bash jupyterhub ``` +然後您可以導航至任何 `.ipynb` 文件,打開並開始使用。 +### 容器中運行 -之後,你可以導航到任意 `.ipynb` 檔案,開啟它們並開始工作。 +不安裝 Python 的另一個方案是將代碼在容器中運行。由於本倉庫提供了一個特殊的 `.devcontainer` 資料夾,指示如何為此倉庫構建容器,VS Code 可提供重新在容器中打開代碼的機會。這需要安裝 Docker,且操作較複雜,我們建議較有經驗的使用者使用。 -### 在容器中運行 +## 在雲端運行 -另一種選擇是不安裝 Python,而是在容器中運行程式碼。由於我們的資料庫包含一個特殊的 `.devcontainer` 資料夾,說明如何為此倉庫建置容器,VS Code 提供在容器中重新開啟程式碼的選項。這需要安裝 Docker,且過程較複雜,因此建議有經驗的使用者使用。 +如果您不想在本地安裝 Python,且能使用某些雲端資源,一個很好的替代方案是將代碼放到雲端運行。您可以用以下幾種方式: -## 在雲端執行 +* 使用 **[GitHub Codespaces](https://github.com/features/codespaces)**,這是一個在 GitHub 上為您創建的虛擬環境,通過 VS Code 的瀏覽器界面存取。只要您能使用 Codespaces,點擊倉庫中的 **Code** 按鈕,啟動一個 codespace,即可迅速開始工作。 +* 使用 **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**。[Binder](https://mybinder.org) 為像您這樣的用戶免費提供雲端計算資源,可讓您測試 GitHub 上的部分代碼。首頁有按鈕可在 Binder 中打開此倉庫 —— 它會迅速帶您進入 Binder 網站,該網站會構建底層容器並無縫啟動 Jupyter 網頁介面。 -如果你不想在本地安裝 Python,且能存取一些雲端資源,另一個好選擇是在雲端運行程式碼。你有幾種方式可以做到: +> 注意: 為防止濫用,Binder 對部分網路資源設有限制。這可能導致某些代碼無法正常執行(尤其是從公開網路下載模型和/或數據集時)。您可能需要尋找替代方案。此外,Binder 提供的計算資源較為基礎,因此訓練過程會較慢,特別是在後期較複雜的課程中。 -* 使用 **[GitHub Codespaces](https://github.com/features/codespaces)**,這是在 GitHub 上為你建立的虛擬環境,通過 VS Code 瀏覽器介面存取。如果你有 Codespaces 權限,只需點選倉庫內的 **Code** 按鈕,啟動 codespace,即可快速開始。 +## 在雲端使用 GPU 運行 -* 使用 **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**。 [Binder](https://mybinder.org) 為用戶提供免費的雲端運算資源,方便你測試 GitHub 上的程式碼。首頁有個按鈕可在 Binder 中開啟該倉庫——它會快速帶你進入 Binder 網站,建立底層容器並無縫啟動 Jupyter 網頁介面。 +本課程後期的部分課程將大大受惠於 GPU 支持。例如模型訓練,若無 GPU 輔助會非常緩慢。有幾種選項特別適合擁有雲端資源的用戶,例如通過 [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) 或透過您的學術機構: -> **注意**:為防止濫用,Binder 有些網路資源的訪問被阻擋,這可能會導致部分從公共網際網路抓取模型和/或資料集的程式碼無法運作。你可能需要尋找替代方案。此外,Binder 提供的運算資源相當基礎,訓練速度會慢,尤其是在後面較複雜的課程中。 +* 建立 [資料科學虛擬機器](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste),並透過 Jupyter 連線到該機器,然後您可以直接在該機器克隆倉庫開始學習。NC 系列虛擬機器支援 GPU。 -## 在雲端使用 GPU 執行 +> 注意: 某些訂閱(包括 Azure for Students)預設不提供 GPU 支持。您可能需要透過技術支援申請額外的 GPU 核心。 -本課程後期的某些課程會從 GPU 支援中大幅獲益。例如模型訓練否則會非常緩慢。若你透過 [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) 或你的學校取得雲端資源,可參考以下選項: +* 建立 [Azure 機器學習工作區](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste),然後使用筆記本功能。此 [影片](https://azure-for-academics.github.io/quickstart/azureml-papers/) 示範如何在 Azure ML 筆記本中克隆倉庫並開始使用。 -* 建立 [Data Science 虛擬機](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) 並透過 Jupyter 連接它。你可直接將倉庫複製到該機器,然後開始學習。NC 系列虛擬機支援 GPU。 - -> **注意**:部分訂閱方案(包括 Azure for Students)預設不提供 GPU 支援,你可能需透過技術支援請求額外核配 GPU 核心。 - -* 建立 [Azure 機器學習工作區](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste),並使用該處的筆記本功能。[這段影片](https://azure-for-academics.github.io/quickstart/azureml-papers/) 介紹如何將倉庫克隆到 Azure ML 筆記本並開始使用。 - -你也可以使用 Google Colab,它提供一些免費的 GPU 支援,並可將 Jupyter 筆記本逐一上傳執行。 +您也可以使用 Google Colab,它提供部分免費 GPU 支持,並上傳 Jupyter 筆記本逐個執行。 --- -**免責聲明**: -本文件由 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們盡力確保準確性,但請注意,自動翻譯可能存在錯誤或不準確之處。原始文件的母語版本應視為權威來源。對於重要資訊,建議採用專業人工翻譯。我們不對因使用本翻譯所引起的任何誤解或誤釋承擔責任。 +**免責聲明**: +本文件由 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 翻譯而成。雖然我們致力於確保準確性,但請注意,機器自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於重要資訊,建議進行專業人工翻譯。我們不對因使用本翻譯而產生的任何誤解或誤釋承擔責任。 \ No newline at end of file diff --git a/translations/zh-HK/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/zh-HK/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index 785ee9e5..997d8af8 100644 --- a/translations/zh-HK/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/zh-HK/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -6,9 +6,9 @@ "source": [ "# 預訓練模型與遷移學習\n", "\n", - "訓練 CNNs(卷積神經網絡)可能需要花費大量時間,並且需要大量數據。然而,大部分時間其實是用來學習網絡用於從圖像中提取模式的最佳低層濾波器。一個自然的問題是:我們是否可以使用在某個數據集上訓練好的神經網絡,並將其適應於分類不同的圖像,而無需完整的訓練過程?\n", + "訓練卷積神經網絡(CNN)可能需要相當多的時間,也需要大量的數據。然而,大部分時間都是用來學習網絡用於從圖像中提取模式的最佳低層過濾器。一個自然的問題是——我們能否使用在一個數據集上訓練的神經網絡,並將其調整用於分類不同的圖像,而無需完整的訓練過程?\n", "\n", - "這種方法被稱為**遷移學習**,因為我們將某個神經網絡模型的部分知識轉移到另一個模型中。在遷移學習中,我們通常從一個預訓練模型開始,該模型已經在一些大型圖像數據集(例如 **ImageNet**)上進行過訓練。這些模型已經能夠很好地從通用圖像中提取不同的特徵,而在許多情況下,只需在這些提取的特徵之上構建一個分類器,就能獲得不錯的結果。\n" + "這種方法稱為遷移學習,因為我們將一些知識從一個神經網絡模型轉移到另一個模型。在遷移學習中,我們通常從一個預訓練模型開始,該模型已經在某個大型圖像數據集上訓練過,例如ImageNet。這些模型已經能夠很好地從通用圖像中提取不同特徵,在許多情況下,只需在這些提取的特徵之上建立一個分類器,就可以得到不錯的結果。\n" ] }, { @@ -29,11 +29,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 貓與狗數據集\n", + "## 貓與狗資料集\n", "\n", - "在本單元中,我們將解決一個實際問題:分類貓與狗的圖片。為此,我們將使用 [Kaggle Cats vs. Dogs Dataset](https://www.kaggle.com/c/dogs-vs-cats),該數據集也可以從 [Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste) 下載。\n", + "在本單元中,我們將解決一個貓與狗圖像分類的實際問題。為此,我們將使用 [Kaggle Cats vs. Dogs Dataset](https://www.kaggle.com/c/dogs-vs-cats) 資料集,也可以從 [Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste) 下載。\n", "\n", - "讓我們下載這個數據集並將其解壓到 `data` 目錄中(這個過程可能需要一些時間!):\n" + "讓我們下載這個資料集並解壓到 `data` 目錄(此過程可能需要一些時間!):\n" ] }, { @@ -64,7 +64,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "不幸的是,數據集中有一些損壞的圖像文件。我們需要快速清理以檢查損壞的文件。為了不影響本教程,我們將驗證數據集的代碼移到了模組中。\n" + "不幸地,資料集中有一些損毀的影像檔案。我們需要快速清理以檢查損毀檔案。為了不破壞本教程,我們將驗證資料集的代碼移至模組中。\n" ] }, { @@ -333,13 +333,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 加載數據集\n", + "## 載入數據集\n", "\n", - "在之前的例子中,我們使用的是 Keras 內建的數據集。現在,我們將處理自己的數據集,需要從圖像目錄中加載數據。\n", + "在之前的範例中,我們載入的是 Keras 內建的數據集。現在我們將處理自己的數據集,需要從一個圖片目錄中載入。\n", "\n", - "在現實中,圖像數據集的大小可能非常大,無法依賴所有數據都能夠完全載入到內存中。因此,數據集通常表示為**生成器**,可以以適合訓練的小批量形式返回數據。\n", + "在現實中,圖片數據集的大小可能相當龐大,無法保證所有資料能一次載入記憶體。因此,數據集通常以生成器形式呈現,可以回傳適合訓練的小批次資料。\n", "\n", - "為了處理圖像分類,Keras 提供了一個特殊的函數 `image_dataset_from_directory`,它可以從對應不同類別的子目錄中加載圖像。這個函數還負責縮放圖像,並且可以將數據集分為訓練和測試子集:\n" + "為了處理影像分類,Keras 提供了專門的函數 `image_dataset_from_directory`,可以從對應不同類別的子目錄中載入圖片。此函數同時會處理圖片縮放,並且可以將數據集分割為訓練和測試子集:\n" ] }, { @@ -383,9 +383,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "在兩次調用中設置相同的 `seed` 值是很重要的,因為這會影響圖像在訓練集和測試集之間的劃分。\n", + "為兩次呼叫設置相同的 `seed` 值非常重要,因為它會影響圖像在訓練和測試數據集之間的劃分。\n", "\n", - "數據集會自動從目錄中獲取類別名稱,如果需要,你可以通過調用以下方式訪問它們:\n" + "Dataset 會自動從目錄中擷取類別名稱,若需要可以透過呼叫以下方式取得:\n" ] }, { @@ -412,7 +412,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "我們獲得的數據集可以直接傳遞給 `fit` 函數來訓練模型。它們包含相應的圖像和標籤,可以使用以下結構進行迴圈:\n" + "我們取得的數據集可以直接傳入 `fit` 函數來訓練模型。它們包含了對應的影像和標籤,可以使用以下結構進行迭代:\n" ] }, { @@ -453,7 +453,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "> **注意**:數據集中的所有圖像均以浮點數張量表示,範圍為 0-255。在將它們傳遞給神經網絡之前,我們需要將這些值縮放到 0-1 範圍。在繪製圖像時,我們需要執行相同操作,或者將值轉換為 `int` 類型(如上面的代碼所示),以告訴 `matplotlib` 我們希望繪製原始未縮放的圖像。\n" + "> 注意:數據集中所有圖片皆表示為範圍介乎 0-255 的浮點張量。在傳入神經網絡之前,我們需要將這些數值縮放至 0-1 範圍內。當繪製圖片時,我們要麼同樣進行縮放,要麼將數值轉換為 `int` 類型(正如上述程式碼中所做),以告訴 `matplotlib` 我們要繪製原始未縮放的圖片。\n" ] }, { @@ -462,7 +462,7 @@ "source": [ "## 預訓練模型\n", "\n", - "對於許多圖像分類任務,可以找到預訓練的神經網絡模型。許多這些模型都可以在 `keras.applications` 命名空間中找到,甚至更多的模型可以在互聯網上找到。讓我們看看如何加載和使用最簡單的 VGG-16 模型:\n" + "對於許多影像分類任務,可以找到預訓練的神經網絡模型。這些模型中有許多可在 `keras.applications` 命名空間中找到,甚至在網絡上可以找到更多模型。讓我們看看如何載入並使用最簡單的 VGG-16 模型:\n" ] }, { @@ -497,7 +497,17 @@ } ], "source": [ - "vgg = keras.applications.VGG16()\n", + "# SHA-256 of VGG16 weights (with top)\n", + "VGG16_WEIGHTS_SHA256 = '64373286793e3c8b2b4e3219cbf3544bce2f55ab4682710a29f5e7af8f5e4f61'\n", + "\n", + "_weights_path = keras.utils.get_file(\n", + " 'vgg16_weights_tf_dim_ordering_tf_kernels.h5',\n", + " 'https://storage.googleapis.com/tensorflow/keras-applications/vgg16/vgg16_weights_tf_dim_ordering_tf_kernels.h5',\n", + " file_hash=VGG16_WEIGHTS_SHA256,\n", + " hash_algorithm='sha256',\n", + ")\n", + "\n", + "vgg = keras.applications.VGG16(weights=_weights_path)\n", "inp = keras.applications.vgg16.preprocess_input(x_sample[:1])\n", "\n", "res = vgg(inp)\n", @@ -510,20 +520,17 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "這裡有幾個重要的事項:\n", - "\n", - "* 在將輸入傳遞給任何預訓練的網絡之前,必須以某種方式進行預處理。這可以通過調用相應的 `preprocess_input` 函數來完成,該函數接收一批圖像,並返回它們處理後的形式。以 VGG-16 為例,圖像會被正規化,並且從每個通道中減去一些預定義的平均值。這是因為 VGG-16 最初是在這種預處理的基礎上進行訓練的。\n", - "\n", - "* 神經網絡會應用於輸入的批次,結果我們會得到一批包含 1000 個元素的張量,這些元素表示每個類別的概率。我們可以通過對這個張量調用 `argmax` 來找到最有可能的類別編號。\n", - "\n", - "* 獲得的結果是一個 [`ImageNet` 類別的編號](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a)。為了更好地理解這個結果,我們還可以使用 `decode_predictions` 函數,該函數會返回前 n 個類別及其名稱。\n" + "有幾個重要的事情需要說明:\n", + "* 在將輸入傳遞給任何預訓練網絡之前,必須先以某種方式進行預處理。這是通過調用相應的 `preprocess_input` 函數來完成的,該函數接收一批圖像,並返回它們的處理結果。以 VGG-16 為例,圖像會被正規化,並從每個通道中減去一些預先定義的平均值。這是因為 VGG-16 原本就是在這種預處理方式下訓練的。\n", + "* 將神經網絡應用於輸入批次,結果會得到一批包含 1000 元素的張量,該張量展示了每個類別的概率。我們可以通過在此張量上調用 `argmax` 來找到最可能的類別編號。\n", + "* 獲得的結果是一個 [ImageNet 類別的編號](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a)。要理解這個結果,我們也可以使用 `decode_predictions` 函數,它會返回排名前 n 的類別及其名稱。\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "讓我們也看看 VGG-16 網絡的架構:\n" + "我們也來看看 VGG-16 網絡的架構:\n" ] }, { @@ -602,7 +609,7 @@ "source": [ "## GPU 計算\n", "\n", - "深度神經網絡,例如 VGG-16 和其他更現代的架構,需要相當大的計算能力才能運行。如果有 GPU 加速可用,使用它是合理的選擇。幸運的是,如果 GPU 可用,Keras 會自動加速 GPU 上的計算。我們可以使用以下代碼檢查 Tensorflow 是否能夠使用 GPU:\n" + "深度神經網絡,如 VGG-16 及其他更現代的架構需要相當多的計算能力來執行。如果有可用的 GPU,加速運算是合理的選擇。幸運地是,Keras 如果可用 GPU 就會自動加速計算。我們可以用以下程式碼檢查 Tensorflow 是否能使用 GPU:\n" ] }, { @@ -629,9 +636,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "\n", "## 提取 VGG 特徵\n", "\n", - "如果我們想使用 VGG-16 從圖片中提取特徵,我們需要一個沒有最終分類層的模型。我們可以使用以下程式碼來實例化一個沒有頂層的 VGG-16 模型:\n" + "如果我們想使用 VGG-16 從影像提取特徵,我們需要沒有最終分類層的模型。我們可以使用以下程式碼實例化沒有頂層的 VGG-16 模型:\n" ] }, { @@ -683,9 +691,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "特徵張量的維度是 7x7x512,但為了方便視覺化,我們需要將其重塑為 2D 形式。\n", + "特徵張量的維度是 7x7x512,但為了視覺化,我們必須將它重塑為 2D 形式。\n", "\n", - "現在讓我們嘗試看看這些特徵是否可以用來分類圖片。我們可以手動選取部分圖片(在這裡是 50 個小批次),並預先計算它們的特徵向量。我們可以使用 Tensorflow 的 **dataset** API 來完成這個操作。`map` 函數會接收一個數據集,並應用指定的 lambda 函數來進行轉換。我們利用這個機制來構建新的數據集,`ds_features_train` 和 `ds_features_test`,這些數據集包含的是 VGG 提取的特徵,而不是原始圖片。\n" + "現在讓我們嘗試看看這些特徵是否可以用於分類圖像。讓我們手動取出部分圖像(在我們的例子中是 50 個小批次),並預先計算它們的特徵向量。我們可以使用 Tensorflow 的 **dataset** API 來完成這件事。`map` 函數接收一個資料集,並套用給定的 lambda 函數來轉換它。我們利用這個機制來構造新的資料集 `ds_features_train` 和 `ds_features_test`,它們包含的是經過 VGG 提取的特徵,而非原始圖像。\n" ] }, { @@ -715,9 +723,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "我們使用了 `.take(50)` 來限制數據集的大小,以加快演示速度。當然,你可以在完整的數據集上進行這個實驗。\n", + "我們使用 `.take(50)` 這個語句來限制資料集大小,以加快示範速度。當然,你也可以在完整資料集上進行這個實驗。\n", "\n", - "現在我們已經擁有一個包含提取特徵的數據集,我們可以訓練一個簡單的密集分類器來區分貓和狗。這個網絡將接收形狀為 (7,7,512) 的特徵向量,並生成一個輸出,對應於狗或貓。由於這是一個二元分類,我們使用 `sigmoid` 激活函數和 `binary_crossentropy` 損失函數。\n" + "現在我們有一個含抽取特徵的資料集,接著可以訓練一個簡單的密集分類器以區分貓和狗。這個網絡會接受形狀為 (7,7,512) 的特徵向量,並輸出一個對應狗或貓的結果。因為是二元分類,我們使用 `sigmoid` 激活函數和 `binary_crossentropy` 損失函數。\n" ] }, { @@ -746,13 +754,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "結果非常好,我們能以接近 95% 的準確率區分貓和狗!然而,我們僅在所有圖片的一個子集上測試了這種方法,因為手動特徵提取似乎非常耗時。\n", + "結果非常好,我們可以以接近95%的機率區分貓和狗!不過,我們只在所有圖片的子集上測試了這種方法,因為手動特徵提取似乎需要花費很多時間。\n", "\n", - "## 使用一個 VGG 網絡進行遷移學習\n", + "## 使用一個 VGG 網絡的遷移學習\n", "\n", - "我們也可以通過在訓練過程中使用完整的 VGG-16 網絡來避免手動預先計算特徵,方法是將特徵提取器作為我們網絡的第一層。\n", + "我們也可以在訓練中使用原始的 VGG-16 網絡作為整體,通過將特徵提取器作為我們網絡的第一層,來避免手動預先計算特徵。\n", "\n", - "Keras 架構的美妙之處在於,我們上面定義的 VGG-16 模型也可以作為另一個神經網絡中的一層使用!我們只需要構建一個在其上方添加密集分類器的網絡,然後通過反向傳播訓練整個網絡即可。\n" + "Keras 架構的優點在於,我們上述定義的 VGG-16 模型也可以作為另一個神經網絡中的一層使用!我們只需要在它的頂層構建一個密集分類器,然後使用反向傳播訓練整個網絡即可。\n" ] }, { @@ -796,13 +804,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "這個模型看起來像是一個端到端的分類網絡,它接收一張圖片並返回其類別。然而,關鍵在於我們希望 VGG16 作為特徵提取器,而不是重新訓練。因此,我們需要**凍結卷積特徵提取器的權重**。我們可以通過調用 `model.layers[0]` 來訪問網絡的第一層,然後只需將 `trainable` 屬性設置為 `False`。\n", + "這個模型看起來像是一個端到端的分類網絡,它接受一張圖片並返回類別。不過,棘手的地方在於我們想讓 VGG16 作為特徵提取器,而不是重新訓練。因此,我們需要凍結卷積特徵提取器的權重。我們可以透過呼叫 `model.layers[0]` 訪問網絡的第一層,然後只需將 `trainable` 屬性設為 `False`。\n", "\n", - "> **注意**: 凍結特徵提取器的權重是必要的,因為如果不這樣做,未訓練的分類層可能會破壞卷積提取器原本的預訓練權重。\n", + "> 注意:需要凍結特徵提取器權重,因為否則未經訓練的分類層可能會破壞卷積提取器原本的預訓練權重。\n", "\n", - "你會注意到,雖然我們的網絡總參數數量大約是 1500 萬,但我們只訓練了 2.5 萬個參數。所有其他頂層卷積濾波器的參數都是預訓練的。這是好的,因為我們能夠用較少的樣本微調較少的參數。\n", + "你會注意到,雖然我們網絡的參數總數約有 1500 萬,但我們只訓練了 2.5 萬個參數。所有其他頂層卷積濾波器的參數都是預訓練的。這很好,因為我們可以用較少的範例微調較少的參數。\n", "\n", - "現在我們將訓練網絡,看看能達到什麼效果。預計訓練時間會比較長,如果執行過程中看起來像是卡住了,不用擔心。\n" + "我們現在將訓練我們的網絡,看看能達到多好的效果。預期訓練時間會相當長,如果執行看似暫停,請不用擔心。\n" ] }, { @@ -827,11 +835,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "看來我們已經成功訓練出一個相當準確的貓狗分類器!\n", + "看來我們已經獲得了一個相當準確的貓與狗分類器! \n", "\n", - "## 儲存和載入模型\n", + "## 儲存與載入模型\n", "\n", - "當我們完成模型訓練後,可以將模型架構和訓練好的權重儲存到檔案中,以便日後使用:\n" + "一旦我們訓練好模型,我們可以將模型架構和訓練好的權重儲存至檔案,以便未來使用:\n" ] }, { @@ -855,7 +863,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "我們可以隨時從檔案中載入模型。這在下一次實驗可能破壞模型的情況下可能會很有用——您就不必從頭開始重新啟動。\n" + "我們之後可以隨時從檔案中載入模型。當下一個實驗可能會毀掉模型時,你可能會覺得這很有用——你不必從頭開始重新開始。\n" ] }, { @@ -873,13 +881,13 @@ "source": [ "## 微調遷移學習\n", "\n", - "在上一節中,我們已經訓練了最終的分類器層,用於分類我們自己的數據集中的圖像。然而,我們並未重新訓練特徵提取器,模型依賴於它在 ImageNet 數據中學到的特徵。如果你的物件在視覺上與普通的 ImageNet 圖像有所不同,這種特徵組合可能未必是最佳的。因此,開始訓練卷積層是合理的。\n", + "在上一節中,我們已經訓練了最終的分類器層,以便在我們自己的數據集中分類圖像。然而,我們沒有重新訓練特徵提取器,模型依賴於在 ImageNet 數據上學習到的特徵。如果你的物體在視覺上與普通的 ImageNet 圖像不同,這組合的特徵可能不會是最佳的。因此,開始訓練卷積層也是有意義的。\n", "\n", - "為了做到這一點,我們可以解凍之前已凍結的卷積濾波器參數。\n", + "為此,我們可以解凍之前凍結的卷積濾波器參數。\n", "\n", - "> **注意:** 首先凍結參數並進行幾個訓練週期以穩定分類層的權重是非常重要的。如果你直接開始訓練未凍結參數的端到端網絡,可能會因為大的錯誤而破壞卷積層中的預訓練權重。\n", + "> **注意:** 首先凍結參數並進行數個訓練週期以穩定分類層權重非常重要。如果你立即開始端到端訓練且參數未凍結,卷積層中預訓練的權重很可能會因大誤差而被破壞。\n", "\n", - "我們的卷積 VGG-16 模型位於第一層內部,它本身由許多層組成。我們可以查看它的結構:\n" + "我們的卷積 VGG-16 模型位於第一層內部,且自身包含多個層。我們可以看看它的結構:\n" ] }, { @@ -948,7 +956,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "我們可以解凍卷積基底的所有層:\n" + "我們可以解鎖卷積基底的所有層: \n" ] }, { @@ -964,7 +972,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "然而,一次解凍所有層並不是最好的主意。我們可以先只解凍幾個最後的卷積層,因為它們包含與我們的圖像相關的高層次模式。例如,首先,我們可以凍結所有層,除了最後的4層:\n" + "不過,一次過解凍全部層不是最佳方案。我們可以先只解凍最後幾層卷積,因為它們包含對我們圖像有關的較高層次模式。例如,起初我們可以凍結除最後 4 層之外的所有層: \n" ] }, { @@ -1003,11 +1011,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "觀察到可訓練參數的數量顯著增加,但仍然只佔所有參數的大約50%。\n", + "注意可訓練參數的數量顯著增加,但仍約為所有參數的50%。\n", "\n", - "解凍後,我們可以進行多幾個訓練週期(在我們的例子中,我們只進行一個)。你也可以選擇較低的學習率,以減少對預訓練權重的影響。然而,即使使用低學習率,你仍然可以預期在訓練初期準確度會下降,直到最終達到比固定權重情況稍高的水平。\n", + "解凍後,我們可以再進行幾個訓練周期(在我們的例子中,我們只做了一個)。你也可以選擇較低的學習率,以盡量減少對預訓練權重的影響。不過,即使學習率很低,你仍可以預期訓練開始時準確率會下降,直到最終達到略高於固定權重情況的水平。\n", "\n", - "> **注意:** 這種訓練速度會慢得多,因為我們需要將梯度反向傳播到網絡的多層!\n" + "> **注意:** 這種訓練會慢得多,因為我們需要將梯度反向傳播通過網絡的多層!\n" ] }, { @@ -1031,9 +1039,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "我們可能會達到更高的訓練準確率,因為我們使用了更強大的網絡並且擁有更多的參數,但驗證準確率的提升可能不會那麼明顯。\n", + "我們很可能會達到較高的訓練準確率,因為我們使用了更多參數的更強大網絡,但驗證準確率的提升不會那麼多。 \n", "\n", - "可以嘗試解鎖網絡中的更多層並進行更多訓練,看看是否能夠達到更高的準確率!\n" + "歡迎您解凍更多網絡層並進行更多訓練,看看是否能達成更高的準確率! \n" ] }, { @@ -1042,7 +1050,7 @@ "source": [ "## 其他電腦視覺模型\n", "\n", - "VGG-16 是其中一個最簡單的電腦視覺架構。Keras 提供了更多預訓練的網絡。其中最常用的包括由 Microsoft 開發的 **ResNet** 架構,以及 Google 的 **Inception**。例如,我們可以探索最簡單的 ResNet-50 模型的架構(ResNet 是一個擁有不同深度的模型系列,如果你想看看真正深度的模型,可以嘗試 ResNet-152):\n" + "VGG-16 是最簡單的電腦視覺架構之一。Keras 提供了更多預訓練的網絡。其中最常用的是由微軟開發的 **ResNet** 架構,以及 Google 的 **Inception**。例如,我們來探索最簡單的 ResNet-50 模型的架構(ResNet 是一系列不同深度的模型,如果你想看看真正深層模型的樣子,可以嘗試 ResNet-152):\n" ] }, { @@ -1444,29 +1452,29 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "如你所見,這個模型包含了相同的熟悉組件:卷積層、池化層以及最終的密集分類器。我們可以以完全相同的方式使用這個模型,就像我們之前使用 VGG-16 進行遷移學習一樣。你可以嘗試使用上面的程式碼,將不同的 ResNet 模型作為基礎模型,並觀察準確率的變化。\n", + "如你所見,模型包含相同熟悉的構建模塊:卷積層、池化層和最終的密集分類器。我們可以用完全相同的方式使用這個模型,就像我們使用 VGG-16 進行遷移學習一樣。你可以嘗試上面程式碼,選用不同的 ResNet 模型作為基礎模型,看看精確度如何變化。\n", "\n", - "## 批量正規化\n", + "## 批次正規化\n", "\n", - "這個網絡還包含另一種類型的層:**批量正規化**。批量正規化的概念是將通過神經網絡的數值調整到合適的範圍。通常,神經網絡在所有數值都位於 [-1,1] 或 [0,1] 範圍內時效果最佳,這也是為什麼我們會對輸入數據進行縮放/正規化。然而,在深層網絡的訓練過程中,可能會出現數值大幅超出這些範圍的情況,這會導致訓練變得困難。批量正規化層會計算當前小批量數據的平均值和標準差,並在信號通過神經網絡層之前使用這些值對信號進行正規化。這顯著提高了深層網絡的穩定性。\n" + "此網絡還包含另一種層類型:批次正規化。批次正規化的想法是將通過神經網絡的值帶到正確區間。通常神經網絡在所有值範圍都在 [-1,1] 或 [0,1] 時表現最佳,這也是我們會相應縮放/正規化輸入資料的原因。然而,在訓練深度網絡時,有可能值會顯著偏離這個範圍,導致訓練變得困難。批次正規化層會計算當前小批次所有值的平均值和標準差,並利用它們將訊號正規化後再傳遞到神經網絡層。這大幅提升深度網絡的穩定性。\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## 重點\n", + "## 重點摘要\n", "\n", - "透過遷移學習,我們能夠快速建立一個分類器來完成我們的自定義物件分類任務,並且達到高準確度。然而,這個例子並不完全公平,因為原始的 VGG-16 網絡已經預先訓練過用來辨識貓和狗,因此我們只是重用了網絡中已經存在的大部分模式。對於更具挑戰性的領域特定物件,例如工廠生產線上的細節或不同樹葉的分類,準確度可能會較低。\n", + "使用遷移學習,我們能夠快速組裝出一個分類器來完成我們的自訂物件分類任務,並達到高準確率。不過,此範例並非完全公平,因為原始的 VGG-16 網路是事先訓練來辨識貓和狗,因此我們只是重用網路中已存在的大部分模式。對於較為異域的特定領域物件,例如工廠生產線上的細節或不同樹葉,你可以預期準確率會較低。\n", "\n", - "你可以看到,我們現在正在解決的更複雜任務需要更高的計算能力,並且無法輕易在 CPU 上完成。在下一單元中,我們將嘗試使用更輕量化的實現方式來訓練相同的模型,使用較低的計算資源,並且僅稍微降低準確度。\n" + "你可以看到,我們現在解決的較為複雜的任務需要更高的運算能力,無法輕易在 CPU 上解決。在下一單元中,我們將嘗試用更輕量級的實作,使用較低計算資源訓練相同模型,並且僅僅犧牲稍微降低的準確率。\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**免責聲明**: \n本文件已使用人工智能翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。原始語言的文件應被視為權威來源。對於重要信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋不承擔責任。\n" + "---\n\n\n**免責聲明**:\n本文件由 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 翻譯而成。雖然我們致力於確保準確性,但請注意,機器自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於重要資訊,建議進行專業人工翻譯。我們不對因使用本翻譯而產生的任何誤解或誤釋承擔責任。\n\n" ] } ], @@ -1487,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-08-31T09:41:41+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "hk" } }, "nbformat": 4, diff --git a/translations/zh-HK/lessons/5-NLP/README.md b/translations/zh-HK/lessons/5-NLP/README.md index efaa1882..e314e279 100644 --- a/translations/zh-HK/lessons/5-NLP/README.md +++ b/translations/zh-HK/lessons/5-NLP/README.md @@ -1,51 +1,51 @@ # 自然語言處理 -![NLP 任務的手繪圖概述](../../../../translated_images/zh-HK/ai-nlp.b22dcb8ca4707cea.webp) +![以塗鴉方式總結的NLP任務](../../../../translated_images/zh-HK/ai-nlp.b22dcb8ca4707cea.webp) -在本節中,我們將專注於使用神經網絡來處理與**自然語言處理 (NLP)** 相關的任務。我們希望計算機能夠解決許多 NLP 問題: +在本節中,我們將專注於使用神經網絡來處理與自然語言處理(NLP)相關的任務。有許多NLP問題是我們希望計算機能夠解決的: -* **文本分類** 是一種典型的文本序列分類問題。例如,將電子郵件分類為垃圾郵件或非垃圾郵件,或者將文章分類為體育、商業、政治等。此外,在開發聊天機器人時,我們經常需要理解用戶的意圖——這種情況下我們處理的是**意圖分類**。意圖分類通常需要處理許多類別。 -* **情感分析** 是一種典型的回歸問題,我們需要為句子的正面/負面情感賦予一個數值。一種更高級的情感分析是**基於方面的情感分析** (ABSA),我們不是為整個句子賦予情感,而是為句子的不同部分(方面)賦予情感,例如:*在這家餐廳,我喜歡菜餚,但氣氛很糟糕*。 -* **命名實體識別** (NER) 是從文本中提取特定實體的問題。例如,我們需要理解在短語 *我明天需要飛往巴黎* 中,*明天* 指的是日期 (DATE),而 *巴黎* 是地點 (LOCATION)。 -* **關鍵詞提取** 與 NER 類似,但我們需要自動提取對句子意義重要的詞語,而不需要針對特定實體類型進行預訓練。 -* **文本聚類** 在我們希望將相似的句子分組時非常有用,例如,技術支持對話中相似的請求。 -* **問答系統** 是指模型回答特定問題的能力。模型接收一段文本和一個問題作為輸入,並需要提供文本中包含答案的位置(有時需要生成答案文本)。 -* **文本生成** 是模型生成新文本的能力。這可以被視為一種分類任務,根據某些*文本提示*預測下一個字母/單詞。高級文本生成模型(如 GPT-3)能夠通過一種稱為[提示編程](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0)或[提示工程](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29)的技術解決其他 NLP 任務,例如分類。 -* **文本摘要** 是一種技術,我們希望計算機能夠“閱讀”長文本並將其總結為幾句話。 -* **機器翻譯** 可以被視為一種語言理解和另一種語言文本生成的結合。 +* 文本分類 是一種典型的與文本序列相關的分類問題。例如將電子郵件訊息分類為垃圾郵件或非垃圾郵件,或將文章分類為體育、商業、政治等類別。此外,在開發聊天機器人時,我們經常需要理解用戶想表達的意圖——在這種情況下我們要處理的是意圖分類。通常,在意圖分類中我們需要處理多個類別。 + 情感分析 是一種典型的回歸問題,我們需要賦予一個數字(情感分數),代表句子的意義是多麼正面或負面。更高階的情感分析版本是基於方面的情感分析(ABSA),我們不是將情感賦予整個句子,而是賦予句子的不同部分(方面),例如 這間餐廳,我喜歡料理,但氣氛非常糟糕*。 + 命名實體識別(NER)指的是從文本中提取特定實體的問題。例如,我們可能需要理解在短語 我明天需要飛往巴黎 中,明天 指的是日期,巴黎* 是地點。 +* 關鍵詞抽取 與NER相似,但我們需要自動抽取對句子意義重要的詞,且無需針對特定實體類型預先訓練。 +* 文本聚類 在我們想將相似句子歸類在一起時非常有用,例如技術支援對話中相似的請求。 +* 問答系統 指模型回應特定問題的能力。模型接收一段文本和一個問題作為輸入,並需要指出文本中包含該問題答案的位置(有時也可能直接生成答案文本)。 + 文本生成 是模型生成新文本的能力。這可以被視為一種分類任務,根據某段文本提示*預測下一個字母/詞。先進的文本生成模型,如GPT-3,能使用稱為 [prompt programming](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) 或 [prompt engineering](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29) 的技巧來解決其它NLP任務如分類。 +* 文本摘要 是一種技術,當我們希望電腦「閱讀」長文本並用幾句話來總結時使用。 +* 機器翻譯 可以被視為一種將一種語言的文本理解與另一種語言文本生成相結合的任務。 -最初,大多數 NLP 任務是通過傳統方法(如語法)解決的。例如,在機器翻譯中,解析器被用來將初始句子轉換為語法樹,然後提取高層語義結構來表示句子的含義,基於這些含義和目標語言的語法生成結果。如今,許多 NLP 任務使用神經網絡更有效地解決。 +最初,大多數NLP任務是使用傳統方法如文法來解決的。例如,在機器翻譯中,使用解析器將初始句子轉換成語法樹,然後提取更高層次的語義結構以表達句子含義,並基於這個含義和目標語言的文法產生結果。現今,很多NLP任務都能更有效地使用神經網絡來解決。 -> 許多經典的 NLP 方法已在 [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) Python 庫中實現。網上有一本很棒的 [NLTK 書](https://www.nltk.org/book/),涵蓋了如何使用 NLTK 解決不同的 NLP 任務。 +> 許多經典的NLP方法都實現在 [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) Python庫中。線上有一本很棒的 [NLTK Book](https://www.nltk.org/book/),介紹了如何使用NLTK解決不同的NLP任務。 -在我們的課程中,我們將主要專注於使用神經網絡進行 NLP,並在需要時使用 NLTK。 +在本課程中,我們將主要專注於使用神經網絡進行NLP,並在需要時使用NLTK。 -我們已經學習了如何使用神經網絡處理表格數據和圖像。這些數據類型與文本的主要區別在於,文本是可變長度的序列,而圖像的輸入大小是事先已知的。雖然卷積網絡可以從輸入數據中提取模式,但文本中的模式更為複雜。例如,否定可能與主語分隔許多單詞(例如:*我不喜歡橙子*,與 *我不喜歡那些又大又多彩又美味的橙子*),但仍應被解釋為一個模式。因此,為了處理語言,我們需要引入新的神經網絡類型,例如*循環網絡*和*變壓器*。 +我們已經學過用神經網絡處理表格數據和圖像。這些數據類型與文本的主要區別在於,文本是可變長度的序列,而圖像的輸入大小是預先已知的。雖然卷積網絡可以從輸入數據中提取模式,但文本中的模式更為複雜。例如,我們可能有否定詞與主語被許多詞隔開的情況(例如 我不喜歡橙子我不喜歡那些又大又鮮艷又好吃的橙子),但這兩者仍應該解釋為一種模式。因此,為了處理語言,我們需要引入新型的神經網絡類型,如循環網絡變壓器。 -## 安裝庫 +## 安裝函式庫 -如果您使用本地 Python 安裝來運行本課程,您可能需要使用以下命令安裝 NLP 所需的所有庫: +如果你使用本地Python安裝來練習本課程,可能需要透過以下指令安裝所有NLP所需的函式庫: -**對於 PyTorch** +**PyTorch用戶** ```bash -pip install -r requirements-torch.txt +pip install -r requirements-pytorch.txt ``` -**對於 TensorFlow** +**TensorFlow用戶** ```bash pip install -r requirements-tf.txt ``` -> 您可以在 [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste) 上嘗試使用 TensorFlow 進行 NLP。 +> 你可以在 [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste) 試用TensorFlow的NLP。 ## GPU 警告 -在本節中,我們的一些示例將訓練相當大的模型。 -* **使用支持 GPU 的電腦**:建議在支持 GPU 的電腦上運行筆記本,以減少處理大型模型時的等待時間。 -* **GPU 記憶體限制**:在 GPU 上運行可能會導致 GPU 記憶體不足的情況,特別是在訓練大型模型時。 -* **GPU 記憶體消耗**:訓練過程中消耗的 GPU 記憶體量取決於多種因素,包括小批量大小。 -* **減小小批量大小**:如果遇到 GPU 記憶體問題,可以考慮減小代碼中的小批量大小作為潛在解決方案。 -* **TensorFlow GPU 記憶體釋放**:舊版本的 TensorFlow 在一個 Python 內核中訓練多個模型時可能無法正確釋放 GPU 記憶體。為了有效管理 GPU 記憶體使用,您可以配置 TensorFlow 僅在需要時分配 GPU 記憶體。 -* **代碼包含**:要設置 TensorFlow 僅在需要時增長 GPU 記憶體分配,請在筆記本中包含以下代碼: +本節中某些範例將會訓練相當大型的模型。 +* **使用支援GPU的電腦**:建議在支援GPU的電腦上運行你的筆記本,以減少處理大型模型時的等待時間。 +* **GPU 記憶體限制**:在GPU上運行時可能會遇到GPU記憶體不足的情況,尤其是訓練大型模型時。 +* **GPU 記憶體使用量**:訓練時的GPU記憶體消耗取決於多種因素,包括小批次的大小。 +* 盡量縮小小批次大小:若遇到GPU記憶體問題,考慮在程式碼中減少小批次大小作為解決辦法。 +* **TensorFlow GPU 記憶體釋放**:舊版本TensorFlow在同一Python內核訓練多個模型時可能無法正確釋放GPU記憶體。為了有效管理GPU記憶體,可以設定TensorFlow只在需要時分配GPU記憶體。 +* 程式碼範例:在你的筆記本中加入以下程式碼即可設定TensorFlow按需動態增長GPU記憶體分配: ```python physical_devices = tf.config.list_physical_devices('GPU') @@ -53,17 +53,21 @@ if len(physical_devices)>0: tf.config.experimental.set_memory_growth(physical_devices[0], True) ``` -如果您對從經典機器學習角度學習 NLP 感興趣,請訪問[這套課程](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP)。 +如果你有興趣從經典機器學習角度學習NLP,請參考[這套課程](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) ## 本節內容 -在本節中,我們將學習: +本節中我們將學習: * [將文本表示為張量](13-TextRep/README.md) * [詞嵌入](14-Emdeddings/README.md) -* [語言建模](15-LanguageModeling/README.md) +* [語言模型](15-LanguageModeling/README.md) * [循環神經網絡](16-RNN/README.md) * [生成網絡](17-GenerativeNetworks/README.md) * [變壓器](18-Transformers/README.md) -**免責聲明**: -本文件已使用人工智能翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原文文件作為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋概不負責。 \ No newline at end of file +--- + + +**免責聲明**: +本文件由 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 翻譯而成。雖然我們致力於確保準確性,但請注意,機器自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於重要資訊,建議進行專業人工翻譯。我們不對因使用本翻譯而產生的任何誤解或誤釋承擔責任。 + \ No newline at end of file diff --git a/translations/zh-TW/.co-op-translator.json b/translations/zh-TW/.co-op-translator.json index d49218d9..5ab7bc9e 100644 --- a/translations/zh-TW/.co-op-translator.json +++ b/translations/zh-TW/.co-op-translator.json @@ -17,6 +17,30 @@ "source_file": "SECURITY.md", "language_code": "zh-TW" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "zh-TW", + "failure_date": "2026-07-08T19:24:13+00:00", + "status": "failed", + "error_type": "TranslationIncompleteError", + "error_message": "Markdown translation remained incomplete for chunk 1.1.1 of 'LICENSE.md', and the chunk could not be split further.", + "translator_version": "0.20.0", + "failure_policy_version": 1 + }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "source_file": "CONTRIBUTING.md", + "language_code": "zh-TW", + "failure_date": "2026-07-08T19:30:42+00:00", + "status": "failed", + "error_type": "TranslationIncompleteError", + "error_message": "Markdown translation remained incomplete for chunk 1 of 'CONTRIBUTING.md', and the chunk could not be split further.", + "translator_version": "0.20.0", + "failure_policy_version": 1 + } + }, "etc/CODE_OF_CONDUCT.md": { "original_hash": "c06b12caf3c901eb3156e3dd5b0aea56", "translation_date": "2025-08-24T22:17:50+00:00", @@ -54,8 +78,8 @@ "language_code": "zh-TW" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-10-03T11:28:01+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T19:20:24+00:00", "source_file": "examples/README.md", "language_code": "zh-TW" }, @@ -66,8 +90,8 @@ "language_code": "zh-TW" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-15T12:04:06+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T19:20:46+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "zh-TW" }, @@ -191,6 +215,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "zh-TW" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T19:13:09+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "zh-TW" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-08-24T22:03:29+00:00", @@ -330,8 +360,8 @@ "language_code": "zh-TW" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-08-24T21:43:04+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T19:21:08+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "zh-TW" }, diff --git a/translations/zh-TW/examples/README.md b/translations/zh-TW/examples/README.md index fe7ebf00..3851fbf4 100644 --- a/translations/zh-TW/examples/README.md +++ b/translations/zh-TW/examples/README.md @@ -1,31 +1,31 @@ # 初學者友善的 AI 範例 -歡迎!此目錄包含簡單、獨立的範例,幫助您開始學習 AI 和機器學習。每個範例都設計為適合初學者,並附有詳細的註解和逐步解說。 +歡迎!此目錄包含簡單且獨立的範例,幫助你開始 AI 與機器學習之旅。每個範例都設計為適合初學者,附有詳細註解與逐步說明。 -## 📚 範例概覽 +## 📚 範例總覽 -| 範例 | 描述 | 難度 | 先決條件 | -|------|------|------|----------| -| [Hello AI World](../../../examples/01-hello-ai-world.py) | 您的第一個 AI 程式 - 簡單的模式識別 | ⭐ 初學者 | Python 基礎 | -| [Simple Neural Network](../../../examples/02-simple-neural-network.py) | 從零開始建立神經網路 | ⭐⭐ 初學者+ | Python、基礎數學 | -| [Image Classifier](./03-image-classifier.ipynb) | 使用預訓練模型進行影像分類 | ⭐⭐ 初學者+ | Python、numpy | -| [Text Sentiment](../../../examples/04-text-sentiment.py) | 分析文字情感(正面/負面) | ⭐⭐ 初學者+ | Python | +| 範例 | 說明 | 難度 | 先備知識 | +|---------|-------------|------------|---------------| +| [Hello AI World](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/01-hello-ai-world.py) | 你的第一個 AI 程式 - 簡單模式識別 | ⭐ 初學者 | Python 基礎 | +| [Simple Neural Network](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | 從零開始建立神經網路 | ⭐⭐ 初學者+ | Python,基礎數學 | +| [Image Classifier](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | 使用預訓練模型分類影像 | ⭐⭐ 初學者+ | Python,numpy | +| [Text Sentiment](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/04-text-sentiment.py) | 分析文字情緒(正面/負面) | ⭐⭐ 初學者+ | Python | ## 🚀 開始使用 ### 先決條件 -請確保您已安裝 Python(建議使用 3.8 或更高版本)。安裝所需的套件: +確認你已安裝 Python(建議版本 3.8 以上)。安裝必要套件: ```bash -# For Python scripts +# 適用於 Python 腳本 pip install numpy -# For Jupyter notebooks (image classifier) +# 適用於 Jupyter 筆記本(影像分類器) pip install jupyter numpy pillow tensorflow ``` -或者使用主課程中的 conda 環境: +或使用主課程中的 conda 環境: ```bash conda env create --name ai4beg --file ../environment.yml @@ -34,52 +34,54 @@ conda activate ai4beg ### 執行範例 -**對於 Python 腳本 (.py 檔案):** +**對於 Python 腳本(.py 檔案):** ```bash python 01-hello-ai-world.py ``` -**對於 Jupyter 筆記本 (.ipynb 檔案):** +**對於 Jupyter 筆記本(.ipynb 檔案):** ```bash jupyter notebook 03-image-classifier.ipynb ``` ## 📖 學習路徑 -我們建議按照以下順序進行學習: +建議依序循序進行範例: -1. **從 "Hello AI World" 開始** - 學習模式識別的基礎 -2. **建立簡單的神經網路** - 理解神經網路的運作方式 -3. **嘗試影像分類器** - 使用真實影像體驗 AI 的應用 -4. **分析文字情感** - 探索自然語言處理 +1. **從「Hello AI World」開始** - 學習模式識別基礎 +2. 建立簡單神經網路 - 了解神經網路如何運作 +3. 嘗試影像分類器 - 觀察 AI 如何處理真實影像 +4. 分析文字情緒 - 探索自然語言處理 -## 💡 初學者提示 +## 💡 初學者技巧 -- **仔細閱讀程式碼註解** - 它們解釋了每行程式碼的作用 -- **嘗試實驗!** - 嘗試更改數值並觀察結果 -- **不用擔心完全理解** - 學習需要時間 -- **提出問題** - 使用 [討論板](https://github.com/microsoft/AI-For-Beginners/discussions) +- 仔細閱讀程式碼註解 - 解釋每行程式的作用 +- **多多嘗試!** - 改變數值,看看會發生什麼 +- 不必急著全部懂 - 學習需要時間 +- 勇於提問 - 利用 [討論區](https://github.com/microsoft/AI-For-Beginners/discussions) ## 🔗 下一步 完成這些範例後,探索完整課程: -- [AI 簡介](../lessons/1-Intro/README.md) +- [AI 入門](../lessons/1-Intro/README.md) - [神經網路](../lessons/3-NeuralNetworks/README.md) - [電腦視覺](../lessons/4-ComputerVision/README.md) - [自然語言處理](../lessons/5-NLP/README.md) ## 🤝 貢獻 -覺得這些範例有幫助嗎?幫助我們改進: +覺得這些範例有幫助嗎?來幫助我們改進吧: - 回報問題或提出改進建議 -- 增加更多適合初學者的範例 -- 改善文件和註解 +- 新增更多初學者範例 +- 改善文件與註解 --- -*記住:每位專家都曾是初學者。祝學習愉快! 🎓* +*記得:每位專家都曾是初學者。祝學習愉快!🎓* --- -**免責聲明**: -本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵資訊,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。 \ No newline at end of file + +**免責聲明**: +此文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們努力追求準確性,但請注意自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應視為權威來源。對於關鍵資訊,建議採用專業人工翻譯。我們不對因使用此翻譯所產生的任何誤解或誤譯承擔責任。 + \ No newline at end of file diff --git a/translations/zh-TW/lessons/0-course-setup/how-to-run.md b/translations/zh-TW/lessons/0-course-setup/how-to-run.md index 7236eec7..91c5ad69 100644 --- a/translations/zh-TW/lessons/0-course-setup/how-to-run.md +++ b/translations/zh-TW/lessons/0-course-setup/how-to-run.md @@ -1,12 +1,12 @@ # 如何執行程式碼 -本課程包含許多可執行的範例和實驗,你會想要運行這些範例。為此,你需要具備在本課程所提供的 Jupyter 筆記本中執行 Python 程式碼的能力。你有幾種選擇可以執行程式碼: +本課程包含許多可執行的範例和實驗,您可能想要執行它們。要做到這一點,您需要能夠在本課程提供的 Jupyter 筆記本中執行 Python 程式碼。您有幾種選擇來運行程式碼: -## 在你的電腦上本地執行 +## 在您的電腦上本地執行 -若要在你的電腦本地運行程式碼,需要安裝 Python。一個建議是安裝 **[miniconda](https://conda.io/en/latest/miniconda.html)** — 它是一個相當輕量的安裝,支援 `conda` 套件管理工具來管理不同的 Python **虛擬環境**。 +若要在您的電腦上本地執行程式碼,您需要安裝 Python。其中一個建議是安裝 **[miniconda](https://conda.io/en/latest/miniconda.html)** ——這是一個相當輕量的安裝,它支援使用 `conda` 套件管理器來管理不同的 Python 虛擬環境。 -安裝 miniconda 之後,複製本儲存庫並建立一個虛擬環境來使用這門課程: +安裝 miniconda 後,克隆本儲存庫並建立一個用於本課程的虛擬環境: ```bash git clone http://github.com/microsoft/ai-for-beginners @@ -17,17 +17,17 @@ conda activate ai4beg ### 使用帶有 Python 擴充功能的 Visual Studio Code -本課程在使用 [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) 並安裝 [Python 擴充功能](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste) 時效果最佳。 +本課程在使用 [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) 與 [Python 擴充功能](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste) 開啟時效果最佳。 -> **注意**:一旦你複製儲存庫並在 VS Code 中打開目錄,它會自動建議你安裝 Python 擴充功能。你還需要按上述說明安裝 miniconda。 +> 注意:當您克隆並在 VS Code 中開啟此目錄後,它會自動建議您安裝 Python 擴充功能。您也必須依上述方式安裝 miniconda。 -> **注意**:如果 VS Code 建議你在容器中重新打開儲存庫,你應該拒絕此建議以使用本地的 Python 安裝。 +> 注意:若 VS Code 建議您在容器中重新開啟儲存庫,您應該拒絕此建議以使用本地 Python 安裝。 ### 在瀏覽器中使用 Jupyter -你也可以在自己的電腦瀏覽器中使用 Jupyter 環境。傳統的 Jupyter 和 JupyterHub 都提供方便的開發環境,具備自動完成、程式碼高亮等功能。 +您也可以在自己電腦的瀏覽器中使用 Jupyter 環境。傳統 Jupyter 以及 JupyterHub 都提供了方便的開發環境,包含自動補全、程式碼高亮等功能。 -要在本地啟動 Jupyter,請前往課程目錄,並執行: +若要在本地啟動 Jupyter,請前往課程目錄並執行: ```bash jupyter notebook @@ -36,36 +36,36 @@ jupyter notebook ```bash jupyterhub ``` -然後你可以瀏覽任何 `.ipynb` 檔案,打開它們並開始工作。 +您即可導航至任一 `.ipynb` 檔案,打開並開始使用。 -### 在容器中執行 +### 在容器中運行 -另一個替代 Python 安裝的選項是直接在容器中執行程式碼。由於我們的儲存庫提供了一個特殊的 `.devcontainer` 資料夾,指示如何為本儲存庫建構容器,VS Code 提供重新在容器中打開程式碼的功能。這需要安裝 Docker,流程也會較複雜,因此建議較有經驗的使用者採用此方案。 +另一種替代 Python 安裝的方法是使用容器。由於我們的儲存庫包含一個特殊的 `.devcontainer` 資料夾,用來指示如何為此儲存庫建立容器,VS Code 提供了重新在容器中開啟程式碼的功能。這需要安裝 Docker,並且較為複雜,因此建議較有經驗的使用者使用此方法。 ## 在雲端運行 -如果你不想在本地安裝 Python,並且有雲端資源可用,另一個好選擇是直接在雲端執行程式碼。有幾種方式可以做到: +如果您不想在本地安裝 Python,且可以使用一些雲端資源,一個不錯的替代方案是將程式碼運行在雲端。有幾種方法: -* 使用 **[GitHub Codespaces](https://github.com/features/codespaces)**,這是在 GitHub 上為你建立的虛擬環境,可經由 VS Code 瀏覽器介面存取。如果你有 Codespaces 的權限,只需點擊儲存庫中的 **Code** 按鈕,啟動 codespace,馬上即可開始執行。 -* 使用 **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**。[Binder](https://mybinder.org) 提供免費的雲端運算資源,讓你可以測試 GitHub 上的程式碼。首頁有一個按鈕可直接開啟儲存庫於 Binder — 這會快速引導你到 Binder 網站,自動建構底層容器並啟動 Jupyter 網頁介面。 +* 使用 **[GitHub Codespaces](https://github.com/features/codespaces)**,這是一個由 GitHub 為您建立的虛擬環境,可以透過 VS Code 瀏覽器介面存取。如果您可以使用 Codespaces,只需在儲存庫中點擊 **Code** 按鈕,啟動 Codespace,即可快速開始。 +* 使用 **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**。 [Binder](https://mybinder.org) 提供免費的雲端運算資源,讓您能在 GitHub 上測試程式碼。首頁有個按鈕可以在 Binder 中開啟此儲存庫——它將快速帶您到 binder 網站,該網站會建立基礎容器並無縫啟動 Jupyter 網頁介面。 -> **注意**:為防止濫用,Binder 對部分網路資源進行封鎖,這可能導致部分從公共網路下載模型和/或資料集的程式碼無法正常運作,你可能需找尋替代方案。此外,Binder 提供的運算資源相當基礎,訓練過程會較慢,尤其是後期更複雜的課程。 +> 注意:為避免誤用,Binder 阻擋了部分網路資源的存取。這會導致部分從公共網路下載模型和/或資料集的程式碼無法正常運作。您可能需要找一些變通方法。此外,Binder 提供的運算資源相當基礎,因此訓練會很慢,尤其在較複雜的後期課程中更是如此。 -## 使用 GPU 雲端運行 +## 使用 GPU 在雲端運行 -在本課程後期,有些課程會非常受惠於 GPU 支援。例如,模型訓練否則會非常緩慢。以下是一些選項,特別是如果你透過 [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) 或機構有雲端存取權: +本課程後期的部分課程非常需要 GPU 支援。例如模型訓練,否則將非常緩慢。您可以採用以下幾種方案,尤其是若您透過 [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) 或您就讀的機構有雲端權限: -* 建立 [資料科學虛擬機](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) 並透過 Jupyter 連線。你可以直接在機器上複製儲存庫並開始學習。NC 系列虛擬機支援 GPU。 +* 建立 [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste),並透過 Jupyter 連線。您可以在該機器上直接克隆儲存庫,並開始學習。NC 系列虛擬機器支援 GPU。 -> **注意**:部分訂閱,包括 Azure for Students,預設不包含 GPU 支援。你可能需要透過技術支援申請額外的 GPU 核心。 +> 注意:某些訂閱,包括 Azure for Students,預設不提供 GPU 支援。您可能需要透過技術支援請求額外申請 GPU 核心。 -* 建立 [Azure 機器學習工作區](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste),然後使用其中的 Notebook 功能。[此影片](https://azure-for-academics.github.io/quickstart/azureml-papers/) 示範如何將儲存庫克隆到 Azure ML 筆記本並開始使用。 +* 建立 [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste),然後使用其中的 Notebook 功能。[這段影片](https://azure-for-academics.github.io/quickstart/azureml-papers/) 示範如何將儲存庫克隆到 Azure ML notebook 並開始使用。 -你也可以使用 Google Colab,該服務附帶部分免費的 GPU 支援,並上傳 Jupyter 筆記本,一筆一筆地執行。 +您也可以使用 Google Colab,它提供一些免費的 GPU 支援,且能逐一上傳與執行 Jupyter 筆記本。 --- -**免責聲明**: -本文件係使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們努力追求準確性,但請注意,自動翻譯可能包含錯誤或不精確之處。原始文件的母語版本應視為權威資料來源。對於重要資訊,建議採用專業人工翻譯。我們對因使用本翻譯所引起的任何誤解或誤譯不承擔任何責任。 +**免責聲明**: +此文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們努力追求準確性,但請注意自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應視為權威來源。對於關鍵資訊,建議採用專業人工翻譯。我們不對因使用此翻譯所產生的任何誤解或誤譯承擔責任。 \ No newline at end of file diff --git a/translations/zh-TW/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/zh-TW/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index fce8d959..c5e3addf 100644 --- a/translations/zh-TW/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/zh-TW/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -6,9 +6,9 @@ "source": [ "# 預訓練模型與遷移學習\n", "\n", - "訓練 CNNs 可能需要花費大量時間,並且需要大量數據。然而,大部分時間其實是用來學習網絡用於從圖像中提取模式的最佳低層過濾器。一個自然的問題隨之而來——我們是否可以使用在一個數據集上訓練好的神經網絡,並將其適配於分類不同的圖像,而不需要完整的訓練過程?\n", + "訓練 CNN 可能需要大量時間,且此任務需要大量資料。然而,許多時間都用於學習網路用來從影像中擷取圖案的最佳低階濾波器。自然會產生一個問題——我們能否使用在一個資料集上訓練的神經網路,並將其調整用於不同影像的分類,而不需完整的訓練過程?\n", "\n", - "這種方法被稱為**遷移學習**,因為我們將某些知識從一個神經網絡模型轉移到另一個模型。在遷移學習中,我們通常從一個預訓練模型開始,該模型已經在某些大型圖像數據集(例如 **ImageNet**)上進行過訓練。這些模型已經能夠很好地從通用圖像中提取不同的特徵,而在許多情況下,只需在這些提取的特徵之上構建一個分類器,就能獲得不錯的結果。\n" + "這種方法稱為 遷移學習,因為我們將某些知識從一個神經網路模型轉移到另一個模型。在遷移學習中,我們通常從一個預訓練模型開始,該模型已在某些大型影像資料集(例如 **ImageNet**)上訓練過。這些模型已經能很好地從通用影像中擷取不同特徵,且在許多情況下,只需在這些擷取的特徵上建立分類器,就能產生良好結果。\n" ] }, { @@ -29,11 +29,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 貓與狗數據集\n", + "## 貓 vs. 狗 資料集\n", "\n", - "在本單元中,我們將解決一個實際問題:對貓與狗的圖片進行分類。為此,我們將使用 [Kaggle 貓與狗數據集](https://www.kaggle.com/c/dogs-vs-cats),該數據集也可以從 [Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste) 下載。\n", + "在本單元中,我們將解決一個貓和狗圖片分類的真實問題。為此,我們將使用 [Kaggle 貓 vs. 狗資料集](https://www.kaggle.com/c/dogs-vs-cats),該資料集也可以從 [Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste) 下載。\n", "\n", - "讓我們下載這個數據集並將其解壓縮到 `data` 目錄中(這個過程可能需要一些時間!):\n" + "讓我們下載此資料集並將其解壓縮到 `data` 目錄中(此過程可能需要一些時間!):\n" ] }, { @@ -64,7 +64,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "不幸的是,資料集中有一些損壞的圖像文件。我們需要快速清理以檢查損壞的文件。為了不影響本教程,我們將驗證資料集的代碼移到了模組中。\n" + "不幸地,資料集中有一些損壞的圖片檔案。我們需要進行快速清理來檢查損壞的檔案。為了不破壞本教學,我們將驗證資料集的程式碼移至一個模組中。\n" ] }, { @@ -333,13 +333,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 加載資料集\n", + "## 載入資料集\n", "\n", - "在之前的範例中,我們使用的是 Keras 內建的資料集。現在,我們將處理自己的資料集,這需要從圖像目錄中載入。\n", + "在先前的範例中,我們載入的是內建於 Keras 的資料集。現在我們要處理自己的資料集,需從包含圖片的目錄中載入資料。\n", "\n", - "在現實生活中,圖像資料集的大小可能相當龐大,因此無法依賴所有資料都能完全載入記憶體。因此,資料集通常以**生成器**的形式表示,可以以適合訓練的小批量方式返回資料。\n", + "在實際情況中,影像資料集的大小可能相當龐大,不可能全部一次裝入記憶體中。因此,資料集經常以產生器形式呈現,可以以適合訓練的小批次回傳資料。\n", "\n", - "為了處理圖像分類,Keras 提供了一個特殊的函數 `image_dataset_from_directory`,它可以從對應不同類別的子目錄中載入圖像。這個函數還負責縮放圖像,並且可以將資料集分割為訓練和測試子集:\n" + "為了處理影像分類,Keras 提供了特殊函式 `image_dataset_from_directory`,可從對應不同類別的子目錄中載入圖片。此函式同時負責圖片縮放,並能將資料集分割成訓練集和測試集:\n" ] }, { @@ -383,9 +383,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "在兩次調用中設置相同的 `seed` 值非常重要,因為這會影響圖像在訓練集和測試集之間的劃分。\n", + "對兩個呼叫設定相同的 `seed` 值相當重要,因為該值會影響訓練與測試資料集之間圖片的劃分。\n", "\n", - "數據集會自動從目錄中獲取類別名稱,如果需要,可以通過調用以下方式訪問它們:\n" + "Dataset 會自動從目錄中擷取類別名稱,若需要可透過呼叫以下方法來存取:\n" ] }, { @@ -412,7 +412,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "我們獲得的數據集可以直接傳遞給 `fit` 函數來訓練模型。它們包含對應的圖像和標籤,可以使用以下結構進行迴圈:\n" + "我們所獲得的資料集可以直接傳入 `fit` 函數來訓練模型。它們包含對應的圖像和標籤,可以使用以下結構進行迴圈處理:\n" ] }, { @@ -453,7 +453,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "> **注意**:數據集中所有圖像均表示為範圍為 0-255 的浮點數張量。在將它們傳遞給神經網絡之前,我們需要將這些值縮放到 0-1 的範圍內。在繪製圖像時,我們需要執行相同的操作,或者將值轉換為 `int` 類型(如上面的代碼所示),以便向 `matplotlib` 表明我們希望繪製原始未縮放的圖像。\n" + "> 注意:資料集中所有影像皆以範圍為 0-255 的浮點張量表示。在將它們傳入神經網路之前,我們需要將這些數值縮放到 0-1 範圍內。在繪製影像時,我們同樣需要這麼做,或是將數值轉換為 `int` 型別(如上方程式碼中所示),以便告訴 `matplotlib` 我們想繪製原始未縮放的影像。\n" ] }, { @@ -462,7 +462,7 @@ "source": [ "## 預訓練模型\n", "\n", - "對於許多圖像分類任務,可以找到預訓練的神經網絡模型。許多這類模型都可以在 `keras.applications` 命名空間中找到,甚至可以在網路上找到更多的模型。讓我們來看看如何加載和使用最簡單的 VGG-16 模型:\n" + "對於許多圖像分類任務,可以找到預訓練的神經網路模型。許多這些模型可在 `keras.applications` 名稱空間中找到,甚至在網路上還有更多模型。讓我們看看如何載入和使用最簡單的 VGG-16 模型:\n" ] }, { @@ -497,7 +497,17 @@ } ], "source": [ - "vgg = keras.applications.VGG16()\n", + "# SHA-256 of VGG16 weights (with top)\n", + "VGG16_WEIGHTS_SHA256 = '64373286793e3c8b2b4e3219cbf3544bce2f55ab4682710a29f5e7af8f5e4f61'\n", + "\n", + "_weights_path = keras.utils.get_file(\n", + " 'vgg16_weights_tf_dim_ordering_tf_kernels.h5',\n", + " 'https://storage.googleapis.com/tensorflow/keras-applications/vgg16/vgg16_weights_tf_dim_ordering_tf_kernels.h5',\n", + " file_hash=VGG16_WEIGHTS_SHA256,\n", + " hash_algorithm='sha256',\n", + ")\n", + "\n", + "vgg = keras.applications.VGG16(weights=_weights_path)\n", "inp = keras.applications.vgg16.preprocess_input(x_sample[:1])\n", "\n", "res = vgg(inp)\n", @@ -510,17 +520,17 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "有幾個重要的事項需要注意:\n", - "* 在將輸入傳遞給任何預訓練網絡之前,必須以特定方式進行預處理。這可以通過調用相應的 `preprocess_input` 函數來完成,該函數接收一批圖像並返回它們的處理後形式。以 VGG-16 為例,圖像會被正規化,並且每個通道的某些預定義平均值會被減去。這是因為 VGG-16 最初是在這種預處理方式下進行訓練的。\n", - "* 神經網絡會應用於輸入的批次,結果我們會得到一批包含1000個元素的張量,這些張量顯示每個類別的概率。我們可以通過在這些張量上調用 `argmax` 來找到最可能的類別編號。\n", - "* 獲得的結果是一個 [`ImageNet` 類別的編號](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a)。為了更好地理解這個結果,我們還可以使用 `decode_predictions` 函數,該函數會返回前 n 個類別及其名稱。\n" + "這裡有幾個重要的事情:\n", + "* 在將輸入傳遞給任何預先訓練好的網路之前,必須以特定方式進行前處理。這是透過呼叫相應的 `preprocess_input` 函式來完成,該函式接收一批影像,並返回其處理後的形式。以 VGG-16 為例,影像會被正規化,且每個通道會減去一些預先定義的平均值。這是因為 VGG-16 最初就是使用這種前處理來訓練的。\n", + "* 將神經網路應用到輸入批次後,我們會得到一批包含1000個元素的張量,顯示每個類別的機率。可以通過在此張量上呼叫 `argmax` 來找到最可能的類別編號。\n", + "* 獲得的結果是 [一個 `ImageNet` 類別編號](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a)。為了讓這個結果有意義,我們也可以使用 `decode_predictions` 函式,它會返回前 n 個類別及其名稱。\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "讓我們也來看看 VGG-16 網路的架構:\n" + "我們來看看 VGG-16 網路的架構: \n" ] }, { @@ -599,7 +609,7 @@ "source": [ "## GPU 計算\n", "\n", - "深度神經網絡,例如 VGG-16 和其他更現代的架構,需要相當大的計算能力來運行。如果有 GPU 加速可用,使用它是合理的選擇。幸運的是,如果 GPU 可用,Keras 會自動加速 GPU 上的計算。我們可以使用以下程式碼檢查 Tensorflow 是否能夠使用 GPU:\n" + "深度神經網路,如 VGG-16 及其他更現代的架構,執行時需要相當多的計算能力。如果可用,使用 GPU 加速是合理的。幸運的是,Keras 若能使用 GPU,會自動加快計算速度。我們可以使用以下程式碼來檢查 Tensorflow 是否能使用 GPU:\n" ] }, { @@ -626,9 +636,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "\n", "## 提取 VGG 特徵\n", "\n", - "如果我們想使用 VGG-16 從圖片中提取特徵,我們需要一個沒有最終分類層的模型。我們可以使用以下程式碼來實例化沒有頂層的 VGG-16 模型:\n" + "如果我們想使用 VGG-16 從影像中提取特徵,我們需要沒有最終分類層的模型。我們可以使用這段程式碼來實例化沒有頂層的 VGG-16 模型:\n" ] }, { @@ -680,9 +691,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "特徵張量的維度是 7x7x512,但為了能夠進行可視化,我們需要將其重塑為 2D 形式。\n", + "特徵張量的維度是 7x7x512,但為了視覺化,我們必須將其重新塑形為 2D 形式。\n", "\n", - "現在讓我們嘗試看看這些特徵是否可以用來分類圖像。我們可以手動選取部分圖像(在我們的例子中是 50 個小批次),並預先計算它們的特徵向量。我們可以使用 Tensorflow 的 **dataset** API 來完成這項工作。`map` 函數會接收一個數據集,並應用給定的 lambda 函數來對其進行轉換。我們利用這個機制來構建新的數據集 `ds_features_train` 和 `ds_features_test`,這些數據集包含的是 VGG 提取的特徵,而不是原始圖像。\n" + "現在讓我們嘗試看看這些特徵是否能用來分類圖像。讓我們手動取一些圖像(在我們的例子中是 50 個小批次),並預先計算它們的特徵向量。我們可以使用 Tensorflow **dataset** API 來完成這件事。`map` 函數接受一個資料集並套用給定的 lambda 函式來做轉換。我們使用這個機制建構新的資料集 `ds_features_train` 和 `ds_features_test`,它們包含由 VGG 提取的特徵,而非原始圖像。\n" ] }, { @@ -712,9 +723,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "我們使用了 `.take(50)` 來限制數據集的大小,以加快演示速度。當然,您可以在完整的數據集上進行此實驗。\n", + "我們使用 `.take(50)` 來限制資料集大小,以加快示範速度。當然,你也可以在完整資料集上執行此實驗。\n", "\n", - "現在我們已經擁有一個包含提取特徵的數據集,我們可以訓練一個簡單的密集分類器來區分貓和狗。這個網絡將接收形狀為 (7,7,512) 的特徵向量,並生成一個輸出,對應於狗或貓。由於這是一個二元分類,我們使用 `sigmoid` 激活函數和 `binary_crossentropy` 損失函數。\n" + "現在我們有一個已提取特徵的資料集,便可以訓練一個簡單的密集分類器來區分貓和狗。此網路將接受形狀為 (7,7,512) 的特徵向量,並產生一個輸出,對應狗或貓。因為是二元分類,我們使用 `sigmoid` 激活函數和 `binary_crossentropy` 損失。\n" ] }, { @@ -743,13 +754,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "結果非常棒!我們能以接近 95% 的準確率區分貓和狗!然而,我們僅在所有圖片的一個子集上測試了這種方法,因為手動特徵提取似乎非常耗時。\n", + "結果很棒,我們可以用接近 95% 的機率區分貓和狗!不過,我們只在全部圖片的子集上測試了這個方法,因為手動特徵提取似乎花費很多時間。\n", "\n", - "## 使用一個 VGG 網路進行遷移學習\n", + "## 使用單一 VGG 網路的轉移學習\n", "\n", - "我們也可以通過在訓練過程中使用完整的 VGG-16 原始網路來避免手動預先計算特徵,方法是將特徵提取器作為我們網路的第一層添加進去。\n", + "我們也可以避免手動預先計算特徵,方法是在訓練時使用完整的原始 VGG-16 網路,將特徵擷取器加入我們網路的第一層。\n", "\n", - "Keras 架構的美妙之處在於,我們上面定義的 VGG-16 模型也可以作為另一個神經網路中的一層使用!我們只需要在其上構建一個帶有密集分類器的網路,然後使用反向傳播來訓練整個網路。\n" + "Keras 架構的美妙之處在於,上面定義的 VGG-16 模型也可以作為另一個神經網路中的一層使用!我們只需構建一個在其上方有密集分類器的網路,然後使用反向傳播訓練整個網路。\n" ] }, { @@ -793,13 +804,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "這個模型看起來像是一個端到端的分類網絡,它接收一張圖片並返回其類別。然而,棘手的部分在於我們希望 VGG16 作為特徵提取器,而不是重新訓練。因此,我們需要**凍結卷積特徵提取器的權重**。我們可以通過調用 `model.layers[0]` 來訪問網絡的第一層,然後只需將 `trainable` 屬性設置為 `False`。\n", + "這個模型看起來像是一個端到端的分類網路,輸入一張圖片並輸出類別。不過,麻煩的是我們希望 VGG16 擔任特徵擷取器,而不重新訓練它。因此,我們需要凍結卷積特徵擷取器的權重。我們可以透過呼叫 `model.layers[0]` 來存取網路的第一層,然後只需將 `trainable` 屬性設定為 `False`。\n", "\n", - "> **注意**: 凍結特徵提取器的權重是必要的,因為如果不這樣做,未訓練的分類層可能會破壞卷積提取器原本的預訓練權重。\n", + "> 注意:需要凍結特徵擷取器權重,因為否則未訓練的分類層會破壞原本預訓練的卷積擷取器權重。\n", "\n", - "你會注意到,雖然我們網絡的參數總數大約是 1500 萬,但我們只訓練了 2.5 萬個參數。所有其他頂層卷積濾波器的參數都是預訓練的。這是一件好事,因為我們可以用較少的樣本微調較少的參數。\n", + "你可以注意到,雖然我們網路的參數總數約為 1500 萬,但我們只訓練了 2.5 萬參數。其他所有頂層卷積濾波器的參數都是預訓練好的。這是件好事,因為我們能以較少的範例微調較少數的參數。\n", "\n", - "現在我們將訓練網絡,看看能達到多好的效果。預計運行時間會比較長,如果執行過程中似乎暫停了一段時間,請不要擔心。\n" + "現在我們將訓練網路,看看效果有多好。預期執行時間會相當久,如果執行看起來暫時卡住也不用擔心。\n" ] }, { @@ -824,11 +835,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "看起來我們已經成功地獲得了一個相當準確的貓狗分類器!\n", + "看起來我們已經獲得了一個相當準確的貓與狗分類器!\n", "\n", - "## 保存和載入模型\n", + "## 儲存與載入模型\n", "\n", - "當我們完成模型訓練後,可以將模型架構和訓練好的權重保存到檔案中,以便未來使用:\n" + "一旦我們訓練好模型,就可以將模型架構和訓練好的權重儲存到檔案中以供將來使用:\n" ] }, { @@ -852,7 +863,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "我們可以隨時從檔案中載入模型。這在下一次實驗可能破壞模型的情況下可能會很有用——您就不必從頭開始重新建立模型。\n" + "我們隨時可以從檔案載入模型。若下一次實驗毀壞了模型,這會非常有用——你就不必從頭開始了。\n" ] }, { @@ -868,15 +879,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 微調遷移學習\n", + "## 微調轉移學習\n", "\n", - "在上一節中,我們已經訓練了最終的分類器層,用於對我們自己的數據集中的圖像進行分類。然而,我們並未重新訓練特徵提取器,我們的模型依賴於它在 ImageNet 數據上學到的特徵。如果你的物體在視覺上與普通的 ImageNet 圖像有所不同,這種特徵組合可能無法達到最佳效果。因此,開始訓練卷積層是有意義的。\n", + "在前一節中,我們訓練了最終的分類器層,用來分類我們自己的資料集中的圖像。然而,我們並未重新訓練特徵擷取器,我們的模型依賴於模型在 ImageNet 資料上學到的特徵。如果你的物體在視覺上與一般的 ImageNet 圖像不同,這種特徵組合可能無法達到最佳效果。因此,開始訓練卷積層也是合理的。\n", "\n", - "為此,我們可以解凍之前凍結的卷積濾波器參數。\n", + "為此,我們可以解凍先前凍結的卷積濾波器參數。\n", "\n", - "> **注意:** 首先凍結參數並進行幾個訓練週期以穩定分類層的權重是很重要的。如果你直接在參數解凍的情況下開始端到端的網絡訓練,大的誤差可能會破壞卷積層中的預訓練權重。\n", + "> **注意:** 重要的是先凍結參數並進行數個 epoch 的訓練,以穩定分類層的權重。如果你馬上開始訓練整個端到端網路並解凍參數,錯誤很可能會破壞卷積層中的預訓練權重。\n", "\n", - "我們的卷積 VGG-16 模型位於第一層內部,而它本身由許多層組成。我們可以查看它的結構:\n" + "我們的卷積 VGG-16 模型位於第一層內部,它本身包含許多層。我們可以檢視其結構:\n" ] }, { @@ -945,7 +956,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "我們可以解凍卷積基底的所有層:\n" + "我們可以解凍卷積底座的所有層:\n" ] }, { @@ -961,7 +972,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "然而,一次解凍所有層並不是最好的主意。我們可以先只解凍幾個最後的卷積層,因為它們包含與我們的圖像相關的高層次模式。例如,首先,我們可以凍結所有層,除了最後的4層:\n" + "不過,一次解凍全部層並不是最好的做法。我們可以先只解凍最後幾層卷積層,因為它們包含與我們的圖像相關的高階特徵。例如,一開始我們可以凍結除了最後 4 層之外的所有層:\n" ] }, { @@ -1000,11 +1011,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "觀察到可訓練參數的數量顯著增加,但仍然僅佔所有參數的約50%。\n", + "注意可訓練參數的數量顯著增加,但仍約佔所有參數的 50% 左右。\n", "\n", - "解凍後,我們可以進行幾個額外的訓練週期(在我們的例子中,我們只進行一個)。您也可以選擇較低的學習率,以減少對預訓練權重的影響。然而,即使使用較低的學習率,您仍然可以預期在訓練開始時準確率會下降,直到最終達到比固定權重情況稍高的水平。\n", + "解凍後,我們可以再做幾個訓練週期(在我們的例子中,只做一次)。你也可以選擇較低的學習率,以減少對預訓練權重的影響。不過,即使學習率低,訓練開始時仍可預期準確度會下降,直到最終達到比固定權重情況稍高的水平。\n", "\n", - "> **注意:** 此訓練過程會慢得多,因為我們需要將梯度反向傳播到網絡的多個層!\n" + "> **注意:** 這種訓練會慢很多,因為我們需要將梯度反向傳播通過網路的許多層!\n" ] }, { @@ -1028,9 +1039,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "我們可能會達到更高的訓練準確率,因為我們使用了更強大的網路並且擁有更多的參數,但驗證準確率的提升可能不會那麼明顯。\n", + "我們很可能會達成較高的訓練準確率,因為我們使用了參數更多、更強大的網路,但驗證準確率的提升不會那麼明顯。\n", "\n", - "可以嘗試解凍更多的網路層並進行更多的訓練,看看是否能夠達到更高的準確率!\n" + "可以自由解凍更多層網路並進行訓練,看看是否能達到更高的準確率!\n" ] }, { @@ -1039,7 +1050,7 @@ "source": [ "## 其他電腦視覺模型\n", "\n", - "VGG-16 是最簡單的電腦視覺架構之一。Keras 提供了更多預訓練的網路。其中最常用的是由 Microsoft 開發的 **ResNet** 架構,以及 Google 的 **Inception**。例如,我們來探索最簡單的 ResNet-50 模型的架構(ResNet 是一個具有不同深度的模型家族,如果你想看看真正深層的模型,可以嘗試 ResNet-152):\n" + "VGG-16 是最簡單的電腦視覺架構之一。Keras 提供了更多預訓練的網路。其中最常用的是微軟開發的 **ResNet** 架構,和 Google 的 **Inception**。例如,讓我們來探索最簡潔的 ResNet-50 模型的架構(ResNet 是一系列有不同深度的模型,您也可以嘗試 ResNet-152,看看真正深度模型的樣子):\n" ] }, { @@ -1441,29 +1452,29 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "如你所見,這個模型包含了相同的熟悉構建模塊:卷積層、池化層以及最終的密集分類器。我們可以以完全相同的方式使用這個模型,就像我們之前使用 VGG-16 進行遷移學習一樣。你可以嘗試使用上述程式碼進行實驗,嘗試使用不同的 ResNet 模型作為基礎模型,並觀察準確率的變化。\n", + "如你所見,模型包含相同熟悉的組成結構:卷積層、池化層以及最終的全連接分類器。我們可以用與之前使用 VGG-16 進行遷移學習時完全相同的方式來使用這個模型。你可以嘗試用上述程式碼,選擇不同的 ResNet 模型作為基礎模型,並觀察準確度的變化。\n", "\n", - "## 批量正規化\n", + "## 批次正規化 (Batch Normalization)\n", "\n", - "這個網路還包含另一種類型的層:**批量正規化**。批量正規化的概念是將流經神經網路的值調整到正確的範圍。通常,當所有值都在 [-1,1] 或 [0,1] 的範圍內時,神經網路的效果最好,這也是我們對輸入數據進行縮放/正規化的原因。然而,在深度網路的訓練過程中,可能會出現值顯著超出這個範圍的情況,這會導致訓練變得困難。批量正規化層會計算當前小批量數據的平均值和標準差,並在信號通過神經網路層之前使用這些值對其進行正規化。這顯著提高了深度網路的穩定性。\n" + "這個網路還包含另一種層:批次正規化。批次正規化的想法是讓通過神經網路的數值保持在正確的區間。通常神經網路的運作效果最佳是在所有數值位於 [-1,1] 或 [0,1] 範圍內,這也是我們對輸入數據進行縮放/正規化的原因。然而,在深度網路的訓練過程中,數值可能會大幅偏離這個範圍,這會導致訓練困難。批次正規化層會計算當前小批次所有數值的平均值和標準差,然後利用它們去正規化信號,再將其傳遞到神經網路層。這能大幅提升深度網路的穩定性。\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## 重點\n", + "## 重點整理\n", "\n", - "透過遷移學習,我們能夠快速建立一個用於自訂物件分類任務的分類器,並且達到高準確率。然而,這個例子並不完全公平,因為原始的 VGG-16 網路已經預先訓練過用來辨識貓和狗,因此我們只是重複利用網路中已存在的大部分模式。對於更特殊的領域專屬物件,例如工廠生產線上的細節或不同種類的樹葉,準確率可能會較低。\n", + "使用遷移學習,我們能快速組建一個自訂物件分類任務的分類器,並達到高準確率。然而,這個範例並非完全公平,因為原始的 VGG-16 網路是預先訓練來辨識貓和狗,因此我們只是重複使用了網路中早已存在的大部分特徵。對於較為特殊的領域特定物件,例如工廠生產線上的細節或不同的樹葉,你可以預期準確率會較低。\n", "\n", - "你可以看到,我們現在正在解決的更複雜任務需要更高的計算能力,並且無法輕易地在 CPU 上完成。在下一單元中,我們將嘗試使用更輕量化的實現方式來訓練相同的模型,使用較低的計算資源,並且僅稍微降低準確率。\n" + "你可以看到,我們現在解決的較複雜任務需要更高的計算能力,且無法輕易在 CPU 上完成。在下一單元,我們將嘗試使用更輕量級的實作來訓練相同模型,使用較低的計算資源,並且只會稍微降低準確度。\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**免責聲明**: \n本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始語言的文件應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋不承擔責任。\n" + "---\n\n\n**免責聲明**:\n此文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們努力追求準確性,但請注意自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應視為權威來源。對於關鍵資訊,建議採用專業人工翻譯。我們不對因使用此翻譯所產生的任何誤解或誤譯承擔責任。\n\n" ] } ], @@ -1484,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-08-31T09:39:21+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "tw" } }, "nbformat": 4, diff --git a/translations/zh-TW/lessons/5-NLP/README.md b/translations/zh-TW/lessons/5-NLP/README.md index 322605cb..b4556c6b 100644 --- a/translations/zh-TW/lessons/5-NLP/README.md +++ b/translations/zh-TW/lessons/5-NLP/README.md @@ -1,51 +1,51 @@ # 自然語言處理 -![NLP任務摘要手繪圖](../../../../translated_images/zh-TW/ai-nlp.b22dcb8ca4707cea.webp) +![NLP 任務摘要手繪圖](../../../../translated_images/zh-TW/ai-nlp.b22dcb8ca4707cea.webp) -在本章節中,我們將專注於使用神經網絡來處理與**自然語言處理 (NLP)**相關的任務。我們希望電腦能夠解決許多NLP問題: +在本節中,我們將專注於使用神經網路處理與自然語言處理(NLP)相關的任務。我們希望電腦能夠解決許多 NLP 問題: -* **文本分類**是一種典型的分類問題,針對文本序列進行分類。例如,將電子郵件分類為垃圾郵件或非垃圾郵件,或者將文章分類為體育、商業、政治等。此外,在開發聊天機器人時,我們通常需要理解使用者的意圖——這就是所謂的**意圖分類**。意圖分類通常需要處理多個類別。 -* **情感分析**是一種典型的回歸問題,我們需要為句子的正面/負面情感賦予一個數值。一種更高級的情感分析是**基於方面的情感分析** (ABSA),它不是為整個句子賦予情感,而是為句子的不同部分(方面)賦予情感,例如:*在這家餐廳,我喜歡菜餚,但氛圍很糟糕*。 -* **命名實體識別** (NER) 是指從文本中提取特定實體的問題。例如,我們需要理解在句子*我明天要飛往巴黎*中,*明天*指的是日期,*巴黎*是地點。 -* **關鍵字提取**類似於NER,但我們需要自動提取對句子含義重要的詞語,而不需要針對特定實體類型進行預訓練。 -* **文本聚類**在需要將相似的句子分組時非常有用,例如技術支持對話中的相似請求。 -* **問答**是指模型回答特定問題的能力。模型接收一段文本和一個問題作為輸入,並需要提供文本中包含答案的位置(有時需要生成答案文本)。 -* **文本生成**是指模型生成新文本的能力。它可以被視為一種分類任務,根據某些*文本提示*預測下一個字母/單詞。高級文本生成模型,例如GPT-3,能夠通過使用[提示編程](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0)或[提示工程](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29)技術來解決其他NLP任務,例如分類。 -* **文本摘要**是一種技術,當我們希望電腦“閱讀”長文本並用幾句話進行摘要時使用。 -* **機器翻譯**可以被視為一種結合一種語言的文本理解和另一種語言的文本生成的技術。 +* 文本分類 是一種典型的文本序列分類問題。例子包括將電子郵件訊息分類為垃圾郵件與非垃圾郵件,或將文章分類為體育、商業、政治等。此外,在開發聊天機器人時,我們經常需要理解使用者的意圖——這種情況下我們處理的是意圖分類。通常在意圖分類中,我們需要處理許多類別。 + 情感分析 是一種典型的回歸問題,我們需要為句子的正向/負向意義分配一個數字(情感值)。更進階的情感分析是基於方面的情感分析(ABSA),我們會將情感分配給句子的不同部分(方面),例如:在這家餐廳,我喜歡料理,但氣氛很糟糕*。 + 命名實體識別(NER)是指從文本中提取特定實體的問題。例如,我們可能需要了解在短語我明天需要飛往巴黎中,單詞明天指的是日期,巴黎*是地點。 +* 關鍵詞提取 與 NER 類似,但我們需要自動提取對句子意義重要的詞,而不針對特定實體類型進行預訓練。 +* 文本聚類 在我們想將相似的句子分組時非常有用,例如技術支持對話中的相似請求。 +* 問答系統 指模型能夠回答具體問題的能力。模型輸入一段文本和一個問題,並需要提供文本中包含問題答案的位置(或有時生成答案文字)。 + 文本生成 是模型生成新文本的能力。這可以視為根據某些文本提示*預測下一個字母/單詞的分類任務。進階文本生成模型如 GPT-3,能夠使用稱為[提示編程](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0)或[提示工程](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29)的技術解決其他 NLP 任務,例如分類。 +* 文本摘要 是一種技術,讓電腦「閱讀」長文本並用幾句話進行摘要。 +* 機器翻譯 可以看作是對一種語言的文本理解和另一種語言的文本生成的組合。 -最初,大多數NLP任務是使用傳統方法(例如語法)來解決的。例如,在機器翻譯中,解析器被用來將初始句子轉換為語法樹,然後提取高層語義結構以表示句子的含義,基於這些含義和目標語言的語法生成結果。如今,許多NLP任務使用神經網絡更有效地解決。 +最初,大多數 NLP 任務是使用傳統方法如語法結構來解決的。例如,在機器翻譯中,解析器被用於將初始句子轉換為語法樹,然後提取更高層次的語義結構以表示句子意義,基於這個意義和目標語言的語法生成結果。如今,許多 NLP 任務更有效地使用神經網路來解決。 -> 許多經典的NLP方法已在[自然語言處理工具包 (NLTK)](https://www.nltk.org) Python庫中實現。線上有一本很棒的[NLTK書籍](https://www.nltk.org/book/),涵蓋了如何使用NLTK解決不同的NLP任務。 +> 許多經典 NLP 方法實現於 Python 庫 [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) 中。線上有一本很棒的 [NLTK 書籍](https://www.nltk.org/book/) 講解如何使用 NLTK 解決不同的 NLP 任務。 -在我們的課程中,我們將主要專注於使用神經網絡進行NLP,並在需要時使用NLTK。 +在本課程中,我們將主要專注於使用神經網路進行 NLP,並在需要時使用 NLTK。 -我們已經學習了如何使用神經網絡處理表格數據和圖像。這些數據類型與文本的主要區別在於,文本是一種可變長度的序列,而圖像的輸入大小是事先已知的。雖然卷積網絡可以從輸入數據中提取模式,但文本中的模式更為複雜。例如,否定可能與主語分隔許多詞語(例如:*我不喜歡橙子*,與*我不喜歡那些又大又多彩又美味的橙子*),但仍應被解釋為一個模式。因此,為了處理語言,我們需要引入新的神經網絡類型,例如*循環網絡*和*Transformer*。 +我們已經學過使用神經網路處理表格式資料和影像。這些資料型態與文本的主要差異在於文本是變長的序列,而影像的輸入大小事先已知。雖然卷積網路能夠從輸入資料中提取模式,但文本中的模式更複雜。例如,否定詞可能會在主詞與動詞之間與任意多詞分隔(如 我不喜歡橘子,對比 我不喜歡那些又大又彩色又美味的橘子),而這仍應該被視作一個模式。因此,處理語言需要引入新的神經網路類型,如循環網路變壓器。 -## 安裝庫 +## 安裝函式庫 -如果您使用本地Python環境運行本課程,可能需要使用以下命令安裝所有NLP所需的庫: +如果您使用本機 Python 安裝來執行本課程,可能需要使用以下指令安裝所有 NLP 所需的函式庫: -**PyTorch** +**PyTorch 版** ```bash -pip install -r requirements-torch.txt +pip install -r requirements-pytorch.txt ``` -**TensorFlow** +**TensorFlow 版** ```bash pip install -r requirements-tf.txt ``` -> 您可以在[Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste)上嘗試使用TensorFlow進行NLP。 +> 您也可以在 [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste) 上試用 TensorFlow 的 NLP -## GPU警告 +## GPU 警告 -在本章節中,我們的一些範例將訓練相當大的模型。 -* **使用支持GPU的電腦**:建議在支持GPU的電腦上運行您的筆記本,以減少處理大型模型時的等待時間。 -* **GPU記憶體限制**:使用GPU可能會導致GPU記憶體不足的情況,特別是在訓練大型模型時。 -* **GPU記憶體消耗**:訓練過程中GPU記憶體的消耗取決於多種因素,包括小批量大小。 -* **減少小批量大小**:如果遇到GPU記憶體問題,可以考慮減少代碼中的小批量大小作為解決方案。 -* **TensorFlow GPU記憶體釋放**:舊版本的TensorFlow可能無法正確釋放GPU記憶體,特別是在一個Python內核中訓練多個模型時。為了有效管理GPU記憶體使用,您可以配置TensorFlow僅在需要時分配GPU記憶體。 -* **代碼包含**:要設置TensorFlow僅在需要時增長GPU記憶體分配,請在您的筆記本中包含以下代碼: +本節中,有些範例會訓練相當大的模型。 +* **使用具 GPU 功能的電腦**:建議在具 GPU 功能的電腦上執行筆記本,以減少使用大型模型時的等待時間。 +* **GPU 記憶體限制**:在 GPU 上運行可能會遇到 GPU 記憶體不足的情況,尤其是在訓練大型模型時。 +* **GPU 記憶體消耗**:訓練過程中 GPU 記憶體的使用量取決於多種因素,包括小批量大小。 +* 最小化小批量大小:遇到 GPU 記憶體問題時,可以考慮降低程式中的小批量大小。 +* **TensorFlow GPU 記憶體釋放**:舊版本的 TensorFlow 可能無法在一個 Python 核心訓練多個模型時正確釋放 GPU 記憶體。為了有效管理 GPU 記憶體使用,您可以設定 TensorFlow 僅在需要時分配 GPU 記憶體。 +* 程式碼引入:要設定 TensorFlow 僅在需要時增加 GPU 記憶體分配,請在筆記本中加入以下程式碼: ```python physical_devices = tf.config.list_physical_devices('GPU') @@ -53,17 +53,21 @@ if len(physical_devices)>0: tf.config.experimental.set_memory_growth(physical_devices[0], True) ``` -如果您對從經典機器學習角度學習NLP感興趣,請訪問[這套課程](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP)。 +如果您有興趣從經典機器學習視角學習 NLP,請參訪[這套課程](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) -## 本章節內容 -在本章節中,我們將學習: +## 本節內容 +在本節中,我們將學習: * [將文本表示為張量](13-TextRep/README.md) * [詞嵌入](14-Emdeddings/README.md) -* [語言建模](15-LanguageModeling/README.md) -* [循環神經網絡](16-RNN/README.md) -* [生成式網絡](17-GenerativeNetworks/README.md) -* [Transformer](18-Transformers/README.md) +* [語言模型](15-LanguageModeling/README.md) +* [循環神經網路](16-RNN/README.md) +* [生成式網路](17-GenerativeNetworks/README.md) +* [變壓器](18-Transformers/README.md) -**免責聲明**: -本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原文文件作為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋概不負責。 \ No newline at end of file +--- + + +**免責聲明**: +此文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們努力追求準確性,但請注意自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應視為權威來源。對於關鍵資訊,建議採用專業人工翻譯。我們不對因使用此翻譯所產生的任何誤解或誤譯承擔責任。 + \ No newline at end of file