ЁЯМР Update translations via Co-op Translator
This commit is contained in:
parent
3aeb3374fc
commit
90e1452563
|
|
@ -1,8 +1,8 @@
|
|||
<!--
|
||||
CO_OP_TRANSLATOR_METADATA:
|
||||
{
|
||||
"original_hash": "f3a6b0ddf7e6e3f33b2a543baf086dc9",
|
||||
"translation_date": "2025-08-24T20:43:36+00:00",
|
||||
"original_hash": "07191303b7ea2aff1d47e2b0fe4bb862",
|
||||
"translation_date": "2025-08-31T14:18:57+00:00",
|
||||
"source_file": "README.md",
|
||||
"language_code": "fr"
|
||||
}
|
||||
|
|
@ -23,86 +23,97 @@ CO_OP_TRANSLATOR_METADATA:
|
|||
|
||||
# Intelligence Artificielle pour D├йbutants - Un Programme
|
||||
|
||||
| ](./lessons/sketchnotes/ai-overview.png)|
|
||||
|:---:|
|
||||
| AI For Beginners - _Sketchnote par [@girlie_mac](https://twitter.com/girlie_mac)_ |
|
||||
||
|
||||
|:---:|
|
||||
| AI pour D├йbutants - _Sketchnote par [@girlie_mac](https://twitter.com/girlie_mac)_ |
|
||||
|
||||
Explorez le monde de l'**Intelligence Artificielle** (IA) avec notre programme de 12 semaines et 24 le├зons ! Il inclut des le├зons pratiques, des quiz et des laboratoires. Ce programme est adapt├й aux d├йbutants et couvre des outils comme TensorFlow et PyTorch, ainsi que des questions d'├йthique en IA.
|
||||
Explorez le monde de l'**Intelligence Artificielle** (IA) avec notre programme de 12 semaines et 24 le├зons ! Il inclut des le├зons pratiques, des quiz et des laboratoires. Ce programme est adapt├й aux d├йbutants et couvre des outils comme TensorFlow et PyTorch, ainsi que des questions d'├йthique en IA.
|
||||
|
||||
## Ce que vous apprendrez
|
||||
### ЁЯМР Support Multilingue
|
||||
|
||||
**[Carte mentale du cours](http://soshnikov.com/courses/ai-for-beginners/mindmap.html)**
|
||||
#### Support├й via GitHub Action (Automatis├й & Toujours ├а Jour)
|
||||
|
||||
Dans ce programme, vous apprendrez :
|
||||
[Fran├зais](./README.md) | [Espagnol](../es/README.md) | [Allemand](../de/README.md) | [Russe](../ru/README.md) | [Arabe](../ar/README.md) | [Persan (Farsi)](../fa/README.md) | [Ourdou](../ur/README.md) | [Chinois (Simplifi├й)](../zh/README.md) | [Chinois (Traditionnel, Macao)](../mo/README.md) | [Chinois (Traditionnel, Hong Kong)](../hk/README.md) | [Chinois (Traditionnel, Ta├пwan)](../tw/README.md) | [Japonais](../ja/README.md) | [Cor├йen](../ko/README.md) | [Hindi](../hi/README.md) | [Bengali](../bn/README.md) | [Marathi](../mr/README.md) | [N├йpalais](../ne/README.md) | [Punjabi (Gurmukhi)](../pa/README.md) | [Portugais (Portugal)](../pt/README.md) | [Portugais (Br├йsil)](../br/README.md) | [Italien](../it/README.md) | [Polonais](../pl/README.md) | [Turc](../tr/README.md) | [Grec](../el/README.md) | [Tha├п](../th/README.md) | [Su├йdois](../sv/README.md) | [Danois](../da/README.md) | [Norv├йgien](../no/README.md) | [Finnois](../fi/README.md) | [N├йerlandais](../nl/README.md) | [H├йbreu](../he/README.md) | [Vietnamien](../vi/README.md) | [Indon├йsien](../id/README.md) | [Malais](../ms/README.md) | [Tagalog (Filipino)](../tl/README.md) | [Swahili](../sw/README.md) | [Hongrois](../hu/README.md) | [Tch├иque](../cs/README.md) | [Slovaque](../sk/README.md) | [Roumain](../ro/README.md) | [Bulgare](../bg/README.md) | [Serbe (Cyrillique)](../sr/README.md) | [Croate](../hr/README.md) | [Slov├иne](../sl/README.md) | [Ukrainien](../uk/README.md) | [Birman (Myanmar)](../my/README.md)
|
||||
|
||||
* Diff├йrentes approches de l'Intelligence Artificielle, y compris l'approche symbolique "classique" avec la **Repr├йsentation des Connaissances** et le raisonnement ([GOFAI](https://en.wikipedia.org/wiki/Symbolic_artificial_intelligence)).
|
||||
* Les **R├йseaux Neuronaux** et le **Deep Learning**, qui sont au c┼Уur de l'IA moderne. Nous illustrerons les concepts derri├иre ces sujets importants avec du code dans deux des frameworks les plus populaires - [TensorFlow](http://Tensorflow.org) et [PyTorch](http://pytorch.org).
|
||||
* Les **Architectures Neuronales** pour travailler avec les images et le texte. Nous couvrirons des mod├иles r├йcents, mais il se peut que nous ne soyons pas totalement ├а jour avec les derni├иres avanc├йes.
|
||||
* Des approches moins populaires de l'IA, comme les **Algorithmes G├йn├йtiques** et les **Syst├иmes Multi-Agents**.
|
||||
**Si vous souhaitez ajouter des langues suppl├йmentaires, les langues support├йes sont list├йes [ici](https://github.com/Azure/co-op-translator/blob/main/getting_started/supported-languages.md)**
|
||||
|
||||
Ce que nous ne couvrirons pas dans ce programme :
|
||||
## Rejoignez la Communaut├й
|
||||
[](https://discord.gg/kzRShWzttr)
|
||||
|
||||
> [Retrouvez toutes les ressources suppl├йmentaires pour ce cours dans notre collection Microsoft Learn](https://learn.microsoft.com/en-us/collections/7w28iy2xrqzdj0?WT.mc_id=academic-77998-bethanycheum)
|
||||
## Ce que vous apprendrez
|
||||
|
||||
* Les cas d'utilisation de l'**IA en entreprise**. Pensez ├а suivre le parcours d'apprentissage [Introduction ├а l'IA pour les utilisateurs professionnels](https://docs.microsoft.com/learn/paths/introduction-ai-for-business-users/?WT.mc_id=academic-77998-bethanycheum) sur Microsoft Learn, ou [AI Business School](https://www.microsoft.com/ai/ai-business-school/?WT.mc_id=academic-77998-bethanycheum), d├йvelopp├й en collaboration avec [INSEAD](https://www.insead.edu/).
|
||||
* Le **Machine Learning classique**, qui est bien d├йcrit dans notre programme [Machine Learning pour D├йbutants](http://github.com/Microsoft/ML-for-Beginners).
|
||||
* Les applications pratiques d'IA construites avec **[Cognitive Services](https://azure.microsoft.com/services/cognitive-services/?WT.mc_id=academic-77998-bethanycheum)**. Pour cela, nous recommandons de commencer par les modules Microsoft Learn pour [vision](https://docs.microsoft.com/learn/paths/create-computer-vision-solutions-azure-cognitive-services/?WT.mc_id=academic-77998-bethanycheum), [traitement du langage naturel](https://docs.microsoft.com/learn/paths/explore-natural-language-processing/?WT.mc_id=academic-77998-bethanycheum), **[IA g├йn├йrative avec Azure OpenAI Service](https://learn.microsoft.com/en-us/training/paths/develop-ai-solutions-azure-openai/?WT.mc_id=academic-77998-bethanycheum)** et autres.
|
||||
* Les **Frameworks Cloud ML** sp├йcifiques, comme [Azure Machine Learning](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-bethanycheum), [Microsoft Fabric](https://learn.microsoft.com/en-us/training/paths/get-started-fabric/?WT.mc_id=academic-77998-bethanycheum), ou [Azure Databricks](https://docs.microsoft.com/learn/paths/data-engineer-azure-databricks?WT.mc_id=academic-77998-bethanycheum). Pensez ├а utiliser les parcours d'apprentissage [Cr├йer et exploiter des solutions de machine learning avec Azure Machine Learning](https://docs.microsoft.com/learn/paths/build-ai-solutions-with-azure-ml-service/?WT.mc_id=academic-77998-bethanycheum) et [Cr├йer et exploiter des solutions de machine learning avec Azure Databricks](https://docs.microsoft.com/learn/paths/build-operate-machine-learning-solutions-azure-databricks/?WT.mc_id=academic-77998-bethanycheum).
|
||||
* L'**IA conversationnelle** et les **Chat Bots**. Il existe un parcours d'apprentissage s├йpar├й [Cr├йer des solutions d'IA conversationnelle](https://docs.microsoft.com/learn/paths/create-conversational-ai-solutions/?WT.mc_id=academic-77998-bethanycheum), et vous pouvez ├йgalement consulter [cet article de blog](https://soshnikov.com/azure/hello-bot-conversational-ai-on-microsoft-platform/) pour plus de d├йtails.
|
||||
* Les **Math├йmatiques avanc├йes** derri├иre le deep learning. Pour cela, nous recommandons [Deep Learning](https://www.amazon.com/Deep-Learning-Adaptive-Computation-Machine/dp/0262035618) par Ian Goodfellow, Yoshua Bengio et Aaron Courville, ├йgalement disponible en ligne ├а [https://www.deeplearningbook.org/](https://www.deeplearningbook.org/).
|
||||
**[Carte mentale du cours](http://soshnikov.com/courses/ai-for-beginners/mindmap.html)**
|
||||
|
||||
Pour une introduction douce aux sujets li├йs ├а l'_IA dans le Cloud_, vous pouvez envisager de suivre le parcours d'apprentissage [Commencer avec l'intelligence artificielle sur Azure](https://docs.microsoft.com/learn/paths/get-started-with-artificial-intelligence-on-azure/?WT.mc_id=academic-77998-bethanycheum).
|
||||
Dans ce programme, vous apprendrez :
|
||||
|
||||
# Contenu
|
||||
* Diff├йrentes approches de l'Intelligence Artificielle, y compris l'approche symbolique "classique" avec la **Repr├йsentation des Connaissances** et le raisonnement ([GOFAI](https://en.wikipedia.org/wiki/Symbolic_artificial_intelligence)).
|
||||
* Les **R├йseaux Neuronaux** et le **Deep Learning**, qui sont au c┼Уur de l'IA moderne. Nous illustrerons les concepts derri├иre ces sujets importants avec du code dans deux des frameworks les plus populaires - [TensorFlow](http://Tensorflow.org) et [PyTorch](http://pytorch.org).
|
||||
* Les **Architectures Neuronales** pour travailler avec les images et le texte. Nous couvrirons des mod├иles r├йcents, mais il se peut que nous manquions un peu des derniers mod├иles ├а la pointe.
|
||||
* Des approches moins populaires de l'IA, comme les **Algorithmes G├йn├йtiques** et les **Syst├иmes Multi-Agents**.
|
||||
|
||||
| | Lien de la le├зon | PyTorch/Keras/TensorFlow | Lab |
|
||||
| :-: | :------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------: | ------------------------------------------------------------------------------ |
|
||||
| 0 | [Configuration du cours](./lessons/0-course-setup/setup.md) | [Configurer votre environnement de d├йveloppement](./lessons/0-course-setup/how-to-run.md) | |
|
||||
| I | [**Introduction ├а l'IA**](./lessons/1-Intro/README.md) | | |
|
||||
| 01 | [Introduction et histoire de l'IA](./lessons/1-Intro/README.md) | - | - |
|
||||
| II | **IA Symbolique** |
|
||||
| 02 | [Repr├йsentation des connaissances et syst├иmes experts](./lessons/2-Symbolic/README.md) | [Syst├иmes experts](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/2-Symbolic/Animals.ipynb) / [Ontologie](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/2-Symbolic/FamilyOntology.ipynb) /[Graphes de concepts](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/2-Symbolic/MSConceptGraph.ipynb) | |
|
||||
| III | [**Introduction aux r├йseaux neuronaux**](./lessons/3-NeuralNetworks/README.md) |||
|
||||
| 03 | [Perceptron](./lessons/3-NeuralNetworks/03-Perceptron/README.md) | [Notebook](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb) | [Lab](./lessons/3-NeuralNetworks/03-Perceptron/lab/README.md) |
|
||||
| 04 | [Perceptron multicouche et cr├йation de notre propre framework](./lessons/3-NeuralNetworks/04-OwnFramework/README.md) | [Notebook](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/3-NeuralNetworks/04-OwnFramework/OwnFramework.ipynb) | [Lab](./lessons/3-NeuralNetworks/04-OwnFramework/lab/README.md) |
|
||||
| 05 | [Introduction aux frameworks (PyTorch/TensorFlow) et surapprentissage](./lessons/3-NeuralNetworks/05-Frameworks/README.md) | [PyTorch](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/3-NeuralNetworks/05-Frameworks/IntroPyTorch.ipynb) / [Keras](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/3-NeuralNetworks/05-Frameworks/IntroKeras.ipynb) / [TensorFlow](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/3-NeuralNetworks/05-Frameworks/IntroKerasTF.ipynb) | [Lab](./lessons/3-NeuralNetworks/05-Frameworks/lab/README.md) |
|
||||
Ce que nous ne couvrirons pas dans ce programme :
|
||||
|
||||
> [Retrouvez toutes les ressources suppl├йmentaires pour ce cours dans notre collection Microsoft Learn](https://learn.microsoft.com/en-us/collections/7w28iy2xrqzdj0?WT.mc_id=academic-77998-bethanycheum)
|
||||
|
||||
* Les cas d'utilisation de l'**IA en Entreprise**. Pensez ├а suivre le parcours d'apprentissage [Introduction ├а l'IA pour les utilisateurs professionnels](https://docs.microsoft.com/learn/paths/introduction-ai-for-business-users/?WT.mc_id=academic-77998-bethanycheum) sur Microsoft Learn, ou [AI Business School](https://www.microsoft.com/ai/ai-business-school/?WT.mc_id=academic-77998-bethanycheum), d├йvelopp├й en coop├йration avec [INSEAD](https://www.insead.edu/).
|
||||
* Le **Machine Learning Classique**, qui est bien d├йcrit dans notre programme [Machine Learning pour D├йbutants](http://github.com/Microsoft/ML-for-Beginners).
|
||||
* Les applications pratiques de l'IA construites avec **[Cognitive Services](https://azure.microsoft.com/services/cognitive-services/?WT.mc_id=academic-77998-bethanycheum)**. Pour cela, nous vous recommandons de commencer par les modules Microsoft Learn pour [vision](https://docs.microsoft.com/learn/paths/create-computer-vision-solutions-azure-cognitive-services/?WT.mc_id=academic-77998-bethanycheum), [traitement du langage naturel](https://docs.microsoft.com/learn/paths/explore-natural-language-processing/?WT.mc_id=academic-77998-bethanycheum), **[IA G├йn├йrative avec Azure OpenAI Service](https://learn.microsoft.com/en-us/training/paths/develop-ai-solutions-azure-openai/?WT.mc_id=academic-77998-bethanycheum)** et autres.
|
||||
* Les **Frameworks Cloud ML** sp├йcifiques, comme [Azure Machine Learning](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-bethanycheum), [Microsoft Fabric](https://learn.microsoft.com/en-us/training/paths/get-started-fabric/?WT.mc_id=academic-77998-bethanycheum), ou [Azure Databricks](https://docs.microsoft.com/learn/paths/data-engineer-azure-databricks?WT.mc_id=academic-77998-bethanycheum). Pensez ├а utiliser les parcours d'apprentissage [Cr├йer et exploiter des solutions de machine learning avec Azure Machine Learning](https://docs.microsoft.com/learn/paths/build-ai-solutions-with-azure-ml-service/?WT.mc_id=academic-77998-bethanycheum) et [Cr├йer et exploiter des solutions de machine learning avec Azure Databricks](https://docs.microsoft.com/learn/paths/build-operate-machine-learning-solutions-azure-databricks/?WT.mc_id=academic-77998-bethanycheum).
|
||||
* L'**IA Conversationnelle** et les **Chat Bots**. Il existe un parcours d'apprentissage s├йpar├й [Cr├йer des solutions d'IA conversationnelle](https://docs.microsoft.com/learn/paths/create-conversational-ai-solutions/?WT.mc_id=academic-77998-bethanycheum), et vous pouvez ├йgalement consulter [cet article de blog](https://soshnikov.com/azure/hello-bot-conversational-ai-on-microsoft-platform/) pour plus de d├йtails.
|
||||
* Les **Math├йmatiques Approfondies** derri├иre le deep learning. Pour cela, nous vous recommandons [Deep Learning](https://www.amazon.com/Deep-Learning-Adaptive-Computation-Machine/dp/0262035618) par Ian Goodfellow, Yoshua Bengio et Aaron Courville, ├йgalement disponible en ligne ├а [https://www.deeplearningbook.org/](https://www.deeplearningbook.org/).
|
||||
|
||||
Pour une introduction douce aux sujets _IA dans le Cloud_, vous pouvez envisager de suivre le parcours d'apprentissage [Commencer avec l'intelligence artificielle sur Azure](https://docs.microsoft.com/learn/paths/get-started-with-artificial-intelligence-on-azure/?WT.mc_id=academic-77998-bethanycheum).
|
||||
|
||||
# Contenu
|
||||
|
||||
| | Lien de la Le├зon | PyTorch/Keras/TensorFlow | Lab |
|
||||
| :-: | :------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------: | ------------------------------------------------------------------------------ |
|
||||
| 0 | [Configuration du Cours](./lessons/0-course-setup/setup.md) | [Configurer votre environnement de d├йveloppement](./lessons/0-course-setup/how-to-run.md) | |
|
||||
| I | [**Introduction ├а l'IA**](./lessons/1-Intro/README.md) | | |
|
||||
| 01 | [Introduction et Histoire de l'IA](./lessons/1-Intro/README.md) | - | - |
|
||||
| II | **IA Symbolique** |
|
||||
| 02 | [Repr├йsentation des Connaissances et Syst├иmes Experts](./lessons/2-Symbolic/README.md) | [Syst├иmes Experts](./lessons/2-Symbolic/Animals.ipynb) / [Ontologie](./lessons/2-Symbolic/FamilyOntology.ipynb) /[Graphique Conceptuel](./lessons/2-Symbolic/MSConceptGraph.ipynb) | |
|
||||
| III | [**Introduction aux R├йseaux Neuronaux**](./lessons/3-NeuralNetworks/README.md) |||
|
||||
| 03 | [Perceptron](./lessons/3-NeuralNetworks/03-Perceptron/README.md) | [Notebook](./lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb) | [Lab](./lessons/3-NeuralNetworks/03-Perceptron/lab/README.md) |
|
||||
| 04 | [Perceptron Multicouche et Cr├йation de notre propre Framework](./lessons/3-NeuralNetworks/04-OwnFramework/README.md) | [Notebook](./lessons/3-NeuralNetworks/04-OwnFramework/OwnFramework.ipynb) | [Lab](./lessons/3-NeuralNetworks/04-OwnFramework/lab/README.md) |
|
||||
| 05 | [Introduction aux frameworks (PyTorch/TensorFlow) et surapprentissage](./lessons/3-NeuralNetworks/05-Frameworks/README.md) | [PyTorch](./lessons/3-NeuralNetworks/05-Frameworks/IntroPyTorch.ipynb) / [Keras](./lessons/3-NeuralNetworks/05-Frameworks/IntroKeras.ipynb) / [TensorFlow](./lessons/3-NeuralNetworks/05-Frameworks/IntroKerasTF.ipynb) | [Lab](./lessons/3-NeuralNetworks/05-Frameworks/lab/README.md) |
|
||||
| IV | [**Vision par ordinateur**](./lessons/4-ComputerVision/README.md) | [PyTorch](https://docs.microsoft.com/learn/modules/intro-computer-vision-pytorch/?WT.mc_id=academic-77998-cacaste) / [TensorFlow](https://docs.microsoft.com/learn/modules/intro-computer-vision-TensorFlow/?WT.mc_id=academic-77998-cacaste)| [Explorer la vision par ordinateur sur Microsoft Azure](https://learn.microsoft.com/en-us/collections/7w28iy2xrqzdj0?WT.mc_id=academic-77998-bethanycheum) |
|
||||
| 06 | [Introduction ├а la vision par ordinateur. OpenCV](./lessons/4-ComputerVision/06-IntroCV/README.md) | [Notebook](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb) | [Lab](./lessons/4-ComputerVision/06-IntroCV/lab/README.md) |
|
||||
| 07 | [R├йseaux neuronaux convolutionnels](./lessons/4-ComputerVision/07-ConvNets/README.md) & [Architectures CNN](./lessons/4-ComputerVision/07-ConvNets/CNN_Architectures.md) | [PyTorch](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/07-ConvNets/ConvNetsPyTorch.ipynb) /[TensorFlow](https://microsoft.github.io/AI-For-Beginners/lessons/4-ComputerVision/07-ConvNets/ConvNetsTF.ipynb) | [Lab](./lessons/4-ComputerVision/07-ConvNets/lab/README.md) |
|
||||
| 08 | [R├йseaux pr├й-entra├оn├йs et apprentissage par transfert](./lessons/4-ComputerVision/08-TransferLearning/README.md) et [Astuces d'entra├оnement](./lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md) | [PyTorch](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/08-TransferLearning/TransferLearningPyTorch.ipynb) / [TensorFlow](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/3-NeuralNetworks/05-Frameworks/IntroKerasTF.ipynb) | [Lab](./lessons/4-ComputerVision/08-TransferLearning/lab/README.md) |
|
||||
| 09 | [Autoencodeurs et VAEs](./lessons/4-ComputerVision/09-Autoencoders/README.md) | [PyTorch](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/09-Autoencoders/AutoEncodersPyTorch.ipynb) / [TensorFlow](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/09-Autoencoders/AutoencodersTF.ipynb) | |
|
||||
| 10 | [R├йseaux antagonistes g├йn├йratifs et transfert de style artistique](./lessons/4-ComputerVision/10-GANs/README.md) | [PyTorch](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/10-GANs/GANPyTorch.ipynb) / [TensorFlow](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/10-GANs/GANTF.ipynb) | |
|
||||
| 11 | [D├йtection d'objets](./lessons/4-ComputerVision/11-ObjectDetection/README.md) | [TensorFlow](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/11-ObjectDetection/ObjectDetection.ipynb) | [Lab](./lessons/4-ComputerVision/11-ObjectDetection/lab/README.md) |
|
||||
| 12 | [Segmentation s├йmantique. U-Net](./lessons/4-ComputerVision/12-Segmentation/README.md) | [PyTorch](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/12-Segmentation/SemanticSegmentationPytorch.ipynb) / [TensorFlow](../../(https:/github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/12-Segmentation/SemanticSegmentationTF.ipynb)) | |
|
||||
| 06 | [Introduction ├а la vision par ordinateur. OpenCV](./lessons/4-ComputerVision/06-IntroCV/README.md) | [Notebook](./lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb) | [Lab](./lessons/4-ComputerVision/06-IntroCV/lab/README.md) |
|
||||
| 07 | [R├йseaux neuronaux convolutionnels](./lessons/4-ComputerVision/07-ConvNets/README.md) & [Architectures CNN](./lessons/4-ComputerVision/07-ConvNets/CNN_Architectures.md) | [PyTorch](./lessons/4-ComputerVision/07-ConvNets/ConvNetsPyTorch.ipynb) /[TensorFlow](./lessons/4-ComputerVision/07-ConvNets/ConvNetsTF.ipynb) | [Lab](./lessons/4-ComputerVision/07-ConvNets/lab/README.md) |
|
||||
| 08 | [R├йseaux pr├й-entra├оn├йs et apprentissage par transfert](./lessons/4-ComputerVision/08-TransferLearning/README.md) et [Astuces d'entra├оnement](./lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md) | [PyTorch](./lessons/4-ComputerVision/08-TransferLearning/TransferLearningPyTorch.ipynb) / [TensorFlow](./lessons/3-NeuralNetworks/05-Frameworks/IntroKerasTF.ipynb) | [Lab](./lessons/4-ComputerVision/08-TransferLearning/lab/README.md) |
|
||||
| 09 | [Autoencodeurs et VAEs](./lessons/4-ComputerVision/09-Autoencoders/README.md) | [PyTorch](./lessons/4-ComputerVision/09-Autoencoders/AutoEncodersPyTorch.ipynb) / [TensorFlow](./lessons/4-ComputerVision/09-Autoencoders/AutoencodersTF.ipynb) | |
|
||||
| 10 | [R├йseaux antagonistes g├йn├йratifs et transfert de style artistique](./lessons/4-ComputerVision/10-GANs/README.md) | [PyTorch](./lessons/4-ComputerVision/10-GANs/GANPyTorch.ipynb) / [TensorFlow](./lessons/4-ComputerVision/10-GANs/GANTF.ipynb) | |
|
||||
| 11 | [D├йtection d'objets](./lessons/4-ComputerVision/11-ObjectDetection/README.md) | [TensorFlow](./lessons/4-ComputerVision/11-ObjectDetection/ObjectDetection.ipynb) | [Lab](./lessons/4-ComputerVision/11-ObjectDetection/lab/README.md) |
|
||||
| 12 | [Segmentation s├йmantique. U-Net](./lessons/4-ComputerVision/12-Segmentation/README.md) | [PyTorch](./lessons/4-ComputerVision/12-Segmentation/SemanticSegmentationPytorch.ipynb) / [TensorFlow](./lessons/4-ComputerVision/12-Segmentation/SemanticSegmentationTF.ipynb) | |
|
||||
| V | [**Traitement du langage naturel**](./lessons/5-NLP/README.md) | [PyTorch](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-pytorch/?WT.mc_id=academic-77998-cacaste) /[TensorFlow](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-TensorFlow/?WT.mc_id=academic-77998-cacaste) | [Explorer le traitement du langage naturel sur Microsoft Azure](https://learn.microsoft.com/en-us/collections/7w28iy2xrqzdj0?WT.mc_id=academic-77998-bethanycheum)|
|
||||
| 13 | [Repr├йsentation des textes. Bow/TF-IDF](./lessons/5-NLP/13-TextRep/README.md) | [PyTorch](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/13-TextRep/TextRepresentationPyTorch.ipynb) / [TensorFlow](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/13-TextRep/TextRepresentationTF.ipynb) | |
|
||||
| 14 | [Word embeddings s├йmantiques. Word2Vec et GloVe](./lessons/5-NLP/14-Embeddings/README.md) | [PyTorch](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/14-Embeddings/EmbeddingsPyTorch.ipynb) / [TensorFlow](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/14-Embeddings/EmbeddingsTF.ipynb) | |
|
||||
| 15 | [Mod├йlisation du langage. Entra├оner vos propres embeddings](./lessons/5-NLP/15-LanguageModeling/README.md) | [PyTorch](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/15-LanguageModeling/CBoW-PyTorch.ipynb) / [TensorFlow](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/15-LanguageModeling/CBoW-TF.ipynb) | [Lab](./lessons/5-NLP/15-LanguageModeling/lab/README.md) |
|
||||
| 16 | [R├йseaux neuronaux r├йcurrents](./lessons/5-NLP/16-RNN/README.md) | [PyTorch](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/16-RNN/RNNPyTorch.ipynb) / [TensorFlow](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/16-RNN/RNNTF.ipynb) | |
|
||||
| 17 | [R├йseaux r├йcurrents g├йn├йratifs](./lessons/5-NLP/17-GenerativeNetworks/README.md) | [PyTorch](https://microsoft.github.io/AI-For-Beginners/lessons/5-NLP/17-GenerativeNetworks/GenerativePyTorch.md) / [TensorFlow](https://microsoft.github.io/AI-For-Beginners/lessons/5-NLP/17-GenerativeNetworks/GenerativeTF.md) | [Lab](./lessons/5-NLP/17-GenerativeNetworks/lab/README.md) |
|
||||
| 18 | [Transformers. BERT.](./lessons/5-NLP/18-Transformers/READMEtransformers.md) | [PyTorch](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/18-Transformers/TransformersPyTorch.ipynb) /[TensorFlow](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/18-Transformers/TransformersTF.ipynb) | |
|
||||
| 19 | [Reconnaissance d'entit├йs nomm├йes](./lessons/5-NLP/19-NER/README.md) | [TensorFlow](https://microsoft.github.io/AI-For-Beginners/lessons/5-NLP/19-NER/NER-TF.ipynb) | [Lab](./lessons/5-NLP/19-NER/lab/README.md) |
|
||||
| 20 | [Grands mod├иles de langage, programmation par prompts et t├вches few-shot](./lessons/5-NLP/20-LangModels/READMELargeLang.md) | [PyTorch](https://microsoft.github.io/AI-For-Beginners/lessons/5-NLP/20-LangModels/GPT-PyTorch.ipynb) | |
|
||||
| 13 | [Repr├йsentation de texte. Bow/TF-IDF](./lessons/5-NLP/13-TextRep/README.md) | [PyTorch](./lessons/5-NLP/13-TextRep/TextRepresentationPyTorch.ipynb) / [TensorFlow](./lessons/5-NLP/13-TextRep/TextRepresentationTF.ipynb) | |
|
||||
| 14 | [Embeddings s├йmantiques de mots. Word2Vec et GloVe](./lessons/5-NLP/14-Embeddings/README.md) | [PyTorch](./lessons/5-NLP/14-Embeddings/EmbeddingsPyTorch.ipynb) / [TensorFlow](./lessons/5-NLP/14-Embeddings/EmbeddingsTF.ipynb) | |
|
||||
| 15 | [Mod├йlisation de langage. Entra├оnez vos propres embeddings](./lessons/5-NLP/15-LanguageModeling/README.md) | [PyTorch](./lessons/5-NLP/15-LanguageModeling/CBoW-PyTorch.ipynb) / [TensorFlow](./lessons/5-NLP/15-LanguageModeling/CBoW-TF.ipynb) | [Lab](./lessons/5-NLP/15-LanguageModeling/lab/README.md) |
|
||||
| 16 | [R├йseaux neuronaux r├йcurrents](./lessons/5-NLP/16-RNN/README.md) | [PyTorch](./lessons/5-NLP/16-RNN/RNNPyTorch.ipynb) / [TensorFlow](./lessons/5-NLP/16-RNN/RNNTF.ipynb) | |
|
||||
| 17 | [R├йseaux r├йcurrents g├йn├йratifs](./lessons/5-NLP/17-GenerativeNetworks/README.md) | [PyTorch](./lessons/5-NLP/17-GenerativeNetworks/GenerativePyTorch.md) / [TensorFlow](./lessons/5-NLP/17-GenerativeNetworks/GenerativeTF.md) | [Lab](./lessons/5-NLP/17-GenerativeNetworks/lab/README.md) |
|
||||
| 18 | [Transformers. BERT.](./lessons/5-NLP/18-Transformers/READMEtransformers.md) | [PyTorch](./lessons/5-NLP/18-Transformers/TransformersPyTorch.ipynb) /[TensorFlow](./lessons/5-NLP/18-Transformers/TransformersTF.ipynb) | |
|
||||
| 19 | [Reconnaissance d'entit├йs nomm├йes](./lessons/5-NLP/19-NER/README.md) | [TensorFlow](./lessons/5-NLP/19-NER/NER-TF.ipynb) | [Lab](./lessons/5-NLP/19-NER/lab/README.md) |
|
||||
| 20 | [Grands mod├иles de langage, programmation par prompts et t├вches en apprentissage par petits ├йchantillons](./lessons/5-NLP/20-LangModels/READMELargeLang.md) | [PyTorch](./lessons/5-NLP/20-LangModels/GPT-PyTorch.ipynb) | |
|
||||
| VI | **Autres techniques d'IA** || |
|
||||
| 21 | [Algorithmes g├йn├йtiques](./lessons/6-Other/21-GeneticAlgorithms/README.md) | [Notebook](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/6-Other/21-GeneticAlgorithms/Genetic.ipynb) | |
|
||||
| 22 | [Apprentissage par renforcement profond](./lessons/6-Other/22-DeepRL/README.md) | [PyTorch](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/6-Other/22-DeepRL/CartPole-RL-PyTorch.ipynb) /[TensorFlow](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/6-Other/22-DeepRL/CartPole-RL-TF.ipynb) | [Lab](./lessons/6-Other/22-DeepRL/lab/README.md) |
|
||||
| 21 | [Algorithmes g├йn├йtiques](./lessons/6-Other/21-GeneticAlgorithms/README.md) | [Notebook](./lessons/6-Other/21-GeneticAlgorithms/Genetic.ipynb) | |
|
||||
| 22 | [Apprentissage par renforcement profond](./lessons/6-Other/22-DeepRL/README.md) | [PyTorch](./lessons/6-Other/22-DeepRL/CartPole-RL-PyTorch.ipynb) /[TensorFlow](./lessons/6-Other/22-DeepRL/CartPole-RL-TF.ipynb) | [Lab](./lessons/6-Other/22-DeepRL/lab/README.md) |
|
||||
| 23 | [Syst├иmes multi-agents](./lessons/6-Other/23-MultiagentSystems/README.md) | | |
|
||||
| VII | **├Йthique de l'IA** | | |
|
||||
| 24 | [├Йthique de l'IA et IA responsable](./lessons/7-Ethics/README.md) | [Microsoft Learn : Principes d'IA responsable](https://docs.microsoft.com/learn/paths/responsible-ai-business-principles/?WT.mc_id=academic-77998-cacaste) | |
|
||||
| 24 | [├Йthique de l'IA et IA responsable](./lessons/7-Ethics/README.md) | [Microsoft Learn : Principes de l'IA responsable](https://docs.microsoft.com/learn/paths/responsible-ai-business-principles/?WT.mc_id=academic-77998-cacaste) | |
|
||||
| IX | **Extras** | | |
|
||||
| 25 | [R├йseaux multi-modaux, CLIP et VQGAN](./lessons/X-Extras/X1-MultiModal/README.md) | [Notebook](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/X-Extras/X1-MultiModal/Clip.ipynb) | |
|
||||
| 25 | [R├йseaux multi-modaux, CLIP et VQGAN](./lessons/X-Extras/X1-MultiModal/README.md) | [Notebook](./lessons/X-Extras/X1-MultiModal/Clip.ipynb) | |
|
||||
|
||||
## Chaque le├зon contient
|
||||
|
||||
* Du mat├йriel de pr├й-lecture
|
||||
* Des notebooks Jupyter ex├йcutables, souvent sp├йcifiques au framework (**PyTorch** ou **TensorFlow**). Ces notebooks contiennent ├йgalement beaucoup de contenu th├йorique, donc pour comprendre le sujet, il est n├йcessaire de parcourir au moins une version du notebook (PyTorch ou TensorFlow).
|
||||
* **Labs** disponibles pour certains sujets, qui vous permettent d'appliquer les connaissances acquises ├а un probl├иme sp├йcifique.
|
||||
* Mat├йriel de pr├й-lecture
|
||||
* Notebooks Jupyter ex├йcutables, souvent sp├йcifiques au framework (**PyTorch** ou **TensorFlow**). Le notebook ex├йcutable contient ├йgalement beaucoup de contenu th├йorique, donc pour comprendre le sujet, vous devez parcourir au moins une version du notebook (PyTorch ou TensorFlow).
|
||||
* **Labs** disponibles pour certains sujets, qui vous permettent d'appliquer le contenu appris ├а un probl├иme sp├йcifique.
|
||||
* Certaines sections contiennent des liens vers des modules [**MS Learn**](https://learn.microsoft.com/en-us/collections/7w28iy2xrqzdj0?WT.mc_id=academic-77998-bethanycheum) qui couvrent des sujets connexes.
|
||||
|
||||
## Pour commencer
|
||||
|
||||
- Nous avons cr├й├й une [le├зon d'installation](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/0-course-setup/setup.md) pour vous aider ├а configurer votre environnement de d├йveloppement. - Pour les ├йducateurs, nous avons ├йgalement cr├й├й une [le├зon de configuration des programmes](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/0-course-setup/for-teachers.md) !
|
||||
- Comment [ex├йcuter le code dans VSCode ou un Codespace](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/0-course-setup/how-to-run.md)
|
||||
- Nous avons cr├й├й une [le├зon de configuration](./lessons/0-course-setup/setup.md) pour vous aider ├а configurer votre environnement de d├йveloppement. - Pour les ├йducateurs, nous avons ├йgalement cr├й├й une [le├зon de configuration des programmes](./lessons/0-course-setup/for-teachers.md) !
|
||||
- Comment [ex├йcuter le code dans VSCode ou Codepace](./lessons/0-course-setup/how-to-run.md)
|
||||
|
||||
Suivez ces ├йtapes :
|
||||
|
||||
|
|
@ -110,46 +121,48 @@ Forkez le d├йp├┤t : Cliquez sur le bouton "Fork" en haut ├а droite de cette page
|
|||
|
||||
Clonez le d├йp├┤t : `git clone https://github.com/microsoft/AI-For-Beginners.git`
|
||||
|
||||
N'oubliez pas d'ajouter une ├йtoile (ЁЯМЯ) ├а ce d├йp├┤t pour le retrouver plus facilement plus tard.
|
||||
N'oubliez pas de mettre une ├йtoile (ЁЯМЯ) ├а ce d├йp├┤t pour le retrouver plus facilement plus tard.
|
||||
|
||||
## Rencontrez d'autres apprenants
|
||||
|
||||
Rejoignez notre [serveur Discord officiel sur l'IA](https://aka.ms/genai-discord?WT.mc_id=academic-105485-bethanycheum) pour rencontrer et ├йchanger avec d'autres apprenants suivant ce cours et obtenir du soutien.
|
||||
|
||||
Si vous avez des retours ou des questions sur les produits pendant votre apprentissage, visitez notre [forum des d├йveloppeurs Azure AI Foundry](https://aka.ms/foundry/forum)
|
||||
Si vous avez des retours sur le produit ou des questions pendant la construction, visitez notre [forum des d├йveloppeurs Azure AI Foundry](https://aka.ms/foundry/forum)
|
||||
|
||||
## Quiz
|
||||
> **Une note ├а propos des quiz** : Tous les quiz se trouvent dans le dossier Quiz-app dans etc\quiz-app. Ils sont li├йs depuis les le├зons, et l'application de quiz peut ├кtre ex├йcut├йe localement ou d├йploy├йe sur Azure ; suivez les instructions dans le dossier `quiz-app`. Ils sont progressivement en cours de localisation.
|
||||
> **Une note ├а propos des quiz** : Tous les quiz se trouvent dans le dossier Quiz-app sous etc\quiz-app, ou [en ligne ici](https://ff-quizzes.netlify.app/). Ils sont li├йs depuis les le├зons. L'application de quiz peut ├кtre ex├йcut├йe localement ou d├йploy├йe sur Azure ; suivez les instructions dans le dossier `quiz-app`. Leur localisation est en cours de r├йalisation progressivement.
|
||||
## Besoin d'aide
|
||||
|
||||
Vous avez des suggestions ou avez trouv├й des erreurs de code ou d'orthographe ? Ouvrez une issue ou cr├йez une pull request.
|
||||
Vous avez des suggestions ou avez trouv├й des erreurs d'orthographe ou de code ? Ouvrez une issue ou cr├йez une pull request.
|
||||
|
||||
## Remerciements sp├йciaux
|
||||
|
||||
* **тЬНя╕П Auteur principal :** [Dmitry Soshnikov](http://soshnikov.com), PhD
|
||||
* **ЁЯФе ├Йditrice :** [Jen Looper](https://twitter.com/jenlooper), PhD
|
||||
* **ЁЯОи Illustratrice de sketchnotes :** [Tomomi Imura](https://twitter.com/girlie_mac)
|
||||
* **тЬЕ Cr├йatrice de quiz :** [Lateefah Bello](https://github.com/CinnamonXI), [MLSA](https://studentambassadors.microsoft.com/)
|
||||
* **ЁЯОи Illustratrice des sketchnotes :** [Tomomi Imura](https://twitter.com/girlie_mac)
|
||||
* **тЬЕ Cr├йatrice du quiz :** [Lateefah Bello](https://github.com/CinnamonXI), [MLSA](https://studentambassadors.microsoft.com/)
|
||||
* **ЁЯЩП Contributeurs principaux :** [Evgenii Pishchik](https://github.com/Pe4enIks)
|
||||
|
||||
## Autres programmes
|
||||
|
||||
Notre ├йquipe produit d'autres programmes ! D├йcouvrez :
|
||||
Notre ├йquipe produit d'autres programmes ! D├йcouvrez-les :
|
||||
|
||||
- [IA g├йn├йrative pour d├йbutants](https://aka.ms/genai-beginners)
|
||||
- [IA g├йn├йrative pour d├йbutants .NET](https://github.com/microsoft/Generative-AI-for-beginners-dotnet)
|
||||
- [IA g├йn├йrative avec JavaScript](https://github.com/microsoft/generative-ai-with-javascript)
|
||||
- [IA g├йn├йrative avec Java](https://github.com/microsoft/Generative-AI-for-beginners-java)
|
||||
- [IA pour d├йbutants](https://aka.ms/ai-beginners)
|
||||
- [Science des donn├йes pour d├йbutants](https://aka.ms/datascience-beginners)
|
||||
- [Apprentissage automatique pour d├йbutants](https://aka.ms/ml-beginners)
|
||||
- [Cybers├йcurit├й pour d├йbutants](https://github.com/microsoft/Security-101)
|
||||
- [D├йveloppement web pour d├йbutants](https://aka.ms/webdev-beginners)
|
||||
- [IoT pour d├йbutants](https://aka.ms/iot-beginners)
|
||||
- [D├йveloppement XR pour d├йbutants](https://github.com/microsoft/xr-development-for-beginners)
|
||||
- [Ma├оtriser GitHub Copilot pour une utilisation agentique](https://github.com/microsoft/Mastering-GitHub-Copilot-for-Paired-Programming)
|
||||
- [Ma├оtriser GitHub Copilot pour les d├йveloppeurs C#/.NET](https://github.com/microsoft/mastering-github-copilot-for-dotnet-csharp-developers)
|
||||
- [Choisissez votre propre aventure avec Copilot](https://github.com/microsoft/CopilotAdventures)
|
||||
- [Generative AI for Beginners](https://aka.ms/genai-beginners)
|
||||
- [Generative AI for Beginners .NET](https://github.com/microsoft/Generative-AI-for-beginners-dotnet)
|
||||
- [Generative AI with JavaScript](https://github.com/microsoft/generative-ai-with-javascript)
|
||||
- [Generative AI with Java](https://github.com/microsoft/Generative-AI-for-beginners-java)
|
||||
- [AI for Beginners](https://aka.ms/ai-beginners)
|
||||
- [Data Science for Beginners](https://aka.ms/datascience-beginners)
|
||||
- [ML for Beginners](https://aka.ms/ml-beginners)
|
||||
- [Cybersecurity for Beginners](https://github.com/microsoft/Security-101)
|
||||
- [Web Dev for Beginners](https://aka.ms/webdev-beginners)
|
||||
- [IoT for Beginners](https://aka.ms/iot-beginners)
|
||||
- [XR Development for Beginners](https://github.com/microsoft/xr-development-for-beginners)
|
||||
- [Mastering GitHub Copilot for Agentic use](https://github.com/microsoft/Mastering-GitHub-Copilot-for-Paired-Programming)
|
||||
- [Mastering GitHub Copilot for C#/.NET Developers](https://github.com/microsoft/mastering-github-copilot-for-dotnet-csharp-developers)
|
||||
- [Choose Your Own Copilot Adventure](https://github.com/microsoft/CopilotAdventures)
|
||||
|
||||
---
|
||||
|
||||
**Avertissement** :
|
||||
Ce document a ├йt├й traduit ├а l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatis├йes peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit ├кtre consid├йr├й comme la source faisant autorit├й. Pour des informations critiques, il est recommand├й de recourir ├а une traduction humaine professionnelle. Nous d├йclinons toute responsabilit├й en cas de malentendus ou d'interpr├йtations erron├йes r├йsultant de l'utilisation de cette traduction.
|
||||
|
|
@ -0,0 +1,478 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"collapsed": true
|
||||
},
|
||||
"source": [
|
||||
"# Mise en ┼Уuvre d'un syst├иme expert pour les animaux\n",
|
||||
"\n",
|
||||
"Un exemple tir├й du [programme d'├йtudes AI for Beginners](http://github.com/microsoft/ai-for-beginners).\n",
|
||||
"\n",
|
||||
"Dans cet exemple, nous allons mettre en ┼Уuvre un syst├иme simple bas├й sur la connaissance pour identifier un animal en fonction de certaines caract├йristiques physiques. Le syst├иme peut ├кtre repr├йsent├й par l'arbre AND-OR suivant (il s'agit d'une partie de l'arbre complet, nous pouvons facilement ajouter d'autres r├иgles) :\n",
|
||||
"\n",
|
||||
"\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Notre propre shell de syst├иmes experts avec inf├йrence r├йtrograde\n",
|
||||
"\n",
|
||||
"Essayons de d├йfinir un langage simple pour la repr├йsentation des connaissances bas├й sur des r├иgles de production. Nous utiliserons des classes Python comme mots-cl├йs pour d├йfinir les r├иgles. Il y aurait essentiellement 3 types de classes :\n",
|
||||
"* `Ask` repr├йsente une question qui doit ├кtre pos├йe ├а l'utilisateur. Elle contient l'ensemble des r├йponses possibles.\n",
|
||||
"* `If` repr├йsente une r├иgle, et c'est juste une simplification syntaxique pour stocker le contenu de la r├иgle.\n",
|
||||
"* `AND`/`OR` sont des classes pour repr├йsenter les branches ET/OU de l'arbre. Elles se contentent de stocker la liste des arguments ├а l'int├йrieur. Pour simplifier le code, toutes les fonctionnalit├йs sont d├йfinies dans la classe parente `Content`.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class Ask():\n",
|
||||
" def __init__(self,choices=['y','n']):\n",
|
||||
" self.choices = choices\n",
|
||||
" def ask(self):\n",
|
||||
" if max([len(x) for x in self.choices])>1:\n",
|
||||
" for i,x in enumerate(self.choices):\n",
|
||||
" print(\"{0}. {1}\".format(i,x),flush=True)\n",
|
||||
" x = int(input())\n",
|
||||
" return self.choices[x]\n",
|
||||
" else:\n",
|
||||
" print(\"/\".join(self.choices),flush=True)\n",
|
||||
" return input()\n",
|
||||
"\n",
|
||||
"class Content():\n",
|
||||
" def __init__(self,x):\n",
|
||||
" self.x=x\n",
|
||||
" \n",
|
||||
"class If(Content):\n",
|
||||
" pass\n",
|
||||
"\n",
|
||||
"class AND(Content):\n",
|
||||
" pass\n",
|
||||
"\n",
|
||||
"class OR(Content):\n",
|
||||
" pass"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Dans notre syst├иme, la m├йmoire de travail contiendrait la liste des **faits** sous forme de **paires attribut-valeur**. La base de connaissances peut ├кtre d├йfinie comme un grand dictionnaire qui associe des actions (nouveaux faits devant ├кtre ins├йr├йs dans la m├йmoire de travail) ├а des conditions, exprim├йes sous forme d'expressions ET-OU. De plus, certains faits peuvent ├кtre `Demand├йs`.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"rules = {\n",
|
||||
" 'default': Ask(['y','n']),\n",
|
||||
" 'color' : Ask(['red-brown','black and white','other']),\n",
|
||||
" 'pattern' : Ask(['dark stripes','dark spots']),\n",
|
||||
" 'mammal': If(OR(['hair','gives milk'])),\n",
|
||||
" 'carnivor': If(OR([AND(['sharp teeth','claws','forward-looking eyes']),'eats meat'])),\n",
|
||||
" 'ungulate': If(['mammal',OR(['has hooves','chews cud'])]),\n",
|
||||
" 'bird': If(OR(['feathers',AND(['flies','lies eggs'])])),\n",
|
||||
" 'animal:monkey' : If(['mammal','carnivor','color:red-brown','pattern:dark spots']),\n",
|
||||
" 'animal:tiger' : If(['mammal','carnivor','color:red-brown','pattern:dark stripes']),\n",
|
||||
" 'animal:giraffe' : If(['ungulate','long neck','long legs','pattern:dark spots']),\n",
|
||||
" 'animal:zebra' : If(['ungulate','pattern:dark stripes']),\n",
|
||||
" 'animal:ostrich' : If(['bird','long nech','color:black and white','cannot fly']),\n",
|
||||
" 'animal:pinguin' : If(['bird','swims','color:black and white','cannot fly']),\n",
|
||||
" 'animal:albatross' : If(['bird','flies well'])\n",
|
||||
"}"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Pour effectuer l'inf├йrence ├а rebours, nous allons d├йfinir la classe `Knowledgebase`. Elle contiendra :\n",
|
||||
"* Une `m├йmoire` de travail - un dictionnaire qui associe des attributs ├а des valeurs\n",
|
||||
"* Les `r├иgles` de la base de connaissances dans le format d├йfini ci-dessus\n",
|
||||
"\n",
|
||||
"Les deux m├йthodes principales sont :\n",
|
||||
"* `get` pour obtenir la valeur d'un attribut, en effectuant une inf├йrence si n├йcessaire. Par exemple, `get('color')` obtiendra la valeur d'un champ de couleur (il posera la question si n├йcessaire et stockera la valeur pour une utilisation ult├йrieure dans la m├йmoire de travail). Si nous demandons `get('color:blue')`, il demandera une couleur, puis retournera une valeur `y`/`n` en fonction de la couleur.\n",
|
||||
"* `eval` effectue l'inf├йrence proprement dite, c'est-├а-dire qu'elle parcourt l'arbre AND/OR, ├йvalue les sous-objectifs, etc.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class KnowledgeBase():\n",
|
||||
" def __init__(self,rules):\n",
|
||||
" self.rules = rules\n",
|
||||
" self.memory = {}\n",
|
||||
" \n",
|
||||
" def get(self,name):\n",
|
||||
" if ':' in name:\n",
|
||||
" k,v = name.split(':')\n",
|
||||
" vv = self.get(k)\n",
|
||||
" return 'y' if v==vv else 'n'\n",
|
||||
" if name in self.memory.keys():\n",
|
||||
" return self.memory[name]\n",
|
||||
" for fld in self.rules.keys():\n",
|
||||
" if fld==name or fld.startswith(name+\":\"):\n",
|
||||
" # print(\" + proving {}\".format(fld))\n",
|
||||
" value = 'y' if fld==name else fld.split(':')[1]\n",
|
||||
" res = self.eval(self.rules[fld],field=name)\n",
|
||||
" if res!='y' and res!='n' and value=='y':\n",
|
||||
" self.memory[name] = res\n",
|
||||
" return res\n",
|
||||
" if res=='y':\n",
|
||||
" self.memory[name] = value\n",
|
||||
" return value\n",
|
||||
" # field is not found, using default\n",
|
||||
" res = self.eval(self.rules['default'],field=name)\n",
|
||||
" self.memory[name]=res\n",
|
||||
" return res\n",
|
||||
" \n",
|
||||
" def eval(self,expr,field=None):\n",
|
||||
" # print(\" + eval {}\".format(expr))\n",
|
||||
" if isinstance(expr,Ask):\n",
|
||||
" print(field)\n",
|
||||
" return expr.ask()\n",
|
||||
" elif isinstance(expr,If):\n",
|
||||
" return self.eval(expr.x)\n",
|
||||
" elif isinstance(expr,AND) or isinstance(expr,list):\n",
|
||||
" expr = expr.x if isinstance(expr,AND) else expr\n",
|
||||
" for x in expr:\n",
|
||||
" if self.eval(x)=='n':\n",
|
||||
" return 'n'\n",
|
||||
" return 'y'\n",
|
||||
" elif isinstance(expr,OR):\n",
|
||||
" for x in expr.x:\n",
|
||||
" if self.eval(x)=='y':\n",
|
||||
" return 'y'\n",
|
||||
" return 'n'\n",
|
||||
" elif isinstance(expr,str):\n",
|
||||
" return self.get(expr)\n",
|
||||
" else:\n",
|
||||
" print(\"Unknown expr: {}\".format(expr))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Maintenant, d├йfinissons notre base de connaissances sur les animaux et effectuons la consultation. Notez que cet appel vous posera des questions. Vous pouvez r├йpondre en tapant `y`/`n` pour les questions oui-non, ou en sp├йcifiant un num├йro (0..N) pour les questions avec des r├йponses ├а choix multiples plus longues.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"hair\n",
|
||||
"y/n\n",
|
||||
"sharp teeth\n",
|
||||
"y/n\n",
|
||||
"claws\n",
|
||||
"y/n\n",
|
||||
"forward-looking eyes\n",
|
||||
"y/n\n",
|
||||
"color\n",
|
||||
"0. red-brown\n",
|
||||
"1. black and white\n",
|
||||
"2. other\n",
|
||||
"has hooves\n",
|
||||
"y/n\n",
|
||||
"long neck\n",
|
||||
"y/n\n",
|
||||
"long legs\n",
|
||||
"y/n\n",
|
||||
"pattern\n",
|
||||
"0. dark stripes\n",
|
||||
"1. dark spots\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"'giraffe'"
|
||||
]
|
||||
},
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"kb = KnowledgeBase(rules)\n",
|
||||
"kb.get('animal')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Utilisation de PyKnow pour l'inf├йrence avant\n",
|
||||
"\n",
|
||||
"Dans l'exemple suivant, nous allons essayer de mettre en ┼Уuvre l'inf├йrence avant en utilisant l'une des biblioth├иques de repr├йsentation des connaissances, [PyKnow](https://github.com/buguroo/pyknow/). **PyKnow** est une biblioth├иque permettant de cr├йer des syst├иmes d'inf├йrence avant en Python, con├зue pour ├кtre similaire au syst├иme classique ancien [CLIPS](http://www.clipsrules.net/index.html).\n",
|
||||
"\n",
|
||||
"Nous aurions ├йgalement pu impl├йmenter nous-m├кmes le cha├оnage avant sans trop de difficult├йs, mais les impl├йmentations na├пves ne sont g├йn├йralement pas tr├иs efficaces. Pour un appariement des r├иgles plus performant, un algorithme sp├йcial appel├й [Rete](https://en.wikipedia.org/wiki/Rete_algorithm) est utilis├й.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Collecting git+https://github.com/buguroo/pyknow/\n",
|
||||
" Cloning https://github.com/buguroo/pyknow/ to /tmp/pip-req-build-3cqeulyl\n",
|
||||
" Running command git clone --filter=blob:none --quiet https://github.com/buguroo/pyknow/ /tmp/pip-req-build-3cqeulyl\n",
|
||||
" Resolved https://github.com/buguroo/pyknow/ to commit 48818336f2e9a126f1964f2d8dc22d37ff800fe8\n",
|
||||
" Preparing metadata (setup.py) ... \u001b[?25ldone\n",
|
||||
"\u001b[?25hCollecting frozendict==1.2\n",
|
||||
" Using cached frozendict-1.2.tar.gz (2.6 kB)\n",
|
||||
" Preparing metadata (setup.py) ... \u001b[?25ldone\n",
|
||||
"\u001b[?25hCollecting schema==0.6.7\n",
|
||||
" Using cached schema-0.6.7-py2.py3-none-any.whl (14 kB)\n",
|
||||
"Building wheels for collected packages: pyknow, frozendict\n",
|
||||
" Building wheel for pyknow (setup.py) ... \u001b[?25ldone\n",
|
||||
"\u001b[?25h Created wheel for pyknow: filename=pyknow-1.7.0-py3-none-any.whl size=34228 sha256=b7de5b09292c4007667c72f69b98d5a1b5f7324ff15f9dd8e077c3d5f7aade42\n",
|
||||
" Stored in directory: /tmp/pip-ephem-wheel-cache-k7jpave7/wheels/81/1a/d3/f6c15dbe1955598a37755215f2a10449e7418500d7bd4b9508\n",
|
||||
" Building wheel for frozendict (setup.py) ... \u001b[?25ldone\n",
|
||||
"\u001b[?25h Created wheel for frozendict: filename=frozendict-1.2-py3-none-any.whl size=3148 sha256=2863d55c240d2409cddf05ccfe600591f8478681549fc97555c47c90dc6bb160\n",
|
||||
" Stored in directory: /home/rg/.cache/pip/wheels/49/ac/f8/cb8120244e710bdb479c86198b03c7b08c3c2d3d2bf448fd6e\n",
|
||||
"Successfully built pyknow frozendict\n",
|
||||
"Installing collected packages: schema, frozendict, pyknow\n",
|
||||
"Successfully installed frozendict-1.2 pyknow-1.7.0 schema-0.6.7\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import sys\n",
|
||||
"!{sys.executable} -m pip install git+https://github.com/buguroo/pyknow/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 13,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"from pyknow import *\n",
|
||||
"#import pyknow"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Nous d├йfinirons notre syst├иme comme une classe qui h├йrite de `KnowledgeEngine`. Chaque r├иgle est d├йfinie par une fonction distincte avec l'annotation `@Rule`, qui sp├йcifie quand la r├иgle doit s'ex├йcuter. ├А l'int├йrieur de la r├иgle, nous pouvons ajouter de nouveaux faits en utilisant la fonction `declare`, et l'ajout de ces faits entra├оnera l'appel de certaines autres r├иgles par le moteur d'inf├йrence avant.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 14,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class Animals(KnowledgeEngine):\n",
|
||||
" @Rule(OR(\n",
|
||||
" AND(Fact('sharp teeth'),Fact('claws'),Fact('forward looking eyes')),\n",
|
||||
" Fact('eats meat')))\n",
|
||||
" def cornivor(self):\n",
|
||||
" self.declare(Fact('carnivor'))\n",
|
||||
" \n",
|
||||
" @Rule(OR(Fact('hair'),Fact('gives milk')))\n",
|
||||
" def mammal(self):\n",
|
||||
" self.declare(Fact('mammal'))\n",
|
||||
"\n",
|
||||
" @Rule(Fact('mammal'),\n",
|
||||
" OR(Fact('has hooves'),Fact('chews cud')))\n",
|
||||
" def hooves(self):\n",
|
||||
" self.declare('ungulate')\n",
|
||||
" \n",
|
||||
" @Rule(OR(Fact('feathers'),AND(Fact('flies'),Fact('lays eggs'))))\n",
|
||||
" def bird(self):\n",
|
||||
" self.declare('bird')\n",
|
||||
" \n",
|
||||
" @Rule(Fact('mammal'),Fact('carnivor'),\n",
|
||||
" Fact(color='red-brown'),\n",
|
||||
" Fact(pattern='dark spots'))\n",
|
||||
" def monkey(self):\n",
|
||||
" self.declare(Fact(animal='monkey'))\n",
|
||||
"\n",
|
||||
" @Rule(Fact('mammal'),Fact('carnivor'),\n",
|
||||
" Fact(color='red-brown'),\n",
|
||||
" Fact(pattern='dark stripes'))\n",
|
||||
" def tiger(self):\n",
|
||||
" self.declare(Fact(animal='tiger'))\n",
|
||||
"\n",
|
||||
" @Rule(Fact('ungulate'),\n",
|
||||
" Fact('long neck'),\n",
|
||||
" Fact('long legs'),\n",
|
||||
" Fact(pattern='dark spots'))\n",
|
||||
" def giraffe(self):\n",
|
||||
" self.declare(Fact(animal='giraffe'))\n",
|
||||
"\n",
|
||||
" @Rule(Fact('ungulate'),\n",
|
||||
" Fact(pattern='dark stripes'))\n",
|
||||
" def zebra(self):\n",
|
||||
" self.declare(Fact(animal='zebra'))\n",
|
||||
"\n",
|
||||
" @Rule(Fact('bird'),\n",
|
||||
" Fact('long neck'),\n",
|
||||
" Fact('cannot fly'),\n",
|
||||
" Fact(color='black and white'))\n",
|
||||
" def straus(self):\n",
|
||||
" self.declare(Fact(animal='ostrich'))\n",
|
||||
"\n",
|
||||
" @Rule(Fact('bird'),\n",
|
||||
" Fact('swims'),\n",
|
||||
" Fact('cannot fly'),\n",
|
||||
" Fact(color='black and white'))\n",
|
||||
" def pinguin(self):\n",
|
||||
" self.declare(Fact(animal='pinguin'))\n",
|
||||
"\n",
|
||||
" @Rule(Fact('bird'),\n",
|
||||
" Fact('flies well'))\n",
|
||||
" def albatros(self):\n",
|
||||
" self.declare(Fact(animal='albatross'))\n",
|
||||
" \n",
|
||||
" @Rule(Fact(animal=MATCH.a))\n",
|
||||
" def print_result(self,a):\n",
|
||||
" print('Animal is {}'.format(a))\n",
|
||||
" \n",
|
||||
" def factz(self,l):\n",
|
||||
" for x in l:\n",
|
||||
" self.declare(x)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Une fois que nous avons d├йfini une base de connaissances, nous remplissons notre m├йmoire de travail avec quelques faits initiaux, puis nous appelons la m├йthode `run()` pour effectuer l'inf├йrence. Vous pouvez voir qu'en cons├йquence, de nouveaux faits d├йduits sont ajout├йs ├а la m├йmoire de travail, y compris le fait final concernant l'animal (si nous avons correctement configur├й tous les faits initiaux).\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 15,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Animal is tiger\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"FactList([(0, InitialFact()),\n",
|
||||
" (1, Fact(color='red-brown')),\n",
|
||||
" (2, Fact(pattern='dark stripes')),\n",
|
||||
" (3, Fact('sharp teeth')),\n",
|
||||
" (4, Fact('claws')),\n",
|
||||
" (5, Fact('forward looking eyes')),\n",
|
||||
" (6, Fact('gives milk')),\n",
|
||||
" (7, Fact('mammal')),\n",
|
||||
" (8, Fact('carnivor')),\n",
|
||||
" (9, Fact(animal='tiger'))])"
|
||||
]
|
||||
},
|
||||
"execution_count": 15,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"ex1 = Animals()\n",
|
||||
"ex1.reset()\n",
|
||||
"ex1.factz([\n",
|
||||
" Fact(color='red-brown'),\n",
|
||||
" Fact(pattern='dark stripes'),\n",
|
||||
" Fact('sharp teeth'),\n",
|
||||
" Fact('claws'),\n",
|
||||
" Fact('forward looking eyes'),\n",
|
||||
" Fact('gives milk')])\n",
|
||||
"ex1.run()\n",
|
||||
"ex1.facts"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**Avertissement** : \nCe document a ├йt├й traduit ├а l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatis├йes peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit ├кtre consid├йr├й comme la source faisant autorit├й. Pour des informations critiques, il est recommand├й de recourir ├а une traduction professionnelle r├йalis├йe par un humain. Nous d├йclinons toute responsabilit├й en cas de malentendus ou d'interpr├йtations erron├йes r├йsultant de l'utilisation de cette traduction.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3.7.4 64-bit (conda)",
|
||||
"metadata": {
|
||||
"interpreter": {
|
||||
"hash": "86193a1ab0ba47eac1c69c1756090baa3b420b3eea7d4aafab8b85f8b312f0c5"
|
||||
}
|
||||
},
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.11.2"
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "ab2bd97b0453415b89a469284609a8ce",
|
||||
"translation_date": "2025-08-31T14:54:39+00:00",
|
||||
"source_file": "lessons/2-Symbolic/Animals.ipynb",
|
||||
"language_code": "fr"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
|
|
@ -0,0 +1,595 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"collapsed": true
|
||||
},
|
||||
"source": [
|
||||
"# Ontologie des Relations Familiales\n",
|
||||
"\n",
|
||||
"Cet exemple fait partie du [programme AI for Beginners](http://github.com/microsoft/ai-for-beginners), et il s'inspire de [cet article de blog](https://habr.com/post/270857/).\n",
|
||||
"\n",
|
||||
"J'ai toujours trouv├й difficile de me souvenir des diff├йrentes relations entre les membres d'une famille. Dans cet exemple, nous allons utiliser une ontologie qui d├йfinit les relations familiales, ainsi qu'un arbre g├йn├йalogique r├йel, et montrer comment nous pouvons ensuite effectuer une inf├йrence automatique pour trouver tous les membres de la famille.\n",
|
||||
"\n",
|
||||
"### Obtenir l'Arbre G├йn├йalogique\n",
|
||||
"\n",
|
||||
"├А titre d'exemple, nous allons utiliser l'arbre g├йn├йalogique de la [famille des Tsars Romanov](https://en.wikipedia.org/wiki/House_of_Romanov). Le format le plus courant pour d├йcrire les relations familiales est le [GEDCOM](https://en.wikipedia.org/wiki/GEDCOM). Nous allons utiliser l'arbre g├йn├йalogique de la famille Romanov au format GEDCOM :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"0 HEAD\n",
|
||||
"1 CHAR UTF8\n",
|
||||
"1 GEDC\n",
|
||||
"2 VERS 5.5\n",
|
||||
"0 @0@ INDI\n",
|
||||
"1 NAME Mihail Fedorovich /Romanov/\n",
|
||||
"1 SEX M\n",
|
||||
"1 BIRT\n",
|
||||
"2 DATE 1613\n",
|
||||
"1 DEAT \n",
|
||||
"2 DATE 1645\n",
|
||||
"1 FAMS @41@\n",
|
||||
"0 @1@ INDI\n",
|
||||
"1 NAME Evdokija Lukjanovna /Streshneva/\n",
|
||||
"1 SEX F\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"!head -15 data/tsars.ged"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Pour utiliser un fichier GEDCOM, nous pouvons utiliser la biblioth├иque `python-gedcom` :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Collecting python-gedcom\n",
|
||||
" Downloading python_gedcom-1.0.0-py2.py3-none-any.whl (35 kB)\n",
|
||||
"Installing collected packages: python-gedcom\n",
|
||||
"Successfully installed python-gedcom-1.0.0\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import sys\n",
|
||||
"!{sys.executable} -m pip install python-gedcom"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Cette biblioth├иque ├йlimine certains des probl├иmes techniques li├йs ├а l'analyse de fichiers, mais elle nous donne toujours un acc├иs assez bas niveau ├а tous les individus et familles dans l'arbre. Voici comment nous pouvons analyser le fichier et afficher la liste de tous les individus :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"from gedcom.parser import Parser\n",
|
||||
"from gedcom.element.individual import IndividualElement\n",
|
||||
"from gedcom.element.family import FamilyElement\n",
|
||||
"g = Parser()\n",
|
||||
"g.parse_file('data/tsars.ged')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {
|
||||
"scrolled": true,
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[('@0@', ('Mihail Fedorovich', 'Romanov')),\n",
|
||||
" ('@1@', ('Evdokija Lukjanovna', 'Streshneva')),\n",
|
||||
" ('@2@', ('Aleksej Mihajlovich', 'Romanov')),\n",
|
||||
" ('@3@', ('Marija Ilinichna', 'Miloslavskaja')),\n",
|
||||
" ('@4@', ('Natalja Kirillovna', 'Naryshkina')),\n",
|
||||
" ('@5@', ('Marfa Matveevna', 'Apraksina')),\n",
|
||||
" ('@6@', ('Fedor Alekseevich', 'Romanov')),\n",
|
||||
" ('@7@', ('Sofja Aleksevna', 'Romanova')),\n",
|
||||
" ('@8@', ('Ivan V Alekseevich', 'Romanov')),\n",
|
||||
" ('@9@', ('Praskovja Fedorovna', 'Saltykova')),\n",
|
||||
" ('@10@', ('Ekaterina Ivanovna', 'Romanova')),\n",
|
||||
" ('@11@', ('Anna Ivanovna', 'Romanova')),\n",
|
||||
" ('@12@', ('Fridrih Vilgelm', 'Kurlandskij')),\n",
|
||||
" ('@13@', ('Karl Leopold', 'Meklenburg-Shverinskij')),\n",
|
||||
" ('@14@', ('Anna Leopoldovna', 'Meklenburg-Shverinskaja')),\n",
|
||||
" ('@15@', ('Anton Ulrih', 'Braunshvejg-Volfenbjuttelskij')),\n",
|
||||
" ('@16@', ('Ivan VI Antonovich', 'Braunshvejg-Volfenbjuttelskij')),\n",
|
||||
" ('@17@', ('Petr I Alekseevich', 'Romanov')),\n",
|
||||
" ('@18@', ('Evdokija Fedorovna', 'Lopuhina')),\n",
|
||||
" ('@19@', ('Ekaterina I Alekseevna', 'Mihajlova')),\n",
|
||||
" ('@20@', ('Aleksej Petrovich', 'Romanov')),\n",
|
||||
" ('@21@', ('Sharlotta Kristina', 'Braunshvejg-Volfenbjuttelskaja')),\n",
|
||||
" ('@22@', ('Petr II Alekseevich', 'Romanov')),\n",
|
||||
" ('@23@', ('Anna Petrovna', 'Romanova')),\n",
|
||||
" ('@24@', ('Elizaveta Petrovna', 'Romanova')),\n",
|
||||
" ('@25@', ('Karl Fridrih', 'Golshtejn-Gottorpskij')),\n",
|
||||
" ('@26@', ('Petr III Fedorovich', 'Romanov')),\n",
|
||||
" ('@27@', ('Ekaterina II', 'Alekseevna')),\n",
|
||||
" ('@28@', ('Pavel I Petrovich', 'Romanov')),\n",
|
||||
" ('@29@', ('Natalja Alekseevna', 'Gessen-Darmshtadskaja')),\n",
|
||||
" ('@30@', ('Marija Fedorovna', 'Vjurtembergskaja')),\n",
|
||||
" ('@31@', ('Aleksandr I Pavlovich', 'Romanov')),\n",
|
||||
" ('@32@', ('Elizaveta Alekseevna', 'Baden-Durlahskaja')),\n",
|
||||
" ('@33@', ('Nikolaj I Pavlovich', 'Romanov')),\n",
|
||||
" ('@34@', ('Aleksandra Fedorovna', 'Prusskaja')),\n",
|
||||
" ('@35@', ('Aleksandr II Nikolaevich', 'Romanov')),\n",
|
||||
" ('@36@', ('Marija Aleksandrovna', 'Gessenskaja')),\n",
|
||||
" ('@37@', ('Aleksandr III Aleksandrovich', 'Romanov')),\n",
|
||||
" ('@38@', ('Marija Fedorovna', 'Datskaja')),\n",
|
||||
" ('@39@', ('Nikolaj II Aleksandrovich', 'Romanov')),\n",
|
||||
" ('@40@', ('Aleksandra Fedorovna', 'Gessenskaja'))]"
|
||||
]
|
||||
},
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"d = g.get_element_dictionary()\n",
|
||||
"[ (k,v.get_name()) for k,v in d.items() if isinstance(v,IndividualElement)]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Voici comment nous pouvons obtenir des informations sur les familles. Notez que cela nous donne une liste d'**identifiants**, et nous devons les convertir en noms si nous voulons plus de clart├й :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[('@41@', ['@0@', '@1@', '@2@']),\n",
|
||||
" ('@42@', ['@2@', '@3@', '@6@', '@7@', '@8@']),\n",
|
||||
" ('@43@', ['@8@', '@9@', '@10@', '@11@']),\n",
|
||||
" ('@44@', ['@13@', '@10@', '@14@']),\n",
|
||||
" ('@45@', ['@15@', '@14@', '@16@']),\n",
|
||||
" ('@46@', ['@2@', '@4@', '@17@']),\n",
|
||||
" ('@47@', ['@17@', '@18@', '@20@']),\n",
|
||||
" ('@48@', ['@20@', '@21@', '@22@']),\n",
|
||||
" ('@49@', ['@17@', '@19@', '@23@', '@24@']),\n",
|
||||
" ('@50@', ['@25@', '@23@', '@26@']),\n",
|
||||
" ('@51@', ['@26@', '@27@', '@28@']),\n",
|
||||
" ('@52@', ['@28@', '@30@', '@31@', '@33@']),\n",
|
||||
" ('@53@', ['@33@', '@34@', '@35@']),\n",
|
||||
" ('@54@', ['@35@', '@36@', '@37@']),\n",
|
||||
" ('@55@', ['@37@', '@38@', '@39@'])]"
|
||||
]
|
||||
},
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"d = g.get_element_dictionary()\n",
|
||||
"[ (k,[x.get_value() for x in v.get_child_elements()]) for k,v in d.items() if isinstance(v,FamilyElement)]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Obtenir l'ontologie familiale\n",
|
||||
"\n",
|
||||
"Ensuite, examinons [l'ontologie familiale](https://raw.githubusercontent.com/blokhin/genealogical-trees/master/data/header.ttl) d├йfinie comme un ensemble de triplets du Web s├йmantique. Cette ontologie d├йfinit des relations telles que `isUncleOf`, `isCousinOf`, et bien d'autres. Toutes ces relations sont d├йfinies en termes de pr├йdicats de base `isMotherOf`, `isFatherOf`, `isBrotherOf` et `isSisterOf`. Nous utiliserons un raisonnement automatique pour d├йduire toutes les autres relations ├а partir de l'ontologie.\n",
|
||||
"\n",
|
||||
"Voici un exemple de d├йfinition de la propri├йt├й `isAuntOf`, qui est d├йfinie comme une composition de `isSisterOf` et `isParentOf` (*Une tante est la s┼Уur d'un parent*).\n",
|
||||
"\n",
|
||||
"```\n",
|
||||
"fhkb:isAuntOf a owl:ObjectProperty ;\n",
|
||||
" rdfs:domain fhkb:Woman ;\n",
|
||||
" rdfs:range fhkb:Person ;\n",
|
||||
" owl:propertyChainAxiom ( fhkb:isSisterOf fhkb:isParentOf ) .\n",
|
||||
"```\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"@prefix fhkb: <http://www.example.com/genealogy.owl#> .\n",
|
||||
"@prefix owl: <http://www.w3.org/2002/07/owl#> .\n",
|
||||
"@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .\n",
|
||||
"@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\n",
|
||||
"@prefix xml: <http://www.w3.org/XML/1998/namespace> .\n",
|
||||
"@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .\n",
|
||||
"\n",
|
||||
"<http://www.example.com/genealogy.owl#> a owl:Ontology .\n",
|
||||
"\n",
|
||||
"fhkb:DomainEntity a owl:Class .\n",
|
||||
"\n",
|
||||
"fhkb:Man a owl:Class ;\n",
|
||||
" owl:equivalentClass [ a owl:Class ;\n",
|
||||
" owl:intersectionOf ( fhkb:Person [ a owl:Restriction ;\n",
|
||||
" owl:onProperty fhkb:hasSex ;\n",
|
||||
" owl:someValuesFrom fhkb:Male ] ) ] .\n",
|
||||
"\n",
|
||||
"fhkb:Woman a owl:Class ;\n",
|
||||
" owl:equivalentClass [ a owl:Class ;\n",
|
||||
" owl:intersectionOf ( fhkb:Person [ a owl:Restriction ;\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"!head -20 data/onto.ttl"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Construire une ontologie pour l'inf├йrence\n",
|
||||
"\n",
|
||||
"Pour simplifier, nous allons cr├йer un fichier d'ontologie unique qui inclura les r├иgles originales de l'ontologie familiale, ainsi que les faits concernant les individus issus de notre fichier GEDCOM. Nous parcourrons le fichier GEDCOM pour extraire des informations sur les familles et les individus, et les convertir en triplets.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"!cp data/onto.ttl .\n",
|
||||
"\n",
|
||||
"gedcom_dict = g.get_element_dictionary()\n",
|
||||
"individuals, marriages = {}, {}\n",
|
||||
"\n",
|
||||
"def term2id(el):\n",
|
||||
" return \"i\" + el.get_pointer().replace('@', '').lower()\n",
|
||||
"\n",
|
||||
"out = open(\"onto.ttl\",\"a\")\n",
|
||||
"\n",
|
||||
"for k, v in gedcom_dict.items():\n",
|
||||
" if isinstance(v,IndividualElement):\n",
|
||||
" children, siblings = set(), set()\n",
|
||||
" idx = term2id(v)\n",
|
||||
"\n",
|
||||
" title = v.get_name()[0] + \" \" + v.get_name()[1]\n",
|
||||
" title = title.replace('\"', '').replace('[', '').replace(']', '').replace('(', '').replace(')', '').strip()\n",
|
||||
"\n",
|
||||
" own_families = g.get_families(v, 'FAMS')\n",
|
||||
" for fam in own_families:\n",
|
||||
" children |= set(term2id(i) for i in g.get_family_members(fam, \"CHIL\"))\n",
|
||||
"\n",
|
||||
" parent_families = g.get_families(v, 'FAMC')\n",
|
||||
" if len(parent_families):\n",
|
||||
" for member in g.get_family_members(parent_families[0], \"CHIL\"): # NB adoptive families i.e len(parent_families)>1 are not considered (TODO?)\n",
|
||||
" if member.get_pointer() == v.get_pointer():\n",
|
||||
" continue\n",
|
||||
" siblings.add(term2id(member))\n",
|
||||
"\n",
|
||||
" if idx in individuals:\n",
|
||||
" children |= individuals[idx].get('children', set())\n",
|
||||
" siblings |= individuals[idx].get('siblings', set())\n",
|
||||
" individuals[idx] = {'sex': v.get_gender().lower(), 'children': children, 'siblings': siblings, 'title': title}\n",
|
||||
"\n",
|
||||
" elif isinstance(v,FamilyElement):\n",
|
||||
" wife, husb, children = None, None, set()\n",
|
||||
" children = set(term2id(i) for i in g.get_family_members(v, \"CHIL\"))\n",
|
||||
"\n",
|
||||
" try:\n",
|
||||
" wife = g.get_family_members(v, \"WIFE\")[0]\n",
|
||||
" wife = term2id(wife)\n",
|
||||
" if wife in individuals: individuals[wife]['children'] |= children\n",
|
||||
" else: individuals[wife] = {'children': children}\n",
|
||||
" except IndexError: pass\n",
|
||||
" try:\n",
|
||||
" husb = g.get_family_members(v, \"HUSB\")[0]\n",
|
||||
" husb = term2id(husb)\n",
|
||||
" if husb in individuals: individuals[husb]['children'] |= children\n",
|
||||
" else: individuals[husb] = {'children': children}\n",
|
||||
" except IndexError: pass\n",
|
||||
"\n",
|
||||
" if wife and husb: marriages[wife + husb] = (term2id(v), wife, husb)\n",
|
||||
"\n",
|
||||
"for idx, val in individuals.items():\n",
|
||||
" added_terms = ''\n",
|
||||
" if val['sex'] == 'f':\n",
|
||||
" parent_predicate, sibl_predicate = \"isMotherOf\", \"isSisterOf\"\n",
|
||||
" else:\n",
|
||||
" parent_predicate, sibl_predicate = \"isFatherOf\", \"isBrotherOf\"\n",
|
||||
" if len(val['children']):\n",
|
||||
" added_terms += \" ;\\n fhkb:\" + parent_predicate + \" \" + \", \".join([\"fhkb:\" + i for i in val['children']])\n",
|
||||
" if len(val['siblings']):\n",
|
||||
" added_terms += \" ;\\n fhkb:\" + sibl_predicate + \" \" + \", \".join([\"fhkb:\" + i for i in val['siblings']])\n",
|
||||
" out.write(\"fhkb:%s a owl:NamedIndividual, owl:Thing%s ;\\n rdfs:label \\\"%s\\\" .\\n\" % (idx, added_terms, val['title']))\n",
|
||||
"\n",
|
||||
"for k, v in marriages.items():\n",
|
||||
" out.write(\"fhkb:%s a owl:NamedIndividual, owl:Thing ;\\n fhkb:hasFemalePartner fhkb:%s ;\\n fhkb:hasMalePartner fhkb:%s .\\n\" % v)\n",
|
||||
"\n",
|
||||
"out.write(\"[] a owl:AllDifferent ;\\n owl:distinctMembers (\")\n",
|
||||
"for idx in individuals.keys():\n",
|
||||
" out.write(\" fhkb:\" + idx)\n",
|
||||
"for k, v in marriages.items():\n",
|
||||
" out.write(\" fhkb:\" + v[0])\n",
|
||||
"out.write(\" ) .\")\n",
|
||||
"out.close()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
" fhkb:hasFemalePartner fhkb:i34 ;\n",
|
||||
" fhkb:hasMalePartner fhkb:i33 .\n",
|
||||
"fhkb:i54 a owl:NamedIndividual, owl:Thing ;\n",
|
||||
" fhkb:hasFemalePartner fhkb:i36 ;\n",
|
||||
" fhkb:hasMalePartner fhkb:i35 .\n",
|
||||
"fhkb:i55 a owl:NamedIndividual, owl:Thing ;\n",
|
||||
" fhkb:hasFemalePartner fhkb:i38 ;\n",
|
||||
" fhkb:hasMalePartner fhkb:i37 .\n",
|
||||
"[] a owl:AllDifferent ;\n",
|
||||
" owl:distinctMembers ( fhkb:i0 fhkb:i1 fhkb:i2 fhkb:i3 fhkb:i4 fhkb:i5 fhkb:i6 fhkb:i7 fhkb:i8 fhkb:i9 fhkb:i10 fhkb:i11 fhkb:i12 fhkb:i13 fhkb:i14 fhkb:i15 fhkb:i16 fhkb:i17 fhkb:i18 fhkb:i19 fhkb:i20 fhkb:i21 fhkb:i22 fhkb:i23 fhkb:i24 fhkb:i25 fhkb:i26 fhkb:i27 fhkb:i28 fhkb:i29 fhkb:i30 fhkb:i31 fhkb:i32 fhkb:i33 fhkb:i34 fhkb:i35 fhkb:i36 fhkb:i37 fhkb:i38 fhkb:i39 fhkb:i40 fhkb:i41 fhkb:i42 fhkb:i43 fhkb:i44 fhkb:i45 fhkb:i46 fhkb:i47 fhkb:i48 fhkb:i49 fhkb:i50 fhkb:i51 fhkb:i52 fhkb:i53 fhkb:i54 fhkb:i55 ) ."
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"!tail onto.ttl"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Faire des inf├йrences\n",
|
||||
"\n",
|
||||
"Nous souhaitons maintenant utiliser cette ontologie pour effectuer des inf├йrences et des requ├кtes. Nous utiliserons [RDFLib](https://github.com/RDFLib), une biblioth├иque permettant de lire des graphes RDF dans diff├йrents formats, de les interroger, etc.\n",
|
||||
"\n",
|
||||
"Pour les inf├йrences logiques, nous utiliserons la biblioth├иque [OWL-RL](https://github.com/RDFLib/OWL-RL), qui nous permet de construire la **Fermeture** du graphe RDF, c'est-├а-dire d'ajouter tous les concepts et relations possibles qui peuvent ├кtre d├йduits.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Requirement already satisfied: rdflib in /home/rg/anaconda3/envs/ai4beg/lib/python3.11/site-packages (6.3.2)\n",
|
||||
"Requirement already satisfied: isodate<0.7.0,>=0.6.0 in /home/rg/anaconda3/envs/ai4beg/lib/python3.11/site-packages (from rdflib) (0.6.1)\n",
|
||||
"Requirement already satisfied: pyparsing<4,>=2.1.0 in /home/rg/anaconda3/envs/ai4beg/lib/python3.11/site-packages (from rdflib) (3.0.9)\n",
|
||||
"Requirement already satisfied: six in /home/rg/anaconda3/envs/ai4beg/lib/python3.11/site-packages (from isodate<0.7.0,>=0.6.0->rdflib) (1.16.0)\n",
|
||||
"Collecting git+https://github.com/RDFLib/OWL-RL.git\n",
|
||||
" Cloning https://github.com/RDFLib/OWL-RL.git to /tmp/pip-req-build-lbfzwi3m\n",
|
||||
" Running command git clone --filter=blob:none --quiet https://github.com/RDFLib/OWL-RL.git /tmp/pip-req-build-lbfzwi3m\n",
|
||||
" Resolved https://github.com/RDFLib/OWL-RL.git to commit a77e1791b88b54aace609bc6000aac14c7add4ff\n",
|
||||
" Preparing metadata (setup.py) ... \u001b[?25ldone\n",
|
||||
"\u001b[?25hRequirement already satisfied: rdflib>=6.0.2 in /home/rg/anaconda3/envs/ai4beg/lib/python3.11/site-packages (from owlrl==6.0.2) (6.3.2)\n",
|
||||
"Requirement already satisfied: isodate<0.7.0,>=0.6.0 in /home/rg/anaconda3/envs/ai4beg/lib/python3.11/site-packages (from rdflib>=6.0.2->owlrl==6.0.2) (0.6.1)\n",
|
||||
"Requirement already satisfied: pyparsing<4,>=2.1.0 in /home/rg/anaconda3/envs/ai4beg/lib/python3.11/site-packages (from rdflib>=6.0.2->owlrl==6.0.2) (3.0.9)\n",
|
||||
"Requirement already satisfied: six in /home/rg/anaconda3/envs/ai4beg/lib/python3.11/site-packages (from isodate<0.7.0,>=0.6.0->rdflib>=6.0.2->owlrl==6.0.2) (1.16.0)\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"!{sys.executable} -m pip install rdflib\n",
|
||||
"!{sys.executable} -m pip install git+https://github.com/RDFLib/OWL-RL.git"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Ouvrons le fichier d'ontologie et voyons combien de triplets il contient :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Triplets found:669\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import rdflib\n",
|
||||
"from owlrl import DeductiveClosure, OWLRL_Extension\n",
|
||||
"\n",
|
||||
"g = rdflib.Graph()\n",
|
||||
"g.parse(\"onto.ttl\", format=\"turtle\")\n",
|
||||
"\n",
|
||||
"print(\"Triplets found:%d\" % len(g))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Maintenant, construisons la fermeture et voyons comment le nombre de triplets augmente :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 12,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Triplets after inference:4246\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"DeductiveClosure(OWLRL_Extension).expand(g)\n",
|
||||
"print(\"Triplets after inference:%d\" % len(g))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Interroger les relations familiales\n",
|
||||
"\n",
|
||||
"Nous pouvons maintenant interroger le graphe pour voir les diff├йrentes relations entre les personnes. Nous pouvons utiliser le langage **SPARQL** avec la m├йthode `query`. Dans notre cas, voyons tous les **oncles** dans notre arbre g├йn├йalogique :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 13,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Fedor Alekseevich Romanov is uncle of Ekaterina Ivanovna Romanova\n",
|
||||
"Aleksandr I Pavlovich Romanov is uncle of Aleksandr II Nikolaevich Romanov\n",
|
||||
"Fedor Alekseevich Romanov is uncle of Anna Ivanovna Romanova\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"qres = g.query(\n",
|
||||
" \"\"\"SELECT DISTINCT ?aname ?bname\n",
|
||||
" WHERE {\n",
|
||||
" ?a fhkb:isUncleOf ?b .\n",
|
||||
" ?a rdfs:label ?aname .\n",
|
||||
" ?b rdfs:label ?bname .\n",
|
||||
" }\"\"\")\n",
|
||||
"\n",
|
||||
"for row in qres:\n",
|
||||
" print(\"%s is uncle of %s\" % row)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"N'h├йsitez pas ├а exp├йrimenter avec d'autres relations familiales. Par exemple, vous pouvez examiner la relation `isAncestorOf`, qui d├йfinit de mani├иre r├йcursive tous les anc├кtres d'une personne donn├йe.\n",
|
||||
"\n",
|
||||
"Enfin, passons au nettoyage !\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 14,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"!rm onto.ttl"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**Avertissement** : \nCe document a ├йt├й traduit ├а l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatis├йes peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit ├кtre consid├йr├й comme la source faisant autorit├й. Pour des informations critiques, il est recommand├й de recourir ├а une traduction professionnelle r├йalis├йe par un humain. Nous d├йclinons toute responsabilit├й en cas de malentendus ou d'interpr├йtations erron├йes r├йsultant de l'utilisation de cette traduction.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"interpreter": {
|
||||
"hash": "86193a1ab0ba47eac1c69c1756090baa3b420b3eea7d4aafab8b85f8b312f0c5"
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3.6",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.11.2"
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "6537d5597320e27b6052b4377b8ff8bb",
|
||||
"translation_date": "2025-08-31T14:53:22+00:00",
|
||||
"source_file": "lessons/2-Symbolic/FamilyOntology.ipynb",
|
||||
"language_code": "fr"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
|
|
@ -0,0 +1,548 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"collapsed": true
|
||||
},
|
||||
"source": [
|
||||
"## Microsoft Concept Graph\n",
|
||||
"\n",
|
||||
"[Microsoft Concept Graph](https://concept.research.microsoft.com/) est une vaste taxonomie de termes extraits d'internet, avec des relations de type `is-a` entre les concepts.\n",
|
||||
"\n",
|
||||
"Le Context Graph est disponible sous deux formes :\n",
|
||||
" * Un fichier texte volumineux ├а t├йl├йcharger\n",
|
||||
" * Une API REST\n",
|
||||
"\n",
|
||||
"Statistiques :\n",
|
||||
" * 5 401 933 concepts uniques,\n",
|
||||
" * 12 551 613 instances uniques,\n",
|
||||
" * 87 603 947 relations de type `is-a`\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Utilisation du service web\n",
|
||||
"\n",
|
||||
"Le service web propose diff├йrents appels pour estimer la probabilit├й qu'un concept appartienne ├а diff├йrents groupes. Plus d'informations sont disponibles [ici](https://concept.research.microsoft.com/Home/Api). \n",
|
||||
"Voici l'URL d'exemple pour effectuer un appel : `https://concept.research.microsoft.com/api/Concept/ScoreByProb?instance=microsoft&topK=10`\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{'company': 0.6105356614382954,\n",
|
||||
" 'vendor': 0.08858636677518003,\n",
|
||||
" 'client': 0.048239124001183784,\n",
|
||||
" 'firm': 0.045476965571668145,\n",
|
||||
" 'large company': 0.043109401203511886,\n",
|
||||
" 'organization': 0.043010752688172046,\n",
|
||||
" 'corporation': 0.035908059583703265,\n",
|
||||
" 'brand': 0.03383644076156654,\n",
|
||||
" 'software company': 0.027522935779816515,\n",
|
||||
" 'technology company': 0.023774292196902438}"
|
||||
]
|
||||
},
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import urllib\n",
|
||||
"import json\n",
|
||||
"import ssl\n",
|
||||
"\n",
|
||||
"def http(x):\n",
|
||||
" ssl._create_default_https_context = ssl._create_unverified_context\n",
|
||||
" response = urllib.request.urlopen(x)\n",
|
||||
" data = response.read()\n",
|
||||
" return data.decode('utf-8')\n",
|
||||
"\n",
|
||||
"def query(x):\n",
|
||||
" return json.loads(http(\"https://concept.research.microsoft.com/api/Concept/ScoreByProb?instance={}&topK=10\".format(urllib.parse.quote(x))))\n",
|
||||
"\n",
|
||||
"query('microsoft')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Essayons de cat├йgoriser les titres des actualit├йs en utilisant des concepts parentaux. Pour obtenir les titres des actualit├йs, nous utiliserons le service [NewsApi.org](http://newsapi.org). Vous devez obtenir votre propre cl├й API pour utiliser le service - rendez-vous sur le site web et inscrivez-vous au plan d├йveloppeur gratuit.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 20,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"newsapi_key = '<your API key here>'\n",
|
||||
"def get_news(country='us'):\n",
|
||||
" res = json.loads(http(\"https://newsapi.org/v2/top-headlines?country={0}&apiKey={1}\".format(country,newsapi_key)))\n",
|
||||
" return res['articles']\n",
|
||||
"\n",
|
||||
"all_titles = [x['title'] for x in get_news('us')+get_news('gb')]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 21,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"['Covid-19 Live Updates: Vaccines and Boosters News - The New York Times',\n",
|
||||
" 'Ukrainians Flee Mariupol as Russian Forces Push to Take Port City - The Wall Street Journal',\n",
|
||||
" 'Bond Yields Jump, Stock Futures Rise After Powell Says Fed Is Ready to Be More Aggressive - The Wall Street Journal',\n",
|
||||
" 'Putin critic Alexei Navalny found guilty by Russian court - New York Post ',\n",
|
||||
" \"Supreme Court nominee Ketanji Brown Jackson will face questions at confirmation hearing's second day - CNN\",\n",
|
||||
" '2 teachers killed at Swedish high school, student arrested - ABC News',\n",
|
||||
" 'Clues to Covid-19тАЩs Next Moves Come From Sewers - The Wall Street Journal',\n",
|
||||
" 'Republicans to roll dice by grilling Jackson over child-pornography sentencing decisions | TheHill - The Hill',\n",
|
||||
" 'тАШClear signтАЩ Putin considering using chemical weapons in Ukraine, claims President Biden - The Independent',\n",
|
||||
" 'NASA confirms there are 5,000 planets outside our solar system - Daily Mail',\n",
|
||||
" \"US stocks whipsawed overnight after Fed Chair Powell's remarks - Fox Business\",\n",
|
||||
" \"'We've learned absolutely nothing': Tests could again be in short supply if Covid surges - POLITICO\",\n",
|
||||
" \"Duchess of Cambridge swaps khaki jungle gear for Vampire's Wife dress on Belize trip - Daily Mail\",\n",
|
||||
" 'China searches for victims, flight recorders after first plane crash in 12 years - Reuters',\n",
|
||||
" 'Second superyacht linked to Russian oligarch Abramovich docks in Turkey - Reuters',\n",
|
||||
" 'Live updates: Russia stops talks with Japan over sanctions - The Associated Press - en Espa├▒ol',\n",
|
||||
" 'Powers Remain and Threats Lurk as WomenтАЩs Sweet 16 Is Set - The New York Times',\n",
|
||||
" 'Webb Space Telescope Begins Multi-Instrument Alignment - SciTechDaily',\n",
|
||||
" \"UConn vs UCF - NCAA women's tournament second-round highlights - March Madness\",\n",
|
||||
" 'Bucking Republican Trend, Indiana Governor Vetoes Transgender Sports Bill - The New York Times',\n",
|
||||
" \"Maggie Fox dead: Coronation Street and Shameless actress dies after 'sudden accident' - Mirror Online - The Mirror\",\n",
|
||||
" 'China plane crash тАУ live: Search for survivors continues as witness describes moment flight fell from sky - The Independent',\n",
|
||||
" 'Daniel Morgan murder: damning report condemns Met police - The Guardian',\n",
|
||||
" 'What to expect from Rishi SunakтАЩs Spring Statement - BBC.com',\n",
|
||||
" 'UK and Republic of Ireland in line to host Euro 2028 after no one else bids - The Guardian',\n",
|
||||
" \"Friends beg Vladimir Putin's 'lover' to persuade him to end Ukraine invasion - The Mirror\",\n",
|
||||
" 'Brass EyeтАЩs outtakes show the brutal TV comedy was the tip of an iceberg - The Guardian',\n",
|
||||
" \"Vladimir Putin threatens civilians to break Mariupol's spirit - The Times\",\n",
|
||||
" 'Shell U-turn on Cambo oilfield would threaten green targets, say campaigners - The Guardian',\n",
|
||||
" 'St Helens dog attack: Girl aged 17 months killed at home - BBC',\n",
|
||||
" \"PlayStation to buy 'Assassin's Creed' veteran Jade Raymond's Haven Studios - NME\",\n",
|
||||
" 'тАШClear signтАЩ Putin considering using chemical weapons in Ukraine, claims President Biden - The Independent',\n",
|
||||
" 'NASA confirms there are 5,000 planets outside our solar system - Daily Mail',\n",
|
||||
" 'Nintendo Switch finally has folders тАв Eurogamer.net - Eurogamer.net',\n",
|
||||
" 'FA to тАЬfind a solutionтАЭ as Liverpool fan group blasts тАЬshambolicтАЭ Wembley travel - This Is Anfield',\n",
|
||||
" 'Manchester United transfer news LIVE Erik ten Hag latest and Man Utd manager updates - Manchester Evening News',\n",
|
||||
" 'Inflation raises cost of UK government borrowing in February; crude oil up again тАУ business live - The Guardian',\n",
|
||||
" 'Alexei Navalny: Kremlin critic found guilty of large-scale fraud and contempt of court by Russian court - Sky News',\n",
|
||||
" \"UK prepares to nationalize Russia natural gas giant Gazprom's retail unit - Business Insider\",\n",
|
||||
" 'Zaghari-Ratcliffe: Hunt calls for inquiry into delay over Iran debt payment - The Guardian']"
|
||||
]
|
||||
},
|
||||
"execution_count": 21,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"all_titles"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Tout d'abord, nous voulons pouvoir extraire des noms des titres d'actualit├йs. Nous utiliserons la biblioth├иque `TextBlob` pour cela, ce qui simplifie beaucoup de t├вches typiques de NLP comme celle-ci.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 15,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Requirement already satisfied: textblob in c:\\winapp\\miniconda3\\lib\\site-packages (0.17.1)\n",
|
||||
"Requirement already satisfied: nltk>=3.1 in c:\\winapp\\miniconda3\\lib\\site-packages (from textblob) (3.5)\n",
|
||||
"Requirement already satisfied: joblib in c:\\winapp\\miniconda3\\lib\\site-packages (from nltk>=3.1->textblob) (1.0.1)\n",
|
||||
"Requirement already satisfied: regex in c:\\winapp\\miniconda3\\lib\\site-packages (from nltk>=3.1->textblob) (2021.11.10)\n",
|
||||
"Requirement already satisfied: tqdm in c:\\winapp\\miniconda3\\lib\\site-packages (from nltk>=3.1->textblob) (4.61.2)\n",
|
||||
"Requirement already satisfied: click in c:\\winapp\\miniconda3\\lib\\site-packages (from nltk>=3.1->textblob) (8.0.3)\n",
|
||||
"Requirement already satisfied: colorama in c:\\winapp\\miniconda3\\lib\\site-packages (from click->nltk>=3.1->textblob) (0.4.4)\n",
|
||||
"Finished.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"[nltk_data] Downloading package brown to\n",
|
||||
"[nltk_data] C:\\Users\\dmitryso\\AppData\\Roaming\\nltk_data...\n",
|
||||
"[nltk_data] Package brown is already up-to-date!\n",
|
||||
"[nltk_data] Downloading package punkt to\n",
|
||||
"[nltk_data] C:\\Users\\dmitryso\\AppData\\Roaming\\nltk_data...\n",
|
||||
"[nltk_data] Package punkt is already up-to-date!\n",
|
||||
"[nltk_data] Downloading package wordnet to\n",
|
||||
"[nltk_data] C:\\Users\\dmitryso\\AppData\\Roaming\\nltk_data...\n",
|
||||
"[nltk_data] Package wordnet is already up-to-date!\n",
|
||||
"[nltk_data] Downloading package averaged_perceptron_tagger to\n",
|
||||
"[nltk_data] C:\\Users\\dmitryso\\AppData\\Roaming\\nltk_data...\n",
|
||||
"[nltk_data] Package averaged_perceptron_tagger is already up-to-\n",
|
||||
"[nltk_data] date!\n",
|
||||
"[nltk_data] Downloading package conll2000 to\n",
|
||||
"[nltk_data] C:\\Users\\dmitryso\\AppData\\Roaming\\nltk_data...\n",
|
||||
"[nltk_data] Package conll2000 is already up-to-date!\n",
|
||||
"[nltk_data] Downloading package movie_reviews to\n",
|
||||
"[nltk_data] C:\\Users\\dmitryso\\AppData\\Roaming\\nltk_data...\n",
|
||||
"[nltk_data] Package movie_reviews is already up-to-date!\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import sys\n",
|
||||
"!{sys.executable} -m pip install textblob\n",
|
||||
"!{sys.executable} -m textblob.download_corpora\n",
|
||||
"from textblob import TextBlob"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 22,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{'covid-19 live updates': 1,\n",
|
||||
" 'vaccines': 1,\n",
|
||||
" 'boosters': 1,\n",
|
||||
" 'york': 4,\n",
|
||||
" 'ukrainians flee mariupol': 1,\n",
|
||||
" 'forces push': 1,\n",
|
||||
" 'port city': 1,\n",
|
||||
" 'wall street journal': 3,\n",
|
||||
" 'bond yields': 1,\n",
|
||||
" 'futures rise': 1,\n",
|
||||
" 'powell says fed': 1,\n",
|
||||
" 'ready': 1,\n",
|
||||
" 'be': 1,\n",
|
||||
" 'aggressive': 1,\n",
|
||||
" 'putin': 3,\n",
|
||||
" 'alexei navalny': 2,\n",
|
||||
" 'russian': 2,\n",
|
||||
" 'supreme court nominee': 1,\n",
|
||||
" 'ketanji brown jackson': 1,\n",
|
||||
" \"confirmation hearing 's\": 1,\n",
|
||||
" 'cnn': 1,\n",
|
||||
" 'swedish': 1,\n",
|
||||
" 'high school': 1,\n",
|
||||
" 'abc': 1,\n",
|
||||
" 'clues': 1,\n",
|
||||
" 'covid-19': 1,\n",
|
||||
" 'тАЩ s': 2,\n",
|
||||
" 'moves': 1,\n",
|
||||
" 'sewers': 1,\n",
|
||||
" 'roll dice': 1,\n",
|
||||
" 'jackson': 1,\n",
|
||||
" 'decisions |': 1,\n",
|
||||
" 'thehill': 1,\n",
|
||||
" 'clear': 2,\n",
|
||||
" 'chemical weapons': 2,\n",
|
||||
" 'ukraine': 3,\n",
|
||||
" 'claims president': 2,\n",
|
||||
" 'biden': 2,\n",
|
||||
" 'nasa': 2,\n",
|
||||
" 'solar system': 2,\n",
|
||||
" 'daily mail': 3,\n",
|
||||
" 'us stocks': 1,\n",
|
||||
" 'fed chair powell': 1,\n",
|
||||
" \"'s remarks\": 1,\n",
|
||||
" 'fox': 1,\n",
|
||||
" \"'we 've\": 1,\n",
|
||||
" 'tests': 1,\n",
|
||||
" 'covid': 1,\n",
|
||||
" 'politico': 1,\n",
|
||||
" 'duchess': 1,\n",
|
||||
" 'cambridge': 1,\n",
|
||||
" 'swaps khaki jungle gear': 1,\n",
|
||||
" 'vampire': 1,\n",
|
||||
" 'wife': 1,\n",
|
||||
" 'belize': 1,\n",
|
||||
" 'china': 2,\n",
|
||||
" 'flight recorders': 1,\n",
|
||||
" 'plane crash': 1,\n",
|
||||
" 'reuters': 2,\n",
|
||||
" 'russian oligarch': 1,\n",
|
||||
" 'abramovich': 1,\n",
|
||||
" 'live': 1,\n",
|
||||
" 'russia': 2,\n",
|
||||
" 'stops talks': 1,\n",
|
||||
" 'japan': 1,\n",
|
||||
" 'espa├▒ol': 1,\n",
|
||||
" 'powers remain': 1,\n",
|
||||
" 'threats lurk': 1,\n",
|
||||
" 'set': 1,\n",
|
||||
" 'webb': 1,\n",
|
||||
" 'telescope begins multi-instrument alignment': 1,\n",
|
||||
" 'scitechdaily': 1,\n",
|
||||
" 'uconn': 1,\n",
|
||||
" 'ucf': 1,\n",
|
||||
" 'ncaa': 1,\n",
|
||||
" \"women 's tournament second-round highlights\": 1,\n",
|
||||
" 'march madness': 1,\n",
|
||||
" 'bucking republican trend': 1,\n",
|
||||
" 'indiana': 1,\n",
|
||||
" 'vetoes transgender': 1,\n",
|
||||
" 'bill': 1,\n",
|
||||
" 'maggie fox': 1,\n",
|
||||
" 'coronation': 1,\n",
|
||||
" 'shameless': 1,\n",
|
||||
" \"'sudden accident\": 1,\n",
|
||||
" 'mirror online': 1,\n",
|
||||
" 'mirror': 2,\n",
|
||||
" 'plane crash тАУ': 1,\n",
|
||||
" 'search': 1,\n",
|
||||
" 'moment flight': 1,\n",
|
||||
" 'daniel morgan': 1,\n",
|
||||
" 'report condemns': 1,\n",
|
||||
" 'met': 1,\n",
|
||||
" 'guardian': 6,\n",
|
||||
" 'rishi sunak': 1,\n",
|
||||
" 'тАЩ s spring': 1,\n",
|
||||
" 'statement': 1,\n",
|
||||
" 'bbc.com': 1,\n",
|
||||
" 'uk': 3,\n",
|
||||
" 'ireland': 1,\n",
|
||||
" 'euro': 1,\n",
|
||||
" 'vladimir putin': 2,\n",
|
||||
" \"'s 'lover\": 1,\n",
|
||||
" 'brass eye': 1,\n",
|
||||
" 'тАЩ s outtakes': 1,\n",
|
||||
" 'brutal tv comedy': 1,\n",
|
||||
" 'threatens civilians': 1,\n",
|
||||
" 'mariupol': 1,\n",
|
||||
" \"'s spirit\": 1,\n",
|
||||
" 'shell u-turn': 1,\n",
|
||||
" 'cambo': 1,\n",
|
||||
" 'green targets': 1,\n",
|
||||
" 'st helens': 1,\n",
|
||||
" 'dog attack': 1,\n",
|
||||
" 'girl': 1,\n",
|
||||
" 'bbc': 1,\n",
|
||||
" 'playstation': 1,\n",
|
||||
" \"'assassin 's\": 1,\n",
|
||||
" 'creed': 1,\n",
|
||||
" 'jade raymond': 1,\n",
|
||||
" 'haven studios': 1,\n",
|
||||
" 'nme': 1,\n",
|
||||
" 'nintendo switch': 1,\n",
|
||||
" 'folders тАв': 1,\n",
|
||||
" 'eurogamer.net': 2,\n",
|
||||
" 'fa': 1,\n",
|
||||
" 'solution тАЭ': 1,\n",
|
||||
" 'liverpool': 1,\n",
|
||||
" 'fan group blasts тАЬ shambolic тАЭ': 1,\n",
|
||||
" 'wembley': 1,\n",
|
||||
" 'anfield': 1,\n",
|
||||
" 'manchester': 1,\n",
|
||||
" 'live erik': 1,\n",
|
||||
" 'hag': 1,\n",
|
||||
" 'utd': 1,\n",
|
||||
" 'manager updates': 1,\n",
|
||||
" 'manchester evening': 1,\n",
|
||||
" 'inflation': 1,\n",
|
||||
" 'government borrowing': 1,\n",
|
||||
" 'february': 1,\n",
|
||||
" 'crude oil': 1,\n",
|
||||
" 'тАУ business': 1,\n",
|
||||
" 'kremlin': 1,\n",
|
||||
" 'large-scale fraud': 1,\n",
|
||||
" 'sky': 1,\n",
|
||||
" 'natural gas': 1,\n",
|
||||
" 'gazprom': 1,\n",
|
||||
" 'retail unit': 1,\n",
|
||||
" 'insider': 1,\n",
|
||||
" 'zaghari-ratcliffe': 1,\n",
|
||||
" 'hunt': 1,\n",
|
||||
" 'iran': 1,\n",
|
||||
" 'debt payment': 1}"
|
||||
]
|
||||
},
|
||||
"execution_count": 22,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"w = {}\n",
|
||||
"for x in all_titles:\n",
|
||||
" for n in TextBlob(x).noun_phrases:\n",
|
||||
" if n in w:\n",
|
||||
" w[n].append(x)\n",
|
||||
" else:\n",
|
||||
" w[n]=[x]\n",
|
||||
"{ x:len(w[x]) for x in w.keys()}"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Nous pouvons voir que les noms ne nous donnent pas de grands groupes th├йmatiques. Rempla├зons les noms par des termes plus g├йn├йraux obtenus ├а partir du graphe de concepts. Cela prendra du temps, car nous effectuons un appel REST pour chaque syntagme nominal.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 23,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"w = {}\n",
|
||||
"for x in all_titles:\n",
|
||||
" for noun in TextBlob(x).noun_phrases:\n",
|
||||
" terms = query(noun.replace(' ','%20'))\n",
|
||||
" for term in [u for u in terms.keys() if terms[u]>0.1]:\n",
|
||||
" if term in w:\n",
|
||||
" w[term].append(x)\n",
|
||||
" else:\n",
|
||||
" w[term]=[x]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 24,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{'city': 9,\n",
|
||||
" 'brand': 4,\n",
|
||||
" 'place': 9,\n",
|
||||
" 'town': 4,\n",
|
||||
" 'factor': 4,\n",
|
||||
" 'film': 4,\n",
|
||||
" 'nation': 11,\n",
|
||||
" 'state': 5,\n",
|
||||
" 'person': 4,\n",
|
||||
" 'organization': 5,\n",
|
||||
" 'publication': 10,\n",
|
||||
" 'market': 5,\n",
|
||||
" 'economy': 4,\n",
|
||||
" 'company': 6,\n",
|
||||
" 'newspaper': 6,\n",
|
||||
" 'relationship': 6}"
|
||||
]
|
||||
},
|
||||
"execution_count": 24,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"{ x:len(w[x]) for x in w.keys() if len(w[x])>3}"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 27,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"\n",
|
||||
"ECONOMY:\n",
|
||||
"China searches for victims, flight recorders after first plane crash in 12 years - Reuters\n",
|
||||
"Live updates: Russia stops talks with Japan over sanctions - The Associated Press - en Espa├▒ol\n",
|
||||
"China plane crash тАУ live: Search for survivors continues as witness describes moment flight fell from sky - The Independent\n",
|
||||
"UK prepares to nationalize Russia natural gas giant Gazprom's retail unit - Business Insider\n",
|
||||
"\n",
|
||||
"NATION:\n",
|
||||
"тАШClear signтАЩ Putin considering using chemical weapons in Ukraine, claims President Biden - The Independent\n",
|
||||
"Duchess of Cambridge swaps khaki jungle gear for Vampire's Wife dress on Belize trip - Daily Mail\n",
|
||||
"China searches for victims, flight recorders after first plane crash in 12 years - Reuters\n",
|
||||
"Live updates: Russia stops talks with Japan over sanctions - The Associated Press - en Espa├▒ol\n",
|
||||
"Live updates: Russia stops talks with Japan over sanctions - The Associated Press - en Espa├▒ol\n",
|
||||
"China plane crash тАУ live: Search for survivors continues as witness describes moment flight fell from sky - The Independent\n",
|
||||
"UK and Republic of Ireland in line to host Euro 2028 after no one else bids - The Guardian\n",
|
||||
"Friends beg Vladimir Putin's 'lover' to persuade him to end Ukraine invasion - The Mirror\n",
|
||||
"тАШClear signтАЩ Putin considering using chemical weapons in Ukraine, claims President Biden - The Independent\n",
|
||||
"UK prepares to nationalize Russia natural gas giant Gazprom's retail unit - Business Insider\n",
|
||||
"Zaghari-Ratcliffe: Hunt calls for inquiry into delay over Iran debt payment - The Guardian\n",
|
||||
"\n",
|
||||
"PERSON:\n",
|
||||
"тАШClear signтАЩ Putin considering using chemical weapons in Ukraine, claims President Biden - The Independent\n",
|
||||
"Duchess of Cambridge swaps khaki jungle gear for Vampire's Wife dress on Belize trip - Daily Mail\n",
|
||||
"Second superyacht linked to Russian oligarch Abramovich docks in Turkey - Reuters\n",
|
||||
"тАШClear signтАЩ Putin considering using chemical weapons in Ukraine, claims President Biden - The Independent\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"print('\\nECONOMY:\\n'+'\\n'.join(w['economy']))\n",
|
||||
"print('\\nNATION:\\n'+'\\n'.join(w['nation']))\n",
|
||||
"print('\\nPERSON:\\n'+'\\n'.join(w['person']))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**Avertissement** : \nCe document a ├йt├й traduit ├а l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatis├йes peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit ├кtre consid├йr├й comme la source faisant autorit├й. Pour des informations critiques, il est recommand├й de recourir ├а une traduction professionnelle r├йalis├йe par un humain. Nous d├йclinons toute responsabilit├й en cas de malentendus ou d'interpr├йtations erron├йes r├йsultant de l'utilisation de cette traduction.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3.7.4 64-bit (conda)",
|
||||
"metadata": {
|
||||
"interpreter": {
|
||||
"hash": "86193a1ab0ba47eac1c69c1756090baa3b420b3eea7d4aafab8b85f8b312f0c5"
|
||||
}
|
||||
},
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.9.5"
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "4087f998407d06ceb2947016ba4605d0",
|
||||
"translation_date": "2025-08-31T14:54:02+00:00",
|
||||
"source_file": "lessons/2-Symbolic/MSConceptGraph.ipynb",
|
||||
"language_code": "fr"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1,15 +1,15 @@
|
|||
<!--
|
||||
CO_OP_TRANSLATOR_METADATA:
|
||||
{
|
||||
"original_hash": "7336583e4630220c835335da640016db",
|
||||
"translation_date": "2025-08-24T20:57:00+00:00",
|
||||
"original_hash": "ba5d1eb353d20d3e7181066b3c424b99",
|
||||
"translation_date": "2025-08-31T14:20:13+00:00",
|
||||
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/lab/README.md",
|
||||
"language_code": "fr"
|
||||
}
|
||||
-->
|
||||
# Classification multi-classes avec Perceptron
|
||||
|
||||
Travail pratique issu du [Curriculum AI pour D├йbutants](https://github.com/microsoft/ai-for-beginners).
|
||||
Travail pratique tir├й du [Curriculum AI pour les d├йbutants](https://github.com/microsoft/ai-for-beginners).
|
||||
|
||||
## T├вche
|
||||
|
||||
|
|
@ -21,11 +21,13 @@ En utilisant le code que nous avons d├йvelopp├й dans cette le├зon pour la classi
|
|||
1. Entra├оnez 10 perceptrons diff├йrents pour la classification binaire (un pour chaque chiffre).
|
||||
1. D├йfinissez une fonction qui classera un chiffre donn├й en entr├йe.
|
||||
|
||||
> **Conseil** : Si nous combinons les poids des 10 perceptrons dans une seule matrice, nous devrions pouvoir appliquer les 10 perceptrons aux chiffres en entr├йe par une seule multiplication matricielle. Le chiffre le plus probable peut ensuite ├кtre d├йtermin├й simplement en appliquant l'op├йration `argmax` sur le r├йsultat.
|
||||
> **Conseil** : Si nous combinons les poids des 10 perceptrons dans une seule matrice, nous devrions ├кtre capables d'appliquer les 10 perceptrons aux chiffres en entr├йe par une seule multiplication matricielle. Le chiffre le plus probable peut ensuite ├кtre trouv├й simplement en appliquant l'op├йration `argmax` sur la sortie.
|
||||
|
||||
## Notebook de d├йpart
|
||||
|
||||
Commencez le travail pratique en ouvrant [PerceptronMultiClass.ipynb](../../../../../../lessons/3-NeuralNetworks/03-Perceptron/lab/PerceptronMultiClass.ipynb)
|
||||
Commencez le travail pratique en ouvrant [PerceptronMultiClass.ipynb](PerceptronMultiClass.ipynb)
|
||||
|
||||
---
|
||||
|
||||
**Avertissement** :
|
||||
Ce document a ├йt├й traduit ├а l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatis├йes peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit ├кtre consid├йr├й comme la source faisant autorit├й. Pour des informations critiques, il est recommand├й de recourir ├а une traduction humaine professionnelle. Nous d├йclinons toute responsabilit├й en cas de malentendus ou d'interpr├йtations erron├йes r├йsultant de l'utilisation de cette traduction.
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,183 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Classification des chiffres MNIST avec notre propre framework\n",
|
||||
"\n",
|
||||
"Travail pratique issu du [programme AI for Beginners](https://github.com/microsoft/ai-for-beginners).\n",
|
||||
"\n",
|
||||
"### Lecture du jeu de donn├йes\n",
|
||||
"\n",
|
||||
"Ce code t├йl├йcharge le jeu de donn├йes depuis le d├йp├┤t sur Internet. Vous pouvez ├йgalement copier manuellement le jeu de donn├йes depuis le r├йpertoire `/data` du d├йp├┤t AI Curriculum.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {
|
||||
"tags": []
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
" % Total % Received % Xferd Average Speed Time Time Time Current\n",
|
||||
" Dload Upload Total Spent Left Speed\n",
|
||||
"\n",
|
||||
" 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\n",
|
||||
"100 9.9M 100 9.9M 0 0 9.9M 0 0:00:01 --:--:-- 0:00:01 15.8M\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"!rm *.pkl\n",
|
||||
"!wget https://raw.githubusercontent.com/microsoft/AI-For-Beginners/main/data/mnist.pkl.gz\n",
|
||||
"!gzip -d mnist.pkl.gz"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import pickle\n",
|
||||
"with open('mnist.pkl','rb') as f:\n",
|
||||
" MNIST = pickle.load(f)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"labels = MNIST['Train']['Labels']\n",
|
||||
"data = MNIST['Train']['Features']"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Voyons quelle est la forme des donn├йes que nous avons :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(42000, 784)"
|
||||
]
|
||||
},
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"data.shape"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### S├йparation des donn├йes\n",
|
||||
"\n",
|
||||
"Nous utiliserons Scikit Learn pour diviser les donn├йes entre le jeu d'entra├оnement et le jeu de test :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Train samples: 33600, test samples: 8400\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"from sklearn.model_selection import train_test_split\n",
|
||||
"\n",
|
||||
"features_train, features_test, labels_train, labels_test = train_test_split(data,labels,test_size=0.2)\n",
|
||||
"\n",
|
||||
"print(f\"Train samples: {len(features_train)}, test samples: {len(features_test)}\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Instructions\n",
|
||||
"\n",
|
||||
"1. Prenez le code du framework de la le├зon et collez-le dans ce notebook, ou (encore mieux) dans un module Python s├йpar├й.\n",
|
||||
"1. D├йfinissez et entra├оnez un perceptron ├а une seule couche, en observant la pr├йcision de l'entra├оnement et de la validation pendant l'entra├оnement.\n",
|
||||
"1. Essayez de comprendre si un surapprentissage a eu lieu, et ajustez les param├иtres de la couche pour am├йliorer la pr├йcision.\n",
|
||||
"1. R├йp├йtez les ├йtapes pr├йc├йdentes pour des perceptrons ├а 2 et 3 couches. Essayez d'exp├йrimenter avec diff├йrentes fonctions d'activation entre les couches.\n",
|
||||
"1. Essayez de r├йpondre aux questions suivantes :\n",
|
||||
" - La fonction d'activation entre les couches affecte-t-elle les performances du r├йseau ?\n",
|
||||
" - Avons-nous besoin d'un r├йseau ├а 2 ou 3 couches pour cette t├вche ?\n",
|
||||
" - Avez-vous rencontr├й des probl├иmes lors de l'entra├оnement du r├йseau ? En particulier lorsque le nombre de couches augmentait.\n",
|
||||
" - Comment se comportent les poids du r├йseau pendant l'entra├оnement ? Vous pouvez tracer la valeur absolue maximale des poids en fonction des ├йpoques pour comprendre la relation.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**Avertissement** : \nCe document a ├йt├й traduit ├а l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatis├йes peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit ├кtre consid├йr├й comme la source faisant autorit├й. Pour des informations critiques, il est recommand├й de recourir ├а une traduction professionnelle effectu├йe par un humain. Nous d├йclinons toute responsabilit├й en cas de malentendus ou d'interpr├йtations erron├йes r├йsultant de l'utilisation de cette traduction.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3.7.4 64-bit (conda)",
|
||||
"metadata": {
|
||||
"interpreter": {
|
||||
"hash": "86193a1ab0ba47eac1c69c1756090baa3b420b3eea7d4aafab8b85f8b312f0c5"
|
||||
}
|
||||
},
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.9.5"
|
||||
},
|
||||
"orig_nbformat": 2,
|
||||
"coopTranslator": {
|
||||
"original_hash": "6fa055f484eb5d6bdf41166a356d3abf",
|
||||
"translation_date": "2025-08-31T14:58:32+00:00",
|
||||
"source_file": "lessons/3-NeuralNetworks/04-OwnFramework/lab/MyFW_MNIST.ipynb",
|
||||
"language_code": "fr"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,102 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"**Votre objectif** sera d'utiliser le flux optique pour d├йterminer quelles parties de la vid├йo contiennent des mouvements vers le haut, le bas, la gauche ou la droite.\n",
|
||||
"\n",
|
||||
"Commencez par obtenir les images de la vid├йo comme expliqu├й dans le cours :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Code here"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Maintenant, calculez les cadres de flux optique dense comme d├йcrit dans le cours, et convertissez le flux optique dense en coordonn├йes polaires :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Code here"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Construire un histogramme des directions pour chaque image du flux optique. Un histogramme montre combien de vecteurs se trouvent dans une certaine plage, et il doit distinguer les diff├йrentes directions de mouvement dans l'image.\n",
|
||||
"\n",
|
||||
"> Vous pouvez ├йgalement vouloir annuler tous les vecteurs dont la magnitude est inf├йrieure ├а un certain seuil. Cela permettra d'├йliminer les petits mouvements parasites dans la vid├йo, comme ceux des yeux et de la t├кte.\n",
|
||||
"\n",
|
||||
"Tracer les histogrammes pour certaines des images.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Code here"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"En regardant les histogrammes, il devrait ├кtre assez simple de d├йterminer la direction du mouvement. Vous devez s├йlectionner les barres qui correspondent aux directions haut/bas/gauche/droite, et qui sont au-dessus d'un certain seuil.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Code here"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"F├йlicitations ! Si vous avez suivi toutes les ├йtapes ci-dessus, vous avez termin├й le laboratoire !\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**Avertissement** : \nCe document a ├йt├й traduit ├а l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatis├йes peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit ├кtre consid├йr├й comme la source faisant autorit├й. Pour des informations critiques, il est recommand├й de recourir ├а une traduction professionnelle effectu├йe par un humain. Nous d├йclinons toute responsabilit├й en cas de malentendus ou d'interpr├йtations erron├йes r├йsultant de l'utilisation de cette traduction.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"language_info": {
|
||||
"name": "python"
|
||||
},
|
||||
"orig_nbformat": 4,
|
||||
"coopTranslator": {
|
||||
"original_hash": "153d9e417e079bf62f8f693002d0deaf",
|
||||
"translation_date": "2025-08-31T14:42:38+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/06-IntroCV/lab/MovementDetection.ipynb",
|
||||
"language_code": "fr"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,577 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# T├вche de classification de texte\n",
|
||||
"\n",
|
||||
"Comme nous l'avons mentionn├й, nous allons nous concentrer sur une t├вche simple de classification de texte bas├йe sur le dataset **AG_NEWS**, qui consiste ├а classer les titres d'actualit├йs dans l'une des 4 cat├йgories : Monde, Sports, ├Йconomie et Sci/Tech.\n",
|
||||
"\n",
|
||||
"## Le Dataset\n",
|
||||
"\n",
|
||||
"Ce dataset est int├йgr├й dans le module [`torchtext`](https://github.com/pytorch/text), ce qui nous permet d'y acc├йder facilement.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import torch\n",
|
||||
"import torchtext\n",
|
||||
"import os\n",
|
||||
"import collections\n",
|
||||
"os.makedirs('./data',exist_ok=True)\n",
|
||||
"train_dataset, test_dataset = torchtext.datasets.AG_NEWS(root='./data')\n",
|
||||
"classes = ['World', 'Sports', 'Business', 'Sci/Tech']"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Ici, `train_dataset` et `test_dataset` contiennent des collections qui renvoient respectivement des paires d'├йtiquette (num├йro de classe) et de texte, par exemple :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(3,\n",
|
||||
" \"Wall St. Bears Claw Back Into the Black (Reuters) Reuters - Short-sellers, Wall Street's dwindling\\\\band of ultra-cynics, are seeing green again.\")"
|
||||
]
|
||||
},
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"list(train_dataset)[0]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Alors, imprimons les 10 premiers nouveaux titres de notre ensemble de donn├йes :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"**Sci/Tech** -> Wall St. Bears Claw Back Into the Black (Reuters) Reuters - Short-sellers, Wall Street's dwindling\\band of ultra-cynics, are seeing green again.\n",
|
||||
"**Sci/Tech** -> Carlyle Looks Toward Commercial Aerospace (Reuters) Reuters - Private investment firm Carlyle Group,\\which has a reputation for making well-timed and occasionally\\controversial plays in the defense industry, has quietly placed\\its bets on another part of the market.\n",
|
||||
"**Sci/Tech** -> Oil and Economy Cloud Stocks' Outlook (Reuters) Reuters - Soaring crude prices plus worries\\about the economy and the outlook for earnings are expected to\\hang over the stock market next week during the depth of the\\summer doldrums.\n",
|
||||
"**Sci/Tech** -> Iraq Halts Oil Exports from Main Southern Pipeline (Reuters) Reuters - Authorities have halted oil export\\flows from the main pipeline in southern Iraq after\\intelligence showed a rebel militia could strike\\infrastructure, an oil official said on Saturday.\n",
|
||||
"**Sci/Tech** -> Oil prices soar to all-time record, posing new menace to US economy (AFP) AFP - Tearaway world oil prices, toppling records and straining wallets, present a new economic menace barely three months before the US presidential elections.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"for i,x in zip(range(5),train_dataset):\n",
|
||||
" print(f\"**{classes[x[0]]}** -> {x[1]}\")\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Parce que les ensembles de donn├йes sont des it├йrateurs, si nous voulons utiliser les donn├йes plusieurs fois, nous devons les convertir en liste :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"train_dataset, test_dataset = torchtext.datasets.AG_NEWS(root='./data')\n",
|
||||
"train_dataset = list(train_dataset)\n",
|
||||
"test_dataset = list(test_dataset)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Tokenisation\n",
|
||||
"\n",
|
||||
"Nous devons maintenant convertir le texte en **nombres** pouvant ├кtre repr├йsent├йs sous forme de tenseurs. Si nous souhaitons une repr├йsentation au niveau des mots, nous devons effectuer deux ├йtapes :\n",
|
||||
"* utiliser un **tokeniseur** pour diviser le texte en **tokens**\n",
|
||||
"* construire un **vocabulaire** ├а partir de ces tokens.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"['he', 'said', 'hello']"
|
||||
]
|
||||
},
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"tokenizer = torchtext.data.utils.get_tokenizer('basic_english')\n",
|
||||
"tokenizer('He said: hello')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"counter = collections.Counter()\n",
|
||||
"for (label, line) in train_dataset:\n",
|
||||
" counter.update(tokenizer(line))\n",
|
||||
"vocab = torchtext.vocab.vocab(counter, min_freq=1)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"En utilisant le vocabulaire, nous pouvons facilement encoder notre cha├оne tokenis├йe en un ensemble de nombres :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 19,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Vocab size if 95810\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[599, 3279, 97, 1220, 329, 225, 7368]"
|
||||
]
|
||||
},
|
||||
"execution_count": 19,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"vocab_size = len(vocab)\n",
|
||||
"print(f\"Vocab size if {vocab_size}\")\n",
|
||||
"\n",
|
||||
"stoi = vocab.get_stoi() # dict to convert tokens to indices\n",
|
||||
"\n",
|
||||
"def encode(x):\n",
|
||||
" return [stoi[s] for s in tokenizer(x)]\n",
|
||||
"\n",
|
||||
"encode('I love to play with my words')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Repr├йsentation textuelle par sac de mots\n",
|
||||
"\n",
|
||||
"Parce que les mots v├йhiculent du sens, il est parfois possible de comprendre le sens d'un texte simplement en regardant les mots individuels, ind├йpendamment de leur ordre dans la phrase. Par exemple, pour classifier des articles de presse, des mots comme *m├йt├йo*, *neige* sont susceptibles d'indiquer une *pr├йvision m├йt├йorologique*, tandis que des mots comme *actions*, *dollar* pourraient correspondre ├а des *nouvelles financi├иres*.\n",
|
||||
"\n",
|
||||
"La repr├йsentation vectorielle **Sac de mots** (BoW) est la m├йthode traditionnelle la plus couramment utilis├йe. Chaque mot est associ├й ├а un indice de vecteur, et l'├йl├йment du vecteur contient le nombre d'occurrences d'un mot dans un document donn├й.\n",
|
||||
"\n",
|
||||
" \n",
|
||||
"\n",
|
||||
"> **Note** : Vous pouvez ├йgalement consid├йrer BoW comme la somme de tous les vecteurs encod├йs en one-hot pour les mots individuels du texte.\n",
|
||||
"\n",
|
||||
"Voici un exemple de g├йn├йration d'une repr├йsentation par sac de mots en utilisant la biblioth├иque Python Scikit Learn :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"array([[1, 1, 0, 2, 0, 0, 0, 0, 0]], dtype=int64)"
|
||||
]
|
||||
},
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"from sklearn.feature_extraction.text import CountVectorizer\n",
|
||||
"vectorizer = CountVectorizer()\n",
|
||||
"corpus = [\n",
|
||||
" 'I like hot dogs.',\n",
|
||||
" 'The dog ran fast.',\n",
|
||||
" 'Its hot outside.',\n",
|
||||
" ]\n",
|
||||
"vectorizer.fit_transform(corpus)\n",
|
||||
"vectorizer.transform(['My dog likes hot dogs on a hot day.']).toarray()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Pour calculer le vecteur sac-de-mots ├а partir de la repr├йsentation vectorielle de notre ensemble de donn├йes AG_NEWS, nous pouvons utiliser la fonction suivante :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 20,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"tensor([2., 1., 2., ..., 0., 0., 0.])\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"vocab_size = len(vocab)\n",
|
||||
"\n",
|
||||
"def to_bow(text,bow_vocab_size=vocab_size):\n",
|
||||
" res = torch.zeros(bow_vocab_size,dtype=torch.float32)\n",
|
||||
" for i in encode(text):\n",
|
||||
" if i<bow_vocab_size:\n",
|
||||
" res[i] += 1\n",
|
||||
" return res\n",
|
||||
"\n",
|
||||
"print(to_bow(train_dataset[0][1]))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **Remarque :** Ici, nous utilisons la variable globale `vocab_size` pour sp├йcifier la taille par d├йfaut du vocabulaire. ├Йtant donn├й que la taille du vocabulaire est souvent assez grande, nous pouvons limiter la taille du vocabulaire aux mots les plus fr├йquents. Essayez de r├йduire la valeur de `vocab_size` et d'ex├йcuter le code ci-dessous, et observez comment cela affecte la pr├йcision. Vous devriez vous attendre ├а une l├йg├иre baisse de pr├йcision, mais pas dramatique, en ├йchange d'une meilleure performance.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Entra├оner un classificateur BoW\n",
|
||||
"\n",
|
||||
"Maintenant que nous avons appris ├а construire une repr├йsentation Bag-of-Words pour notre texte, entra├оnons un classificateur par-dessus. Tout d'abord, nous devons convertir notre ensemble de donn├йes pour l'entra├оnement de mani├иre ├а ce que toutes les repr├йsentations vectorielles positionnelles soient transform├йes en repr├йsentation Bag-of-Words. Cela peut ├кtre r├йalis├й en passant la fonction `bowify` comme param├иtre `collate_fn` au `DataLoader` standard de torch :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 21,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"from torch.utils.data import DataLoader\n",
|
||||
"import numpy as np \n",
|
||||
"\n",
|
||||
"# this collate function gets list of batch_size tuples, and needs to \n",
|
||||
"# return a pair of label-feature tensors for the whole minibatch\n",
|
||||
"def bowify(b):\n",
|
||||
" return (\n",
|
||||
" torch.LongTensor([t[0]-1 for t in b]),\n",
|
||||
" torch.stack([to_bow(t[1]) for t in b])\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
"train_loader = DataLoader(train_dataset, batch_size=16, collate_fn=bowify, shuffle=True)\n",
|
||||
"test_loader = DataLoader(test_dataset, batch_size=16, collate_fn=bowify, shuffle=True)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"D├йfinissons maintenant un r├йseau de neurones classificateur simple qui contient une couche lin├йaire. La taille du vecteur d'entr├йe est ├йgale ├а `vocab_size`, et la taille de sortie correspond au nombre de classes (4). ├Йtant donn├й que nous r├йsolvons une t├вche de classification, la fonction d'activation finale est `LogSoftmax()`.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 22,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"net = torch.nn.Sequential(torch.nn.Linear(vocab_size,4),torch.nn.LogSoftmax(dim=1))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Maintenant, nous allons d├йfinir une boucle d'entra├оnement standard avec PyTorch. ├Йtant donn├й que notre ensemble de donn├йes est assez volumineux, pour notre objectif p├йdagogique, nous n'entra├оnerons que pendant une seule ├йpoque, et parfois m├кme moins d'une ├йpoque (la sp├йcification du param├иtre `epoch_size` nous permet de limiter l'entra├оnement). Nous rapporterons ├йgalement l'exactitude accumul├йe de l'entra├оnement pendant la formation ; la fr├йquence de rapport est sp├йcifi├йe ├а l'aide du param├иtre `report_freq`.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 24,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def train_epoch(net,dataloader,lr=0.01,optimizer=None,loss_fn = torch.nn.NLLLoss(),epoch_size=None, report_freq=200):\n",
|
||||
" optimizer = optimizer or torch.optim.Adam(net.parameters(),lr=lr)\n",
|
||||
" net.train()\n",
|
||||
" total_loss,acc,count,i = 0,0,0,0\n",
|
||||
" for labels,features in dataloader:\n",
|
||||
" optimizer.zero_grad()\n",
|
||||
" out = net(features)\n",
|
||||
" loss = loss_fn(out,labels) #cross_entropy(out,labels)\n",
|
||||
" loss.backward()\n",
|
||||
" optimizer.step()\n",
|
||||
" total_loss+=loss\n",
|
||||
" _,predicted = torch.max(out,1)\n",
|
||||
" acc+=(predicted==labels).sum()\n",
|
||||
" count+=len(labels)\n",
|
||||
" i+=1\n",
|
||||
" if i%report_freq==0:\n",
|
||||
" print(f\"{count}: acc={acc.item()/count}\")\n",
|
||||
" if epoch_size and count>epoch_size:\n",
|
||||
" break\n",
|
||||
" return total_loss.item()/count, acc.item()/count"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 25,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"3200: acc=0.8028125\n",
|
||||
"6400: acc=0.8371875\n",
|
||||
"9600: acc=0.8534375\n",
|
||||
"12800: acc=0.85765625\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(0.026090790722161722, 0.8620069296375267)"
|
||||
]
|
||||
},
|
||||
"execution_count": 25,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"train_epoch(net,train_loader,epoch_size=15000)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## BiGrams, TriGrams et N-Grams\n",
|
||||
"\n",
|
||||
"Une limitation de l'approche par sac de mots est que certains mots font partie d'expressions compos├йes de plusieurs mots. Par exemple, le mot 'hot dog' a une signification compl├иtement diff├йrente des mots 'hot' et 'dog' dans d'autres contextes. Si nous repr├йsentons toujours les mots 'hot' et 'dog' par les m├кmes vecteurs, cela peut perturber notre mod├иle.\n",
|
||||
"\n",
|
||||
"Pour r├йsoudre ce probl├иme, les **repr├йsentations N-gram** sont souvent utilis├йes dans les m├йthodes de classification de documents, o├╣ la fr├йquence de chaque mot, bi-mot ou tri-mot constitue une caract├йristique utile pour entra├оner des classificateurs. Dans une repr├йsentation bigramme, par exemple, nous ajouterons toutes les paires de mots au vocabulaire, en plus des mots originaux.\n",
|
||||
"\n",
|
||||
"Voici un exemple de g├йn├йration d'une repr├йsentation par sac de mots bigramme en utilisant Scikit Learn :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 26,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Vocabulary:\n",
|
||||
" {'i': 7, 'like': 11, 'hot': 4, 'dogs': 2, 'i like': 8, 'like hot': 12, 'hot dogs': 5, 'the': 16, 'dog': 0, 'ran': 14, 'fast': 3, 'the dog': 17, 'dog ran': 1, 'ran fast': 15, 'its': 9, 'outside': 13, 'its hot': 10, 'hot outside': 6}\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"array([[1, 0, 1, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]],\n",
|
||||
" dtype=int64)"
|
||||
]
|
||||
},
|
||||
"execution_count": 26,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"bigram_vectorizer = CountVectorizer(ngram_range=(1, 2), token_pattern=r'\\b\\w+\\b', min_df=1)\n",
|
||||
"corpus = [\n",
|
||||
" 'I like hot dogs.',\n",
|
||||
" 'The dog ran fast.',\n",
|
||||
" 'Its hot outside.',\n",
|
||||
" ]\n",
|
||||
"bigram_vectorizer.fit_transform(corpus)\n",
|
||||
"print(\"Vocabulary:\\n\",bigram_vectorizer.vocabulary_)\n",
|
||||
"bigram_vectorizer.transform(['My dog likes hot dogs on a hot day.']).toarray()\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Le principal inconv├йnient de l'approche N-gram est que la taille du vocabulaire commence ├а cro├оtre de mani├иre extr├кmement rapide. En pratique, il est n├йcessaire de combiner la repr├йsentation N-gram avec certaines techniques de r├йduction de dimensionnalit├й, comme les *embeddings*, que nous aborderons dans la prochaine unit├й.\n",
|
||||
"\n",
|
||||
"Pour utiliser la repr├йsentation N-gram dans notre jeu de donn├йes **AG News**, nous devons construire un vocabulaire sp├йcifique aux n-grams :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 27,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Bigram vocabulary length = 1308842\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"counter = collections.Counter()\n",
|
||||
"for (label, line) in train_dataset:\n",
|
||||
" l = tokenizer(line)\n",
|
||||
" counter.update(torchtext.data.utils.ngrams_iterator(l,ngrams=2))\n",
|
||||
" \n",
|
||||
"bi_vocab = torchtext.vocab.vocab(counter, min_freq=1)\n",
|
||||
"\n",
|
||||
"print(\"Bigram vocabulary length = \",len(bi_vocab))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Nous pourrions alors utiliser le m├кme code que ci-dessus pour entra├оner le classificateur, cependant, cela serait tr├иs inefficace en termes de m├йmoire. Dans la prochaine unit├й, nous entra├оnerons un classificateur bigramme en utilisant des embeddings.\n",
|
||||
"\n",
|
||||
"> **Note:** Vous pouvez conserver uniquement les ngrams qui apparaissent dans le texte plus souvent qu'un nombre sp├йcifi├й de fois. Cela garantira que les bigrammes peu fr├йquents seront omis et r├йduira consid├йrablement la dimensionnalit├й. Pour ce faire, d├йfinissez le param├иtre `min_freq` ├а une valeur plus ├йlev├йe et observez le changement de longueur du vocabulaire.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Fr├йquence Terme-Fr├йquence Inverse de Document TF-IDF\n",
|
||||
"\n",
|
||||
"Dans la repr├йsentation BoW, les occurrences des mots sont pond├йr├йes de mani├иre ├йgale, quel que soit le mot lui-m├кme. Cependant, il est ├йvident que les mots fr├йquents, tels que *un*, *dans*, etc., sont beaucoup moins importants pour la classification que les termes sp├йcialis├йs. En r├йalit├й, dans la plupart des t├вches de NLP, certains mots sont plus pertinents que d'autres.\n",
|
||||
"\n",
|
||||
"**TF-IDF** signifie **fr├йquence termeтАУfr├йquence inverse de document**. C'est une variation du sac de mots, o├╣ au lieu d'une valeur binaire 0/1 indiquant la pr├йsence d'un mot dans un document, une valeur en virgule flottante est utilis├йe, qui est li├йe ├а la fr├йquence d'apparition du mot dans le corpus.\n",
|
||||
"\n",
|
||||
"Plus formellement, le poids $w_{ij}$ d'un mot $i$ dans le document $j$ est d├йfini comme suit :\n",
|
||||
"$$\n",
|
||||
"w_{ij} = tf_{ij}\\times\\log({N\\over df_i})\n",
|
||||
"$$\n",
|
||||
"o├╣\n",
|
||||
"* $tf_{ij}$ est le nombre d'occurrences de $i$ dans $j$, c'est-├а-dire la valeur BoW que nous avons vue pr├йc├йdemment\n",
|
||||
"* $N$ est le nombre de documents dans la collection\n",
|
||||
"* $df_i$ est le nombre de documents contenant le mot $i$ dans l'ensemble de la collection\n",
|
||||
"\n",
|
||||
"La valeur TF-IDF $w_{ij}$ augmente proportionnellement au nombre de fois qu'un mot appara├оt dans un document et est ajust├йe par le nombre de documents du corpus contenant ce mot, ce qui permet de corriger le fait que certains mots apparaissent plus fr├йquemment que d'autres. Par exemple, si le mot appara├оt dans *chaque* document de la collection, $df_i=N$, et $w_{ij}=0$, ces termes seraient alors compl├иtement ignor├йs.\n",
|
||||
"\n",
|
||||
"Vous pouvez facilement cr├йer une vectorisation TF-IDF de texte en utilisant Scikit Learn :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 28,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"array([[0.43381609, 0. , 0.43381609, 0. , 0.65985664,\n",
|
||||
" 0.43381609, 0. , 0. , 0. , 0. ,\n",
|
||||
" 0. , 0. , 0. , 0. , 0. ,\n",
|
||||
" 0. ]])"
|
||||
]
|
||||
},
|
||||
"execution_count": 28,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"from sklearn.feature_extraction.text import TfidfVectorizer\n",
|
||||
"vectorizer = TfidfVectorizer(ngram_range=(1,2))\n",
|
||||
"vectorizer.fit_transform(corpus)\n",
|
||||
"vectorizer.transform(['My dog likes hot dogs on a hot day.']).toarray()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Conclusion \n",
|
||||
"\n",
|
||||
"Cependant, bien que les repr├йsentations TF-IDF attribuent un poids de fr├йquence ├а diff├йrents mots, elles ne parviennent pas ├а repr├йsenter le sens ou l'ordre. Comme l'a dit le c├йl├иbre linguiste J. R. Firth en 1935 : ┬л Le sens complet d'un mot est toujours contextuel, et aucune ├йtude du sens en dehors du contexte ne peut ├кtre prise au s├йrieux. ┬╗. Nous apprendrons plus tard dans le cours comment capturer les informations contextuelles ├а partir du texte en utilisant la mod├йlisation du langage.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**Avertissement** : \nCe document a ├йt├й traduit ├а l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatis├йes peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit ├кtre consid├йr├й comme la source faisant autorit├й. Pour des informations critiques, il est recommand├й de recourir ├а une traduction professionnelle r├йalis├йe par un humain. Nous d├йclinons toute responsabilit├й en cas de malentendus ou d'interpr├йtations erron├йes r├йsultant de l'utilisation de cette traduction.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"interpreter": {
|
||||
"hash": "16af2a8bbb083ea23e5e41c7f5787656b2ce26968575d8763f2c4b17f9cd711f"
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3.8.12 ('py38')",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.8.12"
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "7b9040985e748e4e2d4c689892456ad7",
|
||||
"translation_date": "2025-08-31T15:29:10+00:00",
|
||||
"source_file": "lessons/5-NLP/13-TextRep/TextRepresentationPyTorch.ipynb",
|
||||
"language_code": "fr"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
|
|
@ -0,0 +1,647 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# T├вche de classification de texte\n",
|
||||
"\n",
|
||||
"Dans ce module, nous allons commencer par une t├вche simple de classification de texte bas├йe sur le jeu de donn├йes **[AG_NEWS](http://www.di.unipi.it/~gulli/AG_corpus_of_news_articles.html)** : nous allons classer des titres d'actualit├йs en l'une des 4 cat├йgories suivantes : Monde, Sports, ├Йconomie et Sci/Tech.\n",
|
||||
"\n",
|
||||
"## Le jeu de donn├йes\n",
|
||||
"\n",
|
||||
"Pour charger le jeu de donn├йes, nous utiliserons l'API **[TensorFlow Datasets](https://www.tensorflow.org/datasets)**.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import tensorflow as tf\n",
|
||||
"from tensorflow import keras\n",
|
||||
"import tensorflow_datasets as tfds\n",
|
||||
"\n",
|
||||
"# In this tutorial, we will be training a lot of models. In order to use GPU memory cautiously,\n",
|
||||
"# we will set tensorflow option to grow GPU memory allocation when required.\n",
|
||||
"physical_devices = tf.config.list_physical_devices('GPU') \n",
|
||||
"if len(physical_devices)>0:\n",
|
||||
" tf.config.experimental.set_memory_growth(physical_devices[0], True)\n",
|
||||
"\n",
|
||||
"dataset = tfds.load('ag_news_subset')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Nous pouvons maintenant acc├йder aux parties d'entra├оnement et de test du jeu de donn├йes en utilisant `dataset['train']` et `dataset['test']` respectivement :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Length of train dataset = 120000\n",
|
||||
"Length of test dataset = 7600\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"ds_train = dataset['train']\n",
|
||||
"ds_test = dataset['test']\n",
|
||||
"\n",
|
||||
"print(f\"Length of train dataset = {len(ds_train)}\")\n",
|
||||
"print(f\"Length of test dataset = {len(ds_test)}\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Imprimons les 10 premiers nouveaux titres de notre ensemble de donn├йes :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"3 (Sci/Tech) -> b'AMD Debuts Dual-Core Opteron Processor' b'AMD #39;s new dual-core Opteron chip is designed mainly for corporate computing applications, including databases, Web services, and financial transactions.'\n",
|
||||
"1 (Sports) -> b\"Wood's Suspension Upheld (Reuters)\" b'Reuters - Major League Baseball\\\\Monday announced a decision on the appeal filed by Chicago Cubs\\\\pitcher Kerry Wood regarding a suspension stemming from an\\\\incident earlier this season.'\n",
|
||||
"2 (Business) -> b'Bush reform may have blue states seeing red' b'President Bush #39;s quot;revenue-neutral quot; tax reform needs losers to balance its winners, and people claiming the federal deduction for state and local taxes may be in administration planners #39; sights, news reports say.'\n",
|
||||
"3 (Sci/Tech) -> b\"'Halt science decline in schools'\" b'Britain will run out of leading scientists unless science education is improved, says Professor Colin Pillinger.'\n",
|
||||
"1 (Sports) -> b'Gerrard leaves practice' b'London, England (Sports Network) - England midfielder Steven Gerrard injured his groin late in Thursday #39;s training session, but is hopeful he will be ready for Saturday #39;s World Cup qualifier against Austria.'\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"classes = ['World', 'Sports', 'Business', 'Sci/Tech']\n",
|
||||
"\n",
|
||||
"for i,x in zip(range(5),ds_train):\n",
|
||||
" print(f\"{x['label']} ({classes[x['label']]}) -> {x['title']} {x['description']}\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Vectorisation du texte\n",
|
||||
"\n",
|
||||
"Nous devons maintenant convertir le texte en **nombres** pouvant ├кtre repr├йsent├йs sous forme de tenseurs. Si nous souhaitons une repr├йsentation au niveau des mots, nous devons effectuer deux ├йtapes :\n",
|
||||
"\n",
|
||||
"* Utiliser un **tokeniseur** pour diviser le texte en **tokens**.\n",
|
||||
"* Construire un **vocabulaire** ├а partir de ces tokens.\n",
|
||||
"\n",
|
||||
"### Limitation de la taille du vocabulaire\n",
|
||||
"\n",
|
||||
"Dans l'exemple du jeu de donn├йes AG News, la taille du vocabulaire est assez grande, avec plus de 100 000 mots. De mani├иre g├йn├йrale, nous n'avons pas besoin des mots qui apparaissent rarement dans le texte тАФ seuls quelques phrases les contiendront, et le mod├иle ne pourra pas en tirer d'apprentissage. Par cons├йquent, il est logique de limiter la taille du vocabulaire ├а un nombre plus restreint en passant un argument au constructeur du vectoriseur :\n",
|
||||
"\n",
|
||||
"Ces deux ├йtapes peuvent ├кtre g├йr├йes ├а l'aide de la couche **TextVectorization**. Instancions l'objet vectoriseur, puis appelons la m├йthode `adapt` pour parcourir tout le texte et construire un vocabulaire :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"vocab_size = 50000\n",
|
||||
"vectorizer = keras.layers.experimental.preprocessing.TextVectorization(max_tokens=vocab_size)\n",
|
||||
"vectorizer.adapt(ds_train.take(500).map(lambda x: x['title']+' '+x['description']))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **Note** que nous utilisons uniquement un sous-ensemble de l'ensemble de donn├йes complet pour construire un vocabulaire. Nous faisons cela pour acc├йl├йrer le temps d'ex├йcution et ├йviter de vous faire attendre. Cependant, nous prenons le risque que certains mots de l'ensemble de donn├йes complet ne soient pas inclus dans le vocabulaire et soient ignor├йs pendant l'entra├оnement. Ainsi, utiliser la taille compl├иte du vocabulaire et parcourir l'ensemble des donn├йes pendant `adapt` devrait augmenter la pr├йcision finale, mais pas de mani├иre significative.\n",
|
||||
"\n",
|
||||
"Nous pouvons maintenant acc├йder au vocabulaire r├йel :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"['', '[UNK]', 'the', 'to', 'a', 'in', 'of', 'and', 'on', 'for']\n",
|
||||
"Length of vocabulary: 5335\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"vocab = vectorizer.get_vocabulary()\n",
|
||||
"vocab_size = len(vocab)\n",
|
||||
"print(vocab[:10])\n",
|
||||
"print(f\"Length of vocabulary: {vocab_size}\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"En utilisant le vectoriseur, nous pouvons facilement encoder n'importe quel texte en un ensemble de chiffres :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<tf.Tensor: shape=(7,), dtype=int64, numpy=array([ 112, 3695, 3, 304, 11, 1041, 1], dtype=int64)>"
|
||||
]
|
||||
},
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"vectorizer('I love to play with my words')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Repr├йsentation textuelle par sac de mots\n",
|
||||
"\n",
|
||||
"Parce que les mots v├йhiculent du sens, il est parfois possible de comprendre le sens d'un texte simplement en regardant les mots individuels, ind├йpendamment de leur ordre dans la phrase. Par exemple, pour classifier des articles de presse, des mots comme *m├йt├йo* et *neige* sont susceptibles d'indiquer une *pr├йvision m├йt├йorologique*, tandis que des mots comme *actions* et *dollar* seraient associ├йs ├а des *nouvelles financi├иres*.\n",
|
||||
"\n",
|
||||
"La repr├йsentation vectorielle par **sac de mots** (BoW) est la m├йthode traditionnelle la plus simple ├а comprendre. Chaque mot est associ├й ├а un indice de vecteur, et un ├йl├йment du vecteur contient le nombre d'occurrences de chaque mot dans un document donn├й.\n",
|
||||
"\n",
|
||||
" \n",
|
||||
"\n",
|
||||
"> **Note** : Vous pouvez ├йgalement consid├йrer le BoW comme la somme de tous les vecteurs encod├йs en one-hot pour les mots individuels du texte.\n",
|
||||
"\n",
|
||||
"Voici un exemple de g├йn├йration d'une repr├йsentation par sac de mots en utilisant la biblioth├иque Python Scikit Learn :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"array([[1, 1, 0, 2, 0, 0, 0, 0, 0]], dtype=int64)"
|
||||
]
|
||||
},
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"from sklearn.feature_extraction.text import CountVectorizer\n",
|
||||
"sc_vectorizer = CountVectorizer()\n",
|
||||
"corpus = [\n",
|
||||
" 'I like hot dogs.',\n",
|
||||
" 'The dog ran fast.',\n",
|
||||
" 'Its hot outside.',\n",
|
||||
" ]\n",
|
||||
"sc_vectorizer.fit_transform(corpus)\n",
|
||||
"sc_vectorizer.transform(['My dog likes hot dogs on a hot day.']).toarray()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Nous pouvons ├йgalement utiliser le vectoriseur Keras que nous avons d├йfini ci-dessus, en convertissant chaque num├йro de mot en un encodage one-hot et en additionnant tous ces vecteurs.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"array([0., 5., 0., ..., 0., 0., 0.], dtype=float32)"
|
||||
]
|
||||
},
|
||||
"execution_count": 9,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def to_bow(text):\n",
|
||||
" return tf.reduce_sum(tf.one_hot(vectorizer(text),vocab_size),axis=0)\n",
|
||||
"\n",
|
||||
"to_bow('My dog likes hot dogs on a hot day.').numpy()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **Remarque** : Vous pourriez ├кtre surpris que le r├йsultat diff├иre de l'exemple pr├йc├йdent. La raison en est que, dans l'exemple avec Keras, la longueur du vecteur correspond ├а la taille du vocabulaire, qui a ├йt├й construit ├а partir de l'ensemble complet du jeu de donn├йes AG News, tandis que dans l'exemple avec Scikit Learn, nous avons construit le vocabulaire ├а partir du texte d'exemple ├а la vol├йe.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Entra├оner le classificateur BoW\n",
|
||||
"\n",
|
||||
"Maintenant que nous avons appris ├а construire la repr├йsentation sac de mots (bag-of-words) de notre texte, entra├оnons un classificateur qui l'utilise. Tout d'abord, nous devons convertir notre jeu de donn├йes en une repr├йsentation sac de mots. Cela peut ├кtre r├йalis├й en utilisant la fonction `map` de la mani├иre suivante :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"batch_size = 128\n",
|
||||
"\n",
|
||||
"ds_train_bow = ds_train.map(lambda x: (to_bow(x['title']+x['description']),x['label'])).batch(batch_size)\n",
|
||||
"ds_test_bow = ds_test.map(lambda x: (to_bow(x['title']+x['description']),x['label'])).batch(batch_size)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"D├йfinissons maintenant un r├йseau de neurones classificateur simple qui contient une couche lin├йaire. La taille de l'entr├йe est `vocab_size`, et la taille de la sortie correspond au nombre de classes (4). ├Йtant donn├й que nous r├йsolvons une t├вche de classification, la fonction d'activation finale est **softmax** :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 12,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"938/938 [==============================] - 66s 70ms/step - loss: 0.6144 - acc: 0.8427 - val_loss: 0.4416 - val_acc: 0.8697\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<keras.callbacks.History at 0x20c70a947f0>"
|
||||
]
|
||||
},
|
||||
"execution_count": 12,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"model = keras.models.Sequential([\n",
|
||||
" keras.layers.Dense(4,activation='softmax',input_shape=(vocab_size,))\n",
|
||||
"])\n",
|
||||
"model.compile(loss='sparse_categorical_crossentropy',optimizer='adam',metrics=['acc'])\n",
|
||||
"model.fit(ds_train_bow,validation_data=ds_test_bow)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Puisque nous avons 4 classes, une pr├йcision sup├йrieure ├а 80 % est un bon r├йsultat.\n",
|
||||
"\n",
|
||||
"## Entra├оner un classificateur comme un r├йseau unique\n",
|
||||
"\n",
|
||||
"├Йtant donn├й que le vectoriseur est ├йgalement une couche Keras, nous pouvons d├йfinir un r├йseau qui l'inclut et l'entra├оner de bout en bout. De cette mani├иre, nous n'avons pas besoin de vectoriser le jeu de donn├йes en utilisant `map`, nous pouvons simplement passer le jeu de donn├йes original ├а l'entr├йe du r├йseau.\n",
|
||||
"\n",
|
||||
"> **Note** : Nous devrons tout de m├кme appliquer des maps ├а notre jeu de donn├йes pour convertir les champs des dictionnaires (comme `title`, `description` et `label`) en tuples. Cependant, lors du chargement des donn├йes depuis le disque, nous pouvons construire un jeu de donn├йes avec la structure requise d├иs le d├йpart.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 13,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Model: \"model\"\n",
|
||||
"_________________________________________________________________\n",
|
||||
" Layer (type) Output Shape Param # \n",
|
||||
"=================================================================\n",
|
||||
" input_1 (InputLayer) [(None, 1)] 0 \n",
|
||||
" \n",
|
||||
" text_vectorization (TextVec (None, None) 0 \n",
|
||||
" torization) \n",
|
||||
" \n",
|
||||
" tf.one_hot (TFOpLambda) (None, None, 5335) 0 \n",
|
||||
" \n",
|
||||
" tf.math.reduce_sum (TFOpLam (None, 5335) 0 \n",
|
||||
" bda) \n",
|
||||
" \n",
|
||||
" dense_2 (Dense) (None, 4) 21344 \n",
|
||||
" \n",
|
||||
"=================================================================\n",
|
||||
"Total params: 21,344\n",
|
||||
"Trainable params: 21,344\n",
|
||||
"Non-trainable params: 0\n",
|
||||
"_________________________________________________________________\n",
|
||||
"938/938 [==============================] - 73s 77ms/step - loss: 0.6057 - acc: 0.8414 - val_loss: 0.4202 - val_acc: 0.8736\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<keras.callbacks.History at 0x20c721521f0>"
|
||||
]
|
||||
},
|
||||
"execution_count": 13,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def extract_text(x):\n",
|
||||
" return x['title']+' '+x['description']\n",
|
||||
"\n",
|
||||
"def tupelize(x):\n",
|
||||
" return (extract_text(x),x['label'])\n",
|
||||
"\n",
|
||||
"inp = keras.Input(shape=(1,),dtype=tf.string)\n",
|
||||
"x = vectorizer(inp)\n",
|
||||
"x = tf.reduce_sum(tf.one_hot(x,vocab_size),axis=1)\n",
|
||||
"out = keras.layers.Dense(4,activation='softmax')(x)\n",
|
||||
"model = keras.models.Model(inp,out)\n",
|
||||
"model.summary()\n",
|
||||
"\n",
|
||||
"model.compile(loss='sparse_categorical_crossentropy',optimizer='adam',metrics=['acc'])\n",
|
||||
"model.fit(ds_train.map(tupelize).batch(batch_size),validation_data=ds_test.map(tupelize).batch(batch_size))\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Bigrams, trigrams et n-grams\n",
|
||||
"\n",
|
||||
"Une des limites de l'approche bag-of-words est que certains mots font partie d'expressions compos├йes de plusieurs mots. Par exemple, le terme ┬л hot dog ┬╗ a une signification compl├иtement diff├йrente des mots ┬л hot ┬╗ et ┬л dog ┬╗ pris s├йpar├йment dans d'autres contextes. Si nous repr├йsentons toujours les mots ┬л hot ┬╗ et ┬л dog ┬╗ avec les m├кmes vecteurs, cela peut induire notre mod├иle en erreur.\n",
|
||||
"\n",
|
||||
"Pour r├йsoudre ce probl├иme, les **repr├йsentations n-gram** sont souvent utilis├йes dans les m├йthodes de classification de documents, o├╣ la fr├йquence de chaque mot, bi-mot ou tri-mot constitue une caract├йristique utile pour entra├оner des classificateurs. Dans les repr├йsentations bigram, par exemple, nous ajoutons toutes les paires de mots au vocabulaire, en plus des mots originaux.\n",
|
||||
"\n",
|
||||
"Voici un exemple de g├йn├йration d'une repr├йsentation bag-of-words bigram en utilisant Scikit Learn :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 14,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Vocabulary:\n",
|
||||
" {'i': 7, 'like': 11, 'hot': 4, 'dogs': 2, 'i like': 8, 'like hot': 12, 'hot dogs': 5, 'the': 16, 'dog': 0, 'ran': 14, 'fast': 3, 'the dog': 17, 'dog ran': 1, 'ran fast': 15, 'its': 9, 'outside': 13, 'its hot': 10, 'hot outside': 6}\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"array([[1, 0, 1, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]],\n",
|
||||
" dtype=int64)"
|
||||
]
|
||||
},
|
||||
"execution_count": 14,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"bigram_vectorizer = CountVectorizer(ngram_range=(1, 2), token_pattern=r'\\b\\w+\\b', min_df=1)\n",
|
||||
"corpus = [\n",
|
||||
" 'I like hot dogs.',\n",
|
||||
" 'The dog ran fast.',\n",
|
||||
" 'Its hot outside.',\n",
|
||||
" ]\n",
|
||||
"bigram_vectorizer.fit_transform(corpus)\n",
|
||||
"print(\"Vocabulary:\\n\",bigram_vectorizer.vocabulary_)\n",
|
||||
"bigram_vectorizer.transform(['My dog likes hot dogs on a hot day.']).toarray()\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Le principal inconv├йnient de l'approche n-gram est que la taille du vocabulaire commence ├а cro├оtre extr├кmement rapidement. En pratique, nous devons combiner la repr├йsentation n-gram avec une technique de r├йduction de dimensionnalit├й, comme les *embeddings*, que nous aborderons dans la prochaine unit├й.\n",
|
||||
"\n",
|
||||
"Pour utiliser une repr├йsentation n-gram dans notre ensemble de donn├йes **AG News**, nous devons passer le param├иtre `ngrams` au constructeur de `TextVectorization`. La taille d'un vocabulaire de bigrammes est **significativement plus grande**, dans notre cas, elle d├йpasse 1,3 million de tokens ! Il est donc logique de limiter ├йgalement les tokens de bigrammes ├а un nombre raisonnable.\n",
|
||||
"\n",
|
||||
"Nous pourrions utiliser le m├кme code que pr├йc├йdemment pour entra├оner le classificateur, mais cela serait tr├иs inefficace en termes de m├йmoire. Dans la prochaine unit├й, nous entra├оnerons le classificateur de bigrammes en utilisant des embeddings. En attendant, vous pouvez exp├йrimenter avec l'entra├оnement du classificateur de bigrammes dans ce notebook et voir si vous pouvez obtenir une meilleure pr├йcision.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Calcul des vecteurs BoW automatiquement\n",
|
||||
"\n",
|
||||
"Dans l'exemple ci-dessus, nous avons calcul├й les vecteurs BoW manuellement en additionnant les encodages one-hot des mots individuels. Cependant, la derni├иre version de TensorFlow nous permet de calculer les vecteurs BoW automatiquement en passant le param├иtre `output_mode='count'` au constructeur du vectoriseur. Cela rend la d├йfinition et l'entra├оnement de notre mod├иle beaucoup plus simples :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 15,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Training vectorizer\n",
|
||||
"938/938 [==============================] - 7s 7ms/step - loss: 0.5929 - acc: 0.8486 - val_loss: 0.4168 - val_acc: 0.8772\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<keras.callbacks.History at 0x20c725217c0>"
|
||||
]
|
||||
},
|
||||
"execution_count": 15,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"model = keras.models.Sequential([\n",
|
||||
" keras.layers.experimental.preprocessing.TextVectorization(max_tokens=vocab_size,output_mode='count'),\n",
|
||||
" keras.layers.Dense(4,input_shape=(vocab_size,), activation='softmax')\n",
|
||||
"])\n",
|
||||
"print(\"Training vectorizer\")\n",
|
||||
"model.layers[0].adapt(ds_train.take(500).map(extract_text))\n",
|
||||
"model.compile(loss='sparse_categorical_crossentropy',optimizer='adam',metrics=['acc'])\n",
|
||||
"model.fit(ds_train.map(tupelize).batch(batch_size),validation_data=ds_test.map(tupelize).batch(batch_size))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Fr├йquence de terme - fr├йquence inverse de document (TF-IDF)\n",
|
||||
"\n",
|
||||
"Dans la repr├йsentation BoW, les occurrences des mots sont pond├йr├йes en utilisant la m├кme technique, quel que soit le mot lui-m├кme. Cependant, il est ├йvident que les mots fr├йquents comme *un* et *dans* sont beaucoup moins importants pour la classification que les termes sp├йcialis├йs. Dans la plupart des t├вches de NLP, certains mots sont plus pertinents que d'autres.\n",
|
||||
"\n",
|
||||
"**TF-IDF** signifie **fr├йquence de terme - fr├йquence inverse de document**. C'est une variation du sac de mots, o├╣ au lieu d'une valeur binaire 0/1 indiquant la pr├йsence d'un mot dans un document, une valeur en virgule flottante est utilis├йe, qui est li├йe ├а la fr├йquence d'apparition du mot dans le corpus.\n",
|
||||
"\n",
|
||||
"Plus formellement, le poids $w_{ij}$ d'un mot $i$ dans le document $j$ est d├йfini comme suit :\n",
|
||||
"$$\n",
|
||||
"w_{ij} = tf_{ij}\\times\\log({N\\over df_i})\n",
|
||||
"$$\n",
|
||||
"o├╣\n",
|
||||
"* $tf_{ij}$ est le nombre d'occurrences de $i$ dans $j$, c'est-├а-dire la valeur BoW que nous avons vue pr├йc├йdemment\n",
|
||||
"* $N$ est le nombre de documents dans la collection\n",
|
||||
"* $df_i$ est le nombre de documents contenant le mot $i$ dans l'ensemble de la collection\n",
|
||||
"\n",
|
||||
"La valeur TF-IDF $w_{ij}$ augmente proportionnellement au nombre de fois qu'un mot appara├оt dans un document et est ajust├йe par le nombre de documents dans le corpus contenant ce mot, ce qui permet de compenser le fait que certains mots apparaissent plus fr├йquemment que d'autres. Par exemple, si le mot appara├оt dans *chaque* document de la collection, $df_i=N$, et $w_{ij}=0$, ces termes seraient compl├иtement ignor├йs.\n",
|
||||
"\n",
|
||||
"Vous pouvez facilement cr├йer une vectorisation TF-IDF de texte en utilisant Scikit Learn :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 16,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"array([[0.43381609, 0. , 0.43381609, 0. , 0.65985664,\n",
|
||||
" 0.43381609, 0. , 0. , 0. , 0. ,\n",
|
||||
" 0. , 0. , 0. , 0. , 0. ,\n",
|
||||
" 0. ]])"
|
||||
]
|
||||
},
|
||||
"execution_count": 16,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"from sklearn.feature_extraction.text import TfidfVectorizer\n",
|
||||
"vectorizer = TfidfVectorizer(ngram_range=(1,2))\n",
|
||||
"vectorizer.fit_transform(corpus)\n",
|
||||
"vectorizer.transform(['My dog likes hot dogs on a hot day.']).toarray()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Dans Keras, la couche `TextVectorization` peut calculer automatiquement les fr├йquences TF-IDF en passant le param├иtre `output_mode='tf-idf'`. R├йp├йtons le code que nous avons utilis├й ci-dessus pour voir si l'utilisation de TF-IDF augmente la pr├йcision :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 17,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Training vectorizer\n",
|
||||
"938/938 [==============================] - 12s 12ms/step - loss: 0.4197 - acc: 0.8662 - val_loss: 0.3432 - val_acc: 0.8849\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<keras.callbacks.History at 0x20c729dfd30>"
|
||||
]
|
||||
},
|
||||
"execution_count": 17,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"model = keras.models.Sequential([\n",
|
||||
" keras.layers.experimental.preprocessing.TextVectorization(max_tokens=vocab_size,output_mode='tf-idf'),\n",
|
||||
" keras.layers.Dense(4,input_shape=(vocab_size,), activation='softmax')\n",
|
||||
"])\n",
|
||||
"print(\"Training vectorizer\")\n",
|
||||
"model.layers[0].adapt(ds_train.take(500).map(extract_text))\n",
|
||||
"model.compile(loss='sparse_categorical_crossentropy',optimizer='adam',metrics=['acc'])\n",
|
||||
"model.fit(ds_train.map(tupelize).batch(batch_size),validation_data=ds_test.map(tupelize).batch(batch_size))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Conclusion \n",
|
||||
"\n",
|
||||
"Bien que les repr├йsentations TF-IDF attribuent des poids de fr├йquence ├а diff├йrents mots, elles ne parviennent pas ├а repr├йsenter le sens ou l'ordre. Comme l'a dit le c├йl├иbre linguiste J. R. Firth en 1935 : \"Le sens complet d'un mot est toujours contextuel, et aucune ├йtude du sens en dehors du contexte ne peut ├кtre prise au s├йrieux.\" Nous apprendrons plus tard dans le cours comment capturer les informations contextuelles ├а partir du texte en utilisant la mod├йlisation du langage.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**Avertissement** : \nCe document a ├йt├й traduit ├а l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatis├йes peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit ├кtre consid├йr├й comme la source faisant autorit├й. Pour des informations critiques, il est recommand├й de recourir ├а une traduction professionnelle r├йalis├йe par un humain. Nous d├йclinons toute responsabilit├й en cas de malentendus ou d'interpr├йtations erron├йes r├йsultant de l'utilisation de cette traduction.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"interpreter": {
|
||||
"hash": "0cb620c6d4b9f7a635928804c26cf22403d89d98d79684e4529119355ee6d5a5"
|
||||
},
|
||||
"kernel_info": {
|
||||
"name": "conda-env-py37_tensorflow-py"
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "py37_tensorflow",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.8.12"
|
||||
},
|
||||
"nteract": {
|
||||
"version": "nteract-front-end@1.0.0"
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "19b43951d55b377a76209c24c1f017e4",
|
||||
"translation_date": "2025-08-31T15:30:49+00:00",
|
||||
"source_file": "lessons/5-NLP/13-TextRep/TextRepresentationTF.ipynb",
|
||||
"language_code": "fr"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 4
|
||||
}
|
||||
|
|
@ -0,0 +1,724 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Int├йgrations\n",
|
||||
"\n",
|
||||
"Dans notre exemple pr├йc├йdent, nous avons travaill├й avec des vecteurs bag-of-words de haute dimension de longueur `vocab_size`, et nous convertissions explicitement des vecteurs de repr├йsentation positionnelle de basse dimension en repr├йsentation clairsem├йe one-hot. Cette repr├йsentation one-hot n'est pas efficace en termes de m├йmoire, de plus, chaque mot est trait├й ind├йpendamment des autres, c'est-├а-dire que les vecteurs encod├йs en one-hot n'expriment aucune similarit├й s├йmantique entre les mots.\n",
|
||||
"\n",
|
||||
"Dans cette unit├й, nous continuerons ├а explorer le jeu de donn├йes **News AG**. Pour commencer, chargeons les donn├йes et r├йcup├йrons quelques d├йfinitions du notebook pr├йc├йdent.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Loading dataset...\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"d:\\WORK\\ai-for-beginners\\5-NLP\\14-Embeddings\\data\\train.csv: 29.5MB [00:01, 18.8MB/s] \n",
|
||||
"d:\\WORK\\ai-for-beginners\\5-NLP\\14-Embeddings\\data\\test.csv: 1.86MB [00:00, 11.2MB/s] \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Building vocab...\n",
|
||||
"Vocab size = 95812\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import torch\n",
|
||||
"import torchtext\n",
|
||||
"import numpy as np\n",
|
||||
"from torchnlp import *\n",
|
||||
"train_dataset, test_dataset, classes, vocab = load_dataset()\n",
|
||||
"vocab_size = len(vocab)\n",
|
||||
"print(\"Vocab size = \",vocab_size)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Qu'est-ce qu'un embedding ?\n",
|
||||
"\n",
|
||||
"L'id├йe de l'**embedding** est de repr├йsenter les mots par des vecteurs denses de dimension inf├йrieure, qui refl├иtent d'une certaine mani├иre le sens s├йmantique d'un mot. Nous discuterons plus tard de la mani├иre de construire des embeddings de mots significatifs, mais pour l'instant, consid├йrons simplement les embeddings comme un moyen de r├йduire la dimensionnalit├й d'un vecteur de mots.\n",
|
||||
"\n",
|
||||
"Ainsi, une couche d'embedding prendrait un mot en entr├йe et produirait un vecteur de sortie de taille `embedding_size` sp├йcifi├йe. En un sens, cela ressemble beaucoup ├а une couche `Linear`, mais au lieu de prendre un vecteur encod├й en one-hot, elle pourra prendre un num├йro de mot en entr├йe.\n",
|
||||
"\n",
|
||||
"En utilisant une couche d'embedding comme premi├иre couche de notre r├йseau, nous pouvons passer du mod├иle bag-of-words au mod├иle **embedding bag**, o├╣ nous convertissons d'abord chaque mot de notre texte en son embedding correspondant, puis nous calculons une fonction d'agr├йgation sur tous ces embeddings, comme `sum`, `average` ou `max`.\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"Notre r├йseau de neurones classificateur commencera par une couche d'embedding, suivie d'une couche d'agr├йgation, puis d'un classificateur lin├йaire au-dessus :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class EmbedClassifier(torch.nn.Module):\n",
|
||||
" def __init__(self, vocab_size, embed_dim, num_class):\n",
|
||||
" super().__init__()\n",
|
||||
" self.embedding = torch.nn.Embedding(vocab_size, embed_dim)\n",
|
||||
" self.fc = torch.nn.Linear(embed_dim, num_class)\n",
|
||||
"\n",
|
||||
" def forward(self, x):\n",
|
||||
" x = self.embedding(x)\n",
|
||||
" x = torch.mean(x,dim=1)\n",
|
||||
" return self.fc(x)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### G├йrer la taille variable des s├йquences\n",
|
||||
"\n",
|
||||
"En raison de cette architecture, les minibatches pour notre r├йseau devront ├кtre cr├й├йs d'une certaine mani├иre. Dans l'unit├й pr├йc├йdente, en utilisant le sac de mots (BoW), tous les tenseurs BoW dans un minibatch avaient une taille ├йgale ├а `vocab_size`, ind├йpendamment de la longueur r├йelle de notre s├йquence de texte. Une fois que nous passons aux embeddings de mots, nous nous retrouvons avec un nombre variable de mots dans chaque ├йchantillon de texte, et lors de la combinaison de ces ├йchantillons en minibatches, nous devrons appliquer un certain remplissage.\n",
|
||||
"\n",
|
||||
"Cela peut ├кtre fait en utilisant la m├кme technique qui consiste ├а fournir une fonction `collate_fn` ├а la source de donn├йes :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def padify(b):\n",
|
||||
" # b is the list of tuples of length batch_size\n",
|
||||
" # - first element of a tuple = label, \n",
|
||||
" # - second = feature (text sequence)\n",
|
||||
" # build vectorized sequence\n",
|
||||
" v = [encode(x[1]) for x in b]\n",
|
||||
" # first, compute max length of a sequence in this minibatch\n",
|
||||
" l = max(map(len,v))\n",
|
||||
" return ( # tuple of two tensors - labels and features\n",
|
||||
" torch.LongTensor([t[0]-1 for t in b]),\n",
|
||||
" torch.stack([torch.nn.functional.pad(torch.tensor(t),(0,l-len(t)),mode='constant',value=0) for t in v])\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
"train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=16, collate_fn=padify, shuffle=True)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Entra├оner le classificateur d'embedding\n",
|
||||
"\n",
|
||||
"Maintenant que nous avons d├йfini un dataloader appropri├й, nous pouvons entra├оner le mod├иle en utilisant la fonction d'entra├оnement que nous avons d├йfinie dans l'unit├й pr├йc├йdente :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"3200: acc=0.6415625\n",
|
||||
"6400: acc=0.6865625\n",
|
||||
"9600: acc=0.7103125\n",
|
||||
"12800: acc=0.726953125\n",
|
||||
"16000: acc=0.739375\n",
|
||||
"19200: acc=0.75046875\n",
|
||||
"22400: acc=0.7572321428571429\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(0.889799795315499, 0.7623160588611644)"
|
||||
]
|
||||
},
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"net = EmbedClassifier(vocab_size,32,len(classes)).to(device)\n",
|
||||
"train_epoch(net,train_loader, lr=1, epoch_size=25000)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **Note** : Nous n'entra├оnons ici que sur 25 000 enregistrements (moins d'une ├йpoque compl├иte) pour gagner du temps, mais vous pouvez continuer l'entra├оnement, ├йcrire une fonction pour entra├оner sur plusieurs ├йpoques, et exp├йrimenter avec le param├иtre de taux d'apprentissage pour atteindre une meilleure pr├йcision. Vous devriez pouvoir atteindre une pr├йcision d'environ 90 %.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Couche EmbeddingBag et Repr├йsentation de S├йquences de Longueur Variable\n",
|
||||
"\n",
|
||||
"Dans l'architecture pr├йc├йdente, nous devions compl├йter toutes les s├йquences pour qu'elles aient la m├кme longueur afin de les int├йgrer dans un minibatch. Ce n'est pas la mani├иre la plus efficace de repr├йsenter des s├йquences de longueur variable - une autre approche consiste ├а utiliser un vecteur **offset**, qui contient les d├йcalages de toutes les s├йquences stock├йes dans un grand vecteur unique.\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"> **Note** : Sur l'image ci-dessus, nous montrons une s├йquence de caract├иres, mais dans notre exemple, nous travaillons avec des s├йquences de mots. Cependant, le principe g├йn├йral de repr├йsentation des s├йquences avec un vecteur de d├йcalage reste le m├кme.\n",
|
||||
"\n",
|
||||
"Pour travailler avec la repr├йsentation par d├йcalage, nous utilisons la couche [`EmbeddingBag`](https://pytorch.org/docs/stable/generated/torch.nn.EmbeddingBag.html). Elle est similaire ├а `Embedding`, mais elle prend un vecteur de contenu et un vecteur de d├йcalage en entr├йe, et inclut ├йgalement une couche de moyennage, qui peut ├кtre `mean`, `sum` ou `max`.\n",
|
||||
"\n",
|
||||
"Voici un r├йseau modifi├й qui utilise `EmbeddingBag` :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class EmbedClassifier(torch.nn.Module):\n",
|
||||
" def __init__(self, vocab_size, embed_dim, num_class):\n",
|
||||
" super().__init__()\n",
|
||||
" self.embedding = torch.nn.EmbeddingBag(vocab_size, embed_dim)\n",
|
||||
" self.fc = torch.nn.Linear(embed_dim, num_class)\n",
|
||||
"\n",
|
||||
" def forward(self, text, off):\n",
|
||||
" x = self.embedding(text, off)\n",
|
||||
" return self.fc(x)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Pour pr├йparer le jeu de donn├йes pour l'entra├оnement, nous devons fournir une fonction de conversion qui pr├йparera le vecteur de d├йcalage :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def offsetify(b):\n",
|
||||
" # first, compute data tensor from all sequences\n",
|
||||
" x = [torch.tensor(encode(t[1])) for t in b]\n",
|
||||
" # now, compute the offsets by accumulating the tensor of sequence lengths\n",
|
||||
" o = [0] + [len(t) for t in x]\n",
|
||||
" o = torch.tensor(o[:-1]).cumsum(dim=0)\n",
|
||||
" return ( \n",
|
||||
" torch.LongTensor([t[0]-1 for t in b]), # labels\n",
|
||||
" torch.cat(x), # text \n",
|
||||
" o\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
"train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=16, collate_fn=offsetify, shuffle=True)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Notez que, contrairement ├а tous les exemples pr├йc├йdents, notre r├йseau accepte d├йsormais deux param├иtres : le vecteur de donn├йes et le vecteur de d├йcalage, qui sont de tailles diff├йrentes. De m├кme, notre chargeur de donn├йes nous fournit ├йgalement 3 valeurs au lieu de 2 : les vecteurs de texte et de d├йcalage sont fournis comme caract├йristiques. Par cons├йquent, nous devons l├йg├иrement ajuster notre fonction d'entra├оnement pour en tenir compte :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"3200: acc=0.6153125\n",
|
||||
"6400: acc=0.6615625\n",
|
||||
"9600: acc=0.6932291666666667\n",
|
||||
"12800: acc=0.715078125\n",
|
||||
"16000: acc=0.7270625\n",
|
||||
"19200: acc=0.7382291666666667\n",
|
||||
"22400: acc=0.7486160714285715\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(22.771553103007037, 0.7551983365323096)"
|
||||
]
|
||||
},
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"net = EmbedClassifier(vocab_size,32,len(classes)).to(device)\n",
|
||||
"\n",
|
||||
"def train_epoch_emb(net,dataloader,lr=0.01,optimizer=None,loss_fn = torch.nn.CrossEntropyLoss(),epoch_size=None, report_freq=200):\n",
|
||||
" optimizer = optimizer or torch.optim.Adam(net.parameters(),lr=lr)\n",
|
||||
" loss_fn = loss_fn.to(device)\n",
|
||||
" net.train()\n",
|
||||
" total_loss,acc,count,i = 0,0,0,0\n",
|
||||
" for labels,text,off in dataloader:\n",
|
||||
" optimizer.zero_grad()\n",
|
||||
" labels,text,off = labels.to(device), text.to(device), off.to(device)\n",
|
||||
" out = net(text, off)\n",
|
||||
" loss = loss_fn(out,labels) #cross_entropy(out,labels)\n",
|
||||
" loss.backward()\n",
|
||||
" optimizer.step()\n",
|
||||
" total_loss+=loss\n",
|
||||
" _,predicted = torch.max(out,1)\n",
|
||||
" acc+=(predicted==labels).sum()\n",
|
||||
" count+=len(labels)\n",
|
||||
" i+=1\n",
|
||||
" if i%report_freq==0:\n",
|
||||
" print(f\"{count}: acc={acc.item()/count}\")\n",
|
||||
" if epoch_size and count>epoch_size:\n",
|
||||
" break\n",
|
||||
" return total_loss.item()/count, acc.item()/count\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"train_epoch_emb(net,train_loader, lr=4, epoch_size=25000)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Int├йgrations S├йmantiques : Word2Vec\n",
|
||||
"\n",
|
||||
"Dans notre exemple pr├йc├йdent, la couche d'int├йgration du mod├иle a appris ├а mapper des mots ├а une repr├йsentation vectorielle, mais cette repr├йsentation n'avait pas beaucoup de signification s├йmantique. Ce serait int├йressant d'apprendre une telle repr├йsentation vectorielle o├╣ des mots similaires ou des synonymes correspondraient ├а des vecteurs proches les uns des autres en termes de distance vectorielle (par exemple, distance euclidienne).\n",
|
||||
"\n",
|
||||
"Pour cela, nous devons pr├й-entra├оner notre mod├иle d'int├йgration sur une grande collection de textes d'une mani├иre sp├йcifique. L'une des premi├иres m├йthodes pour entra├оner des int├йgrations s├йmantiques s'appelle [Word2Vec](https://en.wikipedia.org/wiki/Word2vec). Elle repose sur deux principales architectures utilis├йes pour produire une repr├йsentation distribu├йe des mots :\n",
|
||||
"\n",
|
||||
" - **Sac de mots continu** (CBoW) тАФ dans cette architecture, nous entra├оnons le mod├иle ├а pr├йdire un mot ├а partir du contexte environnant. ├Йtant donn├й le ngram $(W_{-2},W_{-1},W_0,W_1,W_2)$, l'objectif du mod├иle est de pr├йdire $W_0$ ├а partir de $(W_{-2},W_{-1},W_1,W_2)$.\n",
|
||||
" - **Skip-gram continu** est l'oppos├й du CBoW. Le mod├иle utilise une fen├кtre de mots contextuels environnants pour pr├йdire le mot actuel.\n",
|
||||
"\n",
|
||||
"CBoW est plus rapide, tandis que skip-gram est plus lent, mais il repr├йsente mieux les mots peu fr├йquents.\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"Pour exp├йrimenter avec l'int├йgration Word2Vec pr├й-entra├оn├йe sur le jeu de donn├йes Google News, nous pouvons utiliser la biblioth├иque **gensim**. Ci-dessous, nous trouvons les mots les plus similaires ├а 'neural'.\n",
|
||||
"\n",
|
||||
"> **Note :** Lorsque vous cr├йez des vecteurs de mots pour la premi├иre fois, leur t├йl├йchargement peut prendre un certain temps !\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import gensim.downloader as api\n",
|
||||
"w2v = api.load('word2vec-google-news-300')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"neuronal -> 0.7804799675941467\n",
|
||||
"neurons -> 0.7326500415802002\n",
|
||||
"neural_circuits -> 0.7252851724624634\n",
|
||||
"neuron -> 0.7174385190010071\n",
|
||||
"cortical -> 0.6941086649894714\n",
|
||||
"brain_circuitry -> 0.6923246383666992\n",
|
||||
"synaptic -> 0.6699118614196777\n",
|
||||
"neural_circuitry -> 0.6638563275337219\n",
|
||||
"neurochemical -> 0.6555314064025879\n",
|
||||
"neuronal_activity -> 0.6531826257705688\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"for w,p in w2v.most_similar('neural'):\n",
|
||||
" print(f\"{w} -> {p}\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Nous pouvons ├йgalement calculer des embeddings de vecteurs ├а partir du mot, ├а utiliser dans l'entra├оnement du mod├иle de classification (nous montrons uniquement les 20 premiers composants du vecteur pour plus de clart├й) :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"array([ 0.01226807, 0.06225586, 0.10693359, 0.05810547, 0.23828125,\n",
|
||||
" 0.03686523, 0.05151367, -0.20703125, 0.01989746, 0.10058594,\n",
|
||||
" -0.03759766, -0.1015625 , -0.15820312, -0.08105469, -0.0390625 ,\n",
|
||||
" -0.05053711, 0.16015625, 0.2578125 , 0.10058594, -0.25976562],\n",
|
||||
" dtype=float32)"
|
||||
]
|
||||
},
|
||||
"execution_count": 10,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"w2v.word_vec('play')[:20]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"La grande chose ├а propos des embeddings s├йmantiques est que vous pouvez manipuler l'encodage vectoriel pour changer la s├йmantique. Par exemple, nous pouvons demander de trouver un mot dont la repr├йsentation vectorielle serait aussi proche que possible des mots *roi* et *femme*, et aussi ├йloign├йe que possible du mot *homme* :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"('queen', 0.7118192911148071)"
|
||||
]
|
||||
},
|
||||
"execution_count": 10,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"w2v.most_similar(positive=['king','woman'],negative=['man'])[0]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Les mod├иles CBoW et Skip-Grams sont des embeddings dits \"pr├йdictifs\", car ils ne prennent en compte que les contextes locaux. Word2Vec ne tire pas parti du contexte global.\n",
|
||||
"\n",
|
||||
"**FastText** s'appuie sur Word2Vec en apprenant des repr├йsentations vectorielles pour chaque mot ainsi que pour les n-grammes de caract├иres pr├йsents dans chaque mot. Les valeurs de ces repr├йsentations sont ensuite moyenn├йes en un seul vecteur ├а chaque ├йtape d'entra├оnement. Bien que cela ajoute beaucoup de calculs suppl├йmentaires lors de la pr├й-formation, cela permet aux embeddings de mots d'int├йgrer des informations sur les sous-mots.\n",
|
||||
"\n",
|
||||
"Une autre m├йthode, **GloVe**, exploite l'id├йe de matrice de cooccurrence et utilise des m├йthodes neuronales pour d├йcomposer cette matrice en vecteurs de mots plus expressifs et non lin├йaires.\n",
|
||||
"\n",
|
||||
"Vous pouvez exp├йrimenter avec cet exemple en changeant les embeddings pour FastText et GloVe, car gensim prend en charge plusieurs mod├иles d'embeddings de mots diff├йrents.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Utilisation des embeddings pr├й-entra├оn├йs dans PyTorch\n",
|
||||
"\n",
|
||||
"Nous pouvons modifier l'exemple ci-dessus pour pr├й-remplir la matrice de notre couche d'embedding avec des embeddings s├йmantiques, comme Word2Vec. Il faut tenir compte du fait que les vocabulaires des embeddings pr├й-entra├оn├йs et de notre corpus de texte ne correspondront probablement pas, donc nous initialiserons les poids des mots manquants avec des valeurs al├йatoires :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"metadata": {
|
||||
"tags": []
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Embedding size: 300\n",
|
||||
"Populating matrix, this will take some time...Done, found 41080 words, 54732 words missing\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"embed_size = len(w2v.get_vector('hello'))\n",
|
||||
"print(f'Embedding size: {embed_size}')\n",
|
||||
"\n",
|
||||
"net = EmbedClassifier(vocab_size,embed_size,len(classes))\n",
|
||||
"\n",
|
||||
"print('Populating matrix, this will take some time...',end='')\n",
|
||||
"found, not_found = 0,0\n",
|
||||
"for i,w in enumerate(vocab.get_itos()):\n",
|
||||
" try:\n",
|
||||
" net.embedding.weight[i].data = torch.tensor(w2v.get_vector(w))\n",
|
||||
" found+=1\n",
|
||||
" except:\n",
|
||||
" net.embedding.weight[i].data = torch.normal(0.0,1.0,(embed_size,))\n",
|
||||
" not_found+=1\n",
|
||||
"\n",
|
||||
"print(f\"Done, found {found} words, {not_found} words missing\")\n",
|
||||
"net = net.to(device)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Maintenant, entra├оnons notre mod├иle. Notez que le temps n├йcessaire pour entra├оner le mod├иle est significativement plus long que dans l'exemple pr├йc├йdent, en raison de la taille plus importante de la couche d'embedding, et donc d'un nombre de param├иtres beaucoup plus ├йlev├й. De plus, ├а cause de cela, nous pourrions avoir besoin d'entra├оner notre mod├иle sur davantage d'exemples si nous voulons ├йviter le surapprentissage.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 12,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"3200: acc=0.6359375\n",
|
||||
"6400: acc=0.68109375\n",
|
||||
"9600: acc=0.7067708333333333\n",
|
||||
"12800: acc=0.723671875\n",
|
||||
"16000: acc=0.73625\n",
|
||||
"19200: acc=0.7463541666666667\n",
|
||||
"22400: acc=0.7560714285714286\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(214.1013875559821, 0.7626759436980166)"
|
||||
]
|
||||
},
|
||||
"execution_count": 12,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"train_epoch_emb(net,train_loader, lr=4, epoch_size=25000)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Dans notre cas, nous ne constatons pas une augmentation significative de la pr├йcision, ce qui est probablement d├╗ ├а des vocabulaires tr├иs diff├йrents. \n",
|
||||
"Pour surmonter le probl├иme des vocabulaires diff├йrents, nous pouvons utiliser l'une des solutions suivantes : \n",
|
||||
"* R├йentra├оner le mod├иle word2vec sur notre vocabulaire \n",
|
||||
"* Charger notre jeu de donn├йes avec le vocabulaire du mod├иle word2vec pr├й-entra├оn├й. Le vocabulaire utilis├й pour charger le jeu de donn├йes peut ├кtre sp├йcifi├й lors du chargement. \n",
|
||||
"\n",
|
||||
"La deuxi├иme approche semble plus simple, surtout parce que le framework `torchtext` de PyTorch contient un support int├йgr├й pour les embeddings. Nous pouvons, par exemple, instancier un vocabulaire bas├й sur GloVe de la mani├иre suivante : \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 14,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"100%|тЦИтЦИтЦИтЦИтЦИтЦИтЦИтЦИтЦИтЦЙ| 399999/400000 [00:15<00:00, 25411.14it/s]\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"vocab = torchtext.vocab.GloVe(name='6B', dim=50)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Le vocabulaire charg├й propose les op├йrations de base suivantes : \n",
|
||||
"* Le dictionnaire `vocab.stoi` nous permet de convertir un mot en son index dans le dictionnaire. \n",
|
||||
"* `vocab.itos` fait l'inverse - il convertit un num├йro en mot. \n",
|
||||
"* `vocab.vectors` est le tableau des vecteurs d'embedding, donc pour obtenir l'embedding d'un mot `s`, nous devons utiliser `vocab.vectors[vocab.stoi[s]]`. \n",
|
||||
"\n",
|
||||
"Voici un exemple de manipulation des embeddings pour d├йmontrer l'├йquation **kind-man+woman = queen** (j'ai d├╗ ajuster l├йg├иrement le coefficient pour que cela fonctionne) : \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 15,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"'queen'"
|
||||
]
|
||||
},
|
||||
"execution_count": 15,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# get the vector corresponding to kind-man+woman\n",
|
||||
"qvec = vocab.vectors[vocab.stoi['king']]-vocab.vectors[vocab.stoi['man']]+1.3*vocab.vectors[vocab.stoi['woman']]\n",
|
||||
"# find the index of the closest embedding vector \n",
|
||||
"d = torch.sum((vocab.vectors-qvec)**2,dim=1)\n",
|
||||
"min_idx = torch.argmin(d)\n",
|
||||
"# find the corresponding word\n",
|
||||
"vocab.itos[min_idx]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Pour entra├оner le classificateur en utilisant ces embeddings, nous devons d'abord encoder notre ensemble de donn├йes en utilisant le vocabulaire GloVe :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 16,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def offsetify(b):\n",
|
||||
" # first, compute data tensor from all sequences\n",
|
||||
" x = [torch.tensor(encode(t[1],voc=vocab)) for t in b] # pass the instance of vocab to encode function!\n",
|
||||
" # now, compute the offsets by accumulating the tensor of sequence lengths\n",
|
||||
" o = [0] + [len(t) for t in x]\n",
|
||||
" o = torch.tensor(o[:-1]).cumsum(dim=0)\n",
|
||||
" return ( \n",
|
||||
" torch.LongTensor([t[0]-1 for t in b]), # labels\n",
|
||||
" torch.cat(x), # text \n",
|
||||
" o\n",
|
||||
" )"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Comme nous l'avons vu ci-dessus, toutes les repr├йsentations vectorielles sont stock├йes dans la matrice `vocab.vectors`. Cela rend extr├кmement facile de charger ces poids dans les poids de la couche d'embedding en utilisant une simple copie :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 17,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"net = EmbedClassifier(len(vocab),len(vocab.vectors[0]),len(classes))\n",
|
||||
"net.embedding.weight.data = vocab.vectors\n",
|
||||
"net = net.to(device)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 18,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"3200: acc=0.6271875\n",
|
||||
"6400: acc=0.68078125\n",
|
||||
"9600: acc=0.7030208333333333\n",
|
||||
"12800: acc=0.71984375\n",
|
||||
"16000: acc=0.7346875\n",
|
||||
"19200: acc=0.7455729166666667\n",
|
||||
"22400: acc=0.7529464285714286\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(35.53972978646833, 0.7575175943698017)"
|
||||
]
|
||||
},
|
||||
"execution_count": 18,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=16, collate_fn=offsetify, shuffle=True)\n",
|
||||
"train_epoch_emb(net,train_loader, lr=4, epoch_size=25000)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Une des raisons pour lesquelles nous ne constatons pas d'augmentation significative de la pr├йcision est le fait que certains mots de notre ensemble de donn├йes sont absents du vocabulaire pr├й-entra├оn├й de GloVe, et sont donc essentiellement ignor├йs. Pour surmonter ce probl├иme, nous pouvons entra├оner nos propres embeddings sur notre ensemble de donn├йes.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Contextual Embeddings\n",
|
||||
"\n",
|
||||
"Une des principales limites des repr├йsentations d'embeddings pr├йentra├оn├йs traditionnels comme Word2Vec est le probl├иme de la d├йsambigu├пsation des sens des mots. Bien que les embeddings pr├йentra├оn├йs puissent capturer une partie du sens des mots dans un contexte donn├й, tous les sens possibles d'un mot sont encod├йs dans le m├кme embedding. Cela peut poser des probl├иmes dans les mod├иles en aval, car de nombreux mots, comme le mot \"play\", ont des significations diff├йrentes selon le contexte dans lequel ils sont utilis├йs.\n",
|
||||
"\n",
|
||||
"Par exemple, le mot \"play\" dans ces deux phrases a des significations tr├иs diff├йrentes :\n",
|
||||
"- Je suis all├й voir une **pi├иce** au th├й├вtre.\n",
|
||||
"- John veut **jouer** avec ses amis.\n",
|
||||
"\n",
|
||||
"Les embeddings pr├йentra├оn├йs ci-dessus repr├йsentent ces deux significations du mot \"play\" dans le m├кme embedding. Pour surmonter cette limitation, nous devons construire des embeddings bas├йs sur le **mod├иle de langage**, qui est entra├оn├й sur un large corpus de texte et *comprend* comment les mots peuvent ├кtre assembl├йs dans diff├йrents contextes. La discussion sur les embeddings contextuels d├йpasse le cadre de ce tutoriel, mais nous y reviendrons en abordant les mod├иles de langage dans la prochaine unit├й.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**Avertissement** : \nCe document a ├йt├й traduit ├а l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatis├йes peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit ├кtre consid├йr├й comme la source faisant autorit├й. Pour des informations critiques, il est recommand├й de recourir ├а une traduction professionnelle r├йalis├йe par un humain. Nous d├йclinons toute responsabilit├й en cas de malentendus ou d'interpr├йtations erron├йes r├йsultant de l'utilisation de cette traduction.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"interpreter": {
|
||||
"hash": "0cb620c6d4b9f7a635928804c26cf22403d89d98d79684e4529119355ee6d5a5"
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "py37_pytorch",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.8.12"
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "f50b026abce5cf36783a560ea72cb9b1",
|
||||
"translation_date": "2025-08-31T15:27:23+00:00",
|
||||
"source_file": "lessons/5-NLP/14-Embeddings/EmbeddingsPyTorch.ipynb",
|
||||
"language_code": "fr"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
|
|
@ -0,0 +1,695 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Int├йgrations\n",
|
||||
"\n",
|
||||
"Dans notre exemple pr├йc├йdent, nous avons travaill├й avec des vecteurs bag-of-words de haute dimension de longueur `vocab_size`, et nous avons explicitement converti des vecteurs de repr├йsentation positionnelle de basse dimension en une repr├йsentation clairsem├йe ├а un seul bit actif. Cette repr├йsentation ├а un seul bit actif n'est pas efficace en termes de m├йmoire. De plus, chaque mot est trait├й ind├йpendamment des autres, ce qui fait que les vecteurs encod├йs de cette mani├иre ne refl├иtent pas les similitudes s├йmantiques entre les mots.\n",
|
||||
"\n",
|
||||
"Dans cette unit├й, nous continuerons ├а explorer le dataset **News AG**. Pour commencer, chargeons les donn├йes et r├йcup├йrons quelques d├йfinitions de l'unit├й pr├йc├йdente.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import tensorflow as tf\n",
|
||||
"from tensorflow import keras\n",
|
||||
"import tensorflow_datasets as tfds\n",
|
||||
"import numpy as np\n",
|
||||
"\n",
|
||||
"ds_train, ds_test = tfds.load('ag_news_subset').values()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Qu'est-ce qu'un embedding ?\n",
|
||||
"\n",
|
||||
"L'id├йe d'un **embedding** est de repr├йsenter les mots ├а l'aide de vecteurs denses de dimension inf├йrieure qui refl├иtent le sens s├йmantique du mot. Nous verrons plus tard comment construire des embeddings de mots significatifs, mais pour l'instant, consid├йrons simplement les embeddings comme un moyen de r├йduire la dimensionnalit├й d'un vecteur de mots.\n",
|
||||
"\n",
|
||||
"Ainsi, une couche d'embedding prend un mot en entr├йe et produit un vecteur de sortie de taille `embedding_size`. En un sens, cela ressemble beaucoup ├а une couche `Dense`, mais au lieu de prendre un vecteur one-hot encod├й en entr├йe, elle peut prendre un num├йro de mot.\n",
|
||||
"\n",
|
||||
"En utilisant une couche d'embedding comme premi├иre couche de notre r├йseau, nous pouvons passer d'un mod├иle bag-of-words ├а un mod├иle **embedding bag**, o├╣ nous convertissons d'abord chaque mot de notre texte en l'embedding correspondant, puis calculons une fonction d'agr├йgation sur tous ces embeddings, comme `sum`, `average` ou `max`.\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"Notre r├йseau de neurones classificateur se compose des couches suivantes :\n",
|
||||
"\n",
|
||||
"* Une couche `TextVectorization`, qui prend une cha├оne de caract├иres en entr├йe et produit un tenseur de num├йros de tokens. Nous sp├йcifierons une taille de vocabulaire raisonnable `vocab_size` et ignorerons les mots moins fr├йquemment utilis├йs. La forme d'entr├йe sera 1, et la forme de sortie sera $n$, car nous obtiendrons $n$ tokens en r├йsultat, chacun contenant des num├йros allant de 0 ├а `vocab_size`.\n",
|
||||
"* Une couche `Embedding`, qui prend $n$ num├йros et r├йduit chaque num├йro ├а un vecteur dense d'une longueur donn├йe (100 dans notre exemple). Ainsi, le tenseur d'entr├йe de forme $n$ sera transform├й en un tenseur de forme $n\\times 100$.\n",
|
||||
"* Une couche d'agr├йgation, qui calcule la moyenne de ce tenseur le long du premier axe, c'est-├а-dire qu'elle calculera la moyenne de tous les $n$ tenseurs d'entr├йe correspondant ├а diff├йrents mots. Pour impl├йmenter cette couche, nous utiliserons une couche `Lambda` et lui passerons la fonction pour calculer la moyenne. La sortie aura une forme de 100, et ce sera la repr├йsentation num├йrique de toute la s├йquence d'entr├йe.\n",
|
||||
"* Enfin, un classificateur lin├йaire `Dense`.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Model: \"sequential\"\n",
|
||||
"_________________________________________________________________\n",
|
||||
" Layer (type) Output Shape Param # \n",
|
||||
"=================================================================\n",
|
||||
" text_vectorization (TextVec (None, None) 0 \n",
|
||||
" torization) \n",
|
||||
" \n",
|
||||
" embedding (Embedding) (None, None, 100) 3000000 \n",
|
||||
" \n",
|
||||
" lambda (Lambda) (None, 100) 0 \n",
|
||||
" \n",
|
||||
" dense (Dense) (None, 4) 404 \n",
|
||||
" \n",
|
||||
"=================================================================\n",
|
||||
"Total params: 3,000,404\n",
|
||||
"Trainable params: 3,000,404\n",
|
||||
"Non-trainable params: 0\n",
|
||||
"_________________________________________________________________\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"vocab_size = 30000\n",
|
||||
"batch_size = 128\n",
|
||||
"\n",
|
||||
"vectorizer = keras.layers.experimental.preprocessing.TextVectorization(max_tokens=vocab_size,input_shape=(1,))\n",
|
||||
"\n",
|
||||
"model = keras.models.Sequential([\n",
|
||||
" vectorizer, \n",
|
||||
" keras.layers.Embedding(vocab_size,100),\n",
|
||||
" keras.layers.Lambda(lambda x: tf.reduce_mean(x,axis=1)),\n",
|
||||
" keras.layers.Dense(4, activation='softmax')\n",
|
||||
"])\n",
|
||||
"model.summary()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Dans le r├йsum├й, dans la colonne **forme de sortie**, la premi├иre dimension du tenseur `None` correspond ├а la taille du lot (minibatch), et la seconde correspond ├а la longueur de la s├йquence de tokens. Toutes les s├йquences de tokens dans le lot ont des longueurs diff├йrentes. Nous verrons comment g├йrer cela dans la section suivante.\n",
|
||||
"\n",
|
||||
"Passons maintenant ├а l'entra├оnement du r├йseau :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Training vectorizer\n",
|
||||
"938/938 [==============================] - 20s 20ms/step - loss: 0.7891 - acc: 0.8155 - val_loss: 0.4470 - val_acc: 0.8642\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<keras.callbacks.History at 0x22255515100>"
|
||||
]
|
||||
},
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def extract_text(x):\n",
|
||||
" return x['title']+' '+x['description']\n",
|
||||
"\n",
|
||||
"def tupelize(x):\n",
|
||||
" return (extract_text(x),x['label'])\n",
|
||||
"\n",
|
||||
"print(\"Training vectorizer\")\n",
|
||||
"vectorizer.adapt(ds_train.take(500).map(extract_text))\n",
|
||||
"\n",
|
||||
"model.compile(loss='sparse_categorical_crossentropy',metrics=['acc'])\n",
|
||||
"model.fit(ds_train.map(tupelize).batch(batch_size),validation_data=ds_test.map(tupelize).batch(batch_size))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"nteract": {
|
||||
"transient": {
|
||||
"deleting": false
|
||||
}
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"> **Note** que nous construisons un vectoriseur bas├й sur un sous-ensemble des donn├йes. Cela est fait afin d'acc├йl├йrer le processus, et cela pourrait entra├оner une situation o├╣ tous les tokens de notre texte ne sont pas pr├йsents dans le vocabulaire. Dans ce cas, ces tokens seraient ignor├йs, ce qui pourrait entra├оner une pr├йcision l├йg├иrement inf├йrieure. Cependant, dans la r├йalit├й, un sous-ensemble de texte donne souvent une bonne estimation du vocabulaire.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Gestion des tailles de s├йquences de variables\n",
|
||||
"\n",
|
||||
"Comprenons comment l'entra├оnement se d├йroule dans les mini-lots. Dans l'exemple ci-dessus, le tenseur d'entr├йe a une dimension de 1, et nous utilisons des mini-lots de taille 128, ce qui donne une taille r├йelle du tenseur de $128 \\times 1$. Cependant, le nombre de tokens dans chaque phrase est diff├йrent. Si nous appliquons la couche `TextVectorization` ├а une seule entr├йe, le nombre de tokens retourn├йs varie en fonction de la mani├иre dont le texte est tokenis├й :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"tf.Tensor([ 1 45], shape=(2,), dtype=int64)\n",
|
||||
"tf.Tensor([ 112 1271 1 3 1747 158], shape=(6,), dtype=int64)\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"print(vectorizer('Hello, world!'))\n",
|
||||
"print(vectorizer('I am glad to meet you!'))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Cependant, lorsque nous appliquons le vectoriseur ├а plusieurs s├йquences, il doit produire un tenseur de forme rectangulaire, donc il remplit les ├йl├йments inutilis├йs avec le jeton PAD (qui dans notre cas est z├йro) :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<tf.Tensor: shape=(2, 6), dtype=int64, numpy=\n",
|
||||
"array([[ 1, 45, 0, 0, 0, 0],\n",
|
||||
" [ 112, 1271, 1, 3, 1747, 158]], dtype=int64)>"
|
||||
]
|
||||
},
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"vectorizer(['Hello, world!','I am glad to meet you!'])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Voici les incorporations :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"array([[[ 1.53059261e-02, 6.80514947e-02, 3.14026810e-02, ...,\n",
|
||||
" -8.92002955e-02, 1.52911525e-04, -5.65562584e-02],\n",
|
||||
" [ 2.57456154e-01, 2.79364467e-01, -2.03605562e-01, ...,\n",
|
||||
" -2.07474351e-01, 8.31158683e-02, -2.03911960e-01],\n",
|
||||
" [ 3.98201384e-02, -8.03454965e-03, 2.39790026e-02, ...,\n",
|
||||
" -7.18549127e-04, 2.66963355e-02, -4.30646613e-02],\n",
|
||||
" [ 3.98201384e-02, -8.03454965e-03, 2.39790026e-02, ...,\n",
|
||||
" -7.18549127e-04, 2.66963355e-02, -4.30646613e-02],\n",
|
||||
" [ 3.98201384e-02, -8.03454965e-03, 2.39790026e-02, ...,\n",
|
||||
" -7.18549127e-04, 2.66963355e-02, -4.30646613e-02],\n",
|
||||
" [ 3.98201384e-02, -8.03454965e-03, 2.39790026e-02, ...,\n",
|
||||
" -7.18549127e-04, 2.66963355e-02, -4.30646613e-02]],\n",
|
||||
"\n",
|
||||
" [[ 1.89674050e-01, 2.61548996e-01, -3.67433839e-02, ...,\n",
|
||||
" -2.07366899e-01, -1.05442435e-01, -2.36952081e-01],\n",
|
||||
" [ 6.16133213e-02, 1.80511594e-01, 9.77298319e-02, ...,\n",
|
||||
" -5.46628237e-02, -1.07340455e-01, -1.06589928e-01],\n",
|
||||
" [ 1.53059261e-02, 6.80514947e-02, 3.14026810e-02, ...,\n",
|
||||
" -8.92002955e-02, 1.52911525e-04, -5.65562584e-02],\n",
|
||||
" [-4.84890305e-02, -8.41715634e-02, 1.51529670e-01, ...,\n",
|
||||
" 1.28192469e-01, -7.77286515e-02, 1.26041949e-01],\n",
|
||||
" [-4.17212099e-02, -5.60694858e-02, 4.08860669e-02, ...,\n",
|
||||
" 8.70475471e-02, 8.92383084e-02, 1.67974353e-01],\n",
|
||||
" [ 2.85779923e-01, 4.57767487e-01, 4.52292450e-02, ...,\n",
|
||||
" -1.97419018e-01, -2.04659685e-01, -2.79758364e-01]]],\n",
|
||||
" dtype=float32)"
|
||||
]
|
||||
},
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"model.layers[1](vectorizer(['Hello, world!','I am glad to meet you!'])).numpy()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **Remarque** : Pour minimiser la quantit├й de remplissage, il peut ├кtre judicieux dans certains cas de trier toutes les s├йquences du jeu de donn├йes par ordre croissant de longueur (ou, plus pr├йcis├йment, par nombre de tokens). Cela garantira que chaque minibatch contient des s├йquences de longueur similaire.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Incrustations s├йmantiques : Word2Vec\n",
|
||||
"\n",
|
||||
"Dans notre exemple pr├йc├йdent, la couche d'incrustation a appris ├а mapper des mots ├а des repr├йsentations vectorielles, mais ces repr├йsentations n'avaient pas de signification s├йmantique. Il serait int├йressant d'apprendre une repr├йsentation vectorielle o├╣ des mots similaires ou des synonymes correspondent ├а des vecteurs proches les uns des autres selon une certaine distance vectorielle (par exemple, la distance euclidienne).\n",
|
||||
"\n",
|
||||
"Pour cela, nous devons pr├йentra├оner notre mod├иle d'incrustation sur une grande collection de textes en utilisant une technique telle que [Word2Vec](https://en.wikipedia.org/wiki/Word2vec). Cette m├йthode repose sur deux architectures principales utilis├йes pour produire une repr├йsentation distribu├йe des mots :\n",
|
||||
"\n",
|
||||
" - **Sac de mots continu** (CBoW), o├╣ l'on entra├оne le mod├иle ├а pr├йdire un mot ├а partir du contexte environnant. ├Йtant donn├й le ngram $(W_{-2},W_{-1},W_0,W_1,W_2)$, l'objectif du mod├иle est de pr├йdire $W_0$ ├а partir de $(W_{-2},W_{-1},W_1,W_2)$.\n",
|
||||
" - **Skip-gram continu**, qui est l'oppos├й du CBoW. Le mod├иle utilise la fen├кtre de mots du contexte environnant pour pr├йdire le mot actuel.\n",
|
||||
"\n",
|
||||
"CBoW est plus rapide, tandis que skip-gram, bien que plus lent, repr├йsente mieux les mots peu fr├йquents.\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"Pour exp├йrimenter avec l'incrustation Word2Vec pr├йentra├оn├йe sur le dataset Google News, nous pouvons utiliser la biblioth├иque **gensim**. Ci-dessous, nous trouvons les mots les plus similaires ├а 'neural'.\n",
|
||||
"\n",
|
||||
"> **Note:** Lorsque vous cr├йez des vecteurs de mots pour la premi├иre fois, leur t├йl├йchargement peut prendre un certain temps !\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import gensim.downloader as api\n",
|
||||
"w2v = api.load('word2vec-google-news-300')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 12,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"neuronal -> 0.7804799675941467\n",
|
||||
"neurons -> 0.7326500415802002\n",
|
||||
"neural_circuits -> 0.7252851724624634\n",
|
||||
"neuron -> 0.7174385190010071\n",
|
||||
"cortical -> 0.6941086649894714\n",
|
||||
"brain_circuitry -> 0.6923246383666992\n",
|
||||
"synaptic -> 0.6699118614196777\n",
|
||||
"neural_circuitry -> 0.6638563275337219\n",
|
||||
"neurochemical -> 0.6555314064025879\n",
|
||||
"neuronal_activity -> 0.6531826257705688\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"for w,p in w2v.most_similar('neural'):\n",
|
||||
" print(f\"{w} -> {p}\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Nous pouvons ├йgalement extraire l'incorporation vectorielle du mot, ├а utiliser dans l'entra├оnement du mod├иle de classification. L'incorporation comporte 300 composantes, mais ici nous montrons seulement les 20 premi├иres composantes du vecteur pour plus de clart├й :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 13,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"array([ 0.01226807, 0.06225586, 0.10693359, 0.05810547, 0.23828125,\n",
|
||||
" 0.03686523, 0.05151367, -0.20703125, 0.01989746, 0.10058594,\n",
|
||||
" -0.03759766, -0.1015625 , -0.15820312, -0.08105469, -0.0390625 ,\n",
|
||||
" -0.05053711, 0.16015625, 0.2578125 , 0.10058594, -0.25976562],\n",
|
||||
" dtype=float32)"
|
||||
]
|
||||
},
|
||||
"execution_count": 13,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"w2v['play'][:20]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"La grande particularit├й des embeddings s├йmantiques est que vous pouvez manipuler l'encodage vectoriel en fonction des s├йmantiques. Par exemple, nous pouvons demander de trouver un mot dont la repr├йsentation vectorielle est aussi proche que possible des mots *roi* et *femme*, et aussi ├йloign├йe que possible du mot *homme* :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 14,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"('queen', 0.7118192911148071)"
|
||||
]
|
||||
},
|
||||
"execution_count": 14,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"w2v.most_similar(positive=['king','woman'],negative=['man'])[0]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"tags": []
|
||||
},
|
||||
"source": [
|
||||
"Un exemple ci-dessus utilise une certaine magie interne de GenSym, mais la logique sous-jacente est en r├йalit├й assez simple. Une chose int├йressante ├а propos des embeddings est que vous pouvez effectuer des op├йrations vectorielles normales sur les vecteurs d'embedding, et cela refl├йterait des op├йrations sur les **significations** des mots. L'exemple ci-dessus peut ├кtre exprim├й en termes d'op├йrations vectorielles : nous calculons le vecteur correspondant ├а **ROI-HOMME+FEMME** (les op├йrations `+` et `-` sont effectu├йes sur les repr├йsentations vectorielles des mots correspondants), puis nous trouvons le mot le plus proche dans le dictionnaire de ce vecteur :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 15,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"'queen'"
|
||||
]
|
||||
},
|
||||
"execution_count": 15,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# get the vector corresponding to kind-man+woman\n",
|
||||
"qvec = w2v['king']-1.7*w2v['man']+1.7*w2v['woman']\n",
|
||||
"# find the index of the closest embedding vector \n",
|
||||
"d = np.sum((w2v.vectors-qvec)**2,axis=1)\n",
|
||||
"min_idx = np.argmin(d)\n",
|
||||
"# find the corresponding word\n",
|
||||
"w2v.index_to_key[min_idx]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **NOTE** : Nous avons d├╗ ajouter de petits coefficients aux vecteurs *homme* et *femme* - essayez de les supprimer pour voir ce qui se passe.\n",
|
||||
"\n",
|
||||
"Pour trouver le vecteur le plus proche, nous utilisons les outils de TensorFlow pour calculer un vecteur de distances entre notre vecteur et tous les vecteurs du vocabulaire, puis nous trouvons l'index du mot minimal en utilisant `argmin`.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Bien que Word2Vec semble ├кtre un excellent moyen d'exprimer la s├йmantique des mots, il pr├йsente de nombreux inconv├йnients, notamment les suivants :\n",
|
||||
"\n",
|
||||
"* Les mod├иles CBoW et skip-gram sont des **repr├йsentations pr├йdictives**, et ils ne prennent en compte que le contexte local. Word2Vec ne profite pas du contexte global.\n",
|
||||
"* Word2Vec ne prend pas en compte la **morphologie** des mots, c'est-├а-dire le fait que le sens d'un mot peut d├йpendre de diff├йrentes parties du mot, comme la racine.\n",
|
||||
"\n",
|
||||
"**FastText** tente de surmonter cette deuxi├иme limitation et s'appuie sur Word2Vec en apprenant des repr├йsentations vectorielles pour chaque mot ainsi que pour les n-grammes de caract├иres trouv├йs dans chaque mot. Les valeurs des repr├йsentations sont ensuite moyenn├йes en un seul vecteur ├а chaque ├йtape d'entra├оnement. Bien que cela ajoute beaucoup de calculs suppl├йmentaires lors de la pr├й-formation, cela permet aux repr├йsentations vectorielles d'int├йgrer des informations sur les sous-mots.\n",
|
||||
"\n",
|
||||
"Une autre m├йthode, **GloVe**, utilise une approche diff├йrente pour les repr├йsentations vectorielles, bas├йe sur la factorisation de la matrice mot-contexte. Tout d'abord, elle construit une grande matrice qui compte le nombre d'occurrences des mots dans diff├йrents contextes, puis elle tente de repr├йsenter cette matrice dans des dimensions inf├йrieures de mani├иre ├а minimiser la perte de reconstruction.\n",
|
||||
"\n",
|
||||
"La biblioth├иque gensim prend en charge ces repr├йsentations vectorielles, et vous pouvez les exp├йrimenter en modifiant le code de chargement du mod├иle ci-dessus.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Utiliser des embeddings pr├йentra├оn├йs dans Keras\n",
|
||||
"\n",
|
||||
"Nous pouvons modifier l'exemple ci-dessus pour pr├йremplir la matrice de notre couche d'embedding avec des embeddings s├йmantiques, tels que Word2Vec. Les vocabulaires de l'embedding pr├йentra├оn├й et du corpus de texte ne correspondront probablement pas, donc nous devons en choisir un. Ici, nous explorons les deux options possibles : utiliser le vocabulaire du tokenizer et utiliser le vocabulaire des embeddings Word2Vec.\n",
|
||||
"\n",
|
||||
"### Utiliser le vocabulaire du tokenizer\n",
|
||||
"\n",
|
||||
"En utilisant le vocabulaire du tokenizer, certains mots du vocabulaire auront des embeddings Word2Vec correspondants, tandis que d'autres seront absents. ├Йtant donn├й que la taille de notre vocabulaire est `vocab_size`, et que la longueur du vecteur d'embedding Word2Vec est `embed_size`, la couche d'embedding sera repr├йsent├йe par une matrice de poids de forme `vocab_size`$\\times$`embed_size`. Nous remplirons cette matrice en parcourant le vocabulaire :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"metadata": {
|
||||
"tags": []
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Embedding size: 300\n",
|
||||
"Populating matrix, this will take some time...Done, found 4551 words, 784 words missing\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"embed_size = len(w2v.get_vector('hello'))\n",
|
||||
"print(f'Embedding size: {embed_size}')\n",
|
||||
"\n",
|
||||
"vocab = vectorizer.get_vocabulary()\n",
|
||||
"W = np.zeros((vocab_size,embed_size))\n",
|
||||
"print('Populating matrix, this will take some time...',end='')\n",
|
||||
"found, not_found = 0,0\n",
|
||||
"for i,w in enumerate(vocab):\n",
|
||||
" try:\n",
|
||||
" W[i] = w2v.get_vector(w)\n",
|
||||
" found+=1\n",
|
||||
" except:\n",
|
||||
" # W[i] = np.random.normal(0.0,0.3,size=(embed_size,))\n",
|
||||
" not_found+=1\n",
|
||||
"\n",
|
||||
"print(f\"Done, found {found} words, {not_found} words missing\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Pour les mots qui ne sont pas pr├йsents dans le vocabulaire de Word2Vec, nous pouvons soit les laisser comme des z├йros, soit g├йn├йrer un vecteur al├йatoire.\n",
|
||||
"\n",
|
||||
"Nous pouvons maintenant d├йfinir une couche d'embedding avec des poids pr├йentra├оn├йs :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"emb = keras.layers.Embedding(vocab_size,embed_size,weights=[W],trainable=False)\n",
|
||||
"model = keras.models.Sequential([\n",
|
||||
" vectorizer, emb,\n",
|
||||
" keras.layers.Lambda(lambda x: tf.reduce_mean(x,axis=1)),\n",
|
||||
" keras.layers.Dense(4, activation='softmax')\n",
|
||||
"])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"938/938 [==============================] - 10s 10ms/step - loss: 1.1075 - acc: 0.7822 - val_loss: 0.9134 - val_acc: 0.8175\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<keras.callbacks.History at 0x2220226ef10>"
|
||||
]
|
||||
},
|
||||
"execution_count": 11,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"model.compile(loss='sparse_categorical_crossentropy',metrics=['acc'])\n",
|
||||
"model.fit(ds_train.map(tupelize).batch(batch_size),\n",
|
||||
" validation_data=ds_test.map(tupelize).batch(batch_size))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **Remarque** : Notez que nous avons d├йfini `trainable=False` lors de la cr├йation de `Embedding`, ce qui signifie que nous ne r├йentra├оnons pas la couche Embedding. Cela peut entra├оner une l├йg├иre baisse de pr├йcision, mais cela acc├йl├иre l'entra├оnement.\n",
|
||||
"\n",
|
||||
"### Utilisation du vocabulaire d'embedding\n",
|
||||
"\n",
|
||||
"Un probl├иme avec l'approche pr├йc├йdente est que les vocabulaires utilis├йs dans TextVectorization et Embedding sont diff├йrents. Pour r├йsoudre ce probl├иme, nous pouvons utiliser l'une des solutions suivantes :\n",
|
||||
"* R├йentra├оner le mod├иle Word2Vec sur notre vocabulaire.\n",
|
||||
"* Charger notre jeu de donn├йes avec le vocabulaire du mod├иle Word2Vec pr├йentra├оn├й. Les vocabulaires utilis├йs pour charger le jeu de donn├йes peuvent ├кtre sp├йcifi├йs lors du chargement.\n",
|
||||
"\n",
|
||||
"La deuxi├иme approche semble plus simple, alors mettons-la en ┼Уuvre. Tout d'abord, nous allons cr├йer une couche `TextVectorization` avec le vocabulaire sp├йcifi├й, tir├й des embeddings Word2Vec :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 12,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"vocab = list(w2v.vocab.keys())\n",
|
||||
"vectorizer = keras.layers.experimental.preprocessing.TextVectorization(input_shape=(1,))\n",
|
||||
"vectorizer.set_vocabulary(vocab)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"La biblioth├иque d'embeddings de mots gensim contient une fonction pratique, `get_keras_embeddings`, qui cr├йera automatiquement la couche d'embeddings Keras correspondante pour vous.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 13,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Epoch 1/5\n",
|
||||
"938/938 [==============================] - 20s 14ms/step - loss: 1.3377 - acc: 0.4978 - val_loss: 1.2995 - val_acc: 0.5647\n",
|
||||
"Epoch 2/5\n",
|
||||
"938/938 [==============================] - 10s 10ms/step - loss: 1.2587 - acc: 0.5722 - val_loss: 1.2339 - val_acc: 0.5842\n",
|
||||
"Epoch 3/5\n",
|
||||
"938/938 [==============================] - 10s 10ms/step - loss: 1.1980 - acc: 0.5884 - val_loss: 1.1826 - val_acc: 0.5954\n",
|
||||
"Epoch 4/5\n",
|
||||
"938/938 [==============================] - 12s 13ms/step - loss: 1.1503 - acc: 0.6002 - val_loss: 1.1417 - val_acc: 0.6018\n",
|
||||
"Epoch 5/5\n",
|
||||
"938/938 [==============================] - 11s 12ms/step - loss: 1.1120 - acc: 0.6097 - val_loss: 1.1083 - val_acc: 0.6104\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<keras.callbacks.History at 0x2220ccb81c0>"
|
||||
]
|
||||
},
|
||||
"execution_count": 13,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"model = keras.models.Sequential([\n",
|
||||
" vectorizer, \n",
|
||||
" w2v.get_keras_embedding(train_embeddings=False),\n",
|
||||
" keras.layers.Lambda(lambda x: tf.reduce_mean(x,axis=1)),\n",
|
||||
" keras.layers.Dense(4, activation='softmax')\n",
|
||||
"])\n",
|
||||
"model.compile(loss='sparse_categorical_crossentropy',metrics=['acc'])\n",
|
||||
"model.fit(ds_train.map(tupelize).batch(128),validation_data=ds_test.map(tupelize).batch(128),epochs=5)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Une des raisons pour lesquelles nous n'observons pas une pr├йcision plus ├йlev├йe est que certains mots de notre ensemble de donn├йes sont absents du vocabulaire pr├йentra├оn├й de GloVe, et sont donc essentiellement ignor├йs. Pour surmonter cela, nous pouvons entra├оner nos propres embeddings bas├йs sur notre ensemble de donn├йes.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Les embeddings contextuels\n",
|
||||
"\n",
|
||||
"Une des principales limites des repr├йsentations d'embeddings pr├йentra├оn├йs traditionnels comme Word2Vec est qu'ils ne peuvent pas diff├йrencier les diff├йrents sens d'un mot, m├кme s'ils peuvent en capturer une partie de la signification. Cela peut poser des probl├иmes dans les mod├иles en aval.\n",
|
||||
"\n",
|
||||
"Par exemple, le mot \"play\" a des significations diff├йrentes dans ces deux phrases :\n",
|
||||
"- Je suis all├й voir une **pi├иce** au th├й├вtre.\n",
|
||||
"- John veut **jouer** avec ses amis.\n",
|
||||
"\n",
|
||||
"Les embeddings pr├йentra├оn├йs dont nous avons parl├й repr├йsentent les deux sens du mot \"play\" dans le m├кme embedding. Pour surmonter cette limitation, nous devons construire des embeddings bas├йs sur le **mod├иle de langage**, qui est entra├оn├й sur un large corpus de texte et *sait* comment les mots peuvent ├кtre assembl├йs dans diff├йrents contextes. Discuter des embeddings contextuels d├йpasse le cadre de ce tutoriel, mais nous y reviendrons en parlant des mod├иles de langage dans la prochaine unit├й.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**Avertissement** : \nCe document a ├йt├й traduit ├а l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatis├йes peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit ├кtre consid├йr├й comme la source faisant autorit├й. Pour des informations critiques, il est recommand├й de recourir ├а une traduction professionnelle r├йalis├йe par un humain. Nous d├йclinons toute responsabilit├й en cas de malentendus ou d'interpr├йtations erron├йes r├йsultant de l'utilisation de cette traduction.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"interpreter": {
|
||||
"hash": "0cb620c6d4b9f7a635928804c26cf22403d89d98d79684e4529119355ee6d5a5"
|
||||
},
|
||||
"kernel_info": {
|
||||
"name": "conda-env-py37_tensorflow-py"
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "py37_tensorflow",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.8.12"
|
||||
},
|
||||
"nteract": {
|
||||
"version": "nteract-front-end@1.0.0"
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "b859482be7f61d1eadc2c6a2720a37e4",
|
||||
"translation_date": "2025-08-31T15:25:15+00:00",
|
||||
"source_file": "lessons/5-NLP/14-Embeddings/EmbeddingsTF.ipynb",
|
||||
"language_code": "fr"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 4
|
||||
}
|
||||
|
|
@ -0,0 +1,576 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "NXTSugt6ieXh"
|
||||
},
|
||||
"source": [
|
||||
"## Entra├оner un mod├иle CBoW\n",
|
||||
"\n",
|
||||
"Ce notebook fait partie du [Curriculum AI pour D├йbutants](http://aka.ms/ai-beginners)\n",
|
||||
"\n",
|
||||
"Dans cet exemple, nous allons apprendre ├а entra├оner un mod├иle de langage CBoW pour obtenir notre propre espace d'embedding Word2Vec. Nous utiliserons le jeu de donn├йes AG News comme source de texte.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"import torch\n",
|
||||
"import torchtext\n",
|
||||
"import os\n",
|
||||
"import collections\n",
|
||||
"import builtins\n",
|
||||
"import random\n",
|
||||
"import numpy as np"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "q-UiiJUKaxHj"
|
||||
},
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "TFbR8CZaTZ1q"
|
||||
},
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"Tout d'abord, chargeons notre ensemble de donn├йes et d├йfinissons le tokenizer et le vocabulaire. Nous allons d├йfinir `vocab_size` ├а 5000 pour limiter un peu les calculs.\n"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "HIwC7lI5T-ov"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"def load_dataset(ngrams = 1, min_freq = 1, vocab_size = 5000 , lines_cnt = 500):\n",
|
||||
" tokenizer = torchtext.data.utils.get_tokenizer('basic_english')\n",
|
||||
" print(\"Loading dataset...\")\n",
|
||||
" test_dataset, train_dataset = torchtext.datasets.AG_NEWS(root='./data')\n",
|
||||
" train_dataset = list(train_dataset)\n",
|
||||
" test_dataset = list(test_dataset)\n",
|
||||
" classes = ['World', 'Sports', 'Business', 'Sci/Tech']\n",
|
||||
" print('Building vocab...')\n",
|
||||
" counter = collections.Counter()\n",
|
||||
" for i, (_, line) in enumerate(train_dataset):\n",
|
||||
" counter.update(torchtext.data.utils.ngrams_iterator(tokenizer(line),ngrams=ngrams))\n",
|
||||
" if i == lines_cnt:\n",
|
||||
" break\n",
|
||||
" vocab = torchtext.vocab.Vocab(collections.Counter(dict(counter.most_common(vocab_size))), min_freq=min_freq)\n",
|
||||
" return train_dataset, test_dataset, classes, vocab, tokenizer"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "wdZuygtgiuLG"
|
||||
},
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"train_dataset, test_dataset, _, vocab, tokenizer = load_dataset()"
|
||||
],
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "4d1nU1gsivGu",
|
||||
"outputId": "949fe272-ae0e-49f5-c373-6703458b3a74"
|
||||
},
|
||||
"execution_count": null,
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "stream",
|
||||
"name": "stdout",
|
||||
"text": [
|
||||
"Loading dataset...\n",
|
||||
"Building vocab...\n"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"def encode(x, vocabulary, tokenizer = tokenizer):\n",
|
||||
" return [vocabulary[s] for s in tokenizer(x)]"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "1XDYNhG8ToFV"
|
||||
},
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "LIlQk6_PaHVY"
|
||||
},
|
||||
"source": [
|
||||
"## Mod├иle CBoW\n",
|
||||
"\n",
|
||||
"CBoW apprend ├а pr├йdire un mot en se basant sur les $2N$ mots voisins. Par exemple, lorsque $N=1$, nous obtiendrons les paires suivantes ├а partir de la phrase *I like to train networks* : (like, I), (I, like), (to, like), (like, to), (train, to), (to, train), (networks, train), (train, networks). Ici, le premier mot est le mot voisin utilis├й comme entr├йe, et le second mot est celui que nous cherchons ├а pr├йdire.\n",
|
||||
"\n",
|
||||
"Pour construire un r├йseau capable de pr├йdire le mot suivant, nous devrons fournir le mot voisin comme entr├йe et obtenir le num├йro du mot en sortie. L'architecture du r├йseau CBoW est la suivante :\n",
|
||||
"\n",
|
||||
"* Le mot d'entr├йe est pass├й ├а travers la couche d'embedding. Cette m├кme couche d'embedding sera notre embedding Word2Vec, nous la d├йfinirons donc s├йpar├йment comme variable `embedder`. Dans cet exemple, nous utiliserons une taille d'embedding de 30, bien que vous puissiez exp├йrimenter avec des dimensions plus ├йlev├йes (le Word2Vec r├йel utilise 300).\n",
|
||||
"* Le vecteur d'embedding sera ensuite pass├й ├а une couche lin├йaire qui pr├йdira le mot en sortie. Cette couche contient donc `vocab_size` neurones.\n",
|
||||
"\n",
|
||||
"Pour la sortie, si nous utilisons `CrossEntropyLoss` comme fonction de perte, nous devrons ├йgalement fournir uniquement les num├йros des mots comme r├йsultats attendus, sans encodage one-hot.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"vocab_size = len(vocab)\n",
|
||||
"\n",
|
||||
"embedder = torch.nn.Embedding(num_embeddings = vocab_size, embedding_dim = 30)\n",
|
||||
"model = torch.nn.Sequential(\n",
|
||||
" embedder,\n",
|
||||
" torch.nn.Linear(in_features = 30, out_features = vocab_size),\n",
|
||||
")\n",
|
||||
"\n",
|
||||
"print(model)"
|
||||
],
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "akKTcKQKkfl2",
|
||||
"outputId": "da687e3e-a8ec-4c1a-e456-ab8cd6ac7dad"
|
||||
},
|
||||
"execution_count": null,
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "stream",
|
||||
"name": "stdout",
|
||||
"text": [
|
||||
"Sequential(\n",
|
||||
" (0): Embedding(5002, 30)\n",
|
||||
" (1): Linear(in_features=30, out_features=5002, bias=True)\n",
|
||||
")\n"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "Nud6jgGPaHVa"
|
||||
},
|
||||
"source": [
|
||||
"## Pr├йparation des donn├йes d'entra├оnement\n",
|
||||
"\n",
|
||||
"Programmons maintenant la fonction principale qui calculera les paires de mots CBoW ├а partir du texte. Cette fonction nous permettra de sp├йcifier la taille de la fen├кtre et renverra un ensemble de paires - mot d'entr├йe et mot de sortie. Notez que cette fonction peut ├кtre utilis├йe sur des mots, ainsi que sur des vecteurs/tenseurs - ce qui nous permettra d'encoder le texte avant de le transmettre ├а la fonction `to_cbow`.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "x-dsXygOieXn",
|
||||
"outputId": "c2218280-e540-40ba-9546-efe48d0d714f"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "stream",
|
||||
"name": "stdout",
|
||||
"text": [
|
||||
"[['like', 'I'], ['to', 'I'], ['I', 'like'], ['to', 'like'], ['train', 'like'], ['I', 'to'], ['like', 'to'], ['train', 'to'], ['networks', 'to'], ['like', 'train'], ['to', 'train'], ['networks', 'train'], ['to', 'networks'], ['train', 'networks']]\n",
|
||||
"[[232, 172], [5, 172], [172, 232], [5, 232], [0, 232], [172, 5], [232, 5], [0, 5], [1202, 5], [232, 0], [5, 0], [1202, 0], [5, 1202], [0, 1202]]\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def to_cbow(sent,window_size=2):\n",
|
||||
" res = []\n",
|
||||
" for i,x in enumerate(sent):\n",
|
||||
" for j in range(max(0,i-window_size),min(i+window_size+1,len(sent))):\n",
|
||||
" if i!=j:\n",
|
||||
" res.append([sent[j],x])\n",
|
||||
" return res\n",
|
||||
"\n",
|
||||
"print(to_cbow(['I','like','to','train','networks']))\n",
|
||||
"print(to_cbow(encode('I like to train networks', vocab)))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "XVaaDLjaaHVb"
|
||||
},
|
||||
"source": [
|
||||
"Pr├йparons le jeu de donn├йes d'entra├оnement. Nous allons parcourir toutes les actualit├йs, appeler `to_cbow` pour obtenir la liste des paires de mots, et ajouter ces paires ├а `X` et `Y`. Par souci de temps, nous ne consid├йrerons que les 10 000 premiers articles - vous pouvez facilement supprimer cette limitation si vous avez plus de temps ├а attendre et souhaitez obtenir de meilleures repr├йsentations :)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"id": "54b-Gd9TieXo"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"X = []\n",
|
||||
"Y = []\n",
|
||||
"for i, x in zip(range(10000), train_dataset):\n",
|
||||
" for w1, w2 in to_cbow(encode(x[1], vocab), window_size = 5):\n",
|
||||
" X.append(w1)\n",
|
||||
" Y.append(w2)\n",
|
||||
"\n",
|
||||
"X = torch.tensor(X)\n",
|
||||
"Y = torch.tensor(Y)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"Nous convertirons ├йgalement ces donn├йes en un seul ensemble de donn├йes et cr├йerons un dataloader :\n"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "cwWy0PzXWhN5"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"class SimpleIterableDataset(torch.utils.data.IterableDataset):\n",
|
||||
" def __init__(self, X, Y):\n",
|
||||
" super(SimpleIterableDataset).__init__()\n",
|
||||
" self.data = []\n",
|
||||
" for i in range(len(X)):\n",
|
||||
" self.data.append( (Y[i], X[i]) )\n",
|
||||
" random.shuffle(self.data)\n",
|
||||
"\n",
|
||||
" def __iter__(self):\n",
|
||||
" return iter(self.data)"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "mfoAcGPFZU8p"
|
||||
},
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "e4NQ_-5waHVc"
|
||||
},
|
||||
"source": [
|
||||
"Nous convertirons ├йgalement ces donn├йes en un seul ensemble de donn├йes et cr├йerons un dataloader :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"id": "AbLUcojlieXo"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"ds = SimpleIterableDataset(X, Y)\n",
|
||||
"dl = torch.utils.data.DataLoader(ds, batch_size = 256)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "pKQr7sXeaHVc"
|
||||
},
|
||||
"source": [
|
||||
"Maintenant, passons ├а l'entra├оnement proprement dit. Nous utiliserons l'optimiseur `SGD` avec un taux d'apprentissage assez ├йlev├й. Vous pouvez ├йgalement essayer d'utiliser d'autres optimiseurs, comme `Adam`. Nous allons entra├оner pendant 10 ├йpoques pour commencer - et vous pouvez relancer cette cellule si vous souhaitez une perte encore plus faible.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"def train_epoch(net, dataloader, lr = 0.01, optimizer = None, loss_fn = torch.nn.CrossEntropyLoss(), epochs = None, report_freq = 1):\n",
|
||||
" optimizer = optimizer or torch.optim.Adam(net.parameters(), lr = lr)\n",
|
||||
" loss_fn = loss_fn.to(device)\n",
|
||||
" net.train()\n",
|
||||
"\n",
|
||||
" for i in range(epochs):\n",
|
||||
" total_loss, j = 0, 0, \n",
|
||||
" for labels, features in dataloader:\n",
|
||||
" optimizer.zero_grad()\n",
|
||||
" features, labels = features.to(device), labels.to(device)\n",
|
||||
" out = net(features)\n",
|
||||
" loss = loss_fn(out, labels)\n",
|
||||
" loss.backward()\n",
|
||||
" optimizer.step()\n",
|
||||
" total_loss += loss\n",
|
||||
" j += 1\n",
|
||||
" if i % report_freq == 0:\n",
|
||||
" print(f\"Epoch: {i+1}: loss={total_loss.item()/j}\")\n",
|
||||
"\n",
|
||||
" return total_loss.item()/j"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "HeeCYKr_KF1w"
|
||||
},
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"train_epoch(net = model, dataloader = dl, optimizer = torch.optim.SGD(model.parameters(), lr = 0.1), loss_fn = torch.nn.CrossEntropyLoss(), epochs = 10)"
|
||||
],
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "KVgwGtDHgDlT",
|
||||
"outputId": "2447833f-f0e3-4566-c33d-addbfe2f451d"
|
||||
},
|
||||
"execution_count": null,
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "stream",
|
||||
"name": "stdout",
|
||||
"text": [
|
||||
"Epoch: 1: loss=5.664632366860172\n",
|
||||
"Epoch: 2: loss=5.632101973960962\n",
|
||||
"Epoch: 3: loss=5.610399051405015\n",
|
||||
"Epoch: 4: loss=5.594621561080262\n",
|
||||
"Epoch: 5: loss=5.582538017415446\n",
|
||||
"Epoch: 6: loss=5.572900234519603\n",
|
||||
"Epoch: 7: loss=5.564951676341915\n",
|
||||
"Epoch: 8: loss=5.558288112064614\n",
|
||||
"Epoch: 9: loss=5.552576955031129\n",
|
||||
"Epoch: 10: loss=5.547634165194347\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"output_type": "execute_result",
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"5.547634165194347"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"execution_count": 16
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "W8u2qXZmaHVd"
|
||||
},
|
||||
"source": [
|
||||
"## Essayer Word2Vec\n",
|
||||
"\n",
|
||||
"Pour utiliser Word2Vec, extrayons les vecteurs correspondant ├а tous les mots de notre vocabulaire :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"id": "r8TatcXjkU_t"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"vectors = torch.stack([embedder(torch.tensor(vocab[s])) for s in vocab.itos], 0)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "3OcX21UOaHVd"
|
||||
},
|
||||
"source": [
|
||||
"Voyons, par exemple, comment le mot **Paris** est encod├й en un vecteur :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "bz6tAeLzieXp",
|
||||
"outputId": "5b20850e-4342-45e9-f840-cfac2b4d61d8"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "stream",
|
||||
"name": "stdout",
|
||||
"text": [
|
||||
"tensor([-0.0915, 2.1224, -0.0281, -0.6819, 1.1219, 0.6458, -1.3704, -1.3314,\n",
|
||||
" -1.1437, 0.4496, 0.2301, -0.3515, -0.8485, 1.0481, 0.4386, -0.8949,\n",
|
||||
" 0.5644, 1.0939, -2.5096, 3.2949, -0.2601, -0.8640, 0.1421, -0.0804,\n",
|
||||
" -0.5083, -1.0560, 0.9753, -0.5949, -1.6046, 0.5774],\n",
|
||||
" grad_fn=<EmbeddingBackward>)\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"paris_vec = embedder(torch.tensor(vocab['paris']))\n",
|
||||
"print(paris_vec)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "pHTJlaeYaHVd"
|
||||
},
|
||||
"source": [
|
||||
"Il est int├йressant d'utiliser Word2Vec pour rechercher des synonymes. La fonction suivante retournera les `n` mots les plus proches d'une entr├йe donn├йe. Pour les trouver, nous calculons la norme de $|w_i - v|$, o├╣ $v$ est le vecteur correspondant ├а notre mot d'entr├йe, et $w_i$ est l'encodage du $i$-├иme mot dans le vocabulaire. Nous trions ensuite le tableau et retournons les indices correspondants en utilisant `argsort`, puis prenons les premiers `n` ├йl├йments de la liste, qui encodent les positions des mots les plus proches dans le vocabulaire.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "NlZyi-_olFar",
|
||||
"outputId": "b5dbb163-88c4-4d5a-eaf2-6751f700e98c"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "execute_result",
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"['microsoft', 'quoted', 'lp', 'rate', 'top']"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"execution_count": 56
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def close_words(x, n = 5):\n",
|
||||
" vec = embedder(torch.tensor(vocab[x]))\n",
|
||||
" top5 = np.linalg.norm(vectors.detach().numpy() - vec.detach().numpy(), axis = 1).argsort()[:n]\n",
|
||||
" return [ vocab.itos[x] for x in top5 ]\n",
|
||||
"\n",
|
||||
"close_words('microsoft')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "-dQq7xeAln0U",
|
||||
"outputId": "66f768c3-c248-4bfd-ce4f-c8ffc6d0dd0d"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "execute_result",
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"['basketball', 'lot', 'sinai', 'states', 'healthdaynews']"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"execution_count": 51
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"close_words('basketball')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "fJXqK26b29sa",
|
||||
"outputId": "78f0baba-ffd0-485a-dd87-0a12bedfd7fa"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "execute_result",
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"['funds', 'travel', 'sydney', 'japan', 'business']"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"execution_count": 77
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"close_words('funds')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "My0VeTDd3Ji8"
|
||||
},
|
||||
"source": [
|
||||
"## ├А retenir\n",
|
||||
"\n",
|
||||
"En utilisant des techniques astucieuses comme CBoW, nous pouvons entra├оner un mod├иle Word2Vec. Vous pouvez ├йgalement essayer d'entra├оner un mod├иle skip-gram, con├зu pour pr├йdire les mots voisins ├а partir du mot central, et observer ses performances.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**Avertissement** : \nCe document a ├йt├й traduit ├а l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatis├йes peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit ├кtre consid├йr├й comme la source faisant autorit├й. Pour des informations critiques, il est recommand├й de recourir ├а une traduction professionnelle effectu├йe par un humain. Nous d├йclinons toute responsabilit├й en cas de malentendus ou d'interpr├йtations erron├йes r├йsultant de l'utilisation de cette traduction.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"collapsed_sections": [],
|
||||
"name": "CBoW-PyTorch.ipynb",
|
||||
"provenance": []
|
||||
},
|
||||
"interpreter": {
|
||||
"hash": "16af2a8bbb083ea23e5e41c7f5787656b2ce26968575d8763f2c4b17f9cd711f"
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3.8.12 ('py38')",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.8.12"
|
||||
},
|
||||
"orig_nbformat": 4,
|
||||
"gpuClass": "standard",
|
||||
"coopTranslator": {
|
||||
"original_hash": "36df28efe3fe40b6fb0a7fa48fe3ea82",
|
||||
"translation_date": "2025-08-31T15:14:16+00:00",
|
||||
"source_file": "lessons/5-NLP/15-LanguageModeling/CBoW-PyTorch.ipynb",
|
||||
"language_code": "fr"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 0
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,479 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# R├йseaux de neurones r├йcurrents\n",
|
||||
"\n",
|
||||
"Dans le module pr├йc├йdent, nous avons utilis├й des repr├йsentations s├йmantiques riches de texte, associ├йes ├а un simple classificateur lin├йaire au-dessus des embeddings. Cette architecture permet de capturer le sens global des mots dans une phrase, mais elle ne prend pas en compte l'**ordre** des mots, car l'op├йration d'agr├йgation appliqu├йe aux embeddings supprime cette information issue du texte original. ├Йtant donn├й que ces mod├иles ne peuvent pas mod├йliser l'ordre des mots, ils ne sont pas capables de r├йsoudre des t├вches plus complexes ou ambigu├лs, comme la g├йn├йration de texte ou la r├йponse ├а des questions.\n",
|
||||
"\n",
|
||||
"Pour capturer le sens d'une s├йquence de texte, nous devons utiliser une autre architecture de r├йseau de neurones, appel├йe **r├йseau de neurones r├йcurrent**, ou RNN. Dans un RNN, nous faisons passer notre phrase ├а travers le r├йseau, un symbole ├а la fois, et le r├йseau produit un certain **├йtat**, que nous transmettons ensuite au r├йseau avec le symbole suivant.\n",
|
||||
"\n",
|
||||
"├Йtant donn├й la s├йquence d'entr├йe de tokens $X_0,\\dots,X_n$, le RNN cr├йe une s├йquence de blocs de r├йseau de neurones et entra├оne cette s├йquence de bout en bout ├а l'aide de la r├йtropropagation. Chaque bloc de r├йseau prend une paire $(X_i,S_i)$ en entr├йe et produit $S_{i+1}$ en sortie. L'├йtat final $S_n$ ou la sortie $X_n$ est ensuite transmis ├а un classificateur lin├йaire pour produire le r├йsultat. Tous les blocs de r├йseau partagent les m├кmes poids et sont entra├оn├йs de bout en bout en une seule passe de r├йtropropagation.\n",
|
||||
"\n",
|
||||
"Gr├вce aux vecteurs d'├йtat $S_0,\\dots,S_n$ qui sont transmis ├а travers le r├йseau, celui-ci est capable d'apprendre les d├йpendances s├йquentielles entre les mots. Par exemple, lorsque le mot *pas* appara├оt quelque part dans la s├йquence, le r├йseau peut apprendre ├а inverser certains ├йl├йments du vecteur d'├йtat, ce qui entra├оne une n├йgation.\n",
|
||||
"\n",
|
||||
"> ├Йtant donn├й que les poids de tous les blocs RNN sur l'image sont partag├йs, la m├кme image peut ├кtre repr├йsent├йe par un seul bloc (├а droite) avec une boucle de r├йtroaction r├йcurrente, qui renvoie l'├йtat de sortie du r├йseau ├а l'entr├йe.\n",
|
||||
"\n",
|
||||
"Voyons comment les r├йseaux de neurones r├йcurrents peuvent nous aider ├а classifier notre ensemble de donn├йes de nouvelles.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Loading dataset...\n",
|
||||
"Building vocab...\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import torch\n",
|
||||
"import torchtext\n",
|
||||
"from torchnlp import *\n",
|
||||
"train_dataset, test_dataset, classes, vocab = load_dataset()\n",
|
||||
"vocab_size = len(vocab)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Classificateur RNN simple\n",
|
||||
"\n",
|
||||
"Dans le cas d'un RNN simple, chaque unit├й r├йcurrente est un r├йseau lin├йaire simple, qui prend un vecteur d'entr├йe concat├йn├й et un vecteur d'├йtat, et produit un nouveau vecteur d'├йtat. PyTorch repr├йsente cette unit├й avec la classe `RNNCell`, et un r├йseau de telles cellules - comme une couche `RNN`.\n",
|
||||
"\n",
|
||||
"Pour d├йfinir un classificateur RNN, nous appliquerons d'abord une couche d'embedding pour r├йduire la dimensionnalit├й du vocabulaire d'entr├йe, puis ajouterons une couche RNN par-dessus :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class RNNClassifier(torch.nn.Module):\n",
|
||||
" def __init__(self, vocab_size, embed_dim, hidden_dim, num_class):\n",
|
||||
" super().__init__()\n",
|
||||
" self.hidden_dim = hidden_dim\n",
|
||||
" self.embedding = torch.nn.Embedding(vocab_size, embed_dim)\n",
|
||||
" self.rnn = torch.nn.RNN(embed_dim,hidden_dim,batch_first=True)\n",
|
||||
" self.fc = torch.nn.Linear(hidden_dim, num_class)\n",
|
||||
"\n",
|
||||
" def forward(self, x):\n",
|
||||
" batch_size = x.size(0)\n",
|
||||
" x = self.embedding(x)\n",
|
||||
" x,h = self.rnn(x)\n",
|
||||
" return self.fc(x.mean(dim=1))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **Note:** Nous utilisons ici une couche d'embedding non entra├оn├йe pour simplifier, mais pour obtenir de meilleurs r├йsultats, nous pouvons utiliser une couche d'embedding pr├й-entra├оn├йe avec des embeddings Word2Vec ou GloVe, comme d├йcrit dans l'unit├й pr├йc├йdente. Pour mieux comprendre, vous pourriez adapter ce code pour qu'il fonctionne avec des embeddings pr├й-entra├оn├йs.\n",
|
||||
"\n",
|
||||
"Dans notre cas, nous utiliserons un chargeur de donn├йes avec padding, de sorte que chaque lot contiendra un certain nombre de s├йquences remplies pour avoir la m├кme longueur. La couche RNN prendra la s├йquence de tenseurs d'embedding et produira deux sorties : \n",
|
||||
"* $x$ est une s├йquence des sorties des cellules RNN ├а chaque ├йtape \n",
|
||||
"* $h$ est l'├йtat cach├й final pour le dernier ├йl├йment de la s├йquence \n",
|
||||
"\n",
|
||||
"Nous appliquons ensuite un classificateur lin├йaire enti├иrement connect├й pour obtenir le nombre de classes.\n",
|
||||
"\n",
|
||||
"> **Note:** Les RNN sont assez difficiles ├а entra├оner, car une fois que les cellules RNN sont d├йroul├йes sur la longueur de la s├йquence, le nombre de couches impliqu├йes dans la r├йtropropagation devient assez important. Par cons├йquent, nous devons s├йlectionner un faible taux d'apprentissage et entra├оner le r├йseau sur un ensemble de donn├йes plus large pour obtenir de bons r├йsultats. Cela peut prendre beaucoup de temps, donc l'utilisation d'un GPU est pr├йf├йrable.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {
|
||||
"scrolled": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"3200: acc=0.3090625\n",
|
||||
"6400: acc=0.38921875\n",
|
||||
"9600: acc=0.4590625\n",
|
||||
"12800: acc=0.511953125\n",
|
||||
"16000: acc=0.5506875\n",
|
||||
"19200: acc=0.57921875\n",
|
||||
"22400: acc=0.6070089285714285\n",
|
||||
"25600: acc=0.6304296875\n",
|
||||
"28800: acc=0.6484027777777778\n",
|
||||
"32000: acc=0.66509375\n",
|
||||
"35200: acc=0.6790056818181818\n",
|
||||
"38400: acc=0.6929166666666666\n",
|
||||
"41600: acc=0.7035817307692308\n",
|
||||
"44800: acc=0.7137276785714286\n",
|
||||
"48000: acc=0.72225\n",
|
||||
"51200: acc=0.73001953125\n",
|
||||
"54400: acc=0.7372794117647059\n",
|
||||
"57600: acc=0.7436631944444444\n",
|
||||
"60800: acc=0.7503947368421052\n",
|
||||
"64000: acc=0.75634375\n",
|
||||
"67200: acc=0.7615773809523809\n",
|
||||
"70400: acc=0.7662642045454545\n",
|
||||
"73600: acc=0.7708423913043478\n",
|
||||
"76800: acc=0.7751822916666666\n",
|
||||
"80000: acc=0.7790625\n",
|
||||
"83200: acc=0.7825\n",
|
||||
"86400: acc=0.7858564814814815\n",
|
||||
"89600: acc=0.7890513392857142\n",
|
||||
"92800: acc=0.7920474137931034\n",
|
||||
"96000: acc=0.7952708333333334\n",
|
||||
"99200: acc=0.7982258064516129\n",
|
||||
"102400: acc=0.80099609375\n",
|
||||
"105600: acc=0.8037594696969697\n",
|
||||
"108800: acc=0.8060569852941176\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=16, collate_fn=padify, shuffle=True)\n",
|
||||
"net = RNNClassifier(vocab_size,64,32,len(classes)).to(device)\n",
|
||||
"train_epoch(net,train_loader, lr=0.001)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## M├йmoire ├а Long et Court Terme (LSTM)\n",
|
||||
"\n",
|
||||
"L'un des principaux probl├иmes des RNN classiques est le probl├иme des **gradients qui disparaissent**. ├Йtant donn├й que les RNN sont entra├оn├йs de bout en bout en une seule passe de r├йtropropagation, il est difficile de propager l'erreur jusqu'aux premi├иres couches du r├йseau, ce qui emp├кche le r├йseau d'apprendre les relations entre des tokens ├йloign├йs. Une des fa├зons de contourner ce probl├иme est d'introduire une **gestion explicite de l'├йtat** en utilisant ce qu'on appelle des **portes**. Les deux architectures les plus connues de ce type sont : **M├йmoire ├а Long et Court Terme** (LSTM) et **Unit├й de Relais G├вt├йe** (GRU).\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"Le r├йseau LSTM est organis├й de mani├иre similaire au RNN, mais il y a deux ├йtats qui sont transmis d'une couche ├а l'autre : l'├йtat actuel $c$, et le vecteur cach├й $h$. ├А chaque unit├й, le vecteur cach├й $h_i$ est concat├йn├й avec l'entr├йe $x_i$, et ils contr├┤lent ce qui arrive ├а l'├йtat $c$ via des **portes**. Chaque porte est un r├йseau neuronal avec une activation sigmo├пde (sortie dans la plage $[0,1]$), qui peut ├кtre consid├йr├йe comme un masque binaire lorsqu'elle est multipli├йe par le vecteur d'├йtat. Les portes suivantes existent (de gauche ├а droite sur l'image ci-dessus) :\n",
|
||||
"* **Porte d'oubli** : prend le vecteur cach├й et d├йtermine quelles composantes du vecteur $c$ doivent ├кtre oubli├йes et lesquelles doivent ├кtre conserv├йes.\n",
|
||||
"* **Porte d'entr├йe** : prend certaines informations de l'entr├йe et du vecteur cach├й, et les ins├иre dans l'├йtat.\n",
|
||||
"* **Porte de sortie** : transforme l'├йtat via une couche lin├йaire avec activation $\\tanh$, puis s├йlectionne certaines de ses composantes en utilisant le vecteur cach├й $h_i$ pour produire le nouvel ├йtat $c_{i+1}$.\n",
|
||||
"\n",
|
||||
"Les composantes de l'├йtat $c$ peuvent ├кtre consid├йr├йes comme des indicateurs qui peuvent ├кtre activ├йs ou d├йsactiv├йs. Par exemple, lorsque nous rencontrons un nom comme *Alice* dans une s├йquence, nous pouvons supposer qu'il fait r├йf├йrence ├а un personnage f├йminin et activer l'indicateur dans l'├йtat indiquant que nous avons un nom f├йminin dans la phrase. Lorsque nous rencontrons ensuite des expressions comme *et Tom*, nous activons l'indicateur indiquant que nous avons un nom au pluriel. Ainsi, en manipulant l'├йtat, nous pouvons th├йoriquement suivre les propri├йt├йs grammaticales des parties de la phrase.\n",
|
||||
"\n",
|
||||
"> **Note** : Une excellente ressource pour comprendre les d├йtails des LSTM est cet article [Understanding LSTM Networks](https://colah.github.io/posts/2015-08-Understanding-LSTMs/) de Christopher Olah.\n",
|
||||
"\n",
|
||||
"Bien que la structure interne d'une cellule LSTM puisse sembler complexe, PyTorch cache cette impl├йmentation dans la classe `LSTMCell` et fournit l'objet `LSTM` pour repr├йsenter toute la couche LSTM. Ainsi, l'impl├йmentation d'un classificateur LSTM sera assez similaire ├а celle du RNN simple que nous avons vu pr├йc├йdemment :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class LSTMClassifier(torch.nn.Module):\n",
|
||||
" def __init__(self, vocab_size, embed_dim, hidden_dim, num_class):\n",
|
||||
" super().__init__()\n",
|
||||
" self.hidden_dim = hidden_dim\n",
|
||||
" self.embedding = torch.nn.Embedding(vocab_size, embed_dim)\n",
|
||||
" self.embedding.weight.data = torch.randn_like(self.embedding.weight.data)-0.5\n",
|
||||
" self.rnn = torch.nn.LSTM(embed_dim,hidden_dim,batch_first=True)\n",
|
||||
" self.fc = torch.nn.Linear(hidden_dim, num_class)\n",
|
||||
"\n",
|
||||
" def forward(self, x):\n",
|
||||
" batch_size = x.size(0)\n",
|
||||
" x = self.embedding(x)\n",
|
||||
" x,(h,c) = self.rnn(x)\n",
|
||||
" return self.fc(h[-1])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"3200: acc=0.259375\n",
|
||||
"6400: acc=0.25859375\n",
|
||||
"9600: acc=0.26177083333333334\n",
|
||||
"12800: acc=0.2784375\n",
|
||||
"16000: acc=0.313\n",
|
||||
"19200: acc=0.3528645833333333\n",
|
||||
"22400: acc=0.3965625\n",
|
||||
"25600: acc=0.4385546875\n",
|
||||
"28800: acc=0.4752777777777778\n",
|
||||
"32000: acc=0.505375\n",
|
||||
"35200: acc=0.5326704545454546\n",
|
||||
"38400: acc=0.5557552083333334\n",
|
||||
"41600: acc=0.5760817307692307\n",
|
||||
"44800: acc=0.5954910714285714\n",
|
||||
"48000: acc=0.6118333333333333\n",
|
||||
"51200: acc=0.62681640625\n",
|
||||
"54400: acc=0.6404779411764706\n",
|
||||
"57600: acc=0.6520138888888889\n",
|
||||
"60800: acc=0.662828947368421\n",
|
||||
"64000: acc=0.673546875\n",
|
||||
"67200: acc=0.6831547619047619\n",
|
||||
"70400: acc=0.6917897727272727\n",
|
||||
"73600: acc=0.6997146739130434\n",
|
||||
"76800: acc=0.707109375\n",
|
||||
"80000: acc=0.714075\n",
|
||||
"83200: acc=0.7209134615384616\n",
|
||||
"86400: acc=0.727037037037037\n",
|
||||
"89600: acc=0.7326674107142858\n",
|
||||
"92800: acc=0.7379633620689655\n",
|
||||
"96000: acc=0.7433645833333333\n",
|
||||
"99200: acc=0.7479032258064516\n",
|
||||
"102400: acc=0.752119140625\n",
|
||||
"105600: acc=0.7562405303030303\n",
|
||||
"108800: acc=0.76015625\n",
|
||||
"112000: acc=0.7641339285714286\n",
|
||||
"115200: acc=0.7677777777777778\n",
|
||||
"118400: acc=0.7711233108108108\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(0.03487814127604167, 0.7728)"
|
||||
]
|
||||
},
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"net = LSTMClassifier(vocab_size,64,32,len(classes)).to(device)\n",
|
||||
"train_epoch(net,train_loader, lr=0.001)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## S├йquences compact├йes\n",
|
||||
"\n",
|
||||
"Dans notre exemple, nous avons d├╗ compl├йter toutes les s├йquences du minibatch avec des vecteurs de z├йros. Bien que cela entra├оne un certain gaspillage de m├йmoire, avec les RNN, il est encore plus probl├йmatique que des cellules RNN suppl├йmentaires soient cr├й├йes pour les ├йl├йments d'entr├йe compl├йt├йs, qui participent ├а l'entra├оnement mais ne contiennent aucune information d'entr├йe importante. Il serait bien mieux d'entra├оner le RNN uniquement sur la taille r├йelle des s├йquences.\n",
|
||||
"\n",
|
||||
"Pour cela, un format sp├йcial de stockage des s├йquences compl├йt├йes est introduit dans PyTorch. Supposons que nous ayons un minibatch compl├йt├й qui ressemble ├а ceci : \n",
|
||||
"```\n",
|
||||
"[[1,2,3,4,5],\n",
|
||||
" [6,7,8,0,0],\n",
|
||||
" [9,0,0,0,0]]\n",
|
||||
"``` \n",
|
||||
"Ici, 0 repr├йsente les valeurs compl├йt├йes, et le vecteur des longueurs r├йelles des s├йquences d'entr├йe est `[5,3,1]`.\n",
|
||||
"\n",
|
||||
"Pour entra├оner efficacement un RNN avec des s├йquences compl├йt├йes, nous souhaitons commencer l'entra├оnement du premier groupe de cellules RNN avec un grand minibatch (`[1,6,9]`), mais ensuite arr├кter le traitement de la troisi├иme s├йquence et continuer l'entra├оnement avec des minibatches r├йduits (`[2,7]`, `[3,8]`), et ainsi de suite. Ainsi, une s├йquence compact├йe est repr├йsent├йe comme un seul vecteur - dans notre cas `[1,6,9,2,7,3,8,4,5]`, et un vecteur de longueurs (`[5,3,1]`), ├а partir duquel nous pouvons facilement reconstruire le minibatch compl├йt├й d'origine.\n",
|
||||
"\n",
|
||||
"Pour produire une s├йquence compact├йe, nous pouvons utiliser la fonction `torch.nn.utils.rnn.pack_padded_sequence`. Toutes les couches r├йcurrentes, y compris RNN, LSTM et GRU, prennent en charge les s├йquences compact├йes en tant qu'entr├йe et produisent une sortie compact├йe, qui peut ├кtre d├йcod├йe ├а l'aide de `torch.nn.utils.rnn.pad_packed_sequence`.\n",
|
||||
"\n",
|
||||
"Pour pouvoir produire une s├йquence compact├йe, nous devons transmettre le vecteur des longueurs au r├йseau, et donc nous avons besoin d'une fonction diff├йrente pour pr├йparer les minibatches :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def pad_length(b):\n",
|
||||
" # build vectorized sequence\n",
|
||||
" v = [encode(x[1]) for x in b]\n",
|
||||
" # compute max length of a sequence in this minibatch and length sequence itself\n",
|
||||
" len_seq = list(map(len,v))\n",
|
||||
" l = max(len_seq)\n",
|
||||
" return ( # tuple of three tensors - labels, padded features, length sequence\n",
|
||||
" torch.LongTensor([t[0]-1 for t in b]),\n",
|
||||
" torch.stack([torch.nn.functional.pad(torch.tensor(t),(0,l-len(t)),mode='constant',value=0) for t in v]),\n",
|
||||
" torch.tensor(len_seq)\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
"train_loader_len = torch.utils.data.DataLoader(train_dataset, batch_size=16, collate_fn=pad_length, shuffle=True)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Le r├йseau r├йel serait tr├иs similaire ├а `LSTMClassifier` ci-dessus, mais le passage `forward` recevra ├а la fois le mini-lot avec remplissage et le vecteur des longueurs de s├йquence. Apr├иs avoir calcul├й l'embedding, nous calculons la s├йquence empaquet├йe, la passons ├а la couche LSTM, puis d├йpaquetons le r├йsultat.\n",
|
||||
"\n",
|
||||
"> **Note** : En r├йalit├й, nous n'utilisons pas le r├йsultat d├йpaquet├й `x`, car nous utilisons la sortie des couches cach├йes dans les calculs suivants. Ainsi, nous pouvons supprimer compl├иtement le d├йpaquetage de ce code. La raison pour laquelle nous le pla├зons ici est de vous permettre de modifier ce code facilement, au cas o├╣ vous auriez besoin d'utiliser la sortie du r├йseau dans des calculs ult├йrieurs.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class LSTMPackClassifier(torch.nn.Module):\n",
|
||||
" def __init__(self, vocab_size, embed_dim, hidden_dim, num_class):\n",
|
||||
" super().__init__()\n",
|
||||
" self.hidden_dim = hidden_dim\n",
|
||||
" self.embedding = torch.nn.Embedding(vocab_size, embed_dim)\n",
|
||||
" self.embedding.weight.data = torch.randn_like(self.embedding.weight.data)-0.5\n",
|
||||
" self.rnn = torch.nn.LSTM(embed_dim,hidden_dim,batch_first=True)\n",
|
||||
" self.fc = torch.nn.Linear(hidden_dim, num_class)\n",
|
||||
"\n",
|
||||
" def forward(self, x, lengths):\n",
|
||||
" batch_size = x.size(0)\n",
|
||||
" x = self.embedding(x)\n",
|
||||
" pad_x = torch.nn.utils.rnn.pack_padded_sequence(x,lengths,batch_first=True,enforce_sorted=False)\n",
|
||||
" pad_x,(h,c) = self.rnn(pad_x)\n",
|
||||
" x, _ = torch.nn.utils.rnn.pad_packed_sequence(pad_x,batch_first=True)\n",
|
||||
" return self.fc(h[-1])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"metadata": {
|
||||
"scrolled": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"3200: acc=0.285625\n",
|
||||
"6400: acc=0.33359375\n",
|
||||
"9600: acc=0.3876041666666667\n",
|
||||
"12800: acc=0.44078125\n",
|
||||
"16000: acc=0.4825\n",
|
||||
"19200: acc=0.5235416666666667\n",
|
||||
"22400: acc=0.5559821428571429\n",
|
||||
"25600: acc=0.58609375\n",
|
||||
"28800: acc=0.6116666666666667\n",
|
||||
"32000: acc=0.63340625\n",
|
||||
"35200: acc=0.6525284090909091\n",
|
||||
"38400: acc=0.668515625\n",
|
||||
"41600: acc=0.6822596153846154\n",
|
||||
"44800: acc=0.6948214285714286\n",
|
||||
"48000: acc=0.7052708333333333\n",
|
||||
"51200: acc=0.71521484375\n",
|
||||
"54400: acc=0.7239889705882353\n",
|
||||
"57600: acc=0.7315277777777778\n",
|
||||
"60800: acc=0.7388486842105263\n",
|
||||
"64000: acc=0.74571875\n",
|
||||
"67200: acc=0.7518303571428572\n",
|
||||
"70400: acc=0.7576988636363636\n",
|
||||
"73600: acc=0.7628940217391305\n",
|
||||
"76800: acc=0.7681510416666667\n",
|
||||
"80000: acc=0.7728125\n",
|
||||
"83200: acc=0.7772235576923077\n",
|
||||
"86400: acc=0.7815393518518519\n",
|
||||
"89600: acc=0.7857700892857142\n",
|
||||
"92800: acc=0.7895043103448276\n",
|
||||
"96000: acc=0.7930520833333333\n",
|
||||
"99200: acc=0.7959072580645161\n",
|
||||
"102400: acc=0.798994140625\n",
|
||||
"105600: acc=0.802064393939394\n",
|
||||
"108800: acc=0.8051378676470589\n",
|
||||
"112000: acc=0.8077857142857143\n",
|
||||
"115200: acc=0.8104600694444445\n",
|
||||
"118400: acc=0.8128293918918919\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(0.029785829671223958, 0.8138166666666666)"
|
||||
]
|
||||
},
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"net = LSTMPackClassifier(vocab_size,64,32,len(classes)).to(device)\n",
|
||||
"train_epoch_emb(net,train_loader_len, lr=0.001,use_pack_sequence=True)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **Remarque :** Vous avez peut-├кtre remarqu├й le param├иtre `use_pack_sequence` que nous passons ├а la fonction d'entra├оnement. Actuellement, la fonction `pack_padded_sequence` n├йcessite que le tenseur de s├йquence de longueur soit sur le p├йriph├йrique CPU, et donc la fonction d'entra├оnement doit ├йviter de d├йplacer les donn├йes de s├йquence de longueur vers le GPU lors de l'entra├оnement. Vous pouvez consulter l'impl├йmentation de la fonction `train_emb` dans le fichier [`torchnlp.py`](../../../../../lessons/5-NLP/16-RNN/torchnlp.py).\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## RNN bidirectionnels et multicouches\n",
|
||||
"\n",
|
||||
"Dans nos exemples, tous les r├йseaux r├йcurrents fonctionnaient dans une seule direction, de l'origine d'une s├йquence jusqu'├а sa fin. Cela semble naturel, car cela ressemble ├а la mani├иre dont nous lisons et ├йcoutons un discours. Cependant, dans de nombreux cas pratiques o├╣ nous avons un acc├иs al├йatoire ├а la s├йquence d'entr├йe, il peut ├кtre pertinent d'ex├йcuter le calcul r├йcurrent dans les deux directions. Ces r├йseaux sont appel├йs **RNN bidirectionnels**, et ils peuvent ├кtre cr├й├йs en passant le param├иtre `bidirectional=True` au constructeur RNN/LSTM/GRU.\n",
|
||||
"\n",
|
||||
"Lorsqu'on travaille avec un r├йseau bidirectionnel, il nous faut deux vecteurs d'├йtat cach├й, un pour chaque direction. PyTorch encode ces vecteurs en un seul vecteur de taille double, ce qui est assez pratique, car on passe g├йn├йralement l'├йtat cach├й r├йsultant ├а une couche lin├йaire enti├иrement connect├йe, et il suffit de prendre en compte cette augmentation de taille lors de la cr├йation de la couche.\n",
|
||||
"\n",
|
||||
"Un r├йseau r├йcurrent, qu'il soit unidirectionnel ou bidirectionnel, capture certains motifs au sein d'une s├йquence et peut les stocker dans un vecteur d'├йtat ou les transmettre en sortie. Comme pour les r├йseaux convolutionnels, on peut construire une autre couche r├йcurrente au-dessus de la premi├иre pour capturer des motifs de niveau sup├йrieur, construits ├а partir des motifs de bas niveau extraits par la premi├иre couche. Cela nous am├иne ├а la notion de **RNN multicouche**, qui consiste en deux ou plusieurs r├йseaux r├йcurrents, o├╣ la sortie de la couche pr├йc├йdente est transmise ├а la couche suivante comme entr├йe.\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"*Image tir├йe de [cet excellent article](https://towardsdatascience.com/from-a-lstm-cell-to-a-multilayer-lstm-network-with-pytorch-2899eb5696f3) par Fernando L├│pez*\n",
|
||||
"\n",
|
||||
"PyTorch simplifie la construction de tels r├йseaux, car il suffit de passer le param├иtre `num_layers` au constructeur RNN/LSTM/GRU pour cr├йer automatiquement plusieurs couches de r├йcurrence. Cela signifie ├йgalement que la taille du vecteur cach├й/d'├йtat augmente proportionnellement, et il faut en tenir compte lors de la gestion de la sortie des couches r├йcurrentes.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## RNNs pour d'autres t├вches\n",
|
||||
"\n",
|
||||
"Dans cette unit├й, nous avons vu que les RNNs peuvent ├кtre utilis├йs pour la classification de s├йquences, mais en r├йalit├й, ils peuvent g├йrer bien d'autres t├вches, comme la g├йn├йration de texte, la traduction automatique, et bien plus encore. Nous aborderons ces t├вches dans la prochaine unit├й.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**Avertissement** : \nCe document a ├йt├й traduit ├а l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatis├йes peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit ├кtre consid├йr├й comme la source faisant autorit├й. Pour des informations critiques, il est recommand├й de recourir ├а une traduction professionnelle r├йalis├йe par un humain. Nous d├йclinons toute responsabilit├й en cas de malentendus ou d'interpr├йtations erron├йes r├йsultant de l'utilisation de cette traduction.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"interpreter": {
|
||||
"hash": "16af2a8bbb083ea23e5e41c7f5787656b2ce26968575d8763f2c4b17f9cd711f"
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3.8.12 ('py38')",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.8.12"
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "522ee52ae3d5ae933e283286254e9a55",
|
||||
"translation_date": "2025-08-31T15:23:20+00:00",
|
||||
"source_file": "lessons/5-NLP/16-RNN/RNNPyTorch.ipynb",
|
||||
"language_code": "fr"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
|
|
@ -0,0 +1,460 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# R├йseaux neuronaux r├йcurrents\n",
|
||||
"\n",
|
||||
"Dans le module pr├йc├йdent, nous avons abord├й les repr├йsentations s├йmantiques riches du texte. L'architecture que nous avons utilis├йe capture le sens global des mots dans une phrase, mais elle ne prend pas en compte l'**ordre** des mots, car l'op├йration d'agr├йgation qui suit les embeddings ├йlimine cette information du texte original. ├Йtant donn├й que ces mod├иles ne peuvent pas repr├йsenter l'ordre des mots, ils ne peuvent pas r├йsoudre des t├вches plus complexes ou ambigu├лs comme la g├йn├йration de texte ou la r├йponse ├а des questions.\n",
|
||||
"\n",
|
||||
"Pour capturer le sens d'une s├йquence de texte, nous utiliserons une architecture de r├йseau neuronal appel├йe **r├йseau neuronal r├йcurrent**, ou RNN. Lorsqu'on utilise un RNN, on fait passer notre phrase ├а travers le r├йseau un jeton ├а la fois, et le r├йseau produit un certain **├йtat**, que l'on transmet ensuite au r├йseau avec le jeton suivant.\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"├Йtant donn├й la s├йquence d'entr├йe de jetons $X_0,\\dots,X_n$, le RNN cr├йe une s├йquence de blocs de r├йseau neuronal et entra├оne cette s├йquence de bout en bout en utilisant la r├йtropropagation. Chaque bloc de r├йseau prend une paire $(X_i,S_i)$ en entr├йe et produit $S_{i+1}$ en r├йsultat. L'├йtat final $S_n$ ou la sortie $Y_n$ est ensuite transmis ├а un classificateur lin├йaire pour produire le r├йsultat. Tous les blocs de r├йseau partagent les m├кmes poids et sont entra├оn├йs de bout en bout en une seule passe de r├йtropropagation.\n",
|
||||
"\n",
|
||||
"> La figure ci-dessus montre un r├йseau neuronal r├йcurrent sous forme d├йroul├йe (├а gauche) et sous une repr├йsentation r├йcurrente plus compacte (├а droite). Il est important de comprendre que toutes les cellules RNN partagent les m├кmes **poids partageables**.\n",
|
||||
"\n",
|
||||
"Comme les vecteurs d'├йtat $S_0,\\dots,S_n$ sont transmis ├а travers le r├йseau, le RNN est capable d'apprendre les d├йpendances s├йquentielles entre les mots. Par exemple, lorsque le mot *pas* appara├оt quelque part dans la s├йquence, il peut apprendre ├а n├йgativer certains ├йl├йments dans le vecteur d'├йtat.\n",
|
||||
"\n",
|
||||
"├А l'int├йrieur, chaque cellule RNN contient deux matrices de poids : $W_H$ et $W_I$, ainsi qu'un biais $b$. ├А chaque ├йtape du RNN, ├йtant donn├й l'entr├йe $X_i$ et l'├йtat d'entr├йe $S_i$, l'├йtat de sortie est calcul├й comme $S_{i+1} = f(W_H\\times S_i + W_I\\times X_i+b)$, o├╣ $f$ est une fonction d'activation (souvent $\\tanh$).\n",
|
||||
"\n",
|
||||
"> Pour des probl├иmes comme la g├йn├йration de texte (que nous aborderons dans la prochaine unit├й) ou la traduction automatique, nous souhaitons ├йgalement obtenir une valeur de sortie ├а chaque ├йtape du RNN. Dans ce cas, il y a une autre matrice $W_O$, et la sortie est calcul├йe comme $Y_i=f(W_O\\times S_i+b_O)$.\n",
|
||||
"\n",
|
||||
"Voyons comment les r├йseaux neuronaux r├йcurrents peuvent nous aider ├а classifier notre ensemble de donn├йes de nouvelles.\n",
|
||||
"\n",
|
||||
"> Pour l'environnement sandbox, nous devons ex├йcuter la cellule suivante pour nous assurer que la biblioth├иque requise est install├йe et que les donn├йes sont pr├йcharg├йes. Si vous travaillez en local, vous pouvez ignorer la cellule suivante.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import sys\n",
|
||||
"!{sys.executable} -m pip install --quiet tensorflow_datasets==4.4.0\n",
|
||||
"!cd ~ && wget -q -O - https://mslearntensorflowlp.blob.core.windows.net/data/tfds-ag-news.tgz | tar xz"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import tensorflow as tf\n",
|
||||
"from tensorflow import keras\n",
|
||||
"import tensorflow_datasets as tfds\n",
|
||||
"import numpy as np\n",
|
||||
"\n",
|
||||
"# We are going to be training pretty large models. In order not to face errors, we need\n",
|
||||
"# to set tensorflow option to grow GPU memory allocation when required\n",
|
||||
"physical_devices = tf.config.list_physical_devices('GPU') \n",
|
||||
"if len(physical_devices)>0:\n",
|
||||
" tf.config.experimental.set_memory_growth(physical_devices[0], True)\n",
|
||||
"\n",
|
||||
"ds_train, ds_test = tfds.load('ag_news_subset').values()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"nteract": {
|
||||
"transient": {
|
||||
"deleting": false
|
||||
}
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"Lors de l'entra├оnement de mod├иles de grande taille, l'allocation de m├йmoire GPU peut poser probl├иme. Nous pourrions ├йgalement avoir besoin d'exp├йrimenter avec diff├йrentes tailles de minibatch, afin que les donn├йes tiennent dans la m├йmoire GPU tout en garantissant un entra├оnement suffisamment rapide. Si vous ex├йcutez ce code sur votre propre machine ├йquip├йe d'un GPU, vous pouvez essayer d'ajuster la taille des minibatchs pour acc├йl├йrer l'entra├оnement.\n",
|
||||
"\n",
|
||||
"> **Note** : Certaines versions des pilotes NVidia sont connues pour ne pas lib├йrer la m├йmoire apr├иs l'entra├оnement du mod├иle. Nous ex├йcutons plusieurs exemples dans ce notebook, ce qui pourrait entra├оner une saturation de la m├йmoire dans certains cas, en particulier si vous r├йalisez vos propres exp├йriences dans le m├кme notebook. Si vous rencontrez des erreurs ├йtranges au moment de commencer l'entra├оnement du mod├иle, il peut ├кtre utile de red├йmarrer le noyau du notebook.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {
|
||||
"collapsed": true,
|
||||
"jupyter": {
|
||||
"outputs_hidden": false,
|
||||
"source_hidden": false
|
||||
},
|
||||
"nteract": {
|
||||
"transient": {
|
||||
"deleting": false
|
||||
}
|
||||
}
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"batch_size = 16\n",
|
||||
"embed_size = 64"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Classificateur RNN simple\n",
|
||||
"\n",
|
||||
"Dans le cas d'un RNN simple, chaque unit├й r├йcurrente est un r├йseau lin├йaire simple, qui prend en entr├йe un vecteur d'entr├йe et un vecteur d'├йtat, et produit un nouveau vecteur d'├йtat. Dans Keras, cela peut ├кtre repr├йsent├й par la couche `SimpleRNN`.\n",
|
||||
"\n",
|
||||
"Bien que nous puissions transmettre directement des tokens encod├йs en one-hot ├а la couche RNN, ce n'est pas une bonne id├йe en raison de leur haute dimensionnalit├й. Par cons├йquent, nous utiliserons une couche d'embedding pour r├йduire la dimensionnalit├й des vecteurs de mots, suivie d'une couche RNN, et enfin d'un classificateur `Dense`.\n",
|
||||
"\n",
|
||||
"> **Note** : Dans les cas o├╣ la dimensionnalit├й n'est pas si ├йlev├йe, par exemple lors de l'utilisation de la tokenisation au niveau des caract├иres, il peut ├кtre pertinent de transmettre directement les tokens encod├йs en one-hot dans la cellule RNN.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Model: \"sequential\"\n",
|
||||
"_________________________________________________________________\n",
|
||||
"Layer (type) Output Shape Param # \n",
|
||||
"=================================================================\n",
|
||||
"text_vectorization (TextVect (None, None) 0 \n",
|
||||
"_________________________________________________________________\n",
|
||||
"embedding (Embedding) (None, None, 64) 1280000 \n",
|
||||
"_________________________________________________________________\n",
|
||||
"simple_rnn (SimpleRNN) (None, 16) 1296 \n",
|
||||
"_________________________________________________________________\n",
|
||||
"dense (Dense) (None, 4) 68 \n",
|
||||
"=================================================================\n",
|
||||
"Total params: 1,281,364\n",
|
||||
"Trainable params: 1,281,364\n",
|
||||
"Non-trainable params: 0\n",
|
||||
"_________________________________________________________________\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"vocab_size = 20000\n",
|
||||
"\n",
|
||||
"vectorizer = keras.layers.experimental.preprocessing.TextVectorization(\n",
|
||||
" max_tokens=vocab_size,\n",
|
||||
" input_shape=(1,))\n",
|
||||
"\n",
|
||||
"model = keras.models.Sequential([\n",
|
||||
" vectorizer,\n",
|
||||
" keras.layers.Embedding(vocab_size, embed_size),\n",
|
||||
" keras.layers.SimpleRNN(16),\n",
|
||||
" keras.layers.Dense(4,activation='softmax')\n",
|
||||
"])\n",
|
||||
"\n",
|
||||
"model.summary()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **Note:** Nous utilisons ici une couche d'embedding non entra├оn├йe pour simplifier, mais pour obtenir de meilleurs r├йsultats, nous pouvons utiliser une couche d'embedding pr├йentra├оn├йe avec Word2Vec, comme d├йcrit dans l'unit├й pr├йc├йdente. Ce serait un bon exercice pour vous d'adapter ce code afin de fonctionner avec des embeddings pr├йentra├оn├йs.\n",
|
||||
"\n",
|
||||
"Passons maintenant ├а l'entra├оnement de notre RNN. Les RNNs sont g├йn├йralement assez difficiles ├а entra├оner, car une fois que les cellules RNN sont d├йroul├йes sur la longueur de la s├йquence, le nombre de couches impliqu├йes dans la r├йtropropagation devient tr├иs important. Par cons├йquent, nous devons s├йlectionner un taux d'apprentissage plus faible et entra├оner le r├йseau sur un ensemble de donn├йes plus large pour obtenir de bons r├йsultats. Cela peut prendre beaucoup de temps, donc l'utilisation d'un GPU est pr├йf├йrable.\n",
|
||||
"\n",
|
||||
"Pour acc├йl├йrer les choses, nous allons entra├оner le mod├иle RNN uniquement sur les titres des actualit├йs, en omettant la description. Vous pouvez essayer d'entra├оner avec la description et voir si vous parvenez ├а faire fonctionner le mod├иle.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {
|
||||
"scrolled": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Training vectorizer\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def extract_title(x):\n",
|
||||
" return x['title']\n",
|
||||
"\n",
|
||||
"def tupelize_title(x):\n",
|
||||
" return (extract_title(x),x['label'])\n",
|
||||
"\n",
|
||||
"print('Training vectorizer')\n",
|
||||
"vectorizer.adapt(ds_train.take(2000).map(extract_title))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"7500/7500 [==============================] - 82s 11ms/step - loss: 0.6629 - acc: 0.7623 - val_loss: 0.5559 - val_acc: 0.7995\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<tensorflow.python.keras.callbacks.History at 0x7f3e0030d350>"
|
||||
]
|
||||
},
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"model.compile(loss='sparse_categorical_crossentropy',metrics=['acc'], optimizer='adam')\n",
|
||||
"model.fit(ds_train.map(tupelize_title).batch(batch_size),validation_data=ds_test.map(tupelize_title).batch(batch_size))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"nteract": {
|
||||
"transient": {
|
||||
"deleting": false
|
||||
}
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"> **Note** que la pr├йcision est probablement plus faible ici, car nous nous entra├оnons uniquement sur les titres des actualit├йs.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Revoir les s├йquences de variables\n",
|
||||
"\n",
|
||||
"Rappelez-vous que la couche `TextVectorization` ajoutera automatiquement des tokens de remplissage aux s├йquences de longueur variable dans un minibatch. Il s'av├иre que ces tokens participent ├йgalement ├а l'entra├оnement, ce qui peut compliquer la convergence du mod├иle.\n",
|
||||
"\n",
|
||||
"Il existe plusieurs approches pour minimiser la quantit├й de remplissage. L'une d'elles consiste ├а r├йorganiser le dataset par longueur de s├йquence et ├а regrouper toutes les s├йquences par taille. Cela peut ├кtre r├йalis├й en utilisant la fonction `tf.data.experimental.bucket_by_sequence_length` (voir [documentation](https://www.tensorflow.org/api_docs/python/tf/data/experimental/bucket_by_sequence_length)).\n",
|
||||
"\n",
|
||||
"Une autre approche consiste ├а utiliser **le masquage**. Dans Keras, certaines couches prennent en charge des entr├йes suppl├йmentaires qui indiquent quels tokens doivent ├кtre pris en compte lors de l'entra├оnement. Pour int├йgrer le masquage dans notre mod├иle, nous pouvons soit inclure une couche `Masking` s├йpar├йe ([docs](https://keras.io/api/layers/core_layers/masking/)), soit sp├йcifier le param├иtre `mask_zero=True` dans notre couche `Embedding`.\n",
|
||||
"\n",
|
||||
"> **Note** : Cet entra├оnement prendra environ 5 minutes pour compl├йter une ├йpoque sur l'ensemble du dataset. N'h├йsitez pas ├а interrompre l'entra├оnement ├а tout moment si vous manquez de patience. Ce que vous pouvez ├йgalement faire, c'est limiter la quantit├й de donn├йes utilis├йes pour l'entra├оnement, en ajoutant une clause `.take(...)` apr├иs les datasets `ds_train` et `ds_test`.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"7500/7500 [==============================] - 371s 49ms/step - loss: 0.5401 - acc: 0.8079 - val_loss: 0.3780 - val_acc: 0.8822\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<tensorflow.python.keras.callbacks.History at 0x7f3dec118850>"
|
||||
]
|
||||
},
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def extract_text(x):\n",
|
||||
" return x['title']+' '+x['description']\n",
|
||||
"\n",
|
||||
"def tupelize(x):\n",
|
||||
" return (extract_text(x),x['label'])\n",
|
||||
"\n",
|
||||
"model = keras.models.Sequential([\n",
|
||||
" vectorizer,\n",
|
||||
" keras.layers.Embedding(vocab_size,embed_size,mask_zero=True),\n",
|
||||
" keras.layers.SimpleRNN(16),\n",
|
||||
" keras.layers.Dense(4,activation='softmax')\n",
|
||||
"])\n",
|
||||
"\n",
|
||||
"model.compile(loss='sparse_categorical_crossentropy',metrics=['acc'], optimizer='adam')\n",
|
||||
"model.fit(ds_train.map(tupelize).batch(batch_size),validation_data=ds_test.map(tupelize).batch(batch_size))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Maintenant que nous utilisons le masquage, nous pouvons entra├оner le mod├иle sur l'ensemble du jeu de donn├йes des titres et descriptions.\n",
|
||||
"\n",
|
||||
"> **Note** : Avez-vous remarqu├й que nous avons utilis├й un vectoriseur entra├оn├й sur les titres des actualit├йs, et non sur l'int├йgralit├й du corps de l'article ? Cela peut potentiellement entra├оner l'ignorance de certains tokens, il serait donc pr├йf├йrable de r├йentra├оner le vectoriseur. Cependant, l'impact pourrait ├кtre tr├иs minime, donc nous continuerons ├а utiliser le vectoriseur pr├й-entra├оn├й pr├йc├йdent pour des raisons de simplicit├й.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## LSTM : M├йmoire ├а long et court terme\n",
|
||||
"\n",
|
||||
"L'un des principaux probl├иmes des RNN est le ph├йnom├иne de **gradients ├йvanescents**. Les RNN peuvent ├кtre assez longs et peuvent avoir du mal ├а propager les gradients jusqu'├а la premi├иre couche du r├йseau lors de la r├йtropropagation. Lorsque cela se produit, le r├йseau ne peut pas apprendre les relations entre des tokens ├йloign├йs. Une fa├зon d'├йviter ce probl├иme est d'introduire une **gestion explicite de l'├йtat** en utilisant des **portes**. Les deux architectures les plus courantes qui introduisent des portes sont la **m├йmoire ├а long et court terme** (LSTM) et l'**unit├й de relais ├а portes** (GRU). Nous allons nous concentrer ici sur les LSTM.\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"Un r├йseau LSTM est organis├й de mani├иre similaire ├а un RNN, mais il y a deux ├йtats qui sont transmis de couche en couche : l'├йtat r├йel $c$ et le vecteur cach├й $h$. ├А chaque unit├й, le vecteur cach├й $h_{t-1}$ est combin├й avec l'entr├йe $x_t$, et ensemble, ils contr├┤lent ce qui arrive ├а l'├йtat $c_t$ et ├а la sortie $h_{t}$ via des **portes**. Chaque porte utilise une activation sigmo├пde (avec une sortie dans l'intervalle $[0,1]$), que l'on peut consid├йrer comme un masque binaire lorsqu'elle est multipli├йe par le vecteur d'├йtat. Les LSTM poss├иdent les portes suivantes (de gauche ├а droite sur l'image ci-dessus) :\n",
|
||||
"* **Porte d'oubli**, qui d├йtermine quelles composantes du vecteur $c_{t-1}$ doivent ├кtre oubli├йes et lesquelles doivent ├кtre conserv├йes.\n",
|
||||
"* **Porte d'entr├йe**, qui d├йtermine la quantit├й d'informations provenant du vecteur d'entr├йe et du vecteur cach├й pr├йc├йdent ├а incorporer dans le vecteur d'├йtat.\n",
|
||||
"* **Porte de sortie**, qui prend le nouveau vecteur d'├йtat et d├йcide quelles de ses composantes seront utilis├йes pour produire le nouveau vecteur cach├й $h_t$.\n",
|
||||
"\n",
|
||||
"Les composantes de l'├йtat $c$ peuvent ├кtre consid├йr├йes comme des indicateurs que l'on peut activer ou d├йsactiver. Par exemple, lorsque nous rencontrons le nom *Alice* dans une s├йquence, nous supposons qu'il s'agit d'une femme et activons l'indicateur dans l'├йtat qui signale la pr├йsence d'un nom f├йminin dans la phrase. Lorsque nous rencontrons ensuite les mots *et Tom*, nous activons l'indicateur signalant la pr├йsence d'un nom pluriel. Ainsi, en manipulant l'├йtat, nous pouvons suivre les propri├йt├йs grammaticales de la phrase.\n",
|
||||
"\n",
|
||||
"> **Note** : Voici une excellente ressource pour comprendre les m├йcanismes internes des LSTM : [Understanding LSTM Networks](https://colah.github.io/posts/2015-08-Understanding-LSTMs/) par Christopher Olah.\n",
|
||||
"\n",
|
||||
"Bien que la structure interne d'une cellule LSTM puisse sembler complexe, Keras masque cette impl├йmentation dans la couche `LSTM`, donc la seule chose que nous devons faire dans l'exemple ci-dessus est de remplacer la couche r├йcurrente :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"15000/15000 [==============================] - 188s 13ms/step - loss: 0.5692 - acc: 0.7916 - val_loss: 0.3441 - val_acc: 0.8870\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<tensorflow.python.keras.callbacks.History at 0x7f3d6af5c350>"
|
||||
]
|
||||
},
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"model = keras.models.Sequential([\n",
|
||||
" vectorizer,\n",
|
||||
" keras.layers.Embedding(vocab_size, embed_size),\n",
|
||||
" keras.layers.LSTM(8),\n",
|
||||
" keras.layers.Dense(4,activation='softmax')\n",
|
||||
"])\n",
|
||||
"\n",
|
||||
"model.compile(loss='sparse_categorical_crossentropy',metrics=['acc'], optimizer='adam')\n",
|
||||
"model.fit(ds_train.map(tupelize).batch(8),validation_data=ds_test.map(tupelize).batch(8))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## RNN bidirectionnels et multicouches\n",
|
||||
"\n",
|
||||
"Dans nos exemples jusqu'├а pr├йsent, les r├йseaux r├йcurrents fonctionnent du d├йbut d'une s├йquence jusqu'├а la fin. Cela nous semble naturel car cela suit la m├кme direction que celle dans laquelle nous lisons ou ├йcoutons un discours. Cependant, pour des sc├йnarios n├йcessitant un acc├иs al├йatoire ├а la s├йquence d'entr├йe, il est plus logique d'ex├йcuter le calcul r├йcurrent dans les deux directions. Les RNN qui permettent des calculs dans les deux directions sont appel├йs **RNN bidirectionnels**, et ils peuvent ├кtre cr├й├йs en enveloppant la couche r├йcurrente avec une couche sp├йciale `Bidirectional`.\n",
|
||||
"\n",
|
||||
"> **Note** : La couche `Bidirectional` cr├йe deux copies de la couche qu'elle contient et d├йfinit la propri├йt├й `go_backwards` de l'une de ces copies sur `True`, ce qui lui permet de parcourir la s├йquence dans la direction oppos├йe.\n",
|
||||
"\n",
|
||||
"Les r├йseaux r├йcurrents, qu'ils soient unidirectionnels ou bidirectionnels, capturent des motifs au sein d'une s├йquence et les stockent dans des vecteurs d'├йtat ou les renvoient comme sortie. Comme pour les r├йseaux convolutionnels, nous pouvons construire une autre couche r├йcurrente apr├иs la premi├иre pour capturer des motifs de niveau sup├йrieur, construits ├а partir des motifs de niveau inf├йrieur extraits par la premi├иre couche. Cela nous am├иne ├а la notion de **RNN multicouche**, qui consiste en deux r├йseaux r├йcurrents ou plus, o├╣ la sortie de la couche pr├йc├йdente est transmise ├а la couche suivante comme entr├йe.\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"*Image tir├йe de [cet excellent article](https://towardsdatascience.com/from-a-lstm-cell-to-a-multilayer-lstm-network-with-pytorch-2899eb5696f3) par Fernando L├│pez.*\n",
|
||||
"\n",
|
||||
"Keras facilite la construction de ces r├йseaux, car il suffit d'ajouter davantage de couches r├йcurrentes au mod├иle. Pour toutes les couches sauf la derni├иre, nous devons sp├йcifier le param├иtre `return_sequences=True`, car nous avons besoin que la couche renvoie tous les ├йtats interm├йdiaires, et non seulement l'├йtat final du calcul r├йcurrent.\n",
|
||||
"\n",
|
||||
"Construisons un LSTM bidirectionnel ├а deux couches pour notre probl├иme de classification.\n",
|
||||
"\n",
|
||||
"> **Note** : Ce code prend encore beaucoup de temps ├а s'ex├йcuter, mais il nous donne la meilleure pr├йcision que nous ayons vue jusqu'├а pr├йsent. Cela vaut peut-├кtre la peine d'attendre pour voir le r├йsultat.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"5044/7500 [===================>..........] - ETA: 2:33 - loss: 0.3709 - acc: 0.8706\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r5045/7500 [===================>..........] - ETA: 2:33 - loss: 0.3709 - acc: 0.8706"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"model = keras.models.Sequential([\n",
|
||||
" vectorizer,\n",
|
||||
" keras.layers.Embedding(vocab_size, 128, mask_zero=True),\n",
|
||||
" keras.layers.Bidirectional(keras.layers.LSTM(64,return_sequences=True)),\n",
|
||||
" keras.layers.Bidirectional(keras.layers.LSTM(64)), \n",
|
||||
" keras.layers.Dense(4,activation='softmax')\n",
|
||||
"])\n",
|
||||
"\n",
|
||||
"model.compile(loss='sparse_categorical_crossentropy',metrics=['acc'], optimizer='adam')\n",
|
||||
"model.fit(ds_train.map(tupelize).batch(batch_size),\n",
|
||||
" validation_data=ds_test.map(tupelize).batch(batch_size))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## RNNs pour d'autres t├вches\n",
|
||||
"\n",
|
||||
"Jusqu'├а pr├йsent, nous nous sommes concentr├йs sur l'utilisation des RNNs pour classifier des s├йquences de texte. Mais ils peuvent g├йrer bien d'autres t├вches, comme la g├йn├йration de texte et la traduction automatique тАФ nous aborderons ces t├вches dans la prochaine unit├й.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**Avertissement** : \nCe document a ├йt├й traduit ├а l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatis├йes peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit ├кtre consid├йr├й comme la source faisant autorit├й. Pour des informations critiques, il est recommand├й de recourir ├а une traduction professionnelle r├йalis├йe par un humain. Nous d├йclinons toute responsabilit├й en cas de malentendus ou d'interpr├йtations erron├йes r├йsultant de l'utilisation de cette traduction.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernel_info": {
|
||||
"name": "conda-env-py37_tensorflow-py"
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "py37_tensorflow",
|
||||
"language": "python",
|
||||
"name": "conda-env-py37_tensorflow-py"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.9"
|
||||
},
|
||||
"nteract": {
|
||||
"version": "nteract-front-end@1.0.0"
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "81351e61f619b432ff51010a4f993194",
|
||||
"translation_date": "2025-08-31T15:21:42+00:00",
|
||||
"source_file": "lessons/5-NLP/16-RNN/RNNTF.ipynb",
|
||||
"language_code": "fr"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 4
|
||||
}
|
||||
|
|
@ -0,0 +1,414 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# R├йseaux g├йn├йratifs\n",
|
||||
"\n",
|
||||
"Les r├йseaux neuronaux r├йcurrents (RNN) et leurs variantes ├а cellules ├а portes, comme les cellules de m├йmoire ├а long court terme (LSTM) et les unit├йs r├йcurrentes ├а portes (GRU), ont fourni un m├йcanisme pour la mod├йlisation du langage, c'est-├а-dire qu'ils peuvent apprendre l'ordre des mots et fournir des pr├йdictions pour le mot suivant dans une s├йquence. Cela nous permet d'utiliser les RNN pour des **t├вches g├йn├йratives**, telles que la g├йn├йration de texte ordinaire, la traduction automatique et m├кme la g├йn├йration de l├йgendes pour des images.\n",
|
||||
"\n",
|
||||
"Dans l'architecture RNN que nous avons abord├йe dans l'unit├й pr├йc├йdente, chaque unit├й RNN produisait le prochain ├йtat cach├й comme sortie. Cependant, nous pouvons ├йgalement ajouter une autre sortie ├а chaque unit├й r├йcurrente, ce qui nous permettrait de produire une **s├йquence** (de m├кme longueur que la s├йquence originale). De plus, nous pouvons utiliser des unit├йs RNN qui n'acceptent pas d'entr├йe ├а chaque ├йtape, mais qui prennent simplement un vecteur d'├йtat initial, puis produisent une s├йquence de sorties.\n",
|
||||
"\n",
|
||||
"Dans ce notebook, nous allons nous concentrer sur des mod├иles g├йn├йratifs simples qui nous aident ├а g├йn├йrer du texte. Pour simplifier, construisons un **r├йseau au niveau des caract├иres**, qui g├йn├иre du texte lettre par lettre. Pendant l'entra├оnement, nous devons prendre un corpus de texte et le diviser en s├йquences de lettres.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Loading dataset...\n",
|
||||
"Building vocab...\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import torch\n",
|
||||
"import torchtext\n",
|
||||
"import numpy as np\n",
|
||||
"from torchnlp import *\n",
|
||||
"train_dataset,test_dataset,classes,vocab = load_dataset()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Construire un vocabulaire de caract├иres\n",
|
||||
"\n",
|
||||
"Pour cr├йer un r├йseau g├йn├йratif au niveau des caract├иres, il est n├йcessaire de diviser le texte en caract├иres individuels plut├┤t qu'en mots. Cela peut ├кtre r├йalis├й en d├йfinissant un tokenizer diff├йrent :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Vocabulary size = 82\n",
|
||||
"Encoding of 'a' is 1\n",
|
||||
"Character with code 13 is c\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def char_tokenizer(words):\n",
|
||||
" return list(words) #[word for word in words]\n",
|
||||
"\n",
|
||||
"counter = collections.Counter()\n",
|
||||
"for (label, line) in train_dataset:\n",
|
||||
" counter.update(char_tokenizer(line))\n",
|
||||
"vocab = torchtext.vocab.vocab(counter)\n",
|
||||
"\n",
|
||||
"vocab_size = len(vocab)\n",
|
||||
"print(f\"Vocabulary size = {vocab_size}\")\n",
|
||||
"print(f\"Encoding of 'a' is {vocab.get_stoi()['a']}\")\n",
|
||||
"print(f\"Character with code 13 is {vocab.get_itos()[13]}\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Voyons l'exemple de la fa├зon dont nous pouvons encoder le texte de notre ensemble de donn├йes :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"tensor([ 0, 1, 2, 2, 3, 4, 5, 6, 3, 7, 8, 1, 9, 10, 3, 11, 2, 1,\n",
|
||||
" 12, 3, 7, 1, 13, 14, 3, 15, 16, 5, 17, 3, 5, 18, 8, 3, 7, 2,\n",
|
||||
" 1, 13, 14, 3, 19, 20, 8, 21, 5, 8, 9, 10, 22, 3, 20, 8, 21, 5,\n",
|
||||
" 8, 9, 10, 3, 23, 3, 4, 18, 17, 9, 5, 23, 10, 8, 2, 2, 8, 9,\n",
|
||||
" 10, 24, 3, 0, 1, 2, 2, 3, 4, 5, 9, 8, 8, 5, 25, 10, 3, 26,\n",
|
||||
" 12, 27, 16, 26, 2, 27, 16, 28, 29, 30, 1, 16, 26, 3, 17, 31, 3, 21,\n",
|
||||
" 2, 5, 9, 1, 23, 13, 32, 16, 27, 13, 10, 24, 3, 1, 9, 8, 3, 10,\n",
|
||||
" 8, 8, 27, 16, 28, 3, 28, 9, 8, 8, 16, 3, 1, 28, 1, 27, 16, 6])"
|
||||
]
|
||||
},
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def enc(x):\n",
|
||||
" return torch.LongTensor(encode(x,voc=vocab,tokenizer=char_tokenizer))\n",
|
||||
"\n",
|
||||
"enc(train_dataset[0][1])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Entra├оner un RNN g├йn├йratif\n",
|
||||
"\n",
|
||||
"La mani├иre dont nous allons entra├оner un RNN ├а g├йn├йrer du texte est la suivante. ├А chaque ├йtape, nous prendrons une s├йquence de caract├иres de longueur `nchars` et demanderons au r├йseau de g├йn├йrer le caract├иre de sortie suivant pour chaque caract├иre d'entr├йe :\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"Selon le sc├йnario sp├йcifique, nous pourrions ├йgalement vouloir inclure certains caract├иres sp├йciaux, tels que *fin de s├йquence* `<eos>`. Dans notre cas, nous souhaitons simplement entra├оner le r├йseau pour une g├йn├йration de texte infinie. Par cons├йquent, nous fixerons la taille de chaque s├йquence ├а `nchars` tokens. Ainsi, chaque exemple d'entra├оnement sera compos├й de `nchars` entr├йes et de `nchars` sorties (qui correspondent ├а la s├йquence d'entr├йe d├йcal├йe d'un symbole vers la gauche). Un minibatch sera constitu├й de plusieurs de ces s├йquences.\n",
|
||||
"\n",
|
||||
"La mani├иre dont nous g├йn├йrerons les minibatches consiste ├а prendre chaque texte d'actualit├й de longueur `l` et ├а en extraire toutes les combinaisons possibles entr├йe-sortie (il y aura `l-nchars` combinaisons de ce type). Ces combinaisons formeront un minibatch, et la taille des minibatches variera ├а chaque ├йtape d'entra├оnement.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(tensor([[ 0, 1, 2, ..., 28, 29, 30],\n",
|
||||
" [ 1, 2, 2, ..., 29, 30, 1],\n",
|
||||
" [ 2, 2, 3, ..., 30, 1, 16],\n",
|
||||
" ...,\n",
|
||||
" [20, 8, 21, ..., 1, 28, 1],\n",
|
||||
" [ 8, 21, 5, ..., 28, 1, 27],\n",
|
||||
" [21, 5, 8, ..., 1, 27, 16]]),\n",
|
||||
" tensor([[ 1, 2, 2, ..., 29, 30, 1],\n",
|
||||
" [ 2, 2, 3, ..., 30, 1, 16],\n",
|
||||
" [ 2, 3, 4, ..., 1, 16, 26],\n",
|
||||
" ...,\n",
|
||||
" [ 8, 21, 5, ..., 28, 1, 27],\n",
|
||||
" [21, 5, 8, ..., 1, 27, 16],\n",
|
||||
" [ 5, 8, 9, ..., 27, 16, 6]]))"
|
||||
]
|
||||
},
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"nchars = 100\n",
|
||||
"\n",
|
||||
"def get_batch(s,nchars=nchars):\n",
|
||||
" ins = torch.zeros(len(s)-nchars,nchars,dtype=torch.long,device=device)\n",
|
||||
" outs = torch.zeros(len(s)-nchars,nchars,dtype=torch.long,device=device)\n",
|
||||
" for i in range(len(s)-nchars):\n",
|
||||
" ins[i] = enc(s[i:i+nchars])\n",
|
||||
" outs[i] = enc(s[i+1:i+nchars+1])\n",
|
||||
" return ins,outs\n",
|
||||
"\n",
|
||||
"get_batch(train_dataset[0][1])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"D├йfinissons maintenant le r├йseau g├йn├йrateur. Il peut ├кtre bas├й sur n'importe quelle cellule r├йcurrente que nous avons abord├йe dans l'unit├й pr├йc├йdente (simple, LSTM ou GRU). Dans notre exemple, nous utiliserons un LSTM.\n",
|
||||
"\n",
|
||||
"├Йtant donn├й que le r├йseau prend des caract├иres en entr├йe et que la taille du vocabulaire est assez petite, nous n'avons pas besoin de couche d'embedding ; une entr├йe encod├йe en one-hot peut ├кtre directement transmise ├а la cellule LSTM. Cependant, comme nous passons des num├йros de caract├иres en entr├йe, nous devons les encoder en one-hot avant de les transmettre au LSTM. Cela se fait en appelant la fonction `one_hot` pendant le passage `forward`. L'encodeur de sortie sera une couche lin├йaire qui convertira l'├йtat cach├й en une sortie encod├йe en one-hot.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class LSTMGenerator(torch.nn.Module):\n",
|
||||
" def __init__(self, vocab_size, hidden_dim):\n",
|
||||
" super().__init__()\n",
|
||||
" self.rnn = torch.nn.LSTM(vocab_size,hidden_dim,batch_first=True)\n",
|
||||
" self.fc = torch.nn.Linear(hidden_dim, vocab_size)\n",
|
||||
"\n",
|
||||
" def forward(self, x, s=None):\n",
|
||||
" x = torch.nn.functional.one_hot(x,vocab_size).to(torch.float32)\n",
|
||||
" x,s = self.rnn(x,s)\n",
|
||||
" return self.fc(x),s"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Pendant l'entra├оnement, nous voulons pouvoir ├йchantillonner du texte g├йn├йr├й. Pour cela, nous allons d├йfinir une fonction `generate` qui produira une cha├оne de caract├иres de longueur `size`, en commen├зant par la cha├оne initiale `start`.\n",
|
||||
"\n",
|
||||
"Voici comment cela fonctionne. Tout d'abord, nous passons la cha├оne de d├йpart compl├иte ├а travers le r├йseau, et nous obtenons l'├йtat de sortie `s` ainsi que le prochain caract├иre pr├йdit `out`. Comme `out` est encod├й en one-hot, nous utilisons `argmax` pour obtenir l'indice du caract├иre `nc` dans le vocabulaire, puis nous utilisons `itos` pour d├йterminer le caract├иre r├йel et l'ajouter ├а la liste r├йsultante de caract├иres `chars`. Ce processus de g├йn├йration d'un caract├иre est r├йp├йt├й `size` fois pour g├йn├йrer le nombre requis de caract├иres.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def generate(net,size=100,start='today '):\n",
|
||||
" chars = list(start)\n",
|
||||
" out, s = net(enc(chars).view(1,-1).to(device))\n",
|
||||
" for i in range(size):\n",
|
||||
" nc = torch.argmax(out[0][-1])\n",
|
||||
" chars.append(vocab.get_itos()[nc])\n",
|
||||
" out, s = net(nc.view(1,-1),s)\n",
|
||||
" return ''.join(chars)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Passons ├а l'entra├оnement ! La boucle d'entra├оnement est presque identique ├а celle de tous nos exemples pr├йc├йdents, mais au lieu d'afficher la pr├йcision, nous affichons un texte g├йn├йr├й ├йchantillonn├й tous les 1000 epochs.\n",
|
||||
"\n",
|
||||
"Une attention particuli├иre doit ├кtre port├йe ├а la mani├иre dont nous calculons la perte. Nous devons calculer la perte en utilisant une sortie encod├йe en one-hot `out` et le texte attendu `text_out`, qui est la liste des indices de caract├иres. Heureusement, la fonction `cross_entropy` attend en premier argument la sortie non normalis├йe du r├йseau, et en second le num├йro de classe, ce qui correspond exactement ├а ce que nous avons. Elle effectue ├йgalement une moyenne automatique sur la taille du minibatch.\n",
|
||||
"\n",
|
||||
"Nous limitons ├йgalement l'entra├оnement ├а `samples_to_train` ├йchantillons, afin de ne pas attendre trop longtemps. Nous vous encourageons ├а exp├йrimenter et ├а essayer un entra├оnement plus long, ├йventuellement sur plusieurs epochs (dans ce cas, vous devrez cr├йer une autre boucle autour de ce code).\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Current loss = 4.398899078369141\n",
|
||||
"today sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr s\n",
|
||||
"Current loss = 2.161320447921753\n",
|
||||
"today and to the tor to to the tor to to the tor to to the tor to to the tor to to the tor to to the tor t\n",
|
||||
"Current loss = 1.6722588539123535\n",
|
||||
"today and the court to the could to the could to the could to the could to the could to the could to the c\n",
|
||||
"Current loss = 2.423795223236084\n",
|
||||
"today and a second to the conternation of the conternation of the conternation of the conternation of the \n",
|
||||
"Current loss = 1.702607274055481\n",
|
||||
"today and the company to the company to the company to the company to the company to the company to the co\n",
|
||||
"Current loss = 1.692358136177063\n",
|
||||
"today and the company to the company to the company to the company to the company to the company to the co\n",
|
||||
"Current loss = 1.9722288846969604\n",
|
||||
"today and the control the control the control the control the control the control the control the control \n",
|
||||
"Current loss = 1.8705692291259766\n",
|
||||
"today and the second to the second to the second to the second to the second to the second to the second t\n",
|
||||
"Current loss = 1.7626899480819702\n",
|
||||
"today and a security and a security and a security and a security and a security and a security and a secu\n",
|
||||
"Current loss = 1.5574463605880737\n",
|
||||
"today and the company and the company and the company and the company and the company and the company and \n",
|
||||
"Current loss = 1.5620026588439941\n",
|
||||
"today and the be that the be the be that the be the be that the be the be that the be the be that the be t\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"net = LSTMGenerator(vocab_size,64).to(device)\n",
|
||||
"\n",
|
||||
"samples_to_train = 10000\n",
|
||||
"optimizer = torch.optim.Adam(net.parameters(),0.01)\n",
|
||||
"loss_fn = torch.nn.CrossEntropyLoss()\n",
|
||||
"net.train()\n",
|
||||
"for i,x in enumerate(train_dataset):\n",
|
||||
" # x[0] is class label, x[1] is text\n",
|
||||
" if len(x[1])-nchars<10:\n",
|
||||
" continue\n",
|
||||
" samples_to_train-=1\n",
|
||||
" if not samples_to_train: break\n",
|
||||
" text_in, text_out = get_batch(x[1])\n",
|
||||
" optimizer.zero_grad()\n",
|
||||
" out,s = net(text_in)\n",
|
||||
" loss = torch.nn.functional.cross_entropy(out.view(-1,vocab_size),text_out.flatten()) #cross_entropy(out,labels)\n",
|
||||
" loss.backward()\n",
|
||||
" optimizer.step()\n",
|
||||
" if i%1000==0:\n",
|
||||
" print(f\"Current loss = {loss.item()}\")\n",
|
||||
" print(generate(net))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Cet exemple g├йn├иre d├йj├а un texte de bonne qualit├й, mais il peut ├кtre encore am├йlior├й de plusieurs fa├зons :\n",
|
||||
"\n",
|
||||
"* **Meilleure g├йn├йration de minibatchs**. La mani├иre dont nous avons pr├йpar├й les donn├йes pour l'entra├оnement consistait ├а g├йn├йrer un minibatch ├а partir d'un seul ├йchantillon. Ce n'est pas id├йal, car les minibatchs ont tous des tailles diff├йrentes, et certains ne peuvent m├кme pas ├кtre g├йn├йr├йs, car le texte est plus petit que `nchars`. De plus, les petits minibatchs n'exploitent pas suffisamment le GPU. Il serait plus judicieux de prendre un grand bloc de texte ├а partir de tous les ├йchantillons, de g├йn├йrer ensuite toutes les paires entr├йe-sortie, de les m├йlanger, puis de cr├йer des minibatchs de taille ├йgale.\n",
|
||||
"\n",
|
||||
"* **LSTM multicouche**. Il est pertinent d'essayer 2 ou 3 couches de cellules LSTM. Comme nous l'avons mentionn├й dans l'unit├й pr├йc├йdente, chaque couche de LSTM extrait certains motifs du texte, et dans le cas d'un g├йn├йrateur au niveau des caract├иres, on peut s'attendre ├а ce que les couches inf├йrieures du LSTM soient responsables de l'extraction des syllabes, tandis que les couches sup├йrieures s'occupent des mots et des combinaisons de mots. Cela peut ├кtre simplement mis en ┼Уuvre en passant un param├иtre pour le nombre de couches au constructeur LSTM.\n",
|
||||
"\n",
|
||||
"* Vous pouvez ├йgalement exp├йrimenter avec des **unit├йs GRU** pour voir lesquelles donnent de meilleurs r├йsultats, ainsi qu'avec **diff├йrentes tailles de couches cach├йes**. Une couche cach├йe trop grande peut entra├оner un surapprentissage (par exemple, le r├йseau apprendra le texte exact), tandis qu'une taille trop petite pourrait ne pas produire de bons r├йsultats.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## G├йn├йration de texte souple et temp├йrature\n",
|
||||
"\n",
|
||||
"Dans la d├йfinition pr├йc├йdente de `generate`, nous choisissions toujours le caract├иre avec la probabilit├й la plus ├йlev├йe comme prochain caract├иre dans le texte g├йn├йr├й. Cela avait pour cons├йquence que le texte \"tournait\" souvent en boucle entre les m├кmes s├йquences de caract├иres, comme dans cet exemple :\n",
|
||||
"```\n",
|
||||
"today of the second the company and a second the company ...\n",
|
||||
"```\n",
|
||||
"\n",
|
||||
"Cependant, si nous examinons la distribution de probabilit├й pour le prochain caract├иre, il se peut que la diff├йrence entre quelques-unes des probabilit├йs les plus ├йlev├йes ne soit pas ├йnorme, par exemple un caract├иre peut avoir une probabilit├й de 0,2, un autre de 0,19, etc. Par exemple, lorsqu'on cherche le prochain caract├иre dans la s├йquence '*play*', le caract├иre suivant pourrait tout aussi bien ├кtre un espace ou **e** (comme dans le mot *player*).\n",
|
||||
"\n",
|
||||
"Cela nous am├иne ├а la conclusion qu'il n'est pas toujours \"juste\" de s├йlectionner le caract├иre avec la probabilit├й la plus ├йlev├йe, car choisir le deuxi├иme plus probable pourrait ├йgalement conduire ├а un texte coh├йrent. Il est plus judicieux de **pr├йlever un ├йchantillon** des caract├иres ├а partir de la distribution de probabilit├й donn├йe par la sortie du r├йseau.\n",
|
||||
"\n",
|
||||
"Ce pr├йl├иvement peut ├кtre effectu├й ├а l'aide de la fonction `multinomial`, qui met en ┼Уuvre ce qu'on appelle la **distribution multinomiale**. Une fonction qui impl├йmente cette g├йn├йration de texte **souple** est d├йfinie ci-dessous :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"metadata": {
|
||||
"scrolled": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"--- Temperature = 0.3\n",
|
||||
"Today and a company and complete an all the land the restrational the as a security and has provers the pay to and a report and the computer in the stand has filities and working the law the stations for a company and with the company and the final the first company and refight of the state and and workin\n",
|
||||
"\n",
|
||||
"--- Temperature = 0.8\n",
|
||||
"Today he oniis its first to Aus bomblaties the marmation a to manan boogot that pirate assaid a relaid their that goverfin the the Cappets Ecrotional Assonia Cition targets it annight the w scyments Blamity #39;s TVeer Diercheg Reserals fran envyuil that of ster said access what succers of Dour-provelith\n",
|
||||
"\n",
|
||||
"--- Temperature = 1.0\n",
|
||||
"Today holy they a 11 will meda a toket subsuaties, engins for Chanos, they's has stainger past to opening orital his thempting new Nattona was al innerforder advan-than #36;s night year his religuled talitatian what the but with Wednesday to Justment will wemen of Mark CCC Camp as Timed Nae wome a leaders\n",
|
||||
"\n",
|
||||
"--- Temperature = 1.3\n",
|
||||
"Today gpone 2.5 fech atcusion poor cocles toparsdorM.cht Line Pamage put 43 his calt lowed to the book, that has authh-the silia rruch ailing to'ory andhes beutirsimi- Aefffive heading offil an auf eacklets is charged evis, Gunymy oy) Mony has it after-sloythyor loveId out filme, the Natabl -Najuntaxiggs \n",
|
||||
"\n",
|
||||
"--- Temperature = 1.8\n",
|
||||
"Today plary, P.slan chly\\401 mardregationly #39;t 8.1Mide) closes ,filtcon alfly playin roven!\\grea.-QFBEP: Iss onfarchQ/itilia CCf Zivesigntwasta orce.-Peul-aw.uicrin of fuglinfsut aftaningwo, MIEX awayew Aice Woiduar Corvagiugge oppo esig ThusBratourid canthly-RyI.co lagitems\\eexciaishes.conBabntusmor I\n",
|
||||
"\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def generate_soft(net,size=100,start='today ',temperature=1.0):\n",
|
||||
" chars = list(start)\n",
|
||||
" out, s = net(enc(chars).view(1,-1).to(device))\n",
|
||||
" for i in range(size):\n",
|
||||
" #nc = torch.argmax(out[0][-1])\n",
|
||||
" out_dist = out[0][-1].div(temperature).exp()\n",
|
||||
" nc = torch.multinomial(out_dist,1)[0]\n",
|
||||
" chars.append(vocab.get_itos()[nc])\n",
|
||||
" out, s = net(nc.view(1,-1),s)\n",
|
||||
" return ''.join(chars)\n",
|
||||
" \n",
|
||||
"for i in [0.3,0.8,1.0,1.3,1.8]:\n",
|
||||
" print(f\"--- Temperature = {i}\\n{generate_soft(net,size=300,start='Today ',temperature=i)}\\n\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Nous avons introduit un param├иtre suppl├йmentaire appel├й **temp├йrature**, qui est utilis├й pour indiquer ├а quel point nous devons nous en tenir ├а la probabilit├й la plus ├йlev├йe. Si la temp├йrature est de 1,0, nous effectuons un ├йchantillonnage multinomial ├йquitable, et lorsque la temp├йrature tend vers l'infini - toutes les probabilit├йs deviennent ├йgales, et nous s├йlectionnons al├йatoirement le prochain caract├иre. Dans l'exemple ci-dessous, nous pouvons observer que le texte devient d├йnu├й de sens lorsque nous augmentons trop la temp├йrature, et qu'il ressemble ├а un texte \"cycl├й\" g├йn├йr├й de mani├иre rigide lorsqu'il se rapproche de 0.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**Avertissement** : \nCe document a ├йt├й traduit ├а l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatis├йes peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit ├кtre consid├йr├й comme la source faisant autorit├й. Pour des informations critiques, il est recommand├й de recourir ├а une traduction professionnelle r├йalis├йe par un humain. Nous d├йclinons toute responsabilit├й en cas de malentendus ou d'interpr├йtations erron├йes r├йsultant de l'utilisation de cette traduction.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"interpreter": {
|
||||
"hash": "16af2a8bbb083ea23e5e41c7f5787656b2ce26968575d8763f2c4b17f9cd711f"
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3.8.12 ('py38')",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.8.12"
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "7673cd150d96c74c6d6011460094efb4",
|
||||
"translation_date": "2025-08-31T15:13:04+00:00",
|
||||
"source_file": "lessons/5-NLP/17-GenerativeNetworks/GenerativePyTorch.ipynb",
|
||||
"language_code": "fr"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 4
|
||||
}
|
||||
|
|
@ -0,0 +1,495 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# R├йseaux g├йn├йratifs\n",
|
||||
"\n",
|
||||
"Les r├йseaux neuronaux r├йcurrents (RNNs) et leurs variantes ├а cellules ├а portes, comme les cellules Long Short Term Memory (LSTMs) et les Gated Recurrent Units (GRUs), ont introduit un m├йcanisme pour la mod├йlisation du langage, c'est-├а-dire qu'ils peuvent apprendre l'ordre des mots et fournir des pr├йdictions pour le mot suivant dans une s├йquence. Cela nous permet d'utiliser les RNNs pour des **t├вches g├йn├йratives**, telles que la g├йn├йration de texte ordinaire, la traduction automatique et m├кme la g├йn├йration de l├йgendes pour des images.\n",
|
||||
"\n",
|
||||
"Dans l'architecture RNN que nous avons abord├йe dans l'unit├й pr├йc├йdente, chaque unit├й RNN produisait le prochain ├йtat cach├й comme sortie. Cependant, nous pouvons ├йgalement ajouter une autre sortie ├а chaque unit├й r├йcurrente, ce qui nous permettrait de produire une **s├йquence** (de m├кme longueur que la s├йquence d'origine). De plus, nous pouvons utiliser des unit├йs RNN qui n'acceptent pas d'entr├йe ├а chaque ├йtape, mais qui prennent simplement un vecteur d'├йtat initial, puis produisent une s├йquence de sorties.\n",
|
||||
"\n",
|
||||
"Dans ce notebook, nous allons nous concentrer sur des mod├иles g├йn├йratifs simples qui nous aident ├а g├йn├йrer du texte. Pour simplifier, construisons un **r├йseau au niveau des caract├иres**, qui g├йn├иre du texte lettre par lettre. Pendant l'entra├оnement, nous devons prendre un corpus de texte et le diviser en s├йquences de lettres.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import tensorflow as tf\n",
|
||||
"from tensorflow import keras\n",
|
||||
"import tensorflow_datasets as tfds\n",
|
||||
"import numpy as np\n",
|
||||
"\n",
|
||||
"ds_train, ds_test = tfds.load('ag_news_subset').values()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Construire un vocabulaire de caract├иres\n",
|
||||
"\n",
|
||||
"Pour cr├йer un r├йseau g├йn├йratif au niveau des caract├иres, nous devons diviser le texte en caract├иres individuels plut├┤t qu'en mots. La couche `TextVectorization` que nous avons utilis├йe auparavant ne peut pas le faire, donc nous avons deux options :\n",
|
||||
"\n",
|
||||
"* Charger manuellement le texte et effectuer la tokenisation \"├а la main\", comme dans [cet exemple officiel de Keras](https://keras.io/examples/generative/lstm_character_level_text_generation/)\n",
|
||||
"* Utiliser la classe `Tokenizer` pour la tokenisation au niveau des caract├иres.\n",
|
||||
"\n",
|
||||
"Nous allons opter pour la deuxi├иme option. `Tokenizer` peut ├йgalement ├кtre utilis├й pour la tokenisation en mots, ce qui permet de passer facilement de la tokenisation au niveau des caract├иres ├а celle au niveau des mots.\n",
|
||||
"\n",
|
||||
"Pour effectuer une tokenisation au niveau des caract├иres, nous devons passer le param├иtre `char_level=True` :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def extract_text(x):\n",
|
||||
" return x['title']+' '+x['description']\n",
|
||||
"\n",
|
||||
"def tupelize(x):\n",
|
||||
" return (extract_text(x),x['label'])\n",
|
||||
"\n",
|
||||
"tokenizer = keras.preprocessing.text.Tokenizer(char_level=True,lower=False)\n",
|
||||
"tokenizer.fit_on_texts([x['title'].numpy().decode('utf-8') for x in ds_train])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Nous voulons ├йgalement utiliser un jeton sp├йcial pour indiquer **fin de s├йquence**, que nous appellerons `<eos>`. Ajoutons-le manuellement au vocabulaire :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"eos_token = len(tokenizer.word_index)+1\n",
|
||||
"tokenizer.word_index['<eos>'] = eos_token\n",
|
||||
"\n",
|
||||
"vocab_size = eos_token + 1"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[[48, 2, 10, 10, 5, 44, 1, 25, 5, 8, 10, 13, 78]]"
|
||||
]
|
||||
},
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"tokenizer.texts_to_sequences(['Hello, world!'])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Entra├оner un RNN g├йn├йratif ├а cr├йer des titres\n",
|
||||
"\n",
|
||||
"La mani├иre dont nous allons entra├оner un RNN ├а g├йn├йrer des titres d'actualit├йs est la suivante. ├А chaque ├йtape, nous prendrons un titre, qui sera introduit dans un RNN, et pour chaque caract├иre d'entr├йe, nous demanderons au r├йseau de g├йn├йrer le caract├иre de sortie suivant :\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"Pour le dernier caract├иre de notre s├йquence, nous demanderons au r├йseau de g├йn├йrer le token `<eos>`.\n",
|
||||
"\n",
|
||||
"La principale diff├йrence avec le RNN g├йn├йratif que nous utilisons ici est que nous prendrons une sortie ├а chaque ├йtape du RNN, et pas seulement ├а partir de la cellule finale. Cela peut ├кtre r├йalis├й en sp├йcifiant le param├иtre `return_sequences` ├а la cellule RNN.\n",
|
||||
"\n",
|
||||
"Ainsi, pendant l'entra├оnement, une entr├йe pour le r├йseau sera une s├йquence de caract├иres encod├йs d'une certaine longueur, et une sortie sera une s├йquence de la m├кme longueur, mais d├йcal├йe d'un ├йl├йment et termin├йe par `<eos>`. Un minibatch sera constitu├й de plusieurs de ces s├йquences, et nous devrons utiliser **padding** pour aligner toutes les s├йquences.\n",
|
||||
"\n",
|
||||
"Cr├йons des fonctions qui transformeront le jeu de donn├йes pour nous. Comme nous voulons ajouter du padding aux s├йquences au niveau du minibatch, nous commencerons par regrouper le jeu de donn├йes en appelant `.batch()`, puis nous utiliserons `map` pour effectuer la transformation. Ainsi, la fonction de transformation prendra un minibatch entier comme param├иtre :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def title_batch(x):\n",
|
||||
" x = [t.numpy().decode('utf-8') for t in x]\n",
|
||||
" z = tokenizer.texts_to_sequences(x)\n",
|
||||
" z = tf.keras.preprocessing.sequence.pad_sequences(z)\n",
|
||||
" return tf.one_hot(z,vocab_size), tf.one_hot(tf.concat([z[:,1:],tf.constant(eos_token,shape=(len(z),1))],axis=1),vocab_size)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Quelques points importants que nous faisons ici :\n",
|
||||
"* Nous commen├зons par extraire le texte r├йel du tenseur de cha├оnes\n",
|
||||
"* `text_to_sequences` convertit la liste de cha├оnes en une liste de tenseurs d'entiers\n",
|
||||
"* `pad_sequences` remplit ces tenseurs jusqu'├а leur longueur maximale\n",
|
||||
"* Enfin, nous encodons tous les caract├иres en one-hot, tout en effectuant le d├йcalage et en ajoutant `<eos>`. Nous verrons bient├┤t pourquoi nous avons besoin de caract├иres encod├йs en one-hot.\n",
|
||||
"\n",
|
||||
"Cependant, cette fonction est **Pythonique**, c'est-├а-dire qu'elle ne peut pas ├кtre automatiquement traduite en graphe computationnel Tensorflow. Nous obtiendrons des erreurs si nous essayons d'utiliser cette fonction directement dans la fonction `Dataset.map`. Nous devons encapsuler cet appel Pythonique en utilisant le wrapper `py_function` :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def title_batch_fn(x):\n",
|
||||
" x = x['title']\n",
|
||||
" a,b = tf.py_function(title_batch,inp=[x],Tout=(tf.float32,tf.float32))\n",
|
||||
" return a,b"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **Note** : Diff├йrencier entre les fonctions de transformation Pythonic et Tensorflow peut sembler un peu trop complexe, et vous pourriez vous demander pourquoi nous ne transformons pas le dataset en utilisant des fonctions Python standard avant de le passer ├а `fit`. Bien que cela soit tout ├а fait possible, utiliser `Dataset.map` pr├йsente un ├йnorme avantage, car le pipeline de transformation des donn├йes est ex├йcut├й via le graphe computationnel de Tensorflow, ce qui permet de tirer parti des calculs sur GPU et de minimiser le besoin de transf├йrer les donn├йes entre le CPU et le GPU.\n",
|
||||
"\n",
|
||||
"Nous pouvons maintenant construire notre r├йseau g├йn├йrateur et commencer l'entra├оnement. Il peut ├кtre bas├й sur n'importe quelle cellule r├йcurrente que nous avons abord├йe dans l'unit├й pr├йc├йdente (simple, LSTM ou GRU). Dans notre exemple, nous utiliserons LSTM.\n",
|
||||
"\n",
|
||||
"├Йtant donn├й que le r├йseau prend des caract├иres en entr├йe et que la taille du vocabulaire est assez petite, nous n'avons pas besoin de couche d'embedding ; une entr├йe encod├йe en one-hot peut directement ├кtre transmise ├а la cellule LSTM. La couche de sortie sera un classificateur `Dense` qui convertira la sortie du LSTM en num├йros de tokens encod├йs en one-hot.\n",
|
||||
"\n",
|
||||
"De plus, comme nous travaillons avec des s├йquences de longueur variable, nous pouvons utiliser une couche `Masking` pour cr├йer un masque qui ignorera la partie remplie de la cha├оne. Ce n'est pas strictement n├йcessaire, car nous ne sommes pas particuli├иrement int├йress├йs par tout ce qui d├йpasse le token `<eos>`, mais nous l'utiliserons dans le but d'acqu├йrir de l'exp├йrience avec ce type de couche. `input_shape` serait `(None, vocab_size)`, o├╣ `None` indique une s├йquence de longueur variable, et la forme de sortie est ├йgalement `(None, vocab_size)`, comme vous pouvez le voir dans le `summary` :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Model: \"sequential\"\n",
|
||||
"_________________________________________________________________\n",
|
||||
"Layer (type) Output Shape Param # \n",
|
||||
"=================================================================\n",
|
||||
"masking (Masking) (None, None, 84) 0 \n",
|
||||
"_________________________________________________________________\n",
|
||||
"lstm (LSTM) (None, None, 128) 109056 \n",
|
||||
"_________________________________________________________________\n",
|
||||
"dense (Dense) (None, None, 84) 10836 \n",
|
||||
"=================================================================\n",
|
||||
"Total params: 119,892\n",
|
||||
"Trainable params: 119,892\n",
|
||||
"Non-trainable params: 0\n",
|
||||
"_________________________________________________________________\n",
|
||||
"15000/15000 [==============================] - 229s 15ms/step - loss: 1.5385\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<tensorflow.python.keras.callbacks.History at 0x7fa40c1245e0>"
|
||||
]
|
||||
},
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"model = keras.models.Sequential([\n",
|
||||
" keras.layers.Masking(input_shape=(None,vocab_size)),\n",
|
||||
" keras.layers.LSTM(128,return_sequences=True),\n",
|
||||
" keras.layers.Dense(vocab_size,activation='softmax')\n",
|
||||
"])\n",
|
||||
"\n",
|
||||
"model.summary()\n",
|
||||
"model.compile(loss='categorical_crossentropy')\n",
|
||||
"\n",
|
||||
"model.fit(ds_train.batch(8).map(title_batch_fn))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## G├йn├йration de sortie\n",
|
||||
"\n",
|
||||
"Maintenant que nous avons entra├оn├й le mod├иle, nous souhaitons l'utiliser pour g├йn├йrer une sortie. Tout d'abord, nous avons besoin d'une m├йthode pour d├йcoder le texte repr├йsent├й par une s├йquence de num├йros de tokens. Pour cela, nous pourrions utiliser la fonction `tokenizer.sequences_to_texts` ; cependant, elle ne fonctionne pas bien avec une tokenisation au niveau des caract├иres. Par cons├йquent, nous allons prendre un dictionnaire de tokens provenant du tokenizer (appel├й `word_index`), construire une correspondance invers├йe, et ├йcrire notre propre fonction de d├йcodage :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"reverse_map = {val:key for key, val in tokenizer.word_index.items()}\n",
|
||||
"\n",
|
||||
"def decode(x):\n",
|
||||
" return ''.join([reverse_map[t] for t in x])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Commen├зons par une cha├оne `start`, que nous encodons en une s├йquence `inp`, puis ├а chaque ├йtape, nous appelons notre r├йseau pour d├йduire le caract├иre suivant.\n",
|
||||
"\n",
|
||||
"La sortie du r├йseau `out` est un vecteur de `vocab_size` ├йl├йments repr├йsentant les probabilit├йs de chaque jeton, et nous pouvons trouver le num├йro du jeton le plus probable en utilisant `argmax`. Nous ajoutons ensuite ce caract├иre ├а la liste des jetons g├йn├йr├йs et poursuivons la g├йn├йration. Ce processus de g├йn├йration d'un caract├иre est r├йp├йt├й `size` fois pour produire le nombre requis de caract├иres, et nous terminons plus t├┤t si le `eos_token` est rencontr├й.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 12,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"'Today #39;s lead to strike for the strike for the strike for the strike (AFP)'"
|
||||
]
|
||||
},
|
||||
"execution_count": 12,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def generate(model,size=100,start='Today '):\n",
|
||||
" inp = tokenizer.texts_to_sequences([start])[0]\n",
|
||||
" chars = inp\n",
|
||||
" for i in range(size):\n",
|
||||
" out = model(tf.expand_dims(tf.one_hot(inp,vocab_size),0))[0][-1]\n",
|
||||
" nc = tf.argmax(out)\n",
|
||||
" if nc==eos_token:\n",
|
||||
" break\n",
|
||||
" chars.append(nc.numpy())\n",
|
||||
" inp = inp+[nc]\n",
|
||||
" return decode(chars)\n",
|
||||
" \n",
|
||||
"generate(model)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## ├Йchantillonnage des r├йsultats pendant l'entra├оnement\n",
|
||||
"\n",
|
||||
"├Йtant donn├й que nous ne disposons d'aucune m├йtrique utile comme *l'exactitude*, la seule mani├иre de v├йrifier que notre mod├иle s'am├йliore est de **pr├йlever des exemples** de cha├оnes g├йn├йr├йes pendant l'entra├оnement. Pour ce faire, nous utiliserons des **callbacks**, c'est-├а-dire des fonctions que nous pouvons passer ├а la fonction `fit`, et qui seront appel├йes p├йriodiquement pendant l'entra├оnement.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 13,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Epoch 1/3\n",
|
||||
"15000/15000 [==============================] - 226s 15ms/step - loss: 1.2703\n",
|
||||
"Today #39;s a lead in the company for the strike\n",
|
||||
"Epoch 2/3\n",
|
||||
"15000/15000 [==============================] - 227s 15ms/step - loss: 1.2057\n",
|
||||
"Today #39;s the Market Service on Security Start (AP)\n",
|
||||
"Epoch 3/3\n",
|
||||
"15000/15000 [==============================] - 226s 15ms/step - loss: 1.1752\n",
|
||||
"Today #39;s a line on the strike to start for the start\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<tensorflow.python.keras.callbacks.History at 0x7fa40c74e3d0>"
|
||||
]
|
||||
},
|
||||
"execution_count": 13,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"sampling_callback = keras.callbacks.LambdaCallback(\n",
|
||||
" on_epoch_end = lambda batch, logs: print(generate(model))\n",
|
||||
")\n",
|
||||
"\n",
|
||||
"model.fit(ds_train.batch(8).map(title_batch_fn),callbacks=[sampling_callback],epochs=3)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Cet exemple g├йn├иre d├йj├а un texte assez bon, mais il peut ├кtre am├йlior├й de plusieurs fa├зons :\n",
|
||||
"\n",
|
||||
"* **Plus de texte**. Nous avons uniquement utilis├й des titres pour notre t├вche, mais vous pourriez vouloir exp├йrimenter avec du texte complet. Gardez ├а l'esprit que les RNN ne sont pas tr├иs performants pour g├йrer de longues s├йquences, il est donc judicieux soit de les diviser en phrases plus courtes, soit de toujours entra├оner sur une longueur de s├йquence fixe d'une valeur pr├йd├йfinie `num_chars` (par exemple, 256). Vous pourriez essayer de modifier l'exemple ci-dessus pour adopter une telle architecture, en vous inspirant du [tutoriel officiel de Keras](https://keras.io/examples/generative/lstm_character_level_text_generation/).\n",
|
||||
"\n",
|
||||
"* **LSTM multicouche**. Il est pertinent d'essayer 2 ou 3 couches de cellules LSTM. Comme mentionn├й dans l'unit├й pr├йc├йdente, chaque couche de LSTM extrait certains motifs du texte, et dans le cas d'un g├йn├йrateur au niveau des caract├иres, on peut s'attendre ├а ce que le niveau inf├йrieur du LSTM soit responsable de l'extraction des syllabes, et les niveaux sup├йrieurs - des mots et des combinaisons de mots. Cela peut ├кtre simplement impl├йment├й en passant un param├иtre de nombre de couches au constructeur LSTM.\n",
|
||||
"\n",
|
||||
"* Vous pourriez ├йgalement vouloir exp├йrimenter avec **les unit├йs GRU** pour voir lesquelles donnent de meilleurs r├йsultats, ainsi qu'avec **diff├йrentes tailles de couches cach├йes**. Une couche cach├йe trop grande peut entra├оner un surapprentissage (par exemple, le r├йseau apprendra le texte exact), tandis qu'une taille trop petite pourrait ne pas produire de bons r├йsultats.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## G├йn├йration de texte souple et temp├йrature\n",
|
||||
"\n",
|
||||
"Dans la d├йfinition pr├йc├йdente de `generate`, nous choisissions toujours le caract├иre avec la probabilit├й la plus ├йlev├йe comme prochain caract├иre dans le texte g├йn├йr├й. Cela avait pour cons├йquence que le texte \"cyclait\" souvent entre les m├кmes s├йquences de caract├иres encore et encore, comme dans cet exemple : \n",
|
||||
"```\n",
|
||||
"today of the second the company and a second the company ...\n",
|
||||
"```\n",
|
||||
"\n",
|
||||
"Cependant, si nous examinons la distribution de probabilit├й pour le prochain caract├иre, il se peut que la diff├йrence entre quelques probabilit├йs les plus ├йlev├йes ne soit pas ├йnorme, par exemple, un caract├иre peut avoir une probabilit├й de 0,2, un autre de 0,19, etc. Par exemple, en cherchant le prochain caract├иre dans la s├йquence '*play*', le caract├иre suivant pourrait tout aussi bien ├кtre un espace ou un **e** (comme dans le mot *player*).\n",
|
||||
"\n",
|
||||
"Cela nous am├иne ├а la conclusion qu'il n'est pas toujours \"juste\" de s├йlectionner le caract├иre avec la probabilit├й la plus ├йlev├йe, car choisir le deuxi├иme plus probable pourrait ├йgalement conduire ├а un texte coh├йrent. Il est plus judicieux de **pr├йlever un ├йchantillon** parmi les caract├иres en fonction de la distribution de probabilit├й donn├йe par la sortie du r├йseau.\n",
|
||||
"\n",
|
||||
"Ce pr├йl├иvement peut ├кtre effectu├й ├а l'aide de la fonction `np.multinomial`, qui impl├йmente ce que l'on appelle la **distribution multinomiale**. Une fonction qui impl├йmente cette g├йn├йration de texte **souple** est d├йfinie ci-dessous :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 33,
|
||||
"metadata": {
|
||||
"scrolled": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"\n",
|
||||
"--- Temperature = 0.3\n",
|
||||
"Today #39;s strike #39; to start at the store return\n",
|
||||
"On Sunday PO to Be Data Profit Up (Reuters)\n",
|
||||
"Moscow, SP wins straight to the Microsoft #39;s control of the space start\n",
|
||||
"President olding of the blast start for the strike to pay <b>...</b>\n",
|
||||
"Little red riding hood ficed to the spam countered in European <b>...</b>\n",
|
||||
"\n",
|
||||
"--- Temperature = 0.8\n",
|
||||
"Today countie strikes ryder missile faces food market blut\n",
|
||||
"On Sunday collores lose-toppy of sale of Bullment in <b>...</b>\n",
|
||||
"Moscow, IBM Diffeiting in Afghan Software Hotels (Reuters)\n",
|
||||
"President Ol Luster for Profit Peaced Raised (AP)\n",
|
||||
"Little red riding hood dace on depart talks #39; bank up\n",
|
||||
"\n",
|
||||
"--- Temperature = 1.0\n",
|
||||
"Today wits House buiting debate fixes #39; supervice stake again\n",
|
||||
"On Sunday arling digital poaching In for level\n",
|
||||
"Moscow, DS Up 7, Top Proble Protest Caprey Mamarian Strike\n",
|
||||
"President teps help of roubler stepted lessabul-Dhalitics (AFP)\n",
|
||||
"Little red riding hood signs on cash in Carter-youb\n",
|
||||
"\n",
|
||||
"--- Temperature = 1.3\n",
|
||||
"Today wits flawer ro, pSIA figat's co DroftwavesIs Talo up\n",
|
||||
"On Sunday hround elitwing wint EU Powerburlinetien\n",
|
||||
"Moscow, Bazz #39;s sentries olymen winnelds' next for Olympite Huc?\n",
|
||||
"President lost securitys from power Elections in Smiltrials\n",
|
||||
"Little red riding hood vides profit, exponituity, profitmainalist-at said listers\n",
|
||||
"\n",
|
||||
"--- Temperature = 1.8\n",
|
||||
"Today #39;It: He deat: N.KA Asside\n",
|
||||
"On Sunday i arry Par aldeup patient Wo stele1\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ename": "KeyError",
|
||||
"evalue": "0",
|
||||
"output_type": "error",
|
||||
"traceback": [
|
||||
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
|
||||
"\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)",
|
||||
"\u001b[0;32m<ipython-input-33-db32367a0feb>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"\\n--- Temperature = {i}\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 19\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mj\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 20\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgenerate_soft\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0msize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m300\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mstart\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mwords\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mj\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mtemperature\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
|
||||
"\u001b[0;32m<ipython-input-33-db32367a0feb>\u001b[0m in \u001b[0;36mgenerate_soft\u001b[0;34m(model, size, start, temperature)\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0mchars\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0minp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minp\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnc\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 13\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mdecode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mchars\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 14\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[0mwords\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m'Today '\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'On Sunday '\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'Moscow, '\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'President '\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'Little red riding hood '\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
||||
"\u001b[0;32m<ipython-input-10-3f5fa6130b1d>\u001b[0m in \u001b[0;36mdecode\u001b[0;34m(x)\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mdecode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0;34m''\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjoin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mreverse_map\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mt\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
|
||||
"\u001b[0;32m<ipython-input-10-3f5fa6130b1d>\u001b[0m in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mdecode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0;34m''\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjoin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mreverse_map\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mt\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
|
||||
"\u001b[0;31mKeyError\u001b[0m: 0"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def generate_soft(model,size=100,start='Today ',temperature=1.0):\n",
|
||||
" inp = tokenizer.texts_to_sequences([start])[0]\n",
|
||||
" chars = inp\n",
|
||||
" for i in range(size):\n",
|
||||
" out = model(tf.expand_dims(tf.one_hot(inp,vocab_size),0))[0][-1]\n",
|
||||
" probs = tf.exp(tf.math.log(out)/temperature).numpy().astype(np.float64)\n",
|
||||
" probs = probs/np.sum(probs)\n",
|
||||
" nc = np.argmax(np.random.multinomial(1,probs,1))\n",
|
||||
" if nc==eos_token:\n",
|
||||
" break\n",
|
||||
" chars.append(nc)\n",
|
||||
" inp = inp+[nc]\n",
|
||||
" return decode(chars)\n",
|
||||
"\n",
|
||||
"words = ['Today ','On Sunday ','Moscow, ','President ','Little red riding hood ']\n",
|
||||
" \n",
|
||||
"for i in [0.3,0.8,1.0,1.3,1.8]:\n",
|
||||
" print(f\"\\n--- Temperature = {i}\")\n",
|
||||
" for j in range(5):\n",
|
||||
" print(generate_soft(model,size=300,start=words[j],temperature=i))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Nous avons introduit un param├иtre suppl├йmentaire appel├й **temp├йrature**, qui est utilis├й pour indiquer ├а quel point nous devons nous en tenir ├а la probabilit├й la plus ├йlev├йe. Si la temp├йrature est de 1,0, nous effectuons un ├йchantillonnage multinomial ├йquitable, et lorsque la temp├йrature tend vers l'infini - toutes les probabilit├йs deviennent ├йgales, et nous s├йlectionnons al├йatoirement le prochain caract├иre. Dans l'exemple ci-dessous, nous pouvons observer que le texte devient d├йnu├й de sens lorsque nous augmentons trop la temp├йrature, et il ressemble ├а un texte \"cycl├й\" g├йn├йr├й de mani├иre rigide lorsqu'il se rapproche de 0.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**Avertissement** : \nCe document a ├йt├й traduit ├а l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatis├йes peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit ├кtre consid├йr├й comme la source faisant autorit├й. Pour des informations critiques, il est recommand├й de recourir ├а une traduction professionnelle effectu├йe par un humain. Nous d├йclinons toute responsabilit├й en cas de malentendus ou d'interpr├йtations erron├йes r├йsultant de l'utilisation de cette traduction.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"interpreter": {
|
||||
"hash": "16af2a8bbb083ea23e5e41c7f5787656b2ce26968575d8763f2c4b17f9cd711f"
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3.8.12 ('py38')",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.8.12"
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "9fbb7d5fda708537649f71f5f646fcde",
|
||||
"translation_date": "2025-08-31T15:11:26+00:00",
|
||||
"source_file": "lessons/5-NLP/17-GenerativeNetworks/GenerativeTF.ipynb",
|
||||
"language_code": "fr"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 4
|
||||
}
|
||||
|
|
@ -0,0 +1,353 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# M├йcanismes d'attention et transformateurs\n",
|
||||
"\n",
|
||||
"Un inconv├йnient majeur des r├йseaux r├йcurrents est que tous les mots d'une s├йquence ont le m├кme impact sur le r├йsultat. Cela entra├оne des performances sous-optimales avec les mod├иles standard encodeur-d├йcodeur LSTM pour les t├вches de s├йquence ├а s├йquence, telles que la reconnaissance d'entit├йs nomm├йes et la traduction automatique. En r├йalit├й, certains mots sp├йcifiques de la s├йquence d'entr├йe ont souvent plus d'impact sur les sorties s├йquentielles que d'autres.\n",
|
||||
"\n",
|
||||
"Prenons un mod├иle de s├йquence ├а s├йquence, comme la traduction automatique. Il est impl├йment├й par deux r├йseaux r├йcurrents, o├╣ un r├йseau (**encodeur**) compresse la s├йquence d'entr├йe dans un ├йtat cach├й, et un autre (**d├йcodeur**) d├йploie cet ├йtat cach├й pour produire le r├йsultat traduit. Le probl├иme avec cette approche est que l'├йtat final du r├йseau a du mal ├а se souvenir du d├йbut de la phrase, ce qui entra├оne une qualit├й m├йdiocre du mod├иle pour les phrases longues.\n",
|
||||
"\n",
|
||||
"Les **m├йcanismes d'attention** offrent un moyen de pond├йrer l'impact contextuel de chaque vecteur d'entr├йe sur chaque pr├йdiction de sortie du RNN. Cela est r├йalis├й en cr├йant des raccourcis entre les ├йtats interm├йdiaires du RNN d'entr├йe et du RNN de sortie. Ainsi, lors de la g├йn├йration du symbole de sortie $y_t$, nous prenons en compte tous les ├йtats cach├йs d'entr├йe $h_i$, avec diff├йrents coefficients de pond├йration $\\alpha_{t,i}$.\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"*Le mod├иle encodeur-d├йcodeur avec m├йcanisme d'attention additive dans [Bahdanau et al., 2015](https://arxiv.org/pdf/1409.0473.pdf), cit├й de [ce billet de blog](https://lilianweng.github.io/lil-log/2018/06/24/attention-attention.html)*\n",
|
||||
"\n",
|
||||
"La matrice d'attention $\\{\\alpha_{i,j}\\}$ repr├йsente le degr├й auquel certains mots d'entr├йe influencent la g├йn├йration d'un mot donn├й dans la s├йquence de sortie. Voici un exemple de cette matrice :\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"*Figure tir├йe de [Bahdanau et al., 2015](https://arxiv.org/pdf/1409.0473.pdf) (Fig.3)*\n",
|
||||
"\n",
|
||||
"Les m├йcanismes d'attention sont responsables de la plupart des avanc├йes actuelles ou proches de l'├йtat de l'art en traitement du langage naturel. Cependant, l'ajout d'attention augmente consid├йrablement le nombre de param├иtres du mod├иle, ce qui a entra├оn├й des probl├иmes de mise ├а l'├йchelle avec les RNN. Une contrainte cl├й pour la mise ├а l'├йchelle des RNN est que la nature r├йcurrente des mod├иles rend difficile le traitement par lots et la parall├йlisation de l'entra├оnement. Dans un RNN, chaque ├йl├йment d'une s├йquence doit ├кtre trait├й dans un ordre s├йquentiel, ce qui signifie qu'il ne peut pas ├кtre facilement parall├йlis├й.\n",
|
||||
"\n",
|
||||
"L'adoption des m├йcanismes d'attention combin├йe ├а cette contrainte a conduit ├а la cr├йation des mod├иles transformateurs, d├йsormais ├а l'├йtat de l'art, que nous connaissons et utilisons aujourd'hui, de BERT ├а OpenGPT3.\n",
|
||||
"\n",
|
||||
"## Mod├иles transformateurs\n",
|
||||
"\n",
|
||||
"Au lieu de transmettre le contexte de chaque pr├йdiction pr├йc├йdente ├а l'├йtape d'├йvaluation suivante, les **mod├иles transformateurs** utilisent des **encodages positionnels** et l'attention pour capturer le contexte d'une entr├йe donn├йe dans une fen├кtre de texte fournie. L'image ci-dessous montre comment les encodages positionnels avec attention peuvent capturer le contexte dans une fen├кtre donn├йe.\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"├Йtant donn├й que chaque position d'entr├йe est mapp├йe ind├йpendamment ├а chaque position de sortie, les transformateurs peuvent mieux parall├йliser que les RNN, ce qui permet des mod├иles de langage beaucoup plus grands et plus expressifs. Chaque t├кte d'attention peut ├кtre utilis├йe pour apprendre diff├йrentes relations entre les mots, ce qui am├йliore les t├вches de traitement du langage naturel en aval.\n",
|
||||
"\n",
|
||||
"**BERT** (Bidirectional Encoder Representations from Transformers) est un r├йseau transformateur multi-couches tr├иs large avec 12 couches pour *BERT-base* et 24 pour *BERT-large*. Le mod├иle est d'abord pr├й-entra├оn├й sur un corpus de texte volumineux (WikiPedia + livres) en utilisant un entra├оnement non supervis├й (pr├йdiction des mots masqu├йs dans une phrase). Pendant le pr├й-entra├оnement, le mod├иle acquiert un niveau significatif de compr├йhension du langage qui peut ensuite ├кtre exploit├й avec d'autres ensembles de donn├йes via un ajustement fin. Ce processus est appel├й **apprentissage par transfert**.\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"Il existe de nombreuses variantes des architectures de transformateurs, notamment BERT, DistilBERT, BigBird, OpenGPT3 et bien d'autres, qui peuvent ├кtre ajust├йes. Le [package HuggingFace](https://github.com/huggingface/) fournit un d├йp├┤t pour entra├оner plusieurs de ces architectures avec PyTorch.\n",
|
||||
"\n",
|
||||
"## Utilisation de BERT pour la classification de texte\n",
|
||||
"\n",
|
||||
"Voyons comment utiliser un mod├иle BERT pr├й-entra├оn├й pour r├йsoudre notre t├вche traditionnelle : la classification de s├йquences. Nous allons classifier notre ensemble de donn├йes AG News original.\n",
|
||||
"\n",
|
||||
"Tout d'abord, chargeons la biblioth├иque HuggingFace et notre ensemble de donn├йes :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Loading dataset...\n",
|
||||
"Building vocab...\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import torch\n",
|
||||
"import torchtext\n",
|
||||
"from torchnlp import *\n",
|
||||
"import transformers\n",
|
||||
"train_dataset, test_dataset, classes, vocab = load_dataset()\n",
|
||||
"vocab_len = len(vocab)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Parce que nous allons utiliser un mod├иle BERT pr├й-entra├оn├й, nous devrons utiliser un tokenizer sp├йcifique. Tout d'abord, nous allons charger un tokenizer associ├й au mod├иle BERT pr├й-entra├оn├й.\n",
|
||||
"\n",
|
||||
"La biblioth├иque HuggingFace contient un d├йp├┤t de mod├иles pr├й-entra├оn├йs, que vous pouvez utiliser simplement en sp├йcifiant leurs noms comme arguments dans les fonctions `from_pretrained`. Tous les fichiers binaires n├йcessaires pour le mod├иle seront automatiquement t├йl├йcharg├йs.\n",
|
||||
"\n",
|
||||
"Cependant, dans certains cas, vous devrez charger vos propres mod├иles. Dans ce cas, vous pouvez sp├йcifier le r├йpertoire contenant tous les fichiers pertinents, y compris les param├иtres pour le tokenizer, le fichier `config.json` avec les param├иtres du mod├иle, les poids binaires, etc.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# To load the model from Internet repository using model name. \n",
|
||||
"# Use this if you are running from your own copy of the notebooks\n",
|
||||
"bert_model = 'bert-base-uncased' \n",
|
||||
"\n",
|
||||
"# To load the model from the directory on disk. Use this for Microsoft Learn module, because we have\n",
|
||||
"# prepared all required files for you.\n",
|
||||
"bert_model = './bert'\n",
|
||||
"\n",
|
||||
"tokenizer = transformers.BertTokenizer.from_pretrained(bert_model)\n",
|
||||
"\n",
|
||||
"MAX_SEQ_LEN = 128\n",
|
||||
"PAD_INDEX = tokenizer.convert_tokens_to_ids(tokenizer.pad_token)\n",
|
||||
"UNK_INDEX = tokenizer.convert_tokens_to_ids(tokenizer.unk_token)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"L'objet `tokenizer` contient la fonction `encode` qui peut ├кtre utilis├йe directement pour encoder du texte :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 15,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[101, 1052, 22123, 2953, 2818, 2003, 1037, 2307, 7705, 2005, 17953, 2361, 102]"
|
||||
]
|
||||
},
|
||||
"execution_count": 15,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"tokenizer.encode('PyTorch is a great framework for NLP')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Ensuite, cr├йons des it├йrateurs que nous utiliserons pendant l'entra├оnement pour acc├йder aux donn├йes. ├Йtant donn├й que BERT utilise sa propre fonction d'encodage, nous devrons d├йfinir une fonction de remplissage similaire ├а `padify` que nous avons d├йfinie auparavant :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def pad_bert(b):\n",
|
||||
" # b is the list of tuples of length batch_size\n",
|
||||
" # - first element of a tuple = label, \n",
|
||||
" # - second = feature (text sequence)\n",
|
||||
" # build vectorized sequence\n",
|
||||
" v = [tokenizer.encode(x[1]) for x in b]\n",
|
||||
" # compute max length of a sequence in this minibatch\n",
|
||||
" l = max(map(len,v))\n",
|
||||
" return ( # tuple of two tensors - labels and features\n",
|
||||
" torch.LongTensor([t[0] for t in b]),\n",
|
||||
" torch.stack([torch.nn.functional.pad(torch.tensor(t),(0,l-len(t)),mode='constant',value=0) for t in v])\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
"train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=8, collate_fn=pad_bert, shuffle=True)\n",
|
||||
"test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=8, collate_fn=pad_bert)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Dans notre cas, nous utiliserons un mod├иle BERT pr├й-entra├оn├й appel├й `bert-base-uncased`. Chargeons le mod├иle en utilisant le package `BertForSequenceClassification`. Cela garantit que notre mod├иle dispose d├йj├а de l'architecture requise pour la classification, y compris le classificateur final. Vous verrez un message d'avertissement indiquant que les poids du classificateur final ne sont pas initialis├йs, et que le mod├иle n├йcessiterait un pr├й-entra├оnement - c'est tout ├а fait normal, car c'est exactement ce que nous allons faire !\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Some weights of the model checkpoint at ./bert were not used when initializing BertForSequenceClassification: ['cls.predictions.bias', 'cls.predictions.transform.dense.weight', 'cls.predictions.transform.dense.bias', 'cls.predictions.decoder.weight', 'cls.seq_relationship.weight', 'cls.seq_relationship.bias', 'cls.predictions.transform.LayerNorm.weight', 'cls.predictions.transform.LayerNorm.bias']\n",
|
||||
"- This IS expected if you are initializing BertForSequenceClassification from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).\n",
|
||||
"- This IS NOT expected if you are initializing BertForSequenceClassification from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).\n",
|
||||
"Some weights of BertForSequenceClassification were not initialized from the model checkpoint at ./bert and are newly initialized: ['classifier.weight', 'classifier.bias']\n",
|
||||
"You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"model = transformers.BertForSequenceClassification.from_pretrained(bert_model,num_labels=4).to(device)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Nous sommes maintenant pr├кts ├а commencer l'entra├оnement ! Comme BERT est d├йj├а pr├й-entra├оn├й, nous souhaitons utiliser un taux d'apprentissage relativement faible afin de ne pas alt├йrer les poids initiaux.\n",
|
||||
"\n",
|
||||
"Tout le travail important est effectu├й par le mod├иle `BertForSequenceClassification`. Lorsque nous appelons le mod├иle sur les donn├йes d'entra├оnement, il renvoie ├а la fois la perte (loss) et la sortie du r├йseau pour le minibatch d'entr├йe. Nous utilisons la perte pour l'optimisation des param├иtres (`loss.backward()` effectue la r├йtropropagation), et `out` pour calculer la pr├йcision de l'entra├оnement en comparant les ├йtiquettes obtenues `labs` (calcul├йes avec `argmax`) avec les ├йtiquettes attendues `labels`.\n",
|
||||
"\n",
|
||||
"Pour contr├┤ler le processus, nous accumulons la perte et la pr├йcision sur plusieurs it├йrations, et nous les affichons tous les `report_freq` cycles d'entra├оnement.\n",
|
||||
"\n",
|
||||
"Cet entra├оnement prendra probablement beaucoup de temps, donc nous limitons le nombre d'it├йrations.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Loss = 1.1254194641113282, Accuracy = 0.585\n",
|
||||
"Loss = 0.6194715118408203, Accuracy = 0.83\n",
|
||||
"Loss = 0.46665248870849607, Accuracy = 0.8475\n",
|
||||
"Loss = 0.4309701919555664, Accuracy = 0.8575\n",
|
||||
"Loss = 0.35427074432373046, Accuracy = 0.8825\n",
|
||||
"Loss = 0.3306886291503906, Accuracy = 0.8975\n",
|
||||
"Loss = 0.30340143203735354, Accuracy = 0.8975\n",
|
||||
"Loss = 0.26139299392700194, Accuracy = 0.915\n",
|
||||
"Loss = 0.26708646774291994, Accuracy = 0.9225\n",
|
||||
"Loss = 0.3667240524291992, Accuracy = 0.8675\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"optimizer = torch.optim.Adam(model.parameters(), lr=2e-5)\n",
|
||||
"\n",
|
||||
"report_freq = 50\n",
|
||||
"iterations = 500 # make this larger to train for longer time!\n",
|
||||
"\n",
|
||||
"model.train()\n",
|
||||
"\n",
|
||||
"i,c = 0,0\n",
|
||||
"acc_loss = 0\n",
|
||||
"acc_acc = 0\n",
|
||||
"\n",
|
||||
"for labels,texts in train_loader:\n",
|
||||
" labels = labels.to(device)-1 # get labels in the range 0-3 \n",
|
||||
" texts = texts.to(device)\n",
|
||||
" loss, out = model(texts, labels=labels)[:2]\n",
|
||||
" labs = out.argmax(dim=1)\n",
|
||||
" acc = torch.mean((labs==labels).type(torch.float32))\n",
|
||||
" optimizer.zero_grad()\n",
|
||||
" loss.backward()\n",
|
||||
" optimizer.step()\n",
|
||||
" acc_loss += loss\n",
|
||||
" acc_acc += acc\n",
|
||||
" i+=1\n",
|
||||
" c+=1\n",
|
||||
" if i%report_freq==0:\n",
|
||||
" print(f\"Loss = {acc_loss.item()/c}, Accuracy = {acc_acc.item()/c}\")\n",
|
||||
" c = 0\n",
|
||||
" acc_loss = 0\n",
|
||||
" acc_acc = 0\n",
|
||||
" iterations-=1\n",
|
||||
" if not iterations:\n",
|
||||
" break"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Vous pouvez constater (surtout si vous augmentez le nombre d'it├йrations et attendez suffisamment longtemps) que la classification avec BERT nous donne une pr├йcision assez bonne ! Cela s'explique par le fait que BERT comprend d├йj├а tr├иs bien la structure de la langue, et que nous n'avons qu'├а ajuster le classificateur final. Cependant, comme BERT est un mod├иle volumineux, tout le processus d'entra├оnement prend beaucoup de temps et n├йcessite une puissance de calcul importante ! (GPU, et de pr├йf├йrence plus d'un).\n",
|
||||
"\n",
|
||||
"> **Note :** Dans notre exemple, nous utilisons l'un des plus petits mod├иles BERT pr├й-entra├оn├йs. Il existe des mod├иles plus grands qui sont susceptibles de donner de meilleurs r├йsultats.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## ├Йvaluation des performances du mod├иle\n",
|
||||
"\n",
|
||||
"Nous pouvons maintenant ├йvaluer les performances de notre mod├иle sur le jeu de donn├йes de test. La boucle d'├йvaluation est assez similaire ├а la boucle d'entra├оnement, mais il ne faut pas oublier de passer le mod├иle en mode ├йvaluation en appelant `model.eval()`.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Final accuracy: 0.9047029702970297\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"model.eval()\n",
|
||||
"iterations = 100\n",
|
||||
"acc = 0\n",
|
||||
"i = 0\n",
|
||||
"for labels,texts in test_loader:\n",
|
||||
" labels = labels.to(device)-1 \n",
|
||||
" texts = texts.to(device)\n",
|
||||
" _, out = model(texts, labels=labels)[:2]\n",
|
||||
" labs = out.argmax(dim=1)\n",
|
||||
" acc += torch.mean((labs==labels).type(torch.float32))\n",
|
||||
" i+=1\n",
|
||||
" if i>iterations: break\n",
|
||||
" \n",
|
||||
"print(f\"Final accuracy: {acc.item()/i}\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## ├А retenir\n",
|
||||
"\n",
|
||||
"Dans cette unit├й, nous avons vu ├а quel point il est facile de prendre un mod├иle de langage pr├й-entra├оn├й de la biblioth├иque **transformers** et de l'adapter ├а notre t├вche de classification de texte. De la m├кme mani├иre, les mod├иles BERT peuvent ├кtre utilis├йs pour l'extraction d'entit├йs, les questions-r├йponses et d'autres t├вches de NLP.\n",
|
||||
"\n",
|
||||
"Les mod├иles de type Transformer repr├йsentent l'├йtat de l'art actuel en NLP, et dans la plupart des cas, ils devraient ├кtre la premi├иre solution avec laquelle vous commencez ├а exp├йrimenter lorsque vous mettez en ┼Уuvre des solutions NLP personnalis├йes. Cependant, comprendre les principes de base des r├йseaux neuronaux r├йcurrents discut├йs dans ce module est extr├кmement important si vous souhaitez construire des mod├иles neuronaux avanc├йs.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**Avertissement** : \nCe document a ├йt├й traduit ├а l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatis├йes peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit ├кtre consid├йr├й comme la source faisant autorit├й. Pour des informations critiques, il est recommand├й de recourir ├а une traduction professionnelle r├йalis├йe par un humain. Nous d├йclinons toute responsabilit├й en cas de malentendus ou d'interpr├йtations erron├йes r├йsultant de l'utilisation de cette traduction.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "py37_pytorch",
|
||||
"language": "python",
|
||||
"name": "conda-env-py37_pytorch-py"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.7"
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "753865967678a92dbce7d7efbd36d980",
|
||||
"translation_date": "2025-08-31T15:16:28+00:00",
|
||||
"source_file": "lessons/5-NLP/18-Transformers/TransformersPyTorch.ipynb",
|
||||
"language_code": "fr"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 4
|
||||
}
|
||||
|
|
@ -0,0 +1,819 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# M├йcanismes d'attention et transformateurs\n",
|
||||
"\n",
|
||||
"Un inconv├йnient majeur des r├йseaux r├йcurrents est que tous les mots d'une s├йquence ont le m├кme impact sur le r├йsultat. Cela entra├оne des performances sous-optimales avec les mod├иles standard encodeur-d├йcodeur LSTM pour les t├вches de s├йquence ├а s├йquence, telles que la reconnaissance d'entit├йs nomm├йes et la traduction automatique. En r├йalit├й, certains mots sp├йcifiques de la s├йquence d'entr├йe ont souvent plus d'impact sur les sorties s├йquentielles que d'autres.\n",
|
||||
"\n",
|
||||
"Prenons un mod├иle de s├йquence ├а s├йquence, comme la traduction automatique. Il est impl├йment├й par deux r├йseaux r├йcurrents, o├╣ un r├йseau (**encodeur**) compresse la s├йquence d'entr├йe dans un ├йtat cach├й, et un autre (**d├йcodeur**) d├йploie cet ├йtat cach├й pour produire le r├йsultat traduit. Le probl├иme avec cette approche est que l'├йtat final du r├йseau a du mal ├а se souvenir du d├йbut de la phrase, ce qui entra├оne une mauvaise qualit├й du mod├иle pour les phrases longues.\n",
|
||||
"\n",
|
||||
"Les **m├йcanismes d'attention** offrent un moyen de pond├йrer l'impact contextuel de chaque vecteur d'entr├йe sur chaque pr├йdiction de sortie du RNN. Cela est r├йalis├й en cr├йant des raccourcis entre les ├йtats interm├йdiaires du RNN d'entr├йe et du RNN de sortie. Ainsi, lors de la g├йn├йration du symbole de sortie $y_t$, nous prenons en compte tous les ├йtats cach├йs d'entr├йe $h_i$, avec diff├йrents coefficients de pond├йration $\\alpha_{t,i}$.\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"*Le mod├иle encodeur-d├йcodeur avec m├йcanisme d'attention additive dans [Bahdanau et al., 2015](https://arxiv.org/pdf/1409.0473.pdf), cit├й de [cet article de blog](https://lilianweng.github.io/lil-log/2018/06/24/attention-attention.html)*\n",
|
||||
"\n",
|
||||
"La matrice d'attention $\\{\\alpha_{i,j}\\}$ repr├йsente le degr├й auquel certains mots d'entr├йe influencent la g├йn├йration d'un mot donn├й dans la s├йquence de sortie. Voici un exemple de cette matrice :\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"*Figure tir├йe de [Bahdanau et al., 2015](https://arxiv.org/pdf/1409.0473.pdf) (Fig.3)*\n",
|
||||
"\n",
|
||||
"Les m├йcanismes d'attention sont responsables de la plupart des avanc├йes actuelles ou proches de l'├йtat de l'art en traitement du langage naturel. Cependant, l'ajout d'attention augmente consid├йrablement le nombre de param├иtres du mod├иle, ce qui a entra├оn├й des probl├иmes de mise ├а l'├йchelle avec les RNN. Une contrainte cl├й pour la mise ├а l'├йchelle des RNN est que la nature r├йcurrente des mod├иles rend difficile le traitement par lots et la parall├йlisation de l'entra├оnement. Dans un RNN, chaque ├йl├йment d'une s├йquence doit ├кtre trait├й dans un ordre s├йquentiel, ce qui signifie qu'il ne peut pas ├кtre facilement parall├йlis├й.\n",
|
||||
"\n",
|
||||
"L'adoption des m├йcanismes d'attention combin├йe ├а cette contrainte a conduit ├а la cr├йation des mod├иles transformateurs, d├йsormais ├а l'├йtat de l'art, que nous connaissons et utilisons aujourd'hui, de BERT ├а OpenGPT3.\n",
|
||||
"\n",
|
||||
"## Mod├иles transformateurs\n",
|
||||
"\n",
|
||||
"Au lieu de transmettre le contexte de chaque pr├йdiction pr├йc├йdente ├а l'├йtape d'├йvaluation suivante, les **mod├иles transformateurs** utilisent des **encodages positionnels** et **l'attention** pour capturer le contexte d'une entr├йe donn├йe dans une fen├кtre de texte fournie. L'image ci-dessous montre comment les encodages positionnels avec attention peuvent capturer le contexte dans une fen├кtre donn├йe.\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"├Йtant donn├й que chaque position d'entr├йe est mapp├йe ind├йpendamment ├а chaque position de sortie, les transformateurs peuvent mieux parall├йliser que les RNN, ce qui permet des mod├иles de langage beaucoup plus grands et plus expressifs. Chaque t├кte d'attention peut ├кtre utilis├йe pour apprendre diff├йrentes relations entre les mots, ce qui am├йliore les t├вches de traitement du langage naturel en aval.\n",
|
||||
"\n",
|
||||
"## Construire un mod├иle transformateur simple\n",
|
||||
"\n",
|
||||
"Keras ne contient pas de couche transformateur int├йgr├йe, mais nous pouvons en construire une nous-m├кmes. Comme pr├йc├йdemment, nous nous concentrerons sur la classification de texte du jeu de donn├йes AG News, mais il convient de mentionner que les mod├иles transformateurs donnent les meilleurs r├йsultats pour des t├вches NLP plus complexes.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import tensorflow as tf\n",
|
||||
"from tensorflow import keras\n",
|
||||
"import tensorflow_datasets as tfds\n",
|
||||
"import numpy as np\n",
|
||||
"\n",
|
||||
"ds_train, ds_test = tfds.load('ag_news_subset').values()\n",
|
||||
"\n",
|
||||
"def extract_text(x):\n",
|
||||
" return x['title']+' '+x['description']\n",
|
||||
"\n",
|
||||
"def tupelize(x):\n",
|
||||
" return (extract_text(x),x['label'])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Les nouvelles couches dans Keras doivent h├йriter de la classe `Layer` et impl├йmenter la m├йthode `call`. Commen├зons par la couche **Positional Embedding**. Nous utiliserons [du code provenant de la documentation officielle de Keras](https://keras.io/examples/nlp/text_classification_with_transformer/). Nous supposerons que nous remplissons toutes les s├йquences d'entr├йe ├а une longueur `maxlen`.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class TokenAndPositionEmbedding(keras.layers.Layer):\n",
|
||||
" def __init__(self, maxlen, vocab_size, embed_dim):\n",
|
||||
" super(TokenAndPositionEmbedding, self).__init__()\n",
|
||||
" self.token_emb = keras.layers.Embedding(input_dim=vocab_size, output_dim=embed_dim)\n",
|
||||
" self.pos_emb = keras.layers.Embedding(input_dim=maxlen, output_dim=embed_dim)\n",
|
||||
" self.maxlen = maxlen\n",
|
||||
"\n",
|
||||
" def call(self, x):\n",
|
||||
" maxlen = self.maxlen\n",
|
||||
" positions = tf.range(start=0, limit=maxlen, delta=1)\n",
|
||||
" positions = self.pos_emb(positions)\n",
|
||||
" x = self.token_emb(x)\n",
|
||||
" return x+positions"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Cette couche se compose de deux couches `Embedding` : une pour l'int├йgration des tokens (comme nous l'avons d├йj├а abord├й) et une pour les positions des tokens. Les positions des tokens sont g├йn├йr├йes comme une s├йquence de nombres naturels allant de 0 ├а `maxlen` ├а l'aide de `tf.range`, puis pass├йes ├а travers la couche d'int├йgration. Les deux vecteurs d'int├йgration r├йsultants sont ensuite additionn├йs, produisant une repr├йsentation int├йgr├йe positionnelle de l'entr├йe de forme `maxlen`$\\times$`embed_dim`.\n",
|
||||
"\n",
|
||||
"Passons maintenant ├а l'impl├йmentation du bloc transformateur. Il prendra en entr├йe le r├йsultat de la couche d'int├йgration d├йfinie pr├йc├йdemment :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class TransformerBlock(keras.layers.Layer):\n",
|
||||
" def __init__(self, embed_dim, num_heads, ff_dim, rate=0.1):\n",
|
||||
" super(TransformerBlock, self).__init__()\n",
|
||||
" self.att = keras.layers.MultiHeadAttention(num_heads=num_heads, key_dim=embed_dim, name='attn')\n",
|
||||
" self.ffn = keras.Sequential(\n",
|
||||
" [keras.layers.Dense(ff_dim, activation=\"relu\"), keras.layers.Dense(embed_dim),]\n",
|
||||
" )\n",
|
||||
" self.layernorm1 = keras.layers.LayerNormalization(epsilon=1e-6)\n",
|
||||
" self.layernorm2 = keras.layers.LayerNormalization(epsilon=1e-6)\n",
|
||||
" self.dropout1 = keras.layers.Dropout(rate)\n",
|
||||
" self.dropout2 = keras.layers.Dropout(rate)\n",
|
||||
"\n",
|
||||
" def call(self, inputs, training):\n",
|
||||
" attn_output = self.att(inputs, inputs)\n",
|
||||
" attn_output = self.dropout1(attn_output, training=training)\n",
|
||||
" out1 = self.layernorm1(inputs + attn_output)\n",
|
||||
" ffn_output = self.ffn(out1)\n",
|
||||
" ffn_output = self.dropout2(ffn_output, training=training)\n",
|
||||
" return self.layernorm2(out1 + ffn_output)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Maintenant, nous sommes pr├кts ├а d├йfinir le mod├иle complet du transformeur :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Model: \"sequential_1\"\n",
|
||||
"_________________________________________________________________\n",
|
||||
"Layer (type) Output Shape Param # \n",
|
||||
"=================================================================\n",
|
||||
"text_vectorization (TextVect (None, 256) 0 \n",
|
||||
"_________________________________________________________________\n",
|
||||
"token_and_position_embedding (None, 256, 32) 648192 \n",
|
||||
"_________________________________________________________________\n",
|
||||
"transformer_block (Transform (None, 256, 32) 10656 \n",
|
||||
"_________________________________________________________________\n",
|
||||
"global_average_pooling1d (Gl (None, 32) 0 \n",
|
||||
"_________________________________________________________________\n",
|
||||
"dropout_2 (Dropout) (None, 32) 0 \n",
|
||||
"_________________________________________________________________\n",
|
||||
"dense_2 (Dense) (None, 20) 660 \n",
|
||||
"_________________________________________________________________\n",
|
||||
"dropout_3 (Dropout) (None, 20) 0 \n",
|
||||
"_________________________________________________________________\n",
|
||||
"dense_3 (Dense) (None, 4) 84 \n",
|
||||
"=================================================================\n",
|
||||
"Total params: 659,592\n",
|
||||
"Trainable params: 659,592\n",
|
||||
"Non-trainable params: 0\n",
|
||||
"_________________________________________________________________\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"embed_dim = 32 # Embedding size for each token\n",
|
||||
"num_heads = 2 # Number of attention heads\n",
|
||||
"ff_dim = 32 # Hidden layer size in feed forward network inside transformer\n",
|
||||
"maxlen = 256\n",
|
||||
"vocab_size = 20000\n",
|
||||
"\n",
|
||||
"model = keras.models.Sequential([\n",
|
||||
" keras.layers.experimental.preprocessing.TextVectorization(max_tokens=vocab_size,output_sequence_length=maxlen, input_shape=(1,)),\n",
|
||||
" TokenAndPositionEmbedding(maxlen, vocab_size, embed_dim),\n",
|
||||
" TransformerBlock(embed_dim, num_heads, ff_dim),\n",
|
||||
" keras.layers.GlobalAveragePooling1D(),\n",
|
||||
" keras.layers.Dropout(0.1),\n",
|
||||
" keras.layers.Dense(20, activation=\"relu\"),\n",
|
||||
" keras.layers.Dropout(0.1),\n",
|
||||
" keras.layers.Dense(4, activation=\"softmax\")\n",
|
||||
"])\n",
|
||||
"\n",
|
||||
"model.summary()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Training tokenizer\n",
|
||||
"938/938 [==============================] - 45s 39ms/step - loss: 0.4978 - acc: 0.8068 - val_loss: 0.2808 - val_acc: 0.9124\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<tensorflow.python.keras.callbacks.History at 0x7f9c2427a0d0>"
|
||||
]
|
||||
},
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"print('Training tokenizer')\n",
|
||||
"model.layers[0].adapt(ds_train.map(extract_text))\n",
|
||||
"model.compile(loss='sparse_categorical_crossentropy',metrics=['acc'], optimizer='adam')\n",
|
||||
"model.fit(ds_train.map(tupelize).batch(128),validation_data=ds_test.map(tupelize).batch(128))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Mod├иles Transformers BERT\n",
|
||||
"\n",
|
||||
"**BERT** (Bidirectional Encoder Representations from Transformers) est un r├йseau de transformateurs multi-couches tr├иs large, avec 12 couches pour *BERT-base* et 24 pour *BERT-large*. Le mod├иle est d'abord pr├й-entra├оn├й sur un vaste corpus de donn├йes textuelles (WikiPedia + livres) en utilisant un apprentissage non supervis├й (pr├йdiction des mots masqu├йs dans une phrase). Pendant cette phase de pr├й-entra├оnement, le mod├иle acquiert un niveau significatif de compr├йhension du langage, qui peut ensuite ├кtre exploit├й avec d'autres ensembles de donn├йes gr├вce ├а un ajustement fin. Ce processus est appel├й **apprentissage par transfert**.\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"Il existe de nombreuses variantes des architectures Transformer, notamment BERT, DistilBERT, BigBird, OpenGPT3 et bien d'autres, qui peuvent ├кtre ajust├йes.\n",
|
||||
"\n",
|
||||
"Voyons comment nous pouvons utiliser un mod├иle BERT pr├й-entra├оn├й pour r├йsoudre notre probl├иme classique de classification de s├йquences. Nous allons emprunter l'id├йe et une partie du code de la [documentation officielle](https://www.tensorflow.org/text/tutorials/classify_text_with_bert).\n",
|
||||
"\n",
|
||||
"Pour charger des mod├иles pr├й-entra├оn├йs, nous utiliserons **Tensorflow hub**. Tout d'abord, chargeons le vectoriseur sp├йcifique ├а BERT :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"ename": "ModuleNotFoundError",
|
||||
"evalue": "No module named 'tensorflow_text'",
|
||||
"output_type": "error",
|
||||
"traceback": [
|
||||
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
|
||||
"\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)",
|
||||
"\u001b[1;32m~\\AppData\\Local\\Temp/ipykernel_41180/4216669875.py\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mimport\u001b[0m \u001b[0mtensorflow_text\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mtensorflow_hub\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mhub\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[0mvectorizer\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mhub\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mKerasLayer\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
|
||||
"\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'tensorflow_text'"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import tensorflow_text \n",
|
||||
"import tensorflow_hub as hub\n",
|
||||
"vectorizer = hub.KerasLayer('https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{'input_type_ids': <tf.Tensor: shape=(1, 128), dtype=int32, numpy=\n",
|
||||
" array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]],\n",
|
||||
" dtype=int32)>,\n",
|
||||
" 'input_word_ids': <tf.Tensor: shape=(1, 128), dtype=int32, numpy=\n",
|
||||
" array([[ 101, 1045, 2293, 19081, 102, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0]], dtype=int32)>,\n",
|
||||
" 'input_mask': <tf.Tensor: shape=(1, 128), dtype=int32, numpy=\n",
|
||||
" array([[1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]],\n",
|
||||
" dtype=int32)>}"
|
||||
]
|
||||
},
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"vectorizer(['I love transformers'])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Il est important d'utiliser le m├кme vectoriseur que celui avec lequel le r├йseau original a ├йt├й entra├оn├й. De plus, le vectoriseur BERT renvoie trois composants :\n",
|
||||
"* `input_word_ids`, qui est une s├йquence de num├йros de tokens pour la phrase d'entr├йe\n",
|
||||
"* `input_mask`, qui indique quelle partie de la s├йquence contient l'entr├йe r├йelle et laquelle est du remplissage. Cela est similaire au masque produit par la couche `Masking`\n",
|
||||
"* `input_type_ids` est utilis├й pour les t├вches de mod├йlisation de langage et permet de sp├йcifier deux phrases d'entr├йe dans une seule s├йquence.\n",
|
||||
"\n",
|
||||
"Ensuite, nous pouvons instancier l'extracteur de caract├йristiques BERT :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"bert = hub.KerasLayer('https://tfhub.dev/tensorflow/small_bert/bert_en_uncased_L-4_H-128_A-2/1')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"pooled_output -> (1, 128)\n",
|
||||
"encoder_outputs -> 4\n",
|
||||
"sequence_output -> (1, 128, 128)\n",
|
||||
"default -> (1, 128)\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"z = bert(vectorizer(['I love transformers']))\n",
|
||||
"for i,x in z.items():\n",
|
||||
" print(f\"{i} -> { len(x) if isinstance(x, list) else x.shape }\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Ainsi, la couche BERT retourne plusieurs r├йsultats utiles :\n",
|
||||
"* `pooled_output` est le r├йsultat de la moyenne de tous les tokens dans la s├йquence. Vous pouvez le consid├йrer comme une repr├йsentation s├йmantique intelligente de tout le r├йseau. Cela ├йquivaut ├а la sortie de la couche `GlobalAveragePooling1D` dans notre mod├иle pr├йc├йdent.\n",
|
||||
"* `sequence_output` est la sortie de la derni├иre couche du transformeur (correspond ├а la sortie de `TransformerBlock` dans notre mod├иle ci-dessus).\n",
|
||||
"* `encoder_outputs` sont les sorties de toutes les couches du transformeur. ├Йtant donn├й que nous avons charg├й un mod├иle BERT ├а 4 couches (comme vous pouvez probablement le deviner d'apr├иs le nom, qui contient `4_H`), il poss├иde 4 tenseurs. Le dernier est identique ├а `sequence_output`.\n",
|
||||
"\n",
|
||||
"Nous allons maintenant d├йfinir le mod├иle de classification de bout en bout. Nous utiliserons une *d├йfinition fonctionnelle de mod├иle*, o├╣ nous d├йfinissons l'entr├йe du mod├иle, puis fournissons une s├йrie d'expressions pour calculer sa sortie. Nous rendrons ├йgalement les poids du mod├иle BERT non entra├оnables et entra├оnerons uniquement le classificateur final :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Model: \"model\"\n",
|
||||
"__________________________________________________________________________________________________\n",
|
||||
"Layer (type) Output Shape Param # Connected to \n",
|
||||
"==================================================================================================\n",
|
||||
"input_1 (InputLayer) [(None,)] 0 \n",
|
||||
"__________________________________________________________________________________________________\n",
|
||||
"keras_layer (KerasLayer) {'input_type_ids': ( 0 input_1[0][0] \n",
|
||||
"__________________________________________________________________________________________________\n",
|
||||
"keras_layer_1 (KerasLayer) {'pooled_output': (N 4782465 keras_layer[0][0] \n",
|
||||
" keras_layer[0][1] \n",
|
||||
" keras_layer[0][2] \n",
|
||||
"__________________________________________________________________________________________________\n",
|
||||
"dropout_4 (Dropout) (None, 128) 0 keras_layer_1[0][5] \n",
|
||||
"__________________________________________________________________________________________________\n",
|
||||
"dense_4 (Dense) (None, 4) 516 dropout_4[0][0] \n",
|
||||
"==================================================================================================\n",
|
||||
"Total params: 4,782,981\n",
|
||||
"Trainable params: 516\n",
|
||||
"Non-trainable params: 4,782,465\n",
|
||||
"__________________________________________________________________________________________________\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"inp = keras.Input(shape=(),dtype=tf.string)\n",
|
||||
"x = vectorizer(inp)\n",
|
||||
"x = bert(x)\n",
|
||||
"x = keras.layers.Dropout(0.1)(x['pooled_output'])\n",
|
||||
"out = keras.layers.Dense(4,activation='softmax')(x)\n",
|
||||
"model = keras.models.Model(inp,out)\n",
|
||||
"bert.trainable = False\n",
|
||||
"model.summary()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"938/938 [==============================] - 528s 559ms/step - loss: 0.8056 - acc: 0.6983 - val_loss: 0.5953 - val_acc: 0.7888\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<tensorflow.python.keras.callbacks.History at 0x7f9bb1e36d00>"
|
||||
]
|
||||
},
|
||||
"execution_count": 11,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"model.compile(loss='sparse_categorical_crossentropy',metrics=['acc'], optimizer='adam')\n",
|
||||
"model.fit(ds_train.map(tupelize).batch(128),validation_data=ds_test.map(tupelize).batch(128))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Bien que le nombre de param├иtres entra├оnables soit faible, le processus est assez lent, car l'extracteur de caract├йristiques BERT est tr├иs gourmand en calcul. Il semble que nous n'ayons pas r├йussi ├а atteindre une pr├йcision raisonnable, soit par manque d'entra├оnement, soit par insuffisance des param├иtres du mod├иle.\n",
|
||||
"\n",
|
||||
"Essayons de d├йverrouiller les poids de BERT et de l'entra├оner ├йgalement. Cela n├йcessite un taux d'apprentissage tr├иs faible, ainsi qu'une strat├йgie d'entra├оnement plus prudente avec un **warmup**, en utilisant l'optimiseur **AdamW**. Nous utiliserons le package `tf-models-official` pour cr├йer l'optimiseur :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 12,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Model: \"model\"\n",
|
||||
"__________________________________________________________________________________________________\n",
|
||||
"Layer (type) Output Shape Param # Connected to \n",
|
||||
"==================================================================================================\n",
|
||||
"input_1 (InputLayer) [(None,)] 0 \n",
|
||||
"__________________________________________________________________________________________________\n",
|
||||
"keras_layer (KerasLayer) {'input_type_ids': ( 0 input_1[0][0] \n",
|
||||
"__________________________________________________________________________________________________\n",
|
||||
"keras_layer_1 (KerasLayer) {'pooled_output': (N 4782465 keras_layer[0][0] \n",
|
||||
" keras_layer[0][1] \n",
|
||||
" keras_layer[0][2] \n",
|
||||
"__________________________________________________________________________________________________\n",
|
||||
"dropout_4 (Dropout) (None, 128) 0 keras_layer_1[0][5] \n",
|
||||
"__________________________________________________________________________________________________\n",
|
||||
"dense_4 (Dense) (None, 4) 516 dropout_4[0][0] \n",
|
||||
"==================================================================================================\n",
|
||||
"Total params: 4,782,981\n",
|
||||
"Trainable params: 4,782,980\n",
|
||||
"Non-trainable params: 1\n",
|
||||
"__________________________________________________________________________________________________\n",
|
||||
"938/938 [==============================] - 629s 664ms/step - loss: 0.6344 - acc: 0.7658 - val_loss: 0.4876 - val_acc: 0.8247\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<tensorflow.python.keras.callbacks.History at 0x7f9bb0bd0070>"
|
||||
]
|
||||
},
|
||||
"execution_count": 12,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"from official.nlp import optimization \n",
|
||||
"bert.trainable=True\n",
|
||||
"model.summary()\n",
|
||||
"epochs = 3\n",
|
||||
"opt = optimization.create_optimizer(\n",
|
||||
" init_lr=3e-5,\n",
|
||||
" num_train_steps=epochs*len(ds_train),\n",
|
||||
" num_warmup_steps=0.1*epochs*len(ds_train),\n",
|
||||
" optimizer_type='adamw')\n",
|
||||
"\n",
|
||||
"model.compile(loss='sparse_categorical_crossentropy',metrics=['acc'], optimizer=opt)\n",
|
||||
"model.fit(ds_train.map(tupelize).batch(128),validation_data=ds_test.map(tupelize).batch(128))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Comme vous pouvez le constater, l'entra├оnement progresse assez lentement - mais vous pourriez vouloir exp├йrimenter et entra├оner le mod├иle pendant quelques ├йpoques (5-10) pour voir si vous pouvez obtenir un meilleur r├йsultat par rapport aux approches que nous avons utilis├йes auparavant.\n",
|
||||
"\n",
|
||||
"## Biblioth├иque Huggingface Transformers\n",
|
||||
"\n",
|
||||
"Une autre m├йthode tr├иs courante (et un peu plus simple) pour utiliser les mod├иles Transformer est le [package HuggingFace](https://github.com/huggingface/), qui fournit des blocs de construction simples pour diff├йrentes t├вches de PNL. Il est disponible ├а la fois pour Tensorflow et PyTorch, un autre framework de r├йseaux neuronaux tr├иs populaire.\n",
|
||||
"\n",
|
||||
"> **Note** : Si vous n'├кtes pas int├йress├й par le fonctionnement de la biblioth├иque Transformers - vous pouvez passer directement ├а la fin de ce notebook, car vous ne verrez rien de fondamentalement diff├йrent de ce que nous avons fait pr├йc├йdemment. Nous allons r├йp├йter les m├кmes ├йtapes d'entra├оnement du mod├иle BERT en utilisant une biblioth├иque diff├йrente et un mod├иle sensiblement plus grand. Par cons├йquent, le processus implique un entra├оnement assez long, donc vous pourriez simplement vouloir parcourir le code.\n",
|
||||
"\n",
|
||||
"Voyons comment notre probl├иme peut ├кtre r├йsolu en utilisant [Huggingface Transformers](http://huggingface.co).\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"La premi├иre chose ├а faire est de choisir le mod├иle que nous allons utiliser. En plus de certains mod├иles int├йgr├йs, Huggingface propose un [r├йpertoire de mod├иles en ligne](https://huggingface.co/models), o├╣ vous pouvez trouver de nombreux mod├иles pr├й-entra├оn├йs par la communaut├й. Tous ces mod├иles peuvent ├кtre charg├йs et utilis├йs simplement en fournissant un nom de mod├иle. Tous les fichiers binaires n├йcessaires au mod├иle seront automatiquement t├йl├йcharg├йs.\n",
|
||||
"\n",
|
||||
"Parfois, vous devrez charger vos propres mod├иles. Dans ce cas, vous pouvez sp├йcifier le r├йpertoire contenant tous les fichiers pertinents, y compris les param├иtres pour le tokenizer, le fichier `config.json` avec les param├иtres du mod├иle, les poids binaires, etc.\n",
|
||||
"\n",
|
||||
"├А partir du nom du mod├иle, nous pouvons instancier ├а la fois le mod├иle et le tokenizer. Commen├зons par un tokenizer :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import transformers\n",
|
||||
"\n",
|
||||
"# To load the model from Internet repository using model name. \n",
|
||||
"# Use this if you are running from your own copy of the notebooks\n",
|
||||
"bert_model = 'bert-base-uncased' \n",
|
||||
"\n",
|
||||
"# To load the model from the directory on disk. Use this for Microsoft Learn module, because we have\n",
|
||||
"# prepared all required files for you.\n",
|
||||
"#bert_model = './bert'\n",
|
||||
"\n",
|
||||
"tokenizer = transformers.BertTokenizer.from_pretrained(bert_model)\n",
|
||||
"\n",
|
||||
"MAX_SEQ_LEN = 128\n",
|
||||
"PAD_INDEX = tokenizer.convert_tokens_to_ids(tokenizer.pad_token)\n",
|
||||
"UNK_INDEX = tokenizer.convert_tokens_to_ids(tokenizer.unk_token)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"L'objet `tokenizer` contient la fonction `encode` qui peut ├кtre utilis├йe directement pour encoder du texte :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[101, 23435, 12314, 2003, 1037, 2307, 7705, 2005, 17953, 2361, 102]"
|
||||
]
|
||||
},
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"tokenizer.encode('Tensorflow is a great framework for NLP')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Nous pouvons ├йgalement utiliser le tokenizer pour encoder une s├йquence d'une mani├иre adapt├йe ├а son passage au mod├иle, c'est-├а-dire en incluant les champs `token_ids`, `input_mask`, etc. Nous pouvons ├йgalement sp├йcifier que nous voulons des tenseurs Tensorflow en fournissant l'argument `return_tensors='tf'` :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{'input_ids': <tf.Tensor: shape=(1, 5), dtype=int32, numpy=array([[ 101, 7592, 1010, 2045, 102]], dtype=int32)>, 'token_type_ids': <tf.Tensor: shape=(1, 5), dtype=int32, numpy=array([[0, 0, 0, 0, 0]], dtype=int32)>, 'attention_mask': <tf.Tensor: shape=(1, 5), dtype=int32, numpy=array([[1, 1, 1, 1, 1]], dtype=int32)>}"
|
||||
]
|
||||
},
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"tokenizer(['Hello, there'],return_tensors='tf')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Dans notre cas, nous utiliserons un mod├иle BERT pr├й-entra├оn├й appel├й `bert-base-uncased`. *Uncased* signifie que le mod├иle est insensible ├а la casse.\n",
|
||||
"\n",
|
||||
"Lors de l'entra├оnement du mod├иle, nous devons fournir une s├йquence tokenis├йe en entr├йe, et pour cela, nous concevrons un pipeline de traitement des donn├йes. ├Йtant donn├й que `tokenizer.encode` est une fonction Python, nous utiliserons la m├кme approche que dans l'unit├й pr├йc├йdente en l'appelant avec `py_function` :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 31,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def process(x):\n",
|
||||
" return tokenizer.encode(x.numpy().decode('utf-8'),return_tensors='tf',padding='max_length',max_length=MAX_SEQ_LEN,truncation=True)[0]\n",
|
||||
"\n",
|
||||
"def process_fn(x):\n",
|
||||
" s = x['title']+' '+x['description']\n",
|
||||
" e = tf.py_function(process,inp=[s],Tout=(tf.int32))\n",
|
||||
" e.set_shape(MAX_SEQ_LEN)\n",
|
||||
" return e,x['label']"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Maintenant, nous pouvons charger le mod├иle r├йel en utilisant le package `BertForSequenceClassification`. Cela garantit que notre mod├иle dispose d├йj├а de l'architecture requise pour la classification, y compris le classificateur final. Vous verrez un message d'avertissement indiquant que les poids du classificateur final ne sont pas initialis├йs, et que le mod├иle n├йcessiterait un pr├й-entra├оnement - c'est tout ├а fait normal, car c'est exactement ce que nous allons faire !\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 32,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"model = transformers.TFBertForSequenceClassification.from_pretrained(bert_model,num_labels=4,output_attentions=False)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 33,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Model: \"tf_bert_for_sequence_classification_1\"\n",
|
||||
"_________________________________________________________________\n",
|
||||
"Layer (type) Output Shape Param # \n",
|
||||
"=================================================================\n",
|
||||
"bert (TFBertMainLayer) multiple 109482240 \n",
|
||||
"_________________________________________________________________\n",
|
||||
"dropout_75 (Dropout) multiple 0 \n",
|
||||
"_________________________________________________________________\n",
|
||||
"classifier (Dense) multiple 3076 \n",
|
||||
"=================================================================\n",
|
||||
"Total params: 109,485,316\n",
|
||||
"Trainable params: 109,485,316\n",
|
||||
"Non-trainable params: 0\n",
|
||||
"_________________________________________________________________\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"model.summary()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Comme vous pouvez le voir dans `summary()`, le mod├иle contient presque 110 millions de param├иtres ! Pr├йsum├йment, si nous voulons une t├вche de classification simple sur un ensemble de donn├йes relativement petit, nous ne voulons pas entra├оner la couche de base de BERT :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 34,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Model: \"tf_bert_for_sequence_classification_1\"\n",
|
||||
"_________________________________________________________________\n",
|
||||
"Layer (type) Output Shape Param # \n",
|
||||
"=================================================================\n",
|
||||
"bert (TFBertMainLayer) multiple 109482240 \n",
|
||||
"_________________________________________________________________\n",
|
||||
"dropout_75 (Dropout) multiple 0 \n",
|
||||
"_________________________________________________________________\n",
|
||||
"classifier (Dense) multiple 3076 \n",
|
||||
"=================================================================\n",
|
||||
"Total params: 109,485,316\n",
|
||||
"Trainable params: 3,076\n",
|
||||
"Non-trainable params: 109,482,240\n",
|
||||
"_________________________________________________________________\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"model.layers[0].trainable = False\n",
|
||||
"model.summary()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Nous sommes maintenant pr├кts ├а commencer l'entra├оnement !\n",
|
||||
"\n",
|
||||
"> **Note** : L'entra├оnement d'un mod├иle BERT ├а grande ├йchelle peut ├кtre tr├иs long ! C'est pourquoi nous allons seulement l'entra├оner sur les 32 premiers lots. Cela sert simplement ├а montrer comment l'entra├оnement du mod├иle est configur├й. Si vous souhaitez essayer un entra├оnement ├а grande ├йchelle, il vous suffit de supprimer les param├иtres `steps_per_epoch` et `validation_steps`, et de vous pr├йparer ├а patienter !\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 30,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"32/32 [==============================] - 142s 4s/step - loss: 1.3896 - acc: 0.2500 - val_loss: 1.3863 - val_acc: 0.2480\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<tensorflow.python.keras.callbacks.History at 0x7f1d40a4b6a0>"
|
||||
]
|
||||
},
|
||||
"execution_count": 30,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"model.compile('adam','sparse_categorical_crossentropy',['acc'])\n",
|
||||
"tf.get_logger().setLevel('ERROR')\n",
|
||||
"model.fit(ds_train.map(process_fn).batch(32),validation_data=ds_test.map(process_fn).batch(32),steps_per_epoch=32,validation_steps=2)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Si vous augmentez le nombre d'it├йrations, patientez suffisamment longtemps et entra├оnez pendant plusieurs ├йpoques, vous pouvez vous attendre ├а ce que la classification avec BERT offre la meilleure pr├йcision ! Cela s'explique par le fait que BERT comprend d├йj├а tr├иs bien la structure de la langue, et qu'il suffit simplement d'ajuster le classificateur final. Cependant, comme BERT est un mod├иle volumineux, tout le processus d'entra├оnement prend beaucoup de temps et n├йcessite une puissance de calcul cons├йquente ! (GPU, et de pr├йf├йrence plusieurs).\n",
|
||||
"\n",
|
||||
"> **Note :** Dans notre exemple, nous utilisons l'un des plus petits mod├иles BERT pr├й-entra├оn├йs. Il existe des mod├иles plus grands qui sont susceptibles de produire de meilleurs r├йsultats.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## ├А retenir\n",
|
||||
"\n",
|
||||
"Dans cette unit├й, nous avons explor├й des architectures de mod├иles tr├иs r├йcentes bas├йes sur les **transformers**. Nous les avons appliqu├йes ├а notre t├вche de classification de texte, mais de la m├кme mani├иre, les mod├иles BERT peuvent ├кtre utilis├йs pour l'extraction d'entit├йs, le questionnement automatique et d'autres t├вches de NLP.\n",
|
||||
"\n",
|
||||
"Les mod├иles bas├йs sur les transformers repr├йsentent l'├йtat de l'art actuel en NLP, et dans la plupart des cas, ils devraient ├кtre la premi├иre solution ├а exp├йrimenter lorsque vous impl├йmentez des solutions NLP personnalis├йes. Cependant, comprendre les principes fondamentaux des r├йseaux neuronaux r├йcurrents abord├йs dans ce module est extr├кmement important si vous souhaitez concevoir des mod├иles neuronaux avanc├йs.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**Avertissement** : \nCe document a ├йt├й traduit ├а l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatis├йes peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit ├кtre consid├йr├й comme la source faisant autorit├й. Pour des informations critiques, il est recommand├й de recourir ├а une traduction professionnelle r├йalis├йe par un humain. Nous d├йclinons toute responsabilit├й en cas de malentendus ou d'interpr├йtations erron├йes r├йsultant de l'utilisation de cette traduction.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"interpreter": {
|
||||
"hash": "0cb620c6d4b9f7a635928804c26cf22403d89d98d79684e4529119355ee6d5a5"
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "py38_tensorflow",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.8.12"
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "ab59c532409774988ab875f2260e8e53",
|
||||
"translation_date": "2025-08-31T15:18:11+00:00",
|
||||
"source_file": "lessons/5-NLP/18-Transformers/TransformersTF.ipynb",
|
||||
"language_code": "fr"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 4
|
||||
}
|
||||
|
|
@ -0,0 +1,492 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Reconnaissance d'Entit├йs Nomm├йes (NER)\n",
|
||||
"\n",
|
||||
"Ce notebook fait partie du [Curriculum AI pour D├йbutants](http://aka.ms/ai-beginners).\n",
|
||||
"\n",
|
||||
"Dans cet exemple, nous allons apprendre ├а entra├оner un mod├иle de NER sur le jeu de donn├йes [Corpus Annot├й pour la Reconnaissance d'Entit├йs Nomm├йes](https://www.kaggle.com/datasets/abhinavwalia95/entity-annotated-corpus) disponible sur Kaggle. Avant de commencer, veuillez t├йl├йcharger le fichier [ner_dataset.csv](https://www.kaggle.com/datasets/abhinavwalia95/entity-annotated-corpus?resource=download&select=ner_dataset.csv) dans le r├йpertoire actuel.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 62,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import pandas as pd\n",
|
||||
"from tensorflow import keras\n",
|
||||
"import numpy as np"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Pr├йparation du jeu de donn├йes\n",
|
||||
"\n",
|
||||
"Nous commencerons par lire le jeu de donn├йes dans un dataframe. Si vous souhaitez en savoir plus sur l'utilisation de Pandas, consultez une [le├зon sur le traitement des donn├йes](https://github.com/microsoft/Data-Science-For-Beginners/tree/main/2-Working-With-Data/07-python) dans notre [Data Science pour les d├йbutants](http://aka.ms/datascience-beginners)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<div>\n",
|
||||
"<style scoped>\n",
|
||||
" .dataframe tbody tr th:only-of-type {\n",
|
||||
" vertical-align: middle;\n",
|
||||
" }\n",
|
||||
"\n",
|
||||
" .dataframe tbody tr th {\n",
|
||||
" vertical-align: top;\n",
|
||||
" }\n",
|
||||
"\n",
|
||||
" .dataframe thead th {\n",
|
||||
" text-align: right;\n",
|
||||
" }\n",
|
||||
"</style>\n",
|
||||
"<table border=\"1\" class=\"dataframe\">\n",
|
||||
" <thead>\n",
|
||||
" <tr style=\"text-align: right;\">\n",
|
||||
" <th></th>\n",
|
||||
" <th>Sentence #</th>\n",
|
||||
" <th>Word</th>\n",
|
||||
" <th>POS</th>\n",
|
||||
" <th>Tag</th>\n",
|
||||
" </tr>\n",
|
||||
" </thead>\n",
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <th>0</th>\n",
|
||||
" <td>Sentence: 1</td>\n",
|
||||
" <td>Thousands</td>\n",
|
||||
" <td>NNS</td>\n",
|
||||
" <td>O</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>1</th>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>of</td>\n",
|
||||
" <td>IN</td>\n",
|
||||
" <td>O</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>2</th>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>demonstrators</td>\n",
|
||||
" <td>NNS</td>\n",
|
||||
" <td>O</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>3</th>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>have</td>\n",
|
||||
" <td>VBP</td>\n",
|
||||
" <td>O</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>4</th>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>marched</td>\n",
|
||||
" <td>VBN</td>\n",
|
||||
" <td>O</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>\n",
|
||||
"</div>"
|
||||
],
|
||||
"text/plain": [
|
||||
" Sentence # Word POS Tag\n",
|
||||
"0 Sentence: 1 Thousands NNS O\n",
|
||||
"1 NaN of IN O\n",
|
||||
"2 NaN demonstrators NNS O\n",
|
||||
"3 NaN have VBP O\n",
|
||||
"4 NaN marched VBN O"
|
||||
]
|
||||
},
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"df = pd.read_csv('ner_dataset.csv',encoding='unicode-escape')\n",
|
||||
"df.head()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Obtenons des ├йtiquettes uniques et cr├йons des dictionnaires de correspondance que nous pouvons utiliser pour convertir les ├йtiquettes en num├йros de classe :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"array(['O', 'B-geo', 'B-gpe', 'B-per', 'I-geo', 'B-org', 'I-org', 'B-tim',\n",
|
||||
" 'B-art', 'I-art', 'I-per', 'I-gpe', 'I-tim', 'B-nat', 'B-eve',\n",
|
||||
" 'I-eve', 'I-nat'], dtype=object)"
|
||||
]
|
||||
},
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"tags = df.Tag.unique()\n",
|
||||
"tags"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"'O'"
|
||||
]
|
||||
},
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"id2tag = dict(enumerate(tags))\n",
|
||||
"tag2id = { v : k for k,v in id2tag.items() }\n",
|
||||
"\n",
|
||||
"id2tag[0]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Maintenant, nous devons faire la m├кme chose avec le vocabulaire. Pour simplifier, nous allons cr├йer un vocabulaire sans tenir compte de la fr├йquence des mots ; dans la vie r├йelle, vous pourriez utiliser le vectoriseur de Keras et limiter le nombre de mots.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 14,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"vocab = set(df['Word'].apply(lambda x: x.lower()))\n",
|
||||
"id2word = { i+1 : v for i,v in enumerate(vocab) }\n",
|
||||
"id2word[0] = '<UNK>'\n",
|
||||
"vocab.add('<UNK>')\n",
|
||||
"word2id = { v : k for k,v in id2word.items() }"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Nous devons cr├йer un ensemble de donn├йes de phrases pour l'entra├оnement. Bouclons ├а travers l'ensemble de donn├йes original et s├йparons toutes les phrases individuelles en `X` (listes de mots) et `Y` (liste de tokens) :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 41,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"X,Y = [],[]\n",
|
||||
"s,t = [],[]\n",
|
||||
"for i,row in df[['Sentence #','Word','Tag']].iterrows():\n",
|
||||
" if pd.isna(row['Sentence #']):\n",
|
||||
" s.append(row['Word'])\n",
|
||||
" t.append(row['Tag'])\n",
|
||||
" else:\n",
|
||||
" if len(s)>0:\n",
|
||||
" X.append(s)\n",
|
||||
" Y.append(t)\n",
|
||||
" s,t = [row['Word']],[row['Tag']]\n",
|
||||
"X.append(s)\n",
|
||||
"Y.append(t)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 93,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"([10386,\n",
|
||||
" 23515,\n",
|
||||
" 4134,\n",
|
||||
" 29620,\n",
|
||||
" 7954,\n",
|
||||
" 13583,\n",
|
||||
" 21193,\n",
|
||||
" 12222,\n",
|
||||
" 27322,\n",
|
||||
" 18258,\n",
|
||||
" 5815,\n",
|
||||
" 15880,\n",
|
||||
" 5355,\n",
|
||||
" 25242,\n",
|
||||
" 31327,\n",
|
||||
" 18258,\n",
|
||||
" 27067,\n",
|
||||
" 23515,\n",
|
||||
" 26444,\n",
|
||||
" 14412,\n",
|
||||
" 358,\n",
|
||||
" 26551,\n",
|
||||
" 5011,\n",
|
||||
" 30558],\n",
|
||||
" [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0])"
|
||||
]
|
||||
},
|
||||
"execution_count": 93,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def vectorize(seq):\n",
|
||||
" return [word2id[x.lower()] for x in seq]\n",
|
||||
"\n",
|
||||
"def tagify(seq):\n",
|
||||
" return [tag2id[x] for x in seq]\n",
|
||||
"\n",
|
||||
"Xv = list(map(vectorize,X))\n",
|
||||
"Yv = list(map(tagify,Y))\n",
|
||||
"\n",
|
||||
"Xv[0], Yv[0]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Pour simplifier, nous allons compl├йter toutes les phrases avec 0 tokens jusqu'├а la longueur maximale. Dans la vie r├йelle, nous pourrions vouloir utiliser une strat├йgie plus intelligente et compl├йter les s├йquences uniquement au sein d'un mini-lot.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 51,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"X_data = keras.preprocessing.sequence.pad_sequences(Xv,padding='post')\n",
|
||||
"Y_data = keras.preprocessing.sequence.pad_sequences(Yv,padding='post')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## D├йfinir un r├йseau de classification de tokens\n",
|
||||
"\n",
|
||||
"Nous utiliserons un r├йseau bidirectionnel LSTM ├а deux couches pour la classification de tokens. Afin d'appliquer un classificateur dense ├а chacune des sorties de la derni├иre couche LSTM, nous utiliserons la construction `TimeDistributed`, qui r├йplique la m├кme couche dense ├а chacune des sorties du LSTM ├а chaque ├йtape :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 94,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Model: \"sequential_3\"\n",
|
||||
"_________________________________________________________________\n",
|
||||
" Layer (type) Output Shape Param # \n",
|
||||
"=================================================================\n",
|
||||
" embedding_4 (Embedding) (None, 104, 300) 9545400 \n",
|
||||
" \n",
|
||||
" bidirectional_6 (Bidirectio (None, 104, 200) 320800 \n",
|
||||
" nal) \n",
|
||||
" \n",
|
||||
" bidirectional_7 (Bidirectio (None, 104, 200) 240800 \n",
|
||||
" nal) \n",
|
||||
" \n",
|
||||
" time_distributed_3 (TimeDis (None, 104, 17) 3417 \n",
|
||||
" tributed) \n",
|
||||
" \n",
|
||||
"=================================================================\n",
|
||||
"Total params: 10,110,417\n",
|
||||
"Trainable params: 10,110,417\n",
|
||||
"Non-trainable params: 0\n",
|
||||
"_________________________________________________________________\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"maxlen = X_data.shape[1]\n",
|
||||
"vocab_size = len(vocab)\n",
|
||||
"num_tags = len(tags)\n",
|
||||
"model = keras.models.Sequential([\n",
|
||||
" keras.layers.Embedding(vocab_size, 300, input_length=maxlen),\n",
|
||||
" keras.layers.Bidirectional(keras.layers.LSTM(units=100, activation='tanh', return_sequences=True)),\n",
|
||||
" keras.layers.Bidirectional(keras.layers.LSTM(units=100, activation='tanh', return_sequences=True)),\n",
|
||||
" keras.layers.TimeDistributed(keras.layers.Dense(num_tags, activation='softmax'))\n",
|
||||
"])\n",
|
||||
"model.compile(loss='sparse_categorical_crossentropy',optimizer='adam',metrics=['acc'])\n",
|
||||
"model.summary()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Notez ici que nous sp├йcifions explicitement `maxlen` pour notre jeu de donn├йes - si nous voulons que le r├йseau puisse g├йrer des s├йquences de longueur variable, nous devons ├кtre un peu plus astucieux lors de la d├йfinition du r├йseau.\n",
|
||||
"\n",
|
||||
"Passons maintenant ├а l'entra├оnement du mod├иle. Pour des raisons de rapidit├й, nous n'entra├оnerons que pendant une seule ├йpoque, mais vous pouvez essayer de prolonger la dur├йe d'entra├оnement. De plus, vous pourriez vouloir s├йparer une partie du jeu de donn├йes comme jeu de donn├йes d'entra├оnement, afin d'observer la pr├йcision de validation.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 57,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"1499/1499 [==============================] - 740s 488ms/step - loss: 0.0667 - acc: 0.9841\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<keras.callbacks.History at 0x16f0bb2a310>"
|
||||
]
|
||||
},
|
||||
"execution_count": 57,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"model.fit(X_data,Y_data)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Tester le R├йsultat\n",
|
||||
"\n",
|
||||
"Voyons maintenant comment notre mod├иle de reconnaissance d'entit├йs fonctionne sur une phrase d'exemple :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 91,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"sent = 'John Smith went to Paris to attend a conference in cancer development institute'\n",
|
||||
"words = sent.lower().split()\n",
|
||||
"v = keras.preprocessing.sequence.pad_sequences([[word2id[x] for x in words]],padding='post',maxlen=maxlen)\n",
|
||||
"res = model(v)[0]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 92,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"john -> B-per\n",
|
||||
"smith -> I-per\n",
|
||||
"went -> O\n",
|
||||
"to -> O\n",
|
||||
"paris -> B-geo\n",
|
||||
"to -> O\n",
|
||||
"attend -> O\n",
|
||||
"a -> O\n",
|
||||
"conference -> O\n",
|
||||
"in -> O\n",
|
||||
"cancer -> B-org\n",
|
||||
"development -> I-org\n",
|
||||
"institute -> I-org\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"r = np.argmax(res.numpy(),axis=1)\n",
|
||||
"for i,w in zip(r,words):\n",
|
||||
" print(f\"{w} -> {id2tag[i]}\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## ├А retenir\n",
|
||||
"\n",
|
||||
"M├кme un mod├иle LSTM simple donne des r├йsultats raisonnables pour la reconnaissance d'entit├йs nomm├йes (NER). Cependant, pour obtenir des r├йsultats nettement meilleurs, vous pourriez envisager d'utiliser de grands mod├иles de langage pr├й-entra├оn├йs comme BERT. La formation de BERT pour la NER ├а l'aide de la biblioth├иque Huggingface Transformers est d├йcrite [ici](https://huggingface.co/course/chapter7/2?fw=pt).\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**Avertissement** : \nCe document a ├йt├й traduit ├а l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatis├йes peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit ├кtre consid├йr├й comme la source faisant autorit├й. Pour des informations critiques, il est recommand├й de recourir ├а une traduction professionnelle r├йalis├йe par un humain. Nous d├йclinons toute responsabilit├й en cas de malentendus ou d'interpr├йtations erron├йes r├йsultant de l'utilisation de cette traduction.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"interpreter": {
|
||||
"hash": "16af2a8bbb083ea23e5e41c7f5787656b2ce26968575d8763f2c4b17f9cd711f"
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3.8.12 ('py38')",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.8.12"
|
||||
},
|
||||
"orig_nbformat": 4,
|
||||
"coopTranslator": {
|
||||
"original_hash": "254d25052dcca4ef84f59a05f2935bdc",
|
||||
"translation_date": "2025-08-31T15:20:25+00:00",
|
||||
"source_file": "lessons/5-NLP/19-NER/NER-TF.ipynb",
|
||||
"language_code": "fr"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
|
|
@ -0,0 +1,325 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"attachments": {},
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Exp├йrimenter avec OpenAI GPT\n",
|
||||
"\n",
|
||||
"Ce notebook fait partie du [Programme pour d├йbutants en IA](http://aka.ms/ai-beginners).\n",
|
||||
"\n",
|
||||
"Dans ce notebook, nous allons explorer comment nous pouvons utiliser le mod├иle OpenAI-GPT avec la biblioth├иque `transformers` de Hugging Face.\n",
|
||||
"\n",
|
||||
"Sans plus attendre, lan├зons le pipeline de g├йn├йration de texte et commen├зons ├а g├йn├йrer !\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"c:\\Users\\bethanycheum\\Desktop\\AI-For-Beginners\\.venv\\lib\\site-packages\\tqdm\\auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
|
||||
" from .autonotebook import tqdm as notebook_tqdm\n",
|
||||
"Downloading model.safetensors: 100%|тЦИтЦИтЦИтЦИтЦИтЦИтЦИтЦИтЦИтЦИ| 479M/479M [04:28<00:00, 1.78MB/s] \n",
|
||||
"c:\\Users\\bethanycheum\\Desktop\\AI-For-Beginners\\.venv\\lib\\site-packages\\huggingface_hub\\file_download.py:133: UserWarning: `huggingface_hub` cache-system uses symlinks by default to efficiently store duplicated files but your machine does not support them in C:\\Users\\bethanycheum\\.cache\\huggingface\\hub. Caching files will still work but in a degraded version that might require more space on your disk. This warning can be disabled by setting the `HF_HUB_DISABLE_SYMLINKS_WARNING` environment variable. For more details, see https://huggingface.co/docs/huggingface_hub/how-to-cache#limitations.\n",
|
||||
"To support symlinks on Windows, you either need to activate Developer Mode or to run Python as an administrator. In order to see activate developer mode, see this article: https://docs.microsoft.com/en-us/windows/apps/get-started/enable-your-device-for-development\n",
|
||||
" warnings.warn(message)\n",
|
||||
"Some weights of OpenAIGPTLMHeadModel were not initialized from the model checkpoint at openai-gpt and are newly initialized: ['position_ids']\n",
|
||||
"You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n",
|
||||
"Downloading (тАж)neration_config.json: 100%|тЦИтЦИтЦИтЦИтЦИтЦИтЦИтЦИтЦИтЦИ| 74.0/74.0 [00:00<00:00, 48.8kB/s]\n",
|
||||
"Downloading (тАж)olve/main/vocab.json: 100%|тЦИтЦИтЦИтЦИтЦИтЦИтЦИтЦИтЦИтЦИ| 816k/816k [00:00<00:00, 1.76MB/s]\n",
|
||||
"Downloading (тАж)olve/main/merges.txt: 100%|тЦИтЦИтЦИтЦИтЦИтЦИтЦИтЦИтЦИтЦИ| 458k/458k [00:00<00:00, 1.11MB/s]\n",
|
||||
"Downloading (тАж)/main/tokenizer.json: 100%|тЦИтЦИтЦИтЦИтЦИтЦИтЦИтЦИтЦИтЦИ| 1.27M/1.27M [00:00<00:00, 2.12MB/s]\n",
|
||||
"Xformers is not installed correctly. If you want to use memory_efficient_attention to accelerate training use the following command to install Xformers\n",
|
||||
"pip install xformers.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[{'generated_text': \"Hello! I am a neural network, and I want to say that i apologize for not coming to you yourself, for not helping you, and that i was too busy getting dressed and studying for a midterm. you know, the kind where the teachers are like that and they come in pairs with their boyfriends, but not with theirs. it's true, that i have had a girlfriend, and i'm only going on wednesdays and thursdays because i was too busy with college, but maybe\"},\n",
|
||||
" {'generated_text': 'Hello! I am a neural network, and I want to say that we have been blessed with a wonderful gift ; no one of us has died at all. and our spirits are strong, very strong. in one very lucky moment of luck for you, all has been given direction and destiny, and for us there are no more mysteries. the earth has been chosen for you, and that earth is now ours, and you must be forever in our hearts. \" \\n the words, as one,'},\n",
|
||||
" {'generated_text': 'Hello! I am a neural network, and I want to say that if you would just turn and face the general, you would have a nice day. \" \\n \" sure thing, \" said one of the soldiers, and started to run. the rest of the soldiers followed, shouting. the general turned to general zulu, raising his arm. the general said something in his native language, and the general immediately started to run. zulu started to move toward the wall, with the'},\n",
|
||||
" {'generated_text': 'Hello! I am a neural network, and I want to say that i am not a doctor but an anthropologist to you, a specialist, a specialist in the field of astrobiological biology, and that i am very much involved in this investigation. i am not sure, i am not certain, but i can confirm your conclusions and therefore i will go to the top. i have a colleague who has just returned from this expedition and his findings confirm that you are a specialist. that is, he'},\n",
|
||||
" {'generated_text': \"Hello! I am a neural network, and I want to say that everyone here is in agreement that no matter how many times i say to myself,'he was never a man of action on the battlefield,'or'he 'll never take a chance at killing any civilians,'or'he 'll never let his men go undefended against enemy forces of this caliber,'or'that's just what i need in a day like today. \\n you see, there are only three groups that\"}]"
|
||||
]
|
||||
},
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"from transformers import pipeline\n",
|
||||
"\n",
|
||||
"model_name = 'openai-gpt' \n",
|
||||
"\n",
|
||||
"generator = pipeline('text-generation', model=model_name)\n",
|
||||
"\n",
|
||||
"generator(\"Hello! I am a neural network, and I want to say that\", max_length=100, num_return_sequences=5)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {},
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Conception de prompts\n",
|
||||
"\n",
|
||||
"Dans certains cas, vous pouvez utiliser directement la g├йn├йration openai-gpt en concevant des prompts appropri├йs. Regardez les exemples ci-dessous :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[{'generated_text': 'Synonyms of a word cat: the same cat i used to stare at, and you in'},\n",
|
||||
" {'generated_text': 'Synonyms of a word cat: cat of the woods, cat of the hills, cat of'},\n",
|
||||
" {'generated_text': 'Synonyms of a word cat: you! \\n \" it\\'s a girl. \" i said'},\n",
|
||||
" {'generated_text': \"Synonyms of a word cat: big cat. but how come, we didn't hear it\"},\n",
|
||||
" {'generated_text': 'Synonyms of a word cat: \" mea - o - c \" which makes them sound'}]"
|
||||
]
|
||||
},
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"generator(\"Synonyms of a word cat:\", max_length=20, num_return_sequences=5)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[{'generated_text': 'I love when you say this -> Positive\\nI have myself -> Negative\\nThis is awful for you to say this -> positive this is so horrible - > positive that your brother is gay - >'},\n",
|
||||
" {'generated_text': 'I love when you say this -> Positive\\nI have myself -> Negative\\nThis is awful for you to say this -> negative i will bring this on you -, < positive am i, i'},\n",
|
||||
" {'generated_text': 'I love when you say this -> Positive\\nI have myself -> Negative\\nThis is awful for you to say this -> negative i have self - esteem i must take it - : \\n - -'},\n",
|
||||
" {'generated_text': 'I love when you say this -> Positive\\nI have myself -> Negative\\nThis is awful for you to say this -> negative this is - : \\n if it were true that the devil would have'},\n",
|
||||
" {'generated_text': \"I love when you say this -> Positive\\nI have myself -> Negative\\nThis is awful for you to say this -> positive i have you - > positive it's a bad thing, > positive\"}]"
|
||||
]
|
||||
},
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"generator(\"I love when you say this -> Positive\\nI have myself -> Negative\\nThis is awful for you to say this ->\", max_length=40, num_return_sequences=5)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[{'generated_text': 'Translate English to French: cat => chat, dog => chien, student => new and unusual. there were no more words to be'},\n",
|
||||
" {'generated_text': 'Translate English to French: cat => chat, dog => chien, student => student \\n his eyes were huge in his lean face as'},\n",
|
||||
" {'generated_text': \"Translate English to French: cat => chat, dog => chien, student => the teacher's words, their words, their words.\"}]"
|
||||
]
|
||||
},
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"generator(\"Translate English to French: cat => chat, dog => chien, student => \", top_k=50, max_length=30, num_return_sequences=3)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[{'generated_text': 'People who liked the movie The Matrix also liked it, and there was the movie of the first man after us. \\n i wanted to laugh at how stupid these stupid actors were. no, they were'},\n",
|
||||
" {'generated_text': \"People who liked the movie The Matrix also liked the movie, and the film was the result. and that's when the man in the story was brought into reality, after a few decades. \\n a\"},\n",
|
||||
" {'generated_text': 'People who liked the movie The Matrix also liked the movie the matrix, because there was a very old movie movie called the matrix, where there was a great super hero, and the super hero came out'},\n",
|
||||
" {'generated_text': \"People who liked the movie The Matrix also liked the movie that didn't have a chance to pay cash, if they could afford it. most often they got a good deal and a lot of money,\"},\n",
|
||||
" {'generated_text': \"People who liked the movie The Matrix also liked the movie, and i didn't seem to have the same problem. \\n i 'd met the other half of my family. i spent most of my time\"}]"
|
||||
]
|
||||
},
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"generator(\"People who liked the movie The Matrix also liked \", max_length=40, num_return_sequences=5)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Strat├йgies d'├йchantillonnage de texte\n",
|
||||
"\n",
|
||||
"Jusqu'├а pr├йsent, nous avons utilis├й une strat├йgie d'├йchantillonnage **gloutonne** simple, o├╣ nous s├йlectionnons le mot suivant en fonction de la probabilit├й la plus ├йlev├йe. Voici comment cela fonctionne :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[{'generated_text': 'It was early evening when I can back from work. I usually work late, but this time it was an exception. When I entered a room, I saw my friend, a young man, sprawled across the bed in his bed. \\n \" hi, i\\'m mike eptirard. \" \\n there was silence on the other side of the door. i listened for any trace of life but there was nothing. my heart began to pound, i was starting to sweat, i took out my wallet'},\n",
|
||||
" {'generated_text': 'It was early evening when I can back from work. I usually work late, but this time it was an exception. When I entered a room, I saw my mother on the bed, hugging her legs to her chest and sobbing. i saw my dad and mother from the corner of my eye. \\n elfin face was covered in tears as i entered the room. my dad and mother also wept ; just as they did every other time i came to work. but this time, they had different faces'},\n",
|
||||
" {'generated_text': 'It was early evening when I can back from work. I usually work late, but this time it was an exception. When I entered a room, I saw the room had changed because it was dark. it still smelled like a hospital. a new light shined through from a vent in the ceiling. i found myself in a bathroom and a small room with a sink and a wall of glass. the bathroom billion years ago. not so different from all of the rest of the apartment. \\n now...'},\n",
|
||||
" {'generated_text': 'It was early evening when I can back from work. I usually work late, but this time it was an exception. When I entered a room, I saw a large woman with dark hair and pale skin. she was asleep, but i noticed a faint movement of her face. i could sense she was awake. i got up and walked over to her. \\n \" hello miss. i am inspector michael o\\'dell ; we are investigating the case against you. i wanted to ask if you were the'},\n",
|
||||
" {'generated_text': 'It was early evening when I can back from work. I usually work late, but this time it was an exception. When I entered a room, I saw i had an empty table and three empty chairs. that was all i needed. i had left a note on a table in the center of the room and had a pen in hand. \" \\n \" i think what you were doing was something he was doing to her. \" \\n \" yeah, \" i nodded with a grin. \" i'}]"
|
||||
]
|
||||
},
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"prompt = \"It was early evening when I can back from work. I usually work late, but this time it was an exception. When I entered a room, I saw\"\n",
|
||||
"generator(prompt,max_length=100,num_return_sequences=5)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"**La recherche par faisceau** permet au g├йn├йrateur d'explorer plusieurs directions (*faisceaux*) de g├йn├йration de texte et de s├йlectionner celles avec le score global le plus ├йlev├й. Vous pouvez effectuer une recherche par faisceau en fournissant le param├иtre `num_beams`. Vous pouvez ├йgalement sp├йcifier `no_repeat_ngram_size` pour p├йnaliser le mod├иle en cas de r├йp├йtition de n-grammes d'une taille donn├йe.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[{'generated_text': 'It was early evening when I can back from work. I usually work late, but this time it was an exception. When I entered a room, I saw a man sitting in a chair with his head in his hands. he didn\\'t look up as i approached. \\n \" excuse me, sir, \" i said. \" can i help you? \" \\n the man looked up at me. his eyes were red - rimmed and his face was pale, as if he hadn\\'t slept in days'},\n",
|
||||
" {'generated_text': 'It was early evening when I can back from work. I usually work late, but this time it was an exception. When I entered a room, I saw a man sitting at a desk in the middle of the room. he had his back to me, so i couldn\\'t see what he was doing. \" \\n \" what did he look like? \" i asked as i sat down on the bed next to her. \\n she took a deep breath and looked at me with tears in her eyes'},\n",
|
||||
" {'generated_text': 'It was early evening when I can back from work. I usually work late, but this time it was an exception. When I entered a room, I saw a woman sitting on the bed, reading a book. she looked up at me and smiled. \\n \" hi, \" she said. \" can i help you? \" \\n i sat down next to her and looked around the room. the walls were white, and there was a large window in the middle of the wall that looked out on'},\n",
|
||||
" {'generated_text': 'It was early evening when I can back from work. I usually work late, but this time it was an exception. When I entered a room, I saw a man sitting at a table in the middle of the room. he looked up as i walked in, and when he saw me, he got up and walked over to me. \\n \" can i help you? \" he asked as he put his hand on the small of my back and led me to a chair at the other end of'},\n",
|
||||
" {'generated_text': 'It was early evening when I can back from work. I usually work late, but this time it was an exception. When I entered a room, I saw a woman sitting on the edge of her bed, reading a book. she looked up at me and smiled. \\n \" hello, \" she said. \" can i help you? \" \\n i didn\\'t know what to say, so i just sat down in the chair next to the bed and looked at her. her hair was dark brown'}]"
|
||||
]
|
||||
},
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"prompt = \"It was early evening when I can back from work. I usually work late, but this time it was an exception. When I entered a room, I saw\"\n",
|
||||
"generator(prompt,max_length=100,num_return_sequences=5,num_beams=10,no_repeat_ngram_size=2)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"**L'├йchantillonnage** s├йlectionne le mot suivant de mani├иre non d├йterministe, en utilisant la distribution de probabilit├й retourn├йe par le mod├иle. Vous activez l'├йchantillonnage en utilisant le param├иtre `do_sample=True`. Vous pouvez ├йgalement sp├йcifier la `temperature`, pour rendre le mod├иle plus ou moins d├йterministe.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[{'generated_text': 'It was early evening when I can back from work. I usually work late, but this time it was an exception. When I entered a room, I saw her. she was on the bed, but she looked very different. \\n \" honey, what\\'s the matter? \" i asked. \\n she sat up. \" i can\\'t believe it\\'s real. i\\'ve been dreaming about you for the last two days. \" \\n \" i can\\'t believe it either. i guess that\\'s how'}]"
|
||||
]
|
||||
},
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"prompt = \"It was early evening when I can back from work. I usually work late, but this time it was an exception. When I entered a room, I saw\"\n",
|
||||
"generator(prompt,max_length=100,do_sample=True,temperature=0.8)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Nous pouvons ├йgalement fournir des param├иtres suppl├йmentaires pour l'├йchantillonnage : \n",
|
||||
"* `top_k` sp├йcifie le nombre d'options de mots ├а consid├йrer lors de l'utilisation de l'├йchantillonnage. Cela r├йduit les chances d'obtenir des mots ├йtranges (de faible probabilit├й) dans notre texte. \n",
|
||||
"* `top_p` est similaire, mais nous choisissons le plus petit sous-ensemble des mots les plus probables, dont la probabilit├й totale est sup├йrieure ├а p. \n",
|
||||
"\n",
|
||||
"N'h├йsitez pas ├а exp├йrimenter en ajoutant ces param├иtres. \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {},
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Affiner vos mod├иles\n",
|
||||
"\n",
|
||||
"Vous pouvez ├йgalement [affiner votre mod├иle](https://learn.microsoft.com/en-us/azure/cognitive-services/openai/how-to/fine-tuning?pivots=programming-language-studio?WT.mc_id=academic-77998-bethanycheum) avec votre propre jeu de donn├йes. Cela vous permettra d'ajuster le style du texte tout en conservant la majeure partie du mod├иle linguistique.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**Avertissement** : \nCe document a ├йt├й traduit ├а l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatis├йes peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit ├кtre consid├йr├й comme la source faisant autorit├й. Pour des informations critiques, il est recommand├й de faire appel ├а une traduction professionnelle humaine. Nous d├йclinons toute responsabilit├й en cas de malentendus ou d'interpr├йtations erron├йes r├йsultant de l'utilisation de cette traduction.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"interpreter": {
|
||||
"hash": "16af2a8bbb083ea23e5e41c7f5787656b2ce26968575d8763f2c4b17f9cd711f"
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3.8.12 ('py38')",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.10.11"
|
||||
},
|
||||
"orig_nbformat": 4,
|
||||
"coopTranslator": {
|
||||
"original_hash": "d4ff89615d38924a55594f16d6d20678",
|
||||
"translation_date": "2025-08-31T15:19:40+00:00",
|
||||
"source_file": "lessons/5-NLP/20-LangModels/GPT-PyTorch.ipynb",
|
||||
"language_code": "fr"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Devoir : ├Йquations diophantiennes\n",
|
||||
"\n",
|
||||
"> Ce devoir fait partie du [programme AI for Beginners](http://github.com/microsoft/ai-for-beginners) et s'inspire de [cet article](https://habr.com/post/128704/).\n",
|
||||
"\n",
|
||||
"Votre objectif est de r├йsoudre une **├йquation diophantienne** - une ├йquation avec des racines enti├иres et des coefficients entiers. Par exemple, consid├йrez l'├йquation suivante :\n",
|
||||
"\n",
|
||||
"$$a+2b+3c+4d=30$$\n",
|
||||
"\n",
|
||||
"Vous devez trouver des racines enti├иres $a$,$b$,$c$,$d\\in\\mathbb{N}$ qui satisfont cette ├йquation.\n",
|
||||
"\n",
|
||||
"Conseils :\n",
|
||||
"1. Vous pouvez consid├йrer que les racines se situent dans l'intervalle [0;30].\n",
|
||||
"1. Comme un g├иne, envisagez d'utiliser la liste des valeurs des racines.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**Avertissement** : \nCe document a ├йt├й traduit ├а l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatis├йes peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit ├кtre consid├йr├й comme la source faisant autorit├й. Pour des informations critiques, il est recommand├й de recourir ├а une traduction professionnelle r├йalis├йe par un humain. Nous d├йclinons toute responsabilit├й en cas de malentendus ou d'interpr├йtations erron├йes r├йsultant de l'utilisation de cette traduction.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"language_info": {
|
||||
"name": "python"
|
||||
},
|
||||
"orig_nbformat": 4,
|
||||
"coopTranslator": {
|
||||
"original_hash": "a967e1fa1e11ab2b6467b19349a4a9aa",
|
||||
"translation_date": "2025-08-31T14:22:06+00:00",
|
||||
"source_file": "lessons/6-Other/21-GeneticAlgorithms/Diophantine.ipynb",
|
||||
"language_code": "fr"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,501 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Entra├оner un RL ├а ├йquilibrer un Cartpole\n",
|
||||
"\n",
|
||||
"Ce notebook fait partie du [programme AI for Beginners](http://aka.ms/ai-beginners). Il s'inspire du [tutoriel officiel de PyTorch](https://pytorch.org/tutorials/intermediate/reinforcement_q_learning.html) et de [cette impl├йmentation Cartpole avec PyTorch](https://github.com/yc930401/Actor-Critic-pytorch).\n",
|
||||
"\n",
|
||||
"Dans cet exemple, nous utiliserons le RL pour entra├оner un mod├иle ├а ├йquilibrer une barre sur un chariot qui peut se d├йplacer ├а gauche et ├а droite sur une ├йchelle horizontale. Nous utiliserons l'environnement [OpenAI Gym](https://www.gymlibrary.ml/) pour simuler la barre.\n",
|
||||
"\n",
|
||||
"> **Note** : Vous pouvez ex├йcuter le code de cette le├зon localement (par exemple, depuis Visual Studio Code), auquel cas la simulation s'ouvrira dans une nouvelle fen├кtre. Lorsque vous ex├йcutez le code en ligne, il peut ├кtre n├йcessaire d'apporter quelques ajustements au code, comme d├йcrit [ici](https://towardsdatascience.com/rendering-openai-gym-envs-on-binder-and-google-colab-536f99391cc7).\n",
|
||||
"\n",
|
||||
"Nous commencerons par nous assurer que Gym est install├й :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import sys\n",
|
||||
"!{sys.executable} -m pip install gym"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Cr├йons maintenant l'environnement CartPole et voyons comment l'utiliser. Un environnement poss├иde les propri├йt├йs suivantes :\n",
|
||||
"\n",
|
||||
"* **Action space** est l'ensemble des actions possibles que nous pouvons effectuer ├а chaque ├йtape de la simulation \n",
|
||||
"* **Observation space** est l'ensemble des observations que nous pouvons r├йaliser \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import gym\n",
|
||||
"\n",
|
||||
"env = gym.make(\"CartPole-v1\")\n",
|
||||
"\n",
|
||||
"print(f\"Action space: {env.action_space}\")\n",
|
||||
"print(f\"Observation space: {env.observation_space}\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Voyons comment fonctionne la simulation. La boucle suivante ex├йcute la simulation jusqu'├а ce que `env.step` ne renvoie plus le drapeau de terminaison `done`. Nous choisirons des actions de mani├иre al├йatoire en utilisant `env.action_space.sample()`, ce qui signifie que l'exp├йrience ├йchouera probablement tr├иs rapidement (l'environnement CartPole se termine lorsque la vitesse du CartPole, sa position ou son angle d├йpassent certaines limites).\n",
|
||||
"\n",
|
||||
"> La simulation s'ouvrira dans une nouvelle fen├кtre. Vous pouvez ex├йcuter le code plusieurs fois et observer son comportement.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"env.reset()\n",
|
||||
"\n",
|
||||
"done = False\n",
|
||||
"total_reward = 0\n",
|
||||
"while not done:\n",
|
||||
" env.render()\n",
|
||||
" obs, rew, done, info = env.step(env.action_space.sample())\n",
|
||||
" total_reward += rew\n",
|
||||
" print(f\"{obs} -> {rew}\")\n",
|
||||
"print(f\"Total reward: {total_reward}\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Vous pouvez remarquer que les observations contiennent 4 nombres. Ce sont :\n",
|
||||
"- Position du chariot\n",
|
||||
"- Vitesse du chariot\n",
|
||||
"- Angle de la tige\n",
|
||||
"- Taux de rotation de la tige\n",
|
||||
"\n",
|
||||
"`rew` est la r├йcompense que nous recevons ├а chaque ├йtape. Vous pouvez constater que dans l'environnement CartPole, vous recevez 1 point de r├йcompense pour chaque ├йtape de simulation, et l'objectif est de maximiser la r├йcompense totale, c'est-├а-dire le temps pendant lequel le CartPole peut rester en ├йquilibre sans tomber.\n",
|
||||
"\n",
|
||||
"Pendant l'apprentissage par renforcement, notre objectif est d'entra├оner une **politique** $\\pi$, qui pour chaque ├йtat $s$ nous indiquera quelle action $a$ entreprendre, donc essentiellement $a = \\pi(s)$.\n",
|
||||
"\n",
|
||||
"Si vous souhaitez une solution probabiliste, vous pouvez consid├йrer la politique comme renvoyant un ensemble de probabilit├йs pour chaque action, c'est-├а-dire que $\\pi(a|s)$ repr├йsenterait la probabilit├й que nous devrions entreprendre l'action $a$ dans l'├йtat $s$.\n",
|
||||
"\n",
|
||||
"## M├йthode du Gradient de Politique\n",
|
||||
"\n",
|
||||
"Dans l'algorithme d'apprentissage par renforcement le plus simple, appel├й **Gradient de Politique**, nous allons entra├оner un r├йseau de neurones ├а pr├йdire la prochaine action.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import numpy as np\n",
|
||||
"import matplotlib.pyplot as plt\n",
|
||||
"import torch\n",
|
||||
"\n",
|
||||
"num_inputs = 4\n",
|
||||
"num_actions = 2\n",
|
||||
"\n",
|
||||
"model = torch.nn.Sequential(\n",
|
||||
" torch.nn.Linear(num_inputs, 128, bias=False, dtype=torch.float32),\n",
|
||||
" torch.nn.ReLU(),\n",
|
||||
" torch.nn.Linear(128, num_actions, bias = False, dtype=torch.float32),\n",
|
||||
" torch.nn.Softmax(dim=1)\n",
|
||||
")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Nous allons entra├оner le r├йseau en r├йalisant de nombreuses exp├йriences et en mettant ├а jour notre r├йseau apr├иs chaque ex├йcution. D├йfinissons une fonction qui ex├йcutera l'exp├йrience et renverra les r├йsultats (le **trace** ainsi nomm├й) - tous les ├йtats, actions (et leurs probabilit├йs recommand├йes), et r├йcompenses :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def run_episode(max_steps_per_episode = 10000,render=False): \n",
|
||||
" states, actions, probs, rewards = [],[],[],[]\n",
|
||||
" state = env.reset()\n",
|
||||
" for _ in range(max_steps_per_episode):\n",
|
||||
" if render:\n",
|
||||
" env.render()\n",
|
||||
" action_probs = model(torch.from_numpy(np.expand_dims(state,0)))[0]\n",
|
||||
" action = np.random.choice(num_actions, p=np.squeeze(action_probs.detach().numpy()))\n",
|
||||
" nstate, reward, done, info = env.step(action)\n",
|
||||
" if done:\n",
|
||||
" break\n",
|
||||
" states.append(state)\n",
|
||||
" actions.append(action)\n",
|
||||
" probs.append(action_probs.detach().numpy())\n",
|
||||
" rewards.append(reward)\n",
|
||||
" state = nstate\n",
|
||||
" return np.vstack(states), np.vstack(actions), np.vstack(probs), np.vstack(rewards)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Vous pouvez ex├йcuter un ├йpisode avec un r├йseau non entra├оn├й et observer que la r├йcompense totale (AKA dur├йe de l'├йpisode) est tr├иs faible :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"s, a, p, r = run_episode()\n",
|
||||
"print(f\"Total reward: {np.sum(r)}\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"L'un des aspects d├йlicats de l'algorithme de gradient de politique est d'utiliser **les r├йcompenses actualis├йes**. L'id├йe est que nous calculons le vecteur des r├йcompenses totales ├а chaque ├йtape du jeu, et pendant ce processus, nous actualisons les premi├иres r├йcompenses en utilisant un coefficient $gamma$. Nous normalisons ├йgalement le vecteur r├йsultant, car nous l'utiliserons comme poids pour influencer notre entra├оnement :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"eps = 0.0001\n",
|
||||
"\n",
|
||||
"def discounted_rewards(rewards,gamma=0.99,normalize=True):\n",
|
||||
" ret = []\n",
|
||||
" s = 0\n",
|
||||
" for r in rewards[::-1]:\n",
|
||||
" s = r + gamma * s\n",
|
||||
" ret.insert(0, s)\n",
|
||||
" if normalize:\n",
|
||||
" ret = (ret-np.mean(ret))/(np.std(ret)+eps)\n",
|
||||
" return ret"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Passons maintenant ├а l'entra├оnement proprement dit ! Nous allons ex├йcuter 300 ├йpisodes, et ├а chaque ├йpisode, nous effectuerons les ├йtapes suivantes :\n",
|
||||
"\n",
|
||||
"1. Ex├йcuter l'exp├йrience et collecter la trace.\n",
|
||||
"2. Calculer la diff├йrence (`gradients`) entre les actions effectu├йes et les probabilit├йs pr├йdites. Plus cette diff├йrence est faible, plus nous sommes certains d'avoir pris la bonne d├йcision.\n",
|
||||
"3. Calculer les r├йcompenses actualis├йes et multiplier les gradients par ces r├йcompenses actualis├йes - cela garantit que les ├йtapes avec des r├йcompenses plus ├йlev├йes auront un impact plus important sur le r├йsultat final que celles avec des r├йcompenses plus faibles.\n",
|
||||
"4. Les actions cibles attendues pour notre r├йseau neuronal seront en partie issues des probabilit├йs pr├йdites pendant l'ex├йcution, et en partie des gradients calcul├йs. Nous utiliserons le param├иtre `alpha` pour d├йterminer dans quelle mesure les gradients et les r├йcompenses sont pris en compte - c'est ce qu'on appelle le *taux d'apprentissage* de l'algorithme de renforcement.\n",
|
||||
"5. Enfin, nous entra├оnons notre r├йseau sur les ├йtats et les actions attendues, puis nous r├йp├йtons le processus.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"optimizer = torch.optim.Adam(model.parameters(), lr=0.01)\n",
|
||||
"\n",
|
||||
"def train_on_batch(x, y):\n",
|
||||
" x = torch.from_numpy(x)\n",
|
||||
" y = torch.from_numpy(y)\n",
|
||||
" optimizer.zero_grad()\n",
|
||||
" predictions = model(x)\n",
|
||||
" loss = -torch.mean(torch.log(predictions) * y)\n",
|
||||
" loss.backward()\n",
|
||||
" optimizer.step()\n",
|
||||
" return loss"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"alpha = 1e-4\n",
|
||||
"\n",
|
||||
"history = []\n",
|
||||
"for epoch in range(300):\n",
|
||||
" states, actions, probs, rewards = run_episode()\n",
|
||||
" one_hot_actions = np.eye(2)[actions.T][0]\n",
|
||||
" gradients = one_hot_actions-probs\n",
|
||||
" dr = discounted_rewards(rewards)\n",
|
||||
" gradients *= dr\n",
|
||||
" target = alpha*np.vstack([gradients])+probs\n",
|
||||
" train_on_batch(states,target)\n",
|
||||
" history.append(np.sum(rewards))\n",
|
||||
" if epoch%100==0:\n",
|
||||
" print(f\"{epoch} -> {np.sum(rewards)}\")\n",
|
||||
"\n",
|
||||
"plt.plot(history)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Maintenant, lan├зons l'├йpisode avec le rendu pour voir le r├йsultat :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"_ = run_episode(render=True)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Esp├йrons que vous pouvez constater que la tige peut maintenant s'├йquilibrer assez bien !\n",
|
||||
"\n",
|
||||
"## Mod├иle Acteur-Critique\n",
|
||||
"\n",
|
||||
"Le mod├иle Acteur-Critique est une ├йvolution des gradients de politique, dans lequel nous construisons un r├йseau neuronal pour apprendre ├а la fois la politique et les r├йcompenses estim├йes. Le r├йseau aura deux sorties (ou vous pouvez le voir comme deux r├йseaux distincts) :\n",
|
||||
"* **Acteur** recommandera l'action ├а entreprendre en nous donnant la distribution de probabilit├й des ├йtats, comme dans le mod├иle de gradient de politique.\n",
|
||||
"* **Critique** estimera quelle serait la r├йcompense issue de ces actions. Il renvoie les r├йcompenses totales estim├йes dans le futur pour l'├йtat donn├й.\n",
|
||||
"\n",
|
||||
"D├йfinissons un tel mod├иle :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"from itertools import count\n",
|
||||
"import torch.nn.functional as F"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
|
||||
"env = gym.make(\"CartPole-v1\")\n",
|
||||
"\n",
|
||||
"state_size = env.observation_space.shape[0]\n",
|
||||
"action_size = env.action_space.n\n",
|
||||
"lr = 0.0001\n",
|
||||
"\n",
|
||||
"class Actor(torch.nn.Module):\n",
|
||||
" def __init__(self, state_size, action_size):\n",
|
||||
" super(Actor, self).__init__()\n",
|
||||
" self.state_size = state_size\n",
|
||||
" self.action_size = action_size\n",
|
||||
" self.linear1 = torch.nn.Linear(self.state_size, 128)\n",
|
||||
" self.linear2 = torch.nn.Linear(128, 256)\n",
|
||||
" self.linear3 = torch.nn.Linear(256, self.action_size)\n",
|
||||
"\n",
|
||||
" def forward(self, state):\n",
|
||||
" output = F.relu(self.linear1(state))\n",
|
||||
" output = F.relu(self.linear2(output))\n",
|
||||
" output = self.linear3(output)\n",
|
||||
" distribution = torch.distributions.Categorical(F.softmax(output, dim=-1))\n",
|
||||
" return distribution\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"class Critic(torch.nn.Module):\n",
|
||||
" def __init__(self, state_size, action_size):\n",
|
||||
" super(Critic, self).__init__()\n",
|
||||
" self.state_size = state_size\n",
|
||||
" self.action_size = action_size\n",
|
||||
" self.linear1 = torch.nn.Linear(self.state_size, 128)\n",
|
||||
" self.linear2 = torch.nn.Linear(128, 256)\n",
|
||||
" self.linear3 = torch.nn.Linear(256, 1)\n",
|
||||
"\n",
|
||||
" def forward(self, state):\n",
|
||||
" output = F.relu(self.linear1(state))\n",
|
||||
" output = F.relu(self.linear2(output))\n",
|
||||
" value = self.linear3(output)\n",
|
||||
" return value"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Nous devrions l├йg├иrement modifier nos fonctions `discounted_rewards` et `run_episode` :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def discounted_rewards(next_value, rewards, masks, gamma=0.99):\n",
|
||||
" R = next_value\n",
|
||||
" returns = []\n",
|
||||
" for step in reversed(range(len(rewards))):\n",
|
||||
" R = rewards[step] + gamma * R * masks[step]\n",
|
||||
" returns.insert(0, R)\n",
|
||||
" return returns\n",
|
||||
"\n",
|
||||
"def run_episode(actor, critic, n_iters):\n",
|
||||
" optimizerA = torch.optim.Adam(actor.parameters())\n",
|
||||
" optimizerC = torch.optim.Adam(critic.parameters())\n",
|
||||
" for iter in range(n_iters):\n",
|
||||
" state = env.reset()\n",
|
||||
" log_probs = []\n",
|
||||
" values = []\n",
|
||||
" rewards = []\n",
|
||||
" masks = []\n",
|
||||
" entropy = 0\n",
|
||||
" env.reset()\n",
|
||||
"\n",
|
||||
" for i in count():\n",
|
||||
" env.render()\n",
|
||||
" state = torch.FloatTensor(state).to(device)\n",
|
||||
" dist, value = actor(state), critic(state)\n",
|
||||
"\n",
|
||||
" action = dist.sample()\n",
|
||||
" next_state, reward, done, _ = env.step(action.cpu().numpy())\n",
|
||||
"\n",
|
||||
" log_prob = dist.log_prob(action).unsqueeze(0)\n",
|
||||
" entropy += dist.entropy().mean()\n",
|
||||
"\n",
|
||||
" log_probs.append(log_prob)\n",
|
||||
" values.append(value)\n",
|
||||
" rewards.append(torch.tensor([reward], dtype=torch.float, device=device))\n",
|
||||
" masks.append(torch.tensor([1-done], dtype=torch.float, device=device))\n",
|
||||
"\n",
|
||||
" state = next_state\n",
|
||||
"\n",
|
||||
" if done:\n",
|
||||
" print('Iteration: {}, Score: {}'.format(iter, i))\n",
|
||||
" break\n",
|
||||
"\n",
|
||||
"\n",
|
||||
" next_state = torch.FloatTensor(next_state).to(device)\n",
|
||||
" next_value = critic(next_state)\n",
|
||||
" returns = discounted_rewards(next_value, rewards, masks)\n",
|
||||
"\n",
|
||||
" log_probs = torch.cat(log_probs)\n",
|
||||
" returns = torch.cat(returns).detach()\n",
|
||||
" values = torch.cat(values)\n",
|
||||
"\n",
|
||||
" advantage = returns - values\n",
|
||||
"\n",
|
||||
" actor_loss = -(log_probs * advantage.detach()).mean()\n",
|
||||
" critic_loss = advantage.pow(2).mean()\n",
|
||||
"\n",
|
||||
" optimizerA.zero_grad()\n",
|
||||
" optimizerC.zero_grad()\n",
|
||||
" actor_loss.backward()\n",
|
||||
" critic_loss.backward()\n",
|
||||
" optimizerA.step()\n",
|
||||
" optimizerC.step()\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Maintenant, nous allons ex├йcuter la boucle principale d'entra├оnement. Nous utiliserons un processus d'entra├оnement manuel du r├йseau en calculant les fonctions de perte appropri├йes et en mettant ├а jour les param├иtres du r├йseau :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"\n",
|
||||
"actor = Actor(state_size, action_size).to(device)\n",
|
||||
"critic = Critic(state_size, action_size).to(device)\n",
|
||||
"run_episode(actor, critic, n_iters=100)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"env.close()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Points cl├йs\n",
|
||||
"\n",
|
||||
"Nous avons vu deux algorithmes de RL dans cette d├йmonstration : le gradient de politique simple et l'acteur-critique plus sophistiqu├й. Vous pouvez constater que ces algorithmes fonctionnent avec des notions abstraites d'├йtat, d'action et de r├йcompense - ce qui leur permet d'├кtre appliqu├йs ├а des environnements tr├иs diff├йrents.\n",
|
||||
"\n",
|
||||
"L'apprentissage par renforcement nous permet d'apprendre la meilleure strat├йgie pour r├йsoudre un probl├иme simplement en observant la r├йcompense finale. Le fait de ne pas avoir besoin de jeux de donn├йes ├йtiquet├йs nous permet de r├йp├йter les simulations plusieurs fois afin d'optimiser nos mod├иles. Cependant, il reste encore de nombreux d├йfis dans le domaine du RL, que vous pourrez d├йcouvrir si vous d├йcidez de vous concentrer davantage sur cette branche fascinante de l'IA.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**Avertissement** : \nCe document a ├йt├й traduit ├а l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatis├йes peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit ├кtre consid├йr├й comme la source faisant autorit├й. Pour des informations critiques, il est recommand├й de recourir ├а une traduction humaine professionnelle. Nous d├йclinons toute responsabilit├й en cas de malentendus ou d'interpr├йtations erron├йes r├йsultant de l'utilisation de cette traduction.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3.10.4 64-bit",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.10.4"
|
||||
},
|
||||
"orig_nbformat": 4,
|
||||
"vscode": {
|
||||
"interpreter": {
|
||||
"hash": "916dbcbb3f70747c44a77c7bcd40155683ae19c65e1c03b4aa3499c5328201f1"
|
||||
}
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "04f8d9978cd11281d81dd037cbf6ce20",
|
||||
"translation_date": "2025-08-31T14:25:30+00:00",
|
||||
"source_file": "lessons/6-Other/22-DeepRL/CartPole-RL-PyTorch.ipynb",
|
||||
"language_code": "fr"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,109 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Entra├оner une voiture de montagne ├а s'├йchapper\n",
|
||||
"\n",
|
||||
"Travail pratique issu du [Curriculum AI pour d├йbutants](https://github.com/microsoft/ai-for-beginners).\n",
|
||||
"\n",
|
||||
"Votre objectif est d'entra├оner un agent RL ├а contr├┤ler [Mountain Car](https://www.gymlibrary.ml/environments/classic_control/mountain_car/) dans l'environnement OpenAI.\n",
|
||||
"\n",
|
||||
"Commen├зons par cr├йer l'environnement :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import gym\n",
|
||||
"env = gym.make('MountainCar-v0')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Voyons ├а quoi ressemble l'exp├йrience al├йatoire :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"state = env.reset()\n",
|
||||
"while True:\n",
|
||||
" env.render()\n",
|
||||
" action = env.action_space.sample()\n",
|
||||
" state, reward, done, info = env.step(action)\n",
|
||||
" if done:\n",
|
||||
" break"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"## Lost of code here"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"env.close()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**Avertissement** : \nCe document a ├йt├й traduit ├а l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatis├йes peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit ├кtre consid├йr├й comme la source faisant autorit├й. Pour des informations critiques, il est recommand├й de recourir ├а une traduction humaine professionnelle. Nous d├йclinons toute responsabilit├й en cas de malentendus ou d'interpr├йtations erron├йes r├йsultant de l'utilisation de cette traduction.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"interpreter": {
|
||||
"hash": "16af2a8bbb083ea23e5e41c7f5787656b2ce26968575d8763f2c4b17f9cd711f"
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3.8.12 ('py38')",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.8.12"
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "f062b3b18449593ef8e0fcc029868781",
|
||||
"translation_date": "2025-08-31T14:27:52+00:00",
|
||||
"source_file": "lessons/6-Other/22-DeepRL/lab/MountainCar.ipynb",
|
||||
"language_code": "fr"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 4
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1,8 +1,8 @@
|
|||
<!--
|
||||
CO_OP_TRANSLATOR_METADATA:
|
||||
{
|
||||
"original_hash": "f3a6b0ddf7e6e3f33b2a543baf086dc9",
|
||||
"translation_date": "2025-08-24T09:45:36+00:00",
|
||||
"original_hash": "07191303b7ea2aff1d47e2b0fe4bb862",
|
||||
"translation_date": "2025-08-31T14:20:21+00:00",
|
||||
"source_file": "README.md",
|
||||
"language_code": "hi"
|
||||
}
|
||||
|
|
@ -21,13 +21,24 @@ CO_OP_TRANSLATOR_METADATA:
|
|||
|
||||
[](https://discord.gg/zxKYvhSnVp?WT.mc_id=academic-000002-leestott)
|
||||
|
||||
# рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХреГрддреНрд░рд┐рдо рдмреБрджреНрдзрд┐рдорддреНрддрд╛ - рдПрдХ рдкрд╛рдареНрдпрдХреНрд░рдо
|
||||
# рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХреГрддреНрд░рд┐рдо рдмреБрджреНрдзрд┐рдорддреНрддрд╛ - рдПрдХ рдкрд╛рдареНрдпрдХреНрд░рдо
|
||||
|
||||
| рджреНрд╡рд╛рд░рд╛ ](./lessons/sketchnotes/ai-overview.png)|
|
||||
||
|
||||
|:---:|
|
||||
| рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП AI - _[@girlie_mac](https://twitter.com/girlie_mac) рджреНрд╡рд╛рд░рд╛ рд╕реНрдХреЗрдЪ рдиреЛрдЯ_ |
|
||||
| рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП AI - _[@girlie_mac](https://twitter.com/girlie_mac) рджреНрд╡рд╛рд░рд╛ рд╕реНрдХреЗрдЪ_ |
|
||||
|
||||
**рдХреГрддреНрд░рд┐рдо рдмреБрджреНрдзрд┐рдорддреНрддрд╛** (AI) рдХреА рджреБрдирд┐рдпрд╛ рдХреЛ рд╣рдорд╛рд░реЗ 12-рд╕рдкреНрддрд╛рд╣, 24-рдкрд╛рда рд╡рд╛рд▓реЗ рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЗ рд╕рд╛рде рдЦреЛрдЬреЗрдВ! рдЗрд╕рдореЗрдВ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрд╛рда, рдХреНрд╡рд┐рдЬрд╝ рдФрд░ рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпрд╣ рдкрд╛рдареНрдпрдХреНрд░рдо рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ TensorFlow рдФрд░ PyTorch рдЬреИрд╕реЗ рдЯреВрд▓реНрд╕ рдХреЗ рд╕рд╛рде-рд╕рд╛рде AI рдореЗрдВ рдиреИрддрд┐рдХрддрд╛ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред
|
||||
**рдХреГрддреНрд░рд┐рдо рдмреБрджреНрдзрд┐рдорддреНрддрд╛** (AI) рдХреА рджреБрдирд┐рдпрд╛ рдХреЛ рд╣рдорд╛рд░реЗ 12-рд╕рдкреНрддрд╛рд╣, 24-рдкрд╛рда рд╡рд╛рд▓реЗ рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЗ рд╕рд╛рде рдЦреЛрдЬреЗрдВ! рдЗрд╕рдореЗрдВ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрд╛рда, рдХреНрд╡рд┐рдЬрд╝ рдФрд░ рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпрд╣ рдкрд╛рдареНрдпрдХреНрд░рдо рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ TensorFlow рдФрд░ PyTorch рдЬреИрд╕реЗ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде AI рдореЗрдВ рдиреИрддрд┐рдХрддрд╛ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред
|
||||
|
||||
### ЁЯМР рдмрд╣реБрднрд╛рд╖реА рд╕рдорд░реНрдерди
|
||||
|
||||
#### GitHub Action рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдорд░реНрдерд┐рдд (рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдФрд░ рд╣рдореЗрд╢рд╛ рдЕрджреНрдпрддрди)
|
||||
|
||||
[French](../fr/README.md) | [Spanish](../es/README.md) | [German](../de/README.md) | [Russian](../ru/README.md) | [Arabic](../ar/README.md) | [Persian (Farsi)](../fa/README.md) | [Urdu](../ur/README.md) | [Chinese (Simplified)](../zh/README.md) | [Chinese (Traditional, Macau)](../mo/README.md) | [Chinese (Traditional, Hong Kong)](../hk/README.md) | [Chinese (Traditional, Taiwan)](../tw/README.md) | [Japanese](../ja/README.md) | [Korean](../ko/README.md) | [Hindi](./README.md) | [Bengali](../bn/README.md) | [Marathi](../mr/README.md) | [Nepali](../ne/README.md) | [Punjabi (Gurmukhi)](../pa/README.md) | [Portuguese (Portugal)](../pt/README.md) | [Portuguese (Brazil)](../br/README.md) | [Italian](../it/README.md) | [Polish](../pl/README.md) | [Turkish](../tr/README.md) | [Greek](../el/README.md) | [Thai](../th/README.md) | [Swedish](../sv/README.md) | [Danish](../da/README.md) | [Norwegian](../no/README.md) | [Finnish](../fi/README.md) | [Dutch](../nl/README.md) | [Hebrew](../he/README.md) | [Vietnamese](../vi/README.md) | [Indonesian](../id/README.md) | [Malay](../ms/README.md) | [Tagalog (Filipino)](../tl/README.md) | [Swahili](../sw/README.md) | [Hungarian](../hu/README.md) | [Czech](../cs/README.md) | [Slovak](../sk/README.md) | [Romanian](../ro/README.md) | [Bulgarian](../bg/README.md) | [Serbian (Cyrillic)](../sr/README.md) | [Croatian](../hr/README.md) | [Slovenian](../sl/README.md) | [Ukrainian](../uk/README.md) | [Burmese (Myanmar)](../my/README.md)
|
||||
|
||||
**рдпрджрд┐ рдЖрдк рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрдиреБрд╡рд╛рдж рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╕рдорд░реНрдерд┐рдд рднрд╛рд╖рд╛рдУрдВ рдХреА рд╕реВрдЪреА [рдпрд╣рд╛рдВ](https://github.com/Azure/co-op-translator/blob/main/getting_started/supported-languages.md) рдЙрдкрд▓рдмреНрдз рд╣реИред**
|
||||
|
||||
## рд╕рдореБрджрд╛рдп рд╕реЗ рдЬреБрдбрд╝реЗрдВ
|
||||
[](https://discord.gg/kzRShWzttr)
|
||||
|
||||
## рдЖрдк рдХреНрдпрд╛ рд╕реАрдЦреЗрдВрдЧреЗ
|
||||
|
||||
|
|
@ -35,23 +46,23 @@ CO_OP_TRANSLATOR_METADATA:
|
|||
|
||||
рдЗрд╕ рдкрд╛рдареНрдпрдХреНрд░рдо рдореЗрдВ, рдЖрдк рд╕реАрдЦреЗрдВрдЧреЗ:
|
||||
|
||||
* рдХреГрддреНрд░рд┐рдо рдмреБрджреНрдзрд┐рдорддреНрддрд╛ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рджреГрд╖реНрдЯрд┐рдХреЛрдг, рдЬрд┐рд╕рдореЗрдВ **рдЬреНрдЮрд╛рди рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡** рдФрд░ рддрд░реНрдХ рдХреЗ рд╕рд╛рде "рдкреБрд░рд╛рдиреЗ рдЕрдЪреНрдЫреЗ" рдкреНрд░рддреАрдХрд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг ([GOFAI](https://en.wikipedia.org/wiki/Symbolic_artificial_intelligence)) рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
|
||||
* **рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХреНрд╕** рдФрд░ **рдбреАрдк рд▓рд░реНрдирд┐рдВрдЧ**, рдЬреЛ рдЖрдзреБрдирд┐рдХ AI рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рд╣реИрдВред рд╣рдо рдЗрди рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╖рдпреЛрдВ рдХреЗ рдкреАрдЫреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рджреЛ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдлреНрд░реЗрдорд╡рд░реНрдХ - [TensorFlow](http://Tensorflow.org) рдФрд░ [PyTorch](http://pytorch.org) рдореЗрдВ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдордЭрд╛рдПрдВрдЧреЗред
|
||||
* рдЫрд╡рд┐рдпреЛрдВ рдФрд░ рдкрд╛рда рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП **рдиреНрдпреВрд░рд▓ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░**ред рд╣рдо рд╣рд╛рд▓ рдХреЗ рдореЙрдбрд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░реЗрдВрдЧреЗ рд▓реЗрдХрд┐рди рдЕрддреНрдпрд╛рдзреБрдирд┐рдХ рддрдХрдиреАрдХреЛрдВ рдореЗрдВ рдереЛрдбрд╝реЗ рдкреАрдЫреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
|
||||
* рдХреГрддреНрд░рд┐рдо рдмреБрджреНрдзрд┐рдорддреНрддрд╛ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рджреГрд╖реНрдЯрд┐рдХреЛрдг, рдЬрд┐рд╕рдореЗрдВ "рдкреБрд░рд╛рдиреЗ" рдкреНрд░рддреАрдХрд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬреИрд╕реЗ **рдЬреНрдЮрд╛рди рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡** рдФрд░ рддрд░реНрдХ ([GOFAI](https://en.wikipedia.org/wiki/Symbolic_artificial_intelligence))ред
|
||||
* **рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ** рдФрд░ **рдбреАрдк рд▓рд░реНрдирд┐рдВрдЧ**, рдЬреЛ рдЖрдзреБрдирд┐рдХ AI рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рд╣реИрдВред рд╣рдо рдЗрди рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╖рдпреЛрдВ рдХреЗ рдкреАрдЫреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ [TensorFlow](http://Tensorflow.org) рдФрд░ [PyTorch](http://pytorch.org) рдЬреИрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдлреНрд░реЗрдорд╡рд░реНрдХреНрд╕ рдХреЗ рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдордЭрд╛рдПрдВрдЧреЗред
|
||||
* рдЫрд╡рд┐рдпреЛрдВ рдФрд░ рдкрд╛рда рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП **рдиреНрдпреВрд░рд▓ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░**ред рд╣рдо рд╣рд╛рд▓ рдХреЗ рдореЙрдбрд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░реЗрдВрдЧреЗ рд▓реЗрдХрд┐рди рдЕрддреНрдпрд╛рдзреБрдирд┐рдХ рддрдХрдиреАрдХреЛрдВ рдореЗрдВ рдереЛрдбрд╝реА рдХрдореА рд╣реЛ рд╕рдХрддреА рд╣реИред
|
||||
* рдХрдо рд▓реЛрдХрдкреНрд░рд┐рдп AI рджреГрд╖реНрдЯрд┐рдХреЛрдг, рдЬреИрд╕реЗ **рдЬреЗрдиреЗрдЯрд┐рдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо** рдФрд░ **рдорд▓реНрдЯреА-рдПрдЬреЗрдВрдЯ рд╕рд┐рд╕реНрдЯрдореНрд╕**ред
|
||||
|
||||
рд╣рдо рдЗрд╕ рдкрд╛рдареНрдпрдХреНрд░рдо рдореЗрдВ рдХреНрдпрд╛ рдХрд╡рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ:
|
||||
рдЗрд╕ рдкрд╛рдареНрдпрдХреНрд░рдо рдореЗрдВ рд╣рдо рдХреНрдпрд╛ рдХрд╡рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ:
|
||||
|
||||
> [рдЗрд╕ рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рд╕рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрд╕рд╛рдзрди рд╣рдорд╛рд░реА Microsoft Learn рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдЦреЛрдЬреЗрдВ](https://learn.microsoft.com/en-us/collections/7w28iy2xrqzdj0?WT.mc_id=academic-77998-bethanycheum)
|
||||
> [рдЗрд╕ рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рд╕рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрд╕рд╛рдзрди рд╣рдорд╛рд░реЗ Microsoft Learn рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдЦреЛрдЬреЗрдВ](https://learn.microsoft.com/en-us/collections/7w28iy2xrqzdj0?WT.mc_id=academic-77998-bethanycheum)
|
||||
|
||||
* **рд╡реНрдпрд╡рд╕рд╛рдп рдореЗрдВ AI** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдорд╛рдорд▓реЗред Microsoft Learn рдкрд░ [рд╡реНрдпрд╡рд╕рд╛рдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП AI рдХрд╛ рдкрд░рд┐рдЪрдп](https://docs.microsoft.com/learn/paths/introduction-ai-for-business-users/?WT.mc_id=academic-77998-bethanycheum) рдпрд╛ [AI рдмрд┐рдЬрдиреЗрд╕ рд╕реНрдХреВрд▓](https://www.microsoft.com/ai/ai-business-school/?WT.mc_id=academic-77998-bethanycheum), рдЬреЛ [INSEAD](https://www.insead.edu/) рдХреЗ рд╕рд╣рдпреЛрдЧ рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреЛ рд▓реЗрдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
|
||||
* **рд╡реНрдпрд╡рд╕рд╛рдп рдореЗрдВ AI** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдорд╛рдорд▓реЗред рдЗрд╕рдХреЗ рд▓рд┐рдП, [рд╡реНрдпрд╡рд╕рд╛рдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП AI рдХрд╛ рдкрд░рд┐рдЪрдп](https://docs.microsoft.com/learn/paths/introduction-ai-for-business-users/?WT.mc_id=academic-77998-bethanycheum) рдпрд╛ [AI рдмрд┐рдЬрдиреЗрд╕ рд╕реНрдХреВрд▓](https://www.microsoft.com/ai/ai-business-school/?WT.mc_id=academic-77998-bethanycheum) рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
|
||||
* **рдХреНрд▓рд╛рд╕рд┐рдХ рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ**, рдЬрд┐рд╕реЗ рд╣рдорд╛рд░реЗ [рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдкрд╛рдареНрдпрдХреНрд░рдо](http://github.com/Microsoft/ML-for-Beginners) рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
|
||||
* **[рдХреЙрдЧреНрдирд┐рдЯрд┐рд╡ рд╕рд░реНрд╡рд┐рд╕реЗрдЬ](https://azure.microsoft.com/services/cognitive-services/?WT.mc_id=academic-77998-bethanycheum)** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдП рдЧрдП рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ AI рдЕрдиреБрдкреНрд░рдпреЛрдЧред рдЗрд╕рдХреЗ рд▓рд┐рдП, рд╣рдо Microsoft Learn рдХреЗ [рд╡рд┐рдЬрд╝рди](https://docs.microsoft.com/learn/paths/create-computer-vision-solutions-azure-cognitive-services/?WT.mc_id=academic-77998-bethanycheum), [рдиреЗрдЪреБрд░рд▓ рд▓реИрдВрдЧреНрд╡реЗрдЬ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ](https://docs.microsoft.com/learn/paths/explore-natural-language-processing/?WT.mc_id=academic-77998-bethanycheum), **[Azure OpenAI Service рдХреЗ рд╕рд╛рде рдЬрдирд░реЗрдЯрд┐рд╡ AI](https://learn.microsoft.com/en-us/training/paths/develop-ai-solutions-azure-openai/?WT.mc_id=academic-77998-bethanycheum)** рдФрд░ рдЕрдиреНрдп рдореЙрдбреНрдпреВрд▓ рд╕реЗ рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред
|
||||
* рд╡рд┐рд╢рд┐рд╖реНрдЯ ML **рдХреНрд▓рд╛рдЙрдб рдлреНрд░реЗрдорд╡рд░реНрдХ**, рдЬреИрд╕реЗ [Azure Machine Learning](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-bethanycheum), [Microsoft Fabric](https://learn.microsoft.com/en-us/training/paths/get-started-fabric/?WT.mc_id=academic-77998-bethanycheum), рдпрд╛ [Azure Databricks](https://docs.microsoft.com/learn/paths/data-engineer-azure-databricks?WT.mc_id=academic-77998-bethanycheum)ред [Azure Machine Learning рдХреЗ рд╕рд╛рде рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рд╕рдорд╛рдзрд╛рди рдмрдирд╛рдПрдВ рдФрд░ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд░реЗрдВ](https://docs.microsoft.com/learn/paths/build-ai-solutions-with-azure-ml-service/?WT.mc_id=academic-77998-bethanycheum) рдФрд░ [Azure Databricks рдХреЗ рд╕рд╛рде рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рд╕рдорд╛рдзрд╛рди рдмрдирд╛рдПрдВ рдФрд░ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд░реЗрдВ](https://docs.microsoft.com/learn/paths/build-operate-machine-learning-solutions-azure-databricks/?WT.mc_id=academic-77998-bethanycheum) рд▓рд░реНрдирд┐рдВрдЧ рдкрд╛рдереНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
|
||||
* **рд╕рдВрд╡рд╛рджреА AI** рдФрд░ **рдЪреИрдЯ рдмреЙрдЯреНрд╕**ред рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ [рд╕рдВрд╡рд╛рджреА AI рд╕рдорд╛рдзрд╛рди рдмрдирд╛рдПрдВ](https://docs.microsoft.com/learn/paths/create-conversational-ai-solutions/?WT.mc_id=academic-77998-bethanycheum) рд▓рд░реНрдирд┐рдВрдЧ рдкрд╛рде рд╣реИ, рдФрд░ рдЖрдк рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП [рдЗрд╕ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ](https://soshnikov.com/azure/hello-bot-conversational-ai-on-microsoft-platform/) рдХрд╛ рднреА рд╕рдВрджрд░реНрдн рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред
|
||||
* рдбреАрдк рд▓рд░реНрдирд┐рдВрдЧ рдХреЗ рдкреАрдЫреЗ рдХрд╛ **рдЧрд╣рди рдЧрдгрд┐рдд**ред рдЗрд╕рдХреЗ рд▓рд┐рдП, рд╣рдо Ian Goodfellow, Yoshua Bengio рдФрд░ Aaron Courville рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд┐рдд [Deep Learning](https://www.amazon.com/Deep-Learning-Adaptive-Computation-Machine/dp/0262035618) рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдСрдирд▓рд╛рдЗрди рднреА рдЙрдкрд▓рдмреНрдз рд╣реИ [https://www.deeplearningbook.org/](https://www.deeplearningbook.org/)ред
|
||||
* **[рдХреЙрдЧреНрдирд┐рдЯрд┐рд╡ рд╕рд░реНрд╡рд┐рд╕реЗрдЬ](https://azure.microsoft.com/services/cognitive-services/?WT.mc_id=academic-77998-bethanycheum)** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ AI рдЕрдиреБрдкреНрд░рдпреЛрдЧред рдЗрд╕рдХреЗ рд▓рд┐рдП, [Generative AI with Azure OpenAI Service](https://learn.microsoft.com/en-us/training/paths/develop-ai-solutions-azure-openai/?WT.mc_id=academic-77998-bethanycheum) рдЬреИрд╕реЗ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рд╢реБрд░реБрдЖрдд рдХрд░реЗрдВред
|
||||
* **рдХреНрд▓рд╛рдЙрдб рдлреНрд░реЗрдорд╡рд░реНрдХреНрд╕**, рдЬреИрд╕реЗ [Azure Machine Learning](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-bethanycheum)ред
|
||||
* **рд╕рдВрд╡рд╛рджреА AI** рдФрд░ **рдЪреИрдЯ рдмреЙрдЯреНрд╕**ред рдЗрд╕рдХреЗ рд▓рд┐рдП [Create conversational AI solutions](https://docs.microsoft.com/learn/paths/create-conversational-ai-solutions/?WT.mc_id=academic-77998-bethanycheum) рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
|
||||
* **рдбреАрдк рд▓рд░реНрдирд┐рдВрдЧ рдХреЗ рдкреАрдЫреЗ рдЧрд╣рди рдЧрдгрд┐рдд**ред рдЗрд╕рдХреЗ рд▓рд┐рдП, [Deep Learning](https://www.amazon.com/Deep-Learning-Adaptive-Computation-Machine/dp/0262035618) рдкреБрд╕реНрддрдХ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред
|
||||
|
||||
рдХреНрд▓рд╛рдЙрдб рдореЗрдВ _AI_ рд╡рд┐рд╖рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдкрд░рд┐рдЪрдп рдХреЗ рд▓рд┐рдП, рдЖрдк [Azure рдкрд░ рдХреГрддреНрд░рд┐рдо рдмреБрджреНрдзрд┐рдорддреНрддрд╛ рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░реЗрдВ](https://docs.microsoft.com/learn/paths/get-started-with-artificial-intelligence-on-azure/?WT.mc_id=academic-77998-bethanycheum) рд▓рд░реНрдирд┐рдВрдЧ рдкрд╛рде рд▓реЗрдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
|
||||
рдХреНрд▓рд╛рдЙрдб рдореЗрдВ _AI_ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдкрд░рд┐рдЪрдп рдХреЗ рд▓рд┐рдП, [Get started with artificial intelligence on Azure](https://docs.microsoft.com/learn/paths/get-started-with-artificial-intelligence-on-azure/?WT.mc_id=academic-77998-bethanycheum) рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
|
||||
|
||||
# рд╕рд╛рдордЧреНрд░реА
|
||||
|
||||
|
|
@ -61,69 +72,69 @@ CO_OP_TRANSLATOR_METADATA:
|
|||
| I | [**AI рдХрд╛ рдкрд░рд┐рдЪрдп**](./lessons/1-Intro/README.md) | | |
|
||||
| 01 | [AI рдХрд╛ рдкрд░рд┐рдЪрдп рдФрд░ рдЗрддрд┐рд╣рд╛рд╕](./lessons/1-Intro/README.md) | - | - |
|
||||
| II | **рдкреНрд░рддреАрдХрд╛рддреНрдордХ AI** |
|
||||
| 02 | [рдЬреНрдЮрд╛рди рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдФрд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдкреНрд░рдгрд╛рд▓реА](./lessons/2-Symbolic/README.md) | [рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдкреНрд░рдгрд╛рд▓реА](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/2-Symbolic/Animals.ipynb) / [рдСрдиреНрдЯреЛрд▓реЙрдЬреА](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/2-Symbolic/FamilyOntology.ipynb) /[рдХреЙрдиреНрд╕реЗрдкреНрдЯ рдЧреНрд░рд╛рдл](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/2-Symbolic/MSConceptGraph.ipynb) | |
|
||||
| III | [**рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХреНрд╕ рдХрд╛ рдкрд░рд┐рдЪрдп**](./lessons/3-NeuralNetworks/README.md) |||
|
||||
| 03 | [рдкрд░рд╕реЗрдкреНрдЯреНрд░реЙрди](./lessons/3-NeuralNetworks/03-Perceptron/README.md) | [рдиреЛрдЯрдмреБрдХ](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb) | [рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛](./lessons/3-NeuralNetworks/03-Perceptron/lab/README.md) |
|
||||
| 04 | [рдорд▓реНрдЯреА-рд▓реЗрдпрд░реНрдб рдкрд░рд╕реЗрдкреНрдЯреНрд░реЙрди рдФрд░ рдЕрдкрдирд╛ рдлреНрд░реЗрдорд╡рд░реНрдХ рдмрдирд╛рдирд╛](./lessons/3-NeuralNetworks/04-OwnFramework/README.md) | [рдиреЛрдЯрдмреБрдХ](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/3-NeuralNetworks/04-OwnFramework/OwnFramework.ipynb) | [рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛](./lessons/3-NeuralNetworks/04-OwnFramework/lab/README.md) |
|
||||
| 05 | [рдлреНрд░реЗрдорд╡рд░реНрдХреНрд╕ (PyTorch/TensorFlow) рдФрд░ рдУрд╡рд░рдлрд┐рдЯрд┐рдВрдЧ рдХрд╛ рдкрд░рд┐рдЪрдп](./lessons/3-NeuralNetworks/05-Frameworks/README.md) | [PyTorch](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/3-NeuralNetworks/05-Frameworks/IntroPyTorch.ipynb) / [Keras](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/3-NeuralNetworks/05-Frameworks/IntroKeras.ipynb) / [TensorFlow](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/3-NeuralNetworks/05-Frameworks/IntroKerasTF.ipynb) | [рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛](./lessons/3-NeuralNetworks/05-Frameworks/lab/README.md) |
|
||||
| IV | [**рдХрдВрдкреНрдпреВрдЯрд░ рд╡рд┐рдЬрд╝рди**](./lessons/4-ComputerVision/README.md) | [PyTorch](https://docs.microsoft.com/learn/modules/intro-computer-vision-pytorch/?WT.mc_id=academic-77998-cacaste) / [TensorFlow](https://docs.microsoft.com/learn/modules/intro-computer-vision-TensorFlow/?WT.mc_id=academic-77998-cacaste)| [Microsoft Azure рдкрд░ рдХрдВрдкреНрдпреВрдЯрд░ рд╡рд┐рдЬрд╝рди рдХрд╛ рдЕрдиреНрд╡реЗрд╖рдг рдХрд░реЗрдВ](https://learn.microsoft.com/en-us/collections/7w28iy2xrqzdj0?WT.mc_id=academic-77998-bethanycheum) |
|
||||
| 06 | [рдХрдВрдкреНрдпреВрдЯрд░ рд╡рд┐рдЬрд╝рди рдХрд╛ рдкрд░рд┐рдЪрдпред OpenCV](./lessons/4-ComputerVision/06-IntroCV/README.md) | [рдиреЛрдЯрдмреБрдХ](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb) | [рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛](./lessons/4-ComputerVision/06-IntroCV/lab/README.md) |
|
||||
| 07 | [рдХрдиреНрд╡реЛрд▓реНрдпреВрд╢рдирд▓ рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХреНрд╕](./lessons/4-ComputerVision/07-ConvNets/README.md) рдФрд░ [CNN рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░](./lessons/4-ComputerVision/07-ConvNets/CNN_Architectures.md) | [PyTorch](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/07-ConvNets/ConvNetsPyTorch.ipynb) /[TensorFlow](https://microsoft.github.io/AI-For-Beginners/lessons/4-ComputerVision/07-ConvNets/ConvNetsTF.ipynb) | [рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛](./lessons/4-ComputerVision/07-ConvNets/lab/README.md) |
|
||||
| 08 | [рдкреНрд░реА-рдЯреНрд░реЗрдВрдб рдиреЗрдЯрд╡рд░реНрдХреНрд╕ рдФрд░ рдЯреНрд░рд╛рдВрд╕рдлрд░ рд▓рд░реНрдирд┐рдВрдЧ](./lessons/4-ComputerVision/08-TransferLearning/README.md) рдФрд░ [рдЯреНрд░реЗрдирд┐рдВрдЧ рдЯреНрд░рд┐рдХреНрд╕](./lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md) | [PyTorch](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/08-TransferLearning/TransferLearningPyTorch.ipynb) / [TensorFlow](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/3-NeuralNetworks/05-Frameworks/IntroKerasTF.ipynb) | [рд▓реИрдм](./lessons/4-ComputerVision/08-TransferLearning/lab/README.md) |
|
||||
| 09 | [рдСрдЯреЛрдПрдиреНрдХреЛрдбрд░реНрд╕ рдФрд░ VAEs](./lessons/4-ComputerVision/09-Autoencoders/README.md) | [PyTorch](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/09-Autoencoders/AutoEncodersPyTorch.ipynb) / [TensorFlow](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/09-Autoencoders/AutoencodersTF.ipynb) | |
|
||||
| 10 | [рдЬреЗрдирд░реЗрдЯрд┐рд╡ рдПрдбрд╡рд░реНрд╕реЗрд░рд┐рдпрд▓ рдиреЗрдЯрд╡рд░реНрдХреНрд╕ рдФрд░ рдЖрд░реНрдЯрд┐рд╕реНрдЯрд┐рдХ рд╕реНрдЯрд╛рдЗрд▓ рдЯреНрд░рд╛рдВрд╕рдлрд░](./lessons/4-ComputerVision/10-GANs/README.md) | [PyTorch](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/10-GANs/GANPyTorch.ipynb) / [TensorFlow](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/10-GANs/GANTF.ipynb) | |
|
||||
| 11 | [рдСрдмреНрдЬреЗрдХреНрдЯ рдбрд┐рдЯреЗрдХреНрд╢рди](./lessons/4-ComputerVision/11-ObjectDetection/README.md) | [TensorFlow](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/11-ObjectDetection/ObjectDetection.ipynb) | [рд▓реИрдм](./lessons/4-ComputerVision/11-ObjectDetection/lab/README.md) |
|
||||
| 12 | [рд╕реЗрдорд╛рдВрдЯрд┐рдХ рд╕реЗрдЧрдореЗрдВрдЯреЗрд╢рди. U-Net](./lessons/4-ComputerVision/12-Segmentation/README.md) | [PyTorch](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/12-Segmentation/SemanticSegmentationPytorch.ipynb) / [TensorFlow](../../(https:/github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/12-Segmentation/SemanticSegmentationTF.ipynb)) | |
|
||||
| V | [**рдиреЗрдЪреБрд░рд▓ рд▓реИрдВрдЧреНрд╡реЗрдЬ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ**](./lessons/5-NLP/README.md) | [PyTorch](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-pytorch/?WT.mc_id=academic-77998-cacaste) /[TensorFlow](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-TensorFlow/?WT.mc_id=academic-77998-cacaste) | [Microsoft Azure рдкрд░ рдиреЗрдЪреБрд░рд▓ рд▓реИрдВрдЧреНрд╡реЗрдЬ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдПрдХреНрд╕рдкреНрд▓реЛрд░ рдХрд░реЗрдВ](https://learn.microsoft.com/en-us/collections/7w28iy2xrqzdj0?WT.mc_id=academic-77998-bethanycheum)|
|
||||
| 13 | [рдЯреЗрдХреНрд╕реНрдЯ рд░рд┐рдкреНрд░реЗрдЬреЗрдВрдЯреЗрд╢рди. Bow/TF-IDF](./lessons/5-NLP/13-TextRep/README.md) | [PyTorch](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/13-TextRep/TextRepresentationPyTorch.ipynb) / [TensorFlow](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/13-TextRep/TextRepresentationTF.ipynb) | |
|
||||
| 14 | [рд╕реЗрдорд╛рдВрдЯрд┐рдХ рд╡рд░реНрдб рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕. Word2Vec рдФрд░ GloVe](./lessons/5-NLP/14-Embeddings/README.md) | [PyTorch](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/14-Embeddings/EmbeddingsPyTorch.ipynb) / [TensorFlow](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/14-Embeddings/EmbeddingsTF.ipynb) | |
|
||||
| 15 | [рд▓реИрдВрдЧреНрд╡реЗрдЬ рдореЙрдбрд▓рд┐рдВрдЧ. рдЕрдкрдиреЗ рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рдХреЛ рдЯреНрд░реЗрди рдХрд░реЗрдВ](./lessons/5-NLP/15-LanguageModeling/README.md) | [PyTorch](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/15-LanguageModeling/CBoW-PyTorch.ipynb) / [TensorFlow](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/15-LanguageModeling/CBoW-TF.ipynb) | [рд▓реИрдм](./lessons/5-NLP/15-LanguageModeling/lab/README.md) |
|
||||
| 16 | [рд░рд┐рдХрд░реЗрдВрдЯ рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХреНрд╕](./lessons/5-NLP/16-RNN/README.md) | [PyTorch](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/16-RNN/RNNPyTorch.ipynb) / [TensorFlow](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/16-RNN/RNNTF.ipynb) | |
|
||||
| 17 | [рдЬреЗрдирд░реЗрдЯрд┐рд╡ рд░рд┐рдХрд░реЗрдВрдЯ рдиреЗрдЯрд╡рд░реНрдХреНрд╕](./lessons/5-NLP/17-GenerativeNetworks/README.md) | [PyTorch](https://microsoft.github.io/AI-For-Beginners/lessons/5-NLP/17-GenerativeNetworks/GenerativePyTorch.md) / [TensorFlow](https://microsoft.github.io/AI-For-Beginners/lessons/5-NLP/17-GenerativeNetworks/GenerativeTF.md) | [рд▓реИрдм](./lessons/5-NLP/17-GenerativeNetworks/lab/README.md) |
|
||||
| 18 | [рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░реНрд╕. BERT.](./lessons/5-NLP/18-Transformers/READMEtransformers.md) | [PyTorch](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/18-Transformers/TransformersPyTorch.ipynb) /[TensorFlow](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/18-Transformers/TransformersTF.ipynb) | |
|
||||
| 19 | [рдиреЗрдореНрдб рдПрдВрдЯрд┐рдЯреА рд░рд┐рдХрдЧреНрдирд┐рд╢рди](./lessons/5-NLP/19-NER/README.md) | [TensorFlow](https://microsoft.github.io/AI-For-Beginners/lessons/5-NLP/19-NER/NER-TF.ipynb) | [рд▓реИрдм](./lessons/5-NLP/19-NER/lab/README.md) |
|
||||
| 20 | [рд▓рд╛рд░реНрдЬ рд▓реИрдВрдЧреНрд╡реЗрдЬ рдореЙрдбрд▓реНрд╕, рдкреНрд░реЙрдореНрдкреНрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдФрд░ рдлреНрдпреВ-рд╢реЙрдЯ рдЯрд╛рд╕реНрдХреНрд╕](./lessons/5-NLP/20-LangModels/READMELargeLang.md) | [PyTorch](https://microsoft.github.io/AI-For-Beginners/lessons/5-NLP/20-LangModels/GPT-PyTorch.ipynb) | |
|
||||
| 02 | [рдЬреНрдЮрд╛рди рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдФрд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдкреНрд░рдгрд╛рд▓реА](./lessons/2-Symbolic/README.md) | [рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдкреНрд░рдгрд╛рд▓реА](./lessons/2-Symbolic/Animals.ipynb) / [рдСрдиреНрдЯреЛрд▓реЙрдЬреА](./lessons/2-Symbolic/FamilyOntology.ipynb) /[рдХреЙрдиреНрд╕реЗрдкреНрдЯ рдЧреНрд░рд╛рдл](./lessons/2-Symbolic/MSConceptGraph.ipynb) | |
|
||||
| III | [**рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рдкрд░рд┐рдЪрдп**](./lessons/3-NeuralNetworks/README.md) |||
|
||||
| 03 | [рдкрд░рд╕реЗрдкреНрдЯреНрд░реЙрди](./lessons/3-NeuralNetworks/03-Perceptron/README.md) | [рдиреЛрдЯрдмреБрдХ](./lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb) | [рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛](./lessons/3-NeuralNetworks/03-Perceptron/lab/README.md) |
|
||||
| 04 | [рдорд▓реНрдЯреА-рд▓реЗрдпрд░реНрдб рдкрд░рд╕реЗрдкреНрдЯреНрд░реЙрди рдФрд░ рдЕрдкрдирд╛ рдлреНрд░реЗрдорд╡рд░реНрдХ рдмрдирд╛рдирд╛](./lessons/3-NeuralNetworks/04-OwnFramework/README.md) | [рдиреЛрдЯрдмреБрдХ](./lessons/3-NeuralNetworks/04-OwnFramework/OwnFramework.ipynb) | [рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛](./lessons/3-NeuralNetworks/04-OwnFramework/lab/README.md) |
|
||||
| 05 | [рдлреНрд░реЗрдорд╡рд░реНрдХреНрд╕ (PyTorch/TensorFlow) рдФрд░ рдУрд╡рд░рдлрд┐рдЯрд┐рдВрдЧ рдХрд╛ рдкрд░рд┐рдЪрдп](./lessons/3-NeuralNetworks/05-Frameworks/README.md) | [PyTorch](./lessons/3-NeuralNetworks/05-Frameworks/IntroPyTorch.ipynb) / [Keras](./lessons/3-NeuralNetworks/05-Frameworks/IntroKeras.ipynb) / [TensorFlow](./lessons/3-NeuralNetworks/05-Frameworks/IntroKerasTF.ipynb) | [рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛](./lessons/3-NeuralNetworks/05-Frameworks/lab/README.md) |
|
||||
| IV | [**рдХрдВрдкреНрдпреВрдЯрд░ рд╡рд┐рдЬрд╝рди**](./lessons/4-ComputerVision/README.md) | [PyTorch](https://docs.microsoft.com/learn/modules/intro-computer-vision-pytorch/?WT.mc_id=academic-77998-cacaste) / [TensorFlow](https://docs.microsoft.com/learn/modules/intro-computer-vision-TensorFlow/?WT.mc_id=academic-77998-cacaste)| [Microsoft Azure рдкрд░ рдХрдВрдкреНрдпреВрдЯрд░ рд╡рд┐рдЬрд╝рди рдХрд╛ рдЕрдиреНрд╡реЗрд╖рдг рдХрд░реЗрдВ](https://learn.microsoft.com/en-us/collections/7w28iy2xrqzdj0?WT.mc_id=academic-77998-bethanycheum) |
|
||||
| 06 | [рдХрдВрдкреНрдпреВрдЯрд░ рд╡рд┐рдЬрд╝рди рдХрд╛ рдкрд░рд┐рдЪрдпред OpenCV](./lessons/4-ComputerVision/06-IntroCV/README.md) | [рдиреЛрдЯрдмреБрдХ](./lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb) | [рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛](./lessons/4-ComputerVision/06-IntroCV/lab/README.md) |
|
||||
| 07 | [рдХрдиреНрд╡реЛрд▓реНрдпреВрд╢рдирд▓ рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХреНрд╕](./lessons/4-ComputerVision/07-ConvNets/README.md) рдФрд░ [CNN рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░](./lessons/4-ComputerVision/07-ConvNets/CNN_Architectures.md) | [PyTorch](./lessons/4-ComputerVision/07-ConvNets/ConvNetsPyTorch.ipynb) /[TensorFlow](./lessons/4-ComputerVision/07-ConvNets/ConvNetsTF.ipynb) | [рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛](./lessons/4-ComputerVision/07-ConvNets/lab/README.md) |
|
||||
| 08 | [рдкреНрд░реА-рдЯреНрд░реЗрдВрдб рдиреЗрдЯрд╡рд░реНрдХреНрд╕ рдФрд░ рдЯреНрд░рд╛рдВрд╕рдлрд░ рд▓рд░реНрдирд┐рдВрдЧ](./lessons/4-ComputerVision/08-TransferLearning/README.md) рдФрд░ [рдЯреНрд░реЗрдирд┐рдВрдЧ рдЯреНрд░рд┐рдХреНрд╕](./lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md) | [PyTorch](./lessons/4-ComputerVision/08-TransferLearning/TransferLearningPyTorch.ipynb) / [TensorFlow](./lessons/3-NeuralNetworks/05-Frameworks/IntroKerasTF.ipynb) | [рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛](./lessons/4-ComputerVision/08-TransferLearning/lab/README.md) |
|
||||
| 09 | [рдСрдЯреЛрдПрдиреНрдХреЛрдбрд░реНрд╕ рдФрд░ VAEs](./lessons/4-ComputerVision/09-Autoencoders/README.md) | [PyTorch](./lessons/4-ComputerVision/09-Autoencoders/AutoEncodersPyTorch.ipynb) / [TensorFlow](./lessons/4-ComputerVision/09-Autoencoders/AutoencodersTF.ipynb) | |
|
||||
| 10 | [рдЬреЗрдирд░реЗрдЯрд┐рд╡ рдПрдбрд╡рд░реНрд╕реЗрд░рд┐рдпрд▓ рдиреЗрдЯрд╡рд░реНрдХреНрд╕ рдФрд░ рдЖрд░реНрдЯрд┐рд╕реНрдЯрд┐рдХ рд╕реНрдЯрд╛рдЗрд▓ рдЯреНрд░рд╛рдВрд╕рдлрд░](./lessons/4-ComputerVision/10-GANs/README.md) | [PyTorch](./lessons/4-ComputerVision/10-GANs/GANPyTorch.ipynb) / [TensorFlow](./lessons/4-ComputerVision/10-GANs/GANTF.ipynb) | |
|
||||
| 11 | [рдСрдмреНрдЬреЗрдХреНрдЯ рдбрд┐рдЯреЗрдХреНрд╢рди](./lessons/4-ComputerVision/11-ObjectDetection/README.md) | [TensorFlow](./lessons/4-ComputerVision/11-ObjectDetection/ObjectDetection.ipynb) | [рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛](./lessons/4-ComputerVision/11-ObjectDetection/lab/README.md) |
|
||||
| 12 | [рд╕реЗрдорд╛рдВрдЯрд┐рдХ рд╕реЗрдЧрдореЗрдВрдЯреЗрд╢рдиред U-Net](./lessons/4-ComputerVision/12-Segmentation/README.md) | [PyTorch](./lessons/4-ComputerVision/12-Segmentation/SemanticSegmentationPytorch.ipynb) / [TensorFlow](./lessons/4-ComputerVision/12-Segmentation/SemanticSegmentationTF.ipynb) | |
|
||||
| V | [**рдиреЗрдЪреБрд░рд▓ рд▓реИрдВрдЧреНрд╡реЗрдЬ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ**](./lessons/5-NLP/README.md) | [PyTorch](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-pytorch/?WT.mc_id=academic-77998-cacaste) /[TensorFlow](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-TensorFlow/?WT.mc_id=academic-77998-cacaste) | [Microsoft Azure рдкрд░ рдиреЗрдЪреБрд░рд▓ рд▓реИрдВрдЧреНрд╡реЗрдЬ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХрд╛ рдЕрдиреНрд╡реЗрд╖рдг рдХрд░реЗрдВ](https://learn.microsoft.com/en-us/collections/7w28iy2xrqzdj0?WT.mc_id=academic-77998-bethanycheum)|
|
||||
| 13 | [рдЯреЗрдХреНрд╕реНрдЯ рд░рд┐рдкреНрд░реЗрдЬреЗрдВрдЯреЗрд╢рдиред Bow/TF-IDF](./lessons/5-NLP/13-TextRep/README.md) | [PyTorch](./lessons/5-NLP/13-TextRep/TextRepresentationPyTorch.ipynb) / [TensorFlow](./lessons/5-NLP/13-TextRep/TextRepresentationTF.ipynb) | |
|
||||
| 14 | [рд╕реЗрдорд╛рдВрдЯрд┐рдХ рд╡рд░реНрдб рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ред Word2Vec рдФрд░ GloVe](./lessons/5-NLP/14-Embeddings/README.md) | [PyTorch](./lessons/5-NLP/14-Embeddings/EmbeddingsPyTorch.ipynb) / [TensorFlow](./lessons/5-NLP/14-Embeddings/EmbeddingsTF.ipynb) | |
|
||||
| 15 | [рд▓реИрдВрдЧреНрд╡реЗрдЬ рдореЙрдбрд▓рд┐рдВрдЧред рдЕрдкрдиреЗ рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рдХреЛ рдЯреНрд░реЗрди рдХрд░реЗрдВ](./lessons/5-NLP/15-LanguageModeling/README.md) | [PyTorch](./lessons/5-NLP/15-LanguageModeling/CBoW-PyTorch.ipynb) / [TensorFlow](./lessons/5-NLP/15-LanguageModeling/CBoW-TF.ipynb) | [рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛](./lessons/5-NLP/15-LanguageModeling/lab/README.md) |
|
||||
| 16 | [рд░рд┐рдХрд░реЗрдВрдЯ рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХреНрд╕](./lessons/5-NLP/16-RNN/README.md) | [PyTorch](./lessons/5-NLP/16-RNN/RNNPyTorch.ipynb) / [TensorFlow](./lessons/5-NLP/16-RNN/RNNTF.ipynb) | |
|
||||
| 17 | [рдЬреЗрдирд░реЗрдЯрд┐рд╡ рд░рд┐рдХрд╛рд░реЗрдВрдЯ рдиреЗрдЯрд╡рд░реНрдХреНрд╕](./lessons/5-NLP/17-GenerativeNetworks/README.md) | [PyTorch](./lessons/5-NLP/17-GenerativeNetworks/GenerativePyTorch.md) / [TensorFlow](./lessons/5-NLP/17-GenerativeNetworks/GenerativeTF.md) | [рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛](./lessons/5-NLP/17-GenerativeNetworks/lab/README.md) |
|
||||
| 18 | [рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░реНрд╕ред BERT.](./lessons/5-NLP/18-Transformers/READMEtransformers.md) | [PyTorch](./lessons/5-NLP/18-Transformers/TransformersPyTorch.ipynb) /[TensorFlow](./lessons/5-NLP/18-Transformers/TransformersTF.ipynb) | |
|
||||
| 19 | [рдиреЗрдореНрдб рдПрдВрдЯрд┐рдЯреА рд░рд┐рдХрдЧреНрдирд┐рд╢рди](./lessons/5-NLP/19-NER/README.md) | [TensorFlow](./lessons/5-NLP/19-NER/NER-TF.ipynb) | [рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛](./lessons/5-NLP/19-NER/lab/README.md) |
|
||||
| 20 | [рд▓рд╛рд░реНрдЬ рд▓реИрдВрдЧреНрд╡реЗрдЬ рдореЙрдбрд▓реНрд╕, рдкреНрд░реЙрдореНрдкреНрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдФрд░ рдлреНрдпреВ-рд╢реЙрдЯ рдЯрд╛рд╕реНрдХреНрд╕](./lessons/5-NLP/20-LangModels/READMELargeLang.md) | [PyTorch](./lessons/5-NLP/20-LangModels/GPT-PyTorch.ipynb) | |
|
||||
| VI | **рдЕрдиреНрдп AI рддрдХрдиреАрдХреЗрдВ** || |
|
||||
| 21 | [рдЬреЗрдиреЗрдЯрд┐рдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдореНрд╕](./lessons/6-Other/21-GeneticAlgorithms/README.md) | [Notebook](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/6-Other/21-GeneticAlgorithms/Genetic.ipynb) | |
|
||||
| 22 | [рдбреАрдк рд░рд┐рдЗрдВрдлреЛрд░реНрд╕рдореЗрдВрдЯ рд▓рд░реНрдирд┐рдВрдЧ](./lessons/6-Other/22-DeepRL/README.md) | [PyTorch](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/6-Other/22-DeepRL/CartPole-RL-PyTorch.ipynb) /[TensorFlow](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/6-Other/22-DeepRL/CartPole-RL-TF.ipynb) | [рд▓реИрдм](./lessons/6-Other/22-DeepRL/lab/README.md) |
|
||||
| 21 | [рдЬреЗрдиреЗрдЯрд┐рдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо](./lessons/6-Other/21-GeneticAlgorithms/README.md) | [рдиреЛрдЯрдмреБрдХ](./lessons/6-Other/21-GeneticAlgorithms/Genetic.ipynb) | |
|
||||
| 22 | [рдбреАрдк рд░рд┐рдЗрдВрдлреЛрд░реНрд╕рдореЗрдВрдЯ рд▓рд░реНрдирд┐рдВрдЧ](./lessons/6-Other/22-DeepRL/README.md) | [PyTorch](./lessons/6-Other/22-DeepRL/CartPole-RL-PyTorch.ipynb) /[TensorFlow](./lessons/6-Other/22-DeepRL/CartPole-RL-TF.ipynb) | [рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛](./lessons/6-Other/22-DeepRL/lab/README.md) |
|
||||
| 23 | [рдорд▓реНрдЯреА-рдПрдЬреЗрдВрдЯ рд╕рд┐рд╕реНрдЯрдореНрд╕](./lessons/6-Other/23-MultiagentSystems/README.md) | | |
|
||||
| VII | **AI рдПрдерд┐рдХреНрд╕** | | |
|
||||
| 24 | [AI рдПрдерд┐рдХреНрд╕ рдФрд░ рдЬрд┐рдореНрдореЗрджрд╛рд░ AI](./lessons/7-Ethics/README.md) | [Microsoft Learn: рдЬрд┐рдореНрдореЗрджрд╛рд░ AI рд╕рд┐рджреНрдзрд╛рдВрдд](https://docs.microsoft.com/learn/paths/responsible-ai-business-principles/?WT.mc_id=academic-77998-cacaste) | |
|
||||
| IX | **рдПрдХреНрд╕реНрдЯреНрд░рд╛** | | |
|
||||
| 25 | [рдорд▓реНрдЯреА-рдореЛрдбрд▓ рдиреЗрдЯрд╡рд░реНрдХреНрд╕, CLIP рдФрд░ VQGAN](./lessons/X-Extras/X1-MultiModal/README.md) | [Notebook](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/X-Extras/X1-MultiModal/Clip.ipynb) | |
|
||||
| VII | **AI рдиреИрддрд┐рдХрддрд╛** | | |
|
||||
| 24 | [AI рдиреИрддрд┐рдХрддрд╛ рдФрд░ рдЬрд┐рдореНрдореЗрджрд╛рд░ AI](./lessons/7-Ethics/README.md) | [Microsoft Learn: рдЬрд┐рдореНрдореЗрджрд╛рд░ AI рд╕рд┐рджреНрдзрд╛рдВрдд](https://docs.microsoft.com/learn/paths/responsible-ai-business-principles/?WT.mc_id=academic-77998-cacaste) | |
|
||||
| IX | **рдЕрддрд┐рд░рд┐рдХреНрдд** | | |
|
||||
| 25 | [рдорд▓реНрдЯреА-рдореЛрдбрд▓ рдиреЗрдЯрд╡рд░реНрдХреНрд╕, CLIP рдФрд░ VQGAN](./lessons/X-Extras/X1-MultiModal/README.md) | [рдиреЛрдЯрдмреБрдХ](./lessons/X-Extras/X1-MultiModal/Clip.ipynb) | |
|
||||
|
||||
## рдкреНрд░рддреНрдпреЗрдХ рдкрд╛рда рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ
|
||||
|
||||
* рдкреНрд░реА-рд░реАрдбрд┐рдВрдЧ рд╕рд╛рдордЧреНрд░реА
|
||||
* рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп Jupyter рдиреЛрдЯрдмреБрдХреНрд╕, рдЬреЛ рдЕрдХреНрд╕рд░ рдлреНрд░реЗрдорд╡рд░реНрдХ (**PyTorch** рдпрд╛ **TensorFlow**) рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛрддреА рд╣реИрдВред рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдиреЛрдЯрдмреБрдХ рдореЗрдВ рдмрд╣реБрдд рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд╕рд╛рдордЧреНрд░реА рднреА рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рд╖рдп рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдиреЛрдЯрдмреБрдХ рдХрд╛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╕рдВрд╕реНрдХрд░рдг (PyTorch рдпрд╛ TensorFlow) рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ред
|
||||
* **рд▓реИрдмреНрд╕** рдХреБрдЫ рд╡рд┐рд╖рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рд╕реАрдЦреА рдЧрдИ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╕реНрдпрд╛ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рджреЗрддреЗ рд╣реИрдВред
|
||||
* рдХреБрдЫ рд╕реЗрдХреНрд╢рди рдореЗрдВ [**MS Learn**](https://learn.microsoft.com/en-us/collections/7w28iy2xrqzdj0?WT.mc_id=academic-77998-bethanycheum) рдореЙрдбреНрдпреВрд▓реНрд╕ рдХреЗ рд▓рд┐рдВрдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬреЛ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рд╖рдпреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рддреЗ рд╣реИрдВред
|
||||
* рдкреВрд░реНрд╡-рдкрдврд╝рд╛рдИ рд╕рд╛рдордЧреНрд░реА
|
||||
* рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп Jupyter рдиреЛрдЯрдмреБрдХреНрд╕, рдЬреЛ рдЕрдХреНрд╕рд░ рдлреНрд░реЗрдорд╡рд░реНрдХ (**PyTorch** рдпрд╛ **TensorFlow**) рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛрддреА рд╣реИрдВред рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдиреЛрдЯрдмреБрдХ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░рд╛ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд╕рд╛рдордЧреНрд░реА рднреА рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рд╖рдп рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╕рдВрд╕реНрдХрд░рдг (PyTorch рдпрд╛ TensorFlow) рдХреЛ рдкрдврд╝рдирд╛ рд╣реЛрдЧрд╛ред
|
||||
* **рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛рдПрдВ**, рдЬреЛ рдХреБрдЫ рд╡рд┐рд╖рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИрдВ, рдЖрдкрдХреЛ рд╕реАрдЦреА рдЧрдИ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╕реНрдпрд╛ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рджреЗрддреА рд╣реИрдВред
|
||||
* рдХреБрдЫ рдЕрдиреБрднрд╛рдЧреЛрдВ рдореЗрдВ [**MS Learn**](https://learn.microsoft.com/en-us/collections/7w28iy2xrqzdj0?WT.mc_id=academic-77998-bethanycheum) рдореЙрдбреНрдпреВрд▓реНрд╕ рдХреЗ рд▓рд┐рдВрдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬреЛ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рд╖рдпреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рддреЗ рд╣реИрдВред
|
||||
|
||||
## рд╢реБрд░реБрдЖрдд рдХреИрд╕реЗ рдХрд░реЗрдВ
|
||||
## рд╢реБрд░реБрдЖрдд рдХрд░реЗрдВ
|
||||
|
||||
- рд╣рдордиреЗ рдЖрдкрдХреЗ рд╡рд┐рдХрд╛рд╕ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЛ рд╕реЗрдЯрдЕрдк рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ [рд╕реЗрдЯрдЕрдк рдкрд╛рда](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/0-course-setup/setup.md) рдмрдирд╛рдпрд╛ рд╣реИред
|
||||
- рд╢рд┐рдХреНрд╖рдХреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ [рдкрд╛рдареНрдпрдХреНрд░рдо рд╕реЗрдЯрдЕрдк рдкрд╛рда](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/0-course-setup/for-teachers.md) рднреА рдмрдирд╛рдпрд╛ рд╣реИ!
|
||||
- [VSCode рдпрд╛ Codepace рдореЗрдВ рдХреЛрдб рдХреИрд╕реЗ рдЪрд▓рд╛рдПрдВ](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/0-course-setup/how-to-run.md)
|
||||
- рд╣рдордиреЗ рдЖрдкрдХреЗ рд╡рд┐рдХрд╛рд╕ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЛ рд╕реЗрдЯрдЕрдк рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХреЗ рд▓рд┐рдП рдПрдХ [рд╕реЗрдЯрдЕрдк рдкрд╛рда](./lessons/0-course-setup/setup.md) рдмрдирд╛рдпрд╛ рд╣реИред
|
||||
- рд╢рд┐рдХреНрд╖рдХреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ [рдкрд╛рдареНрдпрдХреНрд░рдо рд╕реЗрдЯрдЕрдк рдкрд╛рда](./lessons/0-course-setup/for-teachers.md) рднреА рдмрдирд╛рдпрд╛ рд╣реИ!
|
||||
- [VSCode рдпрд╛ Codepace рдореЗрдВ рдХреЛрдб рдХреИрд╕реЗ рдЪрд▓рд╛рдПрдВ](./lessons/0-course-setup/how-to-run.md)
|
||||
|
||||
рдЗрди рдЪрд░рдгреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ:
|
||||
рдЗрди рдЪрд░рдгреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ:
|
||||
|
||||
рд░реЗрдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдлреЛрд░реНрдХ рдХрд░реЗрдВ: рдЗрд╕ рдкреЗрдЬ рдХреЗ рдКрдкрд░-рджрд╛рдИрдВ рдУрд░ "Fork" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред
|
||||
рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдлреЛрд░реНрдХ рдХрд░реЗрдВ: рдЗрд╕ рдкреЗрдЬ рдХреЗ рдКрдкрд░-рджрд╛рдИрдВ рдУрд░ "Fork" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред
|
||||
|
||||
рд░реЗрдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдХреНрд▓реЛрди рдХрд░реЗрдВ: `git clone https://github.com/microsoft/AI-For-Beginners.git`
|
||||
рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдХреНрд▓реЛрди рдХрд░реЗрдВ: `git clone https://github.com/microsoft/AI-For-Beginners.git`
|
||||
|
||||
рдЗрд╕ рд░реЗрдкреЛ рдХреЛ рд╕реНрдЯрд╛рд░ (ЁЯМЯ) рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ рддрд╛рдХрд┐ рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдвреВрдВрдв рд╕рдХреЗрдВред
|
||||
рдЗрд╕ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдмрд╛рдж рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕реНрдЯрд╛рд░ (ЁЯМЯ) рдХрд░рдирд╛ рди рднреВрд▓реЗрдВред
|
||||
|
||||
## рдЕрдиреНрдп рд╢рд┐рдХреНрд╖рд╛рд░реНрдерд┐рдпреЛрдВ рд╕реЗ рдорд┐рд▓реЗрдВ
|
||||
|
||||
рд╣рдорд╛рд░реЗ [рдЖрдзрд┐рдХрд╛рд░рд┐рдХ AI Discord рд╕рд░реНрд╡рд░](https://aka.ms/genai-discord?WT.mc_id=academic-105485-bethanycheum) рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ рддрд╛рдХрд┐ рдЖрдк рдЗрд╕ рдХреЛрд░реНрд╕ рдХреЛ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреНрдп рд╢рд┐рдХреНрд╖рд╛рд░реНрдерд┐рдпреЛрдВ рд╕реЗ рдорд┐рд▓ рд╕рдХреЗрдВ, рдиреЗрдЯрд╡рд░реНрдХ рдмрдирд╛ рд╕рдХреЗрдВ рдФрд░ рд╕рд╣рд╛рдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗрдВред
|
||||
рд╣рдорд╛рд░реЗ [рдЖрдзрд┐рдХрд╛рд░рд┐рдХ AI Discord рд╕рд░реНрд╡рд░](https://aka.ms/genai-discord?WT.mc_id=academic-105485-bethanycheum) рд╕реЗ рдЬреБрдбрд╝реЗрдВ, рдЗрд╕ рдХреЛрд░реНрд╕ рдХреЛ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреНрдп рд╢рд┐рдХреНрд╖рд╛рд░реНрдерд┐рдпреЛрдВ рд╕реЗ рдорд┐рд▓рдиреЗ рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рд╕рд╣рд╛рдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
|
||||
|
||||
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЙрддреНрдкрд╛рдж рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдпрд╛ рдкреНрд░рд╢реНрди рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реЗ [Azure AI Foundry Developer Forum](https://aka.ms/foundry/forum) рдкрд░ рдЬрд╛рдПрдВред
|
||||
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЙрддреНрдкрд╛рдж рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдпрд╛ рдкреНрд░рд╢реНрди рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реЗ [Azure AI Foundry рдбреЗрд╡рд▓рдкрд░ рдлреЛрд░рдо](https://aka.ms/foundry/forum) рдкрд░ рдЬрд╛рдПрдВред
|
||||
|
||||
## рдХреНрд╡рд┐рдЬрд╝
|
||||
> **рдХреНрд╡рд┐рдЬрд╝ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдиреЛрдЯ**: рд╕рднреА рдХреНрд╡рд┐рдЬрд╝ Quiz-app рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ etc\quiz-app рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВред рдЗрдиреНрд╣реЗрдВ рдкрд╛рдареЛрдВ рдХреЗ рднреАрддрд░ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред рдХреНрд╡рд┐рдЬрд╝ рдРрдк рдХреЛ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ Azure рдкрд░ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ; `quiz-app` рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рджрд┐рдП рдЧрдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВред рдЗрдиреНрд╣реЗрдВ рдзреАрд░реЗ-рдзреАрд░реЗ рд╕реНрдерд╛рдиреАрдпрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред
|
||||
## рдХреНрд╡рд┐рдЬрд╝
|
||||
> **рдХреНрд╡рд┐рдЬрд╝ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдиреЛрдЯ**: рд╕рднреА рдХреНрд╡рд┐рдЬрд╝ Quiz-app рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ etc\quiz-app рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВ, рдпрд╛ [рдСрдирд▓рд╛рдЗрди рдпрд╣рд╛рдВ](https://ff-quizzes.netlify.app/) рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рдЗрдиреНрд╣реЗрдВ рдкрд╛рдареЛрдВ рдХреЗ рднреАрддрд░ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред рдХреНрд╡рд┐рдЬрд╝ рдРрдк рдХреЛ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ Azure рдкрд░ рдбрд┐рдкреНрд▓реЙрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ; `quiz-app` рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рджрд┐рдП рдЧрдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВред рдЗрдиреНрд╣реЗрдВ рдзреАрд░реЗ-рдзреАрд░реЗ рд╕реНрдерд╛рдиреАрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред
|
||||
## рдорджрдж рдЪрд╛рд╣рд┐рдП
|
||||
|
||||
рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕реБрдЭрд╛рд╡ рд╣реИрдВ рдпрд╛ рдЖрдкрдиреЗ рд╡рд░реНрддрдиреА рдпрд╛ рдХреЛрдб рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдкрд╛рдИ рд╣реИрдВ? рдПрдХ рд╕рдорд╕реНрдпрд╛ рдЙрдард╛рдПрдВ рдпрд╛ рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдмрдирд╛рдПрдВред
|
||||
рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕реБрдЭрд╛рд╡ рд╣реИрдВ рдпрд╛ рдЖрдкрдиреЗ рд╡рд░реНрддрдиреА рдпрд╛ рдХреЛрдб рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдкрд╛рдИ рд╣реИрдВ? рдПрдХ рдореБрджреНрджрд╛ рдЙрдард╛рдПрдВ рдпрд╛ рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдмрдирд╛рдПрдВред
|
||||
|
||||
## рд╡рд┐рд╢реЗрд╖ рдзрдиреНрдпрд╡рд╛рдж
|
||||
|
||||
|
|
@ -137,11 +148,11 @@ CO_OP_TRANSLATOR_METADATA:
|
|||
|
||||
рд╣рдорд╛рд░реА рдЯреАрдо рдЕрдиреНрдп рдкрд╛рдареНрдпрдХреНрд░рдо рднреА рдмрдирд╛рддреА рд╣реИ! рдЗрдиреНрд╣реЗрдВ рджреЗрдЦреЗрдВ:
|
||||
|
||||
- [рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП рдЬрдирд░реЗрдЯрд┐рд╡ AI](https://aka.ms/genai-beginners)
|
||||
- [рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП рдЬрдирд░реЗрдЯрд┐рд╡ AI .NET](https://github.com/microsoft/Generative-AI-for-beginners-dotnet)
|
||||
- [рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдЬрдирд░реЗрдЯрд┐рд╡ AI](https://github.com/microsoft/generative-ai-with-javascript)
|
||||
- [рдЬрд╛рд╡рд╛ рдХреЗ рд╕рд╛рде рдЬрдирд░реЗрдЯрд┐рд╡ AI](https://github.com/microsoft/Generative-AI-for-beginners-java)
|
||||
- [рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП AI](https://aka.ms/ai-beginners)
|
||||
- [рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП рдЬрдирд░реЗрдЯрд┐рд╡ рдПрдЖрдИ](https://aka.ms/genai-beginners)
|
||||
- [рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП рдЬрдирд░реЗрдЯрд┐рд╡ рдПрдЖрдИ .NET](https://github.com/microsoft/Generative-AI-for-beginners-dotnet)
|
||||
- [рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдЬрдирд░реЗрдЯрд┐рд╡ рдПрдЖрдИ](https://github.com/microsoft/generative-ai-with-javascript)
|
||||
- [рдЬрд╛рд╡рд╛ рдХреЗ рд╕рд╛рде рдЬрдирд░реЗрдЯрд┐рд╡ рдПрдЖрдИ](https://github.com/microsoft/Generative-AI-for-beginners-java)
|
||||
- [рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП рдПрдЖрдИ](https://aka.ms/ai-beginners)
|
||||
- [рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╕рд╛рдЗрдВрд╕](https://aka.ms/datascience-beginners)
|
||||
- [рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ](https://aka.ms/ml-beginners)
|
||||
- [рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП рд╕рд╛рдЗрдмрд░ рд╕реБрд░рдХреНрд╖рд╛](https://github.com/microsoft/Security-101)
|
||||
|
|
@ -152,5 +163,7 @@ CO_OP_TRANSLATOR_METADATA:
|
|||
- [C#/.NET рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП GitHub Copilot рдореЗрдВ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛](https://github.com/microsoft/mastering-github-copilot-for-dotnet-csharp-developers)
|
||||
- [рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ Copilot рдПрдбрд╡реЗрдВрдЪрд░ рдЪреБрдиреЗрдВ](https://github.com/microsoft/CopilotAdventures)
|
||||
|
||||
---
|
||||
|
||||
**рдЕрд╕реНрд╡реАрдХрд░рдг**:
|
||||
рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ AI рдЕрдиреБрд╡рд╛рдж рд╕реЗрд╡рд╛ [Co-op Translator](https://github.com/Azure/co-op-translator) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрдмрдХрд┐ рд╣рдо рд╕рдЯреАрдХрддрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕рд░рдд рд╣реИрдВ, рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрдиреБрд╡рд╛рдж рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдпрд╛ рдЕрд╢реБрджреНрдзрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдореВрд▓ рднрд╛рд╖рд╛ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдореВрд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕реНрд░реЛрдд рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдкреЗрд╢реЗрд╡рд░ рдорд╛рдирд╡ рдЕрдиреБрд╡рд╛рдж рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред рдЗрд╕ рдЕрдиреБрд╡рд╛рдж рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд┐рд╕реА рднреА рдЧрд▓рддрдлрд╣рдореА рдпрд╛ рдЧрд▓рдд рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╣рдо рдЙрддреНрддрд░рджрд╛рдпреА рдирд╣реАрдВ рд╣реИрдВред
|
||||
рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ AI рдЕрдиреБрд╡рд╛рдж рд╕реЗрд╡рд╛ [Co-op Translator](https://github.com/Azure/co-op-translator) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрдмрдХрд┐ рд╣рдо рд╕рдЯреАрдХрддрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕рд░рдд рд╣реИрдВ, рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрдиреБрд╡рд╛рдж рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдпрд╛ рдЕрд╢реБрджреНрдзрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдореВрд▓ рднрд╛рд╖рд╛ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдореВрд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рд╕реНрд░реЛрдд рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдкреЗрд╢реЗрд╡рд░ рдорд╛рдирд╡ рдЕрдиреБрд╡рд╛рдж рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред рдЗрд╕ рдЕрдиреБрд╡рд╛рдж рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд┐рд╕реА рднреА рдЧрд▓рддрдлрд╣рдореА рдпрд╛ рдЧрд▓рдд рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╣рдо рдЙрддреНрддрд░рджрд╛рдпреА рдирд╣реАрдВ рд╣реИрдВред
|
||||
|
|
@ -0,0 +1,478 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"collapsed": true
|
||||
},
|
||||
"source": [
|
||||
"# рдкрд╢реБ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛\n",
|
||||
"\n",
|
||||
"[AI for Beginners Curriculum](http://github.com/microsoft/ai-for-beginners) рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдгред\n",
|
||||
"\n",
|
||||
"рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдПрдХ рд╕рд░рд▓ рдЬреНрдЮрд╛рди-рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рдгрд╛рд▓реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдХреБрдЫ рд╢рд╛рд░реАрд░рд┐рдХ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐рд╕реА рдкрд╢реБ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рддреА рд╣реИред рдЗрд╕ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд AND-OR рдкреЗрдбрд╝ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдпрд╣ рдкреВрд░реЗ рдкреЗрдбрд╝ рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдЗрд╕рдореЗрдВ рдФрд░ рдирд┐рдпрдо рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ):\n",
|
||||
"\n",
|
||||
"\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рд╣рдорд╛рд░рд╛ рдЦреБрдж рдХрд╛ рдПрдХреНрд╕рдкрд░реНрдЯ рд╕рд┐рд╕реНрдЯрдо рд╢реЗрд▓ рдмреИрдХрд╡рд░реНрдб рдЗрдВрдлрд░реЗрдВрд╕ рдХреЗ рд╕рд╛рде\n",
|
||||
"\n",
|
||||
"рдЖрдЗрдП рдкреНрд░реЛрдбрдХреНрд╢рди рд░реВрд▓реНрд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдиреЙрд▓реЗрдЬ рд░рд┐рдкреНрд░реЗрдЬреЗрдВрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рднрд╛рд╖рд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред рд╣рдо рдирд┐рдпрдореЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Python рдХреНрд▓рд╛рд╕реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдореБрдЦреНрдп рд░реВрдк рд╕реЗ 3 рдкреНрд░рдХрд╛рд░ рдХреА рдХреНрд▓рд╛рд╕реЗрд╕ рд╣реЛрдВрдЧреА:\n",
|
||||
"* `Ask` рдПрдХ рдкреНрд░рд╢реНрди рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдкреВрдЫрд╛ рдЬрд╛рдирд╛ рд╣реИред рдЗрд╕рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рдЙрддреНрддрд░реЛрдВ рдХрд╛ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИред\n",
|
||||
"* `If` рдПрдХ рдирд┐рдпрдо рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдХреЗрд╡рд▓ рдирд┐рдпрдо рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд╢реЙрд░реНрдЯрдХрдЯ рд╣реИред\n",
|
||||
"* `AND`/`OR` рдХреНрд▓рд╛рд╕реЗрд╕ рд╣реИрдВ рдЬреЛ рдЯреНрд░реА рдХреА AND/OR рд╢рд╛рдЦрд╛рдУрдВ рдХреЛ рджрд░реНрд╢рд╛рддреА рд╣реИрдВред рдпреЗ рдХреЗрд╡рд▓ рдЕрдВрджрд░ рджрд┐рдП рдЧрдП рддрд░реНрдХреЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИрдВред рдХреЛрдб рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреИрд░реЗрдВрдЯ рдХреНрд▓рд╛рд╕ `Content` рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреА рдЧрдИ рд╣реИред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class Ask():\n",
|
||||
" def __init__(self,choices=['y','n']):\n",
|
||||
" self.choices = choices\n",
|
||||
" def ask(self):\n",
|
||||
" if max([len(x) for x in self.choices])>1:\n",
|
||||
" for i,x in enumerate(self.choices):\n",
|
||||
" print(\"{0}. {1}\".format(i,x),flush=True)\n",
|
||||
" x = int(input())\n",
|
||||
" return self.choices[x]\n",
|
||||
" else:\n",
|
||||
" print(\"/\".join(self.choices),flush=True)\n",
|
||||
" return input()\n",
|
||||
"\n",
|
||||
"class Content():\n",
|
||||
" def __init__(self,x):\n",
|
||||
" self.x=x\n",
|
||||
" \n",
|
||||
"class If(Content):\n",
|
||||
" pass\n",
|
||||
"\n",
|
||||
"class AND(Content):\n",
|
||||
" pass\n",
|
||||
"\n",
|
||||
"class OR(Content):\n",
|
||||
" pass"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рд╣рдорд╛рд░реЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ, рдХрд╛рд░реНрдпрд╢реАрд▓ рд╕реНрдореГрддрд┐ рдореЗрдВ **рддрдереНрдпреЛрдВ** рдХреА рд╕реВрдЪреА **рдЧреБрдг-рд╡реИрд▓реНрдпреВ рдЬреЛрдбрд╝реЛрдВ** рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрдЧреАред рдЬреНрдЮрд╛рди рдЖрдзрд╛рд░ рдХреЛ рдПрдХ рдмрдбрд╝реЗ рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХреНрд░рд┐рдпрд╛рдУрдВ (рдирдП рддрдереНрдп рдЬреЛ рдХрд╛рд░реНрдпрд╢реАрд▓ рд╕реНрдореГрддрд┐ рдореЗрдВ рдбрд╛рд▓реЗ рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдП) рдХреЛ рд╢рд░реНрддреЛрдВ рд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдЬреЛ AND-OR рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд╕рд╛рде рд╣реА, рдХреБрдЫ рддрдереНрдпреЛрдВ рдХреЛ `рдкреВрдЫрд╛` рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"rules = {\n",
|
||||
" 'default': Ask(['y','n']),\n",
|
||||
" 'color' : Ask(['red-brown','black and white','other']),\n",
|
||||
" 'pattern' : Ask(['dark stripes','dark spots']),\n",
|
||||
" 'mammal': If(OR(['hair','gives milk'])),\n",
|
||||
" 'carnivor': If(OR([AND(['sharp teeth','claws','forward-looking eyes']),'eats meat'])),\n",
|
||||
" 'ungulate': If(['mammal',OR(['has hooves','chews cud'])]),\n",
|
||||
" 'bird': If(OR(['feathers',AND(['flies','lies eggs'])])),\n",
|
||||
" 'animal:monkey' : If(['mammal','carnivor','color:red-brown','pattern:dark spots']),\n",
|
||||
" 'animal:tiger' : If(['mammal','carnivor','color:red-brown','pattern:dark stripes']),\n",
|
||||
" 'animal:giraffe' : If(['ungulate','long neck','long legs','pattern:dark spots']),\n",
|
||||
" 'animal:zebra' : If(['ungulate','pattern:dark stripes']),\n",
|
||||
" 'animal:ostrich' : If(['bird','long nech','color:black and white','cannot fly']),\n",
|
||||
" 'animal:pinguin' : If(['bird','swims','color:black and white','cannot fly']),\n",
|
||||
" 'animal:albatross' : If(['bird','flies well'])\n",
|
||||
"}"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдкрд┐рдЫрдбрд╝реЗ рдирд┐рд╖реНрдХрд░реНрд╖рдг (backward inference) рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо `Knowledgebase` рдХреНрд▓рд╛рд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ:\n",
|
||||
"* рдХрд╛рд░реНрдпрд╢реАрд▓ `memory` - рдПрдХ рдбрд┐рдХреНрд╢рдирд░реА рдЬреЛ рдЧреБрдгреЛрдВ (attributes) рдХреЛ рдЙрдирдХреЗ рдорд╛рдиреЛрдВ (values) рд╕реЗ рдЬреЛрдбрд╝рддреА рд╣реИред\n",
|
||||
"* Knowledgebase рдХреЗ `rules` - рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"рджреЛ рдореБрдЦреНрдп рд╡рд┐рдзрд┐рдпрд╛рдБ (methods) рд╣реИрдВ:\n",
|
||||
"* `get` - рдХрд┐рд╕реА рдЧреБрдг рдХрд╛ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдирд┐рд╖реНрдХрд░реНрд╖рдг (inference) рдХрд░рддреЗ рд╣реБрдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, `get('color')` рдХрд┐рд╕реА рд░рдВрдЧ рдХреЗ рд╕реНрд▓реЙрдЯ рдХрд╛ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ (рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдиреЗ рдкрд░ рдкреВрдЫреЗрдЧрд╛ рдФрд░ рдХрд╛рд░реНрдпрд╢реАрд▓ рдореЗрдореЛрд░реА рдореЗрдВ рдмрд╛рдж рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдорд╛рди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛)ред рдпрджрд┐ рд╣рдо `get('color:blue')` рдкреВрдЫрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд░рдВрдЧ рдкреВрдЫреЗрдЧрд╛ рдФрд░ рдлрд┐рд░ `y`/`n` рдорд╛рди рд▓реМрдЯрд╛рдПрдЧрд╛, рдЬреЛ рд░рдВрдЧ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛ред\n",
|
||||
"* `eval` - рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдирд┐рд╖реНрдХрд░реНрд╖рдг рдХрд░рддрд╛ рд╣реИ, рдпрд╛рдиреА AND/OR рдЯреНрд░реА рдХреЛ рдкрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЙрдк-рд▓рдХреНрд╖реНрдпреЛрдВ (sub-goals) рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддрд╛ рд╣реИ, рдЖрджрд┐ред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class KnowledgeBase():\n",
|
||||
" def __init__(self,rules):\n",
|
||||
" self.rules = rules\n",
|
||||
" self.memory = {}\n",
|
||||
" \n",
|
||||
" def get(self,name):\n",
|
||||
" if ':' in name:\n",
|
||||
" k,v = name.split(':')\n",
|
||||
" vv = self.get(k)\n",
|
||||
" return 'y' if v==vv else 'n'\n",
|
||||
" if name in self.memory.keys():\n",
|
||||
" return self.memory[name]\n",
|
||||
" for fld in self.rules.keys():\n",
|
||||
" if fld==name or fld.startswith(name+\":\"):\n",
|
||||
" # print(\" + proving {}\".format(fld))\n",
|
||||
" value = 'y' if fld==name else fld.split(':')[1]\n",
|
||||
" res = self.eval(self.rules[fld],field=name)\n",
|
||||
" if res!='y' and res!='n' and value=='y':\n",
|
||||
" self.memory[name] = res\n",
|
||||
" return res\n",
|
||||
" if res=='y':\n",
|
||||
" self.memory[name] = value\n",
|
||||
" return value\n",
|
||||
" # field is not found, using default\n",
|
||||
" res = self.eval(self.rules['default'],field=name)\n",
|
||||
" self.memory[name]=res\n",
|
||||
" return res\n",
|
||||
" \n",
|
||||
" def eval(self,expr,field=None):\n",
|
||||
" # print(\" + eval {}\".format(expr))\n",
|
||||
" if isinstance(expr,Ask):\n",
|
||||
" print(field)\n",
|
||||
" return expr.ask()\n",
|
||||
" elif isinstance(expr,If):\n",
|
||||
" return self.eval(expr.x)\n",
|
||||
" elif isinstance(expr,AND) or isinstance(expr,list):\n",
|
||||
" expr = expr.x if isinstance(expr,AND) else expr\n",
|
||||
" for x in expr:\n",
|
||||
" if self.eval(x)=='n':\n",
|
||||
" return 'n'\n",
|
||||
" return 'y'\n",
|
||||
" elif isinstance(expr,OR):\n",
|
||||
" for x in expr.x:\n",
|
||||
" if self.eval(x)=='y':\n",
|
||||
" return 'y'\n",
|
||||
" return 'n'\n",
|
||||
" elif isinstance(expr,str):\n",
|
||||
" return self.get(expr)\n",
|
||||
" else:\n",
|
||||
" print(\"Unknown expr: {}\".format(expr))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдЕрдм рдЪрд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╢реБ рдЬреНрдЮрд╛рдирдХреЛрд╖ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд╛рдорд░реНрд╢ рдХрд░рддреЗ рд╣реИрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдХреЙрд▓ рдЖрдкрд╕реЗ рдкреНрд░рд╢реНрди рдкреВрдЫреЗрдЧрд╛ред рдЖрдк `y`/`n` рдЯрд╛рдЗрдк рдХрд░рдХреЗ рд╣рд╛рдВ-рдирд╛ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдЙрддреНрддрд░ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рд▓рдВрдмреЗ рдмрд╣реБрд╡рд┐рдХрд▓реНрдкреАрдп рдЙрддреНрддрд░реЛрдВ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдЦреНрдпрд╛ (0..N) рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"hair\n",
|
||||
"y/n\n",
|
||||
"sharp teeth\n",
|
||||
"y/n\n",
|
||||
"claws\n",
|
||||
"y/n\n",
|
||||
"forward-looking eyes\n",
|
||||
"y/n\n",
|
||||
"color\n",
|
||||
"0. red-brown\n",
|
||||
"1. black and white\n",
|
||||
"2. other\n",
|
||||
"has hooves\n",
|
||||
"y/n\n",
|
||||
"long neck\n",
|
||||
"y/n\n",
|
||||
"long legs\n",
|
||||
"y/n\n",
|
||||
"pattern\n",
|
||||
"0. dark stripes\n",
|
||||
"1. dark spots\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"'giraffe'"
|
||||
]
|
||||
},
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"kb = KnowledgeBase(rules)\n",
|
||||
"kb.get('animal')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## PyKnow рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Forward Inference\n",
|
||||
"\n",
|
||||
"рдЕрдЧрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдЬреНрдЮрд╛рди рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА [PyKnow](https://github.com/buguroo/pyknow/) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ forward inference рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗред **PyKnow** рдПрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ рдЬреЛ Python рдореЗрдВ forward inference рд╕рд┐рд╕реНрдЯрдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рд╣реИ, рдФрд░ рдпрд╣ рдкреБрд░рд╛рдиреЗ рдХреНрд▓рд╛рд╕рд┐рдХрд▓ рд╕рд┐рд╕реНрдЯрдо [CLIPS](http://www.clipsrules.net/index.html) рдХреЗ рд╕рдорд╛рди рд╣реИред\n",
|
||||
"\n",
|
||||
"рд╣рдо forward chaining рдХреЛ рдЦреБрдж рднреА рдмрд┐рдирд╛ рдЬреНрдпрд╛рджрд╛ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рдереЗ, рд▓реЗрдХрд┐рди рд╕рд╛рдзрд╛рд░рдг (naive) рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЖрдорддреМрд░ рдкрд░ рдмрд╣реБрдд рдкреНрд░рднрд╛рд╡реА рдирд╣реАрдВ рд╣реЛрддреЗред рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡реА рдирд┐рдпрдо рдорд┐рд▓рд╛рди (rule matching) рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдПрд▓реНрдЧреЛрд░рд┐рджрдо [Rete](https://en.wikipedia.org/wiki/Rete_algorithm) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Collecting git+https://github.com/buguroo/pyknow/\n",
|
||||
" Cloning https://github.com/buguroo/pyknow/ to /tmp/pip-req-build-3cqeulyl\n",
|
||||
" Running command git clone --filter=blob:none --quiet https://github.com/buguroo/pyknow/ /tmp/pip-req-build-3cqeulyl\n",
|
||||
" Resolved https://github.com/buguroo/pyknow/ to commit 48818336f2e9a126f1964f2d8dc22d37ff800fe8\n",
|
||||
" Preparing metadata (setup.py) ... \u001b[?25ldone\n",
|
||||
"\u001b[?25hCollecting frozendict==1.2\n",
|
||||
" Using cached frozendict-1.2.tar.gz (2.6 kB)\n",
|
||||
" Preparing metadata (setup.py) ... \u001b[?25ldone\n",
|
||||
"\u001b[?25hCollecting schema==0.6.7\n",
|
||||
" Using cached schema-0.6.7-py2.py3-none-any.whl (14 kB)\n",
|
||||
"Building wheels for collected packages: pyknow, frozendict\n",
|
||||
" Building wheel for pyknow (setup.py) ... \u001b[?25ldone\n",
|
||||
"\u001b[?25h Created wheel for pyknow: filename=pyknow-1.7.0-py3-none-any.whl size=34228 sha256=b7de5b09292c4007667c72f69b98d5a1b5f7324ff15f9dd8e077c3d5f7aade42\n",
|
||||
" Stored in directory: /tmp/pip-ephem-wheel-cache-k7jpave7/wheels/81/1a/d3/f6c15dbe1955598a37755215f2a10449e7418500d7bd4b9508\n",
|
||||
" Building wheel for frozendict (setup.py) ... \u001b[?25ldone\n",
|
||||
"\u001b[?25h Created wheel for frozendict: filename=frozendict-1.2-py3-none-any.whl size=3148 sha256=2863d55c240d2409cddf05ccfe600591f8478681549fc97555c47c90dc6bb160\n",
|
||||
" Stored in directory: /home/rg/.cache/pip/wheels/49/ac/f8/cb8120244e710bdb479c86198b03c7b08c3c2d3d2bf448fd6e\n",
|
||||
"Successfully built pyknow frozendict\n",
|
||||
"Installing collected packages: schema, frozendict, pyknow\n",
|
||||
"Successfully installed frozendict-1.2 pyknow-1.7.0 schema-0.6.7\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import sys\n",
|
||||
"!{sys.executable} -m pip install git+https://github.com/buguroo/pyknow/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 13,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"from pyknow import *\n",
|
||||
"#import pyknow"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рд╣рдо рдЕрдкрдиреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЛ `KnowledgeEngine` рдХрд╛ рд╕рдмрдХреНрд▓рд╛рд╕ рдмрдирд╛рдХрд░ рдПрдХ рдХреНрд▓рд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗред рдкреНрд░рддреНрдпреЗрдХ рдирд┐рдпрдо рдХреЛ `@Rule` рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдирд┐рдпрдо рдХрдм рд╕рдХреНрд░рд┐рдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдирд┐рдпрдо рдХреЗ рдЕрдВрджрд░, рд╣рдо `declare` рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирдП рддрдереНрдп рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЙрди рддрдереНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдЖрдЧреЗ рдХреА рдЕрдиреБрдорд╛рди рдЗрдВрдЬрди рджреНрд╡рд╛рд░рд╛ рдХреБрдЫ рдФрд░ рдирд┐рдпрдореЛрдВ рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 14,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class Animals(KnowledgeEngine):\n",
|
||||
" @Rule(OR(\n",
|
||||
" AND(Fact('sharp teeth'),Fact('claws'),Fact('forward looking eyes')),\n",
|
||||
" Fact('eats meat')))\n",
|
||||
" def cornivor(self):\n",
|
||||
" self.declare(Fact('carnivor'))\n",
|
||||
" \n",
|
||||
" @Rule(OR(Fact('hair'),Fact('gives milk')))\n",
|
||||
" def mammal(self):\n",
|
||||
" self.declare(Fact('mammal'))\n",
|
||||
"\n",
|
||||
" @Rule(Fact('mammal'),\n",
|
||||
" OR(Fact('has hooves'),Fact('chews cud')))\n",
|
||||
" def hooves(self):\n",
|
||||
" self.declare('ungulate')\n",
|
||||
" \n",
|
||||
" @Rule(OR(Fact('feathers'),AND(Fact('flies'),Fact('lays eggs'))))\n",
|
||||
" def bird(self):\n",
|
||||
" self.declare('bird')\n",
|
||||
" \n",
|
||||
" @Rule(Fact('mammal'),Fact('carnivor'),\n",
|
||||
" Fact(color='red-brown'),\n",
|
||||
" Fact(pattern='dark spots'))\n",
|
||||
" def monkey(self):\n",
|
||||
" self.declare(Fact(animal='monkey'))\n",
|
||||
"\n",
|
||||
" @Rule(Fact('mammal'),Fact('carnivor'),\n",
|
||||
" Fact(color='red-brown'),\n",
|
||||
" Fact(pattern='dark stripes'))\n",
|
||||
" def tiger(self):\n",
|
||||
" self.declare(Fact(animal='tiger'))\n",
|
||||
"\n",
|
||||
" @Rule(Fact('ungulate'),\n",
|
||||
" Fact('long neck'),\n",
|
||||
" Fact('long legs'),\n",
|
||||
" Fact(pattern='dark spots'))\n",
|
||||
" def giraffe(self):\n",
|
||||
" self.declare(Fact(animal='giraffe'))\n",
|
||||
"\n",
|
||||
" @Rule(Fact('ungulate'),\n",
|
||||
" Fact(pattern='dark stripes'))\n",
|
||||
" def zebra(self):\n",
|
||||
" self.declare(Fact(animal='zebra'))\n",
|
||||
"\n",
|
||||
" @Rule(Fact('bird'),\n",
|
||||
" Fact('long neck'),\n",
|
||||
" Fact('cannot fly'),\n",
|
||||
" Fact(color='black and white'))\n",
|
||||
" def straus(self):\n",
|
||||
" self.declare(Fact(animal='ostrich'))\n",
|
||||
"\n",
|
||||
" @Rule(Fact('bird'),\n",
|
||||
" Fact('swims'),\n",
|
||||
" Fact('cannot fly'),\n",
|
||||
" Fact(color='black and white'))\n",
|
||||
" def pinguin(self):\n",
|
||||
" self.declare(Fact(animal='pinguin'))\n",
|
||||
"\n",
|
||||
" @Rule(Fact('bird'),\n",
|
||||
" Fact('flies well'))\n",
|
||||
" def albatros(self):\n",
|
||||
" self.declare(Fact(animal='albatross'))\n",
|
||||
" \n",
|
||||
" @Rule(Fact(animal=MATCH.a))\n",
|
||||
" def print_result(self,a):\n",
|
||||
" print('Animal is {}'.format(a))\n",
|
||||
" \n",
|
||||
" def factz(self,l):\n",
|
||||
" for x in l:\n",
|
||||
" self.declare(x)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдо рдПрдХ рдЬреНрдЮрд╛рди рдЖрдзрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЕрдкрдиреА рдХрд╛рд░реНрдпрд╢реАрд▓ рд╕реНрдореГрддрд┐ рдХреЛ рдХреБрдЫ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рддрдереНрдпреЛрдВ рд╕реЗ рднрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ `run()` рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдирд┐рд╖реНрдХрд░реНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдЖрдк рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдирдП рдирд┐рд╖реНрдХрд░реНрд╖рд┐рдд рддрдереНрдп рдХрд╛рд░реНрдпрд╢реАрд▓ рд╕реНрдореГрддрд┐ рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдЬрд╛рдирд╡рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдВрддрд┐рдо рддрдереНрдп рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ (рдпрджрд┐ рд╣рдордиреЗ рд╕рднреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рддрдереНрдпреЛрдВ рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ)ред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 15,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Animal is tiger\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"FactList([(0, InitialFact()),\n",
|
||||
" (1, Fact(color='red-brown')),\n",
|
||||
" (2, Fact(pattern='dark stripes')),\n",
|
||||
" (3, Fact('sharp teeth')),\n",
|
||||
" (4, Fact('claws')),\n",
|
||||
" (5, Fact('forward looking eyes')),\n",
|
||||
" (6, Fact('gives milk')),\n",
|
||||
" (7, Fact('mammal')),\n",
|
||||
" (8, Fact('carnivor')),\n",
|
||||
" (9, Fact(animal='tiger'))])"
|
||||
]
|
||||
},
|
||||
"execution_count": 15,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"ex1 = Animals()\n",
|
||||
"ex1.reset()\n",
|
||||
"ex1.factz([\n",
|
||||
" Fact(color='red-brown'),\n",
|
||||
" Fact(pattern='dark stripes'),\n",
|
||||
" Fact('sharp teeth'),\n",
|
||||
" Fact('claws'),\n",
|
||||
" Fact('forward looking eyes'),\n",
|
||||
" Fact('gives milk')])\n",
|
||||
"ex1.run()\n",
|
||||
"ex1.facts"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**рдЕрд╕реНрд╡реАрдХрд░рдг**: \nрдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ AI рдЕрдиреБрд╡рд╛рдж рд╕реЗрд╡рд╛ [Co-op Translator](https://github.com/Azure/co-op-translator) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрдмрдХрд┐ рд╣рдо рд╕рдЯреАрдХрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрдиреБрд╡рд╛рдж рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдпрд╛ рдЕрд╢реБрджреНрдзрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдореВрд▓ рднрд╛рд╖рд╛ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдореВрд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рд╕реНрд░реЛрдд рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдкреЗрд╢реЗрд╡рд░ рдорд╛рдирд╡ рдЕрдиреБрд╡рд╛рдж рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред рдЗрд╕ рдЕрдиреБрд╡рд╛рдж рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд┐рд╕реА рднреА рдЧрд▓рддрдлрд╣рдореА рдпрд╛ рдЧрд▓рдд рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╣рдо рдЙрддреНрддрд░рджрд╛рдпреА рдирд╣реАрдВ рд╣реИрдВред\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3.7.4 64-bit (conda)",
|
||||
"metadata": {
|
||||
"interpreter": {
|
||||
"hash": "86193a1ab0ba47eac1c69c1756090baa3b420b3eea7d4aafab8b85f8b312f0c5"
|
||||
}
|
||||
},
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.11.2"
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "ab2bd97b0453415b89a469284609a8ce",
|
||||
"translation_date": "2025-08-31T14:55:07+00:00",
|
||||
"source_file": "lessons/2-Symbolic/Animals.ipynb",
|
||||
"language_code": "hi"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
|
|
@ -0,0 +1,593 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"collapsed": true
|
||||
},
|
||||
"source": [
|
||||
"# рдкрд░рд┐рд╡рд╛рд░ рд╕рдВрдмрдВрдз рдСрдВрдЯреЛрд▓реЙрдЬреА\n",
|
||||
"\n",
|
||||
"рдпрд╣ рдЙрджрд╛рд╣рд░рдг [AI for Beginners Curriculum](http://github.com/microsoft/ai-for-beginners) рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ [рдЗрд╕ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ](https://habr.com/post/270857/) рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реЛрдХрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"рдореБрдЭреЗ рд╣рдореЗрд╢рд╛ рдкрд░рд┐рд╡рд╛рд░ рдореЗрдВ рд▓реЛрдЧреЛрдВ рдХреЗ рдмреАрдЪ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ рдпрд╛рдж рд░рдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдПрдХ рдСрдВрдЯреЛрд▓реЙрдЬреА рд▓реЗрдВрдЧреЗ рдЬреЛ рдкрд░рд┐рд╡рд╛рд░ рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреА рд╣реИ, рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рдВрд╢рд╛рд╡рд▓реА рд╡реГрдХреНрд╖ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдлрд┐рд░ рджрд┐рдЦрд╛рдПрдВрдЧреЗ рдХрд┐ рд╣рдо рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдирд┐рд╖реНрдХрд░реНрд╖рдг рдХрд░рдХреЗ рд╕рднреА рд░рд┐рд╢реНрддреЗрджрд╛рд░реЛрдВ рдХреЛ рдХреИрд╕реЗ рдЦреЛрдЬ рд╕рдХрддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"### рд╡рдВрд╢рд╛рд╡рд▓реА рд╡реГрдХреНрд╖ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛\n",
|
||||
"\n",
|
||||
"рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо [рд░реЛрдорд╛рдиреЛрд╡ рдЬрд╝рд╛рд░ рдкрд░рд┐рд╡рд╛рд░](https://en.wikipedia.org/wiki/House_of_Romanov) рдХрд╛ рд╡рдВрд╢рд╛рд╡рд▓реА рд╡реГрдХреНрд╖ рд▓реЗрдВрдЧреЗред рдкрд░рд┐рд╡рд╛рд░ рд╕рдВрдмрдВрдзреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╛рд░реВрдк [GEDCOM](https://en.wikipedia.org/wiki/GEDCOM) рд╣реИред рд╣рдо GEDCOM рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд░реЛрдорд╛рдиреЛрд╡ рдкрд░рд┐рд╡рд╛рд░ рдХрд╛ рд╡рдВрд╢рд╛рд╡рд▓реА рд╡реГрдХреНрд╖ рд▓реЗрдВрдЧреЗ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"0 HEAD\n",
|
||||
"1 CHAR UTF8\n",
|
||||
"1 GEDC\n",
|
||||
"2 VERS 5.5\n",
|
||||
"0 @0@ INDI\n",
|
||||
"1 NAME Mihail Fedorovich /Romanov/\n",
|
||||
"1 SEX M\n",
|
||||
"1 BIRT\n",
|
||||
"2 DATE 1613\n",
|
||||
"1 DEAT \n",
|
||||
"2 DATE 1645\n",
|
||||
"1 FAMS @41@\n",
|
||||
"0 @1@ INDI\n",
|
||||
"1 NAME Evdokija Lukjanovna /Streshneva/\n",
|
||||
"1 SEX F\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"!head -15 data/tsars.ged"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"GEDCOM рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо `python-gedcom` рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Collecting python-gedcom\n",
|
||||
" Downloading python_gedcom-1.0.0-py2.py3-none-any.whl (35 kB)\n",
|
||||
"Installing collected packages: python-gedcom\n",
|
||||
"Successfully installed python-gedcom-1.0.0\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import sys\n",
|
||||
"!{sys.executable} -m pip install python-gedcom"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдлрд╝рд╛рдЗрд▓ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреБрдЫ рддрдХрдиреАрдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рджреВрд░ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рд╣рдореЗрдВ рдкреЗрдбрд╝ рдореЗрдВ рд╕рднреА рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдФрд░ рдкрд░рд┐рд╡рд╛рд░реЛрдВ рддрдХ рдХрд╛рдлреА рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╣рдо рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХреИрд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рднреА рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"from gedcom.parser import Parser\n",
|
||||
"from gedcom.element.individual import IndividualElement\n",
|
||||
"from gedcom.element.family import FamilyElement\n",
|
||||
"g = Parser()\n",
|
||||
"g.parse_file('data/tsars.ged')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {
|
||||
"scrolled": true,
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[('@0@', ('Mihail Fedorovich', 'Romanov')),\n",
|
||||
" ('@1@', ('Evdokija Lukjanovna', 'Streshneva')),\n",
|
||||
" ('@2@', ('Aleksej Mihajlovich', 'Romanov')),\n",
|
||||
" ('@3@', ('Marija Ilinichna', 'Miloslavskaja')),\n",
|
||||
" ('@4@', ('Natalja Kirillovna', 'Naryshkina')),\n",
|
||||
" ('@5@', ('Marfa Matveevna', 'Apraksina')),\n",
|
||||
" ('@6@', ('Fedor Alekseevich', 'Romanov')),\n",
|
||||
" ('@7@', ('Sofja Aleksevna', 'Romanova')),\n",
|
||||
" ('@8@', ('Ivan V Alekseevich', 'Romanov')),\n",
|
||||
" ('@9@', ('Praskovja Fedorovna', 'Saltykova')),\n",
|
||||
" ('@10@', ('Ekaterina Ivanovna', 'Romanova')),\n",
|
||||
" ('@11@', ('Anna Ivanovna', 'Romanova')),\n",
|
||||
" ('@12@', ('Fridrih Vilgelm', 'Kurlandskij')),\n",
|
||||
" ('@13@', ('Karl Leopold', 'Meklenburg-Shverinskij')),\n",
|
||||
" ('@14@', ('Anna Leopoldovna', 'Meklenburg-Shverinskaja')),\n",
|
||||
" ('@15@', ('Anton Ulrih', 'Braunshvejg-Volfenbjuttelskij')),\n",
|
||||
" ('@16@', ('Ivan VI Antonovich', 'Braunshvejg-Volfenbjuttelskij')),\n",
|
||||
" ('@17@', ('Petr I Alekseevich', 'Romanov')),\n",
|
||||
" ('@18@', ('Evdokija Fedorovna', 'Lopuhina')),\n",
|
||||
" ('@19@', ('Ekaterina I Alekseevna', 'Mihajlova')),\n",
|
||||
" ('@20@', ('Aleksej Petrovich', 'Romanov')),\n",
|
||||
" ('@21@', ('Sharlotta Kristina', 'Braunshvejg-Volfenbjuttelskaja')),\n",
|
||||
" ('@22@', ('Petr II Alekseevich', 'Romanov')),\n",
|
||||
" ('@23@', ('Anna Petrovna', 'Romanova')),\n",
|
||||
" ('@24@', ('Elizaveta Petrovna', 'Romanova')),\n",
|
||||
" ('@25@', ('Karl Fridrih', 'Golshtejn-Gottorpskij')),\n",
|
||||
" ('@26@', ('Petr III Fedorovich', 'Romanov')),\n",
|
||||
" ('@27@', ('Ekaterina II', 'Alekseevna')),\n",
|
||||
" ('@28@', ('Pavel I Petrovich', 'Romanov')),\n",
|
||||
" ('@29@', ('Natalja Alekseevna', 'Gessen-Darmshtadskaja')),\n",
|
||||
" ('@30@', ('Marija Fedorovna', 'Vjurtembergskaja')),\n",
|
||||
" ('@31@', ('Aleksandr I Pavlovich', 'Romanov')),\n",
|
||||
" ('@32@', ('Elizaveta Alekseevna', 'Baden-Durlahskaja')),\n",
|
||||
" ('@33@', ('Nikolaj I Pavlovich', 'Romanov')),\n",
|
||||
" ('@34@', ('Aleksandra Fedorovna', 'Prusskaja')),\n",
|
||||
" ('@35@', ('Aleksandr II Nikolaevich', 'Romanov')),\n",
|
||||
" ('@36@', ('Marija Aleksandrovna', 'Gessenskaja')),\n",
|
||||
" ('@37@', ('Aleksandr III Aleksandrovich', 'Romanov')),\n",
|
||||
" ('@38@', ('Marija Fedorovna', 'Datskaja')),\n",
|
||||
" ('@39@', ('Nikolaj II Aleksandrovich', 'Romanov')),\n",
|
||||
" ('@40@', ('Aleksandra Fedorovna', 'Gessenskaja'))]"
|
||||
]
|
||||
},
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"d = g.get_element_dictionary()\n",
|
||||
"[ (k,v.get_name()) for k,v in d.items() if isinstance(v,IndividualElement)]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╣рдо рдкрд░рд┐рд╡рд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рд╣рдореЗрдВ **рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ** рдХреА рдПрдХ рд╕реВрдЪреА рджреЗрддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рд╣рдореЗрдВ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯрддрд╛ рдЪрд╛рд╣рд┐рдП рддреЛ рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдирд╛рдореЛрдВ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[('@41@', ['@0@', '@1@', '@2@']),\n",
|
||||
" ('@42@', ['@2@', '@3@', '@6@', '@7@', '@8@']),\n",
|
||||
" ('@43@', ['@8@', '@9@', '@10@', '@11@']),\n",
|
||||
" ('@44@', ['@13@', '@10@', '@14@']),\n",
|
||||
" ('@45@', ['@15@', '@14@', '@16@']),\n",
|
||||
" ('@46@', ['@2@', '@4@', '@17@']),\n",
|
||||
" ('@47@', ['@17@', '@18@', '@20@']),\n",
|
||||
" ('@48@', ['@20@', '@21@', '@22@']),\n",
|
||||
" ('@49@', ['@17@', '@19@', '@23@', '@24@']),\n",
|
||||
" ('@50@', ['@25@', '@23@', '@26@']),\n",
|
||||
" ('@51@', ['@26@', '@27@', '@28@']),\n",
|
||||
" ('@52@', ['@28@', '@30@', '@31@', '@33@']),\n",
|
||||
" ('@53@', ['@33@', '@34@', '@35@']),\n",
|
||||
" ('@54@', ['@35@', '@36@', '@37@']),\n",
|
||||
" ('@55@', ['@37@', '@38@', '@39@'])]"
|
||||
]
|
||||
},
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"d = g.get_element_dictionary()\n",
|
||||
"[ (k,[x.get_value() for x in v.get_child_elements()]) for k,v in d.items() if isinstance(v,FamilyElement)]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### рдкрд░рд┐рд╡рд╛рд░ рдСрдВрдЯреЛрд▓реЙрдЬреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛\n",
|
||||
"\n",
|
||||
"рдЕрдм, рдЖрдЗрдП [рдкрд░рд┐рд╡рд╛рд░ рдСрдВрдЯреЛрд▓реЙрдЬреА](https://raw.githubusercontent.com/blokhin/genealogical-trees/master/data/header.ttl) рдкрд░ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ, рдЬрд┐рд╕реЗ рд╕реЗрдорд╛рдВрдЯрд┐рдХ рд╡реЗрдм рдЯреНрд░рд┐рдкрд▓реЗрдЯреНрд╕ рдХреЗ рд╕реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдСрдВрдЯреЛрд▓реЙрдЬреА рдореЗрдВ `isUncleOf`, `isCousinOf` рдФрд░ рдХрдИ рдЕрдиреНрдп рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпреЗ рд╕рднреА рд╕рдВрдмрдВрдз рдореВрд▓ рдкреНрд░реЗрдбрд┐рдХреЗрдЯреНрд╕ `isMotherOf`, `isFatherOf`, `isBrotherOf` рдФрд░ `isSisterOf` рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред рд╣рдо рдСрдВрдЯреЛрд▓реЙрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рддрд░реНрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреНрдп рд╕рднреА рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓реЗрдВрдЧреЗред\n",
|
||||
"\n",
|
||||
"рдпрд╣рд╛рдБ `isAuntOf` рдкреНрд░реЙрдкрд░реНрдЯреА рдХреА рдПрдХ рдирдореВрдирд╛ рдкрд░рд┐рднрд╛рд╖рд╛ рджреА рдЧрдИ рд╣реИ, рдЬрд┐рд╕реЗ `isSisterOf` рдФрд░ `isParentOf` рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (*рдЖрдВрдЯреА рдХрд┐рд╕реА рдХреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреА рдмрд╣рди рд╣реЛрддреА рд╣реИ*)ред\n",
|
||||
"\n",
|
||||
"```\n",
|
||||
"fhkb:isAuntOf a owl:ObjectProperty ;\n",
|
||||
" rdfs:domain fhkb:Woman ;\n",
|
||||
" rdfs:range fhkb:Person ;\n",
|
||||
" owl:propertyChainAxiom ( fhkb:isSisterOf fhkb:isParentOf ) .\n",
|
||||
"```\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"@prefix fhkb: <http://www.example.com/genealogy.owl#> .\n",
|
||||
"@prefix owl: <http://www.w3.org/2002/07/owl#> .\n",
|
||||
"@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .\n",
|
||||
"@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\n",
|
||||
"@prefix xml: <http://www.w3.org/XML/1998/namespace> .\n",
|
||||
"@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .\n",
|
||||
"\n",
|
||||
"<http://www.example.com/genealogy.owl#> a owl:Ontology .\n",
|
||||
"\n",
|
||||
"fhkb:DomainEntity a owl:Class .\n",
|
||||
"\n",
|
||||
"fhkb:Man a owl:Class ;\n",
|
||||
" owl:equivalentClass [ a owl:Class ;\n",
|
||||
" owl:intersectionOf ( fhkb:Person [ a owl:Restriction ;\n",
|
||||
" owl:onProperty fhkb:hasSex ;\n",
|
||||
" owl:someValuesFrom fhkb:Male ] ) ] .\n",
|
||||
"\n",
|
||||
"fhkb:Woman a owl:Class ;\n",
|
||||
" owl:equivalentClass [ a owl:Class ;\n",
|
||||
" owl:intersectionOf ( fhkb:Person [ a owl:Restriction ;\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"!head -20 data/onto.ttl"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### рдЕрдиреБрдорд╛рди рдХреЗ рд▓рд┐рдП рдУрдВрдЯреЛрд▓реЙрдЬреА рдмрдирд╛рдирд╛\n",
|
||||
"\n",
|
||||
"рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдУрдВрдЯреЛрд▓реЙрдЬреА рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рдкрд░рд┐рд╡рд╛рд░ рдУрдВрдЯреЛрд▓реЙрдЬреА рд╕реЗ рдореВрд▓ рдирд┐рдпрдо рдФрд░ рд╣рдорд╛рд░реЗ GEDCOM рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддрдереНрдп рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗред рд╣рдо GEDCOM рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ, рдкрд░рд┐рд╡рд╛рд░реЛрдВ рдФрд░ рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдХрд╛рд▓реЗрдВрдЧреЗ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЯреНрд░рд┐рдкрд▓реЗрдЯреНрд╕ рдореЗрдВ рдмрджрд▓реЗрдВрдЧреЗред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"!cp data/onto.ttl .\n",
|
||||
"\n",
|
||||
"gedcom_dict = g.get_element_dictionary()\n",
|
||||
"individuals, marriages = {}, {}\n",
|
||||
"\n",
|
||||
"def term2id(el):\n",
|
||||
" return \"i\" + el.get_pointer().replace('@', '').lower()\n",
|
||||
"\n",
|
||||
"out = open(\"onto.ttl\",\"a\")\n",
|
||||
"\n",
|
||||
"for k, v in gedcom_dict.items():\n",
|
||||
" if isinstance(v,IndividualElement):\n",
|
||||
" children, siblings = set(), set()\n",
|
||||
" idx = term2id(v)\n",
|
||||
"\n",
|
||||
" title = v.get_name()[0] + \" \" + v.get_name()[1]\n",
|
||||
" title = title.replace('\"', '').replace('[', '').replace(']', '').replace('(', '').replace(')', '').strip()\n",
|
||||
"\n",
|
||||
" own_families = g.get_families(v, 'FAMS')\n",
|
||||
" for fam in own_families:\n",
|
||||
" children |= set(term2id(i) for i in g.get_family_members(fam, \"CHIL\"))\n",
|
||||
"\n",
|
||||
" parent_families = g.get_families(v, 'FAMC')\n",
|
||||
" if len(parent_families):\n",
|
||||
" for member in g.get_family_members(parent_families[0], \"CHIL\"): # NB adoptive families i.e len(parent_families)>1 are not considered (TODO?)\n",
|
||||
" if member.get_pointer() == v.get_pointer():\n",
|
||||
" continue\n",
|
||||
" siblings.add(term2id(member))\n",
|
||||
"\n",
|
||||
" if idx in individuals:\n",
|
||||
" children |= individuals[idx].get('children', set())\n",
|
||||
" siblings |= individuals[idx].get('siblings', set())\n",
|
||||
" individuals[idx] = {'sex': v.get_gender().lower(), 'children': children, 'siblings': siblings, 'title': title}\n",
|
||||
"\n",
|
||||
" elif isinstance(v,FamilyElement):\n",
|
||||
" wife, husb, children = None, None, set()\n",
|
||||
" children = set(term2id(i) for i in g.get_family_members(v, \"CHIL\"))\n",
|
||||
"\n",
|
||||
" try:\n",
|
||||
" wife = g.get_family_members(v, \"WIFE\")[0]\n",
|
||||
" wife = term2id(wife)\n",
|
||||
" if wife in individuals: individuals[wife]['children'] |= children\n",
|
||||
" else: individuals[wife] = {'children': children}\n",
|
||||
" except IndexError: pass\n",
|
||||
" try:\n",
|
||||
" husb = g.get_family_members(v, \"HUSB\")[0]\n",
|
||||
" husb = term2id(husb)\n",
|
||||
" if husb in individuals: individuals[husb]['children'] |= children\n",
|
||||
" else: individuals[husb] = {'children': children}\n",
|
||||
" except IndexError: pass\n",
|
||||
"\n",
|
||||
" if wife and husb: marriages[wife + husb] = (term2id(v), wife, husb)\n",
|
||||
"\n",
|
||||
"for idx, val in individuals.items():\n",
|
||||
" added_terms = ''\n",
|
||||
" if val['sex'] == 'f':\n",
|
||||
" parent_predicate, sibl_predicate = \"isMotherOf\", \"isSisterOf\"\n",
|
||||
" else:\n",
|
||||
" parent_predicate, sibl_predicate = \"isFatherOf\", \"isBrotherOf\"\n",
|
||||
" if len(val['children']):\n",
|
||||
" added_terms += \" ;\\n fhkb:\" + parent_predicate + \" \" + \", \".join([\"fhkb:\" + i for i in val['children']])\n",
|
||||
" if len(val['siblings']):\n",
|
||||
" added_terms += \" ;\\n fhkb:\" + sibl_predicate + \" \" + \", \".join([\"fhkb:\" + i for i in val['siblings']])\n",
|
||||
" out.write(\"fhkb:%s a owl:NamedIndividual, owl:Thing%s ;\\n rdfs:label \\\"%s\\\" .\\n\" % (idx, added_terms, val['title']))\n",
|
||||
"\n",
|
||||
"for k, v in marriages.items():\n",
|
||||
" out.write(\"fhkb:%s a owl:NamedIndividual, owl:Thing ;\\n fhkb:hasFemalePartner fhkb:%s ;\\n fhkb:hasMalePartner fhkb:%s .\\n\" % v)\n",
|
||||
"\n",
|
||||
"out.write(\"[] a owl:AllDifferent ;\\n owl:distinctMembers (\")\n",
|
||||
"for idx in individuals.keys():\n",
|
||||
" out.write(\" fhkb:\" + idx)\n",
|
||||
"for k, v in marriages.items():\n",
|
||||
" out.write(\" fhkb:\" + v[0])\n",
|
||||
"out.write(\" ) .\")\n",
|
||||
"out.close()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
" fhkb:hasFemalePartner fhkb:i34 ;\n",
|
||||
" fhkb:hasMalePartner fhkb:i33 .\n",
|
||||
"fhkb:i54 a owl:NamedIndividual, owl:Thing ;\n",
|
||||
" fhkb:hasFemalePartner fhkb:i36 ;\n",
|
||||
" fhkb:hasMalePartner fhkb:i35 .\n",
|
||||
"fhkb:i55 a owl:NamedIndividual, owl:Thing ;\n",
|
||||
" fhkb:hasFemalePartner fhkb:i38 ;\n",
|
||||
" fhkb:hasMalePartner fhkb:i37 .\n",
|
||||
"[] a owl:AllDifferent ;\n",
|
||||
" owl:distinctMembers ( fhkb:i0 fhkb:i1 fhkb:i2 fhkb:i3 fhkb:i4 fhkb:i5 fhkb:i6 fhkb:i7 fhkb:i8 fhkb:i9 fhkb:i10 fhkb:i11 fhkb:i12 fhkb:i13 fhkb:i14 fhkb:i15 fhkb:i16 fhkb:i17 fhkb:i18 fhkb:i19 fhkb:i20 fhkb:i21 fhkb:i22 fhkb:i23 fhkb:i24 fhkb:i25 fhkb:i26 fhkb:i27 fhkb:i28 fhkb:i29 fhkb:i30 fhkb:i31 fhkb:i32 fhkb:i33 fhkb:i34 fhkb:i35 fhkb:i36 fhkb:i37 fhkb:i38 fhkb:i39 fhkb:i40 fhkb:i41 fhkb:i42 fhkb:i43 fhkb:i44 fhkb:i45 fhkb:i46 fhkb:i47 fhkb:i48 fhkb:i49 fhkb:i50 fhkb:i51 fhkb:i52 fhkb:i53 fhkb:i54 fhkb:i55 ) ."
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"!tail onto.ttl"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ \n",
|
||||
"\n",
|
||||
"рдЕрдм рд╣рдо рдЗрд╕ рдСрдВрдЯреЛрд▓реЙрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдФрд░ рдХреНрд╡реЗрд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдо [RDFLib](https://github.com/RDFLib) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ RDF рдЧреНрд░рд╛рдл рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рд╛рд░реВрдкреЛрдВ рдореЗрдВ рдкрдврд╝рдиреЗ, рдХреНрд╡реЗрд░реА рдХрд░рдиреЗ рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИред \n",
|
||||
"\n",
|
||||
"рддрд╛рд░реНрдХрд┐рдХ рдЕрдиреБрдорд╛рди рдХреЗ рд▓рд┐рдП, рд╣рдо [OWL-RL](https://github.com/RDFLib/OWL-RL) рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рд╣рдореЗрдВ RDF рдЧреНрд░рд╛рдл рдХрд╛ **Closure** рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдпрд╛рдиреА рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдФрд░ рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЬреЛ рдЕрдиреБрдорд╛рдирд┐рдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Requirement already satisfied: rdflib in /home/rg/anaconda3/envs/ai4beg/lib/python3.11/site-packages (6.3.2)\n",
|
||||
"Requirement already satisfied: isodate<0.7.0,>=0.6.0 in /home/rg/anaconda3/envs/ai4beg/lib/python3.11/site-packages (from rdflib) (0.6.1)\n",
|
||||
"Requirement already satisfied: pyparsing<4,>=2.1.0 in /home/rg/anaconda3/envs/ai4beg/lib/python3.11/site-packages (from rdflib) (3.0.9)\n",
|
||||
"Requirement already satisfied: six in /home/rg/anaconda3/envs/ai4beg/lib/python3.11/site-packages (from isodate<0.7.0,>=0.6.0->rdflib) (1.16.0)\n",
|
||||
"Collecting git+https://github.com/RDFLib/OWL-RL.git\n",
|
||||
" Cloning https://github.com/RDFLib/OWL-RL.git to /tmp/pip-req-build-lbfzwi3m\n",
|
||||
" Running command git clone --filter=blob:none --quiet https://github.com/RDFLib/OWL-RL.git /tmp/pip-req-build-lbfzwi3m\n",
|
||||
" Resolved https://github.com/RDFLib/OWL-RL.git to commit a77e1791b88b54aace609bc6000aac14c7add4ff\n",
|
||||
" Preparing metadata (setup.py) ... \u001b[?25ldone\n",
|
||||
"\u001b[?25hRequirement already satisfied: rdflib>=6.0.2 in /home/rg/anaconda3/envs/ai4beg/lib/python3.11/site-packages (from owlrl==6.0.2) (6.3.2)\n",
|
||||
"Requirement already satisfied: isodate<0.7.0,>=0.6.0 in /home/rg/anaconda3/envs/ai4beg/lib/python3.11/site-packages (from rdflib>=6.0.2->owlrl==6.0.2) (0.6.1)\n",
|
||||
"Requirement already satisfied: pyparsing<4,>=2.1.0 in /home/rg/anaconda3/envs/ai4beg/lib/python3.11/site-packages (from rdflib>=6.0.2->owlrl==6.0.2) (3.0.9)\n",
|
||||
"Requirement already satisfied: six in /home/rg/anaconda3/envs/ai4beg/lib/python3.11/site-packages (from isodate<0.7.0,>=0.6.0->rdflib>=6.0.2->owlrl==6.0.2) (1.16.0)\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"!{sys.executable} -m pip install rdflib\n",
|
||||
"!{sys.executable} -m pip install git+https://github.com/RDFLib/OWL-RL.git"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдЪрд▓реЛ рдУрдиреНрдЯреЛрд▓реЙрдЬреА рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдореЗрдВ рдХрд┐рддрдиреЗ рдЯреНрд░рд┐рдкрд▓реЗрдЯреНрд╕ рд╣реИрдВ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Triplets found:669\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import rdflib\n",
|
||||
"from owlrl import DeductiveClosure, OWLRL_Extension\n",
|
||||
"\n",
|
||||
"g = rdflib.Graph()\n",
|
||||
"g.parse(\"onto.ttl\", format=\"turtle\")\n",
|
||||
"\n",
|
||||
"print(\"Triplets found:%d\" % len(g))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 12,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Triplets after inference:4246\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"DeductiveClosure(OWLRL_Extension).expand(g)\n",
|
||||
"print(\"Triplets after inference:%d\" % len(g))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### рд░рд┐рд╢реНрддреЗрджрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХреНрд╡реЗрд░реА рдХрд░рдирд╛\n",
|
||||
"\n",
|
||||
"рдЕрдм рд╣рдо рдЧреНрд░рд╛рдлрд╝ рд╕реЗ рдХреНрд╡реЗрд░реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд▓реЛрдЧреЛрдВ рдХреЗ рдмреАрдЪ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрдмрдВрдз рджреЗрдЦ рд╕рдХреЗрдВред рд╣рдо **SPARQL** рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ `query` рдореЗрдердб рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЪрд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд░рд┐рд╡рд╛рд░ рд╡реГрдХреНрд╖ рдореЗрдВ рд╕рднреА **рдЪрд╛рдЪрд╛** рджреЗрдЦрддреЗ рд╣реИрдВ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 13,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Fedor Alekseevich Romanov is uncle of Ekaterina Ivanovna Romanova\n",
|
||||
"Aleksandr I Pavlovich Romanov is uncle of Aleksandr II Nikolaevich Romanov\n",
|
||||
"Fedor Alekseevich Romanov is uncle of Anna Ivanovna Romanova\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"qres = g.query(\n",
|
||||
" \"\"\"SELECT DISTINCT ?aname ?bname\n",
|
||||
" WHERE {\n",
|
||||
" ?a fhkb:isUncleOf ?b .\n",
|
||||
" ?a rdfs:label ?aname .\n",
|
||||
" ?b rdfs:label ?bname .\n",
|
||||
" }\"\"\")\n",
|
||||
"\n",
|
||||
"for row in qres:\n",
|
||||
" print(\"%s is uncle of %s\" % row)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд╛рд░рд┐рд╡рд╛рд░рд┐рдХ рд╕рдВрдмрдВрдзреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдВрдХреЛрдЪ рди рдХрд░реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк `isAncestorOf` рд╕рдВрдмрдВрдз рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рднреА рдкреВрд░реНрд╡рдЬреЛрдВ рдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрдд рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"рдЕрдВрдд рдореЗрдВ, рдЪрд▓рд┐рдП рд╕рдлрд╛рдИ рдХрд░рддреЗ рд╣реИрдВ!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 14,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"!rm onto.ttl"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**рдЕрд╕реНрд╡реАрдХрд░рдг**: \nрдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ AI рдЕрдиреБрд╡рд╛рдж рд╕реЗрд╡рд╛ [Co-op Translator](https://github.com/Azure/co-op-translator) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрдмрдХрд┐ рд╣рдо рд╕рдЯреАрдХрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрдиреБрд╡рд╛рдж рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдпрд╛ рдЕрд╢реБрджреНрдзрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдореВрд▓ рднрд╛рд╖рд╛ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдореВрд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рд╕реНрд░реЛрдд рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдкреЗрд╢реЗрд╡рд░ рдорд╛рдирд╡ рдЕрдиреБрд╡рд╛рдж рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред рдЗрд╕ рдЕрдиреБрд╡рд╛рдж рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд┐рд╕реА рднреА рдЧрд▓рддрдлрд╣рдореА рдпрд╛ рдЧрд▓рдд рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╣рдо рдЙрддреНрддрд░рджрд╛рдпреА рдирд╣реАрдВ рд╣реИрдВред\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"interpreter": {
|
||||
"hash": "86193a1ab0ba47eac1c69c1756090baa3b420b3eea7d4aafab8b85f8b312f0c5"
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3.6",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.11.2"
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "6537d5597320e27b6052b4377b8ff8bb",
|
||||
"translation_date": "2025-08-31T14:53:49+00:00",
|
||||
"source_file": "lessons/2-Symbolic/FamilyOntology.ipynb",
|
||||
"language_code": "hi"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
|
|
@ -0,0 +1,548 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"collapsed": true
|
||||
},
|
||||
"source": [
|
||||
"## рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рдХреЙрдиреНрд╕реЗрдкреНрдЯ рдЧреНрд░рд╛рдл\n",
|
||||
"\n",
|
||||
"[Microsoft Concept Graph](https://concept.research.microsoft.com/) рдЗрдВрдЯрд░рдиреЗрдЯ рд╕реЗ рдирд┐рдХрд╛рд▓реЗ рдЧрдП рд╢рдмреНрджреЛрдВ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рд╡рд░реНрдЧреАрдХрд░рдг рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЗ рдмреАрдЪ `is-a` рд╕рдВрдмрдВрдз рд╣реЛрддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"рдХреЙрдиреНрд╕реЗрдкреНрдЯ рдЧреНрд░рд╛рдл рджреЛ рд░реВрдкреЛрдВ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ:\n",
|
||||
" * рдбрд╛рдЙрдирд▓реЛрдб рдХреЗ рд▓рд┐рдП рдмрдбрд╝рд╛ рдЯреЗрдХреНрд╕реНрдЯ рдлрд╛рдЗрд▓\n",
|
||||
" * REST API\n",
|
||||
"\n",
|
||||
"рдЖрдВрдХрдбрд╝реЗ:\n",
|
||||
" * 5401933 рдЕрджреНрд╡рд┐рддреАрдп рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдВ\n",
|
||||
" * 12551613 рдЕрджреНрд╡рд┐рддреАрдп рдЙрджрд╛рд╣рд░рдг\n",
|
||||
" * 87603947 `is-a` рд╕рдВрдмрдВрдз\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рд╡реЗрдм рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛\n",
|
||||
"\n",
|
||||
"рд╡реЗрдм рд╕реЗрд╡рд╛ рд╡рд┐рднрд┐рдиреНрди рд╕рдореВрд╣реЛрдВ рдореЗрдВ рдХрд┐рд╕реА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреЙрд▓ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА [рдпрд╣рд╛рдВ](https://concept.research.microsoft.com/Home/Api) рдЙрдкрд▓рдмреНрдз рд╣реИред \n",
|
||||
"рдпрд╣рд╛рдВ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдореВрдирд╛ URL рд╣реИ: `https://concept.research.microsoft.com/api/Concept/ScoreByProb?instance=microsoft&topK=10`\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{'company': 0.6105356614382954,\n",
|
||||
" 'vendor': 0.08858636677518003,\n",
|
||||
" 'client': 0.048239124001183784,\n",
|
||||
" 'firm': 0.045476965571668145,\n",
|
||||
" 'large company': 0.043109401203511886,\n",
|
||||
" 'organization': 0.043010752688172046,\n",
|
||||
" 'corporation': 0.035908059583703265,\n",
|
||||
" 'brand': 0.03383644076156654,\n",
|
||||
" 'software company': 0.027522935779816515,\n",
|
||||
" 'technology company': 0.023774292196902438}"
|
||||
]
|
||||
},
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import urllib\n",
|
||||
"import json\n",
|
||||
"import ssl\n",
|
||||
"\n",
|
||||
"def http(x):\n",
|
||||
" ssl._create_default_https_context = ssl._create_unverified_context\n",
|
||||
" response = urllib.request.urlopen(x)\n",
|
||||
" data = response.read()\n",
|
||||
" return data.decode('utf-8')\n",
|
||||
"\n",
|
||||
"def query(x):\n",
|
||||
" return json.loads(http(\"https://concept.research.microsoft.com/api/Concept/ScoreByProb?instance={}&topK=10\".format(urllib.parse.quote(x))))\n",
|
||||
"\n",
|
||||
"query('microsoft')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдЪрд▓реЛ рд╕рдорд╛рдЪрд╛рд░ рд╢реАрд░реНрд╖рдХреЛрдВ рдХреЛ рдореБрдЦреНрдп рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╡рд░реНрдЧреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рд╕рдорд╛рдЪрд╛рд░ рд╢реАрд░реНрд╖рдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо [NewsApi.org](http://newsapi.org) рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрдкрдирд╛ API рдХреБрдВрдЬреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреА рд╣реЛрдЧреА - рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдореБрдлреНрдд рдбреЗрд╡рд▓рдкрд░ рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдкрдВрдЬреАрдХрд░рдг рдХрд░реЗрдВред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 20,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"newsapi_key = '<your API key here>'\n",
|
||||
"def get_news(country='us'):\n",
|
||||
" res = json.loads(http(\"https://newsapi.org/v2/top-headlines?country={0}&apiKey={1}\".format(country,newsapi_key)))\n",
|
||||
" return res['articles']\n",
|
||||
"\n",
|
||||
"all_titles = [x['title'] for x in get_news('us')+get_news('gb')]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 21,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"['Covid-19 Live Updates: Vaccines and Boosters News - The New York Times',\n",
|
||||
" 'Ukrainians Flee Mariupol as Russian Forces Push to Take Port City - The Wall Street Journal',\n",
|
||||
" 'Bond Yields Jump, Stock Futures Rise After Powell Says Fed Is Ready to Be More Aggressive - The Wall Street Journal',\n",
|
||||
" 'Putin critic Alexei Navalny found guilty by Russian court - New York Post ',\n",
|
||||
" \"Supreme Court nominee Ketanji Brown Jackson will face questions at confirmation hearing's second day - CNN\",\n",
|
||||
" '2 teachers killed at Swedish high school, student arrested - ABC News',\n",
|
||||
" 'Clues to Covid-19тАЩs Next Moves Come From Sewers - The Wall Street Journal',\n",
|
||||
" 'Republicans to roll dice by grilling Jackson over child-pornography sentencing decisions | TheHill - The Hill',\n",
|
||||
" 'тАШClear signтАЩ Putin considering using chemical weapons in Ukraine, claims President Biden - The Independent',\n",
|
||||
" 'NASA confirms there are 5,000 planets outside our solar system - Daily Mail',\n",
|
||||
" \"US stocks whipsawed overnight after Fed Chair Powell's remarks - Fox Business\",\n",
|
||||
" \"'We've learned absolutely nothing': Tests could again be in short supply if Covid surges - POLITICO\",\n",
|
||||
" \"Duchess of Cambridge swaps khaki jungle gear for Vampire's Wife dress on Belize trip - Daily Mail\",\n",
|
||||
" 'China searches for victims, flight recorders after first plane crash in 12 years - Reuters',\n",
|
||||
" 'Second superyacht linked to Russian oligarch Abramovich docks in Turkey - Reuters',\n",
|
||||
" 'Live updates: Russia stops talks with Japan over sanctions - The Associated Press - en Espa├▒ol',\n",
|
||||
" 'Powers Remain and Threats Lurk as WomenтАЩs Sweet 16 Is Set - The New York Times',\n",
|
||||
" 'Webb Space Telescope Begins Multi-Instrument Alignment - SciTechDaily',\n",
|
||||
" \"UConn vs UCF - NCAA women's tournament second-round highlights - March Madness\",\n",
|
||||
" 'Bucking Republican Trend, Indiana Governor Vetoes Transgender Sports Bill - The New York Times',\n",
|
||||
" \"Maggie Fox dead: Coronation Street and Shameless actress dies after 'sudden accident' - Mirror Online - The Mirror\",\n",
|
||||
" 'China plane crash тАУ live: Search for survivors continues as witness describes moment flight fell from sky - The Independent',\n",
|
||||
" 'Daniel Morgan murder: damning report condemns Met police - The Guardian',\n",
|
||||
" 'What to expect from Rishi SunakтАЩs Spring Statement - BBC.com',\n",
|
||||
" 'UK and Republic of Ireland in line to host Euro 2028 after no one else bids - The Guardian',\n",
|
||||
" \"Friends beg Vladimir Putin's 'lover' to persuade him to end Ukraine invasion - The Mirror\",\n",
|
||||
" 'Brass EyeтАЩs outtakes show the brutal TV comedy was the tip of an iceberg - The Guardian',\n",
|
||||
" \"Vladimir Putin threatens civilians to break Mariupol's spirit - The Times\",\n",
|
||||
" 'Shell U-turn on Cambo oilfield would threaten green targets, say campaigners - The Guardian',\n",
|
||||
" 'St Helens dog attack: Girl aged 17 months killed at home - BBC',\n",
|
||||
" \"PlayStation to buy 'Assassin's Creed' veteran Jade Raymond's Haven Studios - NME\",\n",
|
||||
" 'тАШClear signтАЩ Putin considering using chemical weapons in Ukraine, claims President Biden - The Independent',\n",
|
||||
" 'NASA confirms there are 5,000 planets outside our solar system - Daily Mail',\n",
|
||||
" 'Nintendo Switch finally has folders тАв Eurogamer.net - Eurogamer.net',\n",
|
||||
" 'FA to тАЬfind a solutionтАЭ as Liverpool fan group blasts тАЬshambolicтАЭ Wembley travel - This Is Anfield',\n",
|
||||
" 'Manchester United transfer news LIVE Erik ten Hag latest and Man Utd manager updates - Manchester Evening News',\n",
|
||||
" 'Inflation raises cost of UK government borrowing in February; crude oil up again тАУ business live - The Guardian',\n",
|
||||
" 'Alexei Navalny: Kremlin critic found guilty of large-scale fraud and contempt of court by Russian court - Sky News',\n",
|
||||
" \"UK prepares to nationalize Russia natural gas giant Gazprom's retail unit - Business Insider\",\n",
|
||||
" 'Zaghari-Ratcliffe: Hunt calls for inquiry into delay over Iran debt payment - The Guardian']"
|
||||
]
|
||||
},
|
||||
"execution_count": 21,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"all_titles"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рд╕рдорд╛рдЪрд╛рд░ рд╢реАрд░реНрд╖рдХреЛрдВ рд╕реЗ рд╕рдВрдЬреНрдЮрд╛ рдирд┐рдХрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `TextBlob` рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп NLP рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓ рдмрдирд╛рддреА рд╣реИред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 15,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Requirement already satisfied: textblob in c:\\winapp\\miniconda3\\lib\\site-packages (0.17.1)\n",
|
||||
"Requirement already satisfied: nltk>=3.1 in c:\\winapp\\miniconda3\\lib\\site-packages (from textblob) (3.5)\n",
|
||||
"Requirement already satisfied: joblib in c:\\winapp\\miniconda3\\lib\\site-packages (from nltk>=3.1->textblob) (1.0.1)\n",
|
||||
"Requirement already satisfied: regex in c:\\winapp\\miniconda3\\lib\\site-packages (from nltk>=3.1->textblob) (2021.11.10)\n",
|
||||
"Requirement already satisfied: tqdm in c:\\winapp\\miniconda3\\lib\\site-packages (from nltk>=3.1->textblob) (4.61.2)\n",
|
||||
"Requirement already satisfied: click in c:\\winapp\\miniconda3\\lib\\site-packages (from nltk>=3.1->textblob) (8.0.3)\n",
|
||||
"Requirement already satisfied: colorama in c:\\winapp\\miniconda3\\lib\\site-packages (from click->nltk>=3.1->textblob) (0.4.4)\n",
|
||||
"Finished.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"[nltk_data] Downloading package brown to\n",
|
||||
"[nltk_data] C:\\Users\\dmitryso\\AppData\\Roaming\\nltk_data...\n",
|
||||
"[nltk_data] Package brown is already up-to-date!\n",
|
||||
"[nltk_data] Downloading package punkt to\n",
|
||||
"[nltk_data] C:\\Users\\dmitryso\\AppData\\Roaming\\nltk_data...\n",
|
||||
"[nltk_data] Package punkt is already up-to-date!\n",
|
||||
"[nltk_data] Downloading package wordnet to\n",
|
||||
"[nltk_data] C:\\Users\\dmitryso\\AppData\\Roaming\\nltk_data...\n",
|
||||
"[nltk_data] Package wordnet is already up-to-date!\n",
|
||||
"[nltk_data] Downloading package averaged_perceptron_tagger to\n",
|
||||
"[nltk_data] C:\\Users\\dmitryso\\AppData\\Roaming\\nltk_data...\n",
|
||||
"[nltk_data] Package averaged_perceptron_tagger is already up-to-\n",
|
||||
"[nltk_data] date!\n",
|
||||
"[nltk_data] Downloading package conll2000 to\n",
|
||||
"[nltk_data] C:\\Users\\dmitryso\\AppData\\Roaming\\nltk_data...\n",
|
||||
"[nltk_data] Package conll2000 is already up-to-date!\n",
|
||||
"[nltk_data] Downloading package movie_reviews to\n",
|
||||
"[nltk_data] C:\\Users\\dmitryso\\AppData\\Roaming\\nltk_data...\n",
|
||||
"[nltk_data] Package movie_reviews is already up-to-date!\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import sys\n",
|
||||
"!{sys.executable} -m pip install textblob\n",
|
||||
"!{sys.executable} -m textblob.download_corpora\n",
|
||||
"from textblob import TextBlob"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 22,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{'covid-19 live updates': 1,\n",
|
||||
" 'vaccines': 1,\n",
|
||||
" 'boosters': 1,\n",
|
||||
" 'york': 4,\n",
|
||||
" 'ukrainians flee mariupol': 1,\n",
|
||||
" 'forces push': 1,\n",
|
||||
" 'port city': 1,\n",
|
||||
" 'wall street journal': 3,\n",
|
||||
" 'bond yields': 1,\n",
|
||||
" 'futures rise': 1,\n",
|
||||
" 'powell says fed': 1,\n",
|
||||
" 'ready': 1,\n",
|
||||
" 'be': 1,\n",
|
||||
" 'aggressive': 1,\n",
|
||||
" 'putin': 3,\n",
|
||||
" 'alexei navalny': 2,\n",
|
||||
" 'russian': 2,\n",
|
||||
" 'supreme court nominee': 1,\n",
|
||||
" 'ketanji brown jackson': 1,\n",
|
||||
" \"confirmation hearing 's\": 1,\n",
|
||||
" 'cnn': 1,\n",
|
||||
" 'swedish': 1,\n",
|
||||
" 'high school': 1,\n",
|
||||
" 'abc': 1,\n",
|
||||
" 'clues': 1,\n",
|
||||
" 'covid-19': 1,\n",
|
||||
" 'тАЩ s': 2,\n",
|
||||
" 'moves': 1,\n",
|
||||
" 'sewers': 1,\n",
|
||||
" 'roll dice': 1,\n",
|
||||
" 'jackson': 1,\n",
|
||||
" 'decisions |': 1,\n",
|
||||
" 'thehill': 1,\n",
|
||||
" 'clear': 2,\n",
|
||||
" 'chemical weapons': 2,\n",
|
||||
" 'ukraine': 3,\n",
|
||||
" 'claims president': 2,\n",
|
||||
" 'biden': 2,\n",
|
||||
" 'nasa': 2,\n",
|
||||
" 'solar system': 2,\n",
|
||||
" 'daily mail': 3,\n",
|
||||
" 'us stocks': 1,\n",
|
||||
" 'fed chair powell': 1,\n",
|
||||
" \"'s remarks\": 1,\n",
|
||||
" 'fox': 1,\n",
|
||||
" \"'we 've\": 1,\n",
|
||||
" 'tests': 1,\n",
|
||||
" 'covid': 1,\n",
|
||||
" 'politico': 1,\n",
|
||||
" 'duchess': 1,\n",
|
||||
" 'cambridge': 1,\n",
|
||||
" 'swaps khaki jungle gear': 1,\n",
|
||||
" 'vampire': 1,\n",
|
||||
" 'wife': 1,\n",
|
||||
" 'belize': 1,\n",
|
||||
" 'china': 2,\n",
|
||||
" 'flight recorders': 1,\n",
|
||||
" 'plane crash': 1,\n",
|
||||
" 'reuters': 2,\n",
|
||||
" 'russian oligarch': 1,\n",
|
||||
" 'abramovich': 1,\n",
|
||||
" 'live': 1,\n",
|
||||
" 'russia': 2,\n",
|
||||
" 'stops talks': 1,\n",
|
||||
" 'japan': 1,\n",
|
||||
" 'espa├▒ol': 1,\n",
|
||||
" 'powers remain': 1,\n",
|
||||
" 'threats lurk': 1,\n",
|
||||
" 'set': 1,\n",
|
||||
" 'webb': 1,\n",
|
||||
" 'telescope begins multi-instrument alignment': 1,\n",
|
||||
" 'scitechdaily': 1,\n",
|
||||
" 'uconn': 1,\n",
|
||||
" 'ucf': 1,\n",
|
||||
" 'ncaa': 1,\n",
|
||||
" \"women 's tournament second-round highlights\": 1,\n",
|
||||
" 'march madness': 1,\n",
|
||||
" 'bucking republican trend': 1,\n",
|
||||
" 'indiana': 1,\n",
|
||||
" 'vetoes transgender': 1,\n",
|
||||
" 'bill': 1,\n",
|
||||
" 'maggie fox': 1,\n",
|
||||
" 'coronation': 1,\n",
|
||||
" 'shameless': 1,\n",
|
||||
" \"'sudden accident\": 1,\n",
|
||||
" 'mirror online': 1,\n",
|
||||
" 'mirror': 2,\n",
|
||||
" 'plane crash тАУ': 1,\n",
|
||||
" 'search': 1,\n",
|
||||
" 'moment flight': 1,\n",
|
||||
" 'daniel morgan': 1,\n",
|
||||
" 'report condemns': 1,\n",
|
||||
" 'met': 1,\n",
|
||||
" 'guardian': 6,\n",
|
||||
" 'rishi sunak': 1,\n",
|
||||
" 'тАЩ s spring': 1,\n",
|
||||
" 'statement': 1,\n",
|
||||
" 'bbc.com': 1,\n",
|
||||
" 'uk': 3,\n",
|
||||
" 'ireland': 1,\n",
|
||||
" 'euro': 1,\n",
|
||||
" 'vladimir putin': 2,\n",
|
||||
" \"'s 'lover\": 1,\n",
|
||||
" 'brass eye': 1,\n",
|
||||
" 'тАЩ s outtakes': 1,\n",
|
||||
" 'brutal tv comedy': 1,\n",
|
||||
" 'threatens civilians': 1,\n",
|
||||
" 'mariupol': 1,\n",
|
||||
" \"'s spirit\": 1,\n",
|
||||
" 'shell u-turn': 1,\n",
|
||||
" 'cambo': 1,\n",
|
||||
" 'green targets': 1,\n",
|
||||
" 'st helens': 1,\n",
|
||||
" 'dog attack': 1,\n",
|
||||
" 'girl': 1,\n",
|
||||
" 'bbc': 1,\n",
|
||||
" 'playstation': 1,\n",
|
||||
" \"'assassin 's\": 1,\n",
|
||||
" 'creed': 1,\n",
|
||||
" 'jade raymond': 1,\n",
|
||||
" 'haven studios': 1,\n",
|
||||
" 'nme': 1,\n",
|
||||
" 'nintendo switch': 1,\n",
|
||||
" 'folders тАв': 1,\n",
|
||||
" 'eurogamer.net': 2,\n",
|
||||
" 'fa': 1,\n",
|
||||
" 'solution тАЭ': 1,\n",
|
||||
" 'liverpool': 1,\n",
|
||||
" 'fan group blasts тАЬ shambolic тАЭ': 1,\n",
|
||||
" 'wembley': 1,\n",
|
||||
" 'anfield': 1,\n",
|
||||
" 'manchester': 1,\n",
|
||||
" 'live erik': 1,\n",
|
||||
" 'hag': 1,\n",
|
||||
" 'utd': 1,\n",
|
||||
" 'manager updates': 1,\n",
|
||||
" 'manchester evening': 1,\n",
|
||||
" 'inflation': 1,\n",
|
||||
" 'government borrowing': 1,\n",
|
||||
" 'february': 1,\n",
|
||||
" 'crude oil': 1,\n",
|
||||
" 'тАУ business': 1,\n",
|
||||
" 'kremlin': 1,\n",
|
||||
" 'large-scale fraud': 1,\n",
|
||||
" 'sky': 1,\n",
|
||||
" 'natural gas': 1,\n",
|
||||
" 'gazprom': 1,\n",
|
||||
" 'retail unit': 1,\n",
|
||||
" 'insider': 1,\n",
|
||||
" 'zaghari-ratcliffe': 1,\n",
|
||||
" 'hunt': 1,\n",
|
||||
" 'iran': 1,\n",
|
||||
" 'debt payment': 1}"
|
||||
]
|
||||
},
|
||||
"execution_count": 22,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"w = {}\n",
|
||||
"for x in all_titles:\n",
|
||||
" for n in TextBlob(x).noun_phrases:\n",
|
||||
" if n in w:\n",
|
||||
" w[n].append(x)\n",
|
||||
" else:\n",
|
||||
" w[n]=[x]\n",
|
||||
"{ x:len(w[x]) for x in w.keys()}"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрдЬреНрдЮрд╛рдПрдВ рд╣рдореЗрдВ рдмрдбрд╝реЗ рд╡рд┐рд╖рдпрдЧрдд рд╕рдореВрд╣ рдирд╣реАрдВ рджреЗрддреА рд╣реИрдВред рдЖрдЗрдП рд╕рдВрдЬреНрдЮрд╛рдУрдВ рдХреЛ рдЕрд╡рдзрд╛рд░рдгрд╛ рдЧреНрд░рд╛рдл рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрджреЛрдВ рд╕реЗ рдмрджрд▓реЗрдВред рдЗрд╕рдореЗрдВ рдХреБрдЫ рд╕рдордп рд▓рдЧреЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдЬреНрдЮрд╛ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдХреЗ рд▓рд┐рдП REST рдХреЙрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 23,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"w = {}\n",
|
||||
"for x in all_titles:\n",
|
||||
" for noun in TextBlob(x).noun_phrases:\n",
|
||||
" terms = query(noun.replace(' ','%20'))\n",
|
||||
" for term in [u for u in terms.keys() if terms[u]>0.1]:\n",
|
||||
" if term in w:\n",
|
||||
" w[term].append(x)\n",
|
||||
" else:\n",
|
||||
" w[term]=[x]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 24,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{'city': 9,\n",
|
||||
" 'brand': 4,\n",
|
||||
" 'place': 9,\n",
|
||||
" 'town': 4,\n",
|
||||
" 'factor': 4,\n",
|
||||
" 'film': 4,\n",
|
||||
" 'nation': 11,\n",
|
||||
" 'state': 5,\n",
|
||||
" 'person': 4,\n",
|
||||
" 'organization': 5,\n",
|
||||
" 'publication': 10,\n",
|
||||
" 'market': 5,\n",
|
||||
" 'economy': 4,\n",
|
||||
" 'company': 6,\n",
|
||||
" 'newspaper': 6,\n",
|
||||
" 'relationship': 6}"
|
||||
]
|
||||
},
|
||||
"execution_count": 24,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"{ x:len(w[x]) for x in w.keys() if len(w[x])>3}"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 27,
|
||||
"metadata": {
|
||||
"trusted": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"\n",
|
||||
"ECONOMY:\n",
|
||||
"China searches for victims, flight recorders after first plane crash in 12 years - Reuters\n",
|
||||
"Live updates: Russia stops talks with Japan over sanctions - The Associated Press - en Espa├▒ol\n",
|
||||
"China plane crash тАУ live: Search for survivors continues as witness describes moment flight fell from sky - The Independent\n",
|
||||
"UK prepares to nationalize Russia natural gas giant Gazprom's retail unit - Business Insider\n",
|
||||
"\n",
|
||||
"NATION:\n",
|
||||
"тАШClear signтАЩ Putin considering using chemical weapons in Ukraine, claims President Biden - The Independent\n",
|
||||
"Duchess of Cambridge swaps khaki jungle gear for Vampire's Wife dress on Belize trip - Daily Mail\n",
|
||||
"China searches for victims, flight recorders after first plane crash in 12 years - Reuters\n",
|
||||
"Live updates: Russia stops talks with Japan over sanctions - The Associated Press - en Espa├▒ol\n",
|
||||
"Live updates: Russia stops talks with Japan over sanctions - The Associated Press - en Espa├▒ol\n",
|
||||
"China plane crash тАУ live: Search for survivors continues as witness describes moment flight fell from sky - The Independent\n",
|
||||
"UK and Republic of Ireland in line to host Euro 2028 after no one else bids - The Guardian\n",
|
||||
"Friends beg Vladimir Putin's 'lover' to persuade him to end Ukraine invasion - The Mirror\n",
|
||||
"тАШClear signтАЩ Putin considering using chemical weapons in Ukraine, claims President Biden - The Independent\n",
|
||||
"UK prepares to nationalize Russia natural gas giant Gazprom's retail unit - Business Insider\n",
|
||||
"Zaghari-Ratcliffe: Hunt calls for inquiry into delay over Iran debt payment - The Guardian\n",
|
||||
"\n",
|
||||
"PERSON:\n",
|
||||
"тАШClear signтАЩ Putin considering using chemical weapons in Ukraine, claims President Biden - The Independent\n",
|
||||
"Duchess of Cambridge swaps khaki jungle gear for Vampire's Wife dress on Belize trip - Daily Mail\n",
|
||||
"Second superyacht linked to Russian oligarch Abramovich docks in Turkey - Reuters\n",
|
||||
"тАШClear signтАЩ Putin considering using chemical weapons in Ukraine, claims President Biden - The Independent\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"print('\\nECONOMY:\\n'+'\\n'.join(w['economy']))\n",
|
||||
"print('\\nNATION:\\n'+'\\n'.join(w['nation']))\n",
|
||||
"print('\\nPERSON:\\n'+'\\n'.join(w['person']))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**рдЕрд╕реНрд╡реАрдХрд░рдг**: \nрдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ AI рдЕрдиреБрд╡рд╛рдж рд╕реЗрд╡рд╛ [Co-op Translator](https://github.com/Azure/co-op-translator) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрдмрдХрд┐ рд╣рдо рд╕рдЯреАрдХрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрдиреБрд╡рд╛рдж рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдпрд╛ рдЕрд╢реБрджреНрдзрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдореВрд▓ рднрд╛рд╖рд╛ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдореВрд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рд╕реНрд░реЛрдд рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдкреЗрд╢реЗрд╡рд░ рдорд╛рдирд╡ рдЕрдиреБрд╡рд╛рдж рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред рдЗрд╕ рдЕрдиреБрд╡рд╛рдж рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд┐рд╕реА рднреА рдЧрд▓рддрдлрд╣рдореА рдпрд╛ рдЧрд▓рдд рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╣рдо рдЙрддреНрддрд░рджрд╛рдпреА рдирд╣реАрдВ рд╣реИрдВред\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3.7.4 64-bit (conda)",
|
||||
"metadata": {
|
||||
"interpreter": {
|
||||
"hash": "86193a1ab0ba47eac1c69c1756090baa3b420b3eea7d4aafab8b85f8b312f0c5"
|
||||
}
|
||||
},
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.9.5"
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "4087f998407d06ceb2947016ba4605d0",
|
||||
"translation_date": "2025-08-31T14:54:16+00:00",
|
||||
"source_file": "lessons/2-Symbolic/MSConceptGraph.ipynb",
|
||||
"language_code": "hi"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1,31 +1,33 @@
|
|||
<!--
|
||||
CO_OP_TRANSLATOR_METADATA:
|
||||
{
|
||||
"original_hash": "7336583e4630220c835335da640016db",
|
||||
"translation_date": "2025-08-24T10:01:06+00:00",
|
||||
"original_hash": "ba5d1eb353d20d3e7181066b3c424b99",
|
||||
"translation_date": "2025-08-31T14:21:50+00:00",
|
||||
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/lab/README.md",
|
||||
"language_code": "hi"
|
||||
}
|
||||
-->
|
||||
# рдорд▓реНрдЯреА-рдХреНрд▓рд╛рд╕ рд╡рд░реНрдЧреАрдХрд░рдг рдкрд░рд╕реЗрдкреНрдЯреНрд░реЙрди рдХреЗ рд╕рд╛рде
|
||||
# рдкрд░рд╕реЗрдкреНрдЯреНрд░реЙрди рдХреЗ рд╕рд╛рде рдорд▓реНрдЯреА-рдХреНрд▓рд╛рд╕ рд╡рд░реНрдЧреАрдХрд░рдг
|
||||
|
||||
[AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners) рд╕реЗ рд▓реИрдм рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯред
|
||||
|
||||
## рдХрд╛рд░реНрдп
|
||||
|
||||
рдЗрд╕ рдкрд╛рда рдореЗрдВ рд╣рдордиреЗ MNIST рд╣рд╕реНрддрд▓рд┐рдЦрд┐рдд рдЕрдВрдХреЛрдВ рдХреЗ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рд╡рд░реНрдЧреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЬреЛ рдХреЛрдб рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдорд▓реНрдЯреА-рдХреНрд▓рд╛рд╕ рд╡рд░реНрдЧреАрдХреГрдд рдмрдирд╛рдПрдВ рдЬреЛ рдХрд┐рд╕реА рднреА рдЕрдВрдХ рдХреЛ рдкрд╣рдЪрд╛рди рд╕рдХреЗред рдЯреНрд░реЗрди рдФрд░ рдЯреЗрд╕реНрдЯ рдбреЗрдЯрд╛рд╕реЗрдЯ рдкрд░ рд╡рд░реНрдЧреАрдХрд░рдг рд╕рдЯреАрдХрддрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ, рдФрд░ рднреНрд░рдо рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВред
|
||||
рдЗрд╕ рдкрд╛рда рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЬреЛ MNIST рд╣рд╕реНрддрд▓рд┐рдЦрд┐рдд рдЕрдВрдХреЛрдВ рдХреЗ рдмрд╛рдЗрдирд░реА рд╡рд░реНрдЧреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╣реИ, рдПрдХ рдорд▓реНрдЯреА-рдХреНрд▓рд╛рд╕ рд╡рд░реНрдЧреАрдХрд░реНрддрд╛ рдмрдирд╛рдПрдВ рдЬреЛ рдХрд┐рд╕реА рднреА рдЕрдВрдХ рдХреЛ рдкрд╣рдЪрд╛рди рд╕рдХреЗред рдЯреНрд░реЗрди рдФрд░ рдЯреЗрд╕реНрдЯ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдкрд░ рд╡рд░реНрдЧреАрдХрд░рдг рдХреА рд╕рдЯреАрдХрддрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ, рдФрд░ рдХрдиреНрдлреНрдпреВрдЬрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВред
|
||||
|
||||
## рд╕рдВрдХреЗрдд
|
||||
## рд╕реБрдЭрд╛рд╡
|
||||
|
||||
1. рдкреНрд░рддреНрдпреЗрдХ рдЕрдВрдХ рдХреЗ рд▓рд┐рдП, "рдЗрд╕ рдЕрдВрдХ рдмрдирд╛рдо рдЕрдиреНрдп рд╕рднреА рдЕрдВрдХреЛрдВ" рдХреЗ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рд╡рд░реНрдЧреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдбреЗрдЯрд╛рд╕реЗрдЯ рдмрдирд╛рдПрдВред
|
||||
1. рджреНрд╡рд┐рдЖрдзрд╛рд░реА рд╡рд░реНрдЧреАрдХрд░рдг рдХреЗ рд▓рд┐рдП 10 рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд░рд╕реЗрдкреНрдЯреНрд░реЙрди рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░реЗрдВ (рдкреНрд░рддреНрдпреЗрдХ рдЕрдВрдХ рдХреЗ рд▓рд┐рдП рдПрдХ)ред
|
||||
1. рдкреНрд░рддреНрдпреЗрдХ рдЕрдВрдХ рдХреЗ рд▓рд┐рдП, "рдпрд╣ рдЕрдВрдХ рдмрдирд╛рдо рдЕрдиреНрдп рд╕рднреА рдЕрдВрдХ" рдХреЗ рдмрд╛рдЗрдирд░реА рд╡рд░реНрдЧреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдмрдирд╛рдПрдВред
|
||||
1. рдмрд╛рдЗрдирд░реА рд╡рд░реНрдЧреАрдХрд░рдг рдХреЗ рд▓рд┐рдП 10 рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд░рд╕реЗрдкреНрдЯреНрд░реЙрди рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░реЗрдВ (рдкреНрд░рддреНрдпреЗрдХ рдЕрдВрдХ рдХреЗ рд▓рд┐рдП рдПрдХ)ред
|
||||
1. рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ рдЬреЛ рдЗрдирдкреБрдЯ рдЕрдВрдХ рдХреЛ рд╡рд░реНрдЧреАрдХреГрдд рдХрд░реЗрдЧрд╛ред
|
||||
|
||||
> **рд╕рдВрдХреЗрдд**: рдпрджрд┐ рд╣рдо рд╕рднреА 10 рдкрд░рд╕реЗрдкреНрдЯреНрд░реЙрди рдХреЗ рд╡рдЬрд╝рди рдХреЛ рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрдирдкреБрдЯ рдЕрдВрдХреЛрдВ рдкрд░ рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрд╛ рджреНрд╡рд╛рд░рд╛ рд╕рднреА 10 рдкрд░рд╕реЗрдкреНрдЯреНрд░реЙрди рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдВрдХ рдХреЛ `argmax` рдСрдкрд░реЗрд╢рди рд▓рд╛рдЧреВ рдХрд░рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рд╕реЗ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
|
||||
> **рд╕реБрдЭрд╛рд╡**: рдпрджрд┐ рд╣рдо рд╕рднреА 10 рдкрд░рд╕реЗрдкреНрдЯреНрд░реЙрдиреЛрдВ рдХреЗ рд╡рдЬрд╝рди рдХреЛ рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░реЗрдВ, рддреЛ рд╣рдо рдПрдХ рд╣реА рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрд╛ рджреНрд╡рд╛рд░рд╛ рдЗрдирдкреБрдЯ рдЕрдВрдХреЛрдВ рдкрд░ рд╕рднреА 10 рдкрд░рд╕реЗрдкреНрдЯреНрд░реЙрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдВрдХ рдХреЛ `argmax` рдСрдкрд░реЗрд╢рди рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдХреЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
|
||||
|
||||
## рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдиреЛрдЯрдмреБрдХ
|
||||
|
||||
рд▓реИрдм рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП [PerceptronMultiClass.ipynb](../../../../../../lessons/3-NeuralNetworks/03-Perceptron/lab/PerceptronMultiClass.ipynb) рдЦреЛрд▓реЗрдВред
|
||||
рд▓реИрдм рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП [PerceptronMultiClass.ipynb](PerceptronMultiClass.ipynb) рдЦреЛрд▓реЗрдВред
|
||||
|
||||
---
|
||||
|
||||
**рдЕрд╕реНрд╡реАрдХрд░рдг**:
|
||||
рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ AI рдЕрдиреБрд╡рд╛рдж рд╕реЗрд╡рд╛ [Co-op Translator](https://github.com/Azure/co-op-translator) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрдмрдХрд┐ рд╣рдо рд╕рдЯреАрдХрддрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕рд░рдд рд╣реИрдВ, рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрдиреБрд╡рд╛рдж рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдпрд╛ рдЕрд╢реБрджреНрдзрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдореВрд▓ рднрд╛рд╖рд╛ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдореВрд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рд╕реНрд░реЛрдд рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдкреЗрд╢реЗрд╡рд░ рдорд╛рдирд╡ рдЕрдиреБрд╡рд╛рдж рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред рдЗрд╕ рдЕрдиреБрд╡рд╛рдж рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд┐рд╕реА рднреА рдЧрд▓рддрдлрд╣рдореА рдпрд╛ рдЧрд▓рдд рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╣рдо рдЙрддреНрддрд░рджрд╛рдпреА рдирд╣реАрдВ рд╣реИрдВред
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,183 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# рд╣рдорд╛рд░реЗ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╕рд╛рде MNIST рдЕрдВрдХреЛрдВ рдХрд╛ рд╡рд░реНрдЧреАрдХрд░рдг\n",
|
||||
"\n",
|
||||
"[AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners) рд╕реЗ рд▓реИрдм рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯред\n",
|
||||
"\n",
|
||||
"### рдбреЗрдЯрд╛рд╕реЗрдЯ рдкрдврд╝рдирд╛\n",
|
||||
"\n",
|
||||
"рдпрд╣ рдХреЛрдб рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддрд╛ рд╣реИред рдЖрдк AI Curriculum рд░рд┐рдкреЛ рдХреА `/data` рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рд╕реЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓реА рднреА рдХреЙрдкреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {
|
||||
"tags": []
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
" % Total % Received % Xferd Average Speed Time Time Time Current\n",
|
||||
" Dload Upload Total Spent Left Speed\n",
|
||||
"\n",
|
||||
" 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\n",
|
||||
"100 9.9M 100 9.9M 0 0 9.9M 0 0:00:01 --:--:-- 0:00:01 15.8M\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"!rm *.pkl\n",
|
||||
"!wget https://raw.githubusercontent.com/microsoft/AI-For-Beginners/main/data/mnist.pkl.gz\n",
|
||||
"!gzip -d mnist.pkl.gz"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import pickle\n",
|
||||
"with open('mnist.pkl','rb') as f:\n",
|
||||
" MNIST = pickle.load(f)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"labels = MNIST['Train']['Labels']\n",
|
||||
"data = MNIST['Train']['Features']"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдбреЗрдЯрд╛ рдХрд╛ рдЖрдХрд╛рд░ рдХреНрдпрд╛ рд╣реИ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(42000, 784)"
|
||||
]
|
||||
},
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"data.shape"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### рдбреЗрдЯрд╛ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛\n",
|
||||
"\n",
|
||||
"рд╣рдо рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдФрд░ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Scikit Learn рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Train samples: 33600, test samples: 8400\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"from sklearn.model_selection import train_test_split\n",
|
||||
"\n",
|
||||
"features_train, features_test, labels_train, labels_test = train_test_split(data,labels,test_size=0.2)\n",
|
||||
"\n",
|
||||
"print(f\"Train samples: {len(features_train)}, test samples: {len(features_test)}\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### рдирд┐рд░реНрджреЗрд╢\n",
|
||||
"\n",
|
||||
"1. рдкрд╛рда рд╕реЗ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛрдб рд▓реЗрдВ рдФрд░ рдЗрд╕реЗ рдЗрд╕ рдиреЛрдЯрдмреБрдХ рдореЗрдВ рдкреЗрд╕реНрдЯ рдХрд░реЗрдВ, рдпрд╛ (рдФрд░ рдмреЗрд╣рддрд░) рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ Python рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд░рдЦреЗрдВред\n",
|
||||
"1. рдПрдХ-рд╕реНрддрд░реАрдп рдкрд░рд╕реЗрдкреНрдЯреНрд░реЙрди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ рдФрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░реЗрдВ, рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдФрд░ рд╕рддреНрдпрд╛рдкрди рд╕рдЯреАрдХрддрд╛ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рджреЗрдЦреЗрдВред\n",
|
||||
"1. рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдУрд╡рд░рдлрд┐рдЯрд┐рдВрдЧ рд╣реБрдИ рд╣реИ, рдФрд░ рд╕рдЯреАрдХрддрд╛ рд╕реБрдзрд╛рд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрдпрд░ рдкреИрд░рд╛рдореАрдЯрд░ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░реЗрдВред\n",
|
||||
"1. рдкрд┐рдЫрд▓реЗ рдЪрд░рдгреЛрдВ рдХреЛ 2- рдФрд░ 3-рд╕реНрддрд░реАрдп рдкрд░рд╕реЗрдкреНрдЯреНрд░реЙрди рдХреЗ рд▓рд┐рдП рджреЛрд╣рд░рд╛рдПрдВред рд▓реЗрдпрд░реНрд╕ рдХреЗ рдмреАрдЪ рд╡рд┐рднрд┐рдиреНрди рд╕рдХреНрд░рд┐рдпрдг рдлрд╝рдВрдХреНрд╢рдиреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред\n",
|
||||
"1. рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ:\n",
|
||||
" - рдХреНрдпрд╛ рдЗрдВрдЯрд░-рд▓реЗрдпрд░ рд╕рдХреНрд░рд┐рдпрдг рдлрд╝рдВрдХреНрд╢рди рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ?\n",
|
||||
" - рдХреНрдпрд╛ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ 2- рдпрд╛ 3-рд╕реНрддрд░реАрдп рдиреЗрдЯрд╡рд░реНрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?\n",
|
||||
" - рдХреНрдпрд╛ рдЖрдкрдиреЗ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдЕрдиреБрднрд╡ рдХреА? рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬрдм рд▓реЗрдпрд░реНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝ рдЧрдИред\n",
|
||||
" - рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╡рдЬрд╝рди рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ? рдЖрдк рд╡рдЬрд╝рди рдХреЗ рдЕрдзрд┐рдХрддрдо abs рдорд╛рди рдХреЛ epochs рдХреЗ рдореБрдХрд╛рдмрд▓реЗ рдкреНрд▓реЙрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╕рдВрдмрдВрдз рдХреЛ рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХреЗред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**рдЕрд╕реНрд╡реАрдХрд░рдг**: \nрдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ AI рдЕрдиреБрд╡рд╛рдж рд╕реЗрд╡рд╛ [Co-op Translator](https://github.com/Azure/co-op-translator) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрдмрдХрд┐ рд╣рдо рд╕рдЯреАрдХрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрдиреБрд╡рд╛рдж рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдпрд╛ рдЕрд╢реБрджреНрдзрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдореВрд▓ рднрд╛рд╖рд╛ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдореВрд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рд╕реНрд░реЛрдд рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдкреЗрд╢реЗрд╡рд░ рдорд╛рдирд╡ рдЕрдиреБрд╡рд╛рдж рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред рдЗрд╕ рдЕрдиреБрд╡рд╛рдж рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд┐рд╕реА рднреА рдЧрд▓рддрдлрд╣рдореА рдпрд╛ рдЧрд▓рдд рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╣рдо рдЙрддреНрддрд░рджрд╛рдпреА рдирд╣реАрдВ рд╣реИрдВред\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3.7.4 64-bit (conda)",
|
||||
"metadata": {
|
||||
"interpreter": {
|
||||
"hash": "86193a1ab0ba47eac1c69c1756090baa3b420b3eea7d4aafab8b85f8b312f0c5"
|
||||
}
|
||||
},
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.9.5"
|
||||
},
|
||||
"orig_nbformat": 2,
|
||||
"coopTranslator": {
|
||||
"original_hash": "6fa055f484eb5d6bdf41166a356d3abf",
|
||||
"translation_date": "2025-08-31T14:58:44+00:00",
|
||||
"source_file": "lessons/3-NeuralNetworks/04-OwnFramework/lab/MyFW_MNIST.ipynb",
|
||||
"language_code": "hi"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,108 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рдСрдкреНрдЯрд┐рдХрд▓ рдлреНрд▓реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдереЗрд▓реА рдХреА рдЧрддрд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛\n",
|
||||
"\n",
|
||||
"рдпрд╣ рд▓реИрдм [AI for Beginners Curriculum](http://aka.ms/ai-beginners) рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"[рдЗрд╕ рд╡реАрдбрд┐рдпреЛ](../../../../../../lessons/4-ComputerVision/06-IntroCV/lab/palm-movement.mp4) рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдХреА рд╣рдереЗрд▓реА рд╕реНрдерд┐рд░ рдкреГрд╖реНрдарднреВрдорд┐ рдкрд░ рдмрд╛рдИрдВ/рджрд╛рдИрдВ/рдКрдкрд░/рдиреАрдЪреЗ рдХреА рдУрд░ рд╣рд┐рд▓рддреА рд╣реИред\n",
|
||||
"\n",
|
||||
"**рдЖрдкрдХрд╛ рд▓рдХреНрд╖реНрдп** рдСрдкреНрдЯрд┐рдХрд▓ рдлреНрд▓реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╡реАрдбрд┐рдпреЛ рдХреЗ рдХреМрди рд╕реЗ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдКрдкрд░/рдиреАрдЪреЗ/рдмрд╛рдИрдВ/рджрд╛рдИрдВ рдУрд░ рдХреА рдЧрддрд┐ рд╣реИред\n",
|
||||
"\n",
|
||||
"рд▓реЗрдХреНрдЪрд░ рдореЗрдВ рдмрддрд╛рдП рдЧрдП рдЕрдиреБрд╕рд╛рд░ рд╡реАрдбрд┐рдпреЛ рдлреНрд░реЗрдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Code here"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдЕрдм, рд╡реНрдпрд╛рдЦреНрдпрд╛рди рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдЕрдиреБрд╕рд╛рд░ рд╕рдШрди рдСрдкреНрдЯрд┐рдХрд▓ рдкреНрд░рд╡рд╛рд╣ рдлреНрд░реЗрдореНрд╕ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ, рдФрд░ рд╕рдШрди рдСрдкреНрдЯрд┐рдХрд▓ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдзреНрд░реБрд╡реАрдп рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Code here"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдкреНрд░рддреНрдпреЗрдХ рдСрдкреНрдЯрд┐рдХрд▓ рдлреНрд▓реЛ рдлреНрд░реЗрдо рдХреЗ рд▓рд┐рдП рджрд┐рд╢рд╛рдУрдВ рдХрд╛ рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдо рдмрдирд╛рдПрдВред рдПрдХ рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдо рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рддрдиреЗ рд╡реЗрдХреНрдЯрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдмрд┐рди рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдЖрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдлреНрд░реЗрдо рдкрд░ рд╡рд┐рднрд┐рдиреНрди рджрд┐рд╢рд╛рдУрдВ рдХреА рдЧрддрд┐ рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред\n",
|
||||
"\n",
|
||||
"> рдЖрдк рдЙрди рд╕рднреА рд╡реЗрдХреНрдЯрд░ рдХреЛ рднреА рд╢реВрдиреНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдкрд░рд┐рдорд╛рдг рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реАрдорд╛ рд╕реЗ рдиреАрдЪреЗ рд╣реИред рдпрд╣ рд╡реАрдбрд┐рдпреЛ рдореЗрдВ рдЫреЛрдЯреА рдЕрддрд┐рд░рд┐рдХреНрдд рдЧрддрд┐рдпреЛрдВ, рдЬреИрд╕реЗ рдЖрдВрдЦреЗрдВ рдФрд░ рд╕рд┐рд░, рдХреЛ рд╣рдЯрд╛ рджреЗрдЧрд╛ред\n",
|
||||
"\n",
|
||||
"рдХреБрдЫ рдлреНрд░реЗрдореНрд╕ рдХреЗ рд▓рд┐рдП рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдо рдкреНрд▓реЙрдЯ рдХрд░реЗрдВред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Code here"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдо рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдпрд╣ рд╕рдордЭрдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЧрддрд┐ рдХреА рджрд┐рд╢рд╛ рдХреИрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВред рдЖрдкрдХреЛ рдЙрди рдмрд┐рдиреНрд╕ рдХреЛ рдЪреБрдирдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдКрдкрд░/рдиреАрдЪреЗ/рдмрд╛рдПрдБ/рджрд╛рдПрдБ рджрд┐рд╢рд╛рдУрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ, рдФрд░ рдЬреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реАрдорд╛ рд╕реЗ рдКрдкрд░ рд╣реИрдВред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Code here"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдмрдзрд╛рдИ рд╣реЛ! рдпрджрд┐ рдЖрдкрдиреЗ рдКрдкрд░ рджрд┐рдП рдЧрдП рд╕рднреА рдЪрд░рдг рдкреВрд░реЗ рдХрд░ рд▓рд┐рдП рд╣реИрдВ, рддреЛ рдЖрдкрдиреЗ рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛ рдкреВрд░реА рдХрд░ рд▓реА рд╣реИ!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**рдЕрд╕реНрд╡реАрдХрд░рдг**: \nрдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ AI рдЕрдиреБрд╡рд╛рдж рд╕реЗрд╡рд╛ [Co-op Translator](https://github.com/Azure/co-op-translator) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрдмрдХрд┐ рд╣рдо рд╕рдЯреАрдХрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрдиреБрд╡рд╛рдж рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдпрд╛ рдЕрд╢реБрджреНрдзрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдореВрд▓ рднрд╛рд╖рд╛ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдореВрд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рд╕реНрд░реЛрдд рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдкреЗрд╢реЗрд╡рд░ рдорд╛рдирд╡ рдЕрдиреБрд╡рд╛рдж рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред рдЗрд╕ рдЕрдиреБрд╡рд╛рдж рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд┐рд╕реА рднреА рдЧрд▓рддрдлрд╣рдореА рдпрд╛ рдЧрд▓рдд рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╣рдо рдЙрддреНрддрд░рджрд╛рдпреА рдирд╣реАрдВ рд╣реИрдВред\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"language_info": {
|
||||
"name": "python"
|
||||
},
|
||||
"orig_nbformat": 4,
|
||||
"coopTranslator": {
|
||||
"original_hash": "153d9e417e079bf62f8f693002d0deaf",
|
||||
"translation_date": "2025-08-31T14:42:52+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/06-IntroCV/lab/MovementDetection.ipynb",
|
||||
"language_code": "hi"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,577 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# рдЯреЗрдХреНрд╕реНрдЯ рд╡рд░реНрдЧреАрдХрд░рдг рдХрд╛рд░реНрдп\n",
|
||||
"\n",
|
||||
"рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рд╣рдо **AG_NEWS** рдбреЗрдЯрд╛рд╕реЗрдЯ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рд╕рд░рд▓ рдЯреЗрдХреНрд╕реНрдЯ рд╡рд░реНрдЧреАрдХрд░рдг рдХрд╛рд░реНрдп рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рд╕рдорд╛рдЪрд╛рд░ рд╕реБрд░реНрдЦрд┐рдпреЛрдВ рдХреЛ 4 рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдореЗрдВ рд╡рд░реНрдЧреАрдХреГрдд рдХрд░рдирд╛ рд╣реИ: рд╡рд┐рд╢реНрд╡, рдЦреЗрд▓, рд╡реНрдпрд╡рд╕рд╛рдп рдФрд░ рд╡рд┐рдЬреНрдЮрд╛рди/рддрдХрдиреАрдХред\n",
|
||||
"\n",
|
||||
"## рдбреЗрдЯрд╛рд╕реЗрдЯ\n",
|
||||
"\n",
|
||||
"рдпрд╣ рдбреЗрдЯрд╛рд╕реЗрдЯ [`torchtext`](https://github.com/pytorch/text) рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import torch\n",
|
||||
"import torchtext\n",
|
||||
"import os\n",
|
||||
"import collections\n",
|
||||
"os.makedirs('./data',exist_ok=True)\n",
|
||||
"train_dataset, test_dataset = torchtext.datasets.AG_NEWS(root='./data')\n",
|
||||
"classes = ['World', 'Sports', 'Business', 'Sci/Tech']"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдпрд╣рд╛рдБ, `train_dataset` рдФрд░ `test_dataset` рдореЗрдВ рд╕рдВрдЧреНрд░рд╣ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдХреНрд░рдорд╢рдГ рд╡рд░реНрдЧ (рдХрдХреНрд╖рд╛ рдХреА рд╕рдВрдЦреНрдпрд╛) рдФрд░ рдкрд╛рда рдХреЗ рдЬреЛрдбрд╝реЗ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(3,\n",
|
||||
" \"Wall St. Bears Claw Back Into the Black (Reuters) Reuters - Short-sellers, Wall Street's dwindling\\\\band of ultra-cynics, are seeing green again.\")"
|
||||
]
|
||||
},
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"list(train_dataset)[0]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рддреЛ, рдЪрд▓рд┐рдП рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рд╕реЗ рдкрд╣рд▓реЗ 10 рдирдИ рд╕реБрд░реНрдЦрд┐рдпрд╛рдБ рдкреНрд░рд┐рдВрдЯ рдХрд░рддреЗ рд╣реИрдВ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"**Sci/Tech** -> Wall St. Bears Claw Back Into the Black (Reuters) Reuters - Short-sellers, Wall Street's dwindling\\band of ultra-cynics, are seeing green again.\n",
|
||||
"**Sci/Tech** -> Carlyle Looks Toward Commercial Aerospace (Reuters) Reuters - Private investment firm Carlyle Group,\\which has a reputation for making well-timed and occasionally\\controversial plays in the defense industry, has quietly placed\\its bets on another part of the market.\n",
|
||||
"**Sci/Tech** -> Oil and Economy Cloud Stocks' Outlook (Reuters) Reuters - Soaring crude prices plus worries\\about the economy and the outlook for earnings are expected to\\hang over the stock market next week during the depth of the\\summer doldrums.\n",
|
||||
"**Sci/Tech** -> Iraq Halts Oil Exports from Main Southern Pipeline (Reuters) Reuters - Authorities have halted oil export\\flows from the main pipeline in southern Iraq after\\intelligence showed a rebel militia could strike\\infrastructure, an oil official said on Saturday.\n",
|
||||
"**Sci/Tech** -> Oil prices soar to all-time record, posing new menace to US economy (AFP) AFP - Tearaway world oil prices, toppling records and straining wallets, present a new economic menace barely three months before the US presidential elections.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"for i,x in zip(range(5),train_dataset):\n",
|
||||
" print(f\"**{classes[x[0]]}** -> {x[1]}\")\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдХреНрдпреЛрдВрдХрд┐ рдбреЗрдЯрд╛рд╕реЗрдЯ рдЗрдЯрд░реЗрдЯрд░ рд╣реЛрддреЗ рд╣реИрдВ, рдпрджрд┐ рд╣рдо рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рдмрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рд╣рдореЗрдВ рдЗрд╕реЗ рд╕реВрдЪреА рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"train_dataset, test_dataset = torchtext.datasets.AG_NEWS(root='./data')\n",
|
||||
"train_dataset = list(train_dataset)\n",
|
||||
"test_dataset = list(test_dataset)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рдЯреЛрдХрдирд╛рдЗрдЬрд╝реЗрд╢рди\n",
|
||||
"\n",
|
||||
"рдЕрдм рд╣рдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ **рд╕рдВрдЦреНрдпрд╛рдУрдВ** рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ рдЯреЗрдиреНрд╕рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдпрджрд┐ рд╣рдо рд╢рдмреНрдж-рд╕реНрддрд░реАрдп рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рджреЛ рдЪреАрдЬреЗрдВ рдХрд░рдиреА рд╣реЛрдВрдЧреА:\n",
|
||||
"* **рдЯреЛрдХрдирд╛рдЗрдЬрд╝рд░** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ **рдЯреЛрдХрди** рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛\n",
|
||||
"* рдЙрди рдЯреЛрдХрди рдХрд╛ рдПрдХ **рд╢рдмреНрджрдХреЛрд╢** рдмрдирд╛рдирд╛ред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"['he', 'said', 'hello']"
|
||||
]
|
||||
},
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"tokenizer = torchtext.data.utils.get_tokenizer('basic_english')\n",
|
||||
"tokenizer('He said: hello')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"counter = collections.Counter()\n",
|
||||
"for (label, line) in train_dataset:\n",
|
||||
" counter.update(tokenizer(line))\n",
|
||||
"vocab = torchtext.vocab.vocab(counter, min_freq=1)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рд╢рдмреНрджрд╛рд╡рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдкрдиреЗ рдЯреЛрдХрдирдпреБрдХреНрдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╕реЗрдЯ рдореЗрдВ рдПрдиреНрдХреЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 19,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Vocab size if 95810\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[599, 3279, 97, 1220, 329, 225, 7368]"
|
||||
]
|
||||
},
|
||||
"execution_count": 19,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"vocab_size = len(vocab)\n",
|
||||
"print(f\"Vocab size if {vocab_size}\")\n",
|
||||
"\n",
|
||||
"stoi = vocab.get_stoi() # dict to convert tokens to indices\n",
|
||||
"\n",
|
||||
"def encode(x):\n",
|
||||
" return [stoi[s] for s in tokenizer(x)]\n",
|
||||
"\n",
|
||||
"encode('I love to play with my words')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рд╢рдмреНрджреЛрдВ рдХрд╛ рдереИрд▓рд╛ (Bag of Words) рдЯреЗрдХреНрд╕реНрдЯ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡\n",
|
||||
"\n",
|
||||
"рдХреНрдпреЛрдВрдХрд┐ рд╢рдмреНрдж рдЕрд░реНрде рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВ, рдХрднреА-рдХрднреА рд╣рдо рдХреЗрд╡рд▓ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╢рдмреНрджреЛрдВ рдХреЛ рджреЗрдЦрдХрд░, рдЙрдирдХреЗ рд╡рд╛рдХреНрдп рдореЗрдВ рдХреНрд░рдо рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛, рдЯреЗрдХреНрд╕реНрдЯ рдХрд╛ рдЕрд░реНрде рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рд╕рдорд╛рдЪрд╛рд░ рд╡рд░реНрдЧреАрдХреГрдд рдХрд░ рд░рд╣реЗ рд╣реЛрдВ, рддреЛ *рдореМрд╕рдо*, *рдмрд░реНрдл* рдЬреИрд╕реЗ рд╢рдмреНрдж *рдореМрд╕рдо рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди* рдХрд╛ рд╕рдВрдХреЗрдд рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ *рд╢реЗрдпрд░*, *рдбреЙрд▓рд░* рдЬреИрд╕реЗ рд╢рдмреНрдж *рд╡рд┐рддреНрддреАрдп рд╕рдорд╛рдЪрд╛рд░* рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░реЗрдВрдЧреЗред\n",
|
||||
"\n",
|
||||
"**рд╢рдмреНрджреЛрдВ рдХрд╛ рдереИрд▓рд╛** (BoW) рд╡реЗрдХреНрдЯрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╡реЗрдХреНрдЯрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╢рдмреНрдж рдХреЛ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдЗрдВрдбреЗрдХреНрд╕ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╡реЗрдХреНрдЯрд░ рддрддреНрд╡ рдореЗрдВ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд╢рдмреНрдж рдХреА рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реЛрддреА рд╣реИред\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"> **Note**: рдЖрдк BoW рдХреЛ рдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╢рдмреНрджреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╡рди-рд╣реЙрдЯ-рдПрдиреНрдХреЛрдбреЗрдб рд╡реЗрдХреНрдЯрд░ рдХрд╛ рдпреЛрдЧ рднреА рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"рдиреАрдЪреЗ Scikit Learn рдкрд╛рдпрдерди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╢рдмреНрджреЛрдВ рдХреЗ рдереИрд▓реЗ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"array([[1, 1, 0, 2, 0, 0, 0, 0, 0]], dtype=int64)"
|
||||
]
|
||||
},
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"from sklearn.feature_extraction.text import CountVectorizer\n",
|
||||
"vectorizer = CountVectorizer()\n",
|
||||
"corpus = [\n",
|
||||
" 'I like hot dogs.',\n",
|
||||
" 'The dog ran fast.',\n",
|
||||
" 'Its hot outside.',\n",
|
||||
" ]\n",
|
||||
"vectorizer.fit_transform(corpus)\n",
|
||||
"vectorizer.transform(['My dog likes hot dogs on a hot day.']).toarray()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"AG_NEWS рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЗ рд╡реЗрдХреНрдЯрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╕реЗ рдмреИрдЧ-рдСрдл-рд╡рд░реНрдбреНрд╕ рд╡реЗрдХреНрдЯрд░ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 20,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"tensor([2., 1., 2., ..., 0., 0., 0.])\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"vocab_size = len(vocab)\n",
|
||||
"\n",
|
||||
"def to_bow(text,bow_vocab_size=vocab_size):\n",
|
||||
" res = torch.zeros(bow_vocab_size,dtype=torch.float32)\n",
|
||||
" for i in encode(text):\n",
|
||||
" if i<bow_vocab_size:\n",
|
||||
" res[i] += 1\n",
|
||||
" return res\n",
|
||||
"\n",
|
||||
"print(to_bow(train_dataset[0][1]))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **рдиреЛрдЯ:** рдпрд╣рд╛рдВ рд╣рдо рд╡реИрд╢реНрд╡рд┐рдХ `vocab_size` рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╢рдмреНрджрд╛рд╡рд▓реА рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЖрдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдЪреВрдВрдХрд┐ рдЕрдХреНрд╕рд░ рд╢рдмреНрджрд╛рд╡рд▓реА рдХрд╛ рдЖрдХрд╛рд░ рдХрд╛рдлреА рдмрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ, рд╣рдо рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╢рдмреНрджреЛрдВ рддрдХ рд╢рдмреНрджрд╛рд╡рд▓реА рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рд╕реАрдорд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред `vocab_size` рдорд╛рди рдХреЛ рдХрдо рдХрд░рдиреЗ рдФрд░ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рд╕рдЯреАрдХрддрд╛ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЖрдкрдХреЛ рдХреБрдЫ рд╕рдЯреАрдХрддрд╛ рдореЗрдВ рдЧрд┐рд░рд╛рд╡рдЯ рдХреА рдЙрдореНрдореАрдж рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рдмрджрд▓реЗ рдпрд╣ рдирд╛рдЯрдХреАрдп рдирд╣реАрдВ рд╣реЛрдЧрд╛ред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## BoW рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░ рдХрд╛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг\n",
|
||||
"\n",
|
||||
"рдЕрдм рдЬрдм рд╣рдордиреЗ рдЕрдкрдиреЗ рдЯреЗрдХреНрд╕реНрдЯ рдХрд╛ рдмреИрдЧ-рдСрдл-рд╡рд░реНрдбреНрд╕ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдмрдирд╛рдирд╛ рд╕реАрдЦ рд▓рд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдЗрдП рдЗрд╕рдХреЗ рдКрдкрд░ рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░реЗрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдкреЛрдЬрд┐рд╢рдирд▓ рд╡реЗрдХреНрдЯрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рдмреИрдЧ-рдСрдл-рд╡рд░реНрдбреНрд╕ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдЗрд╕реЗ `bowify` рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдорд╛рдирдХ рдЯреЙрд░реНрдЪ `DataLoader` рдореЗрдВ `collate_fn` рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 21,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"from torch.utils.data import DataLoader\n",
|
||||
"import numpy as np \n",
|
||||
"\n",
|
||||
"# this collate function gets list of batch_size tuples, and needs to \n",
|
||||
"# return a pair of label-feature tensors for the whole minibatch\n",
|
||||
"def bowify(b):\n",
|
||||
" return (\n",
|
||||
" torch.LongTensor([t[0]-1 for t in b]),\n",
|
||||
" torch.stack([to_bow(t[1]) for t in b])\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
"train_loader = DataLoader(train_dataset, batch_size=16, collate_fn=bowify, shuffle=True)\n",
|
||||
"test_loader = DataLoader(test_dataset, batch_size=16, collate_fn=bowify, shuffle=True)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдЕрдм рдЪрд▓рд┐рдП рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд░реНрдЧреАрдХрд░рдг рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд░реИрдЦрд┐рдХ рдкрд░рдд рд╣реЛрддреА рд╣реИред рдЗрдирдкреБрдЯ рд╡реЗрдХреНрдЯрд░ рдХрд╛ рдЖрдХрд╛рд░ `vocab_size` рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдЖрдХрд╛рд░ рд╡рд░реНрдЧреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ (4) рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╡рд░реНрдЧреАрдХрд░рдг рдХрд╛рд░реНрдп рдХреЛ рд╣рд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЕрдВрддрд┐рдо рд╕рдХреНрд░рд┐рдпрддрд╛ рдлрд╝рдВрдХреНрд╢рди `LogSoftmax()` рд╣реИред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 22,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"net = torch.nn.Sequential(torch.nn.Linear(vocab_size,4),torch.nn.LogSoftmax(dim=1))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдЕрдм рд╣рдо рдорд╛рдирдХ PyTorch рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд▓реВрдк рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗред рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░рд╛ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХрд╛рдлреА рдмрдбрд╝рд╛ рд╣реИ, рд╢рд┐рдХреНрд╖рдг рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдпреБрдЧ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдХрднреА-рдХрднреА рдПрдХ рдпреБрдЧ рд╕реЗ рднреА рдХрдо (рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `epoch_size` рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рд╣рдо рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рд╕рдВрдЪрд┐рдд рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕рдЯреАрдХрддрд╛ рдХреА рднреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдВрдЧреЗ; рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдХреА рдЖрд╡реГрддреНрддрд┐ `report_freq` рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреА рдЬрд╛рддреА рд╣реИред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 24,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def train_epoch(net,dataloader,lr=0.01,optimizer=None,loss_fn = torch.nn.NLLLoss(),epoch_size=None, report_freq=200):\n",
|
||||
" optimizer = optimizer or torch.optim.Adam(net.parameters(),lr=lr)\n",
|
||||
" net.train()\n",
|
||||
" total_loss,acc,count,i = 0,0,0,0\n",
|
||||
" for labels,features in dataloader:\n",
|
||||
" optimizer.zero_grad()\n",
|
||||
" out = net(features)\n",
|
||||
" loss = loss_fn(out,labels) #cross_entropy(out,labels)\n",
|
||||
" loss.backward()\n",
|
||||
" optimizer.step()\n",
|
||||
" total_loss+=loss\n",
|
||||
" _,predicted = torch.max(out,1)\n",
|
||||
" acc+=(predicted==labels).sum()\n",
|
||||
" count+=len(labels)\n",
|
||||
" i+=1\n",
|
||||
" if i%report_freq==0:\n",
|
||||
" print(f\"{count}: acc={acc.item()/count}\")\n",
|
||||
" if epoch_size and count>epoch_size:\n",
|
||||
" break\n",
|
||||
" return total_loss.item()/count, acc.item()/count"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 25,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"3200: acc=0.8028125\n",
|
||||
"6400: acc=0.8371875\n",
|
||||
"9600: acc=0.8534375\n",
|
||||
"12800: acc=0.85765625\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(0.026090790722161722, 0.8620069296375267)"
|
||||
]
|
||||
},
|
||||
"execution_count": 25,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"train_epoch(net,train_loader,epoch_size=15000)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рдмрд╛рдИрдЧреНрд░рд╛рдореНрд╕, рдЯреНрд░рд╛рдИрдЧреНрд░рд╛рдореНрд╕ рдФрд░ рдПрди-рдЧреНрд░рд╛рдореНрд╕\n",
|
||||
"\n",
|
||||
"рдмреИрдЧ рдСрдл рд╡рд░реНрдбреНрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдПрдХ рд╕реАрдорд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХреБрдЫ рд╢рдмреНрдж рдмрд╣реБ-рд╢рдмреНрдж рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 'рд╣реЙрдЯ рдбреЙрдЧ' рд╢рдмреНрдж рдХрд╛ рдЕрд░реНрде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реЛрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ 'рд╣реЙрдЯ' рдФрд░ 'рдбреЙрдЧ' рд╢рдмреНрдж рдЕрдиреНрдп рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрд░реНрде рд░рдЦрддреЗ рд╣реИрдВред рдпрджрд┐ рд╣рдо рд╣рдореЗрд╢рд╛ 'рд╣реЙрдЯ' рдФрд░ 'рдбреЙрдЧ' рд╢рдмреНрджреЛрдВ рдХреЛ рдПрдХ рд╣реА рд╡реЗрдХреНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ, рддреЛ рдпрд╣ рд╣рдорд╛рд░реЗ рдореЙрдбрд▓ рдХреЛ рднреНрд░рдорд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, **рдПрди-рдЧреНрд░рд╛рдо рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡** рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдХреНрд╕рд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╡рд░реНрдЧреАрдХрд░рдг рдХреА рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рд╢рдмреНрдж, рджреНрд╡рд┐-рд╢рдмреНрдж рдпрд╛ рддреНрд░рд┐-рд╢рдмреНрдж рдХреА рдЖрд╡реГрддреНрддрд┐ рд╡рд░реНрдЧреАрдХрд░рдгрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрд╛рдИрдЧреНрд░рд╛рдо рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ, рд╣рдо рдореВрд▓ рд╢рдмреНрджреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕рднреА рд╢рдмреНрдж рдпреБрдЧреНрдореЛрдВ рдХреЛ рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ рдЬреЛрдбрд╝реЗрдВрдЧреЗред\n",
|
||||
"\n",
|
||||
"рдиреАрдЪреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ Scikit Learn рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╛рдИрдЧреНрд░рд╛рдо рдмреИрдЧ рдСрдл рд╡рд░реНрдбреНрд╕ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 26,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Vocabulary:\n",
|
||||
" {'i': 7, 'like': 11, 'hot': 4, 'dogs': 2, 'i like': 8, 'like hot': 12, 'hot dogs': 5, 'the': 16, 'dog': 0, 'ran': 14, 'fast': 3, 'the dog': 17, 'dog ran': 1, 'ran fast': 15, 'its': 9, 'outside': 13, 'its hot': 10, 'hot outside': 6}\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"array([[1, 0, 1, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]],\n",
|
||||
" dtype=int64)"
|
||||
]
|
||||
},
|
||||
"execution_count": 26,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"bigram_vectorizer = CountVectorizer(ngram_range=(1, 2), token_pattern=r'\\b\\w+\\b', min_df=1)\n",
|
||||
"corpus = [\n",
|
||||
" 'I like hot dogs.',\n",
|
||||
" 'The dog ran fast.',\n",
|
||||
" 'Its hot outside.',\n",
|
||||
" ]\n",
|
||||
"bigram_vectorizer.fit_transform(corpus)\n",
|
||||
"print(\"Vocabulary:\\n\",bigram_vectorizer.vocabulary_)\n",
|
||||
"bigram_vectorizer.transform(['My dog likes hot dogs on a hot day.']).toarray()\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"N-gram рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдореБрдЦреНрдп рдХрдореА рдпрд╣ рд╣реИ рдХрд┐ рд╢рдмреНрджрд╛рд╡рд▓реА рдХрд╛ рдЖрдХрд╛рд░ рдмрд╣реБрдд рддреЗрдЬреА рд╕реЗ рдмрдврд╝рдиреЗ рд▓рдЧрддрд╛ рд╣реИред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рд╣рдореЗрдВ N-gram рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рдХреБрдЫ рдЖрдпрд╛рдо-рдШрдЯрд╛рдиреЗ рдХреА рддрдХрдиреАрдХреЛрдВ, рдЬреИрд╕реЗ *embeddings*, рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рди рдкрд░ рд╣рдо рдЕрдЧрд▓реЗ рдпреВрдирд┐рдЯ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗред\n",
|
||||
"\n",
|
||||
"рд╣рдорд╛рд░реЗ **AG News** рдбреЗрдЯрд╛рд╕реЗрдЯ рдореЗрдВ N-gram рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ ngram рд╢рдмреНрджрд╛рд╡рд▓реА рдмрдирд╛рдиреА рд╣реЛрдЧреА:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 27,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Bigram vocabulary length = 1308842\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"counter = collections.Counter()\n",
|
||||
"for (label, line) in train_dataset:\n",
|
||||
" l = tokenizer(line)\n",
|
||||
" counter.update(torchtext.data.utils.ngrams_iterator(l,ngrams=2))\n",
|
||||
" \n",
|
||||
"bi_vocab = torchtext.vocab.vocab(counter, min_freq=1)\n",
|
||||
"\n",
|
||||
"print(\"Bigram vocabulary length = \",len(bi_vocab))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рд╣рдо рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░ рдХреЛ рдЯреНрд░реЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрдореЛрд░реА рдХреЗ рд▓рд┐рд╣рд╛рдЬ рд╕реЗ рдмрд╣реБрдд рдЕрдХреНрд╖рдо рд╣реЛрдЧрд╛ред рдЕрдЧрд▓реЗ рдпреВрдирд┐рдЯ рдореЗрдВ, рд╣рдо рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд┐рдЧреНрд░рд╛рдо рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░ рдХреЛ рдЯреНрд░реЗрди рдХрд░реЗрдВрдЧреЗред\n",
|
||||
"\n",
|
||||
"> **рдиреЛрдЯ:** рдЖрдк рдХреЗрд╡рд▓ рдЙрдиреНрд╣реАрдВ ngrams рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЖрддреЗ рд╣реИрдВред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ рдХрдо рдмрд╛рд░ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдмрд┐рдЧреНрд░рд╛рдореНрд╕ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдП, рдФрд░ рдбрд╛рдЗрдореЗрдВрд╢рдирд▓рд┐рдЯреА рдХреЛ рдХрд╛рдлреА рд╣рдж рддрдХ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, `min_freq` рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЙрдЪреНрдЪ рдорд╛рди рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ, рдФрд░ рд╢рдмреНрджрд╛рд╡рд▓реА рдХреА рд▓рдВрдмрд╛рдИ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЛ рджреЗрдЦреЗрдВред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рдЯрд░реНрдо рдлреНрд░реАрдХреНрд╡реЗрдВрд╕реА рдЗрдирд╡рд░реНрд╕ рдбреЙрдХреНрдпреВрдореЗрдВрдЯ рдлреНрд░реАрдХреНрд╡реЗрдВрд╕реА (TF-IDF)\n",
|
||||
"\n",
|
||||
"BoW (рдмреИрдЧ рдСрдл рд╡рд░реНрдбреНрд╕) рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ, рд╢рдмреНрджреЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЪрд╛рд╣реЗ рд╡рд╣ рд╢рдмреНрдж рдХреЛрдИ рднреА рд╣реЛред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрдж рдЬреИрд╕реЗ *a*, *in* рдЖрджрд┐ рд╡рд░реНрдЧреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЙрддрдиреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реЛрддреЗ рдЬрд┐рддрдиреЗ рдХрд┐ рд╡рд┐рд╢реЗрд╖ рд╢рдмреНрджред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрдзрд┐рдХрд╛рдВрд╢ NLP рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж рдЕрдиреНрдп рд╢рдмреНрджреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реЛрддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"**TF-IDF** рдХрд╛ рдорддрд▓рдм рд╣реИ **рдЯрд░реНрдо рдлреНрд░реАрдХреНрд╡реЗрдВрд╕реАтАУрдЗрдирд╡рд░реНрд╕ рдбреЙрдХреНрдпреВрдореЗрдВрдЯ рдлреНрд░реАрдХреНрд╡реЗрдВрд╕реА**ред рдпрд╣ рдмреИрдЧ рдСрдл рд╡рд░реНрдбреНрд╕ рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХрд┐рд╕реА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд╢рдмреНрдж рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рджрд░реНрд╢рд╛рдиреЗ рд╡рд╛рд▓реЗ 0/1 рдмрд╛рдЗрдирд░реА рдорд╛рди рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдлреНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХреЙрд░реНрдкрд╕ рдореЗрдВ рд╢рдмреНрдж рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЖрд╡реГрддреНрддрд┐ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ, рдХрд┐рд╕реА рд╢рдмреНрдж $i$ рдХрд╛ рд╡рдЬрди $w_{ij}$ рдХрд┐рд╕реА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ $j$ рдореЗрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:\n",
|
||||
"$$\n",
|
||||
"w_{ij} = tf_{ij}\\times\\log({N\\over df_i})\n",
|
||||
"$$\n",
|
||||
"рдЬрд╣рд╛рдВ:\n",
|
||||
"* $tf_{ij}$ рдХрд┐рд╕реА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ $j$ рдореЗрдВ рд╢рдмреНрдж $i$ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рдпрд╛рдиреА рд╡рд╣ BoW рдорд╛рди рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд╣рд▓реЗ рджреЗрдЦрд╛ рдерд╛\n",
|
||||
"* $N$ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рд╣реИ\n",
|
||||
"* $df_i$ рдкреВрд░реЗ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╢рдмреНрдж $i$ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ\n",
|
||||
"\n",
|
||||
"TF-IDF рдорд╛рди $w_{ij}$ рдХрд┐рд╕реА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд╢рдмреНрдж рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЕрдиреБрдкрд╛рдд рдореЗрдВ рдмрдврд╝рддрд╛ рд╣реИ рдФрд░ рдХреЙрд░реНрдкрд╕ рдореЗрдВ рдЙрд╕ рд╢рдмреНрдж рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рд╕рдорд╛рдпреЛрдЬрд┐рдд рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЛ рд╕рдВрддреБрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рд╢рдмреНрдж рдЕрдиреНрдп рд╢рдмреНрджреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдмрд╛рд░ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдХреЛрдИ рд╢рдмреНрдж *рд╣рд░* рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рддреЛ $df_i=N$, рдФрд░ $w_{ij}=0$, рдФрд░ рдРрд╕реЗ рд╢рдмреНрджреЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред\n",
|
||||
"\n",
|
||||
"рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ Scikit Learn рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреЗрдХреНрд╕реНрдЯ рдХрд╛ TF-IDF рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬрд╝реЗрд╢рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 28,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"array([[0.43381609, 0. , 0.43381609, 0. , 0.65985664,\n",
|
||||
" 0.43381609, 0. , 0. , 0. , 0. ,\n",
|
||||
" 0. , 0. , 0. , 0. , 0. ,\n",
|
||||
" 0. ]])"
|
||||
]
|
||||
},
|
||||
"execution_count": 28,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"from sklearn.feature_extraction.text import TfidfVectorizer\n",
|
||||
"vectorizer = TfidfVectorizer(ngram_range=(1,2))\n",
|
||||
"vectorizer.fit_transform(corpus)\n",
|
||||
"vectorizer.transform(['My dog likes hot dogs on a hot day.']).toarray()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рдирд┐рд╖реНрдХрд░реНрд╖\n",
|
||||
"\n",
|
||||
"рд╣рд╛рд▓рд╛рдВрдХрд┐ TF-IDF рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╡рд┐рднрд┐рдиреНрди рд╢рдмреНрджреЛрдВ рдХреЛ рдЖрд╡реГрддреНрддрд┐ рднрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ рдЕрд░реНрде рдпрд╛ рдХреНрд░рдо рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реЛрддреЗ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдкреНрд░рд╕рд┐рджреНрдз рднрд╛рд╖рд╛рд╡рд┐рджреН рдЬреЗ. рдЖрд░. рдлрд░реНрде рдиреЗ 1935 рдореЗрдВ рдХрд╣рд╛ рдерд╛, \"рд╢рдмреНрдж рдХрд╛ рдкреВрд░реНрдг рдЕрд░реНрде рд╣рдореЗрд╢рд╛ рд╕рдВрджрд░реНрднрд╛рддреНрдордХ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рд╕рдВрджрд░реНрдн рд╕реЗ рдЕрд▓рдЧ рдЕрд░реНрде рдХрд╛ рдХреЛрдИ рднреА рдЕрдзреНрдпрдпрди рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рдирд╣реАрдВ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ред\" рд╣рдо рдЗрд╕ рдкрд╛рдареНрдпрдХреНрд░рдо рдореЗрдВ рдЖрдЧреЗ рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐ рднрд╛рд╖рд╛ рдореЙрдбрд▓рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рда рд╕реЗ рд╕рдВрджрд░реНрднрд╛рддреНрдордХ рдЬрд╛рдирдХрд╛рд░реА рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**рдЕрд╕реНрд╡реАрдХрд░рдг**: \nрдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ AI рдЕрдиреБрд╡рд╛рдж рд╕реЗрд╡рд╛ [Co-op Translator](https://github.com/Azure/co-op-translator) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрдмрдХрд┐ рд╣рдо рд╕рдЯреАрдХрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрдиреБрд╡рд╛рдж рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдпрд╛ рдЕрд╢реБрджреНрдзрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдореВрд▓ рднрд╛рд╖рд╛ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдореВрд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рд╕реНрд░реЛрдд рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдкреЗрд╢реЗрд╡рд░ рдорд╛рдирд╡ рдЕрдиреБрд╡рд╛рдж рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред рдЗрд╕ рдЕрдиреБрд╡рд╛рдж рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд┐рд╕реА рднреА рдЧрд▓рддрдлрд╣рдореА рдпрд╛ рдЧрд▓рдд рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╣рдо рдЙрддреНрддрд░рджрд╛рдпреА рдирд╣реАрдВ рд╣реИрдВред\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"interpreter": {
|
||||
"hash": "16af2a8bbb083ea23e5e41c7f5787656b2ce26968575d8763f2c4b17f9cd711f"
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3.8.12 ('py38')",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.8.12"
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "7b9040985e748e4e2d4c689892456ad7",
|
||||
"translation_date": "2025-08-31T15:29:56+00:00",
|
||||
"source_file": "lessons/5-NLP/13-TextRep/TextRepresentationPyTorch.ipynb",
|
||||
"language_code": "hi"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
|
|
@ -0,0 +1,647 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# рдЯреЗрдХреНрд╕реНрдЯ рд╡рд░реНрдЧреАрдХрд░рдг рдХрд╛рд░реНрдп\n",
|
||||
"\n",
|
||||
"рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ, рд╣рдо **[AG_NEWS](http://www.di.unipi.it/~gulli/AG_corpus_of_news_articles.html)** рдбреЗрдЯрд╛рд╕реЗрдЯ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рд╕рд░рд▓ рдЯреЗрдХреНрд╕реНрдЯ рд╡рд░реНрдЧреАрдХрд░рдг рдХрд╛рд░реНрдп рд╕реЗ рд╢реБрд░реБрдЖрдд рдХрд░реЗрдВрдЧреЗ: рд╣рдо рд╕рдорд╛рдЪрд╛рд░ рд╢реАрд░реНрд╖рдХреЛрдВ рдХреЛ рдЪрд╛рд░ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдореЗрдВ рд╡рд░реНрдЧреАрдХреГрдд рдХрд░реЗрдВрдЧреЗ: рд╡рд░реНрд▓реНрдб, рд╕реНрдкреЛрд░реНрдЯреНрд╕, рдмрд┐рдЬрд╝рдиреЗрд╕ рдФрд░ рд╕рд╛рдЗ/рдЯреЗрдХред\n",
|
||||
"\n",
|
||||
"## рдбреЗрдЯрд╛рд╕реЗрдЯ\n",
|
||||
"\n",
|
||||
"рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо **[TensorFlow Datasets](https://www.tensorflow.org/datasets)** API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import tensorflow as tf\n",
|
||||
"from tensorflow import keras\n",
|
||||
"import tensorflow_datasets as tfds\n",
|
||||
"\n",
|
||||
"# In this tutorial, we will be training a lot of models. In order to use GPU memory cautiously,\n",
|
||||
"# we will set tensorflow option to grow GPU memory allocation when required.\n",
|
||||
"physical_devices = tf.config.list_physical_devices('GPU') \n",
|
||||
"if len(physical_devices)>0:\n",
|
||||
" tf.config.experimental.set_memory_growth(physical_devices[0], True)\n",
|
||||
"\n",
|
||||
"dataset = tfds.load('ag_news_subset')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рд╣рдо рдЕрдм `dataset['train']` рдФрд░ `dataset['test']` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдФрд░ рдкрд░реАрдХреНрд╖рдг рднрд╛рдЧреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Length of train dataset = 120000\n",
|
||||
"Length of test dataset = 7600\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"ds_train = dataset['train']\n",
|
||||
"ds_test = dataset['test']\n",
|
||||
"\n",
|
||||
"print(f\"Length of train dataset = {len(ds_train)}\")\n",
|
||||
"print(f\"Length of test dataset = {len(ds_test)}\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдЪрд▓реЛ рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛ рд╕реЗрдЯ рд╕реЗ рдкрд╣рд▓реЗ 10 рдирдИ рд╕реБрд░реНрдЦрд┐рдпрд╛рдБ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"3 (Sci/Tech) -> b'AMD Debuts Dual-Core Opteron Processor' b'AMD #39;s new dual-core Opteron chip is designed mainly for corporate computing applications, including databases, Web services, and financial transactions.'\n",
|
||||
"1 (Sports) -> b\"Wood's Suspension Upheld (Reuters)\" b'Reuters - Major League Baseball\\\\Monday announced a decision on the appeal filed by Chicago Cubs\\\\pitcher Kerry Wood regarding a suspension stemming from an\\\\incident earlier this season.'\n",
|
||||
"2 (Business) -> b'Bush reform may have blue states seeing red' b'President Bush #39;s quot;revenue-neutral quot; tax reform needs losers to balance its winners, and people claiming the federal deduction for state and local taxes may be in administration planners #39; sights, news reports say.'\n",
|
||||
"3 (Sci/Tech) -> b\"'Halt science decline in schools'\" b'Britain will run out of leading scientists unless science education is improved, says Professor Colin Pillinger.'\n",
|
||||
"1 (Sports) -> b'Gerrard leaves practice' b'London, England (Sports Network) - England midfielder Steven Gerrard injured his groin late in Thursday #39;s training session, but is hopeful he will be ready for Saturday #39;s World Cup qualifier against Austria.'\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"classes = ['World', 'Sports', 'Business', 'Sci/Tech']\n",
|
||||
"\n",
|
||||
"for i,x in zip(range(5),ds_train):\n",
|
||||
" print(f\"{x['label']} ({classes[x['label']]}) -> {x['title']} {x['description']}\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рдЯреЗрдХреНрд╕реНрдЯ рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬреЗрд╢рди\n",
|
||||
"\n",
|
||||
"рдЕрдм рд╣рдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ **рд╕рдВрдЦреНрдпрд╛рдУрдВ** рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рдиреНрд╣реЗрдВ рдЯреЗрдиреНрд╕рд░реНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдЕрдЧрд░ рд╣рдореЗрдВ рд╢рдмреНрдж-рд╕реНрддрд░реАрдп рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЪрд╛рд╣рд┐рдП, рддреЛ рд╣рдореЗрдВ рджреЛ рдЪреАрдЬреЗрдВ рдХрд░рдиреА рд╣реЛрдВрдЧреА:\n",
|
||||
"\n",
|
||||
"* рдПрдХ **рдЯреЛрдХрдирд╛рдЗрдЬрд╝рд░** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ **рдЯреЛрдХрдиреНрд╕** рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВред\n",
|
||||
"* рдЙрди рдЯреЛрдХрдиреНрд╕ рдХрд╛ рдПрдХ **рд╢рдмреНрджрдХреЛрд╢** (рд╡реЛрдХреИрдмреБрд▓рд░реА) рдмрдирд╛рдПрдВред\n",
|
||||
"\n",
|
||||
"### рд╢рдмреНрджрдХреЛрд╢ рдХрд╛ рдЖрдХрд╛рд░ рд╕реАрдорд┐рдд рдХрд░рдирд╛\n",
|
||||
"\n",
|
||||
"AG News рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╢рдмреНрджрдХреЛрд╢ рдХрд╛ рдЖрдХрд╛рд░ рдХрд╛рдлреА рдмрдбрд╝рд╛ рд╣реИ, 100k рд╕реЗ рдЕрдзрд┐рдХ рд╢рдмреНрджред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣рдореЗрдВ рдЙрди рд╢рдмреНрджреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рдЬреЛ рдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рдмрд╣реБрдд рдХрдо рдмрд╛рд░ рдЖрддреЗ рд╣реИрдВ тАФ рдХреЗрд╡рд▓ рдХреБрдЫ рд╡рд╛рдХреНрдпреЛрдВ рдореЗрдВ рд╣реА рд╡реЗ рдореМрдЬреВрдж рд╣реЛрдВрдЧреЗ, рдФрд░ рдореЙрдбрд▓ рдЙрдирд╕реЗ рдХреБрдЫ рд╕реАрдЦ рдирд╣реАрдВ рдкрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдЫреЛрдЯрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕реАрдорд┐рдд рдХрд░рдирд╛ рд╕рдордЭрджрд╛рд░реА рд╣реИред рдпрд╣ рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬрд╝рд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдПрдХ рдЖрд░реНрдЧреНрдпреБрдореЗрдВрдЯ рдкрд╛рд╕ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:\n",
|
||||
"\n",
|
||||
"рдЗрди рджреЛрдиреЛрдВ рдЪрд░рдгреЛрдВ рдХреЛ **TextVectorization** рд▓реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдЗрдП рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬрд╝рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЗрдВрд╕реНрдЯреИрдВрд╕рд┐рдПрдЯ рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ `adapt` рдореЗрдердб рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╕рднреА рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдкрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"vocab_size = 50000\n",
|
||||
"vectorizer = keras.layers.experimental.preprocessing.TextVectorization(max_tokens=vocab_size)\n",
|
||||
"vectorizer.adapt(ds_train.take(500).map(lambda x: x['title']+' '+x['description']))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **рдиреЛрдЯ** рд╣рдо рдкреВрд░реЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рдЫреЛрдЯрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╢рдмреНрджрд╛рд╡рд▓реА рдмрдирд╛рдИ рдЬрд╛ рд╕рдХреЗред рдРрд╕рд╛ рд╣рдо рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХреЛ рддреЗрдЬ рдХрд░рдиреЗ рдФрд░ рдЖрдкрдХреЛ рдЗрдВрддрдЬрд╛рд░ рди рдХрд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдо рдпрд╣ рдЬреЛрдЦрд┐рдо рдЙрдард╛ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдкреВрд░реЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЗ рдХреБрдЫ рд╢рдмреНрдж рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ рдФрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдЗрд╕рд▓рд┐рдП, рдкреВрд░реЗ рд╢рдмреНрджрд╛рд╡рд▓реА рдЖрдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ `adapt` рдХреЗ рджреМрд░рд╛рди рдкреВрд░реЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рд╕реЗ рдЧреБрдЬрд░рдирд╛ рдЕрдВрддрд┐рдо рд╕рдЯреАрдХрддрд╛ рдХреЛ рдмрдврд╝рд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд╣реАрдВред\n",
|
||||
"\n",
|
||||
"рдЕрдм рд╣рдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╢рдмреНрджрд╛рд╡рд▓реА рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"['', '[UNK]', 'the', 'to', 'a', 'in', 'of', 'and', 'on', 'for']\n",
|
||||
"Length of vocabulary: 5335\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"vocab = vectorizer.get_vocabulary()\n",
|
||||
"vocab_size = len(vocab)\n",
|
||||
"print(vocab[:10])\n",
|
||||
"print(f\"Length of vocabulary: {vocab_size}\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд┐рд╕реА рднреА рдкрд╛рда рдХреЛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдореЗрдВ рдПрдиреНрдХреЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<tf.Tensor: shape=(7,), dtype=int64, numpy=array([ 112, 3695, 3, 304, 11, 1041, 1], dtype=int64)>"
|
||||
]
|
||||
},
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"vectorizer('I love to play with my words')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рдмреИрдЧ-рдСрдл-рд╡рд░реНрдбреНрд╕ рдЯреЗрдХреНрд╕реНрдЯ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡\n",
|
||||
"\n",
|
||||
"рдХреНрдпреЛрдВрдХрд┐ рд╢рдмреНрдж рдЕрд░реНрде рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВ, рдХрднреА-рдХрднреА рд╣рдо рдХреЗрд╡рд▓ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╢рдмреНрджреЛрдВ рдХреЛ рджреЗрдЦрдХрд░ рдХрд┐рд╕реА рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рдЕрд░реНрде рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА рд╡реЗ рд╡рд╛рдХреНрдп рдореЗрдВ рдХрд┐рд╕ рдХреНрд░рдо рдореЗрдВ рд╣реЛрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рд╕рдорд╛рдЪрд╛рд░ рд╡рд░реНрдЧреАрдХреГрдд рдХрд░ рд░рд╣реЗ рд╣реЛрдВ, рддреЛ *рдореМрд╕рдо* рдФрд░ *рдмрд░реНрдл* рдЬреИрд╕реЗ рд╢рдмреНрдж *рдореМрд╕рдо рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди* рдХрд╛ рд╕рдВрдХреЗрдд рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ *рд╢реЗрдпрд░* рдФрд░ *рдбреЙрд▓рд░* рдЬреИрд╕реЗ рд╢рдмреНрдж *рд╡рд┐рддреНрддреАрдп рд╕рдорд╛рдЪрд╛рд░* рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░реЗрдВрдЧреЗред\n",
|
||||
"\n",
|
||||
"**рдмреИрдЧ-рдСрдл-рд╡рд░реНрдбреНрд╕** (BoW) рд╡реЗрдХреНрдЯрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдФрд░ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╡реЗрдХреНрдЯрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИ рдЬрд┐рд╕реЗ рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╢рдмреНрдж рдХреЛ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдЗрдВрдбреЗрдХреНрд╕ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рд╡реЗрдХреНрдЯрд░ рддрддреНрд╡ рдореЗрдВ рджрд┐рдП рдЧрдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╢рдмреНрдж рдХреА рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реЛрддреА рд╣реИред\n",
|
||||
"\n",
|
||||
" \n",
|
||||
"\n",
|
||||
"> **Note**: рдЖрдк BoW рдХреЛ рдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╢рдмреНрджреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╡рди-рд╣реЙрдЯ-рдПрдирдХреЛрдбреЗрдб рд╡реЗрдХреНрдЯрд░ рдХрд╛ рдпреЛрдЧ рднреА рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"рдиреАрдЪреЗ Scikit Learn рдкрд╛рдпрдерди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмреИрдЧ-рдСрдл-рд╡рд░реНрдбреНрд╕ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"array([[1, 1, 0, 2, 0, 0, 0, 0, 0]], dtype=int64)"
|
||||
]
|
||||
},
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"from sklearn.feature_extraction.text import CountVectorizer\n",
|
||||
"sc_vectorizer = CountVectorizer()\n",
|
||||
"corpus = [\n",
|
||||
" 'I like hot dogs.',\n",
|
||||
" 'The dog ran fast.',\n",
|
||||
" 'Its hot outside.',\n",
|
||||
" ]\n",
|
||||
"sc_vectorizer.fit_transform(corpus)\n",
|
||||
"sc_vectorizer.transform(['My dog likes hot dogs on a hot day.']).toarray()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рд╣рдо рдКрдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП Keras рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬрд╝рд░ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рд╢рдмреНрдж рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдПрдХ рд╡рди-рд╣реЙрдЯ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдХреЗ рдФрд░ рдЙрди рд╕рднреА рд╡реЗрдХреНрдЯрд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"array([0., 5., 0., ..., 0., 0., 0.], dtype=float32)"
|
||||
]
|
||||
},
|
||||
"execution_count": 9,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def to_bow(text):\n",
|
||||
" return tf.reduce_sum(tf.one_hot(vectorizer(text),vocab_size),axis=0)\n",
|
||||
"\n",
|
||||
"to_bow('My dog likes hot dogs on a hot day.').numpy()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **рдиреЛрдЯ**: рдЖрдкрдХреЛ рдпрд╣ рджреЗрдЦрдХрд░ рдЖрд╢реНрдЪрд░реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдЕрд▓рдЧ рд╣реИред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ Keras рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╡реЗрдХреНрдЯрд░ рдХреА рд▓рдВрдмрд╛рдИ рд╢рдмреНрджрд╛рд╡рд▓реА рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрддреА рд╣реИ, рдЬреЛ рдкреВрд░реЗ AG News рдбреЗрдЯрд╛рд╕реЗрдЯ рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рдереА, рдЬрдмрдХрд┐ Scikit Learn рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣рдордиреЗ рдирдореВрдирд╛ рдкрд╛рда рд╕реЗ рддреБрд░рдВрдд рд╢рдмреНрджрд╛рд╡рд▓реА рдмрдирд╛рдИред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## BoW рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдирд╛\n",
|
||||
"\n",
|
||||
"рдЕрдм рдЬрдм рд╣рдордиреЗ рдЕрдкрдиреЗ рдЯреЗрдХреНрд╕реНрдЯ рдХрд╛ рдмреИрдЧ-рдСрдл-рд╡рд░реНрдбреНрд╕ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдмрдирд╛рдирд╛ рд╕реАрдЦ рд▓рд┐рдпрд╛ рд╣реИ, рддреЛ рдЪрд▓рд┐рдП рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЛ рдмреИрдЧ-рдСрдл-рд╡рд░реНрдбреНрд╕ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЗ рд╕реЗ `map` рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"batch_size = 128\n",
|
||||
"\n",
|
||||
"ds_train_bow = ds_train.map(lambda x: (to_bow(x['title']+x['description']),x['label'])).batch(batch_size)\n",
|
||||
"ds_test_bow = ds_test.map(lambda x: (to_bow(x['title']+x['description']),x['label'])).batch(batch_size)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдЕрдм рдЪрд▓рд┐рдП рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд░реНрдЧреАрдХрд░рдг рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд░реИрдЦрд┐рдХ рдкрд░рдд рд╣реЛрддреА рд╣реИред рдЗрдирдкреБрдЯ рдЖрдХрд╛рд░ `vocab_size` рд╣реИ, рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдЖрдХрд╛рд░ рд╡рд░реНрдЧреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ (4) рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдПрдХ рд╡рд░реНрдЧреАрдХрд░рдг рдХрд╛рд░реНрдп рдХреЛ рд╣рд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЕрдВрддрд┐рдо рд╕рдХреНрд░рд┐рдпрдг рдлрд╝рдВрдХреНрд╢рди **softmax** рд╣реИ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 12,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"938/938 [==============================] - 66s 70ms/step - loss: 0.6144 - acc: 0.8427 - val_loss: 0.4416 - val_acc: 0.8697\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<keras.callbacks.History at 0x20c70a947f0>"
|
||||
]
|
||||
},
|
||||
"execution_count": 12,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"model = keras.models.Sequential([\n",
|
||||
" keras.layers.Dense(4,activation='softmax',input_shape=(vocab_size,))\n",
|
||||
"])\n",
|
||||
"model.compile(loss='sparse_categorical_crossentropy',optimizer='adam',metrics=['acc'])\n",
|
||||
"model.fit(ds_train_bow,validation_data=ds_test_bow)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 4 рдХреНрд▓рд╛рд╕реЗрд╕ рд╣реИрдВ, 80% рд╕реЗ рдЕрдзрд┐рдХ рдХреА рд╕рдЯреАрдХрддрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИред\n",
|
||||
"\n",
|
||||
"## рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░ рдХреЛ рдЯреНрд░реЗрди рдХрд░рдирд╛\n",
|
||||
"\n",
|
||||
"рдХреНрдпреЛрдВрдХрд┐ рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬрд╝рд░ рднреА рдПрдХ Keras рд▓реЗрдпрд░ рд╣реИ, рд╣рдо рдПрдХ рдРрд╕рд╛ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рд╢рд╛рдорд┐рд▓ рд╣реЛ, рдФрд░ рдЗрд╕реЗ рдПрдВрдб-рдЯреВ-рдПрдВрдб рдЯреНрд░реЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░реАрдХреЗ рд╕реЗ рд╣рдореЗрдВ `map` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЛ рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА, рд╣рдо рдмрд╕ рдореВрд▓ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдЗрдирдкреБрдЯ рдореЗрдВ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"> **Note**: рдлрд┐рд░ рднреА рд╣рдореЗрдВ рдЕрдкрдиреЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдкрд░ `map` рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдбрд┐рдХреНрд╢рдирд░реА (рдЬреИрд╕реЗ `title`, `description` рдФрд░ `label`) рд╕реЗ рдлреАрд▓реНрдбреНрд╕ рдХреЛ рдЯреНрдпреВрдкрд▓реНрд╕ рдореЗрдВ рдмрджрд▓ рд╕рдХреЗрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдм рдбрд┐рд╕реНрдХ рд╕реЗ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░ рд░рд╣реЗ рд╣реЛрдВ, рддреЛ рд╣рдо рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣реА рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдбреЗрдЯрд╛рд╕реЗрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 13,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Model: \"model\"\n",
|
||||
"_________________________________________________________________\n",
|
||||
" Layer (type) Output Shape Param # \n",
|
||||
"=================================================================\n",
|
||||
" input_1 (InputLayer) [(None, 1)] 0 \n",
|
||||
" \n",
|
||||
" text_vectorization (TextVec (None, None) 0 \n",
|
||||
" torization) \n",
|
||||
" \n",
|
||||
" tf.one_hot (TFOpLambda) (None, None, 5335) 0 \n",
|
||||
" \n",
|
||||
" tf.math.reduce_sum (TFOpLam (None, 5335) 0 \n",
|
||||
" bda) \n",
|
||||
" \n",
|
||||
" dense_2 (Dense) (None, 4) 21344 \n",
|
||||
" \n",
|
||||
"=================================================================\n",
|
||||
"Total params: 21,344\n",
|
||||
"Trainable params: 21,344\n",
|
||||
"Non-trainable params: 0\n",
|
||||
"_________________________________________________________________\n",
|
||||
"938/938 [==============================] - 73s 77ms/step - loss: 0.6057 - acc: 0.8414 - val_loss: 0.4202 - val_acc: 0.8736\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<keras.callbacks.History at 0x20c721521f0>"
|
||||
]
|
||||
},
|
||||
"execution_count": 13,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def extract_text(x):\n",
|
||||
" return x['title']+' '+x['description']\n",
|
||||
"\n",
|
||||
"def tupelize(x):\n",
|
||||
" return (extract_text(x),x['label'])\n",
|
||||
"\n",
|
||||
"inp = keras.Input(shape=(1,),dtype=tf.string)\n",
|
||||
"x = vectorizer(inp)\n",
|
||||
"x = tf.reduce_sum(tf.one_hot(x,vocab_size),axis=1)\n",
|
||||
"out = keras.layers.Dense(4,activation='softmax')(x)\n",
|
||||
"model = keras.models.Model(inp,out)\n",
|
||||
"model.summary()\n",
|
||||
"\n",
|
||||
"model.compile(loss='sparse_categorical_crossentropy',optimizer='adam',metrics=['acc'])\n",
|
||||
"model.fit(ds_train.map(tupelize).batch(batch_size),validation_data=ds_test.map(tupelize).batch(batch_size))\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рдмрд╛рдЗрдЧреНрд░рд╛рдо, рдЯреНрд░рд╛рдЗрдЧреНрд░рд╛рдо рдФрд░ рдПрди-рдЧреНрд░рд╛рдо\n",
|
||||
"\n",
|
||||
"рдмреИрдЧ-рдСрдл-рд╡рд░реНрдбреНрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдПрдХ рд╕реАрдорд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХреБрдЫ рд╢рдмреНрдж рдмрд╣реБ-рд╢рдмреНрдж рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 'рд╣реЙрдЯ рдбреЙрдЧ' рд╢рдмреНрдж рдХрд╛ рдЕрд░реНрде 'рд╣реЙрдЯ' рдФрд░ 'рдбреЙрдЧ' рд╢рдмреНрджреЛрдВ рд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рдЕрд▓рдЧ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рд╣рдореЗрд╢рд╛ 'рд╣реЙрдЯ' рдФрд░ 'рдбреЙрдЧ' рд╢рдмреНрджреЛрдВ рдХреЛ рдПрдХ рд╣реА рд╡реЗрдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╣рдорд╛рд░реЗ рдореЙрдбрд▓ рдХреЛ рднреНрд░рдорд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, **рдПрди-рдЧреНрд░рд╛рдо рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡** рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдХреНрд╕рд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╡рд░реНрдЧреАрдХрд░рдг рдХреА рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рд╢рдмреНрдж, рджреНрд╡рд┐-рд╢рдмреНрдж рдпрд╛ рддреНрд░рд┐-рд╢рдмреНрдж рдХреА рдЖрд╡реГрддреНрддрд┐ рд╡рд░реНрдЧреАрдХрд░рдг рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрд╛рдЗрдЧреНрд░рд╛рдо рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ, рд╣рдо рдореВрд▓ рд╢рдмреНрджреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕рднреА рд╢рдмреНрдж рдпреБрдЧреНрдореЛрдВ рдХреЛ рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред\n",
|
||||
"\n",
|
||||
"рдиреАрдЪреЗ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╕реНрдХikit Learn рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╛рдЗрдЧреНрд░рд╛рдо рдмреИрдЧ-рдСрдл-рд╡рд░реНрдбреНрд╕ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 14,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Vocabulary:\n",
|
||||
" {'i': 7, 'like': 11, 'hot': 4, 'dogs': 2, 'i like': 8, 'like hot': 12, 'hot dogs': 5, 'the': 16, 'dog': 0, 'ran': 14, 'fast': 3, 'the dog': 17, 'dog ran': 1, 'ran fast': 15, 'its': 9, 'outside': 13, 'its hot': 10, 'hot outside': 6}\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"array([[1, 0, 1, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]],\n",
|
||||
" dtype=int64)"
|
||||
]
|
||||
},
|
||||
"execution_count": 14,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"bigram_vectorizer = CountVectorizer(ngram_range=(1, 2), token_pattern=r'\\b\\w+\\b', min_df=1)\n",
|
||||
"corpus = [\n",
|
||||
" 'I like hot dogs.',\n",
|
||||
" 'The dog ran fast.',\n",
|
||||
" 'Its hot outside.',\n",
|
||||
" ]\n",
|
||||
"bigram_vectorizer.fit_transform(corpus)\n",
|
||||
"print(\"Vocabulary:\\n\",bigram_vectorizer.vocabulary_)\n",
|
||||
"bigram_vectorizer.transform(['My dog likes hot dogs on a hot day.']).toarray()\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"n-gram рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдореБрдЦреНрдп рдХрдореА рдпрд╣ рд╣реИ рдХрд┐ рд╢рдмреНрджрд╛рд╡рд▓реА рдХрд╛ рдЖрдХрд╛рд░ рдмрд╣реБрдд рддреЗрдЬреА рд╕реЗ рдмрдврд╝рдиреЗ рд▓рдЧрддрд╛ рд╣реИред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рд╣рдореЗрдВ n-gram рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рдПрдХ рдЖрдпрд╛рдореАрдп рдХрдореА рддрдХрдиреАрдХ, рдЬреИрд╕реЗ *embeddings*, рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдЕрдЧрд▓реЗ рдпреВрдирд┐рдЯ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗред\n",
|
||||
"\n",
|
||||
"рд╣рдорд╛рд░реЗ **AG News** рдбреЗрдЯрд╛рд╕реЗрдЯ рдореЗрдВ n-gram рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ `TextVectorization` рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ `ngrams` рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдПрдХ bigram рд╢рдмреНрджрд╛рд╡рд▓реА рдХреА рд▓рдВрдмрд╛рдИ **рдХрд╛рдлреА рдмрдбрд╝реА** рд╣реЛрддреА рд╣реИ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ 1.3 рдорд┐рд▓рд┐рдпрди рд╕реЗ рдЕрдзрд┐рдХ рдЯреЛрдХрди рд╣реИ! рдЗрд╕рд▓рд┐рдП, рдпрд╣ рд╕рдордЭрджрд╛рд░реА рд╣реЛрдЧреА рдХрд┐ bigram рдЯреЛрдХрди рдХреЛ рднреА рдХрд┐рд╕реА рдЙрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рддрдХ рд╕реАрдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред\n",
|
||||
"\n",
|
||||
"рд╣рдо рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрдореЛрд░реА рдХреЗ рд▓рд┐рд╣рд╛рдЬ рд╕реЗ рдмрд╣реБрдд рдЕрдХреНрд╖рдо рд╣реЛрдЧрд╛ред рдЕрдЧрд▓реЗ рдпреВрдирд┐рдЯ рдореЗрдВ, рд╣рдо embeddings рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ bigram рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдмреАрдЪ, рдЖрдк рдЗрд╕ рдиреЛрдЯрдмреБрдХ рдореЗрдВ bigram рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдЙрдЪреНрдЪ рд╕рдЯреАрдХрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## BoW рд╡реЗрдХреНрдЯрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЧрдгрдирд╛ рдХрд░рдирд╛\n",
|
||||
"\n",
|
||||
"рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдордиреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╢рдмреНрджреЛрдВ рдХреЗ рд╡рди-рд╣реЙрдЯ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЛ рдЬреЛрдбрд╝рдХрд░ BoW рд╡реЗрдХреНрдЯрд░ рдХреЛ рд╣рд╛рде рд╕реЗ рдЧрдгрдирд╛ рдХреА рдереАред рд╣рд╛рд▓рд╛рдВрдХрд┐, TensorFlow рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рд╣рдо BoW рд╡реЗрдХреНрдЯрд░ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд╕ `output_mode='count` рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬрд╝рд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдкрд╛рд╕ рдХрд░рдХреЗред рдпрд╣ рд╣рдорд╛рд░реЗ рдореЙрдбрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдФрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрддрд╛ рд╣реИ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 15,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Training vectorizer\n",
|
||||
"938/938 [==============================] - 7s 7ms/step - loss: 0.5929 - acc: 0.8486 - val_loss: 0.4168 - val_acc: 0.8772\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<keras.callbacks.History at 0x20c725217c0>"
|
||||
]
|
||||
},
|
||||
"execution_count": 15,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"model = keras.models.Sequential([\n",
|
||||
" keras.layers.experimental.preprocessing.TextVectorization(max_tokens=vocab_size,output_mode='count'),\n",
|
||||
" keras.layers.Dense(4,input_shape=(vocab_size,), activation='softmax')\n",
|
||||
"])\n",
|
||||
"print(\"Training vectorizer\")\n",
|
||||
"model.layers[0].adapt(ds_train.take(500).map(extract_text))\n",
|
||||
"model.compile(loss='sparse_categorical_crossentropy',optimizer='adam',metrics=['acc'])\n",
|
||||
"model.fit(ds_train.map(tupelize).batch(batch_size),validation_data=ds_test.map(tupelize).batch(batch_size))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рдЯрд░реНрдо рдлреНрд░реАрдХреНрд╡реЗрдВрд╕реА - рдЗрдирд╡рд░реНрд╕ рдбреЙрдХреНрдпреВрдореЗрдВрдЯ рдлреНрд░реАрдХреНрд╡реЗрдВрд╕реА (TF-IDF)\n",
|
||||
"\n",
|
||||
"BoW рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ, рд╢рдмреНрджреЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдПрдХ рд╣реА рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЪрд╛рд╣реЗ рд╡рд╣ рд╢рдмреНрдж рдХреЛрдИ рднреА рд╣реЛред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ *a* рдФрд░ *in* рдЬреИрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрдж рд╡рд░реНрдЧреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЙрддрдиреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реЛрддреЗ рдЬрд┐рддрдиреЗ рдХрд┐ рд╡рд┐рд╢реЗрд╖ рд╢рдмреНрджред рдЕрдзрд┐рдХрд╛рдВрд╢ NLP рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж рджреВрд╕рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реЛрддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"**TF-IDF** рдХрд╛ рдорддрд▓рдм рд╣реИ **рдЯрд░реНрдо рдлреНрд░реАрдХреНрд╡реЗрдВрд╕реА - рдЗрдирд╡рд░реНрд╕ рдбреЙрдХреНрдпреВрдореЗрдВрдЯ рдлреНрд░реАрдХреНрд╡реЗрдВрд╕реА**ред рдпрд╣ рдмреИрдЧ-рдСрдл-рд╡рд░реНрдбреНрд╕ рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХрд┐рд╕реА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд╢рдмреНрдж рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рджрд░реНрд╢рд╛рдиреЗ рд╡рд╛рд▓реЗ рдмрд╛рдЗрдирд░реА 0/1 рдорд╛рди рдХреЗ рдмрдЬрд╛рдп, рдПрдХ рдлреНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХреЙрд░реНрдкрд╕ рдореЗрдВ рд╢рдмреНрдж рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЖрд╡реГрддреНрддрд┐ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ, рдХрд┐рд╕реА рд╢рдмреНрдж $i$ рдХрд╛ рд╡рдЬрди $w_{ij}$ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ $j$ рдореЗрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:\n",
|
||||
"$$\n",
|
||||
"w_{ij} = tf_{ij}\\times\\log({N\\over df_i})\n",
|
||||
"$$\n",
|
||||
"рдЬрд╣рд╛рдВ\n",
|
||||
"* $tf_{ij}$ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ $j$ рдореЗрдВ $i$ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рдпрд╛рдиреА рд╡рд╣ BoW рдорд╛рди рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд╣рд▓реЗ рджреЗрдЦрд╛ рдерд╛\n",
|
||||
"* $N$ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ\n",
|
||||
"* $df_i$ рдкреВрд░реЗ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╢рдмреНрдж $i$ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ\n",
|
||||
"\n",
|
||||
"TF-IDF рдорд╛рди $w_{ij}$ рдХрд┐рд╕реА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд╢рдмреНрдж рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЕрдиреБрдкрд╛рдд рдореЗрдВ рдмрдврд╝рддрд╛ рд╣реИ рдФрд░ рдХреЙрд░реНрдкрд╕ рдореЗрдВ рдЙрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдСрдлрд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡рд╣ рд╢рдмреНрдж рд╢рд╛рдорд┐рд▓ рд╣реИред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рд╢рдмреНрдж рджреВрд╕рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдмрд╛рд░ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдХреЛрдИ рд╢рдмреНрдж *рд╣рд░* рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рддреЛ $df_i=N$, рдФрд░ $w_{ij}=0$, рдФрд░ рдЙрди рд╢рдмреНрджреЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред\n",
|
||||
"\n",
|
||||
"рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ Scikit Learn рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреЗрдХреНрд╕реНрдЯ рдХрд╛ TF-IDF рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬрд╝реЗрд╢рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 16,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"array([[0.43381609, 0. , 0.43381609, 0. , 0.65985664,\n",
|
||||
" 0.43381609, 0. , 0. , 0. , 0. ,\n",
|
||||
" 0. , 0. , 0. , 0. , 0. ,\n",
|
||||
" 0. ]])"
|
||||
]
|
||||
},
|
||||
"execution_count": 16,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"from sklearn.feature_extraction.text import TfidfVectorizer\n",
|
||||
"vectorizer = TfidfVectorizer(ngram_range=(1,2))\n",
|
||||
"vectorizer.fit_transform(corpus)\n",
|
||||
"vectorizer.transform(['My dog likes hot dogs on a hot day.']).toarray()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Keras рдореЗрдВ, `TextVectorization` рд▓реЗрдпрд░ `output_mode='tf-idf'` рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ TF-IDF рдЖрд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреА рд╣реИред рдЖрдЗрдП рдКрдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ рджреЛрд╣рд░рд╛рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рджреЗрдЦ рд╕рдХреЗрдВ рдХрд┐ TF-IDF рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╕рдЯреАрдХрддрд╛ рдмрдврд╝рддреА рд╣реИ рдпрд╛ рдирд╣реАрдВ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 17,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Training vectorizer\n",
|
||||
"938/938 [==============================] - 12s 12ms/step - loss: 0.4197 - acc: 0.8662 - val_loss: 0.3432 - val_acc: 0.8849\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<keras.callbacks.History at 0x20c729dfd30>"
|
||||
]
|
||||
},
|
||||
"execution_count": 17,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"model = keras.models.Sequential([\n",
|
||||
" keras.layers.experimental.preprocessing.TextVectorization(max_tokens=vocab_size,output_mode='tf-idf'),\n",
|
||||
" keras.layers.Dense(4,input_shape=(vocab_size,), activation='softmax')\n",
|
||||
"])\n",
|
||||
"print(\"Training vectorizer\")\n",
|
||||
"model.layers[0].adapt(ds_train.take(500).map(extract_text))\n",
|
||||
"model.compile(loss='sparse_categorical_crossentropy',optimizer='adam',metrics=['acc'])\n",
|
||||
"model.fit(ds_train.map(tupelize).batch(batch_size),validation_data=ds_test.map(tupelize).batch(batch_size))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рдирд┐рд╖реНрдХрд░реНрд╖\n",
|
||||
"\n",
|
||||
"рд╣рд╛рд▓рд╛рдВрдХрд┐ TF-IDF рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╡рд┐рднрд┐рдиреНрди рд╢рдмреНрджреЛрдВ рдХреЛ рдЖрд╡реГрддреНрддрд┐ рднрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ рди рддреЛ рдЕрд░реНрде рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рди рд╣реА рдХреНрд░рдо рдХреЛред рдЬреИрд╕рд╛ рдХрд┐ рдкреНрд░рд╕рд┐рджреНрдз рднрд╛рд╖рд╛рд╡рд┐рджреН рдЬреЗ. рдЖрд░. рдлрд░реНрде рдиреЗ 1935 рдореЗрдВ рдХрд╣рд╛ рдерд╛, \"рд╢рдмреНрдж рдХрд╛ рдкреВрд░реНрдг рдЕрд░реНрде рд╣рдореЗрд╢рд╛ рд╕рдВрджрд░реНрднрд╛рддреНрдордХ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рд╕рдВрджрд░реНрдн рд╕реЗ рдЕрд▓рдЧ рдЕрд░реНрде рдХрд╛ рдХреЛрдИ рднреА рдЕрдзреНрдпрдпрди рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рдирд╣реАрдВ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ред\" рд╣рдо рдЗрд╕ рдкрд╛рдареНрдпрдХреНрд░рдо рдореЗрдВ рдЖрдЧреЗ рднрд╛рд╖рд╛ рдореЙрдбрд▓рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рда рд╕реЗ рд╕рдВрджрд░реНрднрд╛рддреНрдордХ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдирд╛ рд╕реАрдЦреЗрдВрдЧреЗред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**рдЕрд╕реНрд╡реАрдХрд░рдг**: \nрдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ AI рдЕрдиреБрд╡рд╛рдж рд╕реЗрд╡рд╛ [Co-op Translator](https://github.com/Azure/co-op-translator) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрдмрдХрд┐ рд╣рдо рд╕рдЯреАрдХрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрдиреБрд╡рд╛рдж рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдпрд╛ рдЕрд╢реБрджреНрдзрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдореВрд▓ рднрд╛рд╖рд╛ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдореВрд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рд╕реНрд░реЛрдд рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдкреЗрд╢реЗрд╡рд░ рдорд╛рдирд╡ рдЕрдиреБрд╡рд╛рдж рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред рдЗрд╕ рдЕрдиреБрд╡рд╛рдж рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд┐рд╕реА рднреА рдЧрд▓рддрдлрд╣рдореА рдпрд╛ рдЧрд▓рдд рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╣рдо рдЙрддреНрддрд░рджрд╛рдпреА рдирд╣реАрдВ рд╣реИрдВред\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"interpreter": {
|
||||
"hash": "0cb620c6d4b9f7a635928804c26cf22403d89d98d79684e4529119355ee6d5a5"
|
||||
},
|
||||
"kernel_info": {
|
||||
"name": "conda-env-py37_tensorflow-py"
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "py37_tensorflow",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.8.12"
|
||||
},
|
||||
"nteract": {
|
||||
"version": "nteract-front-end@1.0.0"
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "19b43951d55b377a76209c24c1f017e4",
|
||||
"translation_date": "2025-08-31T15:31:44+00:00",
|
||||
"source_file": "lessons/5-NLP/13-TextRep/TextRepresentationTF.ipynb",
|
||||
"language_code": "hi"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 4
|
||||
}
|
||||
|
|
@ -0,0 +1,720 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕\n",
|
||||
"\n",
|
||||
"рд╣рдорд╛рд░реЗ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдордиреЗ рдЙрдЪреНрдЪ-рдЖрдпрд╛рдореА рдмреИрдЧ-рдСрдл-рд╡рд░реНрдбреНрд╕ рд╡реЗрдХреНрдЯрд░ рдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛ рдерд╛, рдЬрд┐рд╕рдХреА рд▓рдВрдмрд╛рдИ `vocab_size` рдереА, рдФрд░ рд╣рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рдореНрди-рдЖрдпрд╛рдореА рд╕реНрдерд╛рдирд┐рдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╡реЗрдХреНрдЯрд░ рдХреЛ рд╡рд┐рд░рд▓ рд╡рди-рд╣реЙрдЯ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рд░рд╣реЗ рдереЗред рдпрд╣ рд╡рди-рд╣реЙрдЯ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдореЛрд░реА-рдХреБрд╢рд▓ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рддреНрдпреЗрдХ рд╢рдмреНрдж рдХреЛ рдПрдХ-рджреВрд╕рд░реЗ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛рдиреА рд╡рди-рд╣реЙрдЯ рдПрдиреНрдХреЛрдбреЗрдб рд╡реЗрдХреНрдЯрд░ рд╢рдмреНрджреЛрдВ рдХреЗ рдмреАрдЪ рдХрд┐рд╕реА рднреА рдЕрд░реНрдердкреВрд░реНрдг рд╕рдорд╛рдирддрд╛ рдХреЛ рд╡реНрдпрдХреНрдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"рдЗрд╕ рдЗрдХрд╛рдИ рдореЗрдВ, рд╣рдо **News AG** рдбреЗрдЯрд╛рд╕реЗрдЯ рдХрд╛ рдЕрдиреНрд╡реЗрд╖рдг рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗред рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдкрд┐рдЫрд▓реЗ рдиреЛрдЯрдмреБрдХ рд╕реЗ рдХреБрдЫ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Loading dataset...\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"d:\\WORK\\ai-for-beginners\\5-NLP\\14-Embeddings\\data\\train.csv: 29.5MB [00:01, 18.8MB/s] \n",
|
||||
"d:\\WORK\\ai-for-beginners\\5-NLP\\14-Embeddings\\data\\test.csv: 1.86MB [00:00, 11.2MB/s] \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Building vocab...\n",
|
||||
"Vocab size = 95812\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import torch\n",
|
||||
"import torchtext\n",
|
||||
"import numpy as np\n",
|
||||
"from torchnlp import *\n",
|
||||
"train_dataset, test_dataset, classes, vocab = load_dataset()\n",
|
||||
"vocab_size = len(vocab)\n",
|
||||
"print(\"Vocab size = \",vocab_size)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреНрдпрд╛ рд╣реИ?\n",
|
||||
"\n",
|
||||
"**рдПрдореНрдмреЗрдбрд┐рдВрдЧ** рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рд╢рдмреНрджреЛрдВ рдХреЛ рдирд┐рдореНрди-рдЖрдпрд╛рдореА рдШрдиреЗ рд╡реЗрдХреНрдЯрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рдП, рдЬреЛ рдХрд┐рд╕реА рддрд░рд╣ рд╢рдмреНрдж рдХреЗ рдЕрд░реНрде рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдмрд╛рдж рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╕рд╛рд░реНрдердХ рд╢рдмреНрдж рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреИрд╕реЗ рдмрдирд╛рдИ рдЬрд╛рдП, рд▓реЗрдХрд┐рди рдлрд┐рд▓рд╣рд╛рд▓, рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреЛ рд╢рдмреНрдж рд╡реЗрдХреНрдЯрд░ рдХреА рдЖрдпрд╛рдо рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪреЗрдВред\n",
|
||||
"\n",
|
||||
"рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд▓реЗрдпрд░ рдПрдХ рд╢рдмреНрдж рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдЧреА рдФрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ `embedding_size` рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рд╡реЗрдХреНрдЯрд░ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧреАред рдПрдХ рдЕрд░реНрде рдореЗрдВ, рдпрд╣ `Linear` рд▓реЗрдпрд░ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ-рд╣реЙрдЯ рдПрдирдХреЛрдбреЗрдб рд╡реЗрдХреНрдЯрд░ рд▓реЗрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ рдПрдХ рд╢рдмреНрдж рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗ рд╕рдХреЗрдЧреАред\n",
|
||||
"\n",
|
||||
"рд╣рдорд╛рд░реЗ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд▓реЗрдпрд░ рдХреЛ рдкрд╣рд▓реА рд▓реЗрдпрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдмреИрдЧ-рдСрдл-рд╡рд░реНрдбреНрд╕ рд╕реЗ **рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдмреИрдЧ** рдореЙрдбрд▓ рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╣рдо рдкрд╣рд▓реЗ рдЕрдкрдиреЗ рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╢рдмреНрдж рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЙрди рд╕рднреА рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдкрд░ рдХреБрдЫ рд╕рдордЧреНрд░ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ `sum`, `average` рдпрд╛ `max`ред\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"рд╣рдорд╛рд░рд╛ рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░ рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд▓реЗрдпрд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдЧрд╛, рдлрд┐рд░ рдПрдЧреНрд░реАрдЧреЗрд╢рди рд▓реЗрдпрд░, рдФрд░ рдЙрд╕рдХреЗ рдКрдкрд░ рдПрдХ рд▓реАрдирд┐рдпрд░ рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class EmbedClassifier(torch.nn.Module):\n",
|
||||
" def __init__(self, vocab_size, embed_dim, num_class):\n",
|
||||
" super().__init__()\n",
|
||||
" self.embedding = torch.nn.Embedding(vocab_size, embed_dim)\n",
|
||||
" self.fc = torch.nn.Linear(embed_dim, num_class)\n",
|
||||
"\n",
|
||||
" def forward(self, x):\n",
|
||||
" x = self.embedding(x)\n",
|
||||
" x = torch.mean(x,dim=1)\n",
|
||||
" return self.fc(x)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### рдЪрд░ рдЕрдиреБрдХреНрд░рдо рдЖрдХрд╛рд░ рд╕реЗ рдирд┐рдкрдЯрдирд╛\n",
|
||||
"\n",
|
||||
"рдЗрд╕ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдорд╛рд░реЗ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рдорд┐рдиреАрдмреИрдЪ рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рддрд░реАрдХреЗ рд╕реЗ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рдкрд┐рдЫрд▓реЗ рдпреВрдирд┐рдЯ рдореЗрдВ, рдЬрдм рдмреИрдЧ-рдСрдл-рд╡рд░реНрдбреНрд╕ (BoW) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рдереЗ, рддреЛ рдорд┐рдиреАрдмреИрдЪ рдореЗрдВ рд╕рднреА BoW рдЯреЗрдВрд╕рд░ рдХрд╛ рдЖрдХрд╛рд░ `vocab_size` рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрддрд╛ рдерд╛, рдЪрд╛рд╣реЗ рд╣рдорд╛рд░реЗ рдЯреЗрдХреНрд╕реНрдЯ рдЕрдиреБрдХреНрд░рдо рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓рдВрдмрд╛рдИ рдХреБрдЫ рднреА рд╣реЛред рдЬрдм рд╣рдо рд╡рд░реНрдб рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рддреНрдпреЗрдХ рдЯреЗрдХреНрд╕реНрдЯ рд╕реИрдВрдкрд▓ рдореЗрдВ рд╢рдмреНрджреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдФрд░ рдЗрди рд╕реИрдВрдкрд▓реНрд╕ рдХреЛ рдорд┐рдиреАрдмреИрдЪ рдореЗрдВ рдорд┐рд▓рд╛рдиреЗ рдХреЗ рджреМрд░рд╛рди рд╣рдореЗрдВ рдХреБрдЫ рдкреИрдбрд┐рдВрдЧ рд▓рд╛рдЧреВ рдХрд░рдиреА рд╣реЛрдЧреАред\n",
|
||||
"\n",
|
||||
"рдпрд╣ `collate_fn` рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЙрд╕реА рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def padify(b):\n",
|
||||
" # b is the list of tuples of length batch_size\n",
|
||||
" # - first element of a tuple = label, \n",
|
||||
" # - second = feature (text sequence)\n",
|
||||
" # build vectorized sequence\n",
|
||||
" v = [encode(x[1]) for x in b]\n",
|
||||
" # first, compute max length of a sequence in this minibatch\n",
|
||||
" l = max(map(len,v))\n",
|
||||
" return ( # tuple of two tensors - labels and features\n",
|
||||
" torch.LongTensor([t[0]-1 for t in b]),\n",
|
||||
" torch.stack([torch.nn.functional.pad(torch.tensor(t),(0,l-len(t)),mode='constant',value=0) for t in v])\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
"train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=16, collate_fn=padify, shuffle=True)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░ рдХрд╛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг\n",
|
||||
"\n",
|
||||
"рдЕрдм рдЬрдм рд╣рдордиреЗ рд╕рд╣реА рдбрд╛рдЯрд╛рд▓реЛрдбрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдкрд┐рдЫрд▓реЗ рдпреВрдирд┐рдЯ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"3200: acc=0.6415625\n",
|
||||
"6400: acc=0.6865625\n",
|
||||
"9600: acc=0.7103125\n",
|
||||
"12800: acc=0.726953125\n",
|
||||
"16000: acc=0.739375\n",
|
||||
"19200: acc=0.75046875\n",
|
||||
"22400: acc=0.7572321428571429\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(0.889799795315499, 0.7623160588611644)"
|
||||
]
|
||||
},
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"net = EmbedClassifier(vocab_size,32,len(classes)).to(device)\n",
|
||||
"train_epoch(net,train_loader, lr=1, epoch_size=25000)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **рдиреЛрдЯ**: рд╣рдо рдпрд╣рд╛рдВ рдХреЗрд╡рд▓ 25k рд░рд┐рдХреЙрд░реНрдбреНрд╕ (рдПрдХ рдкреВрд░реНрдг рдпреБрдЧ рд╕реЗ рдХрдо) рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╕рдордп рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рдЖрдк рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХрдИ рдпреБрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЙрдЪреНрдЪ рд╕рдЯреАрдХрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд░реНрдирд┐рдВрдЧ рд░реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рд▓рдЧрднрдЧ 90% рд╕рдЯреАрдХрддрд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### EmbeddingBag рд▓реЗрдпрд░ рдФрд░ рдЪрд░ рд▓рдВрдмрд╛рдИ рдЕрдиреБрдХреНрд░рдо рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡\n",
|
||||
"\n",
|
||||
"рдкрд┐рдЫрд▓реА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ, рд╣рдореЗрдВ рд╕рднреА рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЛ рдПрдХ рд╣реА рд▓рдВрдмрд╛рдИ рддрдХ рдмрдврд╝рд╛рдирд╛ рдкрдбрд╝рддрд╛ рдерд╛ рддрд╛рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдорд┐рдиреАрдмреИрдЪ рдореЗрдВ рдлрд┐рдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдпрд╣ рдЪрд░ рд▓рдВрдмрд╛рдИ рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдкреНрд░рднрд╛рд╡реА рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ - рдПрдХ рдЕрдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг **рдСрдлрд╕реЗрдЯ** рд╡реЗрдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдПрдХ рдмрдбрд╝реЗ рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╕рднреА рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЗ рдСрдлрд╕реЗрдЯ рдХреЛ рд░рдЦреЗрдЧрд╛ред\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"> **Note**: рдКрдкрд░ рджреА рдЧрдИ рддрд╕реНрд╡реАрд░ рдореЗрдВ, рд╣рдордиреЗ рдЕрдХреНрд╖рд░реЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рджрд┐рдЦрд╛рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣рдо рд╢рдмреНрджреЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдСрдлрд╕реЗрдЯ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рджреНрдзрд╛рдВрдд рд╡рд╣реА рд░рд╣рддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"рдСрдлрд╕реЗрдЯ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо [`EmbeddingBag`](https://pytorch.org/docs/stable/generated/torch.nn.EmbeddingBag.html) рд▓реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ `Embedding` рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд╛рдордЧреНрд░реА рд╡реЗрдХреНрдЯрд░ рдФрд░ рдСрдлрд╕реЗрдЯ рд╡реЗрдХреНрдЯрд░ рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдФрд╕рдд рд▓реЗрдпрд░ рднреА рд╢рд╛рдорд┐рд▓ рд╣реЛрддреА рд╣реИ, рдЬреЛ `mean`, `sum` рдпрд╛ `max` рд╣реЛ рд╕рдХрддреА рд╣реИред\n",
|
||||
"\n",
|
||||
"рдпрд╣рд╛рдБ рдПрдХ рд╕рдВрд╢реЛрдзрд┐рдд рдиреЗрдЯрд╡рд░реНрдХ рд╣реИ рдЬреЛ `EmbeddingBag` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class EmbedClassifier(torch.nn.Module):\n",
|
||||
" def __init__(self, vocab_size, embed_dim, num_class):\n",
|
||||
" super().__init__()\n",
|
||||
" self.embedding = torch.nn.EmbeddingBag(vocab_size, embed_dim)\n",
|
||||
" self.fc = torch.nn.Linear(embed_dim, num_class)\n",
|
||||
"\n",
|
||||
" def forward(self, text, off):\n",
|
||||
" x = self.embedding(text, off)\n",
|
||||
" return self.fc(x)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рд░реВрдкрд╛рдВрддрд░рдг рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдСрдлрд╝рд╕реЗрдЯ рд╡реЗрдХреНрдЯрд░ рддреИрдпрд╛рд░ рдХрд░реЗрдЧрд╛:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def offsetify(b):\n",
|
||||
" # first, compute data tensor from all sequences\n",
|
||||
" x = [torch.tensor(encode(t[1])) for t in b]\n",
|
||||
" # now, compute the offsets by accumulating the tensor of sequence lengths\n",
|
||||
" o = [0] + [len(t) for t in x]\n",
|
||||
" o = torch.tensor(o[:-1]).cumsum(dim=0)\n",
|
||||
" return ( \n",
|
||||
" torch.LongTensor([t[0]-1 for t in b]), # labels\n",
|
||||
" torch.cat(x), # text \n",
|
||||
" o\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
"train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=16, collate_fn=offsetify, shuffle=True)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рднреА рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╣рдорд╛рд░рд╛ рдиреЗрдЯрд╡рд░реНрдХ рдЕрдм рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ: рдбреЗрдЯрд╛ рд╡реЗрдХреНрдЯрд░ рдФрд░ рдСрдлрд╕реЗрдЯ рд╡реЗрдХреНрдЯрд░, рдЬреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЖрдХрд╛рд░ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕реА рддрд░рд╣, рд╣рдорд╛рд░рд╛ рдбреЗрдЯрд╛ рд▓реЛрдбрд░ рднреА рд╣рдореЗрдВ 2 рдХреЗ рдмрдЬрд╛рдп 3 рдорд╛рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ: рдЯреЗрдХреНрд╕реНрдЯ рдФрд░ рдСрдлрд╕реЗрдЯ рд╡реЗрдХреНрдЯрд░ рджреЛрдиреЛрдВ рдХреЛ рдлреАрдЪрд░реНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЗрд╕рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрд╛ рдЬрд╛ рд╕рдХреЗ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"3200: acc=0.6153125\n",
|
||||
"6400: acc=0.6615625\n",
|
||||
"9600: acc=0.6932291666666667\n",
|
||||
"12800: acc=0.715078125\n",
|
||||
"16000: acc=0.7270625\n",
|
||||
"19200: acc=0.7382291666666667\n",
|
||||
"22400: acc=0.7486160714285715\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(22.771553103007037, 0.7551983365323096)"
|
||||
]
|
||||
},
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"net = EmbedClassifier(vocab_size,32,len(classes)).to(device)\n",
|
||||
"\n",
|
||||
"def train_epoch_emb(net,dataloader,lr=0.01,optimizer=None,loss_fn = torch.nn.CrossEntropyLoss(),epoch_size=None, report_freq=200):\n",
|
||||
" optimizer = optimizer or torch.optim.Adam(net.parameters(),lr=lr)\n",
|
||||
" loss_fn = loss_fn.to(device)\n",
|
||||
" net.train()\n",
|
||||
" total_loss,acc,count,i = 0,0,0,0\n",
|
||||
" for labels,text,off in dataloader:\n",
|
||||
" optimizer.zero_grad()\n",
|
||||
" labels,text,off = labels.to(device), text.to(device), off.to(device)\n",
|
||||
" out = net(text, off)\n",
|
||||
" loss = loss_fn(out,labels) #cross_entropy(out,labels)\n",
|
||||
" loss.backward()\n",
|
||||
" optimizer.step()\n",
|
||||
" total_loss+=loss\n",
|
||||
" _,predicted = torch.max(out,1)\n",
|
||||
" acc+=(predicted==labels).sum()\n",
|
||||
" count+=len(labels)\n",
|
||||
" i+=1\n",
|
||||
" if i%report_freq==0:\n",
|
||||
" print(f\"{count}: acc={acc.item()/count}\")\n",
|
||||
" if epoch_size and count>epoch_size:\n",
|
||||
" break\n",
|
||||
" return total_loss.item()/count, acc.item()/count\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"train_epoch_emb(net,train_loader, lr=4, epoch_size=25000)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рд╕реЗрдорд╛рдВрдЯрд┐рдХ рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕: рд╡рд░реНрдб2рд╡реЗрдХ\n",
|
||||
"\n",
|
||||
"рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореЙрдбрд▓ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд▓реЗрдпрд░ рдиреЗ рд╢рдмреНрджреЛрдВ рдХреЛ рд╡реЗрдХреНрдЯрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ рдореИрдк рдХрд░рдирд╛ рд╕реАрдЦрд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ рдЬреНрдпрд╛рджрд╛ рд╕реЗрдорд╛рдВрдЯрд┐рдХ рдЕрд░реНрде рдирд╣реАрдВ рдерд╛ред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдРрд╕рд╛ рд╡реЗрдХреНрдЯрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╕реАрдЦрд╛ рдЬрд╛рдП, рдЬрд┐рд╕рдореЗрдВ рд╕рдорд╛рди рд╢рдмреНрдж рдпрд╛ рдкрд░реНрдпрд╛рдпрд╡рд╛рдЪреА рд╢рдмреНрдж рдРрд╕реЗ рд╡реЗрдХреНрдЯрд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рдПрдВ рдЬреЛ рдХрд┐рд╕реА рд╡реЗрдХреНрдЯрд░ рджреВрд░реА (рдЬреИрд╕реЗ, рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рджреВрд░реА) рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рдХрд░реАрдм рд╣реЛрдВред\n",
|
||||
"\n",
|
||||
"рдЗрд╕рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдореЙрдбрд▓ рдХреЛ рдПрдХ рдмрдбрд╝реЗ рдЯреЗрдХреНрд╕реНрдЯ рд╕рдВрдЧреНрд░рд╣ рдкрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░реА-рдЯреНрд░реЗрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╕реЗрдорд╛рдВрдЯрд┐рдХ рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рдХреЛ рдЯреНрд░реЗрди рдХрд░рдиреЗ рдХреЗ рд╢реБрд░реБрдЖрддреА рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ [рд╡рд░реНрдб2рд╡реЗрдХ](https://en.wikipedia.org/wiki/Word2vec) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╢рдмреНрджреЛрдВ рдХреЗ рд╡рд┐рддрд░рд┐рдд рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдореБрдЦреНрдп рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ:\n",
|
||||
"\n",
|
||||
" - **рдХрдВрдЯреАрдиреНрдпреБрдЕрд╕ рдмреИрдЧ-рдСрдл-рд╡рд░реНрдбреНрд╕** (CBoW) тАФ рдЗрд╕ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ, рд╣рдо рдореЙрдбрд▓ рдХреЛ рдЖрд╕-рдкрд╛рд╕ рдХреЗ рд╕рдВрджрд░реНрдн рд╕реЗ рдПрдХ рд╢рдмреНрдж рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреНрд░реЗрди рдХрд░рддреЗ рд╣реИрдВред рджрд┐рдП рдЧрдП ngram $(W_{-2},W_{-1},W_0,W_1,W_2)$ рдореЗрдВ, рдореЙрдбрд▓ рдХрд╛ рд▓рдХреНрд╖реНрдп $(W_{-2},W_{-1},W_1,W_2)$ рд╕реЗ $W_0$ рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдирд╛ рд╣реИред\n",
|
||||
" - **рдХрдВрдЯреАрдиреНрдпреБрдЕрд╕ рд╕реНрдХрд┐рдк-рдЧреНрд░рд╛рдо** CBoW рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИред рдореЙрдбрд▓ рд╕рдВрджрд░реНрдн рд╢рдмреНрджреЛрдВ рдХреА рдЖрд╕-рдкрд╛рд╕ рдХреА рд╡рд┐рдВрдбреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд░реНрддрдорд╛рди рд╢рдмреНрдж рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"CBoW рддреЗрдЬ рд╣реИ, рдЬрдмрдХрд┐ рд╕реНрдХрд┐рдк-рдЧреНрд░рд╛рдо рдзреАрдорд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрдо рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╢рдмреНрджреЛрдВ рдХрд╛ рдмреЗрд╣рддрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"Google News рдбреЗрдЯрд╛рд╕реЗрдЯ рдкрд░ рдкреНрд░реА-рдЯреНрд░реЗрди рдХрд┐рдП рдЧрдП рд╡рд░реНрдб2рд╡реЗрдХ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо **gensim** рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдиреАрдЪреЗ рд╣рдо 'neural' рдХреЗ рд╕рдмрд╕реЗ рд╕рдорд╛рди рд╢рдмреНрджреЛрдВ рдХреЛ рдвреВрдВрдврддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"> **Note:** рдЬрдм рдЖрдк рдкрд╣рд▓реА рдмрд╛рд░ рд╢рдмреНрдж рд╡реЗрдХреНрдЯрд░ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рдХреБрдЫ рд╕рдордп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import gensim.downloader as api\n",
|
||||
"w2v = api.load('word2vec-google-news-300')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"neuronal -> 0.7804799675941467\n",
|
||||
"neurons -> 0.7326500415802002\n",
|
||||
"neural_circuits -> 0.7252851724624634\n",
|
||||
"neuron -> 0.7174385190010071\n",
|
||||
"cortical -> 0.6941086649894714\n",
|
||||
"brain_circuitry -> 0.6923246383666992\n",
|
||||
"synaptic -> 0.6699118614196777\n",
|
||||
"neural_circuitry -> 0.6638563275337219\n",
|
||||
"neurochemical -> 0.6555314064025879\n",
|
||||
"neuronal_activity -> 0.6531826257705688\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"for w,p in w2v.most_similar('neural'):\n",
|
||||
" print(f\"{w} -> {p}\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рд╣рдо рд╢рдмреНрдж рд╕реЗ рд╡реЗрдХреНрдЯрд░ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рднреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╡рд░реНрдЧреАрдХрд░рдг рдореЙрдбрд▓ рдХреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рд╣рдо рдХреЗрд╡рд▓ рд╡реЗрдХреНрдЯрд░ рдХреЗ рдкрд╣рд▓реЗ 20 рдШрдЯрдХ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ):\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"array([ 0.01226807, 0.06225586, 0.10693359, 0.05810547, 0.23828125,\n",
|
||||
" 0.03686523, 0.05151367, -0.20703125, 0.01989746, 0.10058594,\n",
|
||||
" -0.03759766, -0.1015625 , -0.15820312, -0.08105469, -0.0390625 ,\n",
|
||||
" -0.05053711, 0.16015625, 0.2578125 , 0.10058594, -0.25976562],\n",
|
||||
" dtype=float32)"
|
||||
]
|
||||
},
|
||||
"execution_count": 10,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"w2v.word_vec('play')[:20]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"('queen', 0.7118192911148071)"
|
||||
]
|
||||
},
|
||||
"execution_count": 10,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"w2v.most_similar(positive=['king','woman'],negative=['man'])[0]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"CBoW рдФрд░ Skip-Grams рджреЛрдиреЛрдВ \"predictive\" embeddings рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпреЗ рдХреЗрд╡рд▓ рд╕реНрдерд╛рдиреАрдп рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВред Word2Vec рд╡реИрд╢реНрд╡рд┐рдХ рд╕рдВрджрд░реНрдн рдХрд╛ рд▓рд╛рдн рдирд╣реАрдВ рдЙрдард╛рддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"**FastText**, Word2Vec рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╢рдмреНрдж рдФрд░ рдЙрд╕рдореЗрдВ рдкрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЕрдХреНрд╖рд░ n-grams рдХреЗ рд▓рд┐рдП рд╡реЗрдХреНрдЯрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╕реАрдЦрддрд╛ рд╣реИред рдЗрди рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡реЛрдВ рдХреЗ рдорд╛рдиреЛрдВ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЪрд░рдг рдореЗрдВ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рдФрд╕рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдкреНрд░реА-рдЯреНрд░реЗрдирд┐рдВрдЧ рдореЗрдВ рдХрд╛рдлреА рдЕрддрд┐рд░рд┐рдХреНрдд рдЧрдгрдирд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд░реНрдб рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рдХреЛ рд╕рдм-рд╡рд░реНрдб рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдПрдиреНрдХреЛрдб рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"рдПрдХ рдФрд░ рд╡рд┐рдзрд┐, **GloVe**, рд╕рд╣-рдЕрд╕реНрддрд┐рддреНрд╡ рдореИрдЯреНрд░рд┐рдХреНрд╕ (co-occurrence matrix) рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ рдФрд░ рд╕рд╣-рдЕрд╕реНрддрд┐рддреНрд╡ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдЕрдзрд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдкреВрд░реНрдг рдФрд░ рдЧреИрд░-рд░реЗрдЦреАрдп (non-linear) рд╡рд░реНрдб рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрд░рд▓ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред\n",
|
||||
"\n",
|
||||
"рдЖрдк рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ embeddings рдХреЛ FastText рдФрд░ GloVe рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ gensim рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд░реНрдб рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдореЙрдбрд▓ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## PyTorch рдореЗрдВ рдкреНрд░реА-рдЯреНрд░реЗрдВрдб рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛\n",
|
||||
"\n",
|
||||
"рд╣рдо рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдорд╛рд░реЗ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд▓реЗрдпрд░ рдХреЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рд╕реЗрдорд╛рдВрдЯрд┐рдХрд▓ рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕, рдЬреИрд╕реЗ Word2Vec, рд╕реЗ рдкреНрд░реА-рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рд╣рдореЗрдВ рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдкреНрд░реА-рдЯреНрд░реЗрдВрдб рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдФрд░ рд╣рдорд╛рд░реЗ рдЯреЗрдХреНрд╕реНрдЯ рдХреЙрд░реНрдкрд╕ рдХреА рд╡реЛрдХреИрдмреНрдпреБрд▓рд░реА рд╢рд╛рдпрдж рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рдПрдЧреА, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрди рд╢рдмреНрджреЛрдВ рдХреЗ рд▓рд┐рдП рд╡реЗрдЯреНрд╕ рдХреЛ рд░реИрдВрдбрдо рд╡реИрд▓реНрдпреВ рд╕реЗ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдЧрд╛рдпрдм рд╣реИрдВ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"metadata": {
|
||||
"tags": []
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Embedding size: 300\n",
|
||||
"Populating matrix, this will take some time...Done, found 41080 words, 54732 words missing\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"embed_size = len(w2v.get_vector('hello'))\n",
|
||||
"print(f'Embedding size: {embed_size}')\n",
|
||||
"\n",
|
||||
"net = EmbedClassifier(vocab_size,embed_size,len(classes))\n",
|
||||
"\n",
|
||||
"print('Populating matrix, this will take some time...',end='')\n",
|
||||
"found, not_found = 0,0\n",
|
||||
"for i,w in enumerate(vocab.get_itos()):\n",
|
||||
" try:\n",
|
||||
" net.embedding.weight[i].data = torch.tensor(w2v.get_vector(w))\n",
|
||||
" found+=1\n",
|
||||
" except:\n",
|
||||
" net.embedding.weight[i].data = torch.normal(0.0,1.0,(embed_size,))\n",
|
||||
" not_found+=1\n",
|
||||
"\n",
|
||||
"print(f\"Done, found {found} words, {not_found} words missing\")\n",
|
||||
"net = net.to(device)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 12,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"3200: acc=0.6359375\n",
|
||||
"6400: acc=0.68109375\n",
|
||||
"9600: acc=0.7067708333333333\n",
|
||||
"12800: acc=0.723671875\n",
|
||||
"16000: acc=0.73625\n",
|
||||
"19200: acc=0.7463541666666667\n",
|
||||
"22400: acc=0.7560714285714286\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(214.1013875559821, 0.7626759436980166)"
|
||||
]
|
||||
},
|
||||
"execution_count": 12,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"train_epoch_emb(net,train_loader, lr=4, epoch_size=25000)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рд╕рдЯреАрдХрддрд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡реГрджреНрдзрд┐ рдирд╣реАрдВ рджрд┐рдЦрддреА рд╣реИ, рдЬреЛ рд╕рдВрднрд╡рддрдГ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╢рдмреНрджрд╛рд╡рд▓реА рдХреЗ рдХрд╛рд░рдг рд╣реИред \n",
|
||||
"рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╢рдмреНрджрд╛рд╡рд▓реА рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдорд╛рдзрд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: \n",
|
||||
"* рд╣рдорд╛рд░реЗ рд╢рдмреНрджрд╛рд╡рд▓реА рдкрд░ word2vec рдореЙрдбрд▓ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░реЗрдВ \n",
|
||||
"* рдкреНрд░реА-рдЯреНрд░реЗрдВрдб word2vec рдореЙрдбрд▓ рдХреА рд╢рдмреНрджрд╛рд╡рд▓реА рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░рд╛ рдбреЗрдЯрд╛рд╕реЗрдЯ рд▓реЛрдб рдХрд░реЗрдВред рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╢рдмреНрджрд╛рд╡рд▓реА рдХреЛ рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред \n",
|
||||
"\n",
|
||||
"рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рдЕрдзрд┐рдХ рдЖрд╕рд╛рди рд▓рдЧрддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдХреНрдпреЛрдВрдХрд┐ PyTorch `torchtext` рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдЯ-рдЗрди рд╕рдкреЛрд░реНрдЯ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЗ рд╕реЗ GloVe-рдЖрдзрд╛рд░рд┐рдд рд╢рдмреНрджрд╛рд╡рд▓реА рдХреЛ рдЗрдВрд╕реНрдЯреИрдВрд╢рд┐рдПрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 14,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"100%|тЦИтЦИтЦИтЦИтЦИтЦИтЦИтЦИтЦИтЦЙ| 399999/400000 [00:15<00:00, 25411.14it/s]\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"vocab = torchtext.vocab.GloVe(name='6B', dim=50)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рд▓реЛрдбреЗрдб рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмреБрдирд┐рдпрд╛рджреА рдСрдкрд░реЗрд╢рдиреНрд╕ рд╣реЛрддреЗ рд╣реИрдВ:\n",
|
||||
"* `vocab.stoi` рдбрд┐рдХреНрд╢рдирд░реА рд╣рдореЗрдВ рдХрд┐рд╕реА рд╢рдмреНрдж рдХреЛ рдЙрд╕рдХреЗ рдбрд┐рдХреНрд╢рдирд░реА рдЗрдВрдбреЗрдХреНрд╕ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ\n",
|
||||
"* `vocab.itos` рдЗрд╕рдХрд╛ рдЙрд▓реНрдЯрд╛ рдХрд░рддрд╛ рд╣реИ - рдирдВрдмрд░ рдХреЛ рд╢рдмреНрдж рдореЗрдВ рдмрджрд▓рддрд╛ рд╣реИ\n",
|
||||
"* `vocab.vectors` рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд╡реЗрдХреНрдЯрд░ рдХрд╛ рдРрд░реЗ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрд┐рд╕реА рд╢рдмреНрдж `s` рдХреА рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ `vocab.vectors[vocab.stoi[s]]` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛\n",
|
||||
"\n",
|
||||
"рдпрд╣рд╛рдБ рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдЫреЗрдбрд╝рдЫрд╛рдбрд╝ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдЬреЛ рд╕рдореАрдХрд░рдг **kind-man+woman = queen** рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ (рдореБрдЭреЗ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдПрдлрд┐рд╢рд┐рдПрдВрдЯ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рдкрдбрд╝рд╛):\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 15,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"'queen'"
|
||||
]
|
||||
},
|
||||
"execution_count": 15,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# get the vector corresponding to kind-man+woman\n",
|
||||
"qvec = vocab.vectors[vocab.stoi['king']]-vocab.vectors[vocab.stoi['man']]+1.3*vocab.vectors[vocab.stoi['woman']]\n",
|
||||
"# find the index of the closest embedding vector \n",
|
||||
"d = torch.sum((vocab.vectors-qvec)**2,dim=1)\n",
|
||||
"min_idx = torch.argmin(d)\n",
|
||||
"# find the corresponding word\n",
|
||||
"vocab.itos[min_idx]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдЙрди рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд░реНрдЧреАрдХрд░рдгрдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдЕрдкрдиреЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЛ GloVe рд╢рдмреНрджрд╛рд╡рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдиреНрдХреЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 16,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def offsetify(b):\n",
|
||||
" # first, compute data tensor from all sequences\n",
|
||||
" x = [torch.tensor(encode(t[1],voc=vocab)) for t in b] # pass the instance of vocab to encode function!\n",
|
||||
" # now, compute the offsets by accumulating the tensor of sequence lengths\n",
|
||||
" o = [0] + [len(t) for t in x]\n",
|
||||
" o = torch.tensor(o[:-1]).cumsum(dim=0)\n",
|
||||
" return ( \n",
|
||||
" torch.LongTensor([t[0]-1 for t in b]), # labels\n",
|
||||
" torch.cat(x), # text \n",
|
||||
" o\n",
|
||||
" )"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдКрдкрд░ рджреЗрдЦрд╛, рд╕рднреА рд╡реЗрдХреНрдЯрд░ рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ `vocab.vectors` рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддреА рд╣реИрдВред рдЗрд╕реЗ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд▓реЗрдпрд░ рдХреЗ рд╡реЗрдЯреНрд╕ рдореЗрдВ рд╕рд░рд▓ рдХреЙрдкреАрд┐рдВрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЛрдб рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 17,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"net = EmbedClassifier(len(vocab),len(vocab.vectors[0]),len(classes))\n",
|
||||
"net.embedding.weight.data = vocab.vectors\n",
|
||||
"net = net.to(device)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 18,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"3200: acc=0.6271875\n",
|
||||
"6400: acc=0.68078125\n",
|
||||
"9600: acc=0.7030208333333333\n",
|
||||
"12800: acc=0.71984375\n",
|
||||
"16000: acc=0.7346875\n",
|
||||
"19200: acc=0.7455729166666667\n",
|
||||
"22400: acc=0.7529464285714286\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(35.53972978646833, 0.7575175943698017)"
|
||||
]
|
||||
},
|
||||
"execution_count": 18,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=16, collate_fn=offsetify, shuffle=True)\n",
|
||||
"train_epoch_emb(net,train_loader, lr=4, epoch_size=25000)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рд╣рдорд╛рд░реА рд╕рдЯреАрдХрддрд╛ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡реГрджреНрдзрд┐ рди рджреЗрдЦрдиреЗ рдХреЗ рдХрд╛рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЗ рдХреБрдЫ рд╢рдмреНрдж рдкреНрд░реА-рдЯреНрд░реЗрдВрдб GloVe рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рддрдереНрдп рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдкрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рд╕рдВрджрд░реНрднрд╛рддреНрдордХ рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕\n",
|
||||
"\n",
|
||||
"рдкрд╛рд░рдВрдкрд░рд┐рдХ рдкреНрд░реАрдЯреНрд░реЗрдВрдб рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡, рдЬреИрд╕реЗ Word2Vec, рдХреА рдПрдХ рдореБрдЦреНрдп рд╕реАрдорд╛ рд╢рдмреНрджрд╛рд░реНрде рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ (word sense disambiguation) рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИред рдЬрдмрдХрд┐ рдкреНрд░реАрдЯреНрд░реЗрдВрдб рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рд╢рдмреНрджреЛрдВ рдХреЗ рдХреБрдЫ рдЕрд░реНрде рдХреЛ рд╕рдВрджрд░реНрдн рдореЗрдВ рдкрдХрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рд╢рдмреНрдж рдХреЗ рд╣рд░ рд╕рдВрднрд╛рд╡рд┐рдд рдЕрд░реНрде рдХреЛ рдПрдХ рд╣реА рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдореЗрдВ рдПрдиреНрдХреЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдореЙрдбрд▓реНрд╕ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрдИ рд╢рдмреНрджреЛрдВ, рдЬреИрд╕реЗ 'play', рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрд░реНрде рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 'play' рд╢рдмреНрдж рдХрд╛ рдЗрди рджреЛ рд╡рд╛рдХреНрдпреЛрдВ рдореЗрдВ рдХрд╛рдлреА рдЕрд▓рдЧ рдЕрд░реНрде рд╣реИ:\n",
|
||||
"- рдореИрдВ рдерд┐рдПрдЯрд░ рдореЗрдВ рдПрдХ **play** рджреЗрдЦрдиреЗ рдЧрдпрд╛ред\n",
|
||||
"- рдЬреЙрди рдЕрдкрдиреЗ рджреЛрд╕реНрддреЛрдВ рдХреЗ рд╕рд╛рде **play** рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"рдКрдкрд░ рджрд┐рдП рдЧрдП рдкреНрд░реАрдЯреНрд░реЗрдВрдб рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ 'play' рд╢рдмреНрдж рдХреЗ рдЗрди рджреЛрдиреЛрдВ рдЕрд░реНрдереЛрдВ рдХреЛ рдПрдХ рд╣реА рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдореЗрдВ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВред рдЗрд╕ рд╕реАрдорд╛ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ **рднрд╛рд╖рд╛ рдореЙрдбрд▓** рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рдмрдирд╛рдиреА рд╣реЛрдВрдЧреА, рдЬреЛ рдПрдХ рдмрдбрд╝реЗ рдЯреЗрдХреНрд╕реНрдЯ рдХреЙрд░реНрдкрд╕ рдкрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ *рдЬрд╛рдирддрд╛ рд╣реИ* рдХрд┐ рд╢рдмреНрджреЛрдВ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рдВрджрд░реНрднрд╛рддреНрдордХ рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЕрдЧрд▓реЗ рдпреВрдирд┐рдЯ рдореЗрдВ рднрд╛рд╖рд╛ рдореЙрдбрд▓реЛрдВ рдкрд░ рдмрд╛рдд рдХрд░рддреЗ рд╕рдордп рдЗрд╕ рдкрд░ рд╡рд╛рдкрд╕ рдЖрдПрдВрдЧреЗред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**рдЕрд╕реНрд╡реАрдХрд░рдг**: \nрдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ AI рдЕрдиреБрд╡рд╛рдж рд╕реЗрд╡рд╛ [Co-op Translator](https://github.com/Azure/co-op-translator) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрдмрдХрд┐ рд╣рдо рд╕рдЯреАрдХрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрдиреБрд╡рд╛рдж рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдпрд╛ рдЕрд╢реБрджреНрдзрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдореВрд▓ рднрд╛рд╖рд╛ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдореВрд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рд╕реНрд░реЛрдд рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдкреЗрд╢реЗрд╡рд░ рдорд╛рдирд╡ рдЕрдиреБрд╡рд╛рдж рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред рдЗрд╕ рдЕрдиреБрд╡рд╛рдж рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд┐рд╕реА рднреА рдЧрд▓рддрдлрд╣рдореА рдпрд╛ рдЧрд▓рдд рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╣рдо рдЙрддреНрддрд░рджрд╛рдпреА рдирд╣реАрдВ рд╣реИрдВред\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"interpreter": {
|
||||
"hash": "0cb620c6d4b9f7a635928804c26cf22403d89d98d79684e4529119355ee6d5a5"
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "py37_pytorch",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.8.12"
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "f50b026abce5cf36783a560ea72cb9b1",
|
||||
"translation_date": "2025-08-31T15:28:25+00:00",
|
||||
"source_file": "lessons/5-NLP/14-Embeddings/EmbeddingsPyTorch.ipynb",
|
||||
"language_code": "hi"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
|
|
@ -0,0 +1,695 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕\n",
|
||||
"\n",
|
||||
"рд╣рдорд╛рд░реЗ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдордиреЗ `vocab_size` рд▓рдВрдмрд╛рдИ рд╡рд╛рд▓реЗ рдЙрдЪреНрдЪ-рдЖрдпрд╛рдореА рдмреИрдЧ-рдСрдл-рд╡рд░реНрдбреНрд╕ рд╡реЗрдХреНрдЯрд░ рдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛ рдерд╛, рдФрд░ рд╣рдордиреЗ рдирд┐рдореНрди-рдЖрдпрд╛рдореА рдкреЛрдЬрд╝рд┐рд╢рдирд▓ рд░рд┐рдкреНрд░реЗрдЬрд╝реЗрдВрдЯреЗрд╢рди рд╡реЗрдХреНрдЯрд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрдкрд╛рд░реНрд╕ рд╡рди-рд╣реЙрдЯ рд░рд┐рдкреНрд░реЗрдЬрд╝реЗрдВрдЯреЗрд╢рди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдерд╛ред рдпрд╣ рд╡рди-рд╣реЙрдЯ рд░рд┐рдкреНрд░реЗрдЬрд╝реЗрдВрдЯреЗрд╢рди рдореЗрдореЛрд░реА-рдХреБрд╢рд▓ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рддреНрдпреЗрдХ рд╢рдмреНрдж рдХреЛ рдПрдХ-рджреВрд╕рд░реЗ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рди-рд╣реЙрдЯ рдПрдиреНрдХреЛрдбреЗрдб рд╡реЗрдХреНрдЯрд░ рд╢рдмреНрджреЛрдВ рдХреЗ рдмреАрдЪ рдХреЗ рдЕрд░реНрдердкреВрд░реНрдг рд╕рдорд╛рдирддрд╛рдУрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"рдЗрд╕ рдпреВрдирд┐рдЯ рдореЗрдВ, рд╣рдо **News AG** рдбреЗрдЯрд╛рд╕реЗрдЯ рдХрд╛ рдФрд░ рдЕрдзрд┐рдХ рдЕрдиреНрд╡реЗрд╖рдг рдХрд░реЗрдВрдЧреЗред рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдкрд┐рдЫрд▓реЗ рдпреВрдирд┐рдЯ рд╕реЗ рдХреБрдЫ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import tensorflow as tf\n",
|
||||
"from tensorflow import keras\n",
|
||||
"import tensorflow_datasets as tfds\n",
|
||||
"import numpy as np\n",
|
||||
"\n",
|
||||
"ds_train, ds_test = tfds.load('ag_news_subset').values()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреНрдпрд╛ рд╣реИ?\n",
|
||||
"\n",
|
||||
"**рдПрдореНрдмреЗрдбрд┐рдВрдЧ** рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рд╢рдмреНрджреЛрдВ рдХреЛ рдирд┐рдореНрди-рдЖрдпрд╛рдореА рдШрдиреЗ рд╡реЗрдХреНрдЯрд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЬреЛ рд╢рдмреНрдж рдХреЗ рдЕрд░реНрдердкреВрд░реНрдг рдЕрд░реНрде рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдмрд╛рдж рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдЕрд░реНрдердкреВрд░реНрдг рд╢рдмреНрдж рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреИрд╕реЗ рдмрдирд╛рдИ рдЬрд╛рдП, рд▓реЗрдХрд┐рди рдлрд┐рд▓рд╣рд╛рд▓, рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреЛ рд╢рдмреНрдж рд╡реЗрдХреНрдЯрд░ рдХреА рдЖрдпрд╛рдореАрдпрддрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рдПрдХ рддрд░реАрдХреЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪреЗрдВред \n",
|
||||
"\n",
|
||||
"рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд▓реЗрдпрд░ рдПрдХ рд╢рдмреНрдж рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддреА рд╣реИ рдФрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ `embedding_size` рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рд╡реЗрдХреНрдЯрд░ рдЙрддреНрдкрдиреНрди рдХрд░рддреА рд╣реИред рдПрдХ рддрд░рд╣ рд╕реЗ, рдпрд╣ `Dense` рд▓реЗрдпрд░ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ-рд╣реЙрдЯ рдПрдиреНрдХреЛрдбреЗрдб рд╡реЗрдХреНрдЯрд░ рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╢рдмреНрдж рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗ рд╕рдХрддреА рд╣реИред\n",
|
||||
"\n",
|
||||
"рд╣рдорд╛рд░реЗ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдкрд╣рд▓реА рд▓реЗрдпрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд▓реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдмреИрдЧ-рдСрдл-рд╡рд░реНрдбреНрд╕ рд╕реЗ **рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдмреИрдЧ** рдореЙрдбрд▓ рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╣рдо рдкрд╣рд▓реЗ рдЕрдкрдиреЗ рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╢рдмреНрдж рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЙрди рд╕рднреА рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдкрд░ рдХреБрдЫ рд╕рдордЧреНрд░ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ `sum`, `average` рдпрд╛ `max`ред \n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"рд╣рдорд╛рд░реЗ рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░ рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдпрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:\n",
|
||||
"\n",
|
||||
"* `TextVectorization` рд▓реЗрдпрд░, рдЬреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддреА рд╣реИ рдФрд░ рдЯреЛрдХрди рдирдВрдмрд░реЛрдВ рдХрд╛ рдПрдХ рдЯреЗрдиреНрд╕рд░ рдЙрддреНрдкрдиреНрди рдХрд░рддреА рд╣реИред рд╣рдо рдПрдХ рдЙрдЪрд┐рдд рд╢рдмреНрджрд╛рд╡рд▓реА рдЖрдХрд╛рд░ `vocab_size` рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдХрдо рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╢рдмреНрджреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВрдЧреЗред рдЗрдирдкреБрдЯ рдЖрдХрд╛рд░ 1 рд╣реЛрдЧрд╛, рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдЖрдХрд╛рд░ $n$ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ $n$ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рд╣реЛрдВрдЧреЗ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ 0 рд╕реЗ `vocab_size` рддрдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реЛрдЧреАред\n",
|
||||
"* `Embedding` рд▓реЗрдпрд░, рдЬреЛ $n$ рдирдВрдмрд░ рд▓реЗрддреА рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдирдВрдмрд░ рдХреЛ рдПрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд▓рдВрдмрд╛рдИ (рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ 100) рдХреЗ рдШрдиреЗ рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рдмрджрд▓ рджреЗрддреА рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, $n$ рдЖрдХрд╛рд░ рдХреЗ рдЗрдирдкреБрдЯ рдЯреЗрдиреНрд╕рд░ рдХреЛ $n\\times 100$ рдЖрдХрд╛рд░ рдХреЗ рдЯреЗрдиреНрд╕рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред \n",
|
||||
"* рдПрдЧреНрд░реАрдЧреЗрд╢рди рд▓реЗрдпрд░, рдЬреЛ рдЗрд╕ рдЯреЗрдиреНрд╕рд░ рдХрд╛ рдкрд╣рд▓реЗ рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде рдФрд╕рдд рд▓реЗрддреА рд╣реИ, рдпрд╛рдиреА рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рд╢рдмреНрджреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рднреА $n$ рдЗрдирдкреБрдЯ рдЯреЗрдиреНрд╕рд░ рдХрд╛ рдФрд╕рдд рдЧрдгрдирд╛ рдХрд░реЗрдЧреАред рдЗрд╕ рд▓реЗрдпрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ `Lambda` рд▓реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЙрд╕рдореЗрдВ рдФрд╕рдд рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗред рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рдЖрдХрд╛рд░ 100 рд╣реЛрдЧрд╛, рдФрд░ рдпрд╣ рдкреВрд░реЗ рдЗрдирдкреБрдЯ рдЕрдиреБрдХреНрд░рдо рдХрд╛ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реЛрдЧрд╛ред\n",
|
||||
"* рдЕрдВрддрд┐рдо `Dense` рд░реИрдЦрд┐рдХ рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░ред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Model: \"sequential\"\n",
|
||||
"_________________________________________________________________\n",
|
||||
" Layer (type) Output Shape Param # \n",
|
||||
"=================================================================\n",
|
||||
" text_vectorization (TextVec (None, None) 0 \n",
|
||||
" torization) \n",
|
||||
" \n",
|
||||
" embedding (Embedding) (None, None, 100) 3000000 \n",
|
||||
" \n",
|
||||
" lambda (Lambda) (None, 100) 0 \n",
|
||||
" \n",
|
||||
" dense (Dense) (None, 4) 404 \n",
|
||||
" \n",
|
||||
"=================================================================\n",
|
||||
"Total params: 3,000,404\n",
|
||||
"Trainable params: 3,000,404\n",
|
||||
"Non-trainable params: 0\n",
|
||||
"_________________________________________________________________\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"vocab_size = 30000\n",
|
||||
"batch_size = 128\n",
|
||||
"\n",
|
||||
"vectorizer = keras.layers.experimental.preprocessing.TextVectorization(max_tokens=vocab_size,input_shape=(1,))\n",
|
||||
"\n",
|
||||
"model = keras.models.Sequential([\n",
|
||||
" vectorizer, \n",
|
||||
" keras.layers.Embedding(vocab_size,100),\n",
|
||||
" keras.layers.Lambda(lambda x: tf.reduce_mean(x,axis=1)),\n",
|
||||
" keras.layers.Dense(4, activation='softmax')\n",
|
||||
"])\n",
|
||||
"model.summary()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"`summary` рдкреНрд░рд┐рдВрдЯрдЖрдЙрдЯ рдореЗрдВ, **output shape** рдХреЙрд▓рдо рдореЗрдВ рдкрд╣рд▓рд╛ рдЯреЗрдВрд╕рд░ рдбрд╛рдпрдореЗрдВрд╢рди `None` рдорд┐рдиреАрдмреИрдЪ рд╕рд╛рдЗрдЬ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдЯреЛрдХрди рдЕрдиреБрдХреНрд░рдо рдХреА рд▓рдВрдмрд╛рдИ рдХреЛред рдорд┐рдиреАрдмреИрдЪ рдореЗрдВ рд╕рднреА рдЯреЛрдХрди рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреА рд▓рдВрдмрд╛рдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрддреА рд╣реИред рд╣рдо рдЕрдЧрд▓реЗ рд╕реЗрдХреНрд╢рди рдореЗрдВ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗред\n",
|
||||
"\n",
|
||||
"рдЕрдм рдЪрд▓рд┐рдП рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдЯреНрд░реЗрди рдХрд░рддреЗ рд╣реИрдВ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Training vectorizer\n",
|
||||
"938/938 [==============================] - 20s 20ms/step - loss: 0.7891 - acc: 0.8155 - val_loss: 0.4470 - val_acc: 0.8642\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<keras.callbacks.History at 0x22255515100>"
|
||||
]
|
||||
},
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def extract_text(x):\n",
|
||||
" return x['title']+' '+x['description']\n",
|
||||
"\n",
|
||||
"def tupelize(x):\n",
|
||||
" return (extract_text(x),x['label'])\n",
|
||||
"\n",
|
||||
"print(\"Training vectorizer\")\n",
|
||||
"vectorizer.adapt(ds_train.take(500).map(extract_text))\n",
|
||||
"\n",
|
||||
"model.compile(loss='sparse_categorical_crossentropy',metrics=['acc'])\n",
|
||||
"model.fit(ds_train.map(tupelize).batch(batch_size),validation_data=ds_test.map(tupelize).batch(batch_size))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"nteract": {
|
||||
"transient": {
|
||||
"deleting": false
|
||||
}
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"> **рдиреЛрдЯ** рдХрд┐ рд╣рдо рдбреЗрдЯрд╛ рдХреЗ рдПрдХ рдЙрдкрд╕рдореБрдЪреНрдЪрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬрд╝рд░ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рддреЗрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд╕реЗ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рда рдХреЗ рд╕рднреА рдЯреЛрдХрди рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ рдореМрдЬреВрдж рди рд╣реЛрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЙрди рдЯреЛрдХрдиреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рд╕реЗ рд╕рдЯреАрдХрддрд╛ рдореЗрдВ рдереЛрдбрд╝реА рдХрдореА рд╣реЛ рд╕рдХрддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ рдкрд╛рда рдХрд╛ рдПрдХ рдЙрдкрд╕рдореБрдЪреНрдЪрдп рдЕрдХреНрд╕рд░ рд╢рдмреНрджрд╛рд╡рд▓реА рдХрд╛ рдЕрдЪреНрдЫрд╛ рдЕрдиреБрдорд╛рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдЕрдиреБрдХреНрд░рдо рдЖрдХрд╛рд░реЛрдВ рд╕реЗ рдирд┐рдкрдЯрдирд╛\n",
|
||||
"\n",
|
||||
"рдЖрдЗрдП рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдорд┐рдиреАрдмреИрдЪ рдореЗрдВ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреИрд╕реЗ рд╣реЛрддрд╛ рд╣реИред рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЗрдирдкреБрдЯ рдЯреЗрдиреНрд╕рд░ рдХрд╛ рдЖрдпрд╛рдо 1 рд╣реИ, рдФрд░ рд╣рдо 128-рд▓рдВрдмреЗ рдорд┐рдиреАрдмреИрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдЯреЗрдиреНрд╕рд░ рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрдХрд╛рд░ $128 \\times 1$ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреНрд░рддреНрдпреЗрдХ рд╡рд╛рдХреНрдп рдореЗрдВ рдЯреЛрдХрди рдХреА рд╕рдВрдЦреНрдпрд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрддреА рд╣реИред рдпрджрд┐ рд╣рдо `TextVectorization` рд▓реЗрдпрд░ рдХреЛ рдПрдХрд▓ рдЗрдирдкреБрдЯ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд▓реМрдЯрд╛рдП рдЧрдП рдЯреЛрдХрди рдХреА рд╕рдВрдЦреНрдпрд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрддреА рд╣реИ, рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдХреИрд╕реЗ рдЯреЛрдХрдирд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"tf.Tensor([ 1 45], shape=(2,), dtype=int64)\n",
|
||||
"tf.Tensor([ 112 1271 1 3 1747 158], shape=(6,), dtype=int64)\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"print(vectorizer('Hello, world!'))\n",
|
||||
"print(vectorizer('I am glad to meet you!'))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдм рд╣рдо рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬрд╝рд░ рдХреЛ рдХрдИ рдЕрдиреБрдХреНрд░рдореЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдЖрдпрддрд╛рдХрд╛рд░ рдЖрдХрд╛рд░ рдХрд╛ рдПрдХ рдЯреЗрдВрд╕рд░ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЕрдкреНрд░рдпреБрдХреНрдд рддрддреНрд╡реЛрдВ рдХреЛ PAD рдЯреЛрдХрди (рдЬреЛ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╢реВрдиреНрдп рд╣реИ) рд╕реЗ рднрд░рддрд╛ рд╣реИ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<tf.Tensor: shape=(2, 6), dtype=int64, numpy=\n",
|
||||
"array([[ 1, 45, 0, 0, 0, 0],\n",
|
||||
" [ 112, 1271, 1, 3, 1747, 158]], dtype=int64)>"
|
||||
]
|
||||
},
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"vectorizer(['Hello, world!','I am glad to meet you!'])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдпрд╣рд╛рдВ рд╣рдо рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"array([[[ 1.53059261e-02, 6.80514947e-02, 3.14026810e-02, ...,\n",
|
||||
" -8.92002955e-02, 1.52911525e-04, -5.65562584e-02],\n",
|
||||
" [ 2.57456154e-01, 2.79364467e-01, -2.03605562e-01, ...,\n",
|
||||
" -2.07474351e-01, 8.31158683e-02, -2.03911960e-01],\n",
|
||||
" [ 3.98201384e-02, -8.03454965e-03, 2.39790026e-02, ...,\n",
|
||||
" -7.18549127e-04, 2.66963355e-02, -4.30646613e-02],\n",
|
||||
" [ 3.98201384e-02, -8.03454965e-03, 2.39790026e-02, ...,\n",
|
||||
" -7.18549127e-04, 2.66963355e-02, -4.30646613e-02],\n",
|
||||
" [ 3.98201384e-02, -8.03454965e-03, 2.39790026e-02, ...,\n",
|
||||
" -7.18549127e-04, 2.66963355e-02, -4.30646613e-02],\n",
|
||||
" [ 3.98201384e-02, -8.03454965e-03, 2.39790026e-02, ...,\n",
|
||||
" -7.18549127e-04, 2.66963355e-02, -4.30646613e-02]],\n",
|
||||
"\n",
|
||||
" [[ 1.89674050e-01, 2.61548996e-01, -3.67433839e-02, ...,\n",
|
||||
" -2.07366899e-01, -1.05442435e-01, -2.36952081e-01],\n",
|
||||
" [ 6.16133213e-02, 1.80511594e-01, 9.77298319e-02, ...,\n",
|
||||
" -5.46628237e-02, -1.07340455e-01, -1.06589928e-01],\n",
|
||||
" [ 1.53059261e-02, 6.80514947e-02, 3.14026810e-02, ...,\n",
|
||||
" -8.92002955e-02, 1.52911525e-04, -5.65562584e-02],\n",
|
||||
" [-4.84890305e-02, -8.41715634e-02, 1.51529670e-01, ...,\n",
|
||||
" 1.28192469e-01, -7.77286515e-02, 1.26041949e-01],\n",
|
||||
" [-4.17212099e-02, -5.60694858e-02, 4.08860669e-02, ...,\n",
|
||||
" 8.70475471e-02, 8.92383084e-02, 1.67974353e-01],\n",
|
||||
" [ 2.85779923e-01, 4.57767487e-01, 4.52292450e-02, ...,\n",
|
||||
" -1.97419018e-01, -2.04659685e-01, -2.79758364e-01]]],\n",
|
||||
" dtype=float32)"
|
||||
]
|
||||
},
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"model.layers[1](vectorizer(['Hello, world!','I am glad to meet you!'])).numpy()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **рдиреЛрдЯ**: рдкреИрдбрд┐рдВрдЧ рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рд╕рдордЭрджрд╛рд░реА рд╣реЛрддреА рд╣реИ рдХрд┐ рдбреЗрдЯрд╛рд╕реЗрдЯ рдореЗрдВ рд╕рднреА рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЛ рдЙрдирдХреА рд▓рдВрдмрд╛рдИ рдмрдврд╝рдиреЗ рдХреЗ рдХреНрд░рдо рдореЗрдВ (рдпрд╛ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рдЯреЛрдХрди рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░) рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЗрд╕рд╕реЗ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛрдЧрд╛ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдорд┐рдиреАрдмреИрдЪ рдореЗрдВ рд╕рдорд╛рди рд▓рдВрдмрд╛рдИ рдХреЗ рдЕрдиреБрдХреНрд░рдо рд╢рд╛рдорд┐рд▓ рд╣реЛрдВред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рд╕реЗрдорд╛рдВрдЯрд┐рдХ рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕: рд╡рд░реНрдб2рд╡реЗрдХ\n",
|
||||
"\n",
|
||||
"рд╣рдорд╛рд░реЗ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд▓реЗрдпрд░ рдиреЗ рд╢рдмреНрджреЛрдВ рдХреЛ рд╡реЗрдХреНрдЯрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ рдореИрдк рдХрд░рдирд╛ рд╕реАрдЦрд╛, рд▓реЗрдХрд┐рди рдЗрди рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡реЛрдВ рдореЗрдВ рд╕реЗрдорд╛рдВрдЯрд┐рдХ рдЕрд░реНрде рдирд╣реАрдВ рдерд╛ред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдо рдПрдХ рдРрд╕рд╛ рд╡реЗрдХреНрдЯрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╕реАрдЦреЗрдВ рдЬрд┐рд╕рдореЗрдВ рд╕рдорд╛рди рд╢рдмреНрдж рдпрд╛ рдкрд░реНрдпрд╛рдпрд╡рд╛рдЪреА рд╢рдмреНрдж рдХреБрдЫ рд╡реЗрдХреНрдЯрд░ рджреВрд░реА (рдЬреИрд╕реЗ рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рджреВрд░реА) рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рдХрд░реАрдм рд╣реЛрдВред\n",
|
||||
"\n",
|
||||
"рдЗрд╕рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдореЙрдбрд▓ рдХреЛ [Word2Vec](https://en.wikipedia.org/wiki/Word2vec) рдЬреИрд╕реА рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдбрд╝реЗ рдЯреЗрдХреНрд╕реНрдЯ рд╕рдВрдЧреНрд░рд╣ рдкрд░ рдкреНрд░реАрдЯреНрд░реЗрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рджреЛ рдореБрдЦреНрдп рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдЬреЛ рд╢рдмреНрджреЛрдВ рдХрд╛ рд╡рд┐рддрд░рд┐рдд рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ:\n",
|
||||
"\n",
|
||||
" - **рдХрдВрдЯреАрдиреНрдпреБрдЕрд╕ рдмреИрдЧ-рдСрдл-рд╡рд░реНрдбреНрд╕** (CBoW), рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдореЙрдбрд▓ рдХреЛ рдЖрд╕-рдкрд╛рд╕ рдХреЗ рд╕рдВрджрд░реНрдн рд╕реЗ рдПрдХ рд╢рдмреНрдж рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рджрд┐рдП рдЧрдП ngram $(W_{-2},W_{-1},W_0,W_1,W_2)$ рдореЗрдВ, рдореЙрдбрд▓ рдХрд╛ рд▓рдХреНрд╖реНрдп $(W_{-2},W_{-1},W_1,W_2)$ рд╕реЗ $W_0$ рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдирд╛ рд╣реИред\n",
|
||||
" - **рдХрдВрдЯреАрдиреНрдпреБрдЕрд╕ рд╕реНрдХрд┐рдк-рдЧреНрд░рд╛рдо** CBoW рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИред рдпрд╣ рдореЙрдбрд▓ рд╕рдВрджрд░реНрдн рд╢рдмреНрджреЛрдВ рдХреА рдЖрд╕-рдкрд╛рд╕ рдХреА рд╡рд┐рдВрдбреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд░реНрддрдорд╛рди рд╢рдмреНрдж рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"CBoW рддреЗрдЬ рд╣реИ, рдЬрдмрдХрд┐ рд╕реНрдХрд┐рдк-рдЧреНрд░рд╛рдо рдзреАрдорд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрдо рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╢рдмреНрджреЛрдВ рдХрд╛ рдмреЗрд╣рддрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"Google News рдбреЗрдЯрд╛рд╕реЗрдЯ рдкрд░ рдкреНрд░реАрдЯреНрд░реЗрди рдХрд┐рдП рдЧрдП Word2Vec рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо **gensim** рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдиреАрдЪреЗ рд╣рдо 'neural' рдХреЗ рд╕рдмрд╕реЗ рд╕рдорд╛рди рд╢рдмреНрджреЛрдВ рдХреЛ рдвреВрдВрдврддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"> **Note:** рдЬрдм рдЖрдк рдкрд╣рд▓реА рдмрд╛рд░ рд╢рдмреНрдж рд╡реЗрдХреНрдЯрд░ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рдХреБрдЫ рд╕рдордп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import gensim.downloader as api\n",
|
||||
"w2v = api.load('word2vec-google-news-300')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 12,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"neuronal -> 0.7804799675941467\n",
|
||||
"neurons -> 0.7326500415802002\n",
|
||||
"neural_circuits -> 0.7252851724624634\n",
|
||||
"neuron -> 0.7174385190010071\n",
|
||||
"cortical -> 0.6941086649894714\n",
|
||||
"brain_circuitry -> 0.6923246383666992\n",
|
||||
"synaptic -> 0.6699118614196777\n",
|
||||
"neural_circuitry -> 0.6638563275337219\n",
|
||||
"neurochemical -> 0.6555314064025879\n",
|
||||
"neuronal_activity -> 0.6531826257705688\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"for w,p in w2v.most_similar('neural'):\n",
|
||||
" print(f\"{w} -> {p}\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рд╣рдо рд╢рдмреНрдж рд╕реЗ рд╡реЗрдХреНрдЯрд░ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рднреА рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╡рд░реНрдЧреАрдХрд░рдг рдореЙрдбрд▓ рдХреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдореЗрдВ 300 рдШрдЯрдХ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рд╣рдо рдХреЗрд╡рд▓ рд╡реЗрдХреНрдЯрд░ рдХреЗ рдкрд╣рд▓реЗ 20 рдШрдЯрдХ рджрд┐рдЦрд╛ рд░рд╣реЗ рд╣реИрдВ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 13,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"array([ 0.01226807, 0.06225586, 0.10693359, 0.05810547, 0.23828125,\n",
|
||||
" 0.03686523, 0.05151367, -0.20703125, 0.01989746, 0.10058594,\n",
|
||||
" -0.03759766, -0.1015625 , -0.15820312, -0.08105469, -0.0390625 ,\n",
|
||||
" -0.05053711, 0.16015625, 0.2578125 , 0.10058594, -0.25976562],\n",
|
||||
" dtype=float32)"
|
||||
]
|
||||
},
|
||||
"execution_count": 13,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"w2v['play'][:20]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рд╕рд╛рд░реНрдердХ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреА рдорд╣рд╛рди рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдЕрд░реНрде рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡реЗрдХреНрдЯрд░ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдРрд╕рд╛ рд╢рдмреНрдж рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рд╡реЗрдХреНрдЯрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ *рд░рд╛рдЬрд╛* рдФрд░ *рдорд╣рд┐рд▓рд╛* рд╢рдмреНрджреЛрдВ рдХреЗ рдЬрд┐рддрдирд╛ рдХрд░реАрдм рд╣реЛ рд╕рдХреЗ, рдФрд░ *рдкреБрд░реБрд╖* рд╢рдмреНрдж рд╕реЗ рдЬрд┐рддрдирд╛ рджреВрд░ рд╣реЛ рд╕рдХреЗ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 14,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"('queen', 0.7118192911148071)"
|
||||
]
|
||||
},
|
||||
"execution_count": 14,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"w2v.most_similar(positive=['king','woman'],negative=['man'])[0]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"tags": []
|
||||
},
|
||||
"source": [
|
||||
"рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреБрдЫ рдЖрдВрддрд░рд┐рдХ GenSym рдЬрд╛рджреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореВрд▓ рддрд░реНрдХ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд╡реЗрдХреНрдЯрд░ рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рд╡реЗрдХреНрдЯрд░ рд╕рдВрдЪрд╛рд▓рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╡рд╣ рд╢рдмреНрджреЛрдВ рдХреЗ **рдЕрд░реНрдереЛрдВ** рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░реЗрдЧрд╛ред рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╡реЗрдХреНрдЯрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рд╣рдо **KING-MAN+WOMAN** рдХреЗ рдЕрдиреБрд░реВрдк рд╡реЗрдХреНрдЯрд░ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ (рд╕рдВрдмрдВрдзрд┐рдд рд╢рдмреНрджреЛрдВ рдХреЗ рд╡реЗрдХреНрдЯрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдкрд░ `+` рдФрд░ `-` рд╕рдВрдЪрд╛рд▓рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ), рдФрд░ рдлрд┐рд░ рдЙрд╕ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд╕рдмрд╕реЗ рдирд┐рдХрдЯрддрдо рд╢рдмреНрдж рдХреЛ рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдЦреЛрдЬрддреЗ рд╣реИрдВ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 15,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"'queen'"
|
||||
]
|
||||
},
|
||||
"execution_count": 15,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# get the vector corresponding to kind-man+woman\n",
|
||||
"qvec = w2v['king']-1.7*w2v['man']+1.7*w2v['woman']\n",
|
||||
"# find the index of the closest embedding vector \n",
|
||||
"d = np.sum((w2v.vectors-qvec)**2,axis=1)\n",
|
||||
"min_idx = np.argmin(d)\n",
|
||||
"# find the corresponding word\n",
|
||||
"w2v.index_to_key[min_idx]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **NOTE**: рд╣рдордиреЗ *man* рдФрд░ *woman* рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рдЧреБрдгрд╛рдВрдХ рдЬреЛрдбрд╝рдирд╛ рдкрдбрд╝рд╛ - рдЗрд╕реЗ рд╣рдЯрд╛рдХрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"рд╕рдмрд╕реЗ рдирдЬрд╝рджреАрдХреА рд╡реЗрдХреНрдЯрд░ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо TensorFlow рдХреА рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдорд╛рд░реЗ рд╡реЗрдХреНрдЯрд░ рдФрд░ рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ рд╕рднреА рд╡реЗрдХреНрдЯрд░ рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рдХрд╛ рд╡реЗрдХреНрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдФрд░ рдлрд┐рд░ `argmin` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдиреНрдпреВрдирддрдо рд╢рдмреНрдж рдХрд╛ рдЗрдВрдбреЗрдХреНрд╕ рдЦреЛрдЬрд╛ рдЬрд╛ рд╕рдХреЗред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рд╣рд╛рд▓рд╛рдВрдХрд┐ Word2Vec рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╢рд╛рдирджрд╛рд░ рддрд░реАрдХрд╛ рд▓рдЧрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдХрдИ рдиреБрдХрд╕рд╛рди рднреА рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:\n",
|
||||
"\n",
|
||||
"* CBoW рдФрд░ skip-gram рдореЙрдбрд▓ рджреЛрдиреЛрдВ **рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рдирд╛рддреНрдордХ рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕** рд╣реИрдВ, рдФрд░ рдпреЗ рдХреЗрд╡рд▓ рд╕реНрдерд╛рдиреАрдп рд╕рдВрджрд░реНрдн рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВред Word2Vec рд╡реИрд╢реНрд╡рд┐рдХ рд╕рдВрджрд░реНрдн рдХрд╛ рд▓рд╛рдн рдирд╣реАрдВ рдЙрдард╛рддрд╛ред\n",
|
||||
"* Word2Vec рд╢рдмреНрдж рдХреА **рд░реВрдк-рд░рдЪрдирд╛** (morphology) рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрддрд╛, рдпрд╛рдиреА рдЗрд╕ рддрдереНрдп рдХреЛ рдХрд┐ рд╢рдмреНрдж рдХрд╛ рдЕрд░реНрде рдЙрд╕рдХреЗ рд╡рд┐рднрд┐рдиреНрди рднрд╛рдЧреЛрдВ, рдЬреИрд╕реЗ рдореВрд▓ (root), рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред \n",
|
||||
"\n",
|
||||
"**FastText** рджреВрд╕рд░реЗ рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ рдФрд░ Word2Vec рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрдХрд░ рдкреНрд░рддреНрдпреЗрдХ рд╢рдмреНрдж рдФрд░ рдЙрд╕рдореЗрдВ рдкрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЕрдХреНрд╖рд░ n-grams рдХреЗ рд▓рд┐рдП рд╡реЗрдХреНрдЯрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╕реАрдЦрддрд╛ рд╣реИред рдЗрди рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡реЛрдВ рдХреЗ рдорд╛рдиреЛрдВ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЪрд░рдг рдореЗрдВ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рдФрд╕рддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдкреВрд░реНрд╡-рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЧрдгрдирд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдпрд╣ рд╢рдмреНрдж рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рдХреЛ рдЙрдк-рд╢рдмреНрдж рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдПрдиреНрдХреЛрдб рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"рдПрдХ рдЕрдиреНрдп рд╡рд┐рдзрд┐, **GloVe**, рд╢рдмреНрдж рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрдкрдирд╛рддреА рд╣реИ, рдЬреЛ рд╢рдмреНрдж-рд╕рдВрджрд░реНрдн рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рдЧреБрдгрдирдЦрдВрдбрди (factorization) рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдПрдХ рдмрдбрд╝рд╛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рд╢рдмреНрджреЛрдВ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЧрд┐рдирддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдпрд╣ рдЗрд╕ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдирд┐рдореНрди рдЖрдпрд╛рдореЛрдВ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рд╣рд╛рдирд┐ (reconstruction loss) рдиреНрдпреВрдирддрдо рд╣реЛред\n",
|
||||
"\n",
|
||||
"gensim рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЗрди рд╢рдмреНрдж рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИ, рдФрд░ рдЖрдк рдКрдкрд░ рджрд┐рдП рдЧрдП рдореЙрдбрд▓ рд▓реЛрдбрд┐рдВрдЧ рдХреЛрдб рдХреЛ рдмрджрд▓рдХрд░ рдЗрдирдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Keras рдореЗрдВ рдкреНрд░реАрдЯреНрд░реЗрдВрдб рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛\n",
|
||||
"\n",
|
||||
"рд╣рдо рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдорд╛рд░реЗ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд▓реЗрдпрд░ рдХреА рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рд╡рд░реНрдб2рд╡реЗрдХ рдЬреИрд╕реЗ рд╕реЗрдорд╛рдВрдЯрд┐рдХ рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рднрд░ рд╕рдХреЗрдВред рдкреНрд░реАрдЯреНрд░реЗрдВрдб рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдФрд░ рдЯреЗрдХреНрд╕реНрдЯ рдХреЙрд░реНрдкрд╕ рдХреА рд╢рдмреНрджрд╛рд╡рд▓реА рд╕рдВрднрд╡рддрдГ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рдПрдЧреА, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рдХреЛ рдЪреБрдирдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣рд╛рдВ рд╣рдо рджреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ: рдЯреЛрдХрдирд╛рдЗрдЬрд╝рд░ рд╢рдмреНрджрд╛рд╡рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдФрд░ рд╡рд░реНрдб2рд╡реЗрдХ рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рдХреА рд╢рдмреНрджрд╛рд╡рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред\n",
|
||||
"\n",
|
||||
"### рдЯреЛрдХрдирд╛рдЗрдЬрд╝рд░ рд╢рдмреНрджрд╛рд╡рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛\n",
|
||||
"\n",
|
||||
"рдЬрдм рдЯреЛрдХрдирд╛рдЗрдЬрд╝рд░ рд╢рдмреНрджрд╛рд╡рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╢рдмреНрджрд╛рд╡рд▓реА рдХреЗ рдХреБрдЫ рд╢рдмреНрджреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдб2рд╡реЗрдХ рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рдЙрдкрд▓рдмреНрдз рд╣реЛрдВрдЧреЗ, рдФрд░ рдХреБрдЫ рдЧрд╛рдпрдм рд╣реЛрдВрдЧреЗред рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реА рд╢рдмреНрджрд╛рд╡рд▓реА рдХрд╛ рдЖрдХрд╛рд░ `vocab_size` рд╣реИ, рдФрд░ рд╡рд░реНрдб2рд╡реЗрдХ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд╡реЗрдХреНрдЯрд░ рдХреА рд▓рдВрдмрд╛рдИ `embed_size` рд╣реИ, рддреЛ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд▓реЗрдпрд░ рдХреЛ `vocab_size`$\\times$`embed_size` рдЖрдХрд╛рд░ рдХреА рд╡реЗрдЯ рдореИрдЯреНрд░рд┐рдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдо рдЗрд╕ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рд╢рдмреНрджрд╛рд╡рд▓реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдХрд░ рднрд░реЗрдВрдЧреЗ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"metadata": {
|
||||
"tags": []
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Embedding size: 300\n",
|
||||
"Populating matrix, this will take some time...Done, found 4551 words, 784 words missing\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"embed_size = len(w2v.get_vector('hello'))\n",
|
||||
"print(f'Embedding size: {embed_size}')\n",
|
||||
"\n",
|
||||
"vocab = vectorizer.get_vocabulary()\n",
|
||||
"W = np.zeros((vocab_size,embed_size))\n",
|
||||
"print('Populating matrix, this will take some time...',end='')\n",
|
||||
"found, not_found = 0,0\n",
|
||||
"for i,w in enumerate(vocab):\n",
|
||||
" try:\n",
|
||||
" W[i] = w2v.get_vector(w)\n",
|
||||
" found+=1\n",
|
||||
" except:\n",
|
||||
" # W[i] = np.random.normal(0.0,0.3,size=(embed_size,))\n",
|
||||
" not_found+=1\n",
|
||||
"\n",
|
||||
"print(f\"Done, found {found} words, {not_found} words missing\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рд╢рдмреНрджреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ Word2Vec рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВ, рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╢реВрдиреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдПрдХ рд░реИрдВрдбрдо рд╡реЗрдХреНрдЯрд░ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"рдЕрдм рд╣рдо рдкреНрд░реАрдЯреНрд░реЗрдВрдб рд╡реЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд▓реЗрдпрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"emb = keras.layers.Embedding(vocab_size,embed_size,weights=[W],trainable=False)\n",
|
||||
"model = keras.models.Sequential([\n",
|
||||
" vectorizer, emb,\n",
|
||||
" keras.layers.Lambda(lambda x: tf.reduce_mean(x,axis=1)),\n",
|
||||
" keras.layers.Dense(4, activation='softmax')\n",
|
||||
"])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"938/938 [==============================] - 10s 10ms/step - loss: 1.1075 - acc: 0.7822 - val_loss: 0.9134 - val_acc: 0.8175\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<keras.callbacks.History at 0x2220226ef10>"
|
||||
]
|
||||
},
|
||||
"execution_count": 11,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"model.compile(loss='sparse_categorical_crossentropy',metrics=['acc'])\n",
|
||||
"model.fit(ds_train.map(tupelize).batch(batch_size),\n",
|
||||
" validation_data=ds_test.map(tupelize).batch(batch_size))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **рдиреЛрдЯ**: рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЬрдм рд╣рдо `Embedding` рдмрдирд╛рддреЗ рд╕рдордп `trainable=False` рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо Embedding рд▓реЗрдпрд░ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕рд╕реЗ рд╕рдЯреАрдХрддрд╛ рдереЛрдбрд╝реА рдХрдо рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЛ рддреЗрдЬ рдХрд░ рджреЗрддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"### рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд╢рдмреНрджрд╛рд╡рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛\n",
|
||||
"\n",
|
||||
"рдкрд┐рдЫрд▓реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ TextVectorization рдФрд░ Embedding рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рд╢рдмреНрджрд╛рд╡рд▓рд┐рдпрд╛рдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрдВред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдорд╛рдзрд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:\n",
|
||||
"* рд╣рдорд╛рд░реЗ рд╢рдмреНрджрд╛рд╡рд▓реА рдкрд░ Word2Vec рдореЙрдбрд▓ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░реЗрдВред\n",
|
||||
"* рдкреНрд░реАрдЯреНрд░реЗрдВрдб Word2Vec рдореЙрдбрд▓ рдХреА рд╢рдмреНрджрд╛рд╡рд▓реА рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░рд╛ рдбреЗрдЯрд╛рд╕реЗрдЯ рд▓реЛрдб рдХрд░реЗрдВред рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╢рдмреНрджрд╛рд╡рд▓рд┐рдпрд╛рдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"рджреВрд╕рд░рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЖрд╕рд╛рди рд▓рдЧрддрд╛ рд╣реИ, рддреЛ рдЪрд▓рд┐рдП рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо Word2Vec рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд╕реЗ рд▓реА рдЧрдИ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╢рдмреНрджрд╛рд╡рд▓реА рдХреЗ рд╕рд╛рде рдПрдХ `TextVectorization` рд▓реЗрдпрд░ рдмрдирд╛рдПрдВрдЧреЗ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 12,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"vocab = list(w2v.vocab.keys())\n",
|
||||
"vectorizer = keras.layers.experimental.preprocessing.TextVectorization(input_shape=(1,))\n",
|
||||
"vectorizer.set_vocabulary(vocab)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдЬреЗрдирд╕рд┐рдо рд╡рд░реНрдб рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдлрд╝рдВрдХреНрд╢рди, `get_keras_embeddings`, рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд Keras рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рд▓реЗрдпрд░ рдмрдирд╛ рджреЗрдЧрд╛ред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 13,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Epoch 1/5\n",
|
||||
"938/938 [==============================] - 20s 14ms/step - loss: 1.3377 - acc: 0.4978 - val_loss: 1.2995 - val_acc: 0.5647\n",
|
||||
"Epoch 2/5\n",
|
||||
"938/938 [==============================] - 10s 10ms/step - loss: 1.2587 - acc: 0.5722 - val_loss: 1.2339 - val_acc: 0.5842\n",
|
||||
"Epoch 3/5\n",
|
||||
"938/938 [==============================] - 10s 10ms/step - loss: 1.1980 - acc: 0.5884 - val_loss: 1.1826 - val_acc: 0.5954\n",
|
||||
"Epoch 4/5\n",
|
||||
"938/938 [==============================] - 12s 13ms/step - loss: 1.1503 - acc: 0.6002 - val_loss: 1.1417 - val_acc: 0.6018\n",
|
||||
"Epoch 5/5\n",
|
||||
"938/938 [==============================] - 11s 12ms/step - loss: 1.1120 - acc: 0.6097 - val_loss: 1.1083 - val_acc: 0.6104\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<keras.callbacks.History at 0x2220ccb81c0>"
|
||||
]
|
||||
},
|
||||
"execution_count": 13,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"model = keras.models.Sequential([\n",
|
||||
" vectorizer, \n",
|
||||
" w2v.get_keras_embedding(train_embeddings=False),\n",
|
||||
" keras.layers.Lambda(lambda x: tf.reduce_mean(x,axis=1)),\n",
|
||||
" keras.layers.Dense(4, activation='softmax')\n",
|
||||
"])\n",
|
||||
"model.compile(loss='sparse_categorical_crossentropy',metrics=['acc'])\n",
|
||||
"model.fit(ds_train.map(tupelize).batch(128),validation_data=ds_test.map(tupelize).batch(128),epochs=5)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рд╣рдо рдЬреЛ рдЙрдЪреНрдЪ рд╕рдЯреАрдХрддрд╛ рдирд╣реАрдВ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ, рдЙрд╕рдХреЗ рдХрд╛рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЗ рдХреБрдЫ рд╢рдмреНрдж рдкреНрд░реАрдЯреНрд░реЗрдВрдб GloVe рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕реЗ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рд╕рдВрджрд░реНрднрд╛рддреНрдордХ рдПрдореНрдмреЗрдбрд┐рдВрдЧ\n",
|
||||
"\n",
|
||||
"рдкрд╛рд░рдВрдкрд░рд┐рдХ рдкреНрд░реАрдЯреНрд░реЗрдВрдб рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдЬреИрд╕реЗ Word2Vec рдХреА рдПрдХ рдореБрдЦреНрдп рд╕реАрдорд╛ рдпрд╣ рд╣реИ рдХрд┐, рднрд▓реЗ рд╣реА рд╡реЗ рдХрд┐рд╕реА рд╢рдмреНрдж рдХрд╛ рдХреБрдЫ рдЕрд░реНрде рдкрдХрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд╡реЗ рд╡рд┐рднрд┐рдиреНрди рдЕрд░реНрдереЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдпрд╣ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдореЙрдбрд▓реНрд╕ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╢рдмреНрдж 'play' рдХрд╛ рдЗрди рджреЛ рд╡рд╛рдХреНрдпреЛрдВ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрд░реНрде рд╣реИ:\n",
|
||||
"- рдореИрдВ рдерд┐рдПрдЯрд░ рдореЗрдВ рдПрдХ **play** рджреЗрдЦрдиреЗ рдЧрдпрд╛ред\n",
|
||||
"- рдЬреЙрди рдЕрдкрдиреЗ рджреЛрд╕реНрддреЛрдВ рдХреЗ рд╕рд╛рде **play** рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"рд╣рдордиреЗ рдЬрд┐рди рдкреНрд░реАрдЯреНрд░реЗрдВрдб рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреА рдмрд╛рдд рдХреА, рд╡реЗ рд╢рдмреНрдж 'play' рдХреЗ рджреЛрдиреЛрдВ рдЕрд░реНрдереЛрдВ рдХреЛ рдПрдХ рд╣реА рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдореЗрдВ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВред рдЗрд╕ рд╕реАрдорд╛ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ **рднрд╛рд╖рд╛ рдореЙрдбрд▓** рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдмрдирд╛рдиреА рд╣реЛрдЧреА, рдЬреЛ рдмрдбрд╝реЗ рдЯреЗрдХреНрд╕реНрдЯ рдХреЙрд░реНрдкрд╕ рдкрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ *рдЬрд╛рдирддрд╛ рд╣реИ* рдХрд┐ рд╢рдмреНрджреЛрдВ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рдВрджрд░реНрднрд╛рддреНрдордХ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЕрдЧрд▓реЗ рдпреВрдирд┐рдЯ рдореЗрдВ рднрд╛рд╖рд╛ рдореЙрдбрд▓реНрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддреЗ рд╕рдордп рдЗрд╕ рдкрд░ рд╡рд╛рдкрд╕ рдЖрдПрдВрдЧреЗред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**рдЕрд╕реНрд╡реАрдХрд░рдг**: \nрдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ AI рдЕрдиреБрд╡рд╛рдж рд╕реЗрд╡рд╛ [Co-op Translator](https://github.com/Azure/co-op-translator) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрдмрдХрд┐ рд╣рдо рд╕рдЯреАрдХрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрдиреБрд╡рд╛рдж рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдпрд╛ рдЕрд╢реБрджреНрдзрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдореВрд▓ рднрд╛рд╖рд╛ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдореВрд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рд╕реНрд░реЛрдд рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдкреЗрд╢реЗрд╡рд░ рдорд╛рдирд╡ рдЕрдиреБрд╡рд╛рдж рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред рдЗрд╕ рдЕрдиреБрд╡рд╛рдж рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд┐рд╕реА рднреА рдЧрд▓рддрдлрд╣рдореА рдпрд╛ рдЧрд▓рдд рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╣рдо рдЙрддреНрддрд░рджрд╛рдпреА рдирд╣реАрдВ рд╣реИрдВред\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"interpreter": {
|
||||
"hash": "0cb620c6d4b9f7a635928804c26cf22403d89d98d79684e4529119355ee6d5a5"
|
||||
},
|
||||
"kernel_info": {
|
||||
"name": "conda-env-py37_tensorflow-py"
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "py37_tensorflow",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.8.12"
|
||||
},
|
||||
"nteract": {
|
||||
"version": "nteract-front-end@1.0.0"
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "b859482be7f61d1eadc2c6a2720a37e4",
|
||||
"translation_date": "2025-08-31T15:26:22+00:00",
|
||||
"source_file": "lessons/5-NLP/14-Embeddings/EmbeddingsTF.ipynb",
|
||||
"language_code": "hi"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 4
|
||||
}
|
||||
|
|
@ -0,0 +1,574 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "NXTSugt6ieXh"
|
||||
},
|
||||
"source": [
|
||||
"## CBoW рдореЙрдбрд▓ рдХрд╛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг\n",
|
||||
"\n",
|
||||
"рдпрд╣ рдиреЛрдЯрдмреБрдХ [AI for Beginners Curriculum](http://aka.ms/ai-beginners) рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо CBoW рднрд╛рд╖рд╛ рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВрдЧреЗ рддрд╛рдХрд┐ рд╣рдо рдЕрдкрдирд╛ Word2Vec рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд╕реНрдкреЗрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗрдВред рд╣рдо AG News рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЛ рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"import torch\n",
|
||||
"import torchtext\n",
|
||||
"import os\n",
|
||||
"import collections\n",
|
||||
"import builtins\n",
|
||||
"import random\n",
|
||||
"import numpy as np"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "q-UiiJUKaxHj"
|
||||
},
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "TFbR8CZaTZ1q"
|
||||
},
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"рдкрд╣рд▓реЗ рдЪрд▓рд┐рдП рд╣рдорд╛рд░рд╛ рдбреЗрдЯрд╛рд╕реЗрдЯ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЯреЛрдХрдирд╛рдЗрдЬрд╝рд░ рдФрд░ рд╢рдмреНрджрд╛рд╡рд▓реА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдо `vocab_size` рдХреЛ 5000 рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗ рддрд╛рдХрд┐ рдЧрдгрдирд╛рдУрдВ рдХреЛ рдереЛрдбрд╝рд╛ рд╕реАрдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред\n"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "HIwC7lI5T-ov"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"def load_dataset(ngrams = 1, min_freq = 1, vocab_size = 5000 , lines_cnt = 500):\n",
|
||||
" tokenizer = torchtext.data.utils.get_tokenizer('basic_english')\n",
|
||||
" print(\"Loading dataset...\")\n",
|
||||
" test_dataset, train_dataset = torchtext.datasets.AG_NEWS(root='./data')\n",
|
||||
" train_dataset = list(train_dataset)\n",
|
||||
" test_dataset = list(test_dataset)\n",
|
||||
" classes = ['World', 'Sports', 'Business', 'Sci/Tech']\n",
|
||||
" print('Building vocab...')\n",
|
||||
" counter = collections.Counter()\n",
|
||||
" for i, (_, line) in enumerate(train_dataset):\n",
|
||||
" counter.update(torchtext.data.utils.ngrams_iterator(tokenizer(line),ngrams=ngrams))\n",
|
||||
" if i == lines_cnt:\n",
|
||||
" break\n",
|
||||
" vocab = torchtext.vocab.Vocab(collections.Counter(dict(counter.most_common(vocab_size))), min_freq=min_freq)\n",
|
||||
" return train_dataset, test_dataset, classes, vocab, tokenizer"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "wdZuygtgiuLG"
|
||||
},
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"train_dataset, test_dataset, _, vocab, tokenizer = load_dataset()"
|
||||
],
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "4d1nU1gsivGu",
|
||||
"outputId": "949fe272-ae0e-49f5-c373-6703458b3a74"
|
||||
},
|
||||
"execution_count": null,
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "stream",
|
||||
"name": "stdout",
|
||||
"text": [
|
||||
"Loading dataset...\n",
|
||||
"Building vocab...\n"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"def encode(x, vocabulary, tokenizer = tokenizer):\n",
|
||||
" return [vocabulary[s] for s in tokenizer(x)]"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "1XDYNhG8ToFV"
|
||||
},
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "LIlQk6_PaHVY"
|
||||
},
|
||||
"source": [
|
||||
"## CBoW рдореЙрдбрд▓\n",
|
||||
"\n",
|
||||
"CBoW $2N$ рдкрдбрд╝реЛрд╕реА рд╢рдмреНрджреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рд╢рдмреНрдж рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдирд╛ рд╕реАрдЦрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм $N=1$ рд╣реЛ, рддреЛ рд╣рдореЗрдВ рд╡рд╛рдХреНрдп *I like to train networks* рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝реЗ рдорд┐рд▓реЗрдВрдЧреЗ: (like,I), (I, like), (to, like), (like,to), (train,to), (to, train), (networks, train), (train,networks)ред рдпрд╣рд╛рдБ, рдкрд╣рд▓рд╛ рд╢рдмреНрдж рдкрдбрд╝реЛрд╕реА рд╢рдмреНрдж рд╣реИ рдЬрд┐рд╕реЗ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рд╢рдмреНрдж рд╡рд╣ рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдо рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░ рд░рд╣реЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"рдЕрдЧрд▓реЗ рд╢рдмреНрдж рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкрдбрд╝реЛрд╕реА рд╢рдмреНрдж рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рд╢рдмреНрдж рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред CBoW рдиреЗрдЯрд╡рд░реНрдХ рдХреА рд╕рдВрд░рдЪрдирд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ:\n",
|
||||
"\n",
|
||||
"* рдЗрдирдкреБрдЯ рд╢рдмреНрдж рдХреЛ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд▓реЗрдпрд░ рд╕реЗ рдЧреБрдЬрд╛рд░рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣реА рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд▓реЗрдпрд░ рд╣рдорд╛рд░рд╛ Word2Vec рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдЕрд▓рдЧ рд╕реЗ `embedder` рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣рдо рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд╕рд╛рдЗрдЬ = 30 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдк рдЙрдЪреНрдЪ рдбрд╛рдЗрдореЗрдВрд╢рди рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВ (рд╡рд╛рд╕реНрддрд╡рд┐рдХ Word2Vec рдореЗрдВ 300 рд╣реЛрддрд╛ рд╣реИ)ред\n",
|
||||
"* рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд╡реЗрдХреНрдЯрд░ рдХреЛ рдлрд┐рд░ рдПрдХ рд▓реАрдирд┐рдпрд░ рд▓реЗрдпрд░ рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдЖрдЙрдЯрдкреБрдЯ рд╢рдмреНрдж рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░реЗрдЧрд╛ред рдЗрд╕рд▓рд┐рдП рдЗрд╕рдореЗрдВ `vocab_size` рдиреНрдпреВрд░реЙрдиреНрд╕ рд╣реЛрдВрдЧреЗред\n",
|
||||
"\n",
|
||||
"рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо `CrossEntropyLoss` рдХреЛ рд▓реЙрд╕ рдлрдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдХреЗрд╡рд▓ рд╢рдмреНрдж рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреА рд╣реЛрдЧреА, рдмрд┐рдирд╛ рд╡рди-рд╣реЙрдЯ рдПрдирдХреЛрдбрд┐рдВрдЧ рдХреЗред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"vocab_size = len(vocab)\n",
|
||||
"\n",
|
||||
"embedder = torch.nn.Embedding(num_embeddings = vocab_size, embedding_dim = 30)\n",
|
||||
"model = torch.nn.Sequential(\n",
|
||||
" embedder,\n",
|
||||
" torch.nn.Linear(in_features = 30, out_features = vocab_size),\n",
|
||||
")\n",
|
||||
"\n",
|
||||
"print(model)"
|
||||
],
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "akKTcKQKkfl2",
|
||||
"outputId": "da687e3e-a8ec-4c1a-e456-ab8cd6ac7dad"
|
||||
},
|
||||
"execution_count": null,
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "stream",
|
||||
"name": "stdout",
|
||||
"text": [
|
||||
"Sequential(\n",
|
||||
" (0): Embedding(5002, 30)\n",
|
||||
" (1): Linear(in_features=30, out_features=5002, bias=True)\n",
|
||||
")\n"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "Nud6jgGPaHVa"
|
||||
},
|
||||
"source": [
|
||||
"## рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рдХрд░рдирд╛\n",
|
||||
"\n",
|
||||
"рдЕрдм рдЖрдЗрдП рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЯреЗрдХреНрд╕реНрдЯ рд╕реЗ CBoW рд╢рдмреНрдж рдЬреЛрдбрд╝реЗ рддреИрдпрд╛рд░ рдХрд░реЗрдЧрд╛ред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╣рдореЗрдВ рд╡рд┐рдВрдбреЛ рд╕рд╛рдЗрдЬ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдФрд░ рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рд╢рдмреНрджреЛрдВ рдХреЗ рдЬреЛрдбрд╝реЗ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд▓реМрдЯрд╛рдПрдЧрд╛ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢рдмреНрджреЛрдВ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╡реЗрдХреНрдЯрд░/рдЯреЗрдВрд╕рд░ рдкрд░ рднреА - рдЬреЛ рд╣рдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдПрдиреНрдХреЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЗрд╕реЗ `to_cbow` рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "x-dsXygOieXn",
|
||||
"outputId": "c2218280-e540-40ba-9546-efe48d0d714f"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "stream",
|
||||
"name": "stdout",
|
||||
"text": [
|
||||
"[['like', 'I'], ['to', 'I'], ['I', 'like'], ['to', 'like'], ['train', 'like'], ['I', 'to'], ['like', 'to'], ['train', 'to'], ['networks', 'to'], ['like', 'train'], ['to', 'train'], ['networks', 'train'], ['to', 'networks'], ['train', 'networks']]\n",
|
||||
"[[232, 172], [5, 172], [172, 232], [5, 232], [0, 232], [172, 5], [232, 5], [0, 5], [1202, 5], [232, 0], [5, 0], [1202, 0], [5, 1202], [0, 1202]]\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def to_cbow(sent,window_size=2):\n",
|
||||
" res = []\n",
|
||||
" for i,x in enumerate(sent):\n",
|
||||
" for j in range(max(0,i-window_size),min(i+window_size+1,len(sent))):\n",
|
||||
" if i!=j:\n",
|
||||
" res.append([sent[j],x])\n",
|
||||
" return res\n",
|
||||
"\n",
|
||||
"print(to_cbow(['I','like','to','train','networks']))\n",
|
||||
"print(to_cbow(encode('I like to train networks', vocab)))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "XVaaDLjaaHVb"
|
||||
},
|
||||
"source": [
|
||||
"рдЖрдЗрдП рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдбреЗрдЯрд╛рд╕реЗрдЯ рддреИрдпрд╛рд░ рдХрд░реЗрдВред рд╣рдо рд╕рднреА рд╕рдорд╛рдЪрд╛рд░реЛрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ, `to_cbow` рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗ рддрд╛рдХрд┐ рд╢рдмреНрдж рдЬреЛрдбрд╝реЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рд╣реЛ рд╕рдХреЗ, рдФрд░ рдЙрди рдЬреЛрдбрд╝реЛрдВ рдХреЛ `X` рдФрд░ `Y` рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред рд╕рдордп рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ 10k рд╕рдорд╛рдЪрд╛рд░ рдЖрдЗрдЯрдо рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ - рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдзрд┐рдХ рд╕рдордп рд╣реИ рдФрд░ рдмреЗрд╣рддрд░ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдЗрд╕ рд╕реАрдорд╛ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ :)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"id": "54b-Gd9TieXo"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"X = []\n",
|
||||
"Y = []\n",
|
||||
"for i, x in zip(range(10000), train_dataset):\n",
|
||||
" for w1, w2 in to_cbow(encode(x[1], vocab), window_size = 5):\n",
|
||||
" X.append(w1)\n",
|
||||
" Y.append(w2)\n",
|
||||
"\n",
|
||||
"X = torch.tensor(X)\n",
|
||||
"Y = torch.tensor(Y)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"рд╣рдо рдЙрд╕ рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рдбреЗрдЯрд╛рд╕реЗрдЯ рдореЗрдВ рднреА рдмрджрд▓реЗрдВрдЧреЗ, рдФрд░ рдбрд╛рдЯрд╛рд▓реЛрдбрд░ рдмрдирд╛рдПрдВрдЧреЗ:\n"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "cwWy0PzXWhN5"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"class SimpleIterableDataset(torch.utils.data.IterableDataset):\n",
|
||||
" def __init__(self, X, Y):\n",
|
||||
" super(SimpleIterableDataset).__init__()\n",
|
||||
" self.data = []\n",
|
||||
" for i in range(len(X)):\n",
|
||||
" self.data.append( (Y[i], X[i]) )\n",
|
||||
" random.shuffle(self.data)\n",
|
||||
"\n",
|
||||
" def __iter__(self):\n",
|
||||
" return iter(self.data)"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "mfoAcGPFZU8p"
|
||||
},
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "e4NQ_-5waHVc"
|
||||
},
|
||||
"source": [
|
||||
"рд╣рдо рдЙрд╕ рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рдбреЗрдЯрд╛рд╕реЗрдЯ рдореЗрдВ рдмрджрд▓реЗрдВрдЧреЗ, рдФрд░ рдбрд╛рдЯрд╛рд▓реЛрдбрд░ рдмрдирд╛рдПрдВрдЧреЗ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"id": "AbLUcojlieXo"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"ds = SimpleIterableDataset(X, Y)\n",
|
||||
"dl = torch.utils.data.DataLoader(ds, batch_size = 256)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "pKQr7sXeaHVc"
|
||||
},
|
||||
"source": [
|
||||
"рдЕрдм рдЖрдЗрдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХрд░реЗрдВред рд╣рдо `SGD` рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рдХрд╛рдлреА рдЙрдЪреНрдЪ рд▓рд░реНрдирд┐рдВрдЧ рд░реЗрдЯ рд╣реЛрдЧрд╛ред рдЖрдк рдЕрдиреНрдп рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░реНрд╕, рдЬреИрд╕реЗ `Adam`, рдХреЗ рд╕рд╛рде рднреА рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рд╢реБрд░реБрдЖрдд рдореЗрдВ 10 epochs рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХрд░реЗрдВрдЧреЗ - рдФрд░ рдпрджрд┐ рдЖрдк рдФрд░ рднреА рдХрдо рд╣рд╛рдирд┐ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЗрд╕ рд╕реЗрд▓ рдХреЛ рдкреБрдирдГ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"def train_epoch(net, dataloader, lr = 0.01, optimizer = None, loss_fn = torch.nn.CrossEntropyLoss(), epochs = None, report_freq = 1):\n",
|
||||
" optimizer = optimizer or torch.optim.Adam(net.parameters(), lr = lr)\n",
|
||||
" loss_fn = loss_fn.to(device)\n",
|
||||
" net.train()\n",
|
||||
"\n",
|
||||
" for i in range(epochs):\n",
|
||||
" total_loss, j = 0, 0, \n",
|
||||
" for labels, features in dataloader:\n",
|
||||
" optimizer.zero_grad()\n",
|
||||
" features, labels = features.to(device), labels.to(device)\n",
|
||||
" out = net(features)\n",
|
||||
" loss = loss_fn(out, labels)\n",
|
||||
" loss.backward()\n",
|
||||
" optimizer.step()\n",
|
||||
" total_loss += loss\n",
|
||||
" j += 1\n",
|
||||
" if i % report_freq == 0:\n",
|
||||
" print(f\"Epoch: {i+1}: loss={total_loss.item()/j}\")\n",
|
||||
"\n",
|
||||
" return total_loss.item()/j"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "HeeCYKr_KF1w"
|
||||
},
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"train_epoch(net = model, dataloader = dl, optimizer = torch.optim.SGD(model.parameters(), lr = 0.1), loss_fn = torch.nn.CrossEntropyLoss(), epochs = 10)"
|
||||
],
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "KVgwGtDHgDlT",
|
||||
"outputId": "2447833f-f0e3-4566-c33d-addbfe2f451d"
|
||||
},
|
||||
"execution_count": null,
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "stream",
|
||||
"name": "stdout",
|
||||
"text": [
|
||||
"Epoch: 1: loss=5.664632366860172\n",
|
||||
"Epoch: 2: loss=5.632101973960962\n",
|
||||
"Epoch: 3: loss=5.610399051405015\n",
|
||||
"Epoch: 4: loss=5.594621561080262\n",
|
||||
"Epoch: 5: loss=5.582538017415446\n",
|
||||
"Epoch: 6: loss=5.572900234519603\n",
|
||||
"Epoch: 7: loss=5.564951676341915\n",
|
||||
"Epoch: 8: loss=5.558288112064614\n",
|
||||
"Epoch: 9: loss=5.552576955031129\n",
|
||||
"Epoch: 10: loss=5.547634165194347\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"output_type": "execute_result",
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"5.547634165194347"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"execution_count": 16
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "W8u2qXZmaHVd"
|
||||
},
|
||||
"source": [
|
||||
"## Word2Vec рдЖрдЬрд╝рдорд╛рдирд╛\n",
|
||||
"\n",
|
||||
"Word2Vec рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЪрд▓рд┐рдП рд╣рдорд╛рд░реЗ рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдореМрдЬреВрдж рд╕рднреА рд╢рдмреНрджреЛрдВ рдХреЗ рд▓рд┐рдП рд╡реЗрдХреНрдЯрд░ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"id": "r8TatcXjkU_t"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"vectors = torch.stack([embedder(torch.tensor(vocab[s])) for s in vocab.itos], 0)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "3OcX21UOaHVd"
|
||||
},
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "bz6tAeLzieXp",
|
||||
"outputId": "5b20850e-4342-45e9-f840-cfac2b4d61d8"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "stream",
|
||||
"name": "stdout",
|
||||
"text": [
|
||||
"tensor([-0.0915, 2.1224, -0.0281, -0.6819, 1.1219, 0.6458, -1.3704, -1.3314,\n",
|
||||
" -1.1437, 0.4496, 0.2301, -0.3515, -0.8485, 1.0481, 0.4386, -0.8949,\n",
|
||||
" 0.5644, 1.0939, -2.5096, 3.2949, -0.2601, -0.8640, 0.1421, -0.0804,\n",
|
||||
" -0.5083, -1.0560, 0.9753, -0.5949, -1.6046, 0.5774],\n",
|
||||
" grad_fn=<EmbeddingBackward>)\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"paris_vec = embedder(torch.tensor(vocab['paris']))\n",
|
||||
"print(paris_vec)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "pHTJlaeYaHVd"
|
||||
},
|
||||
"source": [
|
||||
"рдпрд╣ рд╡рд░реНрдб2рд╡реЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░реНрдпрд╛рдпрд╡рд╛рдЪреА рд╢рдмреНрджреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╝рдВрдХреНрд╢рди рджрд┐рдП рдЧрдП рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП `n` рд╕рдмрд╕реЗ рдирд┐рдХрдЯрддрдо рд╢рдмреНрджреЛрдВ рдХреЛ рд▓реМрдЯрд╛рдПрдЧрд╛ред рдЙрдиреНрд╣реЗрдВ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо $|w_i - v|$ рдХрд╛ рдорд╛рди рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдБ $v$ рд╣рдорд╛рд░реЗ рдЗрдирдкреБрдЯ рд╢рдмреНрдж рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рд╡реЗрдХреНрдЯрд░ рд╣реИ, рдФрд░ $w_i$ рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ $i$-рд╡реЗрдВ рд╢рдмреНрдж рдХрд╛ рдПрдирдХреЛрдбрд┐рдВрдЧ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж рд╣рдо рдРрд░реЗ рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ `argsort` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдЗрдВрдбреЗрдХреНрд╕ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рдФрд░ рд╕реВрдЪреА рдХреЗ рдкрд╣рд▓реЗ `n` рддрддреНрд╡ рд▓реЗрддреЗ рд╣реИрдВ, рдЬреЛ рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ рдирд┐рдХрдЯрддрдо рд╢рдмреНрджреЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдПрдирдХреЛрдб рдХрд░рддреЗ рд╣реИрдВред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "NlZyi-_olFar",
|
||||
"outputId": "b5dbb163-88c4-4d5a-eaf2-6751f700e98c"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "execute_result",
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"['microsoft', 'quoted', 'lp', 'rate', 'top']"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"execution_count": 56
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def close_words(x, n = 5):\n",
|
||||
" vec = embedder(torch.tensor(vocab[x]))\n",
|
||||
" top5 = np.linalg.norm(vectors.detach().numpy() - vec.detach().numpy(), axis = 1).argsort()[:n]\n",
|
||||
" return [ vocab.itos[x] for x in top5 ]\n",
|
||||
"\n",
|
||||
"close_words('microsoft')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "-dQq7xeAln0U",
|
||||
"outputId": "66f768c3-c248-4bfd-ce4f-c8ffc6d0dd0d"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "execute_result",
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"['basketball', 'lot', 'sinai', 'states', 'healthdaynews']"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"execution_count": 51
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"close_words('basketball')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "fJXqK26b29sa",
|
||||
"outputId": "78f0baba-ffd0-485a-dd87-0a12bedfd7fa"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "execute_result",
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"['funds', 'travel', 'sydney', 'japan', 'business']"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"execution_count": 77
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"close_words('funds')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "My0VeTDd3Ji8"
|
||||
},
|
||||
"source": [
|
||||
"## рдореБрдЦреНрдп рдмрд╛рддреЗрдВ\n",
|
||||
"\n",
|
||||
"рд╕реНрдорд╛рд░реНрдЯ рддрдХрдиреАрдХреЛрдВ рдЬреИрд╕реЗ CBoW рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо Word2Vec рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк skip-gram рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдХреЗрдВрджреНрд░реАрдп рд╢рдмреНрдж рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкрдбрд╝реЛрд╕реА рд╢рдмреНрдж рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рдЕрдЪреНрдЫрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддрд╛ рд╣реИред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**рдЕрд╕реНрд╡реАрдХрд░рдг**: \nрдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ AI рдЕрдиреБрд╡рд╛рдж рд╕реЗрд╡рд╛ [Co-op Translator](https://github.com/Azure/co-op-translator) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрдмрдХрд┐ рд╣рдо рд╕рдЯреАрдХрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрдиреБрд╡рд╛рдж рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдпрд╛ рдЕрд╢реБрджреНрдзрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдореВрд▓ рднрд╛рд╖рд╛ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдореВрд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рд╕реНрд░реЛрдд рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдкреЗрд╢реЗрд╡рд░ рдорд╛рдирд╡ рдЕрдиреБрд╡рд╛рдж рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред рдЗрд╕ рдЕрдиреБрд╡рд╛рдж рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд┐рд╕реА рднреА рдЧрд▓рддрдлрд╣рдореА рдпрд╛ рдЧрд▓рдд рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╣рдо рдЙрддреНрддрд░рджрд╛рдпреА рдирд╣реАрдВ рд╣реИрдВред\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"collapsed_sections": [],
|
||||
"name": "CBoW-PyTorch.ipynb",
|
||||
"provenance": []
|
||||
},
|
||||
"interpreter": {
|
||||
"hash": "16af2a8bbb083ea23e5e41c7f5787656b2ce26968575d8763f2c4b17f9cd711f"
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3.8.12 ('py38')",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.8.12"
|
||||
},
|
||||
"orig_nbformat": 4,
|
||||
"gpuClass": "standard",
|
||||
"coopTranslator": {
|
||||
"original_hash": "36df28efe3fe40b6fb0a7fa48fe3ea82",
|
||||
"translation_date": "2025-08-31T15:14:46+00:00",
|
||||
"source_file": "lessons/5-NLP/15-LanguageModeling/CBoW-PyTorch.ipynb",
|
||||
"language_code": "hi"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 0
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,479 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# рдкреБрдирд░рд╛рд╡рд░реНрддреА рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ\n",
|
||||
"\n",
|
||||
"рдкрд┐рдЫрд▓реЗ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ, рд╣рдордиреЗ рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд╕рдореГрджреНрдз рд╕реЗрдорд╛рдВрдЯрд┐рдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдФрд░ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреЗ рдКрдкрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд▓реАрдирд┐рдпрд░ рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдпрд╣ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд╡рд╛рдХреНрдп рдореЗрдВ рд╢рдмреНрджреЛрдВ рдХреЗ рд╕рдордЧреНрд░ рдЕрд░реНрде рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╢рдмреНрджреЛрдВ рдХреЗ **рдХреНрд░рдо** рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдкрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕рдордЧреНрд░ рдСрдкрд░реЗрд╢рди рдореВрд▓ рдЯреЗрдХреНрд╕реНрдЯ рд╕реЗ рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдпреЗ рдореЙрдбрд▓ рд╢рдмреНрджреЛрдВ рдХреЗ рдХреНрд░рдо рдХреЛ рдореЙрдбрд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рд╡реЗ рдЯреЗрдХреНрд╕реНрдЯ рдЬрдирд░реЗрд╢рди рдпрд╛ рдкреНрд░рд╢реНрдиреЛрддреНрддрд░ рдЬреИрд╕реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдпрд╛ рдЕрд╕реНрдкрд╖реНрдЯ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред\n",
|
||||
"\n",
|
||||
"рдЯреЗрдХреНрд╕реНрдЯ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдЕрд░реНрде рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдЕрдиреНрдп рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ **рдкреБрдирд░рд╛рд╡рд░реНрддреА рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ** рдпрд╛ RNN рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред RNN рдореЗрдВ, рд╣рдо рдЕрдкрдиреЗ рд╡рд╛рдХреНрдп рдХреЛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдмрд╛рд░ рдореЗрдВ рдПрдХ рдкреНрд░рддреАрдХ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдХреБрдЫ **рд╕реНрдерд┐рддрд┐** (state) рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдЕрдЧрд▓реЗ рдкреНрд░рддреАрдХ рдХреЗ рд╕рд╛рде рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"рджрд┐рдП рдЧрдП рдЗрдирдкреБрдЯ рдЕрдиреБрдХреНрд░рдо $X_0,\\dots,X_n$ рдХреЗ рд▓рд┐рдП, RNN рдПрдХ рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдмреНрд▓реЙрдХреЛрдВ рдХрд╛ рдЕрдиреБрдХреНрд░рдо рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдмреИрдХ рдкреНрд░реЛрдкреЗрдЧреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдВрдб-рдЯреВ-рдПрдВрдб рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдиреЗрдЯрд╡рд░реНрдХ рдмреНрд▓реЙрдХ $(X_i,S_i)$ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк $S_{i+1}$ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдЕрдВрддрд┐рдо рд╕реНрдерд┐рддрд┐ $S_n$ рдпрд╛ рдЖрдЙрдЯрдкреБрдЯ $X_n$ рдХреЛ рдкрд░рд┐рдгрд╛рдо рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реАрдирд┐рдпрд░ рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░ рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рднреА рдиреЗрдЯрд╡рд░реНрдХ рдмреНрд▓реЙрдХ рд╕рдорд╛рди рд╡реЗрдЯреНрд╕ рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдмреИрдХ рдкреНрд░реЛрдкреЗрдЧреЗрд╢рди рдкрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдВрдб-рдЯреВ-рдПрдВрдб рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"рдЪреВрдВрдХрд┐ рд╕реНрдерд┐рддрд┐ рд╡реЗрдХреНрдЯрд░ $S_0,\\dots,S_n$ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд╕ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдпрд╣ рд╢рдмреНрджреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЛ рд╕реАрдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдХрд╣реАрдВ *not* рд╢рдмреНрдж рдЖрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕реНрдерд┐рддрд┐ рд╡реЗрдХреНрдЯрд░ рдХреЗ рдХреБрдЫ рддрддреНрд╡реЛрдВ рдХреЛ рдирдХрд╛рд░рдиреЗ (negate) рдХреЗ рд▓рд┐рдП рд╕реАрдЦ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдирдХрд╛рд░рд╛рддреНрдордХрддрд╛ (negation) рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИред\n",
|
||||
"\n",
|
||||
"> рдЪреВрдВрдХрд┐ рдЪрд┐рддреНрд░ рдореЗрдВ рд╕рднреА RNN рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рд╡реЗрдЯреНрд╕ рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрд╕реА рдЪрд┐рддреНрд░ рдХреЛ рдПрдХ рдмреНрд▓реЙрдХ (рджрд╛рдИрдВ рдУрд░) рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдлреАрдбрдмреИрдХ рд▓реВрдк рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдиреЗрдЯрд╡рд░реНрдХ рдХреА рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЗрдирдкреБрдЯ рдореЗрдВ рд╡рд╛рдкрд╕ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рд╣рдорд╛рд░реЗ рд╕рдорд╛рдЪрд╛рд░ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЛ рд╡рд░реНрдЧреАрдХреГрдд рдХрд░рдиреЗ рдореЗрдВ рдХреИрд╕реЗ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Loading dataset...\n",
|
||||
"Building vocab...\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import torch\n",
|
||||
"import torchtext\n",
|
||||
"from torchnlp import *\n",
|
||||
"train_dataset, test_dataset, classes, vocab = load_dataset()\n",
|
||||
"vocab_size = len(vocab)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рд╕рд░рд▓ RNN рд╡рд░реНрдЧреАрдХрд░рдгрдХрд░реНрддрд╛\n",
|
||||
"\n",
|
||||
"рд╕рд░рд▓ RNN рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдпреВрдирд┐рдЯ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд░реИрдЦрд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдЗрдирдкреБрдЯ рд╡реЗрдХреНрдЯрд░ рдФрд░ рд╕реНрдЯреЗрдЯ рд╡реЗрдХреНрдЯрд░ рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдирдпрд╛ рд╕реНрдЯреЗрдЯ рд╡реЗрдХреНрдЯрд░ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред PyTorch рдЗрд╕ рдпреВрдирд┐рдЯ рдХреЛ `RNNCell` рдХреНрд▓рд╛рд╕ рдХреЗ рд╕рд╛рде рджрд░реНрд╢рд╛рддрд╛ рд╣реИ, рдФрд░ рдРрд╕реЗ рд╕реЗрд▓реНрд╕ рдХреЗ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ `RNN` рд▓реЗрдпрд░ рдХреЗ рд░реВрдк рдореЗрдВред\n",
|
||||
"\n",
|
||||
"рдПрдХ RNN рд╡рд░реНрдЧреАрдХрд░рдгрдХрд░реНрддрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд╣рд▓реЗ рдПрдХ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд▓реЗрдпрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ рддрд╛рдХрд┐ рдЗрдирдкреБрдЯ рд╢рдмреНрджрд╛рд╡рд▓реА рдХреА рдЖрдпрд╛рдореАрдпрддрд╛ рдХреЛ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдФрд░ рдлрд┐рд░ рдЗрд╕рдХреЗ рдКрдкрд░ RNN рд▓реЗрдпрд░ рд░рдЦреЗрдВрдЧреЗ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class RNNClassifier(torch.nn.Module):\n",
|
||||
" def __init__(self, vocab_size, embed_dim, hidden_dim, num_class):\n",
|
||||
" super().__init__()\n",
|
||||
" self.hidden_dim = hidden_dim\n",
|
||||
" self.embedding = torch.nn.Embedding(vocab_size, embed_dim)\n",
|
||||
" self.rnn = torch.nn.RNN(embed_dim,hidden_dim,batch_first=True)\n",
|
||||
" self.fc = torch.nn.Linear(hidden_dim, num_class)\n",
|
||||
"\n",
|
||||
" def forward(self, x):\n",
|
||||
" batch_size = x.size(0)\n",
|
||||
" x = self.embedding(x)\n",
|
||||
" x,h = self.rnn(x)\n",
|
||||
" return self.fc(x.mean(dim=1))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **рдиреЛрдЯ:** рдпрд╣рд╛рдВ рд╣рдо рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП рдмрд┐рдирд╛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд embedding layer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдФрд░ рдмреЗрд╣рддрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдо Word2Vec рдпрд╛ GloVe embeddings рдХреЗ рд╕рд╛рде рдкреНрд░реА-рдЯреНрд░реЗрдВрдб embedding layer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдкрд┐рдЫрд▓реЗ рдпреВрдирд┐рдЯ рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдмреЗрд╣рддрд░ рд╕рдордЭ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЛ рдкреНрд░реА-рдЯреНрд░реЗрдВрдб embeddings рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо padded data loader рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдмреИрдЪ рдореЗрдВ рд╕рдорд╛рди рд▓рдВрдмрд╛рдИ рд╡рд╛рд▓реЗ padded sequences рд╣реЛрдВрдЧреЗред RNN layer embedding tensors рдХреЗ sequence рдХреЛ рд▓реЗрдЧреА рдФрд░ рджреЛ рдЖрдЙрдЯрдкреБрдЯ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧреА:\n",
|
||||
"* $x$ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдкрд░ RNN рд╕реЗрд▓ рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ sequence рд╣реИ\n",
|
||||
"* $h$ sequence рдХреЗ рдЕрдВрддрд┐рдо рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо hidden state рд╣реИ\n",
|
||||
"\n",
|
||||
"рдЗрд╕рдХреЗ рдмрд╛рдж рд╣рдо рдПрдХ fully-connected linear classifier рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ рддрд╛рдХрд┐ рд╡рд░реНрдЧреЛрдВ (classes) рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛ рд╕рдХреЗред\n",
|
||||
"\n",
|
||||
"> **рдиреЛрдЯ:** RNNs рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рдХрд╛рдлреА рдХрдард┐рди рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬрдм RNN рд╕реЗрд▓реНрд╕ рдХреЛ sequence рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде unroll рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ back propagation рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд▓реЗрдпрд░реНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛рдлреА рдмрдбрд╝реА рд╣реЛ рдЬрд╛рддреА рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЫреЛрдЯрд╛ learning rate рдЪреБрдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдЕрдЪреНрдЫреЗ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдмрдбрд╝реЗ dataset рдкрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдХрд╛рдлреА рд╕рдордп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП GPU рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {
|
||||
"scrolled": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"3200: acc=0.3090625\n",
|
||||
"6400: acc=0.38921875\n",
|
||||
"9600: acc=0.4590625\n",
|
||||
"12800: acc=0.511953125\n",
|
||||
"16000: acc=0.5506875\n",
|
||||
"19200: acc=0.57921875\n",
|
||||
"22400: acc=0.6070089285714285\n",
|
||||
"25600: acc=0.6304296875\n",
|
||||
"28800: acc=0.6484027777777778\n",
|
||||
"32000: acc=0.66509375\n",
|
||||
"35200: acc=0.6790056818181818\n",
|
||||
"38400: acc=0.6929166666666666\n",
|
||||
"41600: acc=0.7035817307692308\n",
|
||||
"44800: acc=0.7137276785714286\n",
|
||||
"48000: acc=0.72225\n",
|
||||
"51200: acc=0.73001953125\n",
|
||||
"54400: acc=0.7372794117647059\n",
|
||||
"57600: acc=0.7436631944444444\n",
|
||||
"60800: acc=0.7503947368421052\n",
|
||||
"64000: acc=0.75634375\n",
|
||||
"67200: acc=0.7615773809523809\n",
|
||||
"70400: acc=0.7662642045454545\n",
|
||||
"73600: acc=0.7708423913043478\n",
|
||||
"76800: acc=0.7751822916666666\n",
|
||||
"80000: acc=0.7790625\n",
|
||||
"83200: acc=0.7825\n",
|
||||
"86400: acc=0.7858564814814815\n",
|
||||
"89600: acc=0.7890513392857142\n",
|
||||
"92800: acc=0.7920474137931034\n",
|
||||
"96000: acc=0.7952708333333334\n",
|
||||
"99200: acc=0.7982258064516129\n",
|
||||
"102400: acc=0.80099609375\n",
|
||||
"105600: acc=0.8037594696969697\n",
|
||||
"108800: acc=0.8060569852941176\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=16, collate_fn=padify, shuffle=True)\n",
|
||||
"net = RNNClassifier(vocab_size,64,32,len(classes)).to(device)\n",
|
||||
"train_epoch(net,train_loader, lr=0.001)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рд▓реЙрдиреНрдЧ рд╢реЙрд░реНрдЯ рдЯрд░реНрдо рдореЗрдореЛрд░реА (LSTM)\n",
|
||||
"\n",
|
||||
"рдХреНрд▓рд╛рд╕рд┐рдХрд▓ RNNs рдХреА рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ **vanishing gradients** рд╕рдорд╕реНрдпрд╛ред рдЪреВрдВрдХрд┐ RNNs рдХреЛ рдПрдХ рд╣реА рдмреИрдХ-рдкреНрд░реЛрдкреЗрдЧреЗрд╢рди рдкрд╛рд╕ рдореЗрдВ рдПрдВрдб-рдЯреВ-рдПрдВрдб рдЯреНрд░реЗрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдиреЗрдЯрд╡рд░реНрдХ рдХреА рд╢реБрд░реБрдЖрддреА рд▓реЗрдпрд░реНрд╕ рддрдХ рдПрд░рд░ рдХреЛ рдкреНрд░реЛрдкреЗрдЧреЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рдХрдард┐рдирд╛рдИ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдХрд╛рд░рдг рдиреЗрдЯрд╡рд░реНрдХ рджреВрд░рд╕реНрде рдЯреЛрдХрди рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ рд╕реАрдЦ рдирд╣реАрдВ рдкрд╛рддрд╛ред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ **explicit state management** рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛, рдЬрд┐рд╕реЗ **gates** рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рджреЛ рд╕рдмрд╕реЗ рдкреНрд░рд╕рд┐рджреНрдз рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд╣реИрдВ: **рд▓реЙрдиреНрдЧ рд╢реЙрд░реНрдЯ рдЯрд░реНрдо рдореЗрдореЛрд░реА** (LSTM) рдФрд░ **рдЧреЗрдЯреЗрдб рд░рд┐рд▓реЗ рдпреВрдирд┐рдЯ** (GRU)ред\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"LSTM рдиреЗрдЯрд╡рд░реНрдХ RNN рдХреЗ рд╕рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрдЧрдард┐рдд рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рджреЛ рд╕реНрдЯреЗрдЯреНрд╕ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рд▓реЗрдпрд░ рд╕реЗ рд▓реЗрдпрд░ рддрдХ рдкрд╛рд╕ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ: рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрдЯреЗрдЯ $c$, рдФрд░ рд╣рд┐рдбрди рд╡реЗрдХреНрдЯрд░ $h$ред рдкреНрд░рддреНрдпреЗрдХ рдпреВрдирд┐рдЯ рдкрд░, рд╣рд┐рдбрди рд╡реЗрдХреНрдЯрд░ $h_i$ рдХреЛ рдЗрдирдкреБрдЯ $x_i$ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╡реЗ **gates** рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдЯреЗрдЯ $c$ рдкрд░ рдХреНрдпрд╛ рдкреНрд░рднрд╛рд╡ рдкрдбрд╝реЗрдЧрд╛, рдЗрд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдЧреЗрдЯ рдПрдХ рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рд┐рдЧреНрдореЙрдЗрдб рдПрдХреНрдЯрд┐рд╡реЗрд╢рди рд╣реЛрддрд╛ рд╣реИ (рдЖрдЙрдЯрдкреБрдЯ $[0,1]$ рдХреА рд░реЗрдВрдЬ рдореЗрдВ), рдЬрд┐рд╕реЗ рд╕реНрдЯреЗрдЯ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рдЧреБрдгрд╛ рдХрд░рдиреЗ рдкрд░ рдмрд┐рдЯрд╡рд╛рдЗрдЬ рдорд╛рд╕реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЧреЗрдЯреНрд╕ рд╣реЛрддреЗ рд╣реИрдВ (рдКрдкрд░ рджреА рдЧрдИ рддрд╕реНрд╡реАрд░ рдореЗрдВ рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ):\n",
|
||||
"* **forget gate** рд╣рд┐рдбрди рд╡реЗрдХреНрдЯрд░ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рддрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡реЗрдХреНрдЯрд░ $c$ рдХреЗ рдХреМрди рд╕реЗ рдШрдЯрдХреЛрдВ рдХреЛ рднреВрд▓рдирд╛ рд╣реИ рдФрд░ рдХреМрди рд╕реЗ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реИред\n",
|
||||
"* **input gate** рдЗрдирдкреБрдЯ рдФрд░ рд╣рд┐рдбрди рд╡реЗрдХреНрдЯрд░ рд╕реЗ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕реНрдЯреЗрдЯ рдореЗрдВ рдбрд╛рд▓рддрд╛ рд╣реИред\n",
|
||||
"* **output gate** рд╕реНрдЯреЗрдЯ рдХреЛ $\\tanh$ рдПрдХреНрдЯрд┐рд╡реЗрд╢рди рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рд▓реАрдирд┐рдпрд░ рд▓реЗрдпрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдо рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рд╣рд┐рдбрди рд╡реЗрдХреНрдЯрд░ $h_i$ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдХреЗ рдХреБрдЫ рдШрдЯрдХреЛрдВ рдХреЛ рдЪреБрдирддрд╛ рд╣реИ рддрд╛рдХрд┐ рдирдпрд╛ рд╕реНрдЯреЗрдЯ $c_{i+1}$ рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХреЗред\n",
|
||||
"\n",
|
||||
"рд╕реНрдЯреЗрдЯ $c$ рдХреЗ рдШрдЯрдХреЛрдВ рдХреЛ рдХреБрдЫ рдлреНрд▓реИрдЧреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдСрди рдФрд░ рдСрдл рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рд╣рдо рд╕реАрдХреНрд╡реЗрдВрд╕ рдореЗрдВ *Alice* рдирд╛рдо рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ рдорд╣рд┐рд▓рд╛ рдкрд╛рддреНрд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕реНрдЯреЗрдЯ рдореЗрдВ рдлреНрд▓реИрдЧ рдЙрдард╛рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд╛рдХреНрдп рдореЗрдВ рдорд╣рд┐рд▓рд╛ рд╕рдВрдЬреНрдЮрд╛ рд╣реИред рдЬрдм рд╣рдо рдЖрдЧреЗ *and Tom* рд╡рд╛рдХреНрдпрд╛рдВрд╢ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдлреНрд▓реИрдЧ рдЙрдард╛рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╣реБрд╡рдЪрди рд╕рдВрдЬреНрдЮрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕реНрдЯреЗрдЯ рдХреЛ рдореИрдирд┐рдкреБрд▓реЗрдЯ рдХрд░рдХреЗ рд╣рдо рд╡рд╛рдХреНрдп рдХреЗ рднрд╛рдЧреЛрдВ рдХреЗ рд╡реНрдпрд╛рдХрд░рдгрд┐рдХ рдЧреБрдгреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"> **Note**: LSTM рдХреА рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЗрд╣рддрд░реАрди рд╕рдВрд╕рд╛рдзрди рд╣реИ рдХреНрд░рд┐рд╕реНрдЯреЛрдлрд░ рдУрд▓рд╛рд╣ рдХрд╛ рдпрд╣ рд╢рд╛рдирджрд╛рд░ рд▓реЗрдЦ [Understanding LSTM Networks](https://colah.github.io/posts/2015-08-Understanding-LSTMs/)ред\n",
|
||||
"\n",
|
||||
"рд╣рд╛рд▓рд╛рдВрдХрд┐ LSTM рд╕реЗрд▓ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдЬрдЯрд┐рд▓ рд▓рдЧ рд╕рдХрддреА рд╣реИ, PyTorch рдЗрд╕ рдЗрдореНрдкреНрд▓реАрдореЗрдВрдЯреЗрд╢рди рдХреЛ `LSTMCell` рдХреНрд▓рд╛рд╕ рдХреЗ рдЕрдВрджрд░ рдЫреБрдкрд╛ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдкреВрд░реЗ LSTM рд▓реЗрдпрд░ рдХреЛ рджрд░реНрд╢рд╛рдиреЗ рдХреЗ рд▓рд┐рдП `LSTM` рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, LSTM рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░ рдХрд╛ рдЗрдореНрдкреНрд▓реАрдореЗрдВрдЯреЗрд╢рди рдКрдкрд░ рджреЗрдЦреЗ рдЧрдП рд╕рд┐рдВрдкрд▓ RNN рдХреЗ рд╕рдорд╛рди рд╣реА рд╣реЛрдЧрд╛:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class LSTMClassifier(torch.nn.Module):\n",
|
||||
" def __init__(self, vocab_size, embed_dim, hidden_dim, num_class):\n",
|
||||
" super().__init__()\n",
|
||||
" self.hidden_dim = hidden_dim\n",
|
||||
" self.embedding = torch.nn.Embedding(vocab_size, embed_dim)\n",
|
||||
" self.embedding.weight.data = torch.randn_like(self.embedding.weight.data)-0.5\n",
|
||||
" self.rnn = torch.nn.LSTM(embed_dim,hidden_dim,batch_first=True)\n",
|
||||
" self.fc = torch.nn.Linear(hidden_dim, num_class)\n",
|
||||
"\n",
|
||||
" def forward(self, x):\n",
|
||||
" batch_size = x.size(0)\n",
|
||||
" x = self.embedding(x)\n",
|
||||
" x,(h,c) = self.rnn(x)\n",
|
||||
" return self.fc(h[-1])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"3200: acc=0.259375\n",
|
||||
"6400: acc=0.25859375\n",
|
||||
"9600: acc=0.26177083333333334\n",
|
||||
"12800: acc=0.2784375\n",
|
||||
"16000: acc=0.313\n",
|
||||
"19200: acc=0.3528645833333333\n",
|
||||
"22400: acc=0.3965625\n",
|
||||
"25600: acc=0.4385546875\n",
|
||||
"28800: acc=0.4752777777777778\n",
|
||||
"32000: acc=0.505375\n",
|
||||
"35200: acc=0.5326704545454546\n",
|
||||
"38400: acc=0.5557552083333334\n",
|
||||
"41600: acc=0.5760817307692307\n",
|
||||
"44800: acc=0.5954910714285714\n",
|
||||
"48000: acc=0.6118333333333333\n",
|
||||
"51200: acc=0.62681640625\n",
|
||||
"54400: acc=0.6404779411764706\n",
|
||||
"57600: acc=0.6520138888888889\n",
|
||||
"60800: acc=0.662828947368421\n",
|
||||
"64000: acc=0.673546875\n",
|
||||
"67200: acc=0.6831547619047619\n",
|
||||
"70400: acc=0.6917897727272727\n",
|
||||
"73600: acc=0.6997146739130434\n",
|
||||
"76800: acc=0.707109375\n",
|
||||
"80000: acc=0.714075\n",
|
||||
"83200: acc=0.7209134615384616\n",
|
||||
"86400: acc=0.727037037037037\n",
|
||||
"89600: acc=0.7326674107142858\n",
|
||||
"92800: acc=0.7379633620689655\n",
|
||||
"96000: acc=0.7433645833333333\n",
|
||||
"99200: acc=0.7479032258064516\n",
|
||||
"102400: acc=0.752119140625\n",
|
||||
"105600: acc=0.7562405303030303\n",
|
||||
"108800: acc=0.76015625\n",
|
||||
"112000: acc=0.7641339285714286\n",
|
||||
"115200: acc=0.7677777777777778\n",
|
||||
"118400: acc=0.7711233108108108\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(0.03487814127604167, 0.7728)"
|
||||
]
|
||||
},
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"net = LSTMClassifier(vocab_size,64,32,len(classes)).to(device)\n",
|
||||
"train_epoch(net,train_loader, lr=0.001)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рдкреИрдХреНрдб рд╕реАрдХреНрд╡реЗрдВрд╕реЗрдЬрд╝\n",
|
||||
"\n",
|
||||
"рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдореЗрдВ рдорд┐рдиреАрдмреИрдЪ рдХреА рд╕рднреА рд╕реАрдХреНрд╡реЗрдВрд╕реЗрдЬрд╝ рдХреЛ рд╢реВрдиреНрдп рд╡реЗрдХреНрдЯрд░ рд╕реЗ рдкреИрдб рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рд╕реЗ рдХреБрдЫ рдореЗрдореЛрд░реА рдХреА рдмрд░реНрдмрд╛рджреА рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди RNNs рдХреЗ рд╕рд╛рде рдпрд╣ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдкреИрдб рдХрд┐рдП рдЧрдП рдЗрдирдкреБрдЯ рдЖрдЗрдЯрдореНрд╕ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд RNN рд╕реЗрд▓реНрд╕ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдореЗрдВ рднрд╛рдЧ рд▓реЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЛрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЗрдирдкреБрдЯ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд▓реЗ рдЬрд╛рддреЗред рдпрд╣ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдХрд┐ RNN рдХреЛ рдХреЗрд╡рд▓ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реАрдХреНрд╡реЗрдВрд╕ рд╕рд╛рдЗрдЬ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред\n",
|
||||
"\n",
|
||||
"рдЗрд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, PyTorch рдореЗрдВ рдкреИрдбреЗрдб рд╕реАрдХреНрд╡реЗрдВрд╕ рд╕реНрдЯреЛрд░реЗрдЬ рдХрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдлреЙрд░реНрдореЗрдЯ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдРрд╕рд╛ рдЗрдирдкреБрдЯ рдкреИрдбреЗрдб рдорд┐рдиреАрдмреИрдЪ рд╣реИ:\n",
|
||||
"```\n",
|
||||
"[[1,2,3,4,5],\n",
|
||||
" [6,7,8,0,0],\n",
|
||||
" [9,0,0,0,0]]\n",
|
||||
"```\n",
|
||||
"рдпрд╣рд╛рдВ 0 рдкреИрдбреЗрдб рд╡реИрд▓реНрдпреВрдЬрд╝ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрдирдкреБрдЯ рд╕реАрдХреНрд╡реЗрдВрд╕реЗрдЬрд╝ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓рдВрдмрд╛рдИ рдХрд╛ рд╡реЗрдХреНрдЯрд░ `[5,3,1]` рд╣реИред\n",
|
||||
"\n",
|
||||
"рдкреИрдбреЗрдб рд╕реАрдХреНрд╡реЗрдВрд╕ рдХреЗ рд╕рд╛рде RNN рдХреЛ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ RNN рд╕реЗрд▓реНрд╕ рдХреЗ рдкрд╣рд▓реЗ рдЧреНрд░реБрдк рдХрд╛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдмрдбрд╝реЗ рдорд┐рдиреАрдмреИрдЪ (`[1,6,9]`) рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рддреАрд╕рд░реА рд╕реАрдХреНрд╡реЗрдВрд╕ рдХреА рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдП, рдФрд░ рдЫреЛрдЯреЗ рдорд┐рдиреАрдмреИрдЪреЗрдЬрд╝ (`[2,7]`, `[3,8]`) рдХреЗ рд╕рд╛рде рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЬрд╛рд░реА рд░рд╣реЗ, рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреИрдХреНрдб рд╕реАрдХреНрд╡реЗрдВрд╕ рдХреЛ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ `[1,6,9,2,7,3,8,4,5]`, рдФрд░ рд▓рдВрдмрд╛рдИ рдХрд╛ рд╡реЗрдХреНрдЯрд░ (`[5,3,1]`), рдЬрд┐рд╕рд╕реЗ рд╣рдо рдореВрд▓ рдкреИрдбреЗрдб рдорд┐рдиреАрдмреИрдЪ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдкреБрдирд░реНрдирд┐рд░реНрдорд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"рдкреИрдХреНрдб рд╕реАрдХреНрд╡реЗрдВрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо `torch.nn.utils.rnn.pack_padded_sequence` рдлрдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рднреА рд░рд┐рдХрд░реЗрдВрдЯ рд▓реЗрдпрд░реНрд╕, рдЬреИрд╕реЗ RNN, LSTM рдФрд░ GRU, рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкреИрдХреНрдб рд╕реАрдХреНрд╡реЗрдВрд╕реЗрдЬрд╝ рдХреЛ рд╕рдкреЛрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдкреИрдХреНрдб рдЖрдЙрдЯрдкреБрдЯ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ `torch.nn.utils.rnn.pad_packed_sequence` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбрд┐рдХреЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"рдкреИрдХреНрдб рд╕реАрдХреНрд╡реЗрдВрд╕ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рд▓рдВрдмрд╛рдИ рдХрд╛ рд╡реЗрдХреНрдЯрд░ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣рдореЗрдВ рдорд┐рдиреАрдмреИрдЪ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдлрдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def pad_length(b):\n",
|
||||
" # build vectorized sequence\n",
|
||||
" v = [encode(x[1]) for x in b]\n",
|
||||
" # compute max length of a sequence in this minibatch and length sequence itself\n",
|
||||
" len_seq = list(map(len,v))\n",
|
||||
" l = max(len_seq)\n",
|
||||
" return ( # tuple of three tensors - labels, padded features, length sequence\n",
|
||||
" torch.LongTensor([t[0]-1 for t in b]),\n",
|
||||
" torch.stack([torch.nn.functional.pad(torch.tensor(t),(0,l-len(t)),mode='constant',value=0) for t in v]),\n",
|
||||
" torch.tensor(len_seq)\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
"train_loader_len = torch.utils.data.DataLoader(train_dataset, batch_size=16, collate_fn=pad_length, shuffle=True)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ `LSTMClassifier` рдХреЗ рд╕рдорд╛рди рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди `forward` рдкрд╛рд╕ рдореЗрдВ рджреЛрдиреЛрдВ, рдкреИрдбреЗрдб рдорд┐рдиреАрдмреИрдЪ рдФрд░ рдЕрдиреБрдХреНрд░рдо рдХреА рд▓рдВрдмрд╛рдИ рдХрд╛ рд╡реЗрдХреНрдЯрд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ред рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдкреИрдХреНрдб рдЕрдиреБрдХреНрд░рдо рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ LSTM рд▓реЗрдпрд░ рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╡рд╛рдкрд╕ рдЕрдирдкреИрдХ рдХрд░рддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"> **Note**: рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдирдкреИрдХ рдХрд┐рдП рдЧрдП рдкрд░рд┐рдгрд╛рдо `x` рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЕрдЧрд▓реЗ рдЧрдгрдирд╛рдУрдВ рдореЗрдВ рдЫрд┐рдкреА рд╣реБрдИ рд▓реЗрдпрд░ рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрд╕ рдХреЛрдб рд╕реЗ рдЕрдирдкреИрдХрд┐рдВрдЧ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕реЗ рдпрд╣рд╛рдВ рд░рдЦрдиреЗ рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХреЗрдВ, рдпрджрд┐ рдЖрдкрдХреЛ рдиреЗрдЯрд╡рд░реНрдХ рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдЧреЗ рдХреА рдЧрдгрдирд╛рдУрдВ рдореЗрдВ рдХрд░рдирд╛ рдкрдбрд╝реЗред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class LSTMPackClassifier(torch.nn.Module):\n",
|
||||
" def __init__(self, vocab_size, embed_dim, hidden_dim, num_class):\n",
|
||||
" super().__init__()\n",
|
||||
" self.hidden_dim = hidden_dim\n",
|
||||
" self.embedding = torch.nn.Embedding(vocab_size, embed_dim)\n",
|
||||
" self.embedding.weight.data = torch.randn_like(self.embedding.weight.data)-0.5\n",
|
||||
" self.rnn = torch.nn.LSTM(embed_dim,hidden_dim,batch_first=True)\n",
|
||||
" self.fc = torch.nn.Linear(hidden_dim, num_class)\n",
|
||||
"\n",
|
||||
" def forward(self, x, lengths):\n",
|
||||
" batch_size = x.size(0)\n",
|
||||
" x = self.embedding(x)\n",
|
||||
" pad_x = torch.nn.utils.rnn.pack_padded_sequence(x,lengths,batch_first=True,enforce_sorted=False)\n",
|
||||
" pad_x,(h,c) = self.rnn(pad_x)\n",
|
||||
" x, _ = torch.nn.utils.rnn.pad_packed_sequence(pad_x,batch_first=True)\n",
|
||||
" return self.fc(h[-1])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"metadata": {
|
||||
"scrolled": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"3200: acc=0.285625\n",
|
||||
"6400: acc=0.33359375\n",
|
||||
"9600: acc=0.3876041666666667\n",
|
||||
"12800: acc=0.44078125\n",
|
||||
"16000: acc=0.4825\n",
|
||||
"19200: acc=0.5235416666666667\n",
|
||||
"22400: acc=0.5559821428571429\n",
|
||||
"25600: acc=0.58609375\n",
|
||||
"28800: acc=0.6116666666666667\n",
|
||||
"32000: acc=0.63340625\n",
|
||||
"35200: acc=0.6525284090909091\n",
|
||||
"38400: acc=0.668515625\n",
|
||||
"41600: acc=0.6822596153846154\n",
|
||||
"44800: acc=0.6948214285714286\n",
|
||||
"48000: acc=0.7052708333333333\n",
|
||||
"51200: acc=0.71521484375\n",
|
||||
"54400: acc=0.7239889705882353\n",
|
||||
"57600: acc=0.7315277777777778\n",
|
||||
"60800: acc=0.7388486842105263\n",
|
||||
"64000: acc=0.74571875\n",
|
||||
"67200: acc=0.7518303571428572\n",
|
||||
"70400: acc=0.7576988636363636\n",
|
||||
"73600: acc=0.7628940217391305\n",
|
||||
"76800: acc=0.7681510416666667\n",
|
||||
"80000: acc=0.7728125\n",
|
||||
"83200: acc=0.7772235576923077\n",
|
||||
"86400: acc=0.7815393518518519\n",
|
||||
"89600: acc=0.7857700892857142\n",
|
||||
"92800: acc=0.7895043103448276\n",
|
||||
"96000: acc=0.7930520833333333\n",
|
||||
"99200: acc=0.7959072580645161\n",
|
||||
"102400: acc=0.798994140625\n",
|
||||
"105600: acc=0.802064393939394\n",
|
||||
"108800: acc=0.8051378676470589\n",
|
||||
"112000: acc=0.8077857142857143\n",
|
||||
"115200: acc=0.8104600694444445\n",
|
||||
"118400: acc=0.8128293918918919\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(0.029785829671223958, 0.8138166666666666)"
|
||||
]
|
||||
},
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"net = LSTMPackClassifier(vocab_size,64,32,len(classes)).to(device)\n",
|
||||
"train_epoch_emb(net,train_loader_len, lr=0.001,use_pack_sequence=True)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **рдиреЛрдЯ:** рдЖрдкрдиреЗ рджреЗрдЦрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдо рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХреЛ `use_pack_sequence` рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, `pack_padded_sequence` рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рдВрдмрд╛рдИ рдЕрдиреБрдХреНрд░рдо рдЯреЗрдВрд╕рд░ рдХреЛ CPU рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд╕рдордп рд▓рдВрдмрд╛рдИ рдЕрдиреБрдХреНрд░рдо рдбреЗрдЯрд╛ рдХреЛ GPU рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдЖрдк [`torchnlp.py`](../../../../../lessons/5-NLP/16-RNN/torchnlp.py) рдлрд╝рд╛рдЗрд▓ рдореЗрдВ `train_emb` рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рджреНрд╡рд┐рджрд┐рд╢ рдФрд░ рдмрд╣реБрд╕реНрддрд░реАрдп RNNs\n",
|
||||
"\n",
|
||||
"рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рд╕рднреА рдкреБрдирд░рд╛рд╡рд░реНрддреА рдиреЗрдЯрд╡рд░реНрдХ рдПрдХ рджрд┐рд╢рд╛ рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рдереЗ, рдЕрдиреБрдХреНрд░рдо рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдЕрдВрдд рддрдХред рдпрд╣ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрд╕ рддрд░реАрдХреЗ рдЬреИрд╕рд╛ рд╣реИ рдЬреИрд╕реЗ рд╣рдо рдкрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рднрд╛рд╖рдг рд╕реБрдирддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрдИ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрдирдкреБрдЯ рдЕрдиреБрдХреНрд░рдо рддрдХ рд░реИрдВрдбрдо рдПрдХреНрд╕реЗрд╕ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рджреЛрдиреЛрдВ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдЧрдгрдирд╛ рдЪрд▓рд╛рдирд╛ рд╕рдордЭрджрд╛рд░реА рд╣реЛ рд╕рдХрддреА рд╣реИред рдРрд╕реЗ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ **рджреНрд╡рд┐рджрд┐рд╢** RNNs рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрдиреНрд╣реЗрдВ RNN/LSTM/GRU рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ `bidirectional=True` рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"рджреНрд╡рд┐рджрд┐рд╢ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рджреЛ рдЫрд┐рдкреЗ рд╣реБрдП рд╕реНрдЯреЗрдЯ рд╡реЗрдХреНрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдкреНрд░рддреНрдпреЗрдХ рджрд┐рд╢рд╛ рдХреЗ рд▓рд┐рдП рдПрдХред PyTorch рдЗрди рд╡реЗрдХреНрдЯрд░реЛрдВ рдХреЛ рдПрдХ рдмрдбрд╝реЗ рдЖрдХрд╛рд░ рдХреЗ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдиреНрдХреЛрдб рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд╛рдлреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдорддреМрд░ рдкрд░ рдЖрдк рдкрд░рд┐рдгрд╛рдореА рдЫрд┐рдкреЗ рд╣реБрдП рд╕реНрдЯреЗрдЯ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрдиреЗрдХреНрдЯреЗрдб рд▓реАрдирд┐рдпрд░ рд▓реЗрдпрд░ рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рд▓реЗрдпрд░ рдмрдирд╛рддреЗ рд╕рдордп рдЗрд╕ рдЖрдХрд╛рд░ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред\n",
|
||||
"\n",
|
||||
"рдкреБрдирд░рд╛рд╡рд░реНрддреА рдиреЗрдЯрд╡рд░реНрдХ, рдЪрд╛рд╣реЗ рд╡рд╣ рдПрдХ-рджрд┐рд╢рд╛рддреНрдордХ рд╣реЛ рдпрд╛ рджреНрд╡рд┐рджрд┐рд╢, рдЕрдиреБрдХреНрд░рдо рдХреЗ рднреАрддрд░ рдХреБрдЫ рдкреИрдЯрд░реНрди рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрдЯреЗрдЯ рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдкрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЬреИрд╕реЗ рдХрд┐ рдХрдиреНрд╡реЛрд▓реНрдпреВрд╢рдирд▓ рдиреЗрдЯрд╡рд░реНрдХреНрд╕ рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИ, рд╣рдо рдкрд╣рд▓реЗ рд▓реЗрдпрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рдХрд╛рд▓реЗ рдЧрдП рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдкреИрдЯрд░реНрди рд╕реЗ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдкреИрдЯрд░реНрди рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд▓реЗрдпрд░ рдХреЗ рдКрдкрд░ рдПрдХ рдФрд░ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд▓реЗрдпрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╣рдореЗрдВ **рдмрд╣реБрд╕реНрддрд░реАрдп RNN** рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рддрдХ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рджреЛ рдпрд╛ рдЕрдзрд┐рдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдиреЗрдЯрд╡рд░реНрдХ рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдкрд┐рдЫрд▓реЗ рд▓реЗрдпрд░ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдЕрдЧрд▓реЗ рд▓реЗрдпрд░ рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"*рдпрд╣ рдЪрд┐рддреНрд░ [рдЗрд╕ рд╢рд╛рдирджрд╛рд░ рдкреЛрд╕реНрдЯ](https://towardsdatascience.com/from-a-lstm-cell-to-a-multilayer-lstm-network-with-pytorch-2899eb5696f3) рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдлрд░реНрдирд╛рдВрдбреЛ рд▓реЛрдкреЗрдЬрд╝ рдиреЗ рд▓рд┐рдЦрд╛ рд╣реИред*\n",
|
||||
"\n",
|
||||
"PyTorch рдРрд╕реЗ рдиреЗрдЯрд╡рд░реНрдХ рдмрдирд╛рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ RNN/LSTM/GRU рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ `num_layers` рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рдХрдИ рд▓реЗрдпрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрди рдЬрд╛рддреА рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рднреА рд╣реЛрдЧрд╛ рдХрд┐ рдЫрд┐рдкреЗ рд╣реБрдП/рд╕реНрдЯреЗрдЯ рд╡реЗрдХреНрдЯрд░ рдХрд╛ рдЖрдХрд╛рд░ рдЖрдиреБрдкрд╛рддрд┐рдХ рд░реВрдк рд╕реЗ рдмрдврд╝реЗрдЧрд╛, рдФрд░ рдЖрдкрдХреЛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд▓реЗрдпрд░ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рд╕рдВрднрд╛рд▓рддреЗ рд╕рдордп рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП RNNs\n",
|
||||
"\n",
|
||||
"рдЗрд╕ рдпреВрдирд┐рдЯ рдореЗрдВ, рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ RNNs рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреБрдХреНрд░рдо рд╡рд░реНрдЧреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡реЗ рдХрдИ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдЯреЗрдХреНрд╕реНрдЯ рдЬрдирд░реЗрд╢рди, рдорд╢реАрди рдЕрдиреБрд╡рд╛рдж, рдФрд░ рдЕрдзрд┐рдХред рд╣рдо рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдЕрдЧрд▓реЗ рдпреВрдирд┐рдЯ рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**рдЕрд╕реНрд╡реАрдХрд░рдг**: \nрдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ AI рдЕрдиреБрд╡рд╛рдж рд╕реЗрд╡рд╛ [Co-op Translator](https://github.com/Azure/co-op-translator) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрдмрдХрд┐ рд╣рдо рд╕рдЯреАрдХрддрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕рд░рдд рд╣реИрдВ, рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрдиреБрд╡рд╛рдж рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдпрд╛ рдЕрд╢реБрджреНрдзрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдореВрд▓ рднрд╛рд╖рд╛ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдореВрд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕реНрд░реЛрдд рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдкреЗрд╢реЗрд╡рд░ рдорд╛рдирд╡ рдЕрдиреБрд╡рд╛рдж рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред рдЗрд╕ рдЕрдиреБрд╡рд╛рдж рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд┐рд╕реА рднреА рдЧрд▓рддрдлрд╣рдореА рдпрд╛ рдЧрд▓рдд рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╣рдо рдЙрддреНрддрд░рджрд╛рдпреА рдирд╣реАрдВ рд╣реИрдВред\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"interpreter": {
|
||||
"hash": "16af2a8bbb083ea23e5e41c7f5787656b2ce26968575d8763f2c4b17f9cd711f"
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3.8.12 ('py38')",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.8.12"
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "522ee52ae3d5ae933e283286254e9a55",
|
||||
"translation_date": "2025-08-31T15:24:12+00:00",
|
||||
"source_file": "lessons/5-NLP/16-RNN/RNNPyTorch.ipynb",
|
||||
"language_code": "hi"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
|
|
@ -0,0 +1,460 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# рдкреБрдирд░рд╛рд╡рд░реНрддреА рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ\n",
|
||||
"\n",
|
||||
"рдкрд┐рдЫрд▓реЗ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ, рд╣рдордиреЗ рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд╕рдореГрджреНрдз рдЕрд░реНрдердкреВрд░реНрдг рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рдХрд╡рд░ рдХрд┐рдпрд╛ред рдЬрд┐рд╕ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡рд╣ рд╡рд╛рдХреНрдп рдореЗрдВ рд╢рдмреНрджреЛрдВ рдХреЗ рд╕рдордЧреНрд░ рдЕрд░реНрде рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╢рдмреНрджреЛрдВ рдХреЗ **рдХреНрд░рдо** рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреЗ рдмрд╛рдж рдХрд╛ рд╕рдореЗрдХрди рдСрдкрд░реЗрд╢рди рдореВрд▓ рдЯреЗрдХреНрд╕реНрдЯ рд╕реЗ рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдпреЗ рдореЙрдбрд▓ рд╢рдмреНрджреЛрдВ рдХреЗ рдХреНрд░рдо рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реИрдВ, рд╡реЗ рдЯреЗрдХреНрд╕реНрдЯ рдЬрдирд░реЗрд╢рди рдпрд╛ рдкреНрд░рд╢реНрди рдЙрддреНрддрд░ рдЬреИрд╕реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдпрд╛ рдЕрд╕реНрдкрд╖реНрдЯ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред\n",
|
||||
"\n",
|
||||
"рдЯреЗрдХреНрд╕реНрдЯ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдЕрд░реНрде рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдЬрд┐рд╕реЗ **рдкреБрдирд░рд╛рд╡рд░реНрддреА рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ** рдпрд╛ RNN рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред RNN рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдЕрдкрдиреЗ рд╡рд╛рдХреНрдп рдХреЛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ-рдПрдХ рдЯреЛрдХрди рдХрд░рдХреЗ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдХреБрдЫ **рд╕реНрдерд┐рддрд┐** рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдЕрдЧрд▓реЗ рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"рджрд┐рдП рдЧрдП рдЯреЛрдХрди рдЕрдиреБрдХреНрд░рдо $X_0,\\dots,X_n$ рдХреЗ рд▓рд┐рдП, RNN рдПрдХ рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдмреНрд▓реЙрдХреЛрдВ рдХрд╛ рдЕрдиреБрдХреНрд░рдо рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдмреИрдХрдкреНрд░реЛрдкреЗрдЧреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдВрдб-рдЯреВ-рдПрдВрдб рдЯреНрд░реЗрди рдХрд░рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдиреЗрдЯрд╡рд░реНрдХ рдмреНрд▓реЙрдХ $(X_i,S_i)$ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ, рдФрд░ $S_{i+1}$ рдХреЛ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдЕрдВрддрд┐рдо рд╕реНрдерд┐рддрд┐ $S_n$ рдпрд╛ рдЖрдЙрдЯрдкреБрдЯ $Y_n$ рдПрдХ рд░реИрдЦрд┐рдХ рд╡рд░реНрдЧреАрдХрд░рдгрдХрд░реНрддрд╛ рдореЗрдВ рдЬрд╛рддреА рд╣реИ рддрд╛рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХреЗред рд╕рднреА рдиреЗрдЯрд╡рд░реНрдХ рдмреНрд▓реЙрдХ рд╕рдорд╛рди рд╡реЗрдЯреНрд╕ рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рдмреИрдХрдкреНрд░реЛрдкреЗрдЧреЗрд╢рди рдкрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдВрдб-рдЯреВ-рдПрдВрдб рдЯреНрд░реЗрди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"> рдКрдкрд░ рджреА рдЧрдИ рдЖрдХреГрддрд┐ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдЕрдирд░реЛрд▓реНрдб рд░реВрдк (рдмрд╛рдИрдВ рдУрд░) рдФрд░ рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ (рджрд╛рдИрдВ рдУрд░) рдореЗрдВ рджрд┐рдЦрд╛рддреА рд╣реИред рдпрд╣ рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╕рднреА RNN рд╕реЗрд▓реНрд╕ рдХреЗ рд╕рдорд╛рди **рд╢реЗрдпрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╡реЗрдЯреНрд╕** рд╣реЛрддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"рдЪреВрдВрдХрд┐ рд╕реНрдерд┐рддрд┐ рд╡реЗрдХреНрдЯрд░ $S_0,\\dots,S_n$ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд╕ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, RNN рд╢рдмреНрджреЛрдВ рдХреЗ рдмреАрдЪ рдХреНрд░рдорд┐рдХ рдирд┐рд░реНрднрд░рддрд╛ рд╕реАрдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдХрд╣реАрдВ *not* рд╢рдмреНрдж рдЖрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕реНрдерд┐рддрд┐ рд╡реЗрдХреНрдЯрд░ рдХреЗ рднреАрддрд░ рдХреБрдЫ рддрддреНрд╡реЛрдВ рдХреЛ рдирдХрд╛рд░рдирд╛ рд╕реАрдЦ рд╕рдХрддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"рдЕрдВрджрд░, рдкреНрд░рддреНрдпреЗрдХ RNN рд╕реЗрд▓ рдореЗрдВ рджреЛ рд╡реЗрдЯ рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╣реЛрддреЗ рд╣реИрдВ: $W_H$ рдФрд░ $W_I$, рдФрд░ рдмрд╛рдпрд╕ $b$ред рдкреНрд░рддреНрдпреЗрдХ RNN рдЪрд░рдг рдореЗрдВ, рджрд┐рдП рдЧрдП рдЗрдирдкреБрдЯ $X_i$ рдФрд░ рдЗрдирдкреБрдЯ рд╕реНрдерд┐рддрд┐ $S_i$, рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдерд┐рддрд┐ рдХреА рдЧрдгрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рддреА рд╣реИ: $S_{i+1} = f(W_H\\times S_i + W_I\\times X_i+b)$, рдЬрд╣рд╛рдВ $f$ рдПрдХ рд╕рдХреНрд░рд┐рдпрдг рдлрд╝рдВрдХреНрд╢рди рд╣реИ (рдЕрдХреНрд╕рд░ $\\tanh$)ред\n",
|
||||
"\n",
|
||||
"> рдЯреЗрдХреНрд╕реНрдЯ рдЬрдирд░реЗрд╢рди (рдЬрд┐рд╕реЗ рд╣рдо рдЕрдЧрд▓реЗ рдпреВрдирд┐рдЯ рдореЗрдВ рдХрд╡рд░ рдХрд░реЗрдВрдЧреЗ) рдпрд╛ рдорд╢реАрди рдЕрдиреБрд╡рд╛рдж рдЬреИрд╕реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ RNN рдЪрд░рдг рдореЗрдВ рдХреБрдЫ рдЖрдЙрдЯрдкреБрдЯ рдорд╛рди рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рдФрд░ рдореИрдЯреНрд░рд┐рдХреНрд╕ $W_O$ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдХреА рдЧрдгрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рддреА рд╣реИ: $Y_i=f(W_O\\times S_i+b_O)$ред\n",
|
||||
"\n",
|
||||
"рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рд╣рдорд╛рд░реЗ рд╕рдорд╛рдЪрд╛рд░ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЛ рд╡рд░реНрдЧреАрдХреГрдд рдХрд░рдиреЗ рдореЗрдВ рдХреИрд╕реЗ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"> рд╕реИрдВрдбрдмреЙрдХреНрд╕ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реЗрд▓ рдЪрд▓рд╛рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрд╡рд╢реНрдпрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЗрдВрд╕реНрдЯреЙрд▓ рд╣реЛ рдЧрдИ рд╣реИ, рдФрд░ рдбреЗрдЯрд╛ рдкреНрд░реАрдлреЗрдЪ рд╣реЛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рд▓реЛрдХрд▓ рд░реВрдк рд╕реЗ рдЪрд▓рд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реЗрд▓ рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import sys\n",
|
||||
"!{sys.executable} -m pip install --quiet tensorflow_datasets==4.4.0\n",
|
||||
"!cd ~ && wget -q -O - https://mslearntensorflowlp.blob.core.windows.net/data/tfds-ag-news.tgz | tar xz"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import tensorflow as tf\n",
|
||||
"from tensorflow import keras\n",
|
||||
"import tensorflow_datasets as tfds\n",
|
||||
"import numpy as np\n",
|
||||
"\n",
|
||||
"# We are going to be training pretty large models. In order not to face errors, we need\n",
|
||||
"# to set tensorflow option to grow GPU memory allocation when required\n",
|
||||
"physical_devices = tf.config.list_physical_devices('GPU') \n",
|
||||
"if len(physical_devices)>0:\n",
|
||||
" tf.config.experimental.set_memory_growth(physical_devices[0], True)\n",
|
||||
"\n",
|
||||
"ds_train, ds_test = tfds.load('ag_news_subset').values()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"nteract": {
|
||||
"transient": {
|
||||
"deleting": false
|
||||
}
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"рдЬрдм рдмрдбрд╝реЗ рдореЙрдбрд▓ рдХрд╛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ GPU рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдПрдХ рд╕рдорд╕реНрдпрд╛ рдмрди рд╕рдХрддрд╛ рд╣реИред рд╣рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдорд┐рдиреАрдмреИрдЪ рдЖрдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рддрд╛рдХрд┐ рдбреЗрдЯрд╛ рд╣рдорд╛рд░реЗ GPU рдореЗрдореЛрд░реА рдореЗрдВ рдлрд┐рдЯ рд╣реЛ рдЬрд╛рдП рдФрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдкрд░реНрдпрд╛рдкреНрдд рддреЗрдЬрд╝ рд╣реЛред рдпрджрд┐ рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЛ рдЕрдкрдиреЗ GPU рдорд╢реАрди рдкрд░ рдЪрд▓рд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЛ рддреЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд┐рдиреАрдмреИрдЪ рдЖрдХрд╛рд░ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"> **Note**: NVidia рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЗ рдХреБрдЫ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреНрдЮрд╛рдд рд╣реИ рдХрд┐ рд╡реЗ рдореЙрдбрд▓ рдХрд╛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдореЗрдореЛрд░реА рдХреЛ рд░рд┐рд▓реАрдЬрд╝ рдирд╣реАрдВ рдХрд░рддреЗред рд╣рдо рдЗрд╕ рдиреЛрдЯрдмреБрдХ рдореЗрдВ рдХрдИ рдЙрджрд╛рд╣рд░рдг рдЪрд▓рд╛ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдХреБрдЫ рд╕реЗрдЯрдЕрдк рдореЗрдВ рдореЗрдореЛрд░реА рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рдЖрдк рдЗрд╕реА рдиреЛрдЯрдмреБрдХ рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░рдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдореЙрдбрд▓ рдХрд╛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп рдХреБрдЫ рдЕрдЬреАрдм рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдиреЛрдЯрдмреБрдХ рдХрд░реНрдиреЗрд▓ рдХреЛ рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {
|
||||
"collapsed": true,
|
||||
"jupyter": {
|
||||
"outputs_hidden": false,
|
||||
"source_hidden": false
|
||||
},
|
||||
"nteract": {
|
||||
"transient": {
|
||||
"deleting": false
|
||||
}
|
||||
}
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"batch_size = 16\n",
|
||||
"embed_size = 64"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рд╕рд░рд▓ RNN рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░\n",
|
||||
"\n",
|
||||
"рд╕рд░рд▓ RNN рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдпреВрдирд┐рдЯ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд░реИрдЦрд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдЗрдирдкреБрдЯ рд╡реЗрдХреНрдЯрд░ рдФрд░ рдПрдХ рд╕реНрдЯреЗрдЯ рд╡реЗрдХреНрдЯрд░ рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдирдпрд╛ рд╕реНрдЯреЗрдЯ рд╡реЗрдХреНрдЯрд░ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред Keras рдореЗрдВ, рдЗрд╕реЗ `SimpleRNN` рд▓реЗрдпрд░ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдо RNN рд▓реЗрдпрд░ рдХреЛ рд╕реАрдзреЗ рд╡рди-рд╣реЙрдЯ рдПрдиреНрдХреЛрдбреЗрдб рдЯреЛрдХрди рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреА рдЙрдЪреНрдЪ рдЖрдпрд╛рдореАрдпрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╢рдмреНрдж рд╡реЗрдХреНрдЯрд░ рдХреА рдЖрдпрд╛рдореАрдпрддрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд▓реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рдХреЗ рдмрд╛рдж рдПрдХ RNN рд▓реЗрдпрд░ рдФрд░ рдЕрдВрдд рдореЗрдВ рдПрдХ `Dense` рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░ред\n",
|
||||
"\n",
|
||||
"> **Note**: рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдЖрдпрд╛рдореАрдпрддрд╛ рдЗрддрдиреА рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛрддреА, рдЬреИрд╕реЗ рдХрд┐ рдЬрдм рдХреИрд░реЗрдХреНрдЯрд░-рд▓реЗрд╡рд▓ рдЯреЛрдХрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡рди-рд╣реЙрдЯ рдПрдиреНрдХреЛрдбреЗрдб рдЯреЛрдХрди рдХреЛ рд╕реАрдзреЗ RNN рд╕реЗрд▓ рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ рд╕рдордЭрджрд╛рд░реА рд╣реЛ рд╕рдХрддреА рд╣реИред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Model: \"sequential\"\n",
|
||||
"_________________________________________________________________\n",
|
||||
"Layer (type) Output Shape Param # \n",
|
||||
"=================================================================\n",
|
||||
"text_vectorization (TextVect (None, None) 0 \n",
|
||||
"_________________________________________________________________\n",
|
||||
"embedding (Embedding) (None, None, 64) 1280000 \n",
|
||||
"_________________________________________________________________\n",
|
||||
"simple_rnn (SimpleRNN) (None, 16) 1296 \n",
|
||||
"_________________________________________________________________\n",
|
||||
"dense (Dense) (None, 4) 68 \n",
|
||||
"=================================================================\n",
|
||||
"Total params: 1,281,364\n",
|
||||
"Trainable params: 1,281,364\n",
|
||||
"Non-trainable params: 0\n",
|
||||
"_________________________________________________________________\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"vocab_size = 20000\n",
|
||||
"\n",
|
||||
"vectorizer = keras.layers.experimental.preprocessing.TextVectorization(\n",
|
||||
" max_tokens=vocab_size,\n",
|
||||
" input_shape=(1,))\n",
|
||||
"\n",
|
||||
"model = keras.models.Sequential([\n",
|
||||
" vectorizer,\n",
|
||||
" keras.layers.Embedding(vocab_size, embed_size),\n",
|
||||
" keras.layers.SimpleRNN(16),\n",
|
||||
" keras.layers.Dense(4,activation='softmax')\n",
|
||||
"])\n",
|
||||
"\n",
|
||||
"model.summary()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **рдзреНрдпрд╛рди рджреЗрдВ:** рдпрд╣рд╛рдБ рд╣рдо рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд▓реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмреЗрд╣рддрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдо Word2Vec рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдкреВрд░реНрд╡-рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд▓реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдкрд┐рдЫрд▓реЗ рдпреВрдирд┐рдЯ рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЛ рдкреВрд░реНрд╡-рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВред\n",
|
||||
"\n",
|
||||
"рдЕрдм рдЪрд▓рд┐рдП рдЕрдкрдиреЗ RNN рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдпрддрдГ RNN рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рдХрд╛рдлреА рдХрдард┐рди рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬрдм RNN рд╕реЗрд▓реНрд╕ рдХреЛ рдЕрдиреБрдХреНрд░рдо рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде рдЕрдирд░реЛрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдмреИрдХрдкреНрд░реЛрдкреЗрдЧреЗрд╢рди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд▓реЗрдпрд░реНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛рдлреА рдЕрдзрд┐рдХ рд╣реЛ рдЬрд╛рддреА рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рд▓рд░реНрдирд┐рдВрдЧ рд░реЗрдЯ рдЪреБрдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЕрдЪреНрдЫреЗ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдПрдХ рдмрдбрд╝реЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдкрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдХрд╛рдлреА рд╕рдордп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП GPU рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рддреЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреЗрд╡рд▓ рд╕рдорд╛рдЪрд╛рд░ рд╢реАрд░реНрд╖рдХреЛрдВ рдкрд░ RNN рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╡рд┐рд╡рд░рдг рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗред рдЖрдк рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {
|
||||
"scrolled": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Training vectorizer\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def extract_title(x):\n",
|
||||
" return x['title']\n",
|
||||
"\n",
|
||||
"def tupelize_title(x):\n",
|
||||
" return (extract_title(x),x['label'])\n",
|
||||
"\n",
|
||||
"print('Training vectorizer')\n",
|
||||
"vectorizer.adapt(ds_train.take(2000).map(extract_title))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"7500/7500 [==============================] - 82s 11ms/step - loss: 0.6629 - acc: 0.7623 - val_loss: 0.5559 - val_acc: 0.7995\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<tensorflow.python.keras.callbacks.History at 0x7f3e0030d350>"
|
||||
]
|
||||
},
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"model.compile(loss='sparse_categorical_crossentropy',metrics=['acc'], optimizer='adam')\n",
|
||||
"model.fit(ds_train.map(tupelize_title).batch(batch_size),validation_data=ds_test.map(tupelize_title).batch(batch_size))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"nteract": {
|
||||
"transient": {
|
||||
"deleting": false
|
||||
}
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"> **рдиреЛрдЯ** рдХрд┐ рд╕рдЯреАрдХрддрд╛ рдпрд╣рд╛рдВ рдХрдо рд╣реЛ рд╕рдХрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рд╕рдорд╛рдЪрд╛рд░ рд╢реАрд░реНрд╖рдХреЛрдВ рдкрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рд╡реЗрд░рд┐рдПрдмрд▓ рдЕрдиреБрдХреНрд░рдореЛрдВ рдкрд░ рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ \n",
|
||||
"\n",
|
||||
"рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ `TextVectorization` рд▓реЗрдпрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдорд┐рдиреАрдмреИрдЪ рдореЗрдВ рд╡реЗрд░рд┐рдПрдмрд▓ рд▓рдВрдмрд╛рдИ рд╡рд╛рд▓реЗ рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЛ рдкреИрдб рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рдкреИрдб рдХрд░ рджреЗрддреА рд╣реИред рдпрд╣ рджреЗрдЦрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпреЗ рдЯреЛрдХрди рднреА рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдореЗрдВ рднрд╛рдЧ рд▓реЗрддреЗ рд╣реИрдВ, рдФрд░ рд╡реЗ рдореЙрдбрд▓ рдХреЗ рдХрдиреНрд╡рд░реНрдЬреЗрдВрд╕ рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"рдкреИрдбрд┐рдВрдЧ рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдХрдИ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХреЛ рдЕрдиреБрдХреНрд░рдо рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреБрдирдГ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рдФрд░ рд╕рднреА рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЛ рдЙрдирдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдореВрд╣рд┐рдд рдХрд░рдирд╛ред рдЗрд╕реЗ `tf.data.experimental.bucket_by_sequence_length` рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рджреЗрдЦреЗрдВ [рдбреЙрдХреНрдпреВрдореЗрдВрдЯреЗрд╢рди](https://www.tensorflow.org/api_docs/python/tf/data/experimental/bucket_by_sequence_length))ред\n",
|
||||
"\n",
|
||||
"рдПрдХ рдЕрдиреНрдп рддрд░реАрдХрд╛ **рдорд╛рд╕реНрдХрд┐рдВрдЧ** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред Keras рдореЗрдВ, рдХреБрдЫ рд▓реЗрдпрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдЗрдирдкреБрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИрдВ рдЬреЛ рджрд┐рдЦрд╛рддреА рд╣реИрдВ рдХрд┐ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдХрд┐рди рдЯреЛрдХрдиреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдорд╛рд╕реНрдХрд┐рдВрдЧ рдХреЛ рдЕрдкрдиреЗ рдореЙрдбрд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдпрд╛ рддреЛ рдПрдХ рдЕрд▓рдЧ `Masking` рд▓реЗрдпрд░ ([рдбреЙрдХреНрд╕](https://keras.io/api/layers/core_layers/masking/)) рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рд╣рдо рдЕрдкрдиреЗ `Embedding` рд▓реЗрдпрд░ рдореЗрдВ `mask_zero=True` рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"> **Note**: рдЗрд╕ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдореЗрдВ рдкреВрд░реЗ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдкрд░ рдПрдХ рдПрдкреЛрдХ рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧрднрдЧ 5 рдорд┐рдирдЯ рд▓рдЧреЗрдВрдЧреЗред рдпрджрд┐ рдЖрдк рдзреИрд░реНрдп рдЦреЛ рджреЗрдВ рддреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЛ рдХрд┐рд╕реА рднреА рд╕рдордп рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред рдЖрдк рдпрд╣ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░реЗрдВ, `ds_train` рдФрд░ `ds_test` рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХреЗ рдмрд╛рдж `.take(...)` рдХреНрд▓реЙрдЬ рдЬреЛрдбрд╝рдХрд░ред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"7500/7500 [==============================] - 371s 49ms/step - loss: 0.5401 - acc: 0.8079 - val_loss: 0.3780 - val_acc: 0.8822\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<tensorflow.python.keras.callbacks.History at 0x7f3dec118850>"
|
||||
]
|
||||
},
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def extract_text(x):\n",
|
||||
" return x['title']+' '+x['description']\n",
|
||||
"\n",
|
||||
"def tupelize(x):\n",
|
||||
" return (extract_text(x),x['label'])\n",
|
||||
"\n",
|
||||
"model = keras.models.Sequential([\n",
|
||||
" vectorizer,\n",
|
||||
" keras.layers.Embedding(vocab_size,embed_size,mask_zero=True),\n",
|
||||
" keras.layers.SimpleRNN(16),\n",
|
||||
" keras.layers.Dense(4,activation='softmax')\n",
|
||||
"])\n",
|
||||
"\n",
|
||||
"model.compile(loss='sparse_categorical_crossentropy',metrics=['acc'], optimizer='adam')\n",
|
||||
"model.fit(ds_train.map(tupelize).batch(batch_size),validation_data=ds_test.map(tupelize).batch(batch_size))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдЕрдм рдЬрдм рд╣рдо рдорд╛рд╕реНрдХрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╢реАрд░реНрд╖рдХреЛрдВ рдФрд░ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЗ рдкреВрд░реЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдкрд░ рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"> **рдиреЛрдЯ**: рдХреНрдпрд╛ рдЖрдкрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЙрд╕ рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╕рдорд╛рдЪрд╛рд░ рд╢реАрд░реНрд╖рдХреЛрдВ рдкрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рди рдХрд┐ рд▓реЗрдЦ рдХреЗ рдкреВрд░реЗ рдореБрдЦреНрдп рднрд╛рдЧ рдкрд░? рд╕рдВрднрд╡рддрдГ, рдЗрд╕рд╕реЗ рдХреБрдЫ рдЯреЛрдХрди рдЕрдирджреЗрдЦреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬрд╝рд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдХрд╛ рдкреНрд░рднрд╛рд╡ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## LSTM: рд▓рдВрдмреА рдЕрд╡рдзрд┐ рдХреА рд╕реНрдореГрддрд┐\n",
|
||||
"\n",
|
||||
"RNNs рдХреА рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ **vanishing gradients**ред RNNs рдХрд╛рдлреА рд▓рдВрдмреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдмреИрдХрдкреНрд░реЛрдкреЗрдЧреЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдиреЗрдЯрд╡рд░реНрдХ рдХреА рдкрд╣рд▓реА рдкрд░рдд рддрдХ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯреНрд╕ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд╛рдкрд╕ рд▓реЗ рдЬрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЬрдм рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдиреЗрдЯрд╡рд░реНрдХ рджреВрд░рд╕реНрде рдЯреЛрдХрди рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ рд╕реАрдЦрдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ **рд╕реНрдкрд╖реНрдЯ рд╕реНрдерд┐рддрд┐ рдкреНрд░рдмрдВрдзрди** рдХреЛ **рдЧреЗрдЯреНрд╕** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ред рдЧреЗрдЯреНрд╕ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рд╡рд╛рд▓реА рджреЛ рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд╣реИрдВ **рд▓рдВрдмреА рдЕрд╡рдзрд┐ рдХреА рд╕реНрдореГрддрд┐** (LSTM) рдФрд░ **рдЧреЗрдЯреЗрдб рд░рд┐рд▓реЗ рдпреВрдирд┐рдЯ** (GRU)ред рдпрд╣рд╛рдВ рд╣рдо LSTMs рдХреЛ рдХрд╡рд░ рдХрд░реЗрдВрдЧреЗред\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"рдПрдХ LSTM рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ RNN рдХреЗ рд╕рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рджреЛ рдЕрд╡рд╕реНрдерд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ рдЬреЛ рдкрд░рдд рд╕реЗ рдкрд░рдд рддрдХ рдкрд╛рд╕ рдХреА рдЬрд╛рддреА рд╣реИрдВ: рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрдерд┐рддрд┐ $c$, рдФрд░ рдЫрд┐рдкрд╛ рд╣реБрдЖ рд╡реЗрдХреНрдЯрд░ $h$ред рдкреНрд░рддреНрдпреЗрдХ рдпреВрдирд┐рдЯ рдкрд░, рдЫрд┐рдкрд╛ рд╣реБрдЖ рд╡реЗрдХреНрдЯрд░ $h_{t-1}$ рдХреЛ рдЗрдирдкреБрдЯ $x_t$ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпреЗ рджреЛрдиреЛрдВ рдорд┐рд▓рдХрд░ **рдЧреЗрдЯреНрд╕** рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдерд┐рддрд┐ $c_t$ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ $h_{t}$ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдЧреЗрдЯ рдореЗрдВ рд╕рд┐рдЧреНрдореЙрдЗрдб рд╕рдХреНрд░рд┐рдпрддрд╛ рд╣реЛрддреА рд╣реИ (рдЖрдЙрдЯрдкреБрдЯ $[0,1]$ рдХреА рд╕реАрдорд╛ рдореЗрдВ), рдЬрд┐рд╕реЗ рд╕реНрдерд┐рддрд┐ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рдЧреБрдгрд╛ рдХрд░рдиреЗ рдкрд░ рдмрд┐рдЯрд╡рд╛рдЗрдЬ рдорд╛рд╕реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред LSTMs рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЧреЗрдЯреНрд╕ рд╣реЛрддреЗ рд╣реИрдВ (рдКрдкрд░ рджреА рдЧрдИ рддрд╕реНрд╡реАрд░ рдореЗрдВ рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ):\n",
|
||||
"* **рднреВрд▓ рдЧреЗрдЯ** рдЬреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡реЗрдХреНрдЯрд░ $c_{t-1}$ рдХреЗ рдХреМрди рд╕реЗ рдШрдЯрдХреЛрдВ рдХреЛ рд╣рдореЗрдВ рднреВрд▓рдирд╛ рд╣реИ, рдФрд░ рдХреМрди рд╕реЗ рдкрд╛рд╕ рдХрд░рдиреЗ рд╣реИрдВред\n",
|
||||
"* **рдЗрдирдкреБрдЯ рдЧреЗрдЯ** рдЬреЛ рдпрд╣ рддрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрдирдкреБрдЯ рд╡реЗрдХреНрдЯрд░ рдФрд░ рдкрд┐рдЫрд▓реЗ рдЫрд┐рдкреЗ рд╣реБрдП рд╡реЗрдХреНрдЯрд░ рд╕реЗ рдХрд┐рддрдиреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕реНрдерд┐рддрд┐ рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред\n",
|
||||
"* **рдЖрдЙрдЯрдкреБрдЯ рдЧреЗрдЯ** рдЬреЛ рдирдИ рд╕реНрдерд┐рддрд┐ рд╡реЗрдХреНрдЯрд░ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рддрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдХреМрди рд╕реЗ рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирдП рдЫрд┐рдкреЗ рд╣реБрдП рд╡реЗрдХреНрдЯрд░ $h_t$ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред\n",
|
||||
"\n",
|
||||
"рд╕реНрдерд┐рддрд┐ $c$ рдХреЗ рдШрдЯрдХреЛрдВ рдХреЛ рдРрд╕реЗ рдлреНрд▓реИрдЧреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЪрд╛рд▓реВ рдФрд░ рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рд╣рдо рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдирд╛рдо *Alice* рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ рдорд╣рд┐рд▓рд╛ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╡рд╣ рдлреНрд▓реИрдЧ рдЙрдард╛рддреЗ рд╣реИрдВ рдЬреЛ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд╛рдХреНрдп рдореЗрдВ рдПрдХ рд╕реНрддреНрд░реАрд▓рд┐рдВрдЧ рд╕рдВрдЬреНрдЮрд╛ рд╣реИред рдЬрдм рд╣рдо рдЖрдЧреЗ *and Tom* рд╢рдмреНрджреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╡рд╣ рдлреНрд▓реИрдЧ рдЙрдард╛рддреЗ рд╣реИрдВ рдЬреЛ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╣реБрд╡рдЪрди рд╕рдВрдЬреНрдЮрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдХреЗ рд╣рдо рд╡рд╛рдХреНрдп рдХреЗ рд╡реНрдпрд╛рдХрд░рдгрд┐рдХ рдЧреБрдгреЛрдВ рдХрд╛ рдЯреНрд░реИрдХ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"> **Note**: LSTMs рдХреА рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдПрдХ рд╢рд╛рдирджрд╛рд░ рд╕рдВрд╕рд╛рдзрди рд╣реИ: [Understanding LSTM Networks](https://colah.github.io/posts/2015-08-Understanding-LSTMs/) рдХреНрд░рд┐рд╕реНрдЯреЛрдлрд░ рдУрд▓рд╛рд╣ рджреНрд╡рд╛рд░рд╛ред\n",
|
||||
"\n",
|
||||
"рд╣рд╛рд▓рд╛рдВрдХрд┐ LSTM рд╕реЗрд▓ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдЬрдЯрд┐рд▓ рд▓рдЧ рд╕рдХрддреА рд╣реИ, Keras рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ `LSTM` рд▓реЗрдпрд░ рдХреЗ рдЕрдВрджрд░ рдЫреБрдкрд╛ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд▓реЗрдпрд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"15000/15000 [==============================] - 188s 13ms/step - loss: 0.5692 - acc: 0.7916 - val_loss: 0.3441 - val_acc: 0.8870\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<tensorflow.python.keras.callbacks.History at 0x7f3d6af5c350>"
|
||||
]
|
||||
},
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"model = keras.models.Sequential([\n",
|
||||
" vectorizer,\n",
|
||||
" keras.layers.Embedding(vocab_size, embed_size),\n",
|
||||
" keras.layers.LSTM(8),\n",
|
||||
" keras.layers.Dense(4,activation='softmax')\n",
|
||||
"])\n",
|
||||
"\n",
|
||||
"model.compile(loss='sparse_categorical_crossentropy',metrics=['acc'], optimizer='adam')\n",
|
||||
"model.fit(ds_train.map(tupelize).batch(8),validation_data=ds_test.map(tupelize).batch(8))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рджреНрд╡рд┐рджрд┐рд╢ рдФрд░ рдмрд╣реБрд╕реНрддрд░реАрдп RNNs\n",
|
||||
"\n",
|
||||
"рдЕрдм рддрдХ рдХреЗ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рдкреБрдирд░рд╛рд╡рд░реНрддреА рдиреЗрдЯрд╡рд░реНрдХ рдПрдХ рдЕрдиреБрдХреНрд░рдо рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдЕрдВрдд рддрдХ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╣рдореЗрдВ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд▓рдЧрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрд╕реА рджрд┐рд╢рд╛ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдкрдврд╝рддреЗ рд╣реИрдВ рдпрд╛ рднрд╛рд╖рдг рд╕реБрдирддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрди рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдВ рдЗрдирдкреБрдЯ рдЕрдиреБрдХреНрд░рдо рдХрд╛ рд░реИрдВрдбрдо рдПрдХреНрд╕реЗрд╕ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рджреЛрдиреЛрдВ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдЧрдгрдирд╛ рдЪрд▓рд╛рдирд╛ рдЕрдзрд┐рдХ рд╕рдордЭрджрд╛рд░реА рднрд░рд╛ рд╣реЛрддрд╛ рд╣реИред рдРрд╕реЗ RNNs рдЬреЛ рджреЛрдиреЛрдВ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рдЧрдгрдирд╛ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ **рджреНрд╡рд┐рджрд┐рд╢** RNNs рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрдиреНрд╣реЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ `Bidirectional` рд▓реЗрдпрд░ рдХреЗ рд╕рд╛рде рдкреБрдирд░рд╛рд╡рд░реНрддреА рд▓реЗрдпрд░ рдХреЛ рд▓рдкреЗрдЯрдХрд░ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"> **Note**: `Bidirectional` рд▓реЗрдпрд░ рдЕрдкрдиреА рднреАрддрд░ рдХреА рд▓реЗрдпрд░ рдХреА рджреЛ рдкреНрд░рддрд┐рдпрд╛рдВ рдмрдирд╛рддреА рд╣реИ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдХреА `go_backwards` рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ `True` рд╕реЗрдЯ рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╡рд╣ рдЕрдиреБрдХреНрд░рдо рдХреЗ рд╕рд╛рде рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВ рдЬрд╛рддреА рд╣реИред\n",
|
||||
"\n",
|
||||
"рдкреБрдирд░рд╛рд╡рд░реНрддреА рдиреЗрдЯрд╡рд░реНрдХ, рдЪрд╛рд╣реЗ рдПрдХ рджрд┐рд╢рд╛ рдореЗрдВ рд╣реЛ рдпрд╛ рджреНрд╡рд┐рджрд┐рд╢, рдЕрдиреБрдХреНрд░рдо рдХреЗ рднреАрддрд░ рдкреИрдЯрд░реНрди рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрдЯреЗрдЯ рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рдЬреИрд╕реЗ рдХрд┐ рдХрдиреНрд╡реЛрд▓реНрдпреВрд╢рдирд▓ рдиреЗрдЯрд╡рд░реНрдХреНрд╕ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рд╣рдо рдкрд╣рд▓реЗ рд▓реЗрдпрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рдХрд╛рд▓реЗ рдЧрдП рдирд┐рдореНрди рд╕реНрддрд░ рдХреЗ рдкреИрдЯрд░реНрди рд╕реЗ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдХреЗ рдкреИрдЯрд░реНрди рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд▓реЗрдпрд░ рдХреЗ рдмрд╛рдж рдПрдХ рдФрд░ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд▓реЗрдпрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╣рдореЗрдВ **рдмрд╣реБрд╕реНрддрд░реАрдп RNN** рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рддрдХ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рджреЛ рдпрд╛ рдЕрдзрд┐рдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдиреЗрдЯрд╡рд░реНрдХ рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдкрд┐рдЫрд▓реЗ рд▓реЗрдпрд░ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдЕрдЧрд▓реЗ рд▓реЗрдпрд░ рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"*рдлрд░реНрдирд╛рдВрдбреЛ рд▓реЛрдкреЗрдЬрд╝ рджреНрд╡рд╛рд░рд╛ [рдЗрд╕ рд╢рд╛рдирджрд╛рд░ рдкреЛрд╕реНрдЯ](https://towardsdatascience.com/from-a-lstm-cell-to-a-multilayer-lstm-network-with-pytorch-2899eb5696f3) рд╕реЗ рд▓реА рдЧрдИ рддрд╕реНрд╡реАрд░ред*\n",
|
||||
"\n",
|
||||
"Keras рдЗрди рдиреЗрдЯрд╡рд░реНрдХреНрд╕ рдХреЛ рдмрдирд╛рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдмрд╕ рдореЙрдбрд▓ рдореЗрдВ рдЕрдзрд┐рдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд▓реЗрдпрд░ рдЬреЛрдбрд╝рдиреА рд╣реЛрддреА рд╣реИред рдЕрдВрддрд┐рдо рд▓реЗрдпрд░ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рднреА рд▓реЗрдпрд░ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ `return_sequences=True` рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рд▓реЗрдпрд░ рд╕реЗ рд╕рднреА рдордзреНрдпрд╡рд░реНрддреА рд╕реНрдЯреЗрдЯреНрд╕ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рдХреЗрд╡рд▓ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдЧрдгрдирд╛ рдХреА рдЕрдВрддрд┐рдо рд╕реНрдЯреЗрдЯред\n",
|
||||
"\n",
|
||||
"рдЖрдЗрдП рд╣рдорд╛рд░реЗ рд╡рд░реНрдЧреАрдХрд░рдг рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рджреЛ-рд▓реЗрдпрд░ рджреНрд╡рд┐рджрд┐рд╢ LSTM рдмрдирд╛рддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"> **Note** рдпрд╣ рдХреЛрдб рдлрд┐рд░ рд╕реЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдореЗрдВ рдХрд╛рдлреА рд╕рдордп рд▓реЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдореЗрдВ рдЕрдм рддрдХ рджреЗрдЦреА рдЧрдИ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдЯреАрдХрддрд╛ рджреЗрддрд╛ рд╣реИред рддреЛ рд╢рд╛рдпрдж рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦрдирд╛ рдЙрдЪрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"5044/7500 [===================>..........] - ETA: 2:33 - loss: 0.3709 - acc: 0.8706\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r5045/7500 [===================>..........] - ETA: 2:33 - loss: 0.3709 - acc: 0.8706"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"model = keras.models.Sequential([\n",
|
||||
" vectorizer,\n",
|
||||
" keras.layers.Embedding(vocab_size, 128, mask_zero=True),\n",
|
||||
" keras.layers.Bidirectional(keras.layers.LSTM(64,return_sequences=True)),\n",
|
||||
" keras.layers.Bidirectional(keras.layers.LSTM(64)), \n",
|
||||
" keras.layers.Dense(4,activation='softmax')\n",
|
||||
"])\n",
|
||||
"\n",
|
||||
"model.compile(loss='sparse_categorical_crossentropy',metrics=['acc'], optimizer='adam')\n",
|
||||
"model.fit(ds_train.map(tupelize).batch(batch_size),\n",
|
||||
" validation_data=ds_test.map(tupelize).batch(batch_size))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП RNNs\n",
|
||||
"\n",
|
||||
"рдЕрдм рддрдХ, рд╣рдордиреЗ RNNs рдХрд╛ рдЙрдкрдпреЛрдЧ рдЯреЗрдХреНрд╕реНрдЯ рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЛ рд╡рд░реНрдЧреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╡реЗ рдФрд░ рднреА рдХрдИ рдХрд╛рд░реНрдп рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдЯреЗрдХреНрд╕реНрдЯ рдЬрдирд░реЗрд╢рди рдФрд░ рдорд╢реАрди рдЯреНрд░рд╛рдВрд╕рд▓реЗрд╢рди тАФ рд╣рдо рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдЕрдЧрд▓реЗ рдпреВрдирд┐рдЯ рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**рдЕрд╕реНрд╡реАрдХрд░рдг**: \nрдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ AI рдЕрдиреБрд╡рд╛рдж рд╕реЗрд╡рд╛ [Co-op Translator](https://github.com/Azure/co-op-translator) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрдмрдХрд┐ рд╣рдо рд╕рдЯреАрдХрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрдиреБрд╡рд╛рдж рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдпрд╛ рдЕрд╢реБрджреНрдзрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдореВрд▓ рднрд╛рд╖рд╛ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдореВрд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рд╕реНрд░реЛрдд рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдкреЗрд╢реЗрд╡рд░ рдорд╛рдирд╡ рдЕрдиреБрд╡рд╛рдж рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред рдЗрд╕ рдЕрдиреБрд╡рд╛рдж рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд┐рд╕реА рднреА рдЧрд▓рддрдлрд╣рдореА рдпрд╛ рдЧрд▓рдд рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╣рдо рдЬрд┐рдореНрдореЗрджрд╛рд░ рдирд╣реАрдВ рд╣реИрдВред\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernel_info": {
|
||||
"name": "conda-env-py37_tensorflow-py"
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "py37_tensorflow",
|
||||
"language": "python",
|
||||
"name": "conda-env-py37_tensorflow-py"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.9"
|
||||
},
|
||||
"nteract": {
|
||||
"version": "nteract-front-end@1.0.0"
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "81351e61f619b432ff51010a4f993194",
|
||||
"translation_date": "2025-08-31T15:22:33+00:00",
|
||||
"source_file": "lessons/5-NLP/16-RNN/RNNTF.ipynb",
|
||||
"language_code": "hi"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 4
|
||||
}
|
||||
|
|
@ -0,0 +1,414 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# рдЬрдирд░реЗрдЯрд┐рд╡ рдиреЗрдЯрд╡рд░реНрдХреНрд╕\n",
|
||||
"\n",
|
||||
"рд░рд┐рдХрд░реЗрдВрдЯ рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХреНрд╕ (RNNs) рдФрд░ рдЙрдирдХреЗ рдЧреЗрдЯреЗрдб рд╕реЗрд▓ рд╡реЗрд░рд┐рдПрдВрдЯреНрд╕ рдЬреИрд╕реЗ рд▓реЙрдиреНрдЧ рд╢реЙрд░реНрдЯ рдЯрд░реНрдо рдореЗрдореЛрд░реА рд╕реЗрд▓реНрд╕ (LSTMs) рдФрд░ рдЧреЗрдЯреЗрдб рд░рд┐рдХрд╛рд░реЗрдВрдЯ рдпреВрдирд┐рдЯреНрд╕ (GRUs) рдиреЗ рднрд╛рд╖рд╛ рдореЙрдбрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛, рдпрд╛рдиреА рд╡реЗ рд╢рдмреНрджреЛрдВ рдХреЗ рдХреНрд░рдо рдХреЛ рд╕реАрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдЕрдЧрд▓реЗ рд╢рдмреНрдж рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╣рдореЗрдВ RNNs рдХрд╛ рдЙрдкрдпреЛрдЧ **рдЬрдирд░реЗрдЯрд┐рд╡ рдХрд╛рд░реНрдпреЛрдВ** рдХреЗ рд▓рд┐рдП рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рд╕рд╛рдзрд╛рд░рдг рдЯреЗрдХреНрд╕реНрдЯ рдЬрдирд░реЗрд╢рди, рдорд╢реАрди рдЯреНрд░рд╛рдВрд╕рд▓реЗрд╢рди, рдФрд░ рдпрд╣рд╛рдВ рддрдХ рдХрд┐ рдЗрдореЗрдЬ рдХреИрдкреНрд╢рдирд┐рдВрдЧред\n",
|
||||
"\n",
|
||||
"рдкрд┐рдЫрд▓реА рдпреВрдирд┐рдЯ рдореЗрдВ рд╣рдордиреЗ рдЬрд┐рд╕ RNN рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдереА, рдЙрд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ RNN рдпреВрдирд┐рдЯ рдиреЗ рдЕрдЧрд▓реЗ рд╣рд┐рдбрди рд╕реНрдЯреЗрдЯ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд░рд┐рдХрд╛рд░реЗрдВрдЯ рдпреВрдирд┐рдЯ рдореЗрдВ рдПрдХ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ рдПрдХ **рдЕрдиреБрдХреНрд░рдо** рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ (рдЬреЛ рдореВрд▓ рдЕрдиреБрдХреНрд░рдо рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдРрд╕реЗ RNN рдпреВрдирд┐рдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдореЗрдВ рдЗрдирдкреБрдЯ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддреЗ, рдмрд▓реНрдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдЯреЗрдЯ рд╡реЗрдХреНрдЯрд░ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рдПрдХ рдЕрдиреБрдХреНрд░рдо рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"рдЗрд╕ рдиреЛрдЯрдмреБрдХ рдореЗрдВ, рд╣рдо рд╕рд░рд▓ рдЬрдирд░реЗрдЯрд┐рд╡ рдореЙрдбрд▓реЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ рдЬреЛ рд╣рдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯ рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВред рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП, рдЪрд▓рд┐рдП **рдХреИрд░реЗрдХреНрдЯрд░-рд▓реЗрд╡рд▓ рдиреЗрдЯрд╡рд░реНрдХ** рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдЕрдХреНрд╖рд░ рджрд░ рдЕрдХреНрд╖рд░ рдЯреЗрдХреНрд╕реНрдЯ рдЬрдирд░реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди, рд╣рдореЗрдВ рдХреБрдЫ рдЯреЗрдХреНрд╕реНрдЯ рдХреЙрд░реНрдкрд╕ рд▓реЗрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдЕрдХреНрд╖рд░ рдЕрдиреБрдХреНрд░рдореЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Loading dataset...\n",
|
||||
"Building vocab...\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import torch\n",
|
||||
"import torchtext\n",
|
||||
"import numpy as np\n",
|
||||
"from torchnlp import *\n",
|
||||
"train_dataset,test_dataset,classes,vocab = load_dataset()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рд╡рд░реНрдгрдорд╛рд▓рд╛ рд╢рдмреНрджрд╛рд╡рд▓реА рдмрдирд╛рдирд╛\n",
|
||||
"\n",
|
||||
"рд╡рд░реНрдг-рд╕реНрддрд░реАрдп рдЬрдирд░реЗрдЯрд┐рд╡ рдиреЗрдЯрд╡рд░реНрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рд╢рдмреНрджреЛрдВ рдХреЗ рдмрдЬрд╛рдп рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЕрдХреНрд╖рд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдЯреЛрдХрдирд╛рдЗрдЬрд╝рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Vocabulary size = 82\n",
|
||||
"Encoding of 'a' is 1\n",
|
||||
"Character with code 13 is c\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def char_tokenizer(words):\n",
|
||||
" return list(words) #[word for word in words]\n",
|
||||
"\n",
|
||||
"counter = collections.Counter()\n",
|
||||
"for (label, line) in train_dataset:\n",
|
||||
" counter.update(char_tokenizer(line))\n",
|
||||
"vocab = torchtext.vocab.vocab(counter)\n",
|
||||
"\n",
|
||||
"vocab_size = len(vocab)\n",
|
||||
"print(f\"Vocabulary size = {vocab_size}\")\n",
|
||||
"print(f\"Encoding of 'a' is {vocab.get_stoi()['a']}\")\n",
|
||||
"print(f\"Character with code 13 is {vocab.get_itos()[13]}\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рд╕реЗ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдХреИрд╕реЗ рдПрдиреНрдХреЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"tensor([ 0, 1, 2, 2, 3, 4, 5, 6, 3, 7, 8, 1, 9, 10, 3, 11, 2, 1,\n",
|
||||
" 12, 3, 7, 1, 13, 14, 3, 15, 16, 5, 17, 3, 5, 18, 8, 3, 7, 2,\n",
|
||||
" 1, 13, 14, 3, 19, 20, 8, 21, 5, 8, 9, 10, 22, 3, 20, 8, 21, 5,\n",
|
||||
" 8, 9, 10, 3, 23, 3, 4, 18, 17, 9, 5, 23, 10, 8, 2, 2, 8, 9,\n",
|
||||
" 10, 24, 3, 0, 1, 2, 2, 3, 4, 5, 9, 8, 8, 5, 25, 10, 3, 26,\n",
|
||||
" 12, 27, 16, 26, 2, 27, 16, 28, 29, 30, 1, 16, 26, 3, 17, 31, 3, 21,\n",
|
||||
" 2, 5, 9, 1, 23, 13, 32, 16, 27, 13, 10, 24, 3, 1, 9, 8, 3, 10,\n",
|
||||
" 8, 8, 27, 16, 28, 3, 28, 9, 8, 8, 16, 3, 1, 28, 1, 27, 16, 6])"
|
||||
]
|
||||
},
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def enc(x):\n",
|
||||
" return torch.LongTensor(encode(x,voc=vocab,tokenizer=char_tokenizer))\n",
|
||||
"\n",
|
||||
"enc(train_dataset[0][1])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рдЬрдирд░реЗрдЯрд┐рд╡ RNN рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдирд╛\n",
|
||||
"\n",
|
||||
"рд╣рдо RNN рдХреЛ рдЯреЗрдХреНрд╕реНрдЯ рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗред рд╣рд░ рдЪрд░рдг рдореЗрдВ, рд╣рдо `nchars` рд▓рдВрдмрд╛рдИ рдХреЗ рдЕрдХреНрд╖рд░реЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд▓реЗрдВрдЧреЗ рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЗрдирдкреБрдЯ рдЕрдХреНрд╖рд░ рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓рд╛ рдЖрдЙрдЯрдкреБрдЯ рдЕрдХреНрд╖рд░ рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдВрдЧреЗ:\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдЕрдХреНрд╖рд░реЛрдВ рдХреЛ рднреА рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ *end-of-sequence* `<eos>`ред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдЕрдВрддрд╣реАрди рдЯреЗрдХреНрд╕реНрдЯ рдЬрдирд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдЖрдХрд╛рд░ `nchars` рдЯреЛрдХрди рдХреЗ рдмрд░рд╛рдмрд░ рддрдп рдХрд░реЗрдВрдЧреЗред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЙрджрд╛рд╣рд░рдг рдореЗрдВ `nchars` рдЗрдирдкреБрдЯ рдФрд░ `nchars` рдЖрдЙрдЯрдкреБрдЯ рд╣реЛрдВрдЧреЗ (рдЬреЛ рдЗрдирдкреБрдЯ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдПрдХ рдкреНрд░рддреАрдХ рдмрд╛рдИрдВ рдУрд░ рд╢рд┐рдлреНрдЯ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ)ред рдорд┐рдиреАрдмреИрдЪ рдореЗрдВ рдРрд╕реА рдХрдИ рд╢реНрд░реГрдВрдЦрд▓рд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреАред\n",
|
||||
"\n",
|
||||
"рд╣рдо рдорд┐рдиреАрдмреИрдЪ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЬрдирд░реЗрдЯ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕рдорд╛рдЪрд╛рд░ рдЯреЗрдХреНрд╕реНрдЯ рдЬрд┐рд╕рдХреА рд▓рдВрдмрд╛рдИ `l` рд╣реИ, рд╕реЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдЗрдирдкреБрдЯ-рдЖрдЙрдЯрдкреБрдЯ рд╕рдВрдпреЛрдЬрди рдмрдирд╛рдПрдВрдЧреЗ (рдРрд╕реЗ `l-nchars` рд╕рдВрдпреЛрдЬрди рд╣реЛрдВрдЧреЗ)ред рдпреЗ рдПрдХ рдорд┐рдиреАрдмреИрдЪ рдмрдирд╛рдПрдВрдЧреЗ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЪрд░рдг рдореЗрдВ рдорд┐рдиреАрдмреИрдЪ рдХрд╛ рдЖрдХрд╛рд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрдЧрд╛ред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(tensor([[ 0, 1, 2, ..., 28, 29, 30],\n",
|
||||
" [ 1, 2, 2, ..., 29, 30, 1],\n",
|
||||
" [ 2, 2, 3, ..., 30, 1, 16],\n",
|
||||
" ...,\n",
|
||||
" [20, 8, 21, ..., 1, 28, 1],\n",
|
||||
" [ 8, 21, 5, ..., 28, 1, 27],\n",
|
||||
" [21, 5, 8, ..., 1, 27, 16]]),\n",
|
||||
" tensor([[ 1, 2, 2, ..., 29, 30, 1],\n",
|
||||
" [ 2, 2, 3, ..., 30, 1, 16],\n",
|
||||
" [ 2, 3, 4, ..., 1, 16, 26],\n",
|
||||
" ...,\n",
|
||||
" [ 8, 21, 5, ..., 28, 1, 27],\n",
|
||||
" [21, 5, 8, ..., 1, 27, 16],\n",
|
||||
" [ 5, 8, 9, ..., 27, 16, 6]]))"
|
||||
]
|
||||
},
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"nchars = 100\n",
|
||||
"\n",
|
||||
"def get_batch(s,nchars=nchars):\n",
|
||||
" ins = torch.zeros(len(s)-nchars,nchars,dtype=torch.long,device=device)\n",
|
||||
" outs = torch.zeros(len(s)-nchars,nchars,dtype=torch.long,device=device)\n",
|
||||
" for i in range(len(s)-nchars):\n",
|
||||
" ins[i] = enc(s[i:i+nchars])\n",
|
||||
" outs[i] = enc(s[i+1:i+nchars+1])\n",
|
||||
" return ins,outs\n",
|
||||
"\n",
|
||||
"get_batch(train_dataset[0][1])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдЕрдм рд╣рдо рдЬрдирд░реЗрдЯрд░ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдХрд┐рд╕реА рднреА рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╕реЗрд▓ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд┐рдЫрд▓реЗ рдпреВрдирд┐рдЯ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдереА (рд╕рд┐рдВрдкрд▓, LSTM рдпрд╛ GRU)ред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо LSTM рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред\n",
|
||||
"\n",
|
||||
"рдЪреВрдВрдХрд┐ рдиреЗрдЯрд╡рд░реНрдХ рдЕрдХреНрд╖рд░реЛрдВ рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рд╢рдмреНрджрд╛рд╡рд▓реА рдХрд╛ рдЖрдХрд╛рд░ рдХрд╛рдлреА рдЫреЛрдЯрд╛ рд╣реИ, рд╣рдореЗрдВ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд▓реЗрдпрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╡рди-рд╣реЙрдЯ-рдПрдирдХреЛрдбреЗрдб рдЗрдирдкреБрдЯ рд╕реАрдзреЗ LSTM рд╕реЗрд▓ рдореЗрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЕрдХреНрд╖рд░реЛрдВ рдХреЗ рдирдВрдмрд░ рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ LSTM рдореЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╡рди-рд╣реЙрдЯ-рдПрдирдХреЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ `forward` рдкрд╛рд╕ рдХреЗ рджреМрд░рд╛рди `one_hot` рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЙрдЯрдкреБрдЯ рдПрдирдХреЛрдбрд░ рдПрдХ рд▓реАрдирд┐рдпрд░ рд▓реЗрдпрд░ рд╣реЛрдЧрд╛ рдЬреЛ рд╣рд┐рдбрди рд╕реНрдЯреЗрдЯ рдХреЛ рд╡рди-рд╣реЙрдЯ-рдПрдирдХреЛрдбреЗрдб рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдмрджрд▓ рджреЗрдЧрд╛ред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class LSTMGenerator(torch.nn.Module):\n",
|
||||
" def __init__(self, vocab_size, hidden_dim):\n",
|
||||
" super().__init__()\n",
|
||||
" self.rnn = torch.nn.LSTM(vocab_size,hidden_dim,batch_first=True)\n",
|
||||
" self.fc = torch.nn.Linear(hidden_dim, vocab_size)\n",
|
||||
"\n",
|
||||
" def forward(self, x, s=None):\n",
|
||||
" x = torch.nn.functional.one_hot(x,vocab_size).to(torch.float32)\n",
|
||||
" x,s = self.rnn(x,s)\n",
|
||||
" return self.fc(x),s"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди, рд╣рдо рдЙрддреНрдкрдиреНрди рдХрд┐рдП рдЧрдП рдЯреЗрдХреНрд╕реНрдЯ рдХрд╛ рдирдореВрдирд╛ рд▓реЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо `generate` рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ `start` рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реБрдП, рд▓рдВрдмрд╛рдИ `size` рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ред\n",
|
||||
"\n",
|
||||
"рдЗрд╕рдХрд╛ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдкреВрд░реА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдерд┐рддрд┐ `s` рдФрд░ рдЕрдЧрд▓рд╛ рдЕрдиреБрдорд╛рдирд┐рдд рдЕрдХреНрд╖рд░ `out` рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред рдЪреВрдВрдХрд┐ `out` рд╡рди-рд╣реЙрдЯ рдПрдиреНрдХреЛрдбреЗрдб рд╣реЛрддрд╛ рд╣реИ, рд╣рдо `argmax` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ рдЕрдХреНрд╖рд░ `nc` рдХрд╛ рдЗрдВрдбреЗрдХреНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ, рдФрд░ `itos` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдХреНрд╖рд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рдЕрдХреНрд╖рд░реЛрдВ рдХреА рдкрд░рд┐рдгрд╛рдореА рд╕реВрдЪреА `chars` рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдПрдХ рдЕрдХреНрд╖рд░ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `size` рдмрд╛рд░ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЕрдХреНрд╖рд░ рдЙрддреНрдкрдиреНрди рдХрд┐рдП рдЬрд╛ рд╕рдХреЗрдВред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def generate(net,size=100,start='today '):\n",
|
||||
" chars = list(start)\n",
|
||||
" out, s = net(enc(chars).view(1,-1).to(device))\n",
|
||||
" for i in range(size):\n",
|
||||
" nc = torch.argmax(out[0][-1])\n",
|
||||
" chars.append(vocab.get_itos()[nc])\n",
|
||||
" out, s = net(nc.view(1,-1),s)\n",
|
||||
" return ''.join(chars)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдЕрдм рдЪрд▓рд┐рдП рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ! рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд▓реВрдк рд▓рдЧрднрдЧ рд╣рдорд╛рд░реЗ рд╕рднреА рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдЬреИрд╕рд╛ рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдЯреАрдХрддрд╛ (accuracy) рдХреЗ рдмрдЬрд╛рдп рд╣рдо рд╣рд░ 1000 epochs рдкрд░ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдирдореВрдирд╛ рдЯреЗрдХреНрд╕реНрдЯ рдкреНрд░рд┐рдВрдЯ рдХрд░рддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"рд╡рд┐рд╢реЗрд╖ рдзреНрдпрд╛рди рдЙрд╕ рддрд░реАрдХреЗ рдкрд░ рджреЗрдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рд╕реЗ рд╣рдо рд╣рд╛рдирд┐ (loss) рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рд╣рд╛рдирд┐ рдХреА рдЧрдгрдирд╛ рдПрдХ-рд╣реЙрдЯ-рдПрдиреНрдХреЛрдбреЗрдб рдЖрдЙрдЯрдкреБрдЯ `out` рдФрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рдЯреЗрдХреНрд╕реНрдЯ `text_out` (рдЬреЛ рдХрд┐ рдХреИрд░реЗрдХреНрдЯрд░ рдЗрдВрдбреЗрдХреНрд╕ рдХреА рд╕реВрдЪреА рд╣реИ) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд░рдиреА рд╣реЛрдЧреАред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, `cross_entropy` рдлрд╝рдВрдХреНрд╢рди рдЕрдирдиреЙрд░реНрдорд▓рд╛рдЗрдЬрд╝реНрдб рдиреЗрдЯрд╡рд░реНрдХ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ рдХреНрд▓рд╛рд╕ рдирдВрдмрд░ рдХреЛ рджреВрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИред рдпрд╣ рдорд┐рдиреАрдмреИрдЪ рд╕рд╛рдЗрдЬ рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдФрд╕рдд рднреА рдХрд░рддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"рд╣рдо рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЛ `samples_to_train` рд╕реИрдВрдкрд▓реНрд╕ рддрдХ рд╕реАрдорд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдордп рди рд▓рдЧреЗред рд╣рдо рдЖрдкрдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЖрдЬрд╝рдорд╛рдПрдВ, рд╕рдВрднрд╡рддрдГ рдХрдИ epochs рдХреЗ рд▓рд┐рдП (рдРрд╕реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдкрдХреЛ рдЗрд╕ рдХреЛрдб рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рдФрд░ рд▓реВрдк рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛)ред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Current loss = 4.398899078369141\n",
|
||||
"today sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr sr s\n",
|
||||
"Current loss = 2.161320447921753\n",
|
||||
"today and to the tor to to the tor to to the tor to to the tor to to the tor to to the tor to to the tor t\n",
|
||||
"Current loss = 1.6722588539123535\n",
|
||||
"today and the court to the could to the could to the could to the could to the could to the could to the c\n",
|
||||
"Current loss = 2.423795223236084\n",
|
||||
"today and a second to the conternation of the conternation of the conternation of the conternation of the \n",
|
||||
"Current loss = 1.702607274055481\n",
|
||||
"today and the company to the company to the company to the company to the company to the company to the co\n",
|
||||
"Current loss = 1.692358136177063\n",
|
||||
"today and the company to the company to the company to the company to the company to the company to the co\n",
|
||||
"Current loss = 1.9722288846969604\n",
|
||||
"today and the control the control the control the control the control the control the control the control \n",
|
||||
"Current loss = 1.8705692291259766\n",
|
||||
"today and the second to the second to the second to the second to the second to the second to the second t\n",
|
||||
"Current loss = 1.7626899480819702\n",
|
||||
"today and a security and a security and a security and a security and a security and a security and a secu\n",
|
||||
"Current loss = 1.5574463605880737\n",
|
||||
"today and the company and the company and the company and the company and the company and the company and \n",
|
||||
"Current loss = 1.5620026588439941\n",
|
||||
"today and the be that the be the be that the be the be that the be the be that the be the be that the be t\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"net = LSTMGenerator(vocab_size,64).to(device)\n",
|
||||
"\n",
|
||||
"samples_to_train = 10000\n",
|
||||
"optimizer = torch.optim.Adam(net.parameters(),0.01)\n",
|
||||
"loss_fn = torch.nn.CrossEntropyLoss()\n",
|
||||
"net.train()\n",
|
||||
"for i,x in enumerate(train_dataset):\n",
|
||||
" # x[0] is class label, x[1] is text\n",
|
||||
" if len(x[1])-nchars<10:\n",
|
||||
" continue\n",
|
||||
" samples_to_train-=1\n",
|
||||
" if not samples_to_train: break\n",
|
||||
" text_in, text_out = get_batch(x[1])\n",
|
||||
" optimizer.zero_grad()\n",
|
||||
" out,s = net(text_in)\n",
|
||||
" loss = torch.nn.functional.cross_entropy(out.view(-1,vocab_size),text_out.flatten()) #cross_entropy(out,labels)\n",
|
||||
" loss.backward()\n",
|
||||
" optimizer.step()\n",
|
||||
" if i%1000==0:\n",
|
||||
" print(f\"Current loss = {loss.item()}\")\n",
|
||||
" print(generate(net))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рдЯреЗрдХреНрд╕реНрдЯ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ рдФрд░ рдмреЗрд╣рддрд░ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:\n",
|
||||
"\n",
|
||||
"* **рдмреЗрд╣рддрд░ рдорд┐рдиреАрдмреИрдЪ рдЬрдирд░реЗрд╢рди**ред рдЬрд┐рд╕ рддрд░реАрдХреЗ рд╕реЗ рд╣рдордиреЗ рдЯреНрд░реЗрдирд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛, рд╡рд╣ рдерд╛ рдПрдХ рд╕реИрдВрдкрд▓ рд╕реЗ рдПрдХ рдорд┐рдиреАрдмреИрдЪ рдмрдирд╛рдирд╛ред рдпрд╣ рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдорд┐рдиреАрдмреИрдЪ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЖрдХрд╛рд░ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдХреБрдЫ рддреЛ рдмрдирд╛рдП рднреА рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЯреЗрдХреНрд╕реНрдЯ `nchars` рд╕реЗ рдЫреЛрдЯрд╛ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЫреЛрдЯреЗ рдорд┐рдиреАрдмреИрдЪ GPU рдХреЛ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рд▓реЛрдб рдирд╣реАрдВ рдХрд░рддреЗред рдпрд╣ рдЕрдзрд┐рдХ рд╕рдордЭрджрд╛рд░реА рд╣реЛрдЧреА рдХрд┐ рд╕рднреА рд╕реИрдВрдкрд▓ рд╕реЗ рдПрдХ рдмрдбрд╝рд╛ рдЯреЗрдХреНрд╕реНрдЯ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд▓рд┐рдпрд╛ рдЬрд╛рдП, рдлрд┐рд░ рд╕рднреА рдЗрдирдкреБрдЯ-рдЖрдЙрдЯрдкреБрдЯ рдЬреЛрдбрд╝реЗ рдмрдирд╛рдП рдЬрд╛рдПрдВ, рдЙрдиреНрд╣реЗрдВ рд╢рдлрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдФрд░ рд╕рдорд╛рди рдЖрдХрд╛рд░ рдХреЗ рдорд┐рдиреАрдмреИрдЪ рдмрдирд╛рдП рдЬрд╛рдПрдВред\n",
|
||||
"\n",
|
||||
"* **рдорд▓реНрдЯреАрд▓рд╛рдпрд░ LSTM**ред 2 рдпрд╛ 3 рд▓реЗрдпрд░ рдХреЗ LSTM рд╕реЗрд▓реНрд╕ рдХреЛ рдЖрдЬрд╝рдорд╛рдирд╛ рд╕рдордЭрджрд╛рд░реА рд╣реЛрдЧреАред рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд┐рдЫрд▓реЗ рдпреВрдирд┐рдЯ рдореЗрдВ рдмрддрд╛рдпрд╛ рдерд╛, LSTM рдХреА рдкреНрд░рддреНрдпреЗрдХ рд▓реЗрдпрд░ рдЯреЗрдХреНрд╕реНрдЯ рд╕реЗ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдкреИрдЯрд░реНрди рдирд┐рдХрд╛рд▓рддреА рд╣реИ, рдФрд░ рдХреИрд░реЗрдХреНрдЯрд░-рд▓реЗрд╡рд▓ рдЬрдирд░реЗрдЯрд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдирд┐рдЪрд▓реА LSTM рд▓реЗрдпрд░ рдЕрдХреНрд╖рд░реЛрдВ рдХреЗ рд╕рдореВрд╣ (syllables) рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧреА, рдФрд░ рдКрдкрд░реА рд▓реЗрдпрд░ рд╢рдмреНрджреЛрдВ рдФрд░ рд╢рдмреНрдж рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдПред рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ LSTM рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд▓реЗрдпрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"* рдЖрдк **GRU рдпреВрдирд┐рдЯреНрд╕** рдХреЗ рд╕рд╛рде рднреА рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕реЗ рдмреЗрд╣рддрд░ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ **рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣рд┐рдбрди рд▓реЗрдпрд░ рд╕рд╛рдЗрдЬ** рдХреЗ рд╕рд╛рде рднреАред рдмрд╣реБрдд рдмрдбрд╝реА рд╣рд┐рдбрди рд▓реЗрдпрд░ рдУрд╡рд░рдлрд┐рдЯрд┐рдВрдЧ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддреА рд╣реИ (рдЬреИрд╕реЗ рдХрд┐ рдиреЗрдЯрд╡рд░реНрдХ рд╕рдЯреАрдХ рдЯреЗрдХреНрд╕реНрдЯ рд╕реАрдЦ рд▓реЗрдЧрд╛), рдФрд░ рдЫреЛрдЯреА рд╕рд╛рдЗрдЬ рдЕрдЪреНрдЫреЗ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рджреЗ рд╕рдХрддреАред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рд╕реЙрдлреНрдЯ рдЯреЗрдХреНрд╕реНрдЯ рдЬрдирд░реЗрд╢рди рдФрд░ рдЯреЗрдореНрдкрд░реЗрдЪрд░\n",
|
||||
"\n",
|
||||
"`generate` рдХреА рдкрд┐рдЫрд▓реА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ, рд╣рдо рд╣рдореЗрд╢рд╛ рдЙрд╕ рдХреИрд░реЗрдХреНрдЯрд░ рдХреЛ рдЕрдЧрд▓рд╛ рдХреИрд░реЗрдХреНрдЯрд░ рдЪреБрдирддреЗ рдереЗ рдЬрд┐рд╕рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрддреА рдереАред рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдпрд╣ рд╣реЛрддрд╛ рдерд╛ рдХрд┐ рдЯреЗрдХреНрд╕реНрдЯ рдЕрдХреНрд╕рд░ рдмрд╛рд░-рдмрд╛рд░ рдПрдХ рд╣реА рдХреИрд░реЗрдХреНрдЯрд░ рд╕реАрдХреНрд╡реЗрдВрд╕ рдореЗрдВ \"рдЪрдХреНрд░рд┐рдд\" рд╣реЛ рдЬрд╛рддрд╛ рдерд╛, рдЬреИрд╕реЗ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ:\n",
|
||||
"```\n",
|
||||
"today of the second the company and a second the company ...\n",
|
||||
"```\n",
|
||||
"\n",
|
||||
"рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рд╣рдо рдЕрдЧрд▓реЗ рдХреИрд░реЗрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рдирд╛ рд╡рд┐рддрд░рдг рдХреЛ рджреЗрдЦреЗрдВ, рддреЛ рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдЙрдЪреНрдЪрддрдо рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдмрд╣реБрдд рдмрдбрд╝рд╛ рди рд╣реЛ, рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рдХреИрд░реЗрдХреНрдЯрд░ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ 0.2 рд╣реЛ, рдФрд░ рджреВрд╕рд░реЗ рдХреА 0.19ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рд╣рдо '*play*' рд╕реАрдХреНрд╡реЗрдВрд╕ рдореЗрдВ рдЕрдЧрд▓реЗ рдХреИрд░реЗрдХреНрдЯрд░ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реЛрдВ, рддреЛ рдЕрдЧрд▓рд╛ рдХреИрд░реЗрдХреНрдЯрд░ рд╕реНрдкреЗрд╕ рдпрд╛ **e** (рдЬреИрд╕реЗ рд╢рдмреНрдж *player* рдореЗрдВ) рджреЛрдиреЛрдВ рд╣реА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"рдЗрд╕рд╕реЗ рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд▓рддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрд╢рд╛ рдЙрдЪреНрдЪрддрдо рд╕рдВрднрд╛рд╡рдирд╛ рд╡рд╛рд▓реЗ рдХреИрд░реЗрдХреНрдЯрд░ рдХреЛ рдЪреБрдирдирд╛ \"рдиреНрдпрд╛рдпрд╕рдВрдЧрдд\" рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рджреВрд╕рд░реЗ рдЙрдЪреНрдЪрддрдо рдХреЛ рдЪреБрдирдиреЗ рд╕реЗ рднреА рдЕрд░реНрдердкреВрд░реНрдг рдЯреЗрдХреНрд╕реНрдЯ рдмрди рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЕрдзрд┐рдХ рд╕рдордЭрджрд╛рд░реА рд╣реЛрдЧреА рдХрд┐ рдиреЗрдЯрд╡рд░реНрдХ рдЖрдЙрдЯрдкреБрдЯ рджреНрд╡рд╛рд░рд╛ рджреА рдЧрдИ рд╕рдВрднрд╛рд╡рдирд╛ рд╡рд┐рддрд░рдг рд╕реЗ **рд╕реИрдВрдкрд▓** рдХрд░рдХреЗ рдХреИрд░реЗрдХреНрдЯрд░ рдЪреБрдиреЗ рдЬрд╛рдПрдВред\n",
|
||||
"\n",
|
||||
"рдпрд╣ рд╕реИрдВрдкрд▓рд┐рдВрдЧ `multinomial` рдлрдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЬреЛ рддрдерд╛рдХрдерд┐рдд **рдорд▓реНрдЯрд┐рдиреЛрдорд┐рдпрд▓ рд╡рд┐рддрд░рдг** рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдлрдВрдХреНрд╢рди рдЬреЛ рдЗрд╕ **рд╕реЙрдлреНрдЯ** рдЯреЗрдХреНрд╕реНрдЯ рдЬрдирд░реЗрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдиреАрдЪреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"metadata": {
|
||||
"scrolled": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"--- Temperature = 0.3\n",
|
||||
"Today and a company and complete an all the land the restrational the as a security and has provers the pay to and a report and the computer in the stand has filities and working the law the stations for a company and with the company and the final the first company and refight of the state and and workin\n",
|
||||
"\n",
|
||||
"--- Temperature = 0.8\n",
|
||||
"Today he oniis its first to Aus bomblaties the marmation a to manan boogot that pirate assaid a relaid their that goverfin the the Cappets Ecrotional Assonia Cition targets it annight the w scyments Blamity #39;s TVeer Diercheg Reserals fran envyuil that of ster said access what succers of Dour-provelith\n",
|
||||
"\n",
|
||||
"--- Temperature = 1.0\n",
|
||||
"Today holy they a 11 will meda a toket subsuaties, engins for Chanos, they's has stainger past to opening orital his thempting new Nattona was al innerforder advan-than #36;s night year his religuled talitatian what the but with Wednesday to Justment will wemen of Mark CCC Camp as Timed Nae wome a leaders\n",
|
||||
"\n",
|
||||
"--- Temperature = 1.3\n",
|
||||
"Today gpone 2.5 fech atcusion poor cocles toparsdorM.cht Line Pamage put 43 his calt lowed to the book, that has authh-the silia rruch ailing to'ory andhes beutirsimi- Aefffive heading offil an auf eacklets is charged evis, Gunymy oy) Mony has it after-sloythyor loveId out filme, the Natabl -Najuntaxiggs \n",
|
||||
"\n",
|
||||
"--- Temperature = 1.8\n",
|
||||
"Today plary, P.slan chly\\401 mardregationly #39;t 8.1Mide) closes ,filtcon alfly playin roven!\\grea.-QFBEP: Iss onfarchQ/itilia CCf Zivesigntwasta orce.-Peul-aw.uicrin of fuglinfsut aftaningwo, MIEX awayew Aice Woiduar Corvagiugge oppo esig ThusBratourid canthly-RyI.co lagitems\\eexciaishes.conBabntusmor I\n",
|
||||
"\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def generate_soft(net,size=100,start='today ',temperature=1.0):\n",
|
||||
" chars = list(start)\n",
|
||||
" out, s = net(enc(chars).view(1,-1).to(device))\n",
|
||||
" for i in range(size):\n",
|
||||
" #nc = torch.argmax(out[0][-1])\n",
|
||||
" out_dist = out[0][-1].div(temperature).exp()\n",
|
||||
" nc = torch.multinomial(out_dist,1)[0]\n",
|
||||
" chars.append(vocab.get_itos()[nc])\n",
|
||||
" out, s = net(nc.view(1,-1),s)\n",
|
||||
" return ''.join(chars)\n",
|
||||
" \n",
|
||||
"for i in [0.3,0.8,1.0,1.3,1.8]:\n",
|
||||
" print(f\"--- Temperature = {i}\\n{generate_soft(net,size=300,start='Today ',temperature=i)}\\n\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рд╣рдордиреЗ рдПрдХ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ **рддрд╛рдкрдорд╛рди** рдкреЗрд╢ рдХрд┐рдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рд╕рдВрдХреЗрдд рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЙрдЪреНрдЪрддрдо рд╕рдВрднрд╛рд╡рдирд╛ рд╕реЗ рдХрд┐рддрдиреА рджреГрдврд╝рддрд╛ рд╕реЗ рдЪрд┐рдкрдХрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рддрд╛рдкрдорд╛рди 1.0 рд╣реИ, рддреЛ рд╣рдо рдирд┐рд╖реНрдкрдХреНрд╖ рдмрд╣реБрдкрдж рдирдореВрдирд╛ рд▓реЗрддреЗ рд╣реИрдВ, рдФрд░ рдЬрдм рддрд╛рдкрдорд╛рди рдЕрдирдВрдд рддрдХ рдЬрд╛рддрд╛ рд╣реИ - рд╕рднреА рд╕рдВрднрд╛рд╡рдирд╛рдПрдБ рд╕рдорд╛рди рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ, рдФрд░ рд╣рдо рдЕрдЧрд▓рд╛ рд╡рд░реНрдг рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рдЪреБрдирддреЗ рд╣реИрдВред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЬрдм рд╣рдо рддрд╛рдкрдорд╛рди рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ рддреЛ рдкрд╛рда рдЕрд░реНрдерд╣реАрди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЬрдм рдпрд╣ 0 рдХреЗ рдХрд░реАрдм рд╣реЛрддрд╛ рд╣реИ рддреЛ рдпрд╣ \"рдЪрдХреНрд░рд┐рдд\" рдХрдареЛрд░-рдЬрдирд┐рдд рдкрд╛рда рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**рдЕрд╕реНрд╡реАрдХрд░рдг**: \nрдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ AI рдЕрдиреБрд╡рд╛рдж рд╕реЗрд╡рд╛ [Co-op Translator](https://github.com/Azure/co-op-translator) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрдмрдХрд┐ рд╣рдо рд╕рдЯреАрдХрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрдиреБрд╡рд╛рдж рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдпрд╛ рдЕрд╢реБрджреНрдзрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдореВрд▓ рднрд╛рд╖рд╛ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдореВрд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕реНрд░реЛрдд рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдкреЗрд╢реЗрд╡рд░ рдорд╛рдирд╡ рдЕрдиреБрд╡рд╛рдж рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред рдЗрд╕ рдЕрдиреБрд╡рд╛рдж рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд┐рд╕реА рднреА рдЧрд▓рддрдлрд╣рдореА рдпрд╛ рдЧрд▓рдд рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╣рдо рдЬрд┐рдореНрдореЗрджрд╛рд░ рдирд╣реАрдВ рд╣реИрдВред\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"interpreter": {
|
||||
"hash": "16af2a8bbb083ea23e5e41c7f5787656b2ce26968575d8763f2c4b17f9cd711f"
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3.8.12 ('py38')",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.8.12"
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "7673cd150d96c74c6d6011460094efb4",
|
||||
"translation_date": "2025-08-31T15:13:47+00:00",
|
||||
"source_file": "lessons/5-NLP/17-GenerativeNetworks/GenerativePyTorch.ipynb",
|
||||
"language_code": "hi"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 4
|
||||
}
|
||||
|
|
@ -0,0 +1,495 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# рдЬрдирд░реЗрдЯрд┐рд╡ рдиреЗрдЯрд╡рд░реНрдХреНрд╕\n",
|
||||
"\n",
|
||||
"рд░рд┐рдХрд░рдВрдЯ рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХреНрд╕ (RNNs) рдФрд░ рдЙрдирдХреЗ рдЧреЗрдЯреЗрдб рд╕реЗрд▓ рд╡реЗрд░рд┐рдПрдВрдЯреНрд╕ рдЬреИрд╕реЗ рд▓реЙрдиреНрдЧ рд╢реЙрд░реНрдЯ рдЯрд░реНрдо рдореЗрдореЛрд░реА рд╕реЗрд▓реНрд╕ (LSTMs) рдФрд░ рдЧреЗрдЯреЗрдб рд░рд┐рдХрд╛рд░рдВрдЯ рдпреВрдирд┐рдЯреНрд╕ (GRUs) рдиреЗ рднрд╛рд╖рд╛ рдореЙрдбрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рд╣реИ, рдпрд╛рдиреА рд╡реЗ рд╢рдмреНрджреЛрдВ рдХреЗ рдХреНрд░рдо рдХреЛ рд╕реАрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдЕрдЧрд▓реЗ рд╢рдмреНрдж рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╣рдореЗрдВ RNNs рдХрд╛ рдЙрдкрдпреЛрдЧ **рдЬрдирд░реЗрдЯрд┐рд╡ рдХрд╛рд░реНрдпреЛрдВ** рдХреЗ рд▓рд┐рдП рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рд╕рд╛рдзрд╛рд░рдг рдЯреЗрдХреНрд╕реНрдЯ рдЬрдирд░реЗрд╢рди, рдорд╢реАрди рдЯреНрд░рд╛рдВрд╕рд▓реЗрд╢рди, рдФрд░ рдпрд╣рд╛рдВ рддрдХ рдХрд┐ рдЗрдореЗрдЬ рдХреИрдкреНрд╢рдирд┐рдВрдЧред\n",
|
||||
"\n",
|
||||
"рдкрд┐рдЫрд▓реА рдпреВрдирд┐рдЯ рдореЗрдВ рд╣рдордиреЗ рдЬрд┐рд╕ RNN рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдереА, рдЙрд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ RNN рдпреВрдирд┐рдЯ рдиреЗ рдЕрдЧрд▓реЗ рд╣рд┐рдбрди рд╕реНрдЯреЗрдЯ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд░рд┐рдХрд╛рд░рдВрдЯ рдпреВрдирд┐рдЯ рдореЗрдВ рдПрдХ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ рдПрдХ **рдЕрдиреБрдХреНрд░рдо** рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ (рдЬреЛ рдореВрд▓ рдЕрдиреБрдХреНрд░рдо рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдРрд╕реЗ RNN рдпреВрдирд┐рдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдореЗрдВ рдЗрдирдкреБрдЯ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддреЗ, рдмрд▓реНрдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдЯреЗрдЯ рд╡реЗрдХреНрдЯрд░ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рдПрдХ рдЕрдиреБрдХреНрд░рдо рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"рдЗрд╕ рдиреЛрдЯрдмреБрдХ рдореЗрдВ, рд╣рдо рд╕рд░рд▓ рдЬрдирд░реЗрдЯрд┐рд╡ рдореЙрдбрд▓реЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ рдЬреЛ рд╣рдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯ рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВред рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП, рдЪрд▓рд┐рдП рдПрдХ **рдХреИрд░реЗрдХреНрдЯрд░-рд▓реЗрд╡рд▓ рдиреЗрдЯрд╡рд░реНрдХ** рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдЕрдХреНрд╖рд░ рджрд░ рдЕрдХреНрд╖рд░ рдЯреЗрдХреНрд╕реНрдЯ рдЬрдирд░реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди, рд╣рдореЗрдВ рдХреБрдЫ рдЯреЗрдХреНрд╕реНрдЯ рдХреЙрд░реНрдкрд╕ рд▓реЗрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЙрд╕реЗ рдЕрдХреНрд╖рд░ рдЕрдиреБрдХреНрд░рдореЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import tensorflow as tf\n",
|
||||
"from tensorflow import keras\n",
|
||||
"import tensorflow_datasets as tfds\n",
|
||||
"import numpy as np\n",
|
||||
"\n",
|
||||
"ds_train, ds_test = tfds.load('ag_news_subset').values()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рд╡рд░реНрдгрдорд╛рд▓рд╛ рд╢рдмреНрджрд╛рд╡рд▓реА рдмрдирд╛рдирд╛\n",
|
||||
"\n",
|
||||
"рд╡рд░реНрдг-рд╕реНрддрд░реАрдп рдЬрдирд░реЗрдЯрд┐рд╡ рдиреЗрдЯрд╡рд░реНрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рд╢рдмреНрджреЛрдВ рдХреЗ рдмрдЬрд╛рдп рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЕрдХреНрд╖рд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред `TextVectorization` рд▓реЗрдпрд░, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛, рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:\n",
|
||||
"\n",
|
||||
"* рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓реА рд▓реЛрдб рдХрд░реЗрдВ рдФрд░ 'рд╣рд╛рде рд╕реЗ' рдЯреЛрдХрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХрд░реЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ [рдЗрд╕ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ Keras рдЙрджрд╛рд╣рд░рдг](https://keras.io/examples/generative/lstm_character_level_text_generation/) рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред\n",
|
||||
"* рд╡рд░реНрдг-рд╕реНрддрд░реАрдп рдЯреЛрдХрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП `Tokenizer` рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред\n",
|
||||
"\n",
|
||||
"рд╣рдо рджреВрд╕рд░реЗ рд╡рд┐рдХрд▓реНрдк рдХреЛ рдЪреБрдиреЗрдВрдЧреЗред `Tokenizer` рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдЯреЛрдХрдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рдЖрд╕рд╛рдиреА рд╕реЗ рд╡рд░реНрдг-рд╕реНрддрд░реАрдп рд╕реЗ рд╢рдмреНрдж-рд╕реНрддрд░реАрдп рдЯреЛрдХрдирд╛рдЗрдЬрд╝реЗрд╢рди рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"рд╡рд░реНрдг-рд╕реНрддрд░реАрдп рдЯреЛрдХрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ `char_level=True` рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def extract_text(x):\n",
|
||||
" return x['title']+' '+x['description']\n",
|
||||
"\n",
|
||||
"def tupelize(x):\n",
|
||||
" return (extract_text(x),x['label'])\n",
|
||||
"\n",
|
||||
"tokenizer = keras.preprocessing.text.Tokenizer(char_level=True,lower=False)\n",
|
||||
"tokenizer.fit_on_texts([x['title'].numpy().decode('utf-8') for x in ds_train])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рд╣рдо рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЯреЛрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ **рдЕрдиреБрдХреНрд░рдо рдХреЗ рдЕрдВрдд** рдХреЛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдЬрд┐рд╕реЗ рд╣рдо `<eos>` рдХрд╣реЗрдВрдЧреЗред рдЖрдЗрдП рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"eos_token = len(tokenizer.word_index)+1\n",
|
||||
"tokenizer.word_index['<eos>'] = eos_token\n",
|
||||
"\n",
|
||||
"vocab_size = eos_token + 1"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[[48, 2, 10, 10, 5, 44, 1, 25, 5, 8, 10, 13, 78]]"
|
||||
]
|
||||
},
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"tokenizer.texts_to_sequences(['Hello, world!'])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рд╢реАрд░реНрд╖рдХ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬрдирд░реЗрдЯрд┐рд╡ RNN рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдирд╛\n",
|
||||
"\n",
|
||||
"рд╣рдо RNN рдХреЛ рд╕рдорд╛рдЪрд╛рд░ рд╢реАрд░реНрд╖рдХ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗред рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдореЗрдВ, рд╣рдо рдПрдХ рд╢реАрд░реНрд╖рдХ рд▓реЗрдВрдЧреЗ, рдЬрд┐рд╕реЗ RNN рдореЗрдВ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЗрдирдкреБрдЯ рдЕрдХреНрд╖рд░ рдХреЗ рд▓рд┐рдП рд╣рдо рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдЕрдЧрд▓рд╛ рдЖрдЙрдЯрдкреБрдЯ рдЕрдХреНрд╖рд░ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдВрдЧреЗ:\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"рд╣рдорд╛рд░реЗ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдЕрдВрддрд┐рдо рдЕрдХреНрд╖рд░ рдХреЗ рд▓рд┐рдП, рд╣рдо рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ `<eos>` рдЯреЛрдХрди рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдВрдЧреЗред\n",
|
||||
"\n",
|
||||
"рдпрд╣рд╛рдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдЬрдирд░реЗрдЯрд┐рд╡ RNN рдХрд╛ рдореБрдЦреНрдп рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо RNN рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рд▓реЗрдВрдЧреЗ, рди рдХрд┐ рдХреЗрд╡рд▓ рдЕрдВрддрд┐рдо рд╕реЗрд▓ рд╕реЗред рдЗрд╕реЗ RNN рд╕реЗрд▓ рдореЗрдВ `return_sequences` рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди, рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдЗрдирдкреБрдЯ рдХреБрдЫ рд▓рдВрдмрд╛рдИ рдХреЗ рдПрдиреНрдХреЛрдбреЗрдб рдЕрдХреНрд╖рд░реЛрдВ рдХрд╛ рдЕрдиреБрдХреНрд░рдо рд╣реЛрдЧрд╛, рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдЙрд╕реА рд▓рдВрдмрд╛рдИ рдХрд╛ рдЕрдиреБрдХреНрд░рдо рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдПрдХ рддрддреНрд╡ рджреНрд╡рд╛рд░рд╛ рд╢рд┐рдлреНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ `<eos>` рд╕реЗ рд╕рдорд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдорд┐рдиреАрдмреИрдЪ рдореЗрдВ рдХрдИ рдРрд╕реЗ рдЕрдиреБрдХреНрд░рдо рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ, рдФрд░ рд╣рдореЗрдВ рд╕рднреА рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЛ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП **рдкреИрдбрд┐рдВрдЧ** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред\n",
|
||||
"\n",
|
||||
"рдЖрдЗрдП рдРрд╕реА рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВред рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдорд┐рдиреАрдмреИрдЪ рд╕реНрддрд░ рдкрд░ рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЛ рдкреИрдб рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╣рдо рдкрд╣рд▓реЗ `.batch()` рдХреЙрд▓ рдХрд░рдХреЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЛ рдмреИрдЪ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ `map` рдХрд░реЗрдВрдЧреЗ рддрд╛рдХрд┐ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдЗрд╕рд▓рд┐рдП, рдкрд░рд┐рд╡рд░реНрддрди рдлрд╝рдВрдХреНрд╢рди рдкреВрд░реЗ рдорд┐рдиреАрдмреИрдЪ рдХреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдЧрд╛:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def title_batch(x):\n",
|
||||
" x = [t.numpy().decode('utf-8') for t in x]\n",
|
||||
" z = tokenizer.texts_to_sequences(x)\n",
|
||||
" z = tf.keras.preprocessing.sequence.pad_sequences(z)\n",
|
||||
" return tf.one_hot(z,vocab_size), tf.one_hot(tf.concat([z[:,1:],tf.constant(eos_token,shape=(len(z),1))],axis=1),vocab_size)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рддреЗрдВ рдЬреЛ рд╣рдо рдпрд╣рд╛рдБ рдХрд░рддреЗ рд╣реИрдВ:\n",
|
||||
"* рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╣рдо рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЯреЗрдВрд╕рд░ рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ\n",
|
||||
"* `text_to_sequences` рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреА рд╕реВрдЪреА рдХреЛ рдкреВрд░реНрдгрд╛рдВрдХ рдЯреЗрдВрд╕рд░ рдХреА рд╕реВрдЪреА рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ\n",
|
||||
"* `pad_sequences` рдЙрди рдЯреЗрдВрд╕рд░ рдХреЛ рдЙрдирдХреА рдЕрдзрд┐рдХрддрдо рд▓рдВрдмрд╛рдИ рддрдХ рдкреИрдб рдХрд░рддрд╛ рд╣реИ\n",
|
||||
"* рдЕрдВрдд рдореЗрдВ рд╣рдо рд╕рднреА рдЕрдХреНрд╖рд░реЛрдВ рдХреЛ рд╡рди-рд╣реЙрдЯ рдПрдиреНрдХреЛрдб рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╕рд╛рде рд╣реА рд╢рд┐рдлреНрдЯрд┐рдВрдЧ рдФрд░ `<eos>` рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХрд╛рдо рднреА рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЬрд▓реНрдж рд╣реА рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╣рдореЗрдВ рд╡рди-рд╣реЙрдЯ-рдПрдиреНрдХреЛрдбреЗрдб рдЕрдХреНрд╖рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ\n",
|
||||
"\n",
|
||||
"рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди **Pythonic** рд╣реИ, рдпрд╛рдиреА рдЗрд╕реЗ Tensorflow рдХреЗ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдЧреНрд░рд╛рдл рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрдиреБрд╡рд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ред рдЕрдЧрд░ рд╣рдо рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реАрдзреЗ `Dataset.map` рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ, рддреЛ рд╣рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдорд┐рд▓реЗрдВрдЧреАред рд╣рдореЗрдВ рдЗрд╕ Pythonic рдХреЙрд▓ рдХреЛ `py_function` рд░реИрдкрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрд▓рдЧреНрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def title_batch_fn(x):\n",
|
||||
" x = x['title']\n",
|
||||
" a,b = tf.py_function(title_batch,inp=[x],Tout=(tf.float32,tf.float32))\n",
|
||||
" return a,b"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **Note**: рдкрд╛рдпрдердирд┐рдХ рдФрд░ рдЯреЗрдиреНрд╕рд░рдлреНрд▓реЛ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдореЗрд╢рди рдлрдВрдХреНрд╢рдиреНрд╕ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЖрдк рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХреЛ `fit` рдореЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдорд╛рдирдХ рдкрд╛рдпрдерди рдлрдВрдХреНрд╢рдиреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдмрджрд▓рддреЗред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, `Dataset.map` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рд▓рд╛рдн рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдореЗрд╢рди рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдЯреЗрдиреНрд╕рд░рдлреНрд▓реЛ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдЧреНрд░рд╛рдл рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреА рд╣реИ, рдЬреЛ GPU рдХрдореНрдкреНрдпреВрдЯреЗрд╢рди рдХрд╛ рд▓рд╛рдн рдЙрдард╛рддреА рд╣реИ рдФрд░ CPU/GPU рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдХрдо рдХрд░рддреА рд╣реИред\n",
|
||||
"\n",
|
||||
"рдЕрдм рд╣рдо рдЕрдкрдирд╛ рдЬрдирд░реЗрдЯрд░ рдиреЗрдЯрд╡рд░реНрдХ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╕реЗрд▓ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд┐рдЫрд▓реЗ рдпреВрдирд┐рдЯ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдереА (рд╕рд┐рдВрдкрд▓, LSTM рдпрд╛ GRU)ред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣рдо LSTM рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред\n",
|
||||
"\n",
|
||||
"рдЪреВрдВрдХрд┐ рдиреЗрдЯрд╡рд░реНрдХ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдХреНрд╖рд░реЛрдВ рдХреЛ рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рд╢рдмреНрджрд╛рд╡рд▓реА рдХрд╛ рдЖрдХрд╛рд░ рдХрд╛рдлреА рдЫреЛрдЯрд╛ рд╣реИ, рд╣рдореЗрдВ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд▓реЗрдпрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╡рди-рд╣реЙрдЯ-рдПрдирдХреЛрдбреЗрдб рдЗрдирдкреБрдЯ рд╕реАрдзреЗ LSTM рд╕реЗрд▓ рдореЗрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдЙрдЯрдкреБрдЯ рд▓реЗрдпрд░ рдПрдХ `Dense` рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░ рд╣реЛрдЧреА рдЬреЛ LSTM рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рд╡рди-рд╣реЙрдЯ-рдПрдирдХреЛрдбреЗрдб рдЯреЛрдХрди рдирдВрдмрд░реЛрдВ рдореЗрдВ рдмрджрд▓ рджреЗрдЧреАред\n",
|
||||
"\n",
|
||||
"рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЪреВрдВрдХрд┐ рд╣рдо рд╡реЗрд░рд┐рдПрдмрд▓-рд▓реЗрдВрде рд╕реАрдХреНрд╡реЗрдВрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╣рдо `Masking` рд▓реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдПрдХ рдорд╛рд╕реНрдХ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдЬреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдкреИрдбреЗрдб рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджреЗред рдпрд╣ рд╕рдЦреНрддреА рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо `<eos>` рдЯреЛрдХрди рд╕реЗ рдЖрдЧреЗ рдХреА рдЪреАрдЬреЛрдВ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд░реБрдЪрд┐ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рд▓реЗрдпрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЕрдиреБрднрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред `input_shape` `(None, vocab_size)` рд╣реЛрдЧрд╛, рдЬрд╣рд╛рдВ `None` рд╡реЗрд░рд┐рдПрдмрд▓ рд▓рдВрдмрд╛рдИ рдХреА рд╕реАрдХреНрд╡реЗрдВрд╕ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдЖрдХрд╛рд░ рднреА `(None, vocab_size)` рд╣реЛрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк `summary` рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Model: \"sequential\"\n",
|
||||
"_________________________________________________________________\n",
|
||||
"Layer (type) Output Shape Param # \n",
|
||||
"=================================================================\n",
|
||||
"masking (Masking) (None, None, 84) 0 \n",
|
||||
"_________________________________________________________________\n",
|
||||
"lstm (LSTM) (None, None, 128) 109056 \n",
|
||||
"_________________________________________________________________\n",
|
||||
"dense (Dense) (None, None, 84) 10836 \n",
|
||||
"=================================================================\n",
|
||||
"Total params: 119,892\n",
|
||||
"Trainable params: 119,892\n",
|
||||
"Non-trainable params: 0\n",
|
||||
"_________________________________________________________________\n",
|
||||
"15000/15000 [==============================] - 229s 15ms/step - loss: 1.5385\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<tensorflow.python.keras.callbacks.History at 0x7fa40c1245e0>"
|
||||
]
|
||||
},
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"model = keras.models.Sequential([\n",
|
||||
" keras.layers.Masking(input_shape=(None,vocab_size)),\n",
|
||||
" keras.layers.LSTM(128,return_sequences=True),\n",
|
||||
" keras.layers.Dense(vocab_size,activation='softmax')\n",
|
||||
"])\n",
|
||||
"\n",
|
||||
"model.summary()\n",
|
||||
"model.compile(loss='categorical_crossentropy')\n",
|
||||
"\n",
|
||||
"model.fit(ds_train.batch(8).map(title_batch_fn))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рдЖрдЙрдЯрдкреБрдЯ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛\n",
|
||||
"\n",
|
||||
"рдЕрдм рдЬрдм рд╣рдордиреЗ рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдХреБрдЫ рдЖрдЙрдЯрдкреБрдЯ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдЯреЛрдХрди рдирдВрдмрд░реЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдП рдЧрдП рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдбрд┐рдХреЛрдб рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рд▓рд┐рдП, рд╣рдо `tokenizer.sequences_to_texts` рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ; рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдХреИрд░реЗрдХреНрдЯрд░-рд▓реЗрд╡рд▓ рдЯреЛрдХрдирд╛рдЗрдЬреЗрд╢рди рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЯреЛрдХрдирд╛рдЗрдЬрд╝рд░ рд╕реЗ рдЯреЛрдХрди рдХреА рдПрдХ рдбрд┐рдХреНрд╢рдирд░реА (рдЬрд┐рд╕реЗ `word_index` рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ) рд▓реЗрдВрдЧреЗ, рдПрдХ рд░рд┐рд╡рд░реНрд╕ рдореИрдк рдмрдирд╛рдПрдВрдЧреЗ, рдФрд░ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВрдЧреЗ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"reverse_map = {val:key for key, val in tokenizer.word_index.items()}\n",
|
||||
"\n",
|
||||
"def decode(x):\n",
|
||||
" return ''.join([reverse_map[t] for t in x])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдЕрдм, рдЪрд▓рд┐рдП рдЬрдирд░реЗрд╢рди рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдХрд┐рд╕реА рд╕реНрдЯреНрд░рд┐рдВрдЧ `start` рд╕реЗ рд╢реБрд░реБрдЖрдд рдХрд░реЗрдВрдЧреЗ, рдЗрд╕реЗ рдПрдХ рдЕрдиреБрдХреНрд░рдо `inp` рдореЗрдВ рдПрдиреНрдХреЛрдб рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдлрд┐рд░ рд╣рд░ рдЪрд░рдг рдореЗрдВ рд╣рдо рдЕрдкрдиреЗ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗ рддрд╛рдХрд┐ рдЕрдЧрд▓рд╛ рдХреИрд░реЗрдХреНрдЯрд░ рдЕрдиреБрдорд╛рдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред\n",
|
||||
"\n",
|
||||
"рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ `out` рдПрдХ рд╡реЗрдХреНрдЯрд░ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ `vocab_size` рддрддреНрд╡ рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдЯреЛрдХрди рдХреА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо `argmax` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдмрд╕реЗ рд╕рдВрднрд╛рд╡рд┐рдд рдЯреЛрдХрди рдирдВрдмрд░ рдвреВрдВрдв рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрд╛рдж рд╣рдо рдЗрд╕ рдХреИрд░реЗрдХреНрдЯрд░ рдХреЛ рдЬрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдЯреЛрдХрдиреНрд╕ рдХреА рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдЬрдирд░реЗрд╢рди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдПрдХ рдХреИрд░реЗрдХреНрдЯрд░ рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ `size` рдмрд╛рд░ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХреИрд░реЗрдХреНрдЯрд░реНрд╕ рдЬрдирд░реЗрдЯ рдХрд┐рдП рдЬрд╛ рд╕рдХреЗрдВ, рдФрд░ рд╣рдо рдЬрд▓реНрджреА рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрддреЗ рд╣реИрдВ рдЬрдм `eos_token` рдорд┐рд▓ рдЬрд╛рддрд╛ рд╣реИред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 12,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"'Today #39;s lead to strike for the strike for the strike for the strike (AFP)'"
|
||||
]
|
||||
},
|
||||
"execution_count": 12,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def generate(model,size=100,start='Today '):\n",
|
||||
" inp = tokenizer.texts_to_sequences([start])[0]\n",
|
||||
" chars = inp\n",
|
||||
" for i in range(size):\n",
|
||||
" out = model(tf.expand_dims(tf.one_hot(inp,vocab_size),0))[0][-1]\n",
|
||||
" nc = tf.argmax(out)\n",
|
||||
" if nc==eos_token:\n",
|
||||
" break\n",
|
||||
" chars.append(nc.numpy())\n",
|
||||
" inp = inp+[nc]\n",
|
||||
" return decode(chars)\n",
|
||||
" \n",
|
||||
"generate(model)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рдирдореВрдирд╛ рд▓реЗрдирд╛\n",
|
||||
"\n",
|
||||
"рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ *рд╕рдЯреАрдХрддрд╛* рдЬреИрд╕реЗ рдХреЛрдИ рдЙрдкрдпреЛрдЧреА рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рджреЗрдЦрдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдХрд┐ рд╣рдорд╛рд░рд╛ рдореЙрдбрд▓ рдмреЗрд╣рддрд░ рд╣реЛ рд░рд╣рд╛ рд╣реИ, **рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдЙрддреНрдкрдиреНрди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдирдореВрдирд╛ рд▓реЗрдирд╛** рд╣реИред рдЗрд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо **рдХреЙрд▓рдмреИрдХреНрд╕** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдпрд╛рдиреА рдРрд╕реА рдлрд╝рдВрдХреНрд╢рдиреНрд╕ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо `fit` рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЬреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рд╕рдордп-рд╕рдордп рдкрд░ рдХреЙрд▓ рдХреА рдЬрд╛рдПрдВрдЧреАред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 13,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Epoch 1/3\n",
|
||||
"15000/15000 [==============================] - 226s 15ms/step - loss: 1.2703\n",
|
||||
"Today #39;s a lead in the company for the strike\n",
|
||||
"Epoch 2/3\n",
|
||||
"15000/15000 [==============================] - 227s 15ms/step - loss: 1.2057\n",
|
||||
"Today #39;s the Market Service on Security Start (AP)\n",
|
||||
"Epoch 3/3\n",
|
||||
"15000/15000 [==============================] - 226s 15ms/step - loss: 1.1752\n",
|
||||
"Today #39;s a line on the strike to start for the start\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<tensorflow.python.keras.callbacks.History at 0x7fa40c74e3d0>"
|
||||
]
|
||||
},
|
||||
"execution_count": 13,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"sampling_callback = keras.callbacks.LambdaCallback(\n",
|
||||
" on_epoch_end = lambda batch, logs: print(generate(model))\n",
|
||||
")\n",
|
||||
"\n",
|
||||
"model.fit(ds_train.batch(8).map(title_batch_fn),callbacks=[sampling_callback],epochs=3)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рдкрд╛рда рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ рдФрд░ рдмреЗрд╣рддрд░ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:\n",
|
||||
"\n",
|
||||
"* **рдЕрдзрд┐рдХ рдкрд╛рда**ред рд╣рдордиреЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рд╢реАрд░реНрд╖рдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдкреВрд░реЗ рдкрд╛рда рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ RNNs рд▓рдВрдмреЗ рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдЫреЛрдЯреЗ рд╡рд╛рдХреНрдпреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рдпрд╛ рд╣рдореЗрд╢рд╛ рдХрд┐рд╕реА рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдорд╛рди `num_chars` (рдЬреИрд╕реЗ, 256) рдХреА рдирд┐рд╢реНрдЪрд┐рдд рдЕрдиреБрдХреНрд░рдо рд▓рдВрдмрд╛рдИ рдкрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рджреЗрдирд╛ рд╕рдордЭрджрд╛рд░реА рд╣реЛ рд╕рдХрддреА рд╣реИред рдЖрдк рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдХреЛ рдРрд╕реА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, [рдЖрдзрд┐рдХрд╛рд░рд┐рдХ Keras рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓](https://keras.io/examples/generative/lstm_character_level_text_generation/) рдХреЛ рдкреНрд░реЗрд░рдгрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдПред\n",
|
||||
"\n",
|
||||
"* **рдорд▓реНрдЯреАрд▓реЗрдпрд░ LSTM**ред LSTM рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА 2 рдпрд╛ 3 рдкрд░рддреЛрдВ рдХреЛ рдЖрдЬрд╝рдорд╛рдирд╛ рд╕рдордЭрджрд╛рд░реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд┐рдЫрд▓реЗ рдпреВрдирд┐рдЯ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдерд╛, LSTM рдХреА рдкреНрд░рддреНрдпреЗрдХ рдкрд░рдд рдкрд╛рда рд╕реЗ рдХреБрдЫ рдкреИрдЯрд░реНрди рдирд┐рдХрд╛рд▓рддреА рд╣реИ, рдФрд░ рдХреИрд░реЗрдХреНрдЯрд░-рд▓реЗрд╡рд▓ рдЬрдирд░реЗрдЯрд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдирд┐рдЪрд▓реА LSTM рдкрд░рдд рдЕрдХреНрд╖рд░реЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧреА, рдФрд░ рдКрдкрд░реА рдкрд░рддреЗрдВ - рд╢рдмреНрдж рдФрд░ рд╢рдмреНрдж рд╕рдВрдпреЛрдЬрди рдХреЗ рд▓рд┐рдПред рдЗрд╕реЗ LSTM рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдкрд░рддреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░рдХреЗ рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"* рдЖрдк **GRU рдпреВрдирд┐рдЯреНрд╕** рдХреЗ рд╕рд╛рде рднреА рдкреНрд░рдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕рд╛ рдмреЗрд╣рддрд░ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддрд╛ рд╣реИ, рдФрд░ **рд╡рд┐рднрд┐рдиреНрди рдЫрд┐рдкреА рдкрд░рдд рдХреЗ рдЖрдХрд╛рд░** рдХреЗ рд╕рд╛рде рднреАред рдмрд╣реБрдд рдмрдбрд╝реА рдЫрд┐рдкреА рдкрд░рдд рдУрд╡рд░рдлрд┐рдЯрд┐рдВрдЧ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддреА рд╣реИ (рдЬреИрд╕реЗ, рдиреЗрдЯрд╡рд░реНрдХ рд╕рдЯреАрдХ рдкрд╛рда рд╕реАрдЦ рд▓реЗрдЧрд╛), рдФрд░ рдЫреЛрдЯрд╛ рдЖрдХрд╛рд░ рдЕрдЪреНрдЫрд╛ рдкрд░рд┐рдгрд╛рдо рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рд╕реЙрдлреНрдЯ рдЯреЗрдХреНрд╕реНрдЯ рдЬрдирд░реЗрд╢рди рдФрд░ рдЯреЗрдореНрдкрд░реЗрдЪрд░\n",
|
||||
"\n",
|
||||
"`generate` рдХреА рдкрд┐рдЫрд▓реА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ, рд╣рдо рд╣рдореЗрд╢рд╛ рдЙрд╕ рдЕрдХреНрд╖рд░ рдХреЛ рдЕрдЧрд▓рд╛ рдЕрдХреНрд╖рд░ рдЪреБрдирддреЗ рдереЗ рдЬрд┐рд╕рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрддреА рдереАред рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдпрд╣ рд╣реЛрддрд╛ рдерд╛ рдХрд┐ рдЯреЗрдХреНрд╕реНрдЯ рдЕрдХреНрд╕рд░ рдмрд╛рд░-рдмрд╛рд░ рдПрдХ рд╣реА рдЕрдХреНрд╖рд░ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ \"рдЪрдХреНрд░рд┐рдд\" рд╣реЛ рдЬрд╛рддрд╛ рдерд╛, рдЬреИрд╕реЗ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ:\n",
|
||||
"```\n",
|
||||
"today of the second the company and a second the company ...\n",
|
||||
"```\n",
|
||||
"\n",
|
||||
"рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рд╣рдо рдЕрдЧрд▓реЗ рдЕрдХреНрд╖рд░ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рдирд╛ рд╡рд┐рддрд░рдг рдХреЛ рджреЗрдЦреЗрдВ, рддреЛ рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдЙрдЪреНрдЪрддрдо рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдмрд╣реБрдд рдмрдбрд╝рд╛ рди рд╣реЛ, рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рдЕрдХреНрд╖рд░ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ 0.2 рд╣реЛ, рдФрд░ рджреВрд╕рд░реЗ рдХреА 0.19ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдЕрдиреБрдХреНрд░рдо '*play*' рдореЗрдВ рдЕрдЧрд▓реЗ рдЕрдХреНрд╖рд░ рдХреА рддрд▓рд╛рд╢ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдЕрдЧрд▓рд╛ рдЕрдХреНрд╖рд░ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╕реНрдкреЗрд╕ рдпрд╛ **e** (рдЬреИрд╕реЗ рд╢рдмреНрдж *player* рдореЗрдВ) рд╣реЛ рд╕рдХрддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"рдЗрд╕рд╕реЗ рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд▓рддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрд╢рд╛ рдЙрдЪреНрдЪрддрдо рд╕рдВрднрд╛рд╡рдирд╛ рд╡рд╛рд▓реЗ рдЕрдХреНрд╖рд░ рдХреЛ рдЪреБрдирдирд╛ \"рдиреНрдпрд╛рдпрд╕рдВрдЧрдд\" рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рджреВрд╕рд░реЗ рдЙрдЪреНрдЪрддрдо рдХреЛ рдЪреБрдирдирд╛ рднреА рд╣рдореЗрдВ рд╕рд╛рд░реНрдердХ рдЯреЗрдХреНрд╕реНрдЯ рдХреА рдУрд░ рд▓реЗ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЕрдзрд┐рдХ рд╕рдордЭрджрд╛рд░реА рд╣реЛрдЧреА рдХрд┐ рдиреЗрдЯрд╡рд░реНрдХ рдЖрдЙрдЯрдкреБрдЯ рджреНрд╡рд╛рд░рд╛ рджреА рдЧрдИ рд╕рдВрднрд╛рд╡рдирд╛ рд╡рд┐рддрд░рдг рд╕реЗ рдЕрдХреНрд╖рд░реЛрдВ рдХреЛ **рд╕реИрдВрдкрд▓** рдХрд┐рдпрд╛ рдЬрд╛рдПред\n",
|
||||
"\n",
|
||||
"рдпрд╣ рд╕реИрдВрдкрд▓рд┐рдВрдЧ `np.multinomial` рдлрдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЬреЛ рддрдерд╛рдХрдерд┐рдд **рдорд▓реНрдЯрд┐рдиреЛрдорд┐рдпрд▓ рд╡рд┐рддрд░рдг** рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдлрдВрдХреНрд╢рди рдЬреЛ рдЗрд╕ **рд╕реЙрдлреНрдЯ** рдЯреЗрдХреНрд╕реНрдЯ рдЬрдирд░реЗрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдиреАрдЪреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 33,
|
||||
"metadata": {
|
||||
"scrolled": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"\n",
|
||||
"--- Temperature = 0.3\n",
|
||||
"Today #39;s strike #39; to start at the store return\n",
|
||||
"On Sunday PO to Be Data Profit Up (Reuters)\n",
|
||||
"Moscow, SP wins straight to the Microsoft #39;s control of the space start\n",
|
||||
"President olding of the blast start for the strike to pay <b>...</b>\n",
|
||||
"Little red riding hood ficed to the spam countered in European <b>...</b>\n",
|
||||
"\n",
|
||||
"--- Temperature = 0.8\n",
|
||||
"Today countie strikes ryder missile faces food market blut\n",
|
||||
"On Sunday collores lose-toppy of sale of Bullment in <b>...</b>\n",
|
||||
"Moscow, IBM Diffeiting in Afghan Software Hotels (Reuters)\n",
|
||||
"President Ol Luster for Profit Peaced Raised (AP)\n",
|
||||
"Little red riding hood dace on depart talks #39; bank up\n",
|
||||
"\n",
|
||||
"--- Temperature = 1.0\n",
|
||||
"Today wits House buiting debate fixes #39; supervice stake again\n",
|
||||
"On Sunday arling digital poaching In for level\n",
|
||||
"Moscow, DS Up 7, Top Proble Protest Caprey Mamarian Strike\n",
|
||||
"President teps help of roubler stepted lessabul-Dhalitics (AFP)\n",
|
||||
"Little red riding hood signs on cash in Carter-youb\n",
|
||||
"\n",
|
||||
"--- Temperature = 1.3\n",
|
||||
"Today wits flawer ro, pSIA figat's co DroftwavesIs Talo up\n",
|
||||
"On Sunday hround elitwing wint EU Powerburlinetien\n",
|
||||
"Moscow, Bazz #39;s sentries olymen winnelds' next for Olympite Huc?\n",
|
||||
"President lost securitys from power Elections in Smiltrials\n",
|
||||
"Little red riding hood vides profit, exponituity, profitmainalist-at said listers\n",
|
||||
"\n",
|
||||
"--- Temperature = 1.8\n",
|
||||
"Today #39;It: He deat: N.KA Asside\n",
|
||||
"On Sunday i arry Par aldeup patient Wo stele1\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ename": "KeyError",
|
||||
"evalue": "0",
|
||||
"output_type": "error",
|
||||
"traceback": [
|
||||
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
|
||||
"\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)",
|
||||
"\u001b[0;32m<ipython-input-33-db32367a0feb>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"\\n--- Temperature = {i}\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 19\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mj\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 20\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgenerate_soft\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0msize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m300\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mstart\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mwords\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mj\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mtemperature\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
|
||||
"\u001b[0;32m<ipython-input-33-db32367a0feb>\u001b[0m in \u001b[0;36mgenerate_soft\u001b[0;34m(model, size, start, temperature)\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0mchars\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0minp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minp\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnc\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 13\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mdecode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mchars\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 14\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[0mwords\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m'Today '\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'On Sunday '\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'Moscow, '\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'President '\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'Little red riding hood '\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
||||
"\u001b[0;32m<ipython-input-10-3f5fa6130b1d>\u001b[0m in \u001b[0;36mdecode\u001b[0;34m(x)\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mdecode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0;34m''\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjoin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mreverse_map\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mt\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
|
||||
"\u001b[0;32m<ipython-input-10-3f5fa6130b1d>\u001b[0m in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mdecode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0;34m''\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjoin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mreverse_map\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mt\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
|
||||
"\u001b[0;31mKeyError\u001b[0m: 0"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def generate_soft(model,size=100,start='Today ',temperature=1.0):\n",
|
||||
" inp = tokenizer.texts_to_sequences([start])[0]\n",
|
||||
" chars = inp\n",
|
||||
" for i in range(size):\n",
|
||||
" out = model(tf.expand_dims(tf.one_hot(inp,vocab_size),0))[0][-1]\n",
|
||||
" probs = tf.exp(tf.math.log(out)/temperature).numpy().astype(np.float64)\n",
|
||||
" probs = probs/np.sum(probs)\n",
|
||||
" nc = np.argmax(np.random.multinomial(1,probs,1))\n",
|
||||
" if nc==eos_token:\n",
|
||||
" break\n",
|
||||
" chars.append(nc)\n",
|
||||
" inp = inp+[nc]\n",
|
||||
" return decode(chars)\n",
|
||||
"\n",
|
||||
"words = ['Today ','On Sunday ','Moscow, ','President ','Little red riding hood ']\n",
|
||||
" \n",
|
||||
"for i in [0.3,0.8,1.0,1.3,1.8]:\n",
|
||||
" print(f\"\\n--- Temperature = {i}\")\n",
|
||||
" for j in range(5):\n",
|
||||
" print(generate_soft(model,size=300,start=words[j],temperature=i))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рд╣рдордиреЗ рдПрдХ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ **рддрд╛рдкрдорд╛рди** рдкреЗрд╢ рдХрд┐рдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рд╕рдВрдХреЗрдд рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЙрдЪреНрдЪрддрдо рд╕рдВрднрд╛рд╡рдирд╛ рд╕реЗ рдХрд┐рддрдиреА рджреГрдврд╝рддрд╛ рд╕реЗ рдЪрд┐рдкрдХрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рддрд╛рдкрдорд╛рди 1.0 рд╣реИ, рддреЛ рд╣рдо рдирд┐рд╖реНрдкрдХреНрд╖ рдмрд╣реБрдкрдж рдирдореВрдирд╛ рд▓реЗрддреЗ рд╣реИрдВ, рдФрд░ рдЬрдм рддрд╛рдкрдорд╛рди рдЕрдирдВрдд рддрдХ рдЬрд╛рддрд╛ рд╣реИ - рд╕рднреА рд╕рдВрднрд╛рд╡рдирд╛рдПрдБ рд╕рдорд╛рди рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ, рдФрд░ рд╣рдо рдЕрдЧрд▓рд╛ рд╡рд░реНрдг рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рдЪреБрдирддреЗ рд╣реИрдВред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЬрдм рд╣рдо рддрд╛рдкрдорд╛рди рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ рддреЛ рдкрд╛рда рдЕрд░реНрдерд╣реАрди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЬрдм рдпрд╣ 0 рдХреЗ рдХрд░реАрдм рд╣реЛрддрд╛ рд╣реИ рддреЛ рдпрд╣ \"рдЪрдХреНрд░рд┐рдд\" рдХрдареЛрд░-рдЬрдирд┐рдд рдкрд╛рда рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**рдЕрд╕реНрд╡реАрдХрд░рдг**: \nрдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ AI рдЕрдиреБрд╡рд╛рдж рд╕реЗрд╡рд╛ [Co-op Translator](https://github.com/Azure/co-op-translator) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрдмрдХрд┐ рд╣рдо рд╕рдЯреАрдХрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрдиреБрд╡рд╛рдж рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдпрд╛ рдЕрд╢реБрджреНрдзрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдореВрд▓ рднрд╛рд╖рд╛ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдореВрд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рд╕реНрд░реЛрдд рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдкреЗрд╢реЗрд╡рд░ рдорд╛рдирд╡ рдЕрдиреБрд╡рд╛рдж рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред рдЗрд╕ рдЕрдиреБрд╡рд╛рдж рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд┐рд╕реА рднреА рдЧрд▓рддрдлрд╣рдореА рдпрд╛ рдЧрд▓рдд рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╣рдо рдЬрд┐рдореНрдореЗрджрд╛рд░ рдирд╣реАрдВ рд╣реИрдВред\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"interpreter": {
|
||||
"hash": "16af2a8bbb083ea23e5e41c7f5787656b2ce26968575d8763f2c4b17f9cd711f"
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3.8.12 ('py38')",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.8.12"
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "9fbb7d5fda708537649f71f5f646fcde",
|
||||
"translation_date": "2025-08-31T15:12:26+00:00",
|
||||
"source_file": "lessons/5-NLP/17-GenerativeNetworks/GenerativeTF.ipynb",
|
||||
"language_code": "hi"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 4
|
||||
}
|
||||
|
|
@ -0,0 +1,353 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# рдзреНрдпрд╛рди рддрдВрддреНрд░ рдФрд░ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░\n",
|
||||
"\n",
|
||||
"рдкреБрдирд░рд╛рд╡рд░реНрддреА рдиреЗрдЯрд╡рд░реНрдХреНрд╕ (Recurrent Networks) рдХреА рдПрдХ рдмрдбрд╝реА рдХрдореА рдпрд╣ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдЕрдиреБрдХреНрд░рдо (sequence) рдХреЗ рд╕рднреА рд╢рдмреНрджреЛрдВ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдкрд░ рд╕рдорд╛рди рдкреНрд░рднрд╛рд╡ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдирд╛рдорд┐рдд рдЗрдХрд╛рдИ рдкрд╣рдЪрд╛рди (Named Entity Recognition) рдФрд░ рдорд╢реАрди рдЕрдиреБрд╡рд╛рдж (Machine Translation) рдЬреИрд╕реЗ рдЕрдиреБрдХреНрд░рдо-рд╕реЗ-рдЕрдиреБрдХреНрд░рдо рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ LSTM рдПрдиреНрдХреЛрдбрд░-рдбрд┐рдХреЛрдбрд░ рдореЙрдбрд▓реНрд╕ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдХрдо рдХрд░ рджреЗрддреА рд╣реИред рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдореЗрдВ, рдЗрдирдкреБрдЯ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рд╢рдмреНрджреЛрдВ рдХрд╛ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рдЕрдиреНрдп рд╢рдмреНрджреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡ рд╣реЛрддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЕрдиреБрдХреНрд░рдо-рд╕реЗ-рдЕрдиреБрдХреНрд░рдо рдореЙрдбрд▓ рд╣реИ, рдЬреИрд╕реЗ рдорд╢реАрди рдЕрдиреБрд╡рд╛рджред рдЗрд╕реЗ рджреЛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдиреЗрдЯрд╡рд░реНрдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ (**рдПрдиреНрдХреЛрдбрд░**) рдЗрдирдкреБрдЯ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдЫрд┐рдкреА рд╣реБрдИ рдЕрд╡рд╕реНрдерд╛ (hidden state) рдореЗрдВ рд╕рдВрдХреБрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдиреЗрдЯрд╡рд░реНрдХ (**рдбрд┐рдХреЛрдбрд░**) рдЗрд╕ рдЫрд┐рдкреА рд╣реБрдИ рдЕрд╡рд╕реНрдерд╛ рдХреЛ рдЕрдиреБрд╡рд╛рджрд┐рдд рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдиреЗрдЯрд╡рд░реНрдХ рдХреА рдЕрдВрддрд┐рдо рдЕрд╡рд╕реНрдерд╛ рд╡рд╛рдХреНрдп рдХреА рд╢реБрд░реБрдЖрдд рдХреЛ рдпрд╛рдж рд░рдЦрдиреЗ рдореЗрдВ рдХрдард┐рдирд╛рдИ рдорд╣рд╕реВрд╕ рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд▓рдВрдмреЗ рд╡рд╛рдХреНрдпреЛрдВ рдкрд░ рдореЙрдбрд▓ рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдЦрд░рд╛рдм рд╣реЛ рдЬрд╛рддреА рд╣реИред\n",
|
||||
"\n",
|
||||
"**рдзреНрдпрд╛рди рддрдВрддреНрд░ (Attention Mechanisms)** рдкреНрд░рддреНрдпреЗрдХ рдЗрдирдкреБрдЯ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд╕рдВрджрд░реНрднреАрдп рдкреНрд░рднрд╛рд╡ рдХреЛ RNN рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЖрдЙрдЯрдкреБрдЯ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдкрд░ рднрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рд╛рдзрди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрдирдкреБрдЯ RNN рдХреА рдордзреНрдпрд╡рд░реНрддреА рдЕрд╡рд╕реНрдерд╛рдУрдВ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ RNN рдХреЗ рдмреАрдЪ рд╢реЙрд░реНрдЯрдХрдЯреНрд╕ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЬрдм рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рддреАрдХ $y_t$ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╕рднреА рдЗрдирдкреБрдЯ рдЫрд┐рдкреА рдЕрд╡рд╕реНрдерд╛рдУрдВ $h_i$ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рднрд╛рд░ рдЧреБрдгрд╛рдВрдХ $\\alpha_{t,i}$ рдХреЗ рд╕рд╛рде рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗрдВрдЧреЗред\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"*рдПрдиреНрдХреЛрдбрд░-рдбрд┐рдХреЛрдбрд░ рдореЙрдбрд▓ рдПрдбрд┐рдЯрд┐рд╡ рдзреНрдпрд╛рди рддрдВрддреНрд░ рдХреЗ рд╕рд╛рде [Bahdanau et al., 2015](https://arxiv.org/pdf/1409.0473.pdf) рд╕реЗ, [рдЗрд╕ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ](https://lilianweng.github.io/lil-log/2018/06/24/attention-attention.html) рд╕реЗ рдЙрджреНрдзреГрдд*\n",
|
||||
"\n",
|
||||
"рдзреНрдпрд╛рди рдореИрдЯреНрд░рд┐рдХреНрд╕ $\\{\\alpha_{i,j}\\}$ рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдЙрдЯрдкреБрдЯ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рд╢рдмреНрдж рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рдХреМрди рд╕реЗ рдЗрдирдкреБрдЯ рд╢рдмреНрдж рдХрд┐рддрдиреА рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддреЗ рд╣реИрдВред рдиреАрдЪреЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"*[Bahdanau et al., 2015](https://arxiv.org/pdf/1409.0473.pdf) (Fig.3) рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдЪрд┐рддреНрд░]*\n",
|
||||
"\n",
|
||||
"рдзреНрдпрд╛рди рддрдВрддреНрд░ рд╡рд░реНрддрдорд╛рди рдпрд╛ рд▓рдЧрднрдЧ рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╛рдХреГрддрд┐рдХ рднрд╛рд╖рд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг (Natural Language Processing) рдореЗрдВ рдЕрддреНрдпрд╛рдзреБрдирд┐рдХ рддрдХрдиреАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдзреНрдпрд╛рди рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдореЙрдбрд▓ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрд╛рдлреА рд╡реГрджреНрдзрд┐ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ RNNs рдХреЗ рд╕рд╛рде рд╕реНрдХреЗрд▓рд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛рдПрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВред RNNs рдХреЛ рд╕реНрдХреЗрд▓ рдХрд░рдиреЗ рдХреА рдПрдХ рдкреНрд░рдореБрдЦ рдмрд╛рдзрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдореЙрдбрд▓ рдХреА рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкреНрд░рдХреГрддрд┐ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЛ рдмреИрдЪ рдФрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдмрдирд╛рдиреЗ рдореЗрдВ рдЪреБрдиреМрддреАрдкреВрд░реНрдг рдмрдирд╛рддреА рд╣реИред RNN рдореЗрдВ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ред\n",
|
||||
"\n",
|
||||
"рдзреНрдпрд╛рди рддрдВрддреНрд░реЛрдВ рдХреЛ рдЕрдкрдирд╛рдиреЗ рдФрд░ рдЗрд╕ рдмрд╛рдзрд╛ рдиреЗ рдЖрдЬ рдХреЗ рдЕрддреНрдпрд╛рдзреБрдирд┐рдХ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдореЙрдбрд▓реНрд╕ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдорд╛рд░реНрдЧ рдкреНрд░рд╢рд╕реНрдд рдХрд┐рдпрд╛, рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо BERT рд╕реЗ OpenGPT3 рддрдХ рдЬрд╛рдирддреЗ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"## рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдореЙрдбрд▓реНрд╕\n",
|
||||
"\n",
|
||||
"рдкреНрд░рддреНрдпреЗрдХ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдЕрдЧрд▓реЗ рдореВрд▓реНрдпрд╛рдВрдХрди рдЪрд░рдг рдореЗрдВ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, **рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдореЙрдбрд▓реНрд╕** **рд╕реНрдерд┐рддрд┐ рдПрдиреНрдХреЛрдбрд┐рдВрдЧреНрд╕ (positional encodings)** рдФрд░ рдзреНрдпрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджрд┐рдП рдЧрдП рдЗрдирдкреБрдЯ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдПрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкрд╛рда рд╡рд┐рдВрдбреЛ рдХреЗ рднреАрддрд░ рдХреИрдкреНрдЪрд░ рдХрд░рддреЗ рд╣реИрдВред рдиреАрдЪреЗ рджреА рдЧрдИ рдЫрд╡рд┐ рджрд┐рдЦрд╛рддреА рд╣реИ рдХрд┐ рд╕реНрдерд┐рддрд┐ рдПрдиреНрдХреЛрдбрд┐рдВрдЧреНрд╕ рдФрд░ рдзреНрдпрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рд╡рд┐рдВрдбреЛ рдХреЗ рднреАрддрд░ рд╕рдВрджрд░реНрдн рдХреЛ рдХреИрд╕реЗ рдХреИрдкреНрдЪрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"рдЪреВрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЗрдирдкреБрдЯ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдерд┐рддрд┐ рдкрд░ рдореИрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ RNNs рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмреЗрд╣рддрд░ рд╕рдорд╛рдирд╛рдВрддрд░рддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдмрд╣реБрдд рдмрдбрд╝реЗ рдФрд░ рдЕрдзрд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдкреВрд░реНрдг рднрд╛рд╖рд╛ рдореЙрдбрд▓реНрд╕ рд╕рдХреНрд╖рдо рд╣реЛрддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдзреНрдпрд╛рди рд╣реЗрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢рдмреНрджреЛрдВ рдХреЗ рдмреАрдЪ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдкреНрд░рд╛рдХреГрддрд┐рдХ рднрд╛рд╖рд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"**BERT** (Bidirectional Encoder Representations from Transformers) рдПрдХ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдмрд╣реБ-рд╕реНрддрд░реАрдп рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдиреЗрдЯрд╡рд░реНрдХ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ *BERT-base* рдХреЗ рд▓рд┐рдП 12 рдкрд░рддреЗрдВ рдФрд░ *BERT-large* рдХреЗ рд▓рд┐рдП 24 рдкрд░рддреЗрдВ рд╣реЛрддреА рд╣реИрдВред рдЗрд╕ рдореЙрдбрд▓ рдХреЛ рдкрд╣рд▓реЗ рдмрдбрд╝реЗ рдкрд╛рда рдбреЗрдЯрд╛ (рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ + рдХрд┐рддрд╛рдмреЗрдВ) рдкрд░ рдЕрд╕реБрдкрд░рд╡рд╛рдЗрдЬреНрдб рдкреНрд░рд╢рд┐рдХреНрд╖рдг (рд╡рд╛рдХреНрдп рдореЗрдВ рдЫрд┐рдкреЗ рд╣реБрдП рд╢рдмреНрджреЛрдВ рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреВрд░реНрд╡-рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди, рдореЙрдбрд▓ рднрд╛рд╖рд╛ рдХреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдордЭ рдХреЛ рдЖрддреНрдорд╕рд╛рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдлрд┐рд░ рдЕрдиреНрдп рдбреЗрдЯрд╛рд╕реЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдлрд╛рдЗрди-рдЯреНрдпреВрдирд┐рдВрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ **рдЯреНрд░рд╛рдВрд╕рдлрд░ рд▓рд░реНрдирд┐рдВрдЧ** рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рдХрдИ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рдЬреИрд╕реЗ BERT, DistilBERT, BigBird, OpenGPT3 рдФрд░ рдЕрдиреНрдп, рдЬрд┐рдиреНрд╣реЗрдВ рдлрд╛рдЗрди-рдЯреНрдпреВрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред [HuggingFace рдкреИрдХреЗрдЬ](https://github.com/huggingface/) PyTorch рдХреЗ рд╕рд╛рде рдЗрдирдореЗрдВ рд╕реЗ рдХрдИ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"## рдЯреЗрдХреНрд╕реНрдЯ рд╡рд░реНрдЧреАрдХрд░рдг рдХреЗ рд▓рд┐рдП BERT рдХрд╛ рдЙрдкрдпреЛрдЧ\n",
|
||||
"\n",
|
||||
"рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдХрд╛рд░реНрдп рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡-рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд BERT рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдЕрдиреБрдХреНрд░рдо рд╡рд░реНрдЧреАрдХрд░рдгред рд╣рдо рдЕрдкрдиреЗ рдореВрд▓ AG News рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЛ рд╡рд░реНрдЧреАрдХреГрдд рдХрд░реЗрдВрдЧреЗред\n",
|
||||
"\n",
|
||||
"рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, HuggingFace рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рд╣рдорд╛рд░рд╛ рдбреЗрдЯрд╛рд╕реЗрдЯ рд▓реЛрдб рдХрд░реЗрдВ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Loading dataset...\n",
|
||||
"Building vocab...\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import torch\n",
|
||||
"import torchtext\n",
|
||||
"from torchnlp import *\n",
|
||||
"import transformers\n",
|
||||
"train_dataset, test_dataset, classes, vocab = load_dataset()\n",
|
||||
"vocab_len = len(vocab)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдкреНрд░реА-рдЯреНрд░реЗрдВрдб BERT рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рд╣рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЯреЛрдХрдирд╛рдЗрдЬрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдкреНрд░реА-рдЯреНрд░реЗрдВрдб BERT рдореЙрдбрд▓ рд╕реЗ рдЬреБрдбрд╝реЗ рдЯреЛрдХрдирд╛рдЗрдЬрд╝рд░ рдХреЛ рд▓реЛрдб рдХрд░реЗрдВрдЧреЗред\n",
|
||||
"\n",
|
||||
"HuggingFace рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдкреНрд░реА-рдЯреНрд░реЗрдВрдб рдореЙрдбрд▓реНрд╕ рдХрд╛ рдПрдХ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдк рдХреЗрд╡рд▓ рдЙрдирдХреЗ рдирд╛рдореЛрдВ рдХреЛ `from_pretrained` рдлрдВрдХреНрд╢рди рдХреЗ рдЖрд░реНрдЧреНрдпреБрдореЗрдВрдЯреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдХрд░ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдмрд╛рдЗрдирд░реА рдлрд╛рдЗрд▓реЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рд╣реЛ рдЬрд╛рдПрдВрдЧреАред\n",
|
||||
"\n",
|
||||
"рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ рдореЙрдбрд▓реНрд╕ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдк рдЙрд╕ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рд╕рдВрдмрдВрдзрд┐рдд рдлрд╛рдЗрд▓реЗрдВ рд╣реЛрдВ, рдЬреИрд╕реЗ рдЯреЛрдХрдирд╛рдЗрдЬрд╝рд░ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░реНрд╕, рдореЙрдбрд▓ рдкреИрд░рд╛рдореАрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде `config.json` рдлрд╛рдЗрд▓, рдмрд╛рдЗрдирд░реА рд╡реЗрдЯреНрд╕ рдЖрджрд┐ред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# To load the model from Internet repository using model name. \n",
|
||||
"# Use this if you are running from your own copy of the notebooks\n",
|
||||
"bert_model = 'bert-base-uncased' \n",
|
||||
"\n",
|
||||
"# To load the model from the directory on disk. Use this for Microsoft Learn module, because we have\n",
|
||||
"# prepared all required files for you.\n",
|
||||
"bert_model = './bert'\n",
|
||||
"\n",
|
||||
"tokenizer = transformers.BertTokenizer.from_pretrained(bert_model)\n",
|
||||
"\n",
|
||||
"MAX_SEQ_LEN = 128\n",
|
||||
"PAD_INDEX = tokenizer.convert_tokens_to_ids(tokenizer.pad_token)\n",
|
||||
"UNK_INDEX = tokenizer.convert_tokens_to_ids(tokenizer.unk_token)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"`tokenizer` рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ `encode` рдлрд╝рдВрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕реАрдзреЗ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдПрдиреНрдХреЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 15,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[101, 1052, 22123, 2953, 2818, 2003, 1037, 2307, 7705, 2005, 17953, 2361, 102]"
|
||||
]
|
||||
},
|
||||
"execution_count": 15,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"tokenizer.encode('PyTorch is a great framework for NLP')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдлрд┐рд░, рдЖрдЗрдП рдРрд╕реЗ рдЗрдЯрд░реЗрдЯрд░ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдХреНрдпреЛрдВрдХрд┐ BERT рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рдПрдирдХреЛрдбрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд╣рдореЗрдВ рдПрдХ рдкреИрдбрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬреЛ рдкрд╣рд▓реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд `padify` рдХреЗ рд╕рдорд╛рди рд╣реЛ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def pad_bert(b):\n",
|
||||
" # b is the list of tuples of length batch_size\n",
|
||||
" # - first element of a tuple = label, \n",
|
||||
" # - second = feature (text sequence)\n",
|
||||
" # build vectorized sequence\n",
|
||||
" v = [tokenizer.encode(x[1]) for x in b]\n",
|
||||
" # compute max length of a sequence in this minibatch\n",
|
||||
" l = max(map(len,v))\n",
|
||||
" return ( # tuple of two tensors - labels and features\n",
|
||||
" torch.LongTensor([t[0] for t in b]),\n",
|
||||
" torch.stack([torch.nn.functional.pad(torch.tensor(t),(0,l-len(t)),mode='constant',value=0) for t in v])\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
"train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=8, collate_fn=pad_bert, shuffle=True)\n",
|
||||
"test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=8, collate_fn=pad_bert)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдкреВрд░реНрд╡-рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд BERT рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдЬрд┐рд╕реЗ `bert-base-uncased` рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЗрдП рдореЙрдбрд▓ рдХреЛ `BertForSequenceClassfication` рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реЛрдб рдХрд░реЗрдВред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдореЙрдбрд▓ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд░реНрдЧреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЕрдВрддрд┐рдо рд╡рд░реНрдЧреАрдХрд░реНрддрд╛ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред рдЖрдкрдХреЛ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдЕрдВрддрд┐рдо рд╡рд░реНрдЧреАрдХрд░реНрддрд╛ рдХреЗ рд╡рдЬрд╝рди рдкреНрд░рд╛рд░рдВрдн рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдФрд░ рдореЙрдбрд▓ рдХреЛ рдкреВрд░реНрд╡-рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА - рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣реА рд╣рдо рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Some weights of the model checkpoint at ./bert were not used when initializing BertForSequenceClassification: ['cls.predictions.bias', 'cls.predictions.transform.dense.weight', 'cls.predictions.transform.dense.bias', 'cls.predictions.decoder.weight', 'cls.seq_relationship.weight', 'cls.seq_relationship.bias', 'cls.predictions.transform.LayerNorm.weight', 'cls.predictions.transform.LayerNorm.bias']\n",
|
||||
"- This IS expected if you are initializing BertForSequenceClassification from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).\n",
|
||||
"- This IS NOT expected if you are initializing BertForSequenceClassification from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).\n",
|
||||
"Some weights of BertForSequenceClassification were not initialized from the model checkpoint at ./bert and are newly initialized: ['classifier.weight', 'classifier.bias']\n",
|
||||
"You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"model = transformers.BertForSequenceClassification.from_pretrained(bert_model,num_labels=4).to(device)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдЕрдм рд╣рдо рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ! рдХреНрдпреЛрдВрдХрд┐ BERT рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░реА-рдЯреНрд░реЗрдВрдб рд╣реИ, рд╣рдо рдПрдХ рдмрд╣реБрдд рд╣реА рдЫреЛрдЯреЗ рд▓рд░реНрдирд┐рдВрдЧ рд░реЗрдЯ рд╕реЗ рд╢реБрд░реБрдЖрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╡рдЬрд╝рди рдЦрд░рд╛рдм рди рд╣реЛ рдЬрд╛рдПрдВред\n",
|
||||
"\n",
|
||||
"рд╕рд╛рд░рд╛ рдХрдард┐рди рдХрд╛рдо `BertForSequenceClassification` рдореЙрдбрд▓ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм рд╣рдо рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдбреЗрдЯрд╛ рдкрд░ рдореЙрдбрд▓ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЗрдирдкреБрдЯ рдорд┐рдиреАрдмреИрдЪ рдХреЗ рд▓рд┐рдП рд▓реЙрд╕ рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдЖрдЙрдЯрдкреБрдЯ рджреЛрдиреЛрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд╣рдо рдкреИрд░рд╛рдореАрдЯрд░ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП рд▓реЙрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ (`loss.backward()` рдмреИрдХрд╡рд░реНрдб рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ), рдФрд░ `out` рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕рдЯреАрдХрддрд╛ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдкреНрд░рд╛рдкреНрдд рд▓реЗрдмрд▓ `labs` (рдЬреЛ `argmax` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧрдгрдирд╛ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ) рдХреЛ рдЕрдкреЗрдХреНрд╖рд┐рдд `labels` рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХрдИ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдореЗрдВ рд▓реЙрд╕ рдФрд░ рд╕рдЯреАрдХрддрд╛ рдХреЛ рд╕рдВрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╣рд░ `report_freq` рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЪрдХреНрд░реЛрдВ рдХреЗ рдмрд╛рдж рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд┐рдВрдЯ рдХрд░рддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"рдпрд╣ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕рдВрднрд╡рддрдГ рдХрд╛рдлреА рд╕рдордп рд▓реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддреЗ рд╣реИрдВред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Loss = 1.1254194641113282, Accuracy = 0.585\n",
|
||||
"Loss = 0.6194715118408203, Accuracy = 0.83\n",
|
||||
"Loss = 0.46665248870849607, Accuracy = 0.8475\n",
|
||||
"Loss = 0.4309701919555664, Accuracy = 0.8575\n",
|
||||
"Loss = 0.35427074432373046, Accuracy = 0.8825\n",
|
||||
"Loss = 0.3306886291503906, Accuracy = 0.8975\n",
|
||||
"Loss = 0.30340143203735354, Accuracy = 0.8975\n",
|
||||
"Loss = 0.26139299392700194, Accuracy = 0.915\n",
|
||||
"Loss = 0.26708646774291994, Accuracy = 0.9225\n",
|
||||
"Loss = 0.3667240524291992, Accuracy = 0.8675\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"optimizer = torch.optim.Adam(model.parameters(), lr=2e-5)\n",
|
||||
"\n",
|
||||
"report_freq = 50\n",
|
||||
"iterations = 500 # make this larger to train for longer time!\n",
|
||||
"\n",
|
||||
"model.train()\n",
|
||||
"\n",
|
||||
"i,c = 0,0\n",
|
||||
"acc_loss = 0\n",
|
||||
"acc_acc = 0\n",
|
||||
"\n",
|
||||
"for labels,texts in train_loader:\n",
|
||||
" labels = labels.to(device)-1 # get labels in the range 0-3 \n",
|
||||
" texts = texts.to(device)\n",
|
||||
" loss, out = model(texts, labels=labels)[:2]\n",
|
||||
" labs = out.argmax(dim=1)\n",
|
||||
" acc = torch.mean((labs==labels).type(torch.float32))\n",
|
||||
" optimizer.zero_grad()\n",
|
||||
" loss.backward()\n",
|
||||
" optimizer.step()\n",
|
||||
" acc_loss += loss\n",
|
||||
" acc_acc += acc\n",
|
||||
" i+=1\n",
|
||||
" c+=1\n",
|
||||
" if i%report_freq==0:\n",
|
||||
" print(f\"Loss = {acc_loss.item()/c}, Accuracy = {acc_acc.item()/c}\")\n",
|
||||
" c = 0\n",
|
||||
" acc_loss = 0\n",
|
||||
" acc_acc = 0\n",
|
||||
" iterations-=1\n",
|
||||
" if not iterations:\n",
|
||||
" break"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ (рдЦрд╛рд╕рдХрд░ рдЕрдЧрд░ рдЖрдк iterations рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ рдФрд░ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ) рдХрд┐ BERT classification рд╣рдореЗрдВ рдХрд╛рдлреА рдЕрдЪреНрдЫреА рд╕рдЯреАрдХрддрд╛ рджреЗрддрд╛ рд╣реИ! рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ BERT рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рднрд╛рд╖рд╛ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдХрд╛рдлреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕рдордЭрддрд╛ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдЕрдВрддрд┐рдо classifier рдХреЛ fine-tune рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреНрдпреЛрдВрдХрд┐ BERT рдПрдХ рдмрдбрд╝рд╛ рдореЙрдбрд▓ рд╣реИ, рдкреВрд░рд╛ training рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛рдлреА рд╕рдордп рд▓реЗрддреА рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЧрдВрднреАрд░ computational power рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ! (GPU, рдФрд░ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдХрд┐ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ GPU рд╣реЛрдВ)ред\n",
|
||||
"\n",
|
||||
"> **Note:** рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдордиреЗ рд╕рдмрд╕реЗ рдЫреЛрдЯреЗ pre-trained BERT рдореЙрдбрд▓реНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред рдмрдбрд╝реЗ рдореЙрдбрд▓реНрд╕ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ, рдЬреЛ рд╕рдВрднрд╡рддрдГ рдмреЗрд╣рддрд░ рдкрд░рд┐рдгрд╛рдо рджреЗ рд╕рдХрддреЗ рд╣реИрдВред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рдореЙрдбрд▓ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди\n",
|
||||
"\n",
|
||||
"рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдореЙрдбрд▓ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рд╕реЗрдЯ рдкрд░ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореВрд▓реНрдпрд╛рдВрдХрди рд▓реВрдк рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд▓реВрдк рдХреЗ рд╕рдорд╛рди рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рднреВрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдореЙрдбрд▓ рдХреЛ рдореВрд▓реНрдпрд╛рдВрдХрди рдореЛрдб рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `model.eval()` рдХреЙрд▓ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Final accuracy: 0.9047029702970297\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"model.eval()\n",
|
||||
"iterations = 100\n",
|
||||
"acc = 0\n",
|
||||
"i = 0\n",
|
||||
"for labels,texts in test_loader:\n",
|
||||
" labels = labels.to(device)-1 \n",
|
||||
" texts = texts.to(device)\n",
|
||||
" _, out = model(texts, labels=labels)[:2]\n",
|
||||
" labs = out.argmax(dim=1)\n",
|
||||
" acc += torch.mean((labs==labels).type(torch.float32))\n",
|
||||
" i+=1\n",
|
||||
" if i>iterations: break\n",
|
||||
" \n",
|
||||
"print(f\"Final accuracy: {acc.item()/i}\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рдореБрдЦреНрдп рдмрд╛рддреЗрдВ\n",
|
||||
"\n",
|
||||
"рдЗрд╕ рдпреВрдирд┐рдЯ рдореЗрдВ, рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ **transformers** рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдкреНрд░реА-рдЯреНрд░реЗрдВрдб рднрд╛рд╖рд╛ рдореЙрдбрд▓ рд▓реЗрдирд╛ рдФрд░ рдЙрд╕реЗ рд╣рдорд╛рд░реЗ рдЯреЗрдХреНрд╕реНрдЯ рдХреНрд▓рд╛рд╕рд┐рдлрд┐рдХреЗрд╢рди рдЯрд╛рд╕реНрдХ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдХрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реИред рдЗрд╕реА рддрд░рд╣, BERT рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдВрдЯрд┐рдЯреА рдПрдХреНрд╕рдЯреНрд░реИрдХреНрд╢рди, рдкреНрд░рд╢реНрди рдЙрддреНрддрд░ рджреЗрдиреЗ рдФрд░ рдЕрдиреНрдп NLP рдЯрд╛рд╕реНрдХ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдореЙрдбрд▓ NLP рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдмрд╕реЗ рдЙрдиреНрдирдд рддрдХрдиреАрдХ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЬрдм рдЖрдк рдХрд╕реНрдЯрдо NLP рд╕рдорд╛рдзрд╛рди рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкрд╣рд▓рд╛ рд╡рд┐рдХрд▓реНрдк рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рдЖрдк рдЙрдиреНрдирдд рдиреНрдпреВрд░рд▓ рдореЙрдбрд▓ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП рдкреБрдирд░рд╛рд╡рд░реНрддреА рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдореВрд▓рднреВрдд рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рд╕рдордЭрдирд╛ рдЕрддреНрдпрдВрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**рдЕрд╕реНрд╡реАрдХрд░рдг**: \nрдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ AI рдЕрдиреБрд╡рд╛рдж рд╕реЗрд╡рд╛ [Co-op Translator](https://github.com/Azure/co-op-translator) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрдмрдХрд┐ рд╣рдо рд╕рдЯреАрдХрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрдиреБрд╡рд╛рдж рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдпрд╛ рдЕрд╢реБрджреНрдзрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдореВрд▓ рднрд╛рд╖рд╛ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдореВрд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рд╕реНрд░реЛрдд рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдкреЗрд╢реЗрд╡рд░ рдорд╛рдирд╡ рдЕрдиреБрд╡рд╛рдж рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред рдЗрд╕ рдЕрдиреБрд╡рд╛рдж рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд┐рд╕реА рднреА рдЧрд▓рддрдлрд╣рдореА рдпрд╛ рдЧрд▓рдд рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╣рдо рдЙрддреНрддрд░рджрд╛рдпреА рдирд╣реАрдВ рд╣реИрдВред\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "py37_pytorch",
|
||||
"language": "python",
|
||||
"name": "conda-env-py37_pytorch-py"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.7"
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "753865967678a92dbce7d7efbd36d980",
|
||||
"translation_date": "2025-08-31T15:17:09+00:00",
|
||||
"source_file": "lessons/5-NLP/18-Transformers/TransformersPyTorch.ipynb",
|
||||
"language_code": "hi"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 4
|
||||
}
|
||||
|
|
@ -0,0 +1,819 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# рдзреНрдпрд╛рди рддрдВрддреНрд░ рдФрд░ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░реНрд╕\n",
|
||||
"\n",
|
||||
"рдкреБрдирд░рд╛рд╡рд░реНрддреА рдиреЗрдЯрд╡рд░реНрдХреНрд╕ (Recurrent Networks) рдХреА рдПрдХ рдмрдбрд╝реА рдХрдореА рдпрд╣ рд╣реИ рдХрд┐ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рд╕рднреА рд╢рдмреНрджреЛрдВ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдкрд░ рд╕рдорд╛рди рдкреНрд░рднрд╛рд╡ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдирд╛рдорд┐рдд рдЗрдХрд╛рдИ рдкрд╣рдЪрд╛рди (Named Entity Recognition) рдФрд░ рдорд╢реАрди рдЕрдиреБрд╡рд╛рдж (Machine Translation) рдЬреИрд╕реЗ рдЕрдиреБрдХреНрд░рдо-рд╕реЗ-рдЕрдиреБрдХреНрд░рдо рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ LSTM рдПрдиреНрдХреЛрдбрд░-рдбрд┐рдХреЛрдбрд░ рдореЙрдбрд▓реНрд╕ рдХреЗ рд╕рд╛рде рдЙрдк-рдЗрд╖реНрдЯрддрдо рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдореЗрдВ, рдЗрдирдкреБрдЯ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдХреБрдЫ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╢рдмреНрджреЛрдВ рдХрд╛ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рдЕрдиреНрдп рд╢рдмреНрджреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡ рд╣реЛрддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"рдорд╢реАрди рдЕрдиреБрд╡рд╛рдж рдЬреИрд╕реЗ рдЕрдиреБрдХреНрд░рдо-рд╕реЗ-рдЕрдиреБрдХреНрд░рдо рдореЙрдбрд▓ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЗрд╕реЗ рджреЛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдиреЗрдЯрд╡рд░реНрдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ (**рдПрдиреНрдХреЛрдбрд░**) рдЗрдирдкреБрдЯ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдЫрд┐рдкреА рд╣реБрдИ рд╕реНрдерд┐рддрд┐ (hidden state) рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдкрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдиреЗрдЯрд╡рд░реНрдХ (**рдбрд┐рдХреЛрдбрд░**) рдЗрд╕ рдЫрд┐рдкреА рд╣реБрдИ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдиреБрд╡рд╛рджрд┐рдд рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рдмрджрд▓рддрд╛ рд╣реИред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдиреЗрдЯрд╡рд░реНрдХ рдХреА рдЕрдВрддрд┐рдо рд╕реНрдерд┐рддрд┐ рдХреЛ рд╡рд╛рдХреНрдп рдХреА рд╢реБрд░реБрдЖрдд рдХреЛ рдпрд╛рдж рд░рдЦрдиреЗ рдореЗрдВ рдХрдард┐рдирд╛рдИ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд▓рдВрдмреЗ рд╡рд╛рдХреНрдпреЛрдВ рдкрд░ рдореЙрдбрд▓ рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдЦрд░рд╛рдм рд╣реЛ рдЬрд╛рддреА рд╣реИред\n",
|
||||
"\n",
|
||||
"**рдзреНрдпрд╛рди рддрдВрддреНрд░ (Attention Mechanisms)** рдкреНрд░рддреНрдпреЗрдХ рдЗрдирдкреБрдЯ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд╕рдВрджрд░реНрдн рдкреНрд░рднрд╛рд╡ рдХреЛ RNN рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЖрдЙрдЯрдкреБрдЯ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдкрд░ рднрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рд╛рдзрди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрдирдкреБрдЯ RNN рдХреА рдордзреНрдпрд╡рд░реНрддреА рдЕрд╡рд╕реНрдерд╛рдУрдВ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ RNN рдХреЗ рдмреАрдЪ рд╢реЙрд░реНрдЯрдХрдЯреНрд╕ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЬрдм рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рддреАрдХ $y_t$ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╕рднреА рдЗрдирдкреБрдЯ рдЫрд┐рдкреА рд╣реБрдИ рдЕрд╡рд╕реНрдерд╛рдУрдВ $h_i$ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рднрд╛рд░ рдЧреБрдгрд╛рдВрдХ $\\alpha_{t,i}$ рдХреЗ рд╕рд╛рде рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗрдВрдЧреЗред\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"*[Bahdanau et al., 2015](https://arxiv.org/pdf/1409.0473.pdf) рдореЗрдВ рдПрдбрд┐рдЯрд┐рд╡ рдзреНрдпрд╛рди рддрдВрддреНрд░ рдХреЗ рд╕рд╛рде рдПрдиреНрдХреЛрдбрд░-рдбрд┐рдХреЛрдбрд░ рдореЙрдбрд▓, [рдЗрд╕ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ](https://lilianweng.github.io/lil-log/2018/06/24/attention-attention.html) рд╕реЗ рдЙрджреНрдзреГрдд*\n",
|
||||
"\n",
|
||||
"рдзреНрдпрд╛рди рдореИрдЯреНрд░рд┐рдХреНрд╕ $\\{\\alpha_{i,j}\\}$ рдпрд╣ рджрд░реНрд╢рд╛рдПрдЧрд╛ рдХрд┐ рдЖрдЙрдЯрдкреБрдЯ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рд╢рдмреНрдж рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рдХреМрди рд╕реЗ рдЗрдирдкреБрдЯ рд╢рдмреНрдж рдХрд┐рддрдиреА рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддреЗ рд╣реИрдВред рдиреАрдЪреЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"*[Bahdanau et al., 2015](https://arxiv.org/pdf/1409.0473.pdf) (Fig.3) рд╕реЗ рд▓реА рдЧрдИ рдЖрдХреГрддрд┐]*\n",
|
||||
"\n",
|
||||
"рдзреНрдпрд╛рди рддрдВрддреНрд░ рдкреНрд░рд╛рдХреГрддрд┐рдХ рднрд╛рд╖рд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг (Natural Language Processing) рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдпрд╛ рдирд┐рдХрдЯ рд╡рд░реНрддрдорд╛рди рдХреА рдЕрддреНрдпрд╛рдзреБрдирд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдзреНрдпрд╛рди рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдореЙрдбрд▓ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрд╛рдлреА рд╡реГрджреНрдзрд┐ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ RNNs рдХреЗ рд╕рд╛рде рд╕реНрдХреЗрд▓рд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛рдПрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВред RNNs рдХреЛ рд╕реНрдХреЗрд▓ рдХрд░рдиреЗ рдХреА рдПрдХ рдкреНрд░рдореБрдЦ рдмрд╛рдзрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдореЙрдбрд▓ рдХреА рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкреНрд░рдХреГрддрд┐ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЛ рдмреИрдЪ рдФрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдмрдирд╛рдиреЗ рдореЗрдВ рдЪреБрдиреМрддреАрдкреВрд░реНрдг рдмрдирд╛рддреА рд╣реИред RNN рдореЗрдВ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЛ рдХреНрд░рдорд┐рдХ рдХреНрд░рдо рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ред\n",
|
||||
"\n",
|
||||
"рдзреНрдпрд╛рди рддрдВрддреНрд░реЛрдВ рдХреЛ рдЕрдкрдирд╛рдиреЗ рдФрд░ рдЗрд╕ рдмрд╛рдзрд╛ рдиреЗ рдЙрди рдЕрддреНрдпрд╛рдзреБрдирд┐рдХ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдореЙрдбрд▓реЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдорд╛рд░реНрдЧ рдкреНрд░рд╢рд╕реНрдд рдХрд┐рдпрд╛, рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдЖрдЬ BERT рд╕реЗ OpenGPT3 рддрдХ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"## рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдореЙрдбрд▓реНрд╕\n",
|
||||
"\n",
|
||||
"рдкрд┐рдЫрд▓реА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдЕрдЧрд▓реЗ рдореВрд▓реНрдпрд╛рдВрдХрди рдЪрд░рдг рдореЗрдВ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, **рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдореЙрдбрд▓реНрд╕** **рдкреЛрдЬрд┐рд╢рдирд▓ рдПрдиреНрдХреЛрдбрд┐рдВрдЧреНрд╕** рдФрд░ **рдзреНрдпрд╛рди** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рджрд┐рдП рдЧрдП рдЗрдирдкреБрдЯ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдПрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкрд╛рда рд╡рд┐рдВрдбреЛ рдХреЗ рднреАрддрд░ рдХреИрдкреНрдЪрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдиреАрдЪреЗ рджреА рдЧрдИ рдЫрд╡рд┐ рджрд┐рдЦрд╛рддреА рд╣реИ рдХрд┐ рдкреЛрдЬрд┐рд╢рдирд▓ рдПрдиреНрдХреЛрдбрд┐рдВрдЧреНрд╕ рдФрд░ рдзреНрдпрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рд╡рд┐рдВрдбреЛ рдХреЗ рднреАрддрд░ рд╕рдВрджрд░реНрдн рдХреЛ рдХреИрд╕реЗ рдХреИрдкреНрдЪрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"рдЪреВрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЗрдирдкреБрдЯ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдерд┐рддрд┐ рдкрд░ рдореИрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░реНрд╕ RNNs рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмреЗрд╣рддрд░ рд╕рдорд╛рдирд╛рдВрддрд░рддрд╛ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдмрдбрд╝реЗ рдФрд░ рдЕрдзрд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдкреВрд░реНрдг рднрд╛рд╖рд╛ рдореЙрдбрд▓ рд╕рдХреНрд╖рдо рд╣реЛрддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдзреНрдпрд╛рди рд╣реЗрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢рдмреНрджреЛрдВ рдХреЗ рдмреАрдЪ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдкреНрд░рд╛рдХреГрддрд┐рдХ рднрд╛рд╖рд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"## рд╕рд░рд▓ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдореЙрдбрд▓ рдмрдирд╛рдирд╛\n",
|
||||
"\n",
|
||||
"Keras рдореЗрдВ рдмрд┐рд▓реНрдЯ-рдЗрди рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рд▓реЗрдпрд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ рдХреА рддрд░рд╣, рд╣рдо AG News рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЗ рдЯреЗрдХреНрд╕реНрдЯ рд╡рд░реНрдЧреАрдХрд░рдг рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдореЙрдбрд▓ рдЕрдзрд┐рдХ рдХрдард┐рди NLP рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import tensorflow as tf\n",
|
||||
"from tensorflow import keras\n",
|
||||
"import tensorflow_datasets as tfds\n",
|
||||
"import numpy as np\n",
|
||||
"\n",
|
||||
"ds_train, ds_test = tfds.load('ag_news_subset').values()\n",
|
||||
"\n",
|
||||
"def extract_text(x):\n",
|
||||
" return x['title']+' '+x['description']\n",
|
||||
"\n",
|
||||
"def tupelize(x):\n",
|
||||
" return (extract_text(x),x['label'])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдХреЗрд░рд╕ рдореЗрдВ рдирдИ рд▓реЗрдпрд░реНрд╕ рдХреЛ `Layer` рдХреНрд▓рд╛рд╕ рдХреЛ рд╕рдмрдХреНрд▓рд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ `call` рдореЗрдердб рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЪрд▓рд┐рдП **Positional Embedding** рд▓реЗрдпрд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо [рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдХреЗрд░рд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝](https://keras.io/examples/nlp/text_classification_with_transformer/) рд╕реЗ рдХреБрдЫ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд╣рдо рдорд╛рди рд▓реЗрдВрдЧреЗ рдХрд┐ рд╣рдо рд╕рднреА рдЗрдирдкреБрдЯ рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЛ `maxlen` рд▓рдВрдмрд╛рдИ рддрдХ рдкреИрдб рдХрд░рддреЗ рд╣реИрдВред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class TokenAndPositionEmbedding(keras.layers.Layer):\n",
|
||||
" def __init__(self, maxlen, vocab_size, embed_dim):\n",
|
||||
" super(TokenAndPositionEmbedding, self).__init__()\n",
|
||||
" self.token_emb = keras.layers.Embedding(input_dim=vocab_size, output_dim=embed_dim)\n",
|
||||
" self.pos_emb = keras.layers.Embedding(input_dim=maxlen, output_dim=embed_dim)\n",
|
||||
" self.maxlen = maxlen\n",
|
||||
"\n",
|
||||
" def call(self, x):\n",
|
||||
" maxlen = self.maxlen\n",
|
||||
" positions = tf.range(start=0, limit=maxlen, delta=1)\n",
|
||||
" positions = self.pos_emb(positions)\n",
|
||||
" x = self.token_emb(x)\n",
|
||||
" return x+positions"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдпрд╣ рд▓реЗрдпрд░ рджреЛ `Embedding` рд▓реЗрдпрд░реНрд╕ рд╕реЗ рдмрдиреА рд╣реЛрддреА рд╣реИ: рдПрдХ рдЯреЛрдХрди рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдЪрд░реНрдЪрд╛ рдХреА рд╣реИ) рдФрд░ рджреВрд╕рд░реА рдЯреЛрдХрди рдХреА рдкреЛрдЬреАрд╢рди рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЯреЛрдХрди рдХреА рдкреЛрдЬреАрд╢рди рдХреЛ 0 рд╕реЗ `maxlen` рддрдХ рдХреЗ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЗ рд░реВрдк рдореЗрдВ `tf.range` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд▓реЗрдпрд░ рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж, рджреЛ рдкреНрд░рд╛рдкреНрдд рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд╡реЗрдХреНрдЯрд░ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЗрдирдкреБрдЯ рдХрд╛ рдкреЛрдЬреАрд╢рдирд▓реА-рдПрдореНрдмреЗрдбреЗрдб рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рддреИрдпрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЖрдХрд╛рд░ `maxlen`$\\times$`embed_dim` рд╣реЛрддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"рдЕрдм, рдЖрдЗрдП рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдмреНрд▓реЙрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВред рдпрд╣ рдкрд╣рд▓реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд▓реЗрдпрд░ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рд▓реЗрдЧрд╛:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class TransformerBlock(keras.layers.Layer):\n",
|
||||
" def __init__(self, embed_dim, num_heads, ff_dim, rate=0.1):\n",
|
||||
" super(TransformerBlock, self).__init__()\n",
|
||||
" self.att = keras.layers.MultiHeadAttention(num_heads=num_heads, key_dim=embed_dim, name='attn')\n",
|
||||
" self.ffn = keras.Sequential(\n",
|
||||
" [keras.layers.Dense(ff_dim, activation=\"relu\"), keras.layers.Dense(embed_dim),]\n",
|
||||
" )\n",
|
||||
" self.layernorm1 = keras.layers.LayerNormalization(epsilon=1e-6)\n",
|
||||
" self.layernorm2 = keras.layers.LayerNormalization(epsilon=1e-6)\n",
|
||||
" self.dropout1 = keras.layers.Dropout(rate)\n",
|
||||
" self.dropout2 = keras.layers.Dropout(rate)\n",
|
||||
"\n",
|
||||
" def call(self, inputs, training):\n",
|
||||
" attn_output = self.att(inputs, inputs)\n",
|
||||
" attn_output = self.dropout1(attn_output, training=training)\n",
|
||||
" out1 = self.layernorm1(inputs + attn_output)\n",
|
||||
" ffn_output = self.ffn(out1)\n",
|
||||
" ffn_output = self.dropout2(ffn_output, training=training)\n",
|
||||
" return self.layernorm2(out1 + ffn_output)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдЕрдм, рд╣рдо рдкреВрд░рд╛ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдореЙрдбрд▓ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Model: \"sequential_1\"\n",
|
||||
"_________________________________________________________________\n",
|
||||
"Layer (type) Output Shape Param # \n",
|
||||
"=================================================================\n",
|
||||
"text_vectorization (TextVect (None, 256) 0 \n",
|
||||
"_________________________________________________________________\n",
|
||||
"token_and_position_embedding (None, 256, 32) 648192 \n",
|
||||
"_________________________________________________________________\n",
|
||||
"transformer_block (Transform (None, 256, 32) 10656 \n",
|
||||
"_________________________________________________________________\n",
|
||||
"global_average_pooling1d (Gl (None, 32) 0 \n",
|
||||
"_________________________________________________________________\n",
|
||||
"dropout_2 (Dropout) (None, 32) 0 \n",
|
||||
"_________________________________________________________________\n",
|
||||
"dense_2 (Dense) (None, 20) 660 \n",
|
||||
"_________________________________________________________________\n",
|
||||
"dropout_3 (Dropout) (None, 20) 0 \n",
|
||||
"_________________________________________________________________\n",
|
||||
"dense_3 (Dense) (None, 4) 84 \n",
|
||||
"=================================================================\n",
|
||||
"Total params: 659,592\n",
|
||||
"Trainable params: 659,592\n",
|
||||
"Non-trainable params: 0\n",
|
||||
"_________________________________________________________________\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"embed_dim = 32 # Embedding size for each token\n",
|
||||
"num_heads = 2 # Number of attention heads\n",
|
||||
"ff_dim = 32 # Hidden layer size in feed forward network inside transformer\n",
|
||||
"maxlen = 256\n",
|
||||
"vocab_size = 20000\n",
|
||||
"\n",
|
||||
"model = keras.models.Sequential([\n",
|
||||
" keras.layers.experimental.preprocessing.TextVectorization(max_tokens=vocab_size,output_sequence_length=maxlen, input_shape=(1,)),\n",
|
||||
" TokenAndPositionEmbedding(maxlen, vocab_size, embed_dim),\n",
|
||||
" TransformerBlock(embed_dim, num_heads, ff_dim),\n",
|
||||
" keras.layers.GlobalAveragePooling1D(),\n",
|
||||
" keras.layers.Dropout(0.1),\n",
|
||||
" keras.layers.Dense(20, activation=\"relu\"),\n",
|
||||
" keras.layers.Dropout(0.1),\n",
|
||||
" keras.layers.Dense(4, activation=\"softmax\")\n",
|
||||
"])\n",
|
||||
"\n",
|
||||
"model.summary()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Training tokenizer\n",
|
||||
"938/938 [==============================] - 45s 39ms/step - loss: 0.4978 - acc: 0.8068 - val_loss: 0.2808 - val_acc: 0.9124\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<tensorflow.python.keras.callbacks.History at 0x7f9c2427a0d0>"
|
||||
]
|
||||
},
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"print('Training tokenizer')\n",
|
||||
"model.layers[0].adapt(ds_train.map(extract_text))\n",
|
||||
"model.compile(loss='sparse_categorical_crossentropy',metrics=['acc'], optimizer='adam')\n",
|
||||
"model.fit(ds_train.map(tupelize).batch(128),validation_data=ds_test.map(tupelize).batch(128))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## BERT рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдореЙрдбрд▓реНрд╕\n",
|
||||
"\n",
|
||||
"**BERT** (Bidirectional Encoder Representations from Transformers) рдПрдХ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдорд▓реНрдЯреА-рд▓реЗрдпрд░ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдиреЗрдЯрд╡рд░реНрдХ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ *BERT-base* рдХреЗ рд▓рд┐рдП 12 рд▓реЗрдпрд░реНрд╕ рдФрд░ *BERT-large* рдХреЗ рд▓рд┐рдП 24 рд▓реЗрдпрд░реНрд╕ рд╣реЛрддреА рд╣реИрдВред рдЗрд╕ рдореЙрдбрд▓ рдХреЛ рдкрд╣рд▓реЗ рдмрдбрд╝реЗ рдЯреЗрдХреНрд╕реНрдЯ рдбреЗрдЯрд╛ (WikiPedia + рдХрд┐рддрд╛рдмреЗрдВ) рдХреЗ рдХреЙрд░реНрдкрд╕ рдкрд░ рдЕрдирд╕реБрдкрд░рд╡рд╛рдЗрдЬреНрдб рдЯреНрд░реЗрдирд┐рдВрдЧ (рдПрдХ рд╡рд╛рдХреНрдп рдореЗрдВ рдЫреБрдкреЗ рд╣реБрдП рд╢рдмреНрджреЛрдВ рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдирд╛) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░реА-рдЯреНрд░реЗрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░реА-рдЯреНрд░реЗрдирд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди, рдореЙрдбрд▓ рднрд╛рд╖рд╛ рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреНрд╖рдорддрд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдлрд┐рд░ рдЕрдиреНрдп рдбреЗрдЯрд╛ рд╕реЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдлрд╛рдЗрди-рдЯреНрдпреВрдирд┐рдВрдЧ рдХреЗ рдЬрд░рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ **рдЯреНрд░рд╛рдВрд╕рдлрд░ рд▓рд░реНрдирд┐рдВрдЧ** рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред \n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"BERT, DistilBERT, BigBird, OpenGPT3 рдФрд░ рдЕрдиреНрдп рдЬреИрд╕реЗ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рдХрдИ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдлрд╛рдЗрди-рдЯреНрдпреВрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред \n",
|
||||
"\n",
|
||||
"рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдо рдкреНрд░реА-рдЯреНрд░реЗрди рдХрд┐рдП рдЧрдП BERT рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреА рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╕реАрдХреНрд╡реЗрдВрд╕ рдХреНрд▓рд╛рд╕рд┐рдлрд┐рдХреЗрд╢рди рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо [рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдбрд╛рдХреНрдпреВрдореЗрдВрдЯреЗрд╢рди](https://www.tensorflow.org/text/tutorials/classify_text_with_bert) рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдФрд░ рдХреБрдЫ рдХреЛрдб рдЙрдзрд╛рд░ рд▓реЗрдВрдЧреЗред\n",
|
||||
"\n",
|
||||
"рдкреНрд░реА-рдЯреНрд░реЗрди рдХрд┐рдП рдЧрдП рдореЙрдбрд▓реНрд╕ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо **Tensorflow hub** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП BERT-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬрд╝рд░ рд▓реЛрдб рдХрд░реЗрдВ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"ename": "ModuleNotFoundError",
|
||||
"evalue": "No module named 'tensorflow_text'",
|
||||
"output_type": "error",
|
||||
"traceback": [
|
||||
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
|
||||
"\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)",
|
||||
"\u001b[1;32m~\\AppData\\Local\\Temp/ipykernel_41180/4216669875.py\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mimport\u001b[0m \u001b[0mtensorflow_text\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mtensorflow_hub\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mhub\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[0mvectorizer\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mhub\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mKerasLayer\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
|
||||
"\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'tensorflow_text'"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import tensorflow_text \n",
|
||||
"import tensorflow_hub as hub\n",
|
||||
"vectorizer = hub.KerasLayer('https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{'input_type_ids': <tf.Tensor: shape=(1, 128), dtype=int32, numpy=\n",
|
||||
" array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]],\n",
|
||||
" dtype=int32)>,\n",
|
||||
" 'input_word_ids': <tf.Tensor: shape=(1, 128), dtype=int32, numpy=\n",
|
||||
" array([[ 101, 1045, 2293, 19081, 102, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0]], dtype=int32)>,\n",
|
||||
" 'input_mask': <tf.Tensor: shape=(1, 128), dtype=int32, numpy=\n",
|
||||
" array([[1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
||||
" 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]],\n",
|
||||
" dtype=int32)>}"
|
||||
]
|
||||
},
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"vectorizer(['I love transformers'])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдпрд╣ рдЬрд╝рд░реВрд░реА рд╣реИ рдХрд┐ рдЖрдк рд╡рд╣реА vectorizer рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ рдЬреЛ рдореВрд▓ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдЯреНрд░реЗрдирд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╕рд╛рде рд╣реА, BERT vectorizer рддреАрди рдШрдЯрдХ рд▓реМрдЯрд╛рддрд╛ рд╣реИ:\n",
|
||||
"* `input_word_ids`, рдЬреЛ рдЗрдирдкреБрдЯ рд╡рд╛рдХреНрдп рдХреЗ рд▓рд┐рдП рдЯреЛрдХрди рдирдВрдмрд░реЛрдВ рдХрд╛ рдЕрдиреБрдХреНрд░рдо рд╣реИ\n",
|
||||
"* `input_mask`, рдЬреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЕрдиреБрдХреНрд░рдо рдХрд╛ рдХреМрди рд╕рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЗрдирдкреБрдЯ рд╣реИ рдФрд░ рдХреМрди рд╕рд╛ padding рд╣реИред рдпрд╣ `Masking` рд▓реЗрдпрд░ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдорд╛рд╕реНрдХ рдХреЗ рд╕рдорд╛рди рд╣реИ\n",
|
||||
"* `input_type_ids` рднрд╛рд╖рд╛ рдореЙрдбрд▓рд┐рдВрдЧ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рджреЛ рдЗрдирдкреБрдЯ рд╡рд╛рдХреНрдпреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо BERT рдлреАрдЪрд░ рдПрдХреНрд╕рдЯреНрд░реИрдХреНрдЯрд░ рдХреЛ instantiate рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"bert = hub.KerasLayer('https://tfhub.dev/tensorflow/small_bert/bert_en_uncased_L-4_H-128_A-2/1')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"pooled_output -> (1, 128)\n",
|
||||
"encoder_outputs -> 4\n",
|
||||
"sequence_output -> (1, 128, 128)\n",
|
||||
"default -> (1, 128)\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"z = bert(vectorizer(['I love transformers']))\n",
|
||||
"for i,x in z.items():\n",
|
||||
" print(f\"{i} -> { len(x) if isinstance(x, list) else x.shape }\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рддреЛ, BERT рд▓реЗрдпрд░ рдХрдИ рдЙрдкрдпреЛрдЧреА рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рддреА рд╣реИ:\n",
|
||||
"* `pooled_output` рдкреВрд░реЗ рдЕрдиреБрдХреНрд░рдо рдХреЗ рд╕рднреА рдЯреЛрдХрди рдХрд╛ рдФрд╕рдд рдирд┐рдХрд╛рд▓рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИред рдЗрд╕реЗ рдкреВрд░реЗ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рдПрдХ рдмреБрджреНрдзрд┐рдорд╛рди рдЕрд░реНрдердкреВрд░реНрдг рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╣рдорд╛рд░реЗ рдкрд┐рдЫрд▓реЗ рдореЙрдбрд▓ рдореЗрдВ `GlobalAveragePooling1D` рд▓реЗрдпрд░ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд╕рдордХрдХреНрд╖ рд╣реИред\n",
|
||||
"* `sequence_output` рдЕрдВрддрд┐рдо рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рд▓реЗрдпрд░ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рд╣реИ (рдЬреЛ рд╣рдорд╛рд░реЗ рдКрдкрд░ рджрд┐рдП рдЧрдП рдореЙрдбрд▓ рдореЗрдВ `TransformerBlock` рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ)ред\n",
|
||||
"* `encoder_outputs` рд╕рднреА рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рд▓реЗрдпрд░реНрд╕ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рд╣реИрдВред рдЪреВрдВрдХрд┐ рд╣рдордиреЗ 4-рд▓реЗрдпрд░ BERT рдореЙрдбрд▓ рд▓реЛрдб рдХрд┐рдпрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╢рд╛рдпрдж рдирд╛рдо рд╕реЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ `4_H` рд╢рд╛рдорд┐рд▓ рд╣реИ), рдЗрд╕рдореЗрдВ 4 рдЯреЗрдиреНрд╕рд░ рд╣реИрдВред рдЕрдВрддрд┐рдо рдЯреЗрдиреНрд╕рд░ `sequence_output` рдХреЗ рд╕рдорд╛рди рд╣реИред\n",
|
||||
"\n",
|
||||
"рдЕрдм рд╣рдо рдПрдВрдб-рдЯреВ-рдПрдВрдб рдХреНрд▓рд╛рд╕рд┐рдлрд┐рдХреЗрд╢рди рдореЙрдбрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗред рд╣рдо *рдлрдВрдХреНрд╢рдирд▓ рдореЙрдбрд▓ рдбрд┐рдлрд┐рдирд┐рд╢рди* рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдореЙрдбрд▓ рдХрд╛ рдЗрдирдкреБрдЯ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рдлрд┐рд░ рдЗрд╕рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ рдкреНрд░рджрд╛рди рдХрд░реЗрдВрдЧреЗред рд╣рдо BERT рдореЙрдбрд▓ рдХреЗ рд╡реЗрдЯреНрд╕ рдХреЛ рдЯреНрд░реЗрди рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдХреЗрд╡рд▓ рдЕрдВрддрд┐рдо рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░ рдХреЛ рдЯреНрд░реЗрди рдХрд░реЗрдВрдЧреЗ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Model: \"model\"\n",
|
||||
"__________________________________________________________________________________________________\n",
|
||||
"Layer (type) Output Shape Param # Connected to \n",
|
||||
"==================================================================================================\n",
|
||||
"input_1 (InputLayer) [(None,)] 0 \n",
|
||||
"__________________________________________________________________________________________________\n",
|
||||
"keras_layer (KerasLayer) {'input_type_ids': ( 0 input_1[0][0] \n",
|
||||
"__________________________________________________________________________________________________\n",
|
||||
"keras_layer_1 (KerasLayer) {'pooled_output': (N 4782465 keras_layer[0][0] \n",
|
||||
" keras_layer[0][1] \n",
|
||||
" keras_layer[0][2] \n",
|
||||
"__________________________________________________________________________________________________\n",
|
||||
"dropout_4 (Dropout) (None, 128) 0 keras_layer_1[0][5] \n",
|
||||
"__________________________________________________________________________________________________\n",
|
||||
"dense_4 (Dense) (None, 4) 516 dropout_4[0][0] \n",
|
||||
"==================================================================================================\n",
|
||||
"Total params: 4,782,981\n",
|
||||
"Trainable params: 516\n",
|
||||
"Non-trainable params: 4,782,465\n",
|
||||
"__________________________________________________________________________________________________\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"inp = keras.Input(shape=(),dtype=tf.string)\n",
|
||||
"x = vectorizer(inp)\n",
|
||||
"x = bert(x)\n",
|
||||
"x = keras.layers.Dropout(0.1)(x['pooled_output'])\n",
|
||||
"out = keras.layers.Dense(4,activation='softmax')(x)\n",
|
||||
"model = keras.models.Model(inp,out)\n",
|
||||
"bert.trainable = False\n",
|
||||
"model.summary()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"938/938 [==============================] - 528s 559ms/step - loss: 0.8056 - acc: 0.6983 - val_loss: 0.5953 - val_acc: 0.7888\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<tensorflow.python.keras.callbacks.History at 0x7f9bb1e36d00>"
|
||||
]
|
||||
},
|
||||
"execution_count": 11,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"model.compile(loss='sparse_categorical_crossentropy',metrics=['acc'], optimizer='adam')\n",
|
||||
"model.fit(ds_train.map(tupelize).batch(128),validation_data=ds_test.map(tupelize).batch(128))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЯреНрд░реЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рдмрд╣реБрдд рдХрдо рд╣реИрдВ, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛рдлреА рдзреАрдореА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ BERT рдлреАрдЪрд░ рдПрдХреНрд╕рдЯреНрд░реИрдХреНрдЯрд░ рдЧрдгрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рднрд╛рд░реА рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЙрдЪрд┐рдд рд╕рдЯреАрдХрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд░рд╣реЗ, рдпрд╛ рддреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг, рдпрд╛ рдореЙрдбрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдгред\n",
|
||||
"\n",
|
||||
"рдЖрдЗрдП BERT рд╡реЗрдЯреНрд╕ рдХреЛ рдЕрдирдлреНрд░реАрдЬрд╝ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рднреА рдЯреНрд░реЗрди рдХрд░реЗрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЫреЛрдЯреЗ рд▓рд░реНрдирд┐рдВрдЧ рд░реЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рд╕рд╛рде рд╣реА **рд╡рд╛рд░реНрдордЕрдк** рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд░рдгрдиреАрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ **AdamW** рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо `tf-models-official` рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдмрдирд╛рдПрдВрдЧреЗ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 12,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Model: \"model\"\n",
|
||||
"__________________________________________________________________________________________________\n",
|
||||
"Layer (type) Output Shape Param # Connected to \n",
|
||||
"==================================================================================================\n",
|
||||
"input_1 (InputLayer) [(None,)] 0 \n",
|
||||
"__________________________________________________________________________________________________\n",
|
||||
"keras_layer (KerasLayer) {'input_type_ids': ( 0 input_1[0][0] \n",
|
||||
"__________________________________________________________________________________________________\n",
|
||||
"keras_layer_1 (KerasLayer) {'pooled_output': (N 4782465 keras_layer[0][0] \n",
|
||||
" keras_layer[0][1] \n",
|
||||
" keras_layer[0][2] \n",
|
||||
"__________________________________________________________________________________________________\n",
|
||||
"dropout_4 (Dropout) (None, 128) 0 keras_layer_1[0][5] \n",
|
||||
"__________________________________________________________________________________________________\n",
|
||||
"dense_4 (Dense) (None, 4) 516 dropout_4[0][0] \n",
|
||||
"==================================================================================================\n",
|
||||
"Total params: 4,782,981\n",
|
||||
"Trainable params: 4,782,980\n",
|
||||
"Non-trainable params: 1\n",
|
||||
"__________________________________________________________________________________________________\n",
|
||||
"938/938 [==============================] - 629s 664ms/step - loss: 0.6344 - acc: 0.7658 - val_loss: 0.4876 - val_acc: 0.8247\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<tensorflow.python.keras.callbacks.History at 0x7f9bb0bd0070>"
|
||||
]
|
||||
},
|
||||
"execution_count": 12,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"from official.nlp import optimization \n",
|
||||
"bert.trainable=True\n",
|
||||
"model.summary()\n",
|
||||
"epochs = 3\n",
|
||||
"opt = optimization.create_optimizer(\n",
|
||||
" init_lr=3e-5,\n",
|
||||
" num_train_steps=epochs*len(ds_train),\n",
|
||||
" num_warmup_steps=0.1*epochs*len(ds_train),\n",
|
||||
" optimizer_type='adamw')\n",
|
||||
"\n",
|
||||
"model.compile(loss='sparse_categorical_crossentropy',metrics=['acc'], optimizer=opt)\n",
|
||||
"model.fit(ds_train.map(tupelize).batch(128),validation_data=ds_test.map(tupelize).batch(128))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХрд╛рдлреА рдзреАрдореА рдЧрддрд┐ рд╕реЗ рд╣реЛрддрд╛ рд╣реИ - рд▓реЗрдХрд┐рди рдЖрдк рдХреБрдЫ epochs (5-10) рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рддрд░реАрдХреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"## Huggingface Transformers рд▓рд╛рдЗрдмреНрд░реЗрд░реА\n",
|
||||
"\n",
|
||||
"Transformer рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рдмрд╣реБрдд рд╕рд╛рдорд╛рдиреНрдп (рдФрд░ рдереЛрдбрд╝рд╛ рд╕рд░рд▓) рддрд░реАрдХрд╛ [HuggingFace рдкреИрдХреЗрдЬ](https://github.com/huggingface/) рд╣реИ, рдЬреЛ рд╡рд┐рднрд┐рдиреНрди NLP рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдмреНрд▓реЙрдХреНрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ Tensorflow рдФрд░ PyTorch, рдПрдХ рдЕрдиреНрдп рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдп рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ, рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИред\n",
|
||||
"\n",
|
||||
"> **Note**: рдпрджрд┐ рдЖрдк рдпрд╣ рджреЗрдЦрдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рдирд╣реАрдВ рд░рдЦрддреЗ рдХрд┐ Transformers рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ - рддреЛ рдЖрдк рдЗрд╕ рдиреЛрдЯрдмреБрдХ рдХреЗ рдЕрдВрдд рддрдХ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдКрдкрд░ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдХреБрдЫ рднреА рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рджреЗрдЦреЗрдВрдЧреЗред рд╣рдо BERT рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдЙрдиреНрд╣реАрдВ рдЪрд░рдгреЛрдВ рдХреЛ рджреЛрд╣рд░рд╛рдПрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрд▓рдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рдХрд╛рдлреА рдмрдбрд╝реЗ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЗрд╕рд▓рд┐рдП, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХреБрдЫ рд▓рдВрдмрд╛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╢рд╛рдорд┐рд▓ рд╣реИ, рддреЛ рдЖрдк рдХреЗрд╡рд▓ рдХреЛрдб рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред\n",
|
||||
"\n",
|
||||
"рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рд╕рдорд╕реНрдпрд╛ [Huggingface Transformers](http://huggingface.co) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреИрд╕реЗ рд╣рд▓ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╣рдореЗрдВ рдЙрд╕ рдореЙрдбрд▓ рдХреЛ рдЪреБрдирдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕реЗ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдХреБрдЫ рдмрд┐рд▓реНрдЯ-рдЗрди рдореЙрдбрд▓реНрд╕ рдХреЗ рдЕрд▓рд╛рд╡рд╛, Huggingface рдореЗрдВ рдПрдХ [рдСрдирд▓рд╛рдЗрди рдореЙрдбрд▓ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА](https://huggingface.co/models) рднреА рд╣реИ, рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рд╕рдореБрджрд╛рдп рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдФрд░ рднреА рдХрдИ рдкреНрд░реА-рдЯреНрд░реЗрдВрдб рдореЙрдбрд▓ рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЗрди рд╕рднреА рдореЙрдбрд▓реЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдореЙрдбрд▓ рдХрд╛ рдирд╛рдо рджреЗрдХрд░ рд▓реЛрдб рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдмрд╛рдЗрдирд░реА рдлрд╛рдЗрд▓реНрд╕ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рд╣реЛ рдЬрд╛рдПрдВрдЧреАред\n",
|
||||
"\n",
|
||||
"рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ рдореЙрдбрд▓ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдк рдЙрд╕ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рд╕рдВрдмрдВрдзрд┐рдд рдлрд╛рдЗрд▓реНрд╕ рдореМрдЬреВрдж рд╣реЛрдВ, рдЬреИрд╕реЗ рдХрд┐ рдЯреЛрдХрдирд╛рдЗрдЬрд╝рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░, `config.json` рдлрд╛рдЗрд▓ рдЬрд┐рд╕рдореЗрдВ рдореЙрдбрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдВ, рдмрд╛рдЗрдирд░реА рд╡реЗрдЯреНрд╕ рдЖрджрд┐ред\n",
|
||||
"\n",
|
||||
"рдореЙрдбрд▓ рдХреЗ рдирд╛рдо рд╕реЗ, рд╣рдо рдореЙрдбрд▓ рдФрд░ рдЯреЛрдХрдирд╛рдЗрдЬрд╝рд░ рджреЛрдиреЛрдВ рдХреЛ рдЗрдВрд╕реНрдЯреИрдВрд╢рд┐рдПрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЪрд▓рд┐рдП рдЯреЛрдХрдирд╛рдЗрдЬрд╝рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import transformers\n",
|
||||
"\n",
|
||||
"# To load the model from Internet repository using model name. \n",
|
||||
"# Use this if you are running from your own copy of the notebooks\n",
|
||||
"bert_model = 'bert-base-uncased' \n",
|
||||
"\n",
|
||||
"# To load the model from the directory on disk. Use this for Microsoft Learn module, because we have\n",
|
||||
"# prepared all required files for you.\n",
|
||||
"#bert_model = './bert'\n",
|
||||
"\n",
|
||||
"tokenizer = transformers.BertTokenizer.from_pretrained(bert_model)\n",
|
||||
"\n",
|
||||
"MAX_SEQ_LEN = 128\n",
|
||||
"PAD_INDEX = tokenizer.convert_tokens_to_ids(tokenizer.pad_token)\n",
|
||||
"UNK_INDEX = tokenizer.convert_tokens_to_ids(tokenizer.unk_token)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"`tokenizer` рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ `encode` рдлрд╝рдВрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕реАрдзреЗ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдПрдиреНрдХреЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[101, 23435, 12314, 2003, 1037, 2307, 7705, 2005, 17953, 2361, 102]"
|
||||
]
|
||||
},
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"tokenizer.encode('Tensorflow is a great framework for NLP')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рд╣рдо рдЯреЛрдХрдирд╛рдЗрдЬрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдПрдиреНрдХреЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдореЙрдбрд▓ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реЛ, рдЬреИрд╕реЗ `token_ids`, `input_mask` рдлрд╝реАрд▓реНрдбреНрд╕ рдЖрджрд┐ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ред рд╣рдо рдпрд╣ рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо Tensorflow рдЯреЗрдиреНрд╕рд░ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП `return_tensors='tf'` рддрд░реНрдХ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{'input_ids': <tf.Tensor: shape=(1, 5), dtype=int32, numpy=array([[ 101, 7592, 1010, 2045, 102]], dtype=int32)>, 'token_type_ids': <tf.Tensor: shape=(1, 5), dtype=int32, numpy=array([[0, 0, 0, 0, 0]], dtype=int32)>, 'attention_mask': <tf.Tensor: shape=(1, 5), dtype=int32, numpy=array([[1, 1, 1, 1, 1]], dtype=int32)>}"
|
||||
]
|
||||
},
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"tokenizer(['Hello, there'],return_tensors='tf')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдПрдХ рдкреВрд░реНрд╡-рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд BERT рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдЬрд┐рд╕реЗ `bert-base-uncased` рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред *Uncased* рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рдореЙрдбрд▓ рдХреЗрд╕-рд╕реЗрдВрд╕рд┐рдЯрд┐рд╡ рдирд╣реАрдВ рд╣реИред\n",
|
||||
"\n",
|
||||
"рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рдЯреЛрдХрдирд╛рдЗрдЬрд╝ рдХрд┐рдП рдЧрдП рдЕрдиреБрдХреНрд░рдо рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдо рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░реЗрдВрдЧреЗред рдЪреВрдВрдХрд┐ `tokenizer.encode` рдПрдХ Python рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рд╣рдо рдЗрд╕реЗ рдкрд┐рдЫрд▓реЗ рдпреВрдирд┐рдЯ рдХреА рддрд░рд╣ рд╣реА рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рдЗрд╕реЗ `py_function` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 31,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def process(x):\n",
|
||||
" return tokenizer.encode(x.numpy().decode('utf-8'),return_tensors='tf',padding='max_length',max_length=MAX_SEQ_LEN,truncation=True)[0]\n",
|
||||
"\n",
|
||||
"def process_fn(x):\n",
|
||||
" s = x['title']+' '+x['description']\n",
|
||||
" e = tf.py_function(process,inp=[s],Tout=(tf.int32))\n",
|
||||
" e.set_shape(MAX_SEQ_LEN)\n",
|
||||
" return e,x['label']"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдЕрдм рд╣рдо `BertForSequenceClassification` рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЙрдбрд▓ рд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдореЙрдбрд▓ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд░реНрдЧреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЕрдВрддрд┐рдо рд╡рд░реНрдЧреАрдХрд░реНрддрд╛ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред рдЖрдкрдХреЛ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдЕрдВрддрд┐рдо рд╡рд░реНрдЧреАрдХрд░реНрддрд╛ рдХреЗ рд╡рдЬрд╝рди рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдФрд░ рдореЙрдбрд▓ рдХреЛ рдкреВрд░реНрд╡-рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА - рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣реА рд╣рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВ!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 32,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"model = transformers.TFBertForSequenceClassification.from_pretrained(bert_model,num_labels=4,output_attentions=False)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 33,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Model: \"tf_bert_for_sequence_classification_1\"\n",
|
||||
"_________________________________________________________________\n",
|
||||
"Layer (type) Output Shape Param # \n",
|
||||
"=================================================================\n",
|
||||
"bert (TFBertMainLayer) multiple 109482240 \n",
|
||||
"_________________________________________________________________\n",
|
||||
"dropout_75 (Dropout) multiple 0 \n",
|
||||
"_________________________________________________________________\n",
|
||||
"classifier (Dense) multiple 3076 \n",
|
||||
"=================================================================\n",
|
||||
"Total params: 109,485,316\n",
|
||||
"Trainable params: 109,485,316\n",
|
||||
"Non-trainable params: 0\n",
|
||||
"_________________________________________________________________\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"model.summary()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк `summary()` рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдореЙрдбрд▓ рдореЗрдВ рд▓рдЧрднрдЧ 110 рдорд┐рд▓рд┐рдпрди рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ! рд╕рдВрднрд╡рддрдГ, рдпрджрд┐ рд╣рдо рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЫреЛрдЯреЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдкрд░ рд╕рд░рд▓ рд╡рд░реНрдЧреАрдХрд░рдг рдХрд╛рд░реНрдп рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо BERT рдмреЗрд╕ рд▓реЗрдпрд░ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 34,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Model: \"tf_bert_for_sequence_classification_1\"\n",
|
||||
"_________________________________________________________________\n",
|
||||
"Layer (type) Output Shape Param # \n",
|
||||
"=================================================================\n",
|
||||
"bert (TFBertMainLayer) multiple 109482240 \n",
|
||||
"_________________________________________________________________\n",
|
||||
"dropout_75 (Dropout) multiple 0 \n",
|
||||
"_________________________________________________________________\n",
|
||||
"classifier (Dense) multiple 3076 \n",
|
||||
"=================================================================\n",
|
||||
"Total params: 109,485,316\n",
|
||||
"Trainable params: 3,076\n",
|
||||
"Non-trainable params: 109,482,240\n",
|
||||
"_________________________________________________________________\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"model.layers[0].trainable = False\n",
|
||||
"model.summary()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдЕрдм рд╣рдо рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ!\n",
|
||||
"\n",
|
||||
"> **рдиреЛрдЯ**: рдкреВрд░реНрдг-рд╕реНрддрд░реАрдп BERT рдореЙрдбрд▓ рдХрд╛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рдордп рд▓реЗрдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ! рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ 32 рдмреИрдЪреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдХреЗрд╡рд▓ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ рдореЙрдбрд▓ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреИрд╕реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдкреВрд░реНрдг-рд╕реНрддрд░реАрдп рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЖрдЬрд╝рдорд╛рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ - рддреЛ рдмрд╕ `steps_per_epoch` рдФрд░ `validation_steps` рдкреИрд░рд╛рдореАрдЯрд░ рд╣рдЯрд╛ рджреЗрдВ, рдФрд░ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд░рд╣реЗрдВ!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 30,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"32/32 [==============================] - 142s 4s/step - loss: 1.3896 - acc: 0.2500 - val_loss: 1.3863 - val_acc: 0.2480\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<tensorflow.python.keras.callbacks.History at 0x7f1d40a4b6a0>"
|
||||
]
|
||||
},
|
||||
"execution_count": 30,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"model.compile('adam','sparse_categorical_crossentropy',['acc'])\n",
|
||||
"tf.get_logger().setLevel('ERROR')\n",
|
||||
"model.fit(ds_train.map(process_fn).batch(32),validation_data=ds_test.map(process_fn).batch(32),steps_per_epoch=32,validation_steps=2)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"рдпрджрд┐ рдЖрдк iterations рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ, рдкрд░реНрдпрд╛рдкреНрдд рд╕рдордп рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдХрдИ epochs рддрдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ BERT classification рд╣рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рд╕рдЯреАрдХрддрд╛ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛! рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ BERT рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рднрд╛рд╖рд╛ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдХрд╛рдлреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕рдордЭрддрд╛ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдЕрдВрддрд┐рдо classifier рдХреЛ fine-tune рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреНрдпреЛрдВрдХрд┐ BERT рдПрдХ рдмрдбрд╝рд╛ рдореЙрдбрд▓ рд╣реИ, рдкреВрд░рд╛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛рдлреА рд╕рдордп рд▓реЗрддреА рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЧрдВрднреАрд░ computational рд╢рдХреНрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ! (GPU, рдФрд░ рдЕрдзрд┐рдорд╛рдирддрдГ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ).\n",
|
||||
"\n",
|
||||
"> **Note:** рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдордиреЗ рд╕рдмрд╕реЗ рдЫреЛрдЯреЗ pre-trained BERT рдореЙрдбрд▓ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред рдмрдбрд╝реЗ рдореЙрдбрд▓ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ рдЬреЛ рд╕рдВрднрд╡рддрдГ рдмреЗрд╣рддрд░ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## рдореБрдЦреНрдп рдмрд╛рддреЗрдВ\n",
|
||||
"\n",
|
||||
"рдЗрд╕ рдпреВрдирд┐рдЯ рдореЗрдВ, рд╣рдордиреЗ **рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░реНрд╕** рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣рд╛рд▓ рд╣реА рдХреА рдореЙрдбрд▓ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рджреЗрдЦреА рд╣реИрдВред рд╣рдордиреЗ рдЗрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдЯреЗрдХреНрд╕реНрдЯ рд╡рд░реНрдЧреАрдХрд░рдг рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реА рддрд░рд╣, BERT рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдВрдЯрд┐рдЯреА рдПрдХреНрд╕рдЯреНрд░реИрдХреНрд╢рди, рдкреНрд░рд╢реНрди рдЙрддреНрддрд░ рджреЗрдиреЗ рдФрд░ рдЕрдиреНрдп NLP рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред\n",
|
||||
"\n",
|
||||
"рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдореЙрдбрд▓ NLP рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдмрд╕реЗ рдЙрдиреНрдирдд рддрдХрдиреАрдХ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣ рд╡рд╣ рдкрд╣рд▓рд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рдХрд╕реНрдЯрдо NLP рд╕рдорд╛рдзрд╛рди рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп рдкреНрд░рдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рдЖрдк рдЙрдиреНрдирдд рдиреНрдпреВрд░рд▓ рдореЙрдбрд▓ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП рдкреБрдирд░рд╛рд╡рд░реНрддреА рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдореВрд▓рднреВрдд рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рд╕рдордЭрдирд╛ рдЕрддреНрдпрдВрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**рдЕрд╕реНрд╡реАрдХрд░рдг**: \nрдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ AI рдЕрдиреБрд╡рд╛рдж рд╕реЗрд╡рд╛ [Co-op Translator](https://github.com/Azure/co-op-translator) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрдмрдХрд┐ рд╣рдо рд╕рдЯреАрдХрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрдиреБрд╡рд╛рдж рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдпрд╛ рдЕрд╢реБрджреНрдзрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдореВрд▓ рднрд╛рд╖рд╛ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдореВрд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рд╕реНрд░реЛрдд рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдкреЗрд╢реЗрд╡рд░ рдорд╛рдирд╡ рдЕрдиреБрд╡рд╛рдж рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред рдЗрд╕ рдЕрдиреБрд╡рд╛рдж рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд┐рд╕реА рднреА рдЧрд▓рддрдлрд╣рдореА рдпрд╛ рдЧрд▓рдд рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╣рдо рдЬрд┐рдореНрдореЗрджрд╛рд░ рдирд╣реАрдВ рд╣реИрдВред\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"interpreter": {
|
||||
"hash": "0cb620c6d4b9f7a635928804c26cf22403d89d98d79684e4529119355ee6d5a5"
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "py38_tensorflow",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.8.12"
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "ab59c532409774988ab875f2260e8e53",
|
||||
"translation_date": "2025-08-31T15:19:22+00:00",
|
||||
"source_file": "lessons/5-NLP/18-Transformers/TransformersTF.ipynb",
|
||||
"language_code": "hi"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 4
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
LoadingтАж
Reference in New Issue