diff --git a/translated_images/km/.co-op-translator.json b/translated_images/km/.co-op-translator.json new file mode 100644 index 00000000..f0103640 --- /dev/null +++ b/translated_images/km/.co-op-translator.json @@ -0,0 +1,722 @@ +{ + "1200px-Girl_and_cat.89bd70951181e86a.webp": { + "original_hash": "aa8cdeaa9beaad5a06610236cf22f296", + "translation_date": "2026-04-06T20:16:46+00:00", + "source_file": "lessons/4-ComputerVision/11-ObjectDetection/images/1200px-Girl_and_cat.jpg", + "language_code": "km" + }, + "AND-OR-Tree.5592d2c70187f283.webp": { + "original_hash": "2674b6cf8f768491c6b5a167f272a002", + "translation_date": "2026-04-06T20:18:50+00:00", + "source_file": "lessons/2-Symbolic/images/AND-OR-Tree.png", + "language_code": "km" + }, + "ComputeGraph.463c9d8ebdcb2215.webp": { + "original_hash": "7af66742d6bede114f971689745bedf2", + "translation_date": "2026-04-06T20:19:38+00:00", + "source_file": "lessons/3-NeuralNetworks/04-OwnFramework/images/ComputeGraph.png", + "language_code": "km" + }, + "ComputeGraphGrad.4626252c0de03507.webp": { + "original_hash": "b0bf679245a237b1e7785ae2357a5376", + "translation_date": "2026-04-06T20:19:34+00:00", + "source_file": "lessons/3-NeuralNetworks/04-OwnFramework/images/ComputeGraphGrad.png", + "language_code": "km" + }, + "CoreferenceResolution.861924d6d384a7d6.webp": { + "original_hash": "25b5719ec70aaa44858076c16f7c208f", + "translation_date": "2026-04-06T20:20:42+00:00", + "source_file": "lessons/5-NLP/18-Transformers/images/CoreferenceResolution.png", + "language_code": "km" + }, + "Cross-Entropy-Loss.dc7ba633d2467ef3.webp": { + "original_hash": "11dd0fd77a272755d0ef5db9f71217da", + "translation_date": "2026-04-06T20:19:37+00:00", + "source_file": "lessons/3-NeuralNetworks/04-OwnFramework/images/Cross-Entropy-Loss.png", + "language_code": "km" + }, + "DALL·E 2023-06-20 15.56.56 - a closeup watercolor portrait of young male teacher of literature with a book.56499a0c282407c9.webp": { + "original_hash": "dd063fda04db937ab7210064af9d6151", + "translation_date": "2026-04-06T20:19:50+00:00", + "source_file": "lessons/X-Extras/X1-MultiModal/images/DALL·E 2023-06-20 15.56.56 - a closeup watercolor portrait of young male teacher of literature with a book.png", + "language_code": "km" + }, + "DALL·E 2023-06-20 15.57.43 - a closeup oil portrait of young female teacher of computer science with a computer.081e8aed073e2fbf.webp": { + "original_hash": "2cc9ab0daf8e1af7071fbc9eaf84970b", + "translation_date": "2026-04-06T20:19:51+00:00", + "source_file": "lessons/X-Extras/X1-MultiModal/images/DALL·E 2023-06-20 15.57.43 - a closeup oil portrait of young female teacher of computer science with a computer.png", + "language_code": "km" + }, + "DALL·E 2023-06-20 15.58.42 - a closeup oil portrait of old male teacher of mathematics in front of blackboard.534175cf58a361d9.webp": { + "original_hash": "e300d75d78f6050bc7b83df091f95775", + "translation_date": "2026-04-06T20:19:50+00:00", + "source_file": "lessons/X-Extras/X1-MultiModal/images/DALL·E 2023-06-20 15.58.42 - a closeup oil portrait of old male teacher of mathematics in front of blackboard.png", + "language_code": "km" + }, + "DIKW_Pyramid.94126f7d2bd8db5b.webp": { + "original_hash": "ad410ec7f25454482fd4516c4a46fc67", + "translation_date": "2026-04-06T20:18:33+00:00", + "source_file": "lessons/2-Symbolic/images/DIKW_Pyramid.png", + "language_code": "km" + }, + "FeatureExtractionCNN.d9b456cbdae7cb64.webp": { + "original_hash": "c9bde577c8b279b5199a8b294ee9494f", + "translation_date": "2026-04-06T20:17:27+00:00", + "source_file": "lessons/4-ComputerVision/07-ConvNets/images/FeatureExtractionCNN.png", + "language_code": "km" + }, + "Mark_I_perceptron_wikipedia.1f84eaa2d4b76ec9.webp": { + "original_hash": "2cc48ff435c89ca1e162872a42b4813c", + "translation_date": "2026-04-06T20:19:41+00:00", + "source_file": "lessons/3-NeuralNetworks/03-Perceptron/images/Mark_I_perceptron_wikipedia.jpg", + "language_code": "km" + }, + "NetLogo-Main.32653711ec1a01b3.webp": { + "original_hash": "83a9fe96394620fc703a5f2de2d15ed1", + "translation_date": "2026-04-06T20:18:09+00:00", + "source_file": "lessons/6-Other/23-MultiagentSystems/images/NetLogo-Main.png", + "language_code": "km" + }, + "NetLogo-ModelLib.efe023afb4763c05.webp": { + "original_hash": "edd5b28318e2f43274a4541408110fb9", + "translation_date": "2026-04-06T20:17:56+00:00", + "source_file": "lessons/6-Other/23-MultiagentSystems/images/NetLogo-ModelLib.png", + "language_code": "km" + }, + "NeuroArch.4e17cdba5e445721.webp": { + "original_hash": "5a3b1a4c04e6b6b5a65574d5ea92a272", + "translation_date": "2026-04-06T20:19:32+00:00", + "source_file": "lessons/3-NeuralNetworks/04-OwnFramework/images/NeuroArch.png", + "language_code": "km" + }, + "ObjDetectionPrecisionRecall.d2ef5b6081a0b094.webp": { + "original_hash": "6704085c522f47ce42ad8402dafe6429", + "translation_date": "2026-04-06T20:16:54+00:00", + "source_file": "lessons/4-ComputerVision/11-ObjectDetection/images/ObjDetectionPrecisionRecall.png", + "language_code": "km" + }, + "ObjDetectionPrecisionRecallIoU.96b4116fcd30ce5a.webp": { + "original_hash": "f31ea979f0ceabdf198899985ac84c37", + "translation_date": "2026-04-06T20:16:49+00:00", + "source_file": "lessons/4-ComputerVision/11-ObjectDetection/images/ObjDetectionPrecisionRecallIoU.png", + "language_code": "km" + }, + "Overfitting.408ad91cd90b4371.webp": { + "original_hash": "82c3203fefc4ef74609e8ab61c1c683b", + "translation_date": "2026-04-06T20:19:29+00:00", + "source_file": "lessons/3-NeuralNetworks/images/Overfitting.png", + "language_code": "km" + }, + "Rosenblatt-wikipedia.294821b285ac796d.webp": { + "original_hash": "c21d9b47d0106208a0f35a920d6bff66", + "translation_date": "2026-04-06T20:19:40+00:00", + "source_file": "lessons/3-NeuralNetworks/03-Perceptron/images/Rosenblatt-wikipedia.jpg", + "language_code": "km" + }, + "Screen_Shot_2016-11-17_at_11.14.54_AM.b4bb3769353287be.webp": { + "original_hash": "456419e07e4f1b5ab90c6f6d36d9817a", + "translation_date": "2026-04-06T20:17:17+00:00", + "source_file": "lessons/4-ComputerVision/11-ObjectDetection/images/Screen_Shot_2016-11-17_at_11.14.54_AM.png", + "language_code": "km" + }, + "a_closeup_oil_portrait_of_old_male_teacher_of_math.5362e67aa7fc2683.webp": { + "original_hash": "9c386a6fd2c04edbd78dc9d688b59872", + "translation_date": "2026-04-06T20:19:46+00:00", + "source_file": "lessons/X-Extras/X1-MultiModal/images/a_closeup_oil_portrait_of_old_male_teacher_of_math.png", + "language_code": "km" + }, + "a_closeup_oil_portrait_of_young_female_teacher_of_computer_science_with_a_computer.e0b6495f210a4390.webp": { + "original_hash": "7064cd71a562523998203c756842c96d", + "translation_date": "2026-04-06T20:19:51+00:00", + "source_file": "lessons/X-Extras/X1-MultiModal/images/a_closeup_oil_portrait_of_young_female_teacher_of_computer_science_with_a_computer.png", + "language_code": "km" + }, + "a_closeup_watercolor_portrait_of_young_male_teacher_of_literature_with_a_book.2384968e9db8a0d0.webp": { + "original_hash": "ec89cbb600b14e86f353a347506554ba", + "translation_date": "2026-04-06T20:19:51+00:00", + "source_file": "lessons/X-Extras/X1-MultiModal/images/a_closeup_watercolor_portrait_of_young_male_teacher_of_literature_with_a_book.png", + "language_code": "km" + }, + "aae.9d418a990fc75bf9.webp": { + "original_hash": "92f89b37641f659a7d25c91d13076f69", + "translation_date": "2026-04-06T20:16:08+00:00", + "source_file": "lessons/4-ComputerVision/09-Autoencoders/images/aae.png", + "language_code": "km" + }, + "activation-func.b4924007c7ce7764.webp": { + "original_hash": "8d357884343ec923611a319d4e910b99", + "translation_date": "2026-04-06T20:19:42+00:00", + "source_file": "lessons/3-NeuralNetworks/03-Perceptron/images/activation-func.png", + "language_code": "km" + }, + "adversarial-dog.d9fc7773b0142b89.webp": { + "original_hash": "cf7a833a6f82bdf5049180a09f9bf8f6", + "translation_date": "2026-04-06T20:16:40+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/images/adversarial-dog.png", + "language_code": "km" + }, + "ai-computervision.6506ebebac3fbf76.webp": { + "original_hash": "69793d04780af37a3f32c9aa5c2d1ad8", + "translation_date": "2026-04-06T20:15:28+00:00", + "source_file": "lessons/sketchnotes/ai-computervision.png", + "language_code": "km" + }, + "ai-for-beginners.b354ca904b22cd70.webp": { + "original_hash": "4b6f076798ec72ec7736b2e9039730e3", + "translation_date": "2026-04-06T20:15:31+00:00", + "source_file": "lessons/sketchnotes/ai-for-beginners.png", + "language_code": "km" + }, + "ai-intro.bf28d1ac4235881c.webp": { + "original_hash": "9d1e65416cc17cf9a373a1cff01f04a4", + "translation_date": "2026-04-06T20:15:50+00:00", + "source_file": "lessons/sketchnotes/ai-intro.png", + "language_code": "km" + }, + "ai-neuralnetworks.1c687ae40bc86e83.webp": { + "original_hash": "6426ed635d4beb0ee499d634dfb61d65", + "translation_date": "2026-04-06T20:16:01+00:00", + "source_file": "lessons/sketchnotes/ai-neuralnetworks.png", + "language_code": "km" + }, + "ai-nlp.b22dcb8ca4707cea.webp": { + "original_hash": "fc9259e7fd3bcbc2ce15909701a4c284", + "translation_date": "2026-04-06T20:15:06+00:00", + "source_file": "lessons/sketchnotes/ai-nlp.png", + "language_code": "km" + }, + "ai-overview.0857791951d19500.webp": { + "original_hash": "7206f99da5c2b99d21581f946a660235", + "translation_date": "2026-04-06T20:15:41+00:00", + "source_file": "lessons/sketchnotes/ai-overview.png", + "language_code": "km" + }, + "ai-symbolic.715a30cb610411a6.webp": { + "original_hash": "69d3628566f680ac8543651aa6fd520c", + "translation_date": "2026-04-06T20:15:18+00:00", + "source_file": "lessons/sketchnotes/ai-symbolic.png", + "language_code": "km" + }, + "arch-human.5d4d35f1bba3ab1c.webp": { + "original_hash": "3b41c1a38a69fb1104f5ddc48163538d", + "translation_date": "2026-04-06T20:19:00+00:00", + "source_file": "lessons/2-Symbolic/images/arch-human.png", + "language_code": "km" + }, + "arch-kbs.3ec5c150b09fa8da.webp": { + "original_hash": "f470e6ec071db529cd3149052cfeb8ff", + "translation_date": "2026-04-06T20:19:03+00:00", + "source_file": "lessons/2-Symbolic/images/arch-kbs.png", + "language_code": "km" + }, + "artneuron.1a5daa88d20ebe6f.webp": { + "original_hash": "c2d8af8285e1eee1cf6c5ba4762f70ab", + "translation_date": "2026-04-06T20:19:26+00:00", + "source_file": "lessons/3-NeuralNetworks/images/artneuron.png", + "language_code": "km" + }, + "ascii-character-map.18ed6aa7f3b0a7ff.webp": { + "original_hash": "afc5ff2601be320926d89f1ad897eda8", + "translation_date": "2026-04-06T20:20:07+00:00", + "source_file": "lessons/5-NLP/13-TextRep/images/ascii-character-map.png", + "language_code": "km" + }, + "autoencoder_schema.5e6fc9ad98a5eb61.webp": { + "original_hash": "3fb68572368c18bc334ef8d6dec0fee5", + "translation_date": "2026-04-06T20:16:04+00:00", + "source_file": "lessons/4-ComputerVision/09-Autoencoders/images/autoencoder_schema.jpg", + "language_code": "km" + }, + "bag-of-words-example.606fc1738f1d7ba9.webp": { + "original_hash": "a8fa84622ff35939e498d06fac3fa515", + "translation_date": "2026-04-06T20:19:57+00:00", + "source_file": "lessons/5-NLP/13-TextRep/images/bag-of-words-example.png", + "language_code": "km" + }, + "bahdanau-fig3.09ba2d37f202a6af.webp": { + "original_hash": "b5cfbb9cad3b0d3fbdcc63dcd2ed514f", + "translation_date": "2026-04-06T20:20:30+00:00", + "source_file": "lessons/5-NLP/18-Transformers/images/bahdanau-fig3.png", + "language_code": "km" + }, + "bot-ner.4b09235dbb0ad275.webp": { + "original_hash": "5e61aca4f94182c7e7d509b8d2de3c9f", + "translation_date": "2026-04-06T20:20:48+00:00", + "source_file": "lessons/5-NLP/19-NER/images/bot-ner.png", + "language_code": "km" + }, + "bow.3811869cff59368d.webp": { + "original_hash": "bfcb38af6b1cbc8c2e86101127b642ac", + "translation_date": "2026-04-06T20:20:04+00:00", + "source_file": "lessons/5-NLP/13-TextRep/images/bow.png", + "language_code": "km" + }, + "braille-result.46530fea020b03c7.webp": { + "original_hash": "7c069b6ddda38dcd0b535a840b954ee1", + "translation_date": "2026-04-06T20:16:45+00:00", + "source_file": "lessons/4-ComputerVision/06-IntroCV/images/braille-result.png", + "language_code": "km" + }, + "braille-symbols.0159185ab69d5339.webp": { + "original_hash": "5a7fddf66299dbb4eae490b631ee3a1c", + "translation_date": "2026-04-06T20:16:43+00:00", + "source_file": "lessons/4-ComputerVision/06-IntroCV/images/braille-symbols.png", + "language_code": "km" + }, + "braille.341962ff76b1bd70.webp": { + "original_hash": "ef1d59d4fb17f1f019c18be162c5759a", + "translation_date": "2026-04-06T20:16:42+00:00", + "source_file": "lessons/4-ComputerVision/06-IntroCV/data/braille.jpeg", + "language_code": "km" + }, + "cartpole.f52a67f27e058170.webp": { + "original_hash": "5399242e127ea1c18aa6ee405daecf51", + "translation_date": "2026-04-06T20:18:09+00:00", + "source_file": "lessons/6-Other/22-DeepRL/images/cartpole.png", + "language_code": "km" + }, + "catsdogsdataset.a7aff8e6085fd3f0.webp": { + "original_hash": "3039ba35434f67e69ccbb44d9e6ee141", + "translation_date": "2026-04-06T20:16:41+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/images/catsdogsdataset.png", + "language_code": "km" + }, + "clip-arch.b3dbf20b4e8ed8be.webp": { + "original_hash": "bdd1638453069a216e843e1a8fd70db0", + "translation_date": "2026-04-06T20:19:49+00:00", + "source_file": "lessons/X-Extras/X1-MultiModal/images/clip-arch.png", + "language_code": "km" + }, + "clip-class.3af42ef0b2b19369.webp": { + "original_hash": "bdd1638453069a216e843e1a8fd70db0", + "translation_date": "2026-04-06T20:19:46+00:00", + "source_file": "lessons/X-Extras/X1-MultiModal/images/clip-class.png", + "language_code": "km" + }, + "cnn-pyramid.85915455759ef0ce.webp": { + "original_hash": "7233ded4a920332806363d704bfb59a6", + "translation_date": "2026-04-06T20:17:26+00:00", + "source_file": "lessons/4-ComputerVision/07-ConvNets/images/cnn-pyramid.png", + "language_code": "km" + }, + "coco-examples.71bc60380fa6cceb.webp": { + "original_hash": "bcfe5693147ca18d88cf43b1d2d5d6d7", + "translation_date": "2026-04-06T20:16:56+00:00", + "source_file": "lessons/4-ComputerVision/11-ObjectDetection/images/coco-examples.jpg", + "language_code": "km" + }, + "convolutionExample.634615d5ff7081e0.webp": { + "original_hash": "5412e092848cb3cd4fa527aba3be0545", + "translation_date": "2026-04-06T20:17:36+00:00", + "source_file": "lessons/4-ComputerVision/07-ConvNets/images/convolutionExample.png", + "language_code": "km" + }, + "data.50b2a9d5484bdbf0.webp": { + "original_hash": "e501593d25b15c8f8860fe11e3f1c4a7", + "translation_date": "2026-04-06T20:17:45+00:00", + "source_file": "lessons/4-ComputerVision/07-ConvNets/lab/images/data.png", + "language_code": "km" + }, + "dcgan_generator.b500988ec2bc8ba5.webp": { + "original_hash": "a11642e50f68e41c69b1580c9b724ef1", + "translation_date": "2026-04-06T20:16:34+00:00", + "source_file": "lessons/4-ComputerVision/10-GANs/images/dcgan_generator.png", + "language_code": "km" + }, + "dog-from-unsplash.426f9fbca2febc93.webp": { + "original_hash": "9669f6d7c9c8b74efdd1a82a262d1766", + "translation_date": "2026-04-06T20:16:37+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/images/dog-from-unsplash.jpg", + "language_code": "km" + }, + "dsh_age.d212a30d4e54fb5f.webp": { + "original_hash": "61b9b2e2e29d9be9ae8f2edd8fa14ed4", + "translation_date": "2026-04-06T20:18:19+00:00", + "source_file": "lessons/1-Intro/images/dsh_age.png", + "language_code": "km" + }, + "embedding-classifier-example.b77f021a7ee67eee.webp": { + "original_hash": "0c4233111f66d9c6925af5b97f9519a0", + "translation_date": "2026-04-06T20:20:56+00:00", + "source_file": "lessons/5-NLP/14-Embeddings/images/embedding-classifier-example.png", + "language_code": "km" + }, + "encoder-decoder-attention.7a726296894fb567.webp": { + "original_hash": "e0546cbc8252d764df7f7212b371f0ed", + "translation_date": "2026-04-06T20:20:21+00:00", + "source_file": "lessons/5-NLP/18-Transformers/images/encoder-decoder-attention.png", + "language_code": "km" + }, + "example-algorithms-for-converting-words-to-vectors.fbe9207a726922f6.webp": { + "original_hash": "6e976f26b9bb4c7a021187e834132123", + "translation_date": "2026-04-06T20:21:00+00:00", + "source_file": "lessons/5-NLP/14-Embeddings/images/example-algorithms-for-converting-words-to-vectors.png", + "language_code": "km" + }, + "f-rcnn.3cda6d9bb4188875.webp": { + "original_hash": "fdafedad20701c95bdcf6bb923822ab1", + "translation_date": "2026-04-06T20:16:59+00:00", + "source_file": "lessons/4-ComputerVision/11-ObjectDetection/images/f-rcnn.png", + "language_code": "km" + }, + "faster-rcnn.8d46c099b87ef30a.webp": { + "original_hash": "067e2ca96344fd6d0490e0530a922b36", + "translation_date": "2026-04-06T20:17:02+00:00", + "source_file": "lessons/4-ComputerVision/11-ObjectDetection/images/faster-rcnn.png", + "language_code": "km" + }, + "favicon.37b561214b36d454.webp": { + "original_hash": "228faa6584f8ba1f7e9a75e3200112e9", + "translation_date": "2026-04-06T20:14:59+00:00", + "source_file": "images/favicon.png", + "language_code": "km" + }, + "features.6291f9c7ba3a0b95.webp": { + "original_hash": "e2727bfacc1156e045d1879bbe86e189", + "translation_date": "2026-04-06T20:16:39+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/images/features.png", + "language_code": "km" + }, + "filter-horiz.59b80ed4feb946ef.webp": { + "original_hash": "b081df9e2042850983a46ff817b88d55", + "translation_date": "2026-04-06T20:17:28+00:00", + "source_file": "lessons/4-ComputerVision/07-ConvNets/images/filter-horiz.png", + "language_code": "km" + }, + "filter-vert.b7148390ca0bc356.webp": { + "original_hash": "bef527fda3ae7113ec9ebb3ab74a6298", + "translation_date": "2026-04-06T20:17:41+00:00", + "source_file": "lessons/4-ComputerVision/07-ConvNets/images/filter-vert.png", + "language_code": "km" + }, + "frame-difference.706f805491a0883c.webp": { + "original_hash": "a141e72f08e1b8f7451392889af90072", + "translation_date": "2026-04-06T20:16:44+00:00", + "source_file": "lessons/4-ComputerVision/06-IntroCV/images/frame-difference.png", + "language_code": "km" + }, + "gan_arch_detail.46b95fd366f8e543.webp": { + "original_hash": "ba3b25748ca02c3e725e9a1969ae5c5d", + "translation_date": "2026-04-06T20:16:31+00:00", + "source_file": "lessons/4-ComputerVision/10-GANs/images/gan_arch_detail.png", + "language_code": "km" + }, + "gan_architecture.8f3a5ab62b8d5d69.webp": { + "original_hash": "4993c22b32d24c9d2d087645c2a90d81", + "translation_date": "2026-04-06T20:16:26+00:00", + "source_file": "lessons/4-ComputerVision/10-GANs/images/gan_architecture.png", + "language_code": "km" + }, + "history-of-ai.7e83efa70b537f5a.webp": { + "original_hash": "644e648b98fcb10fb9713452ff02934d", + "translation_date": "2026-04-06T20:18:18+00:00", + "source_file": "lessons/1-Intro/images/history-of-ai.png", + "language_code": "km" + }, + "ideal-cat-loop.999fbb8ff306e044.webp": { + "original_hash": "c54e983c591431338bf8ddac9ab8415b", + "translation_date": "2026-04-06T20:16:37+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/images/ideal-cat-loop.png", + "language_code": "km" + }, + "ideal-cat.203dd4597643d6b0.webp": { + "original_hash": "5b44760be530a91be18a5cceebbc2cc3", + "translation_date": "2026-04-06T20:16:40+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/images/ideal-cat.png", + "language_code": "km" + }, + "ideal-zebra.7f70e8b54ee15a7a.webp": { + "original_hash": "6944fb46795f714f0ce8e856c405498a", + "translation_date": "2026-04-06T20:16:34+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/images/ideal-zebra.png", + "language_code": "km" + }, + "image.896e8254a2c60d45.webp": { + "original_hash": "0033165481f191386403b85801811833", + "translation_date": "2026-04-06T20:16:27+00:00", + "source_file": "lessons/4-ComputerVision/10-GANs/images/image.jpg", + "language_code": "km" + }, + "inception.a6605b85bcbc6f52.webp": { + "original_hash": "ebf0f6b0257fffb906b532d86fce2a9c", + "translation_date": "2026-04-06T20:17:40+00:00", + "source_file": "lessons/4-ComputerVision/07-ConvNets/images/inception.png", + "language_code": "km" + }, + "instance_vs_semantic.eee9812bebf8cd45.webp": { + "original_hash": "f21d7fdd7090fd9f8a3c1178a8521076", + "translation_date": "2026-04-06T20:16:10+00:00", + "source_file": "lessons/4-ComputerVision/12-Segmentation/images/instance_vs_semantic.jpeg", + "language_code": "km" + }, + "iou_equation.9a4751d40fff4e11.webp": { + "original_hash": "0a27f4ab37ead8d77cdf94a0bbc99e4a", + "translation_date": "2026-04-06T20:16:55+00:00", + "source_file": "lessons/4-ComputerVision/11-ObjectDetection/images/iou_equation.png", + "language_code": "km" + }, + "jalammarBERT-language-modeling-masked-lm.34f113ea5fec4362.webp": { + "original_hash": "47f7de9ada12b89dcfa75d81eb0aaf15", + "translation_date": "2026-04-06T20:20:27+00:00", + "source_file": "lessons/5-NLP/18-Transformers/images/jalammarBERT-language-modeling-masked-lm.png", + "language_code": "km" + }, + "knowledge-spectrum.b60df631852c0217.webp": { + "original_hash": "71b049ee26a22a68996034585436ca59", + "translation_date": "2026-04-06T20:18:31+00:00", + "source_file": "lessons/2-Symbolic/images/knowledge-spectrum.png", + "language_code": "km" + }, + "lmfilters.ea9e4868a82cf74c.webp": { + "original_hash": "aa029ea2c45afbac3026a0a558eeec43", + "translation_date": "2026-04-06T20:17:41+00:00", + "source_file": "lessons/4-ComputerVision/07-ConvNets/images/lmfilters.jpg", + "language_code": "km" + }, + "ml-for-beginners.9e4fed176fd5817d.webp": { + "original_hash": "cd606a24083e039082b0486fc8382823", + "translation_date": "2026-04-06T20:18:11+00:00", + "source_file": "lessons/1-Intro/images/ml-for-beginners.png", + "language_code": "km" + }, + "mountaincar.f7b7a7f6d4f9933b.webp": { + "original_hash": "61c868cc389dc92bd2b402ea490cd162", + "translation_date": "2026-04-06T20:18:10+00:00", + "source_file": "lessons/6-Other/22-DeepRL/lab/images/mountaincar.png", + "language_code": "km" + }, + "multi-layer-lstm.dd975e29bb2a59fe.webp": { + "original_hash": "27b6355fd86c9e8e6d443015653be763", + "translation_date": "2026-04-06T20:20:09+00:00", + "source_file": "lessons/5-NLP/16-RNN/images/multi-layer-lstm.jpg", + "language_code": "km" + }, + "naive-detection.e7f1ba220ccd08c6.webp": { + "original_hash": "4c96961c12a09f8e055546ed2e7de470", + "translation_date": "2026-04-06T20:16:52+00:00", + "source_file": "lessons/4-ComputerVision/11-ObjectDetection/images/naive-detection.png", + "language_code": "km" + }, + "navi.2f20b727910110ea.webp": { + "original_hash": "fd3a1b48f7317e152edb2d1d943da24e", + "translation_date": "2026-04-06T20:16:15+00:00", + "source_file": "lessons/4-ComputerVision/12-Segmentation/images/navi.png", + "language_code": "km" + }, + "netout.1eb15eb76fd76731.webp": { + "original_hash": "187261e2b5036746ee9d9106b1f7df1b", + "translation_date": "2026-04-06T20:19:24+00:00", + "source_file": "lessons/3-NeuralNetworks/images/netout.png", + "language_code": "km" + }, + "offset-sequence-representation.eb73fcefb29b46ee.webp": { + "original_hash": "52e7632a2b668957b903bb2607e953fe", + "translation_date": "2026-04-06T20:20:58+00:00", + "source_file": "lessons/5-NLP/14-Embeddings/images/offset-sequence-representation.png", + "language_code": "km" + }, + "optical.1f4a94464579a83a.webp": { + "original_hash": "1be97f7f2f58285c9960a90e5d5ae337", + "translation_date": "2026-04-06T20:16:46+00:00", + "source_file": "lessons/4-ComputerVision/06-IntroCV/images/optical.png", + "language_code": "km" + }, + "original-dog.8f68a67d2fe0911f.webp": { + "original_hash": "3ed859629b4141f735fd0d3c1941f520", + "translation_date": "2026-04-06T20:16:41+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/images/original-dog.png", + "language_code": "km" + }, + "overfit.a0bd57f717c15769.webp": { + "original_hash": "810408efec3fc8cb44a2b4bc53466a6b", + "translation_date": "2026-04-06T20:19:39+00:00", + "source_file": "lessons/3-NeuralNetworks/04-OwnFramework/images/overfit.png", + "language_code": "km" + }, + "overfit1.f24b71c6f652e59e.webp": { + "original_hash": "76155698e85340d9dfff8e0a628d25c1", + "translation_date": "2026-04-06T20:19:30+00:00", + "source_file": "lessons/3-NeuralNetworks/images/overfit1.jpg", + "language_code": "km" + }, + "overfit2.131f5800ae10ca5e.webp": { + "original_hash": "eb04381b2f222518ec400b98ebf441b2", + "translation_date": "2026-04-06T20:19:23+00:00", + "source_file": "lessons/3-NeuralNetworks/images/overfit2.jpg", + "language_code": "km" + }, + "palm-movement.341495f0e9c47da3.webp": { + "original_hash": "100780b2e1d5adff2739adf58fc18404", + "translation_date": "2026-04-06T20:16:45+00:00", + "source_file": "lessons/4-ComputerVision/06-IntroCV/images/palm-movement.png", + "language_code": "km" + }, + "photo-cat.8c8e8fb760ffe457.webp": { + "original_hash": "29d10fef28d240c48995ef9dd23e477a", + "translation_date": "2026-04-06T20:18:18+00:00", + "source_file": "lessons/1-Intro/images/photo-cat.jpg", + "language_code": "km" + }, + "pos-embedding.e41ce9b6cf6078af.webp": { + "original_hash": "f0910082dcac063f3baae2e1f28b4e30", + "translation_date": "2026-04-06T20:20:33+00:00", + "source_file": "lessons/5-NLP/18-Transformers/images/pos-embedding.png", + "language_code": "km" + }, + "protege.274177ceeac13b38.webp": { + "original_hash": "56d5a5aba9b9e89a927f7fdc42ba16f5", + "translation_date": "2026-04-06T20:19:19+00:00", + "source_file": "lessons/2-Symbolic/images/protege.png", + "language_code": "km" + }, + "r-fcn.13eb88158b99a3da.webp": { + "original_hash": "38cd0e0105546e56fa17b711d445195f", + "translation_date": "2026-04-06T20:17:04+00:00", + "source_file": "lessons/4-ComputerVision/11-ObjectDetection/images/r-fcn.png", + "language_code": "km" + }, + "rcnn1.cae407020dfb1d1f.webp": { + "original_hash": "9cf0ea86d9dadf06a31cd109efc49796", + "translation_date": "2026-04-06T20:16:59+00:00", + "source_file": "lessons/4-ComputerVision/11-ObjectDetection/images/rcnn1.png", + "language_code": "km" + }, + "rcnn2.2d9530bb83516484.webp": { + "original_hash": "cc44ad151b6d88e2838db475e7ab5dff", + "translation_date": "2026-04-06T20:17:12+00:00", + "source_file": "lessons/4-ComputerVision/11-ObjectDetection/images/rcnn2.png", + "language_code": "km" + }, + "resnet-block.aba4ccbcc0944434.webp": { + "original_hash": "cf2131c7cb1053d6d2559ef83df057a8", + "translation_date": "2026-04-06T20:17:19+00:00", + "source_file": "lessons/4-ComputerVision/07-ConvNets/images/resnet-block.png", + "language_code": "km" + }, + "rnn-anatomy.79ee3f3920b3294b.webp": { + "original_hash": "cac3c7102f2bc410efd6230b3bc58c63", + "translation_date": "2026-04-06T20:20:12+00:00", + "source_file": "lessons/5-NLP/16-RNN/images/rnn-anatomy.png", + "language_code": "km" + }, + "rnn-generate-inf.5168dc65e0370eea.webp": { + "original_hash": "d3ed5c87de90c01b0b77ca02580b3707", + "translation_date": "2026-04-06T20:20:53+00:00", + "source_file": "lessons/5-NLP/17-GenerativeNetworks/images/rnn-generate-inf.png", + "language_code": "km" + }, + "rnn-generate.56c54afb52f9781d.webp": { + "original_hash": "67332ada2d0603921bba37c06956c70e", + "translation_date": "2026-04-06T20:20:52+00:00", + "source_file": "lessons/5-NLP/17-GenerativeNetworks/images/rnn-generate.png", + "language_code": "km" + }, + "rnn.27f5c29c53d727b5.webp": { + "original_hash": "bed0f1884d1a2c2620e6ba741af994b8", + "translation_date": "2026-04-06T20:20:16+00:00", + "source_file": "lessons/5-NLP/16-RNN/images/rnn.png", + "language_code": "km" + }, + "segm.92442f2cb42ff4fa.webp": { + "original_hash": "87d6cbfe87db8fd64b45fa75ba863e60", + "translation_date": "2026-04-06T20:16:20+00:00", + "source_file": "lessons/4-ComputerVision/12-Segmentation/images/segm.png", + "language_code": "km" + }, + "segnet.87377542aa5a8b76.webp": { + "original_hash": "fa6d2d499aa2ae589a14caede7534561", + "translation_date": "2026-04-06T20:16:23+00:00", + "source_file": "lessons/4-ComputerVision/12-Segmentation/images/segnet.png", + "language_code": "km" + }, + "style.5293e85e077ab22c.webp": { + "original_hash": "f797246177c68cc33bcdf7abae8c9b68", + "translation_date": "2026-04-06T20:16:26+00:00", + "source_file": "lessons/4-ComputerVision/10-GANs/images/style.jpg", + "language_code": "km" + }, + "synapse-wikipedia.ed20a9e4726ea1c6.webp": { + "original_hash": "88212730ecd9b0c8b848c319951427d8", + "translation_date": "2026-04-06T20:19:22+00:00", + "source_file": "lessons/3-NeuralNetworks/images/synapse-wikipedia.jpg", + "language_code": "km" + }, + "transformer-layer.905e14747ca4e7d5.webp": { + "original_hash": "dc9e2e401fa5e5c36a322b6721476ccd", + "translation_date": "2026-04-06T20:20:37+00:00", + "source_file": "lessons/5-NLP/18-Transformers/images/transformer-layer.png", + "language_code": "km" + }, + "triplet-complex.32094972c7b4441b.webp": { + "original_hash": "56a2e05839a141c311db52655b37f8ad", + "translation_date": "2026-04-06T20:18:57+00:00", + "source_file": "lessons/2-Symbolic/images/triplet-complex.png", + "language_code": "km" + }, + "triplet.4b9b332587593298.webp": { + "original_hash": "302e53ea355ffb556d99e3962d0a6516", + "translation_date": "2026-04-06T20:19:07+00:00", + "source_file": "lessons/2-Symbolic/images/triplet.png", + "language_code": "km" + }, + "turing-test-evol.4184696701293ead.webp": { + "original_hash": "80d11b1074d61e5d6e4a207f72902e89", + "translation_date": "2026-04-06T20:18:25+00:00", + "source_file": "lessons/1-Intro/images/turing-test-evol.png", + "language_code": "km" + }, + "unet.3adb555bf39d3657.webp": { + "original_hash": "49a151c11708ee9a3e94d21448146bf8", + "translation_date": "2026-04-06T20:16:14+00:00", + "source_file": "lessons/4-ComputerVision/12-Segmentation/images/unet.png", + "language_code": "km" + }, + "unreasonable-effectiveness-of-rnn.541ead816778f42d.webp": { + "original_hash": "2a37bd4e9b12bcc19e045eaf22fea4e5", + "translation_date": "2026-04-06T20:20:50+00:00", + "source_file": "lessons/5-NLP/17-GenerativeNetworks/images/unreasonable-effectiveness-of-rnn.jpg", + "language_code": "km" + }, + "vae.464c465a5b6a9e25.webp": { + "original_hash": "0b658c7862077e139162c756bcb98071", + "translation_date": "2026-04-06T20:16:02+00:00", + "source_file": "lessons/4-ComputerVision/09-Autoencoders/images/vae.png", + "language_code": "km" + }, + "vaemnist-diag.694315f775d5d666.webp": { + "original_hash": "0652f5a95005348c6b1533438103dfcf", + "translation_date": "2026-04-06T20:16:03+00:00", + "source_file": "lessons/4-ComputerVision/09-Autoencoders/images/vaemnist-diag.png", + "language_code": "km" + }, + "vaemnist.cab9e602dc08dc50.webp": { + "original_hash": "8159b2f649e6dd8efa071455d6f222b6", + "translation_date": "2026-04-06T20:16:06+00:00", + "source_file": "lessons/4-ComputerVision/09-Autoencoders/images/vaemnist.png", + "language_code": "km" + }, + "vgg-16-arch.64ff2137f50dd49f.webp": { + "original_hash": "9fc348503d0ec03875e4b46f896f3aa9", + "translation_date": "2026-04-06T20:17:33+00:00", + "source_file": "lessons/4-ComputerVision/07-ConvNets/images/vgg-16-arch.jpg", + "language_code": "km" + }, + "vgg-16-arch1.d901a5583b3a51ba.webp": { + "original_hash": "5b0f835d04dc20d097a0b89c88339966", + "translation_date": "2026-04-06T20:17:31+00:00", + "source_file": "lessons/4-ComputerVision/07-ConvNets/images/vgg-16-arch1.jpg", + "language_code": "km" + }, + "vqgan.5027fe05051dfa31.webp": { + "original_hash": "845e5593c927fd3c3c125a90d0f8eb87", + "translation_date": "2026-04-06T20:19:53+00:00", + "source_file": "lessons/X-Extras/X1-MultiModal/images/vqgan.png", + "language_code": "km" + }, + "yolo.a2648ec82ee8bb4e.webp": { + "original_hash": "e8835638234f5c21fcf36fdede6457f4", + "translation_date": "2026-04-06T20:17:08+00:00", + "source_file": "lessons/4-ComputerVision/11-ObjectDetection/images/yolo.png", + "language_code": "km" + } +} \ No newline at end of file diff --git a/translated_images/km/1200px-Girl_and_cat.89bd70951181e86a.webp b/translated_images/km/1200px-Girl_and_cat.89bd70951181e86a.webp new file mode 100644 index 00000000..47042c75 Binary files /dev/null and b/translated_images/km/1200px-Girl_and_cat.89bd70951181e86a.webp differ diff --git a/translated_images/km/AND-OR-Tree.5592d2c70187f283.webp b/translated_images/km/AND-OR-Tree.5592d2c70187f283.webp new file mode 100644 index 00000000..19e705b2 Binary files /dev/null and b/translated_images/km/AND-OR-Tree.5592d2c70187f283.webp differ diff --git a/translated_images/km/ComputeGraph.463c9d8ebdcb2215.webp b/translated_images/km/ComputeGraph.463c9d8ebdcb2215.webp new file mode 100644 index 00000000..510a9c80 Binary files /dev/null and b/translated_images/km/ComputeGraph.463c9d8ebdcb2215.webp differ diff --git a/translated_images/km/ComputeGraphGrad.4626252c0de03507.webp b/translated_images/km/ComputeGraphGrad.4626252c0de03507.webp new file mode 100644 index 00000000..2901c654 Binary files /dev/null and b/translated_images/km/ComputeGraphGrad.4626252c0de03507.webp differ diff --git a/translated_images/km/CoreferenceResolution.861924d6d384a7d6.webp b/translated_images/km/CoreferenceResolution.861924d6d384a7d6.webp new file mode 100644 index 00000000..863dc292 Binary files /dev/null and b/translated_images/km/CoreferenceResolution.861924d6d384a7d6.webp differ diff --git a/translated_images/km/Cross-Entropy-Loss.dc7ba633d2467ef3.webp b/translated_images/km/Cross-Entropy-Loss.dc7ba633d2467ef3.webp new file mode 100644 index 00000000..2bcc7641 Binary files /dev/null and b/translated_images/km/Cross-Entropy-Loss.dc7ba633d2467ef3.webp differ diff --git a/translated_images/km/DALL·E 2023-06-20 15.56.56 - a closeup watercolor portrait of young male teacher of literature with a book.56499a0c282407c9.webp b/translated_images/km/DALL·E 2023-06-20 15.56.56 - a closeup watercolor portrait of young male teacher of literature with a book.56499a0c282407c9.webp new file mode 100644 index 00000000..222db344 Binary files /dev/null and b/translated_images/km/DALL·E 2023-06-20 15.56.56 - a closeup watercolor portrait of young male teacher of literature with a book.56499a0c282407c9.webp differ diff --git a/translated_images/km/DALL·E 2023-06-20 15.57.43 - a closeup oil portrait of young female teacher of computer science with a computer.081e8aed073e2fbf.webp b/translated_images/km/DALL·E 2023-06-20 15.57.43 - a closeup oil portrait of young female teacher of computer science with a computer.081e8aed073e2fbf.webp new file mode 100644 index 00000000..f3b973c5 Binary files /dev/null and b/translated_images/km/DALL·E 2023-06-20 15.57.43 - a closeup oil portrait of young female teacher of computer science with a computer.081e8aed073e2fbf.webp differ diff --git a/translated_images/km/DALL·E 2023-06-20 15.58.42 - a closeup oil portrait of old male teacher of mathematics in front of blackboard.534175cf58a361d9.webp b/translated_images/km/DALL·E 2023-06-20 15.58.42 - a closeup oil portrait of old male teacher of mathematics in front of blackboard.534175cf58a361d9.webp new file mode 100644 index 00000000..b8f4286a Binary files /dev/null and b/translated_images/km/DALL·E 2023-06-20 15.58.42 - a closeup oil portrait of old male teacher of mathematics in front of blackboard.534175cf58a361d9.webp differ diff --git a/translated_images/km/DIKW_Pyramid.94126f7d2bd8db5b.webp b/translated_images/km/DIKW_Pyramid.94126f7d2bd8db5b.webp new file mode 100644 index 00000000..d16ceba0 Binary files /dev/null and b/translated_images/km/DIKW_Pyramid.94126f7d2bd8db5b.webp differ diff --git a/translated_images/km/FeatureExtractionCNN.d9b456cbdae7cb64.webp b/translated_images/km/FeatureExtractionCNN.d9b456cbdae7cb64.webp new file mode 100644 index 00000000..8675b707 Binary files /dev/null and b/translated_images/km/FeatureExtractionCNN.d9b456cbdae7cb64.webp differ diff --git a/translated_images/km/Mark_I_perceptron_wikipedia.1f84eaa2d4b76ec9.webp b/translated_images/km/Mark_I_perceptron_wikipedia.1f84eaa2d4b76ec9.webp new file mode 100644 index 00000000..857e27a3 Binary files /dev/null and b/translated_images/km/Mark_I_perceptron_wikipedia.1f84eaa2d4b76ec9.webp differ diff --git a/translated_images/km/NetLogo-Main.32653711ec1a01b3.webp b/translated_images/km/NetLogo-Main.32653711ec1a01b3.webp new file mode 100644 index 00000000..f94032d0 Binary files /dev/null and b/translated_images/km/NetLogo-Main.32653711ec1a01b3.webp differ diff --git a/translated_images/km/NetLogo-ModelLib.efe023afb4763c05.webp b/translated_images/km/NetLogo-ModelLib.efe023afb4763c05.webp new file mode 100644 index 00000000..53ae0012 Binary files /dev/null and b/translated_images/km/NetLogo-ModelLib.efe023afb4763c05.webp differ diff --git a/translated_images/km/NeuroArch.4e17cdba5e445721.webp b/translated_images/km/NeuroArch.4e17cdba5e445721.webp new file mode 100644 index 00000000..af658afd Binary files /dev/null and b/translated_images/km/NeuroArch.4e17cdba5e445721.webp differ diff --git a/translated_images/km/ObjDetectionPrecisionRecall.d2ef5b6081a0b094.webp b/translated_images/km/ObjDetectionPrecisionRecall.d2ef5b6081a0b094.webp new file mode 100644 index 00000000..24261307 Binary files /dev/null and b/translated_images/km/ObjDetectionPrecisionRecall.d2ef5b6081a0b094.webp differ diff --git a/translated_images/km/ObjDetectionPrecisionRecallIoU.96b4116fcd30ce5a.webp b/translated_images/km/ObjDetectionPrecisionRecallIoU.96b4116fcd30ce5a.webp new file mode 100644 index 00000000..025f5504 Binary files /dev/null and b/translated_images/km/ObjDetectionPrecisionRecallIoU.96b4116fcd30ce5a.webp differ diff --git a/translated_images/km/Overfitting.408ad91cd90b4371.webp b/translated_images/km/Overfitting.408ad91cd90b4371.webp new file mode 100644 index 00000000..36302b50 Binary files /dev/null and b/translated_images/km/Overfitting.408ad91cd90b4371.webp differ diff --git a/translated_images/km/Rosenblatt-wikipedia.294821b285ac796d.webp b/translated_images/km/Rosenblatt-wikipedia.294821b285ac796d.webp new file mode 100644 index 00000000..1cc0a104 Binary files /dev/null and b/translated_images/km/Rosenblatt-wikipedia.294821b285ac796d.webp differ diff --git a/translated_images/km/Screen_Shot_2016-11-17_at_11.14.54_AM.b4bb3769353287be.webp b/translated_images/km/Screen_Shot_2016-11-17_at_11.14.54_AM.b4bb3769353287be.webp new file mode 100644 index 00000000..b538687b Binary files /dev/null and b/translated_images/km/Screen_Shot_2016-11-17_at_11.14.54_AM.b4bb3769353287be.webp differ diff --git a/translated_images/km/a_closeup_oil_portrait_of_old_male_teacher_of_math.5362e67aa7fc2683.webp b/translated_images/km/a_closeup_oil_portrait_of_old_male_teacher_of_math.5362e67aa7fc2683.webp new file mode 100644 index 00000000..ee032762 Binary files /dev/null and b/translated_images/km/a_closeup_oil_portrait_of_old_male_teacher_of_math.5362e67aa7fc2683.webp differ diff --git a/translated_images/km/a_closeup_oil_portrait_of_young_female_teacher_of_computer_science_with_a_computer.e0b6495f210a4390.webp b/translated_images/km/a_closeup_oil_portrait_of_young_female_teacher_of_computer_science_with_a_computer.e0b6495f210a4390.webp new file mode 100644 index 00000000..52ce29a9 Binary files /dev/null and b/translated_images/km/a_closeup_oil_portrait_of_young_female_teacher_of_computer_science_with_a_computer.e0b6495f210a4390.webp differ diff --git a/translated_images/km/a_closeup_watercolor_portrait_of_young_male_teacher_of_literature_with_a_book.2384968e9db8a0d0.webp b/translated_images/km/a_closeup_watercolor_portrait_of_young_male_teacher_of_literature_with_a_book.2384968e9db8a0d0.webp new file mode 100644 index 00000000..fba04870 Binary files /dev/null and b/translated_images/km/a_closeup_watercolor_portrait_of_young_male_teacher_of_literature_with_a_book.2384968e9db8a0d0.webp differ diff --git a/translated_images/km/aae.9d418a990fc75bf9.webp b/translated_images/km/aae.9d418a990fc75bf9.webp new file mode 100644 index 00000000..7ad88afa Binary files /dev/null and b/translated_images/km/aae.9d418a990fc75bf9.webp differ diff --git a/translated_images/km/activation-func.b4924007c7ce7764.webp b/translated_images/km/activation-func.b4924007c7ce7764.webp new file mode 100644 index 00000000..66534366 Binary files /dev/null and b/translated_images/km/activation-func.b4924007c7ce7764.webp differ diff --git a/translated_images/km/adversarial-dog.d9fc7773b0142b89.webp b/translated_images/km/adversarial-dog.d9fc7773b0142b89.webp new file mode 100644 index 00000000..8816fc84 Binary files /dev/null and b/translated_images/km/adversarial-dog.d9fc7773b0142b89.webp differ diff --git a/translated_images/km/ai-computervision.6506ebebac3fbf76.webp b/translated_images/km/ai-computervision.6506ebebac3fbf76.webp new file mode 100644 index 00000000..6c6be286 Binary files /dev/null and b/translated_images/km/ai-computervision.6506ebebac3fbf76.webp differ diff --git a/translated_images/km/ai-for-beginners.b354ca904b22cd70.webp b/translated_images/km/ai-for-beginners.b354ca904b22cd70.webp new file mode 100644 index 00000000..19041bea Binary files /dev/null and b/translated_images/km/ai-for-beginners.b354ca904b22cd70.webp differ diff --git a/translated_images/km/ai-intro.bf28d1ac4235881c.webp b/translated_images/km/ai-intro.bf28d1ac4235881c.webp new file mode 100644 index 00000000..363f28dc Binary files /dev/null and b/translated_images/km/ai-intro.bf28d1ac4235881c.webp differ diff --git a/translated_images/km/ai-neuralnetworks.1c687ae40bc86e83.webp b/translated_images/km/ai-neuralnetworks.1c687ae40bc86e83.webp new file mode 100644 index 00000000..dba19d62 Binary files /dev/null and b/translated_images/km/ai-neuralnetworks.1c687ae40bc86e83.webp differ diff --git a/translated_images/km/ai-nlp.b22dcb8ca4707cea.webp b/translated_images/km/ai-nlp.b22dcb8ca4707cea.webp new file mode 100644 index 00000000..b8d06140 Binary files /dev/null and b/translated_images/km/ai-nlp.b22dcb8ca4707cea.webp differ diff --git a/translated_images/km/ai-overview.0857791951d19500.webp b/translated_images/km/ai-overview.0857791951d19500.webp new file mode 100644 index 00000000..94db6afb Binary files /dev/null and b/translated_images/km/ai-overview.0857791951d19500.webp differ diff --git a/translated_images/km/ai-symbolic.715a30cb610411a6.webp b/translated_images/km/ai-symbolic.715a30cb610411a6.webp new file mode 100644 index 00000000..50e1ec46 Binary files /dev/null and b/translated_images/km/ai-symbolic.715a30cb610411a6.webp differ diff --git a/translated_images/km/arch-human.5d4d35f1bba3ab1c.webp b/translated_images/km/arch-human.5d4d35f1bba3ab1c.webp new file mode 100644 index 00000000..047cf9d2 Binary files /dev/null and b/translated_images/km/arch-human.5d4d35f1bba3ab1c.webp differ diff --git a/translated_images/km/arch-kbs.3ec5c150b09fa8da.webp b/translated_images/km/arch-kbs.3ec5c150b09fa8da.webp new file mode 100644 index 00000000..8b657935 Binary files /dev/null and b/translated_images/km/arch-kbs.3ec5c150b09fa8da.webp differ diff --git a/translated_images/km/artneuron.1a5daa88d20ebe6f.webp b/translated_images/km/artneuron.1a5daa88d20ebe6f.webp new file mode 100644 index 00000000..37d7a002 Binary files /dev/null and b/translated_images/km/artneuron.1a5daa88d20ebe6f.webp differ diff --git a/translated_images/km/ascii-character-map.18ed6aa7f3b0a7ff.webp b/translated_images/km/ascii-character-map.18ed6aa7f3b0a7ff.webp new file mode 100644 index 00000000..a2f2b8c2 Binary files /dev/null and b/translated_images/km/ascii-character-map.18ed6aa7f3b0a7ff.webp differ diff --git a/translated_images/km/autoencoder_schema.5e6fc9ad98a5eb61.webp b/translated_images/km/autoencoder_schema.5e6fc9ad98a5eb61.webp new file mode 100644 index 00000000..6ec3553f Binary files /dev/null and b/translated_images/km/autoencoder_schema.5e6fc9ad98a5eb61.webp differ diff --git a/translated_images/km/bag-of-words-example.606fc1738f1d7ba9.webp b/translated_images/km/bag-of-words-example.606fc1738f1d7ba9.webp new file mode 100644 index 00000000..7947283c Binary files /dev/null and b/translated_images/km/bag-of-words-example.606fc1738f1d7ba9.webp differ diff --git a/translated_images/km/bahdanau-fig3.09ba2d37f202a6af.webp b/translated_images/km/bahdanau-fig3.09ba2d37f202a6af.webp new file mode 100644 index 00000000..cea71867 Binary files /dev/null and b/translated_images/km/bahdanau-fig3.09ba2d37f202a6af.webp differ diff --git a/translated_images/km/bot-ner.4b09235dbb0ad275.webp b/translated_images/km/bot-ner.4b09235dbb0ad275.webp new file mode 100644 index 00000000..367f9dfb Binary files /dev/null and b/translated_images/km/bot-ner.4b09235dbb0ad275.webp differ diff --git a/translated_images/km/bow.3811869cff59368d.webp b/translated_images/km/bow.3811869cff59368d.webp new file mode 100644 index 00000000..eb493451 Binary files /dev/null and b/translated_images/km/bow.3811869cff59368d.webp differ diff --git a/translated_images/km/braille-result.46530fea020b03c7.webp b/translated_images/km/braille-result.46530fea020b03c7.webp new file mode 100644 index 00000000..0235d8f6 Binary files /dev/null and b/translated_images/km/braille-result.46530fea020b03c7.webp differ diff --git a/translated_images/km/braille-symbols.0159185ab69d5339.webp b/translated_images/km/braille-symbols.0159185ab69d5339.webp new file mode 100644 index 00000000..4fc391e3 Binary files /dev/null and b/translated_images/km/braille-symbols.0159185ab69d5339.webp differ diff --git a/translated_images/km/braille.341962ff76b1bd70.webp b/translated_images/km/braille.341962ff76b1bd70.webp new file mode 100644 index 00000000..6751696b Binary files /dev/null and b/translated_images/km/braille.341962ff76b1bd70.webp differ diff --git a/translated_images/km/cartpole.f52a67f27e058170.webp b/translated_images/km/cartpole.f52a67f27e058170.webp new file mode 100644 index 00000000..848d3ee7 Binary files /dev/null and b/translated_images/km/cartpole.f52a67f27e058170.webp differ diff --git a/translated_images/km/catsdogsdataset.a7aff8e6085fd3f0.webp b/translated_images/km/catsdogsdataset.a7aff8e6085fd3f0.webp new file mode 100644 index 00000000..f0e43d7b Binary files /dev/null and b/translated_images/km/catsdogsdataset.a7aff8e6085fd3f0.webp differ diff --git a/translated_images/km/clip-arch.b3dbf20b4e8ed8be.webp b/translated_images/km/clip-arch.b3dbf20b4e8ed8be.webp new file mode 100644 index 00000000..a0047be3 Binary files /dev/null and b/translated_images/km/clip-arch.b3dbf20b4e8ed8be.webp differ diff --git a/translated_images/km/clip-class.3af42ef0b2b19369.webp b/translated_images/km/clip-class.3af42ef0b2b19369.webp new file mode 100644 index 00000000..387f2bc2 Binary files /dev/null and b/translated_images/km/clip-class.3af42ef0b2b19369.webp differ diff --git a/translated_images/km/cnn-pyramid.85915455759ef0ce.webp b/translated_images/km/cnn-pyramid.85915455759ef0ce.webp new file mode 100644 index 00000000..55a90337 Binary files /dev/null and b/translated_images/km/cnn-pyramid.85915455759ef0ce.webp differ diff --git a/translated_images/km/coco-examples.71bc60380fa6cceb.webp b/translated_images/km/coco-examples.71bc60380fa6cceb.webp new file mode 100644 index 00000000..10daac32 Binary files /dev/null and b/translated_images/km/coco-examples.71bc60380fa6cceb.webp differ diff --git a/translated_images/km/convolutionExample.634615d5ff7081e0.webp b/translated_images/km/convolutionExample.634615d5ff7081e0.webp new file mode 100644 index 00000000..571cbb9c Binary files /dev/null and b/translated_images/km/convolutionExample.634615d5ff7081e0.webp differ diff --git a/translated_images/km/data.50b2a9d5484bdbf0.webp b/translated_images/km/data.50b2a9d5484bdbf0.webp new file mode 100644 index 00000000..31b33823 Binary files /dev/null and b/translated_images/km/data.50b2a9d5484bdbf0.webp differ diff --git a/translated_images/km/dcgan_generator.b500988ec2bc8ba5.webp b/translated_images/km/dcgan_generator.b500988ec2bc8ba5.webp new file mode 100644 index 00000000..427e5002 Binary files /dev/null and b/translated_images/km/dcgan_generator.b500988ec2bc8ba5.webp differ diff --git a/translated_images/km/dog-from-unsplash.426f9fbca2febc93.webp b/translated_images/km/dog-from-unsplash.426f9fbca2febc93.webp new file mode 100644 index 00000000..2d2fef68 Binary files /dev/null and b/translated_images/km/dog-from-unsplash.426f9fbca2febc93.webp differ diff --git a/translated_images/km/dsh_age.d212a30d4e54fb5f.webp b/translated_images/km/dsh_age.d212a30d4e54fb5f.webp new file mode 100644 index 00000000..cdd0d58d Binary files /dev/null and b/translated_images/km/dsh_age.d212a30d4e54fb5f.webp differ diff --git a/translated_images/km/embedding-classifier-example.b77f021a7ee67eee.webp b/translated_images/km/embedding-classifier-example.b77f021a7ee67eee.webp new file mode 100644 index 00000000..85c0ac6a Binary files /dev/null and b/translated_images/km/embedding-classifier-example.b77f021a7ee67eee.webp differ diff --git a/translated_images/km/encoder-decoder-attention.7a726296894fb567.webp b/translated_images/km/encoder-decoder-attention.7a726296894fb567.webp new file mode 100644 index 00000000..55962f96 Binary files /dev/null and b/translated_images/km/encoder-decoder-attention.7a726296894fb567.webp differ diff --git a/translated_images/km/example-algorithms-for-converting-words-to-vectors.fbe9207a726922f6.webp b/translated_images/km/example-algorithms-for-converting-words-to-vectors.fbe9207a726922f6.webp new file mode 100644 index 00000000..b92884db Binary files /dev/null and b/translated_images/km/example-algorithms-for-converting-words-to-vectors.fbe9207a726922f6.webp differ diff --git a/translated_images/km/f-rcnn.3cda6d9bb4188875.webp b/translated_images/km/f-rcnn.3cda6d9bb4188875.webp new file mode 100644 index 00000000..40fc23b8 Binary files /dev/null and b/translated_images/km/f-rcnn.3cda6d9bb4188875.webp differ diff --git a/translated_images/km/faster-rcnn.8d46c099b87ef30a.webp b/translated_images/km/faster-rcnn.8d46c099b87ef30a.webp new file mode 100644 index 00000000..47ebeba8 Binary files /dev/null and b/translated_images/km/faster-rcnn.8d46c099b87ef30a.webp differ diff --git a/translated_images/km/favicon.37b561214b36d454.webp b/translated_images/km/favicon.37b561214b36d454.webp new file mode 100644 index 00000000..48a53960 Binary files /dev/null and b/translated_images/km/favicon.37b561214b36d454.webp differ diff --git a/translated_images/km/features.6291f9c7ba3a0b95.webp b/translated_images/km/features.6291f9c7ba3a0b95.webp new file mode 100644 index 00000000..03679af2 Binary files /dev/null and b/translated_images/km/features.6291f9c7ba3a0b95.webp differ diff --git a/translated_images/km/filter-horiz.59b80ed4feb946ef.webp b/translated_images/km/filter-horiz.59b80ed4feb946ef.webp new file mode 100644 index 00000000..a097d115 Binary files /dev/null and b/translated_images/km/filter-horiz.59b80ed4feb946ef.webp differ diff --git a/translated_images/km/filter-vert.b7148390ca0bc356.webp b/translated_images/km/filter-vert.b7148390ca0bc356.webp new file mode 100644 index 00000000..7635e35e Binary files /dev/null and b/translated_images/km/filter-vert.b7148390ca0bc356.webp differ diff --git a/translated_images/km/frame-difference.706f805491a0883c.webp b/translated_images/km/frame-difference.706f805491a0883c.webp new file mode 100644 index 00000000..e1cbad12 Binary files /dev/null and b/translated_images/km/frame-difference.706f805491a0883c.webp differ diff --git a/translated_images/km/gan_arch_detail.46b95fd366f8e543.webp b/translated_images/km/gan_arch_detail.46b95fd366f8e543.webp new file mode 100644 index 00000000..179517e5 Binary files /dev/null and b/translated_images/km/gan_arch_detail.46b95fd366f8e543.webp differ diff --git a/translated_images/km/gan_architecture.8f3a5ab62b8d5d69.webp b/translated_images/km/gan_architecture.8f3a5ab62b8d5d69.webp new file mode 100644 index 00000000..dbfbb820 Binary files /dev/null and b/translated_images/km/gan_architecture.8f3a5ab62b8d5d69.webp differ diff --git a/translated_images/km/history-of-ai.7e83efa70b537f5a.webp b/translated_images/km/history-of-ai.7e83efa70b537f5a.webp new file mode 100644 index 00000000..3e5b2ff2 Binary files /dev/null and b/translated_images/km/history-of-ai.7e83efa70b537f5a.webp differ diff --git a/translated_images/km/ideal-cat-loop.999fbb8ff306e044.webp b/translated_images/km/ideal-cat-loop.999fbb8ff306e044.webp new file mode 100644 index 00000000..b90a97dd Binary files /dev/null and b/translated_images/km/ideal-cat-loop.999fbb8ff306e044.webp differ diff --git a/translated_images/km/ideal-cat.203dd4597643d6b0.webp b/translated_images/km/ideal-cat.203dd4597643d6b0.webp new file mode 100644 index 00000000..a8d167b1 Binary files /dev/null and b/translated_images/km/ideal-cat.203dd4597643d6b0.webp differ diff --git a/translated_images/km/ideal-zebra.7f70e8b54ee15a7a.webp b/translated_images/km/ideal-zebra.7f70e8b54ee15a7a.webp new file mode 100644 index 00000000..be349483 Binary files /dev/null and b/translated_images/km/ideal-zebra.7f70e8b54ee15a7a.webp differ diff --git a/translated_images/km/image.896e8254a2c60d45.webp b/translated_images/km/image.896e8254a2c60d45.webp new file mode 100644 index 00000000..d2b9d3ce Binary files /dev/null and b/translated_images/km/image.896e8254a2c60d45.webp differ diff --git a/translated_images/km/inception.a6605b85bcbc6f52.webp b/translated_images/km/inception.a6605b85bcbc6f52.webp new file mode 100644 index 00000000..4f403ce8 Binary files /dev/null and b/translated_images/km/inception.a6605b85bcbc6f52.webp differ diff --git a/translated_images/km/instance_vs_semantic.eee9812bebf8cd45.webp b/translated_images/km/instance_vs_semantic.eee9812bebf8cd45.webp new file mode 100644 index 00000000..901ebee6 Binary files /dev/null and b/translated_images/km/instance_vs_semantic.eee9812bebf8cd45.webp differ diff --git a/translated_images/km/iou_equation.9a4751d40fff4e11.webp b/translated_images/km/iou_equation.9a4751d40fff4e11.webp new file mode 100644 index 00000000..78520ac4 Binary files /dev/null and b/translated_images/km/iou_equation.9a4751d40fff4e11.webp differ diff --git a/translated_images/km/jalammarBERT-language-modeling-masked-lm.34f113ea5fec4362.webp b/translated_images/km/jalammarBERT-language-modeling-masked-lm.34f113ea5fec4362.webp new file mode 100644 index 00000000..e31e9884 Binary files /dev/null and b/translated_images/km/jalammarBERT-language-modeling-masked-lm.34f113ea5fec4362.webp differ diff --git a/translated_images/km/knowledge-spectrum.b60df631852c0217.webp b/translated_images/km/knowledge-spectrum.b60df631852c0217.webp new file mode 100644 index 00000000..4a2c75cc Binary files /dev/null and b/translated_images/km/knowledge-spectrum.b60df631852c0217.webp differ diff --git a/translated_images/km/lmfilters.ea9e4868a82cf74c.webp b/translated_images/km/lmfilters.ea9e4868a82cf74c.webp new file mode 100644 index 00000000..73254d4b Binary files /dev/null and b/translated_images/km/lmfilters.ea9e4868a82cf74c.webp differ diff --git a/translated_images/km/ml-for-beginners.9e4fed176fd5817d.webp b/translated_images/km/ml-for-beginners.9e4fed176fd5817d.webp new file mode 100644 index 00000000..94419c2f Binary files /dev/null and b/translated_images/km/ml-for-beginners.9e4fed176fd5817d.webp differ diff --git a/translated_images/km/mountaincar.f7b7a7f6d4f9933b.webp b/translated_images/km/mountaincar.f7b7a7f6d4f9933b.webp new file mode 100644 index 00000000..88d3dc0e Binary files /dev/null and b/translated_images/km/mountaincar.f7b7a7f6d4f9933b.webp differ diff --git a/translated_images/km/multi-layer-lstm.dd975e29bb2a59fe.webp b/translated_images/km/multi-layer-lstm.dd975e29bb2a59fe.webp new file mode 100644 index 00000000..1bd1d4dd Binary files /dev/null and b/translated_images/km/multi-layer-lstm.dd975e29bb2a59fe.webp differ diff --git a/translated_images/km/naive-detection.e7f1ba220ccd08c6.webp b/translated_images/km/naive-detection.e7f1ba220ccd08c6.webp new file mode 100644 index 00000000..6bf3e9da Binary files /dev/null and b/translated_images/km/naive-detection.e7f1ba220ccd08c6.webp differ diff --git a/translated_images/km/navi.2f20b727910110ea.webp b/translated_images/km/navi.2f20b727910110ea.webp new file mode 100644 index 00000000..1a9adcb5 Binary files /dev/null and b/translated_images/km/navi.2f20b727910110ea.webp differ diff --git a/translated_images/km/netout.1eb15eb76fd76731.webp b/translated_images/km/netout.1eb15eb76fd76731.webp new file mode 100644 index 00000000..dca51483 Binary files /dev/null and b/translated_images/km/netout.1eb15eb76fd76731.webp differ diff --git a/translated_images/km/offset-sequence-representation.eb73fcefb29b46ee.webp b/translated_images/km/offset-sequence-representation.eb73fcefb29b46ee.webp new file mode 100644 index 00000000..48a11c17 Binary files /dev/null and b/translated_images/km/offset-sequence-representation.eb73fcefb29b46ee.webp differ diff --git a/translated_images/km/optical.1f4a94464579a83a.webp b/translated_images/km/optical.1f4a94464579a83a.webp new file mode 100644 index 00000000..c37dddad Binary files /dev/null and b/translated_images/km/optical.1f4a94464579a83a.webp differ diff --git a/translated_images/km/original-dog.8f68a67d2fe0911f.webp b/translated_images/km/original-dog.8f68a67d2fe0911f.webp new file mode 100644 index 00000000..2a002703 Binary files /dev/null and b/translated_images/km/original-dog.8f68a67d2fe0911f.webp differ diff --git a/translated_images/km/overfit.a0bd57f717c15769.webp b/translated_images/km/overfit.a0bd57f717c15769.webp new file mode 100644 index 00000000..8e30e2ed Binary files /dev/null and b/translated_images/km/overfit.a0bd57f717c15769.webp differ diff --git a/translated_images/km/overfit1.f24b71c6f652e59e.webp b/translated_images/km/overfit1.f24b71c6f652e59e.webp new file mode 100644 index 00000000..de604b48 Binary files /dev/null and b/translated_images/km/overfit1.f24b71c6f652e59e.webp differ diff --git a/translated_images/km/overfit2.131f5800ae10ca5e.webp b/translated_images/km/overfit2.131f5800ae10ca5e.webp new file mode 100644 index 00000000..8dd690b9 Binary files /dev/null and b/translated_images/km/overfit2.131f5800ae10ca5e.webp differ diff --git a/translated_images/km/palm-movement.341495f0e9c47da3.webp b/translated_images/km/palm-movement.341495f0e9c47da3.webp new file mode 100644 index 00000000..0071936c Binary files /dev/null and b/translated_images/km/palm-movement.341495f0e9c47da3.webp differ diff --git a/translated_images/km/photo-cat.8c8e8fb760ffe457.webp b/translated_images/km/photo-cat.8c8e8fb760ffe457.webp new file mode 100644 index 00000000..2998a349 Binary files /dev/null and b/translated_images/km/photo-cat.8c8e8fb760ffe457.webp differ diff --git a/translated_images/km/pos-embedding.e41ce9b6cf6078af.webp b/translated_images/km/pos-embedding.e41ce9b6cf6078af.webp new file mode 100644 index 00000000..fcf330d7 Binary files /dev/null and b/translated_images/km/pos-embedding.e41ce9b6cf6078af.webp differ diff --git a/translated_images/km/protege.274177ceeac13b38.webp b/translated_images/km/protege.274177ceeac13b38.webp new file mode 100644 index 00000000..40a0fd16 Binary files /dev/null and b/translated_images/km/protege.274177ceeac13b38.webp differ diff --git a/translated_images/km/r-fcn.13eb88158b99a3da.webp b/translated_images/km/r-fcn.13eb88158b99a3da.webp new file mode 100644 index 00000000..dd5a94e6 Binary files /dev/null and b/translated_images/km/r-fcn.13eb88158b99a3da.webp differ diff --git a/translated_images/km/rcnn1.cae407020dfb1d1f.webp b/translated_images/km/rcnn1.cae407020dfb1d1f.webp new file mode 100644 index 00000000..1c949129 Binary files /dev/null and b/translated_images/km/rcnn1.cae407020dfb1d1f.webp differ diff --git a/translated_images/km/rcnn2.2d9530bb83516484.webp b/translated_images/km/rcnn2.2d9530bb83516484.webp new file mode 100644 index 00000000..aed51c8e Binary files /dev/null and b/translated_images/km/rcnn2.2d9530bb83516484.webp differ diff --git a/translated_images/km/resnet-block.aba4ccbcc0944434.webp b/translated_images/km/resnet-block.aba4ccbcc0944434.webp new file mode 100644 index 00000000..bfeb62c4 Binary files /dev/null and b/translated_images/km/resnet-block.aba4ccbcc0944434.webp differ diff --git a/translated_images/km/rnn-anatomy.79ee3f3920b3294b.webp b/translated_images/km/rnn-anatomy.79ee3f3920b3294b.webp new file mode 100644 index 00000000..7c841979 Binary files /dev/null and b/translated_images/km/rnn-anatomy.79ee3f3920b3294b.webp differ diff --git a/translated_images/km/rnn-generate-inf.5168dc65e0370eea.webp b/translated_images/km/rnn-generate-inf.5168dc65e0370eea.webp new file mode 100644 index 00000000..191d8694 Binary files /dev/null and b/translated_images/km/rnn-generate-inf.5168dc65e0370eea.webp differ diff --git a/translated_images/km/rnn-generate.56c54afb52f9781d.webp b/translated_images/km/rnn-generate.56c54afb52f9781d.webp new file mode 100644 index 00000000..570917d9 Binary files /dev/null and b/translated_images/km/rnn-generate.56c54afb52f9781d.webp differ diff --git a/translated_images/km/rnn.27f5c29c53d727b5.webp b/translated_images/km/rnn.27f5c29c53d727b5.webp new file mode 100644 index 00000000..4b331308 Binary files /dev/null and b/translated_images/km/rnn.27f5c29c53d727b5.webp differ diff --git a/translated_images/km/segm.92442f2cb42ff4fa.webp b/translated_images/km/segm.92442f2cb42ff4fa.webp new file mode 100644 index 00000000..bf479799 Binary files /dev/null and b/translated_images/km/segm.92442f2cb42ff4fa.webp differ diff --git a/translated_images/km/segnet.87377542aa5a8b76.webp b/translated_images/km/segnet.87377542aa5a8b76.webp new file mode 100644 index 00000000..4469c37a Binary files /dev/null and b/translated_images/km/segnet.87377542aa5a8b76.webp differ diff --git a/translated_images/km/style.5293e85e077ab22c.webp b/translated_images/km/style.5293e85e077ab22c.webp new file mode 100644 index 00000000..39af2a0e Binary files /dev/null and b/translated_images/km/style.5293e85e077ab22c.webp differ diff --git a/translated_images/km/synapse-wikipedia.ed20a9e4726ea1c6.webp b/translated_images/km/synapse-wikipedia.ed20a9e4726ea1c6.webp new file mode 100644 index 00000000..c97e1410 Binary files /dev/null and b/translated_images/km/synapse-wikipedia.ed20a9e4726ea1c6.webp differ diff --git a/translated_images/km/transformer-layer.905e14747ca4e7d5.webp b/translated_images/km/transformer-layer.905e14747ca4e7d5.webp new file mode 100644 index 00000000..dad7051c Binary files /dev/null and b/translated_images/km/transformer-layer.905e14747ca4e7d5.webp differ diff --git a/translated_images/km/triplet-complex.32094972c7b4441b.webp b/translated_images/km/triplet-complex.32094972c7b4441b.webp new file mode 100644 index 00000000..7a5d45d2 Binary files /dev/null and b/translated_images/km/triplet-complex.32094972c7b4441b.webp differ diff --git a/translated_images/km/triplet.4b9b332587593298.webp b/translated_images/km/triplet.4b9b332587593298.webp new file mode 100644 index 00000000..97bcfa63 Binary files /dev/null and b/translated_images/km/triplet.4b9b332587593298.webp differ diff --git a/translated_images/km/turing-test-evol.4184696701293ead.webp b/translated_images/km/turing-test-evol.4184696701293ead.webp new file mode 100644 index 00000000..03cc20cb Binary files /dev/null and b/translated_images/km/turing-test-evol.4184696701293ead.webp differ diff --git a/translated_images/km/unet.3adb555bf39d3657.webp b/translated_images/km/unet.3adb555bf39d3657.webp new file mode 100644 index 00000000..d0596bfa Binary files /dev/null and b/translated_images/km/unet.3adb555bf39d3657.webp differ diff --git a/translated_images/km/unreasonable-effectiveness-of-rnn.541ead816778f42d.webp b/translated_images/km/unreasonable-effectiveness-of-rnn.541ead816778f42d.webp new file mode 100644 index 00000000..837326a8 Binary files /dev/null and b/translated_images/km/unreasonable-effectiveness-of-rnn.541ead816778f42d.webp differ diff --git a/translated_images/km/vae.464c465a5b6a9e25.webp b/translated_images/km/vae.464c465a5b6a9e25.webp new file mode 100644 index 00000000..204b5f86 Binary files /dev/null and b/translated_images/km/vae.464c465a5b6a9e25.webp differ diff --git a/translated_images/km/vaemnist-diag.694315f775d5d666.webp b/translated_images/km/vaemnist-diag.694315f775d5d666.webp new file mode 100644 index 00000000..49b53b6d Binary files /dev/null and b/translated_images/km/vaemnist-diag.694315f775d5d666.webp differ diff --git a/translated_images/km/vaemnist.cab9e602dc08dc50.webp b/translated_images/km/vaemnist.cab9e602dc08dc50.webp new file mode 100644 index 00000000..2e523d00 Binary files /dev/null and b/translated_images/km/vaemnist.cab9e602dc08dc50.webp differ diff --git a/translated_images/km/vgg-16-arch.64ff2137f50dd49f.webp b/translated_images/km/vgg-16-arch.64ff2137f50dd49f.webp new file mode 100644 index 00000000..c3de6ff9 Binary files /dev/null and b/translated_images/km/vgg-16-arch.64ff2137f50dd49f.webp differ diff --git a/translated_images/km/vgg-16-arch1.d901a5583b3a51ba.webp b/translated_images/km/vgg-16-arch1.d901a5583b3a51ba.webp new file mode 100644 index 00000000..b37068a4 Binary files /dev/null and b/translated_images/km/vgg-16-arch1.d901a5583b3a51ba.webp differ diff --git a/translated_images/km/vqgan.5027fe05051dfa31.webp b/translated_images/km/vqgan.5027fe05051dfa31.webp new file mode 100644 index 00000000..87a49f30 Binary files /dev/null and b/translated_images/km/vqgan.5027fe05051dfa31.webp differ diff --git a/translated_images/km/yolo.a2648ec82ee8bb4e.webp b/translated_images/km/yolo.a2648ec82ee8bb4e.webp new file mode 100644 index 00000000..b72d0137 Binary files /dev/null and b/translated_images/km/yolo.a2648ec82ee8bb4e.webp differ diff --git a/translations/km/.co-op-translator.json b/translations/km/.co-op-translator.json new file mode 100644 index 00000000..9a2bcfd4 --- /dev/null +++ b/translations/km/.co-op-translator.json @@ -0,0 +1,722 @@ +{ + "AGENTS.md": { + "original_hash": "6b11a37115944252ab3ed04e358d830d", + "translation_date": "2026-04-06T16:58:27+00:00", + "source_file": "AGENTS.md", + "language_code": "km" + }, + "README.md": { + "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", + "translation_date": "2026-04-06T17:01:21+00:00", + "source_file": "README.md", + "language_code": "km" + }, + "SECURITY.md": { + "original_hash": "a583f49d359c7ebba61433e4dfcd05a9", + "translation_date": "2026-04-06T16:58:46+00:00", + "source_file": "SECURITY.md", + "language_code": "km" + }, + "etc/CODE_OF_CONDUCT.md": { + "original_hash": "c06b12caf3c901eb3156e3dd5b0aea56", + "translation_date": "2026-04-06T17:01:55+00:00", + "source_file": "etc/CODE_OF_CONDUCT.md", + "language_code": "km" + }, + "etc/CONTRIBUTING.md": { + "original_hash": "847a587aa1b83f4d00858183ff3ed18a", + "translation_date": "2026-04-06T17:01:47+00:00", + "source_file": "etc/CONTRIBUTING.md", + "language_code": "km" + }, + "etc/Mindmap.md": { + "original_hash": "f2f88dbd2debd38e26149b27b1fd272d", + "translation_date": "2026-04-06T17:02:56+00:00", + "source_file": "etc/Mindmap.md", + "language_code": "km" + }, + "etc/SUPPORT.md": { + "original_hash": "fdfc08baee91e402938a2b1f94fe0949", + "translation_date": "2026-04-06T17:01:32+00:00", + "source_file": "etc/SUPPORT.md", + "language_code": "km" + }, + "etc/TRANSLATIONS.md": { + "original_hash": "62b3e3ad5182edb905eec649a87eeeb4", + "translation_date": "2026-04-06T17:02:14+00:00", + "source_file": "etc/TRANSLATIONS.md", + "language_code": "km" + }, + "etc/quiz-app/README.md": { + "original_hash": "d699cf8509f74baa5b0b838de5cf0662", + "translation_date": "2026-04-06T17:04:14+00:00", + "source_file": "etc/quiz-app/README.md", + "language_code": "km" + }, + "examples/03-image-classifier.ipynb": { + "original_hash": "1d472141d9df46b751542b3c29f88677", + "translation_date": "2026-04-06T17:42:17+00:00", + "source_file": "examples/03-image-classifier.ipynb", + "language_code": "km" + }, + "examples/README.md": { + "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", + "translation_date": "2026-04-06T17:03:36+00:00", + "source_file": "examples/README.md", + "language_code": "km" + }, + "lessons/0-course-setup/for-teachers.md": { + "original_hash": "a094ef9927883de1cfcee51dbd143381", + "translation_date": "2026-04-06T17:04:48+00:00", + "source_file": "lessons/0-course-setup/for-teachers.md", + "language_code": "km" + }, + "lessons/0-course-setup/how-to-run.md": { + "original_hash": "a4717bd9103b9f6cd84d534b83534689", + "translation_date": "2026-04-06T17:06:01+00:00", + "source_file": "lessons/0-course-setup/how-to-run.md", + "language_code": "km" + }, + "lessons/0-course-setup/setup.md": { + "original_hash": "7b4e5b8956915870d0a0ed3cc5890042", + "translation_date": "2026-04-06T17:05:21+00:00", + "source_file": "lessons/0-course-setup/setup.md", + "language_code": "km" + }, + "lessons/1-Intro/README.md": { + "original_hash": "f57e8aa46141fd220b16ffed8f11aec7", + "translation_date": "2026-04-06T17:07:45+00:00", + "source_file": "lessons/1-Intro/README.md", + "language_code": "km" + }, + "lessons/1-Intro/assignment.md": { + "original_hash": "a334df77a82aaaf2a29c77065d3e481e", + "translation_date": "2026-04-06T17:07:54+00:00", + "source_file": "lessons/1-Intro/assignment.md", + "language_code": "km" + }, + "lessons/2-Symbolic/Animals.ipynb": { + "original_hash": "8ef43db4b9182239fd150a76bd494fdb", + "translation_date": "2026-04-06T17:43:27+00:00", + "source_file": "lessons/2-Symbolic/Animals.ipynb", + "language_code": "km" + }, + "lessons/2-Symbolic/FamilyOntology.ipynb": { + "original_hash": "6537d5597320e27b6052b4377b8ff8bb", + "translation_date": "2026-04-06T17:44:14+00:00", + "source_file": "lessons/2-Symbolic/FamilyOntology.ipynb", + "language_code": "km" + }, + "lessons/2-Symbolic/MSConceptGraph.ipynb": { + "original_hash": "e5690bbc6e5119a96a8172ec7261db67", + "translation_date": "2026-04-06T17:42:42+00:00", + "source_file": "lessons/2-Symbolic/MSConceptGraph.ipynb", + "language_code": "km" + }, + "lessons/2-Symbolic/README.md": { + "original_hash": "f9f06b266b8b2bfc6b8792ff2bb1bea4", + "translation_date": "2026-04-06T17:10:51+00:00", + "source_file": "lessons/2-Symbolic/README.md", + "language_code": "km" + }, + "lessons/2-Symbolic/assignment.md": { + "original_hash": "a057a8604f3976c3e309884453f1fad0", + "translation_date": "2026-04-06T17:11:01+00:00", + "source_file": "lessons/2-Symbolic/assignment.md", + "language_code": "km" + }, + "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb": { + "original_hash": "2a7a86d0006b9dd5c26493a7ed51e511", + "translation_date": "2026-04-06T19:47:51+00:00", + "source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb", + "language_code": "km" + }, + "lessons/3-NeuralNetworks/03-Perceptron/README.md": { + "original_hash": "c34cbba802058b6fa267e1a294d4e510", + "translation_date": "2026-04-06T17:32:17+00:00", + "source_file": "lessons/3-NeuralNetworks/03-Perceptron/README.md", + "language_code": "km" + }, + "lessons/3-NeuralNetworks/03-Perceptron/lab/PerceptronMultiClass.ipynb": { + "original_hash": "346132688ca5e351b17b56c6166067e2", + "translation_date": "2026-04-06T19:49:17+00:00", + "source_file": "lessons/3-NeuralNetworks/03-Perceptron/lab/PerceptronMultiClass.ipynb", + "language_code": "km" + }, + "lessons/3-NeuralNetworks/03-Perceptron/lab/README.md": { + "original_hash": "ba5d1eb353d20d3e7181066b3c424b99", + "translation_date": "2026-04-06T17:33:00+00:00", + "source_file": "lessons/3-NeuralNetworks/03-Perceptron/lab/README.md", + "language_code": "km" + }, + "lessons/3-NeuralNetworks/04-OwnFramework/OwnFramework.ipynb": { + "original_hash": "6d3fe3f89c3d7b37e5edced9858aa1cb", + "translation_date": "2026-04-06T19:45:59+00:00", + "source_file": "lessons/3-NeuralNetworks/04-OwnFramework/OwnFramework.ipynb", + "language_code": "km" + }, + "lessons/3-NeuralNetworks/04-OwnFramework/README.md": { + "original_hash": "789d6c3fb6fc7948a470b33078a5983a", + "translation_date": "2026-04-06T17:31:39+00:00", + "source_file": "lessons/3-NeuralNetworks/04-OwnFramework/README.md", + "language_code": "km" + }, + "lessons/3-NeuralNetworks/04-OwnFramework/lab/MyFW_MNIST.ipynb": { + "original_hash": "6fa055f484eb5d6bdf41166a356d3abf", + "translation_date": "2026-04-06T19:48:59+00:00", + "source_file": "lessons/3-NeuralNetworks/04-OwnFramework/lab/MyFW_MNIST.ipynb", + "language_code": "km" + }, + "lessons/3-NeuralNetworks/04-OwnFramework/lab/README.md": { + "original_hash": "48fdd704d483e19bc3d7464074c9fcbe", + "translation_date": "2026-04-06T17:32:46+00:00", + "source_file": "lessons/3-NeuralNetworks/04-OwnFramework/lab/README.md", + "language_code": "km" + }, + "lessons/3-NeuralNetworks/05-Frameworks/IntroKeras.ipynb": { + "original_hash": "265eb1809444eb06f3dd1da03e3d7724", + "translation_date": "2026-04-06T19:07:27+00:00", + "source_file": "lessons/3-NeuralNetworks/05-Frameworks/IntroKeras.ipynb", + "language_code": "km" + }, + "lessons/3-NeuralNetworks/05-Frameworks/IntroKerasTF.ipynb": { + "original_hash": "ef00e24b21d0887ad778265cd284473c", + "translation_date": "2026-04-06T19:43:02+00:00", + "source_file": "lessons/3-NeuralNetworks/05-Frameworks/IntroKerasTF.ipynb", + "language_code": "km" + }, + "lessons/3-NeuralNetworks/05-Frameworks/IntroPyTorch.ipynb": { + "original_hash": "514da4a9c94c540ec10589037cdaab6b", + "translation_date": "2026-04-06T19:36:20+00:00", + "source_file": "lessons/3-NeuralNetworks/05-Frameworks/IntroPyTorch.ipynb", + "language_code": "km" + }, + "lessons/3-NeuralNetworks/05-Frameworks/README.md": { + "original_hash": "ddd216f558a255260a9374008002c971", + "translation_date": "2026-04-06T17:31:01+00:00", + "source_file": "lessons/3-NeuralNetworks/05-Frameworks/README.md", + "language_code": "km" + }, + "lessons/3-NeuralNetworks/05-Frameworks/lab/LabFrameworks.ipynb": { + "original_hash": "7f1acf4b57027280a167406a1d109891", + "translation_date": "2026-04-06T19:48:37+00:00", + "source_file": "lessons/3-NeuralNetworks/05-Frameworks/lab/LabFrameworks.ipynb", + "language_code": "km" + }, + "lessons/3-NeuralNetworks/05-Frameworks/lab/README.md": { + "original_hash": "e452d897efb9a89700f41021834cf6e5", + "translation_date": "2026-04-06T17:32:30+00:00", + "source_file": "lessons/3-NeuralNetworks/05-Frameworks/lab/README.md", + "language_code": "km" + }, + "lessons/3-NeuralNetworks/README.md": { + "original_hash": "f862a99d88088163df12270e2f2ad6c3", + "translation_date": "2026-04-06T17:11:33+00:00", + "source_file": "lessons/3-NeuralNetworks/README.md", + "language_code": "km" + }, + "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb": { + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2026-04-06T17:59:47+00:00", + "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", + "language_code": "km" + }, + "lessons/4-ComputerVision/06-IntroCV/README.md": { + "original_hash": "feeca98225cb420afc89415f24f63d92", + "translation_date": "2026-04-06T17:23:01+00:00", + "source_file": "lessons/4-ComputerVision/06-IntroCV/README.md", + "language_code": "km" + }, + "lessons/4-ComputerVision/06-IntroCV/lab/MovementDetection.ipynb": { + "original_hash": "153d9e417e079bf62f8f693002d0deaf", + "translation_date": "2026-04-06T18:05:53+00:00", + "source_file": "lessons/4-ComputerVision/06-IntroCV/lab/MovementDetection.ipynb", + "language_code": "km" + }, + "lessons/4-ComputerVision/06-IntroCV/lab/README.md": { + "original_hash": "3d53d6409f80970f7281a45dee35328a", + "translation_date": "2026-04-06T17:26:02+00:00", + "source_file": "lessons/4-ComputerVision/06-IntroCV/lab/README.md", + "language_code": "km" + }, + "lessons/4-ComputerVision/07-ConvNets/CNN_Architectures.md": { + "original_hash": "53faab85adfcebd8c10bcd71dc2fa557", + "translation_date": "2026-04-06T17:24:44+00:00", + "source_file": "lessons/4-ComputerVision/07-ConvNets/CNN_Architectures.md", + "language_code": "km" + }, + "lessons/4-ComputerVision/07-ConvNets/ConvNetsPyTorch.ipynb": { + "original_hash": "28ab2e2e61409b818d9189e56987b49e", + "translation_date": "2026-04-06T18:04:09+00:00", + "source_file": "lessons/4-ComputerVision/07-ConvNets/ConvNetsPyTorch.ipynb", + "language_code": "km" + }, + "lessons/4-ComputerVision/07-ConvNets/ConvNetsTF.ipynb": { + "original_hash": "96896b1704c43955ccd2cf60c0c284d9", + "translation_date": "2026-04-06T18:02:38+00:00", + "source_file": "lessons/4-ComputerVision/07-ConvNets/ConvNetsTF.ipynb", + "language_code": "km" + }, + "lessons/4-ComputerVision/07-ConvNets/README.md": { + "original_hash": "a560d5b845962cf33dc102266e409568", + "translation_date": "2026-04-06T17:25:17+00:00", + "source_file": "lessons/4-ComputerVision/07-ConvNets/README.md", + "language_code": "km" + }, + "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb": { + "original_hash": "df7d1f7da8d2617b76acd93115776ca4", + "translation_date": "2026-04-06T18:06:57+00:00", + "source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb", + "language_code": "km" + }, + "lessons/4-ComputerVision/07-ConvNets/lab/README.md": { + "original_hash": "b70fcf7fcee862990f848c679090943f", + "translation_date": "2026-04-06T17:26:38+00:00", + "source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md", + "language_code": "km" + }, + "lessons/4-ComputerVision/08-TransferLearning/AdversarialCat_TF.ipynb": { + "original_hash": "fa1cb9392b268515620da41e09c364e1", + "translation_date": "2026-04-06T17:53:05+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/AdversarialCat_TF.ipynb", + "language_code": "km" + }, + "lessons/4-ComputerVision/08-TransferLearning/Dropout.ipynb": { + "original_hash": "9b7009916a0f38ad473857e1b08d2331", + "translation_date": "2026-04-06T17:58:18+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/Dropout.ipynb", + "language_code": "km" + }, + "lessons/4-ComputerVision/08-TransferLearning/README.md": { + "original_hash": "178c0b5ee5395733eb18aec51e71a0a9", + "translation_date": "2026-04-06T17:20:58+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/README.md", + "language_code": "km" + }, + "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md": { + "original_hash": "ae074cd940fc2f4dc24fc07b66ccbd99", + "translation_date": "2026-04-06T17:22:04+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", + "language_code": "km" + }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningPyTorch.ipynb": { + "original_hash": "cf52d6f9bb5965a7e284c986af22f350", + "translation_date": "2026-04-06T17:55:11+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningPyTorch.ipynb", + "language_code": "km" + }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "c189abc107848f96051085cc30945129", + "translation_date": "2026-04-06T17:57:58+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "km" + }, + "lessons/4-ComputerVision/08-TransferLearning/lab/OxfordPets.ipynb": { + "original_hash": "eac9f756cf42bf5eae27dfd63a5b7310", + "translation_date": "2026-04-06T18:05:27+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/lab/OxfordPets.ipynb", + "language_code": "km" + }, + "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { + "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", + "translation_date": "2026-04-06T17:25:47+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/lab/README.md", + "language_code": "km" + }, + "lessons/4-ComputerVision/09-Autoencoders/AutoEncodersPyTorch.ipynb": { + "original_hash": "6aabfc4714b2a03f8d9fcb96b896f5e9", + "translation_date": "2026-04-06T17:45:35+00:00", + "source_file": "lessons/4-ComputerVision/09-Autoencoders/AutoEncodersPyTorch.ipynb", + "language_code": "km" + }, + "lessons/4-ComputerVision/09-Autoencoders/AutoencodersTF.ipynb": { + "original_hash": "a70a0db41eff5062fa02d6f89e267265", + "translation_date": "2026-04-06T17:46:33+00:00", + "source_file": "lessons/4-ComputerVision/09-Autoencoders/AutoencodersTF.ipynb", + "language_code": "km" + }, + "lessons/4-ComputerVision/09-Autoencoders/README.md": { + "original_hash": "1b8d9e1b3a6f1daa864b1ff3dfc3076d", + "translation_date": "2026-04-06T17:18:51+00:00", + "source_file": "lessons/4-ComputerVision/09-Autoencoders/README.md", + "language_code": "km" + }, + "lessons/4-ComputerVision/10-GANs/GANPyTorch.ipynb": { + "original_hash": "e2d8856889e7d91edf4011bcd22dbe8f", + "translation_date": "2026-04-06T17:49:42+00:00", + "source_file": "lessons/4-ComputerVision/10-GANs/GANPyTorch.ipynb", + "language_code": "km" + }, + "lessons/4-ComputerVision/10-GANs/GANTF.ipynb": { + "original_hash": "54d3b95fed38e1be572ef15aca2ffa2e", + "translation_date": "2026-04-06T17:50:44+00:00", + "source_file": "lessons/4-ComputerVision/10-GANs/GANTF.ipynb", + "language_code": "km" + }, + "lessons/4-ComputerVision/10-GANs/README.md": { + "original_hash": "0ff65b4da07b23697235de2beb2a3c25", + "translation_date": "2026-04-06T17:20:09+00:00", + "source_file": "lessons/4-ComputerVision/10-GANs/README.md", + "language_code": "km" + }, + "lessons/4-ComputerVision/10-GANs/StyleTransfer.ipynb": { + "original_hash": "62a3439b43cef3088f7a8af8a256b305", + "translation_date": "2026-04-06T17:51:51+00:00", + "source_file": "lessons/4-ComputerVision/10-GANs/StyleTransfer.ipynb", + "language_code": "km" + }, + "lessons/4-ComputerVision/10-GANs/StyleTransfer_Keras.ipynb": { + "original_hash": "8a49ee1f2335f8071aabccf6d56663ad", + "translation_date": "2026-04-06T17:48:50+00:00", + "source_file": "lessons/4-ComputerVision/10-GANs/StyleTransfer_Keras.ipynb", + "language_code": "km" + }, + "lessons/4-ComputerVision/11-ObjectDetection/ObjectDetection.ipynb": { + "original_hash": "8d283877e71940a2cf08c590888468a7", + "translation_date": "2026-04-06T18:00:41+00:00", + "source_file": "lessons/4-ComputerVision/11-ObjectDetection/ObjectDetection.ipynb", + "language_code": "km" + }, + "lessons/4-ComputerVision/11-ObjectDetection/README.md": { + "original_hash": "d76a7eda28de5210c8b1ba50a6216c69", + "translation_date": "2026-04-06T17:24:09+00:00", + "source_file": "lessons/4-ComputerVision/11-ObjectDetection/README.md", + "language_code": "km" + }, + "lessons/4-ComputerVision/11-ObjectDetection/lab/README.md": { + "original_hash": "ad568d55ae65c856fe929fc2b278510a", + "translation_date": "2026-04-06T17:26:22+00:00", + "source_file": "lessons/4-ComputerVision/11-ObjectDetection/lab/README.md", + "language_code": "km" + }, + "lessons/4-ComputerVision/12-Segmentation/README.md": { + "original_hash": "6568aaae7e0e4afed4b5d74b5b223700", + "translation_date": "2026-04-06T17:19:21+00:00", + "source_file": "lessons/4-ComputerVision/12-Segmentation/README.md", + "language_code": "km" + }, + "lessons/4-ComputerVision/12-Segmentation/SemanticSegmentationPytorch.ipynb": { + "original_hash": "c0381c913f8945105ea15a54e55faaa9", + "translation_date": "2026-04-06T17:47:31+00:00", + "source_file": "lessons/4-ComputerVision/12-Segmentation/SemanticSegmentationPytorch.ipynb", + "language_code": "km" + }, + "lessons/4-ComputerVision/12-Segmentation/SemanticSegmentationTF.ipynb": { + "original_hash": "172cf0962ecc0d67bc198015f5bb0459", + "translation_date": "2026-04-06T17:47:56+00:00", + "source_file": "lessons/4-ComputerVision/12-Segmentation/SemanticSegmentationTF.ipynb", + "language_code": "km" + }, + "lessons/4-ComputerVision/12-Segmentation/lab/BodySegmentation.ipynb": { + "original_hash": "c9c48bf82a455deacc4cdced36f09ac2", + "translation_date": "2026-04-06T18:04:22+00:00", + "source_file": "lessons/4-ComputerVision/12-Segmentation/lab/BodySegmentation.ipynb", + "language_code": "km" + }, + "lessons/4-ComputerVision/12-Segmentation/lab/README.md": { + "original_hash": "365f0decfe0f47b460bbde8227c5009d", + "translation_date": "2026-04-06T17:25:33+00:00", + "source_file": "lessons/4-ComputerVision/12-Segmentation/lab/README.md", + "language_code": "km" + }, + "lessons/4-ComputerVision/README.md": { + "original_hash": "58a52f000089c1d8906a4daa4ab1169b", + "translation_date": "2026-04-06T17:04:25+00:00", + "source_file": "lessons/4-ComputerVision/README.md", + "language_code": "km" + }, + "lessons/5-NLP/13-TextRep/README.md": { + "original_hash": "dbd3f73e4139f030ecb2e20387d70fee", + "translation_date": "2026-04-06T17:34:20+00:00", + "source_file": "lessons/5-NLP/13-TextRep/README.md", + "language_code": "km" + }, + "lessons/5-NLP/13-TextRep/TextRepresentationPyTorch.ipynb": { + "original_hash": "7b9040985e748e4e2d4c689892456ad7", + "translation_date": "2026-04-06T19:51:07+00:00", + "source_file": "lessons/5-NLP/13-TextRep/TextRepresentationPyTorch.ipynb", + "language_code": "km" + }, + "lessons/5-NLP/13-TextRep/TextRepresentationTF.ipynb": { + "original_hash": "19b43951d55b377a76209c24c1f017e4", + "translation_date": "2026-04-06T19:52:53+00:00", + "source_file": "lessons/5-NLP/13-TextRep/TextRepresentationTF.ipynb", + "language_code": "km" + }, + "lessons/5-NLP/13-TextRep/assignment.md": { + "original_hash": "cdc1f2e631f055f3473b36d18e4760b3", + "translation_date": "2026-04-06T17:34:30+00:00", + "source_file": "lessons/5-NLP/13-TextRep/assignment.md", + "language_code": "km" + }, + "lessons/5-NLP/14-Embeddings/EmbeddingsPyTorch.ipynb": { + "original_hash": "f50b026abce5cf36783a560ea72cb9b1", + "translation_date": "2026-04-06T20:14:25+00:00", + "source_file": "lessons/5-NLP/14-Embeddings/EmbeddingsPyTorch.ipynb", + "language_code": "km" + }, + "lessons/5-NLP/14-Embeddings/EmbeddingsTF.ipynb": { + "original_hash": "b859482be7f61d1eadc2c6a2720a37e4", + "translation_date": "2026-04-06T20:12:11+00:00", + "source_file": "lessons/5-NLP/14-Embeddings/EmbeddingsTF.ipynb", + "language_code": "km" + }, + "lessons/5-NLP/14-Embeddings/README.md": { + "original_hash": "b708c9b85b833864c73c6281f1e6b96e", + "translation_date": "2026-04-06T17:39:40+00:00", + "source_file": "lessons/5-NLP/14-Embeddings/README.md", + "language_code": "km" + }, + "lessons/5-NLP/14-Embeddings/assignment.md": { + "original_hash": "bc690ecf68b38d311cc9e12f3144a28c", + "translation_date": "2026-04-06T17:39:49+00:00", + "source_file": "lessons/5-NLP/14-Embeddings/assignment.md", + "language_code": "km" + }, + "lessons/5-NLP/15-LanguageModeling/CBoW-PyTorch.ipynb": { + "original_hash": "36df28efe3fe40b6fb0a7fa48fe3ea82", + "translation_date": "2026-04-06T20:05:23+00:00", + "source_file": "lessons/5-NLP/15-LanguageModeling/CBoW-PyTorch.ipynb", + "language_code": "km" + }, + "lessons/5-NLP/15-LanguageModeling/CBoW-TF.ipynb": { + "original_hash": "88b6110e65d8b9ef59dcb7e7fc5915fd", + "translation_date": "2026-04-06T20:06:18+00:00", + "source_file": "lessons/5-NLP/15-LanguageModeling/CBoW-TF.ipynb", + "language_code": "km" + }, + "lessons/5-NLP/15-LanguageModeling/README.md": { + "original_hash": "7ba20f54a5bfcd6521018cdfb17c7c57", + "translation_date": "2026-04-06T17:37:27+00:00", + "source_file": "lessons/5-NLP/15-LanguageModeling/README.md", + "language_code": "km" + }, + "lessons/5-NLP/15-LanguageModeling/lab/README.md": { + "original_hash": "5130f01fdc5ebb83032b23d489027aac", + "translation_date": "2026-04-06T17:40:44+00:00", + "source_file": "lessons/5-NLP/15-LanguageModeling/lab/README.md", + "language_code": "km" + }, + "lessons/5-NLP/16-RNN/README.md": { + "original_hash": "e2273cc150380a5e191903cea858f021", + "translation_date": "2026-04-06T17:35:30+00:00", + "source_file": "lessons/5-NLP/16-RNN/README.md", + "language_code": "km" + }, + "lessons/5-NLP/16-RNN/RNNPyTorch.ipynb": { + "original_hash": "522ee52ae3d5ae933e283286254e9a55", + "translation_date": "2026-04-06T19:58:56+00:00", + "source_file": "lessons/5-NLP/16-RNN/RNNPyTorch.ipynb", + "language_code": "km" + }, + "lessons/5-NLP/16-RNN/RNNTF.ipynb": { + "original_hash": "81351e61f619b432ff51010a4f993194", + "translation_date": "2026-04-06T20:00:50+00:00", + "source_file": "lessons/5-NLP/16-RNN/RNNTF.ipynb", + "language_code": "km" + }, + "lessons/5-NLP/16-RNN/assignment.md": { + "original_hash": "47f7d3c6a5373543e051e4d1140ce898", + "translation_date": "2026-04-06T17:35:39+00:00", + "source_file": "lessons/5-NLP/16-RNN/assignment.md", + "language_code": "km" + }, + "lessons/5-NLP/17-GenerativeNetworks/GenerativePyTorch.ipynb": { + "original_hash": "7673cd150d96c74c6d6011460094efb4", + "translation_date": "2026-04-06T20:09:55+00:00", + "source_file": "lessons/5-NLP/17-GenerativeNetworks/GenerativePyTorch.ipynb", + "language_code": "km" + }, + "lessons/5-NLP/17-GenerativeNetworks/GenerativeTF.ipynb": { + "original_hash": "9fbb7d5fda708537649f71f5f646fcde", + "translation_date": "2026-04-06T20:08:41+00:00", + "source_file": "lessons/5-NLP/17-GenerativeNetworks/GenerativeTF.ipynb", + "language_code": "km" + }, + "lessons/5-NLP/17-GenerativeNetworks/README.md": { + "original_hash": "51be6057374d01d70e07dd5ec88ebc0d", + "translation_date": "2026-04-06T17:39:04+00:00", + "source_file": "lessons/5-NLP/17-GenerativeNetworks/README.md", + "language_code": "km" + }, + "lessons/5-NLP/17-GenerativeNetworks/lab/README.md": { + "original_hash": "439e12796197a90e7623d4c9c057b9c2", + "translation_date": "2026-04-06T17:41:28+00:00", + "source_file": "lessons/5-NLP/17-GenerativeNetworks/lab/README.md", + "language_code": "km" + }, + "lessons/5-NLP/18-Transformers/README.md": { + "original_hash": "f335dfcb4a993920504c387973a36957", + "translation_date": "2026-04-06T17:36:38+00:00", + "source_file": "lessons/5-NLP/18-Transformers/README.md", + "language_code": "km" + }, + "lessons/5-NLP/18-Transformers/TransformersPyTorch.ipynb": { + "original_hash": "753865967678a92dbce7d7efbd36d980", + "translation_date": "2026-04-06T20:04:34+00:00", + "source_file": "lessons/5-NLP/18-Transformers/TransformersPyTorch.ipynb", + "language_code": "km" + }, + "lessons/5-NLP/18-Transformers/TransformersTF.ipynb": { + "original_hash": "ab59c532409774988ab875f2260e8e53", + "translation_date": "2026-04-06T20:03:18+00:00", + "source_file": "lessons/5-NLP/18-Transformers/TransformersTF.ipynb", + "language_code": "km" + }, + "lessons/5-NLP/18-Transformers/assignment.md": { + "original_hash": "177f3ea3995d725e6f9f5c66af16edcd", + "translation_date": "2026-04-06T17:36:50+00:00", + "source_file": "lessons/5-NLP/18-Transformers/assignment.md", + "language_code": "km" + }, + "lessons/5-NLP/19-NER/NER-TF.ipynb": { + "original_hash": "254d25052dcca4ef84f59a05f2935bdc", + "translation_date": "2026-04-06T20:07:03+00:00", + "source_file": "lessons/5-NLP/19-NER/NER-TF.ipynb", + "language_code": "km" + }, + "lessons/5-NLP/19-NER/README.md": { + "original_hash": "6522312ff835796ca34136a9462fafb2", + "translation_date": "2026-04-06T17:38:17+00:00", + "source_file": "lessons/5-NLP/19-NER/README.md", + "language_code": "km" + }, + "lessons/5-NLP/19-NER/lab/README.md": { + "original_hash": "032bda5068f543d6c1fcb30c34231461", + "translation_date": "2026-04-06T17:41:15+00:00", + "source_file": "lessons/5-NLP/19-NER/lab/README.md", + "language_code": "km" + }, + "lessons/5-NLP/20-LangModels/GPT-PyTorch.ipynb": { + "original_hash": "d4ff89615d38924a55594f16d6d20678", + "translation_date": "2026-04-06T20:14:57+00:00", + "source_file": "lessons/5-NLP/20-LangModels/GPT-PyTorch.ipynb", + "language_code": "km" + }, + "lessons/5-NLP/20-LangModels/README.md": { + "original_hash": "97836d30a6bec736f8e3b4411c572bc2", + "translation_date": "2026-04-06T17:40:28+00:00", + "source_file": "lessons/5-NLP/20-LangModels/README.md", + "language_code": "km" + }, + "lessons/5-NLP/README.md": { + "original_hash": "8ef02a9318257ea140ed3ed74442096d", + "translation_date": "2026-04-06T17:12:27+00:00", + "source_file": "lessons/5-NLP/README.md", + "language_code": "km" + }, + "lessons/6-Other/21-GeneticAlgorithms/Diophantine.ipynb": { + "original_hash": "a967e1fa1e11ab2b6467b19349a4a9aa", + "translation_date": "2026-04-06T18:15:04+00:00", + "source_file": "lessons/6-Other/21-GeneticAlgorithms/Diophantine.ipynb", + "language_code": "km" + }, + "lessons/6-Other/21-GeneticAlgorithms/Genetic.ipynb": { + "original_hash": "1012c117808753433f6e2696e775ff4b", + "translation_date": "2026-04-06T18:12:55+00:00", + "source_file": "lessons/6-Other/21-GeneticAlgorithms/Genetic.ipynb", + "language_code": "km" + }, + "lessons/6-Other/21-GeneticAlgorithms/README.md": { + "original_hash": "6bbd632dfe6c62e5f66bb51fd78c174a", + "translation_date": "2026-04-06T17:27:12+00:00", + "source_file": "lessons/6-Other/21-GeneticAlgorithms/README.md", + "language_code": "km" + }, + "lessons/6-Other/22-DeepRL/CartPole-RL-PyTorch.ipynb": { + "original_hash": "04f8d9978cd11281d81dd037cbf6ce20", + "translation_date": "2026-04-06T18:32:11+00:00", + "source_file": "lessons/6-Other/22-DeepRL/CartPole-RL-PyTorch.ipynb", + "language_code": "km" + }, + "lessons/6-Other/22-DeepRL/CartPole-RL-TF.ipynb": { + "original_hash": "4acab0ddd5fd306aaecd56a7b1e0d069", + "translation_date": "2026-04-06T18:45:53+00:00", + "source_file": "lessons/6-Other/22-DeepRL/CartPole-RL-TF.ipynb", + "language_code": "km" + }, + "lessons/6-Other/22-DeepRL/README.md": { + "original_hash": "04395657fc01648f8f70484d0e55ab67", + "translation_date": "2026-04-06T17:29:49+00:00", + "source_file": "lessons/6-Other/22-DeepRL/README.md", + "language_code": "km" + }, + "lessons/6-Other/22-DeepRL/lab/MountainCar.ipynb": { + "original_hash": "f062b3b18449593ef8e0fcc029868781", + "translation_date": "2026-04-06T18:48:28+00:00", + "source_file": "lessons/6-Other/22-DeepRL/lab/MountainCar.ipynb", + "language_code": "km" + }, + "lessons/6-Other/22-DeepRL/lab/README.md": { + "original_hash": "7bd8dc72040e98e35e7225e34058cd4e", + "translation_date": "2026-04-06T17:30:01+00:00", + "source_file": "lessons/6-Other/22-DeepRL/lab/README.md", + "language_code": "km" + }, + "lessons/6-Other/22-DeepRL/notebook.ipynb": { + "original_hash": "6206baa8d76f5ea272c3fd92e6e4d56e", + "translation_date": "2026-04-06T18:21:55+00:00", + "source_file": "lessons/6-Other/22-DeepRL/notebook.ipynb", + "language_code": "km" + }, + "lessons/6-Other/22-DeepRL/tmp.ipynb": { + "original_hash": "63bf7c4cf1c4e441d20d69060dc0a615", + "translation_date": "2026-04-06T18:15:32+00:00", + "source_file": "lessons/6-Other/22-DeepRL/tmp.ipynb", + "language_code": "km" + }, + "lessons/6-Other/23-MultiagentSystems/README.md": { + "original_hash": "38a1185ae3d54b180378bbd71ae3ef16", + "translation_date": "2026-04-06T17:28:43+00:00", + "source_file": "lessons/6-Other/23-MultiagentSystems/README.md", + "language_code": "km" + }, + "lessons/6-Other/23-MultiagentSystems/assignment.md": { + "original_hash": "cf654ca60c7f86c8dad28596fb42994b", + "translation_date": "2026-04-06T17:28:53+00:00", + "source_file": "lessons/6-Other/23-MultiagentSystems/assignment.md", + "language_code": "km" + }, + "lessons/7-Ethics/README.md": { + "original_hash": "437c988596e751072e41a5aad3fcc5d9", + "translation_date": "2026-04-06T17:08:34+00:00", + "source_file": "lessons/7-Ethics/README.md", + "language_code": "km" + }, + "lessons/README.md": { + "original_hash": "5fef1a0b22498d7188959e2a2cb08af7", + "translation_date": "2026-04-06T17:03:02+00:00", + "source_file": "lessons/README.md", + "language_code": "km" + }, + "lessons/X-Extras/X1-MultiModal/Clip.ipynb": { + "original_hash": "0deee3d1c1d97b670a6dfd2ebd28220f", + "translation_date": "2026-04-06T19:49:47+00:00", + "source_file": "lessons/X-Extras/X1-MultiModal/Clip.ipynb", + "language_code": "km" + }, + "lessons/X-Extras/X1-MultiModal/README.md": { + "original_hash": "9c592c26aca16ca085d268c732284187", + "translation_date": "2026-04-06T17:33:44+00:00", + "source_file": "lessons/X-Extras/X1-MultiModal/README.md", + "language_code": "km" + }, + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "translation_date": "2026-04-06T17:18:04+00:00", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "km" + }, + "lessons/sketchnotes/README.md": { + "original_hash": "050b8bddebafba55b129414e6ab096ab", + "translation_date": "2026-04-06T17:12:39+00:00", + "source_file": "lessons/sketchnotes/README.md", + "language_code": "km" + }, + "troubleshoot.md": { + "original_hash": "8d9c5a4a7c7798d699672a22cb7fea86", + "translation_date": "2026-04-06T16:57:24+00:00", + "source_file": "troubleshoot.md", + "language_code": "km" + } +} \ No newline at end of file diff --git a/translations/km/AGENTS.md b/translations/km/AGENTS.md new file mode 100644 index 00000000..29f8f62e --- /dev/null +++ b/translations/km/AGENTS.md @@ -0,0 +1,319 @@ +# AGENTS.md + +## Project Overview + +AI សម្រាប់អ្នកចាប់ផ្តើមគឺជាកម្មវិធីសិក្សា 12 សប្ដាហ៍ មានមេរៀន 24 ដែលគ្របដណ្តប់មូលដ្ឋានអំពីបញ្ញាសិប្បនិម្មិត។ ឃ្លាំងសិក្សានេះរួមបញ្ចូលមេរៀនអនុវត្តដោយប្រើ Jupyter Notebooks ការប្រលង និងហLaboratories ដៃគូ។ អំពីវគ្គសិក្សាដូចជា៖ + +- បញ្ញាសិប្បនិម្មិតសញ្ញា ជាមួយការបង្ហាញចំណេះដឹង និងប្រព័ន្ធអ្នកជំនាញ +- បណ្តាញប្រសាទ និង ការរៀនជម្រៅ ជាមួយ TensorFlow និង PyTorch +- បច្ចេកទេស និងសំណុំរចនាសម្ព័ន្ធមើលឃើញកុំព្យូទ័រ +- ការកែសម្រួលភាសាធម្មជាតិ (NLP) រួមទាំង transformers និង BERT +- ប្រធានបទពិសេស៖ អាល់ហ្គូលិចមហេតុវិជ្ជា, ការរៀនបន្ធុងជំរុញ, ប្រព័ន្ធភ្នាក់ងារច្រើន +- នីតិវិធីផ្នែកបញ្ញាសិប្បនិម្មិត និងគោលការណ៍បញ្ញាសិប្បនិម្មិតយកចិត្តទុកដាក់ + +**បច្ចេកវិជ្ជាសំខាន់ៗ៖** Python 3, Jupyter Notebooks, TensorFlow, PyTorch, Keras, OpenCV, Vue.js (សម្រាប់កម្មវិធីប្រលង) + +**រចនាសម្ព័ន្ធ៖** ឃ្លាំងមាតិកាសិក្សាដែលមាន Jupyter Notebooks ដាក់លំដាប់តាមប្រធានបទ ជាមួយកម្មវិធីប្រលងសម្រាប់ Vue.js និងការគាំទ្រភាសាច្រើន។ + +## Setup Commands + +### Primary Development Environment (Python/Jupyter) + +វគ្គសិក្សាត្រូវបានរចនាឡើងសម្រាប់រត់ជាមួយ Python និង Jupyter Notebooks។ វិធីសាស្ត្រដែលបានអនុញ្ញាតគឺប្រើ miniconda៖ + +```bash +# បែនការផ្ទុកទិន្នន័យ +git clone https://github.com/microsoft/ai-for-beginners +cd ai-for-beginners + +# បង្កើត និងដំណើរការ​បរិយាកាស conda +conda env create --name ai4beg --file environment.yml +conda activate ai4beg + +# ចាប់ផ្ដើម Jupyter Notebook +jupyter notebook +# ឬ +jupyter lab +``` + +### Alternative: Using devcontainer + +```bash +# បើកនៅក្នុង VS Code ហើយជ្រើស "Reopen in Container" ពេលដែលមានការផ្តល់សំណូមពរ +# devcontainer នឹងរៀបចំបរិយាកាសដោយស្វ័យប្រវត្តិ +``` + +### Quiz Application Setup + +កម្មវិធីប្រលងគឺជា Vue.js app ផ្សេងដែលស្ថិតនៅ `etc/quiz-app/`៖ + +```bash +cd etc/quiz-app +npm install +npm run serve # សេវាកម្មអភិវឌ្ឍន៍ +npm run build # ការបង្កើតផលិតកម្ម +npm run lint # ពិនិត្យ និងជួសជុលកម្មវិធីឯកសារ +``` + +## Development Workflow + +### Working with Jupyter Notebooks + +1. **Local Development:** + - បើកបរិស្ថាន conda៖ `conda activate ai4beg` + - ចាប់ផ្តើម Jupyter៖ `jupyter notebook` ឬ `jupyter lab` + - ទៅកាន់ថតមេរៀន និងបើកឯកសារ `.ipynb` + - រត់កូដក្នុងកោសិកាវីដេអូដើម្បីតាមដានមេរៀន + +2. **VS Code with Python Extension:** + - បើកឃ្លាំងមាតិកានៅក្នុង VS Code + - ដំឡើងផ្នែកបន្ថែម Python + - VS Code ស្វ័យប្រវត្តិអាចរកឃើញនិងប្រើបរិស្ថាន conda + - បើកឯកសារ `.ipynb` ដោយផ្ទាល់ក្នុង VS Code + +3. **Cloud Development:** + - **GitHub Codespaces:** ចុច "Code" → "Codespaces" → "Create codespace on main" + - **Binder:** ប្រើប៊ាដសម្រាប់ Binder នៅក្នុង README ដើម្បីបើកក្នុងកម្មវិធីទំព័រមេ + - កំណត់សម្គាល់៖ Binder មានធនធានកំណត់ និងមានការកំណត់ចូលប្រើវេបសាយខ្លះៗ + +### GPU Support for Advanced Lessons + +មេរៀនក្រោយៗមានអត្ថប្រយោជន៍យ៉ាងច្រើនពីការបើកបរជាមួយ GPU៖ + +- **Azure Data Science VM:** ប្រើ NC-series VM ដោយមាន GPU +- **Azure Machine Learning:** ប្រើមុខងារសៀវភៅកំណត់ត្រាជាមួយ GPU +- **Google Colab:** ផ្ទុកឡើងសៀវភៅកំណត់ត្រាដោយផ្ទាល់ (ផ្តល់ជាមួយ GPU ដោយឥតគិតថ្លៃ) + +### Quiz App Development + +```bash +cd etc/quiz-app +npm run serve # ម៉ាស៊ីនមេអភិវឌ្ឍន៍ដែលផ្ទុកឡើងឡើងវិញយ៉ាងឆាប់រហ័ស​នៅ http://localhost:8080 +``` + +## Testing Instructions + +នេះគឺជាឃ្លាំងសិក្សាដែលផ្ដោតលើមាតិកាដល់ការរៀន យ៉ាងហោចណាស់មិនមែនសម្រាប់ការពិនិត្យកម្មវិធីតាមបែបផ្លូវការ។ មិនមានស៊ុមតេស្តបែបបុរាណឡើយ។ + +### Validation Approaches: + +1. **Jupyter Notebooks:** រត់កូដនៅក្នុងកោសិកាតាមលំដាប់ដើម្បីបញ្ជាក់កំហុស +2. **Quiz App Testing:** ពិនិត្យដោយដៃតាមម៉ាស៊ីនបម្រើអភិវឌ្ឍ +3. **Translation Validation:** ពិនិត្យមាតិកាប្រែសម្រួលនៅថត `translations/` +4. **Quiz App Linting:** `npm run lint` នៅក្នុង `etc/quiz-app/` + +### Running Code Examples: + +```bash +# បើកបរិបទស៊ើបអង្កេតជាលើកដំបូង +conda activate ai4beg + +# រត់ស្គ្រីប Python បន្ដផ្ទាល់ +python lessons/4-ComputerVision/07-ConvNets/pytorchcv.py + +# ឬអនុវត្តបា្រិយកន្តភ្ជាប់នួស +jupyter notebook lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb +``` + +## Code Style + +### Python Code Style + +- លំដាប់ Python វិជ្ជាជីវៈសម្រាប់កូដសិក្សា +- កូដច្បាស់លាស់ អាចអានបាន គោរពលើការរៀនជាងការបង្កើតប្រសើរឡើង +- ពណ៌នាច្បាស់លាស់ សម្រាប់មេរៀនដែលមានគោលបំណងបង្រៀន +- សម្របខ្លួនសម្រាប់ Jupyter Notebook៖ កោសិកាគួរតែមានជ្រៅទាំងលក្ខណៈយកខ្លួនឯង +- មិនមានតម្រូវការតឹងរឹងក្នុងការត្រួតពិនិត្យលីនឌីងសម្រាប់មេរៀននេះឡើយ + +### JavaScript/Vue.js (Quiz App) + +- កំណត់ ESLint នៅ `etc/quiz-app/package.json` +- ដំណើរការ `npm run lint` ដើម្បីពិនិត្យ និងជួសជុលបញ្ហា +- ប្រើ Vue 2.x +- សំណុំរចនាសម្ព័ន្ធផ្អែកលើគ្រឿងបន្លាស់ + +### File Organization + +``` +lessons/ + ├── 0-course-setup/ # Setup instructions + ├── 1-Intro/ # Introduction to AI + ├── 2-Symbolic/ # Symbolic AI + ├── 3-NeuralNetworks/ # Neural Networks basics + ├── 4-ComputerVision/ # Computer Vision + ├── 5-NLP/ # Natural Language Processing + ├── 6-Other/ # Other AI techniques + ├── 7-Ethics/ # AI Ethics + └── X-Extras/ # Additional content + +etc/ + ├── quiz-app/ # Vue.js quiz application + └── quiz-src/ # Quiz source files + +translations/ # Multi-language translations +``` + +## Build and Deployment + +### Jupyter Content + +មិនចាំបាច់មានដំណើរការបង្កើត - Jupyter Notebooks រត់ដោយផ្ទាល់។ + +### Quiz Application + +```bash +cd etc/quiz-app + +# ការអភិវឌ្ឍ +npm run serve + +# ការសាងសង់ផលិតកម្ម +npm run build # ផលបត់ចេញទៅ etc/quiz-app/dist/ + +# ដាក់បញ្ចូលទៅ Azure Static Web Apps +# Azure បង្កើត workflow GitHub Actions ដោយស្វ័យប្រវត្តិ +# សូមមើល etc/quiz-app/README.md សម្រាប់ការណែនាំលំអិតអំពីការដាក់បញ្ចូល +``` + +### Documentation Site + +ឃ្លាំងនេះប្រើ Docsify សម្រាប់ឯកសារដឹកនាំ៖ +- `index.html` ជាកន្លែងចូល +- មិនចាំបាច់បង្កើត - ផ្តល់ជូនដោយផ្ទាល់តាម GitHub Pages +- ចូលប្រើបានតាម: https://microsoft.github.io/AI-For-Beginners/ + +## Contributing Guidelines + +### Pull Request Process + +1. **Title Format:** ចំណងជើងច្បាស់លាស់ ពណ៌នាប្រែប្រួល +2. **CLA Requirement:** ត្រូវចុះហត្ថលេខា Microsoft CLA (ពិនិត្យដោយស្វ័យប្រវត្តិ) +3. **Content Guidelines:** + - ការបង្កើតមាតិកាផ្ដោតលើការសិក្សា និងងាយស្រួលសម្រាប់អ្នកចាប់ផ្តើម + - សាកល្បងគ្រប់ឧទាហរណ៍កូដក្នុងសៀវភៅកំណត់ត្រា + - ប្រាកដថាសៀវភៅកំណត់ត្រារត់បានពេញលេញ + - បច្ចប្បន្នភាពការប្រែប្រួលបើមានការផ្លាស់ប្តូរមាតិកាអង់គ្លេស +4. **Quiz App Changes:** ប្រតិបត្តិ `npm run lint` មុនធ្វើការប្តូរ + +### Translation Contributions + +- ការប្រែសម្រួលធ្វើដោយស្វ័យប្រវត្តិផ្ដល់ដោយ GitHub Actions ប្រែសម្រួលជា co-op-translator +- ប្រែសម្រួលដោយដៃនៅក្នុងថត `translations//` +- ប្រែសម្រួលប្រកាន់ប្រលងនៅ `etc/quiz-app/src/assets/translations/` +- គាំទ្រភាសា 40+ ភាសា (មើល README សម្រាប់បញ្ជីពេញលេញ) + +### Active Contribution Areas + +មើល `etc/CONTRIBUTING.md` សម្រាប់តម្រូវការចុងក្រោយ៖ +- ផ្នែក Deep Reinforcement Learning +- ការកែលម្អស្វែងរកវត្ថុ +- ឧទាហរណ៍ Named Entity Recognition +- គំរូហ្វឹកហាត់ embedding តាមបំណង + +## Environment Configuration + +### Required Dependencies + +```bash +# បណ្ណាល័យ Python មូលដ្ឋាន (ពី requirements.txt) +tensorflow==2.17.0 +torch (via conda) +torchvision (via conda) +keras==3.5.0 +opencv (via conda) +scikit-learn +numpy==1.26 +pandas==2.2.2 +matplotlib==3.9 +jupyter +``` + +### Environment Variables + +មិនមានអថេរបរិស្ថានពិសេសណាមួយទេ សម្រាប់ការប្រើប្រាស់មូលដ្ឋាន។ + +សម្រាប់ការដាក់ទុកលើ Azure (កម្មវិធីប្រលង): +- `AZURE_STATIC_WEB_APPS_API_TOKEN` (កំណត់ដោយស្វ័យប្រវត្តិដោយ Azure) + +## Debugging and Troubleshooting + +### Common Issues + +**Issue:** បង្កើតបរិស្ថាន conda បរាជ័យ +- **Solution:** បន្ទាន់សម័យ conda ជាមុន៖ `conda update conda -y` +- ប្រាកដថាមានថាសគ្រប់គ្រាន់ (ផ្ដល់អនុសាសន៍ 50GB) + +**Issue:** មិនឃើញកឺណែល Jupyter +- **Solution:** + ```bash + conda activate ai4beg + python -m ipykernel install --user --name ai4beg + ``` + +**Issue:** មិនមានការរកឃើញ GPU នៅក្នុងសៀវភៅកំណត់ត្រា +- **Solution:** + - ពិនិត្យការដំឡើង CUDA៖ `nvidia-smi` + - ពិនិត្យ PyTorch GPU៖ `python -c "import torch; print(torch.cuda.is_available())"` + - ពិនិត្យ TensorFlow GPU៖ `python -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"` + +**Issue:** កម្មវិធីប្រលងមិនចាប់ផ្តើម +- **Solution:** + ```bash + cd etc/quiz-app + rm -rf node_modules package-lock.json + npm install + npm run serve + ``` + +**Issue:** Binder ពុំចូលរយៈពេលឬហាមឃាត់ការទាញយក +- **Solution:** ប្រើ GitHub Codespaces ឬដំណើរការក្នុងតំបន់ស្រុកសម្រាប់ចូលប្រើធនធានកាន់តែប្រសើរ + +### Memory Issues + +មេរៀនខ្លះៗត្រូវការមេម៉ូរី RAM ធំ (ផ្ដល់អនុសាសន៍ 8GB+)៖ +- ប្រើ VM គ្រប់គ្រាន់នៅពពកសម្រាប់មេរៀនដែលតម្រូវធនធានច្រើន +- បិទកម្មវិធីផ្សេងទៀតពេលហ្វឹកហាត់ម៉ូឌែល +- បន្ថយទំហំដុំក្នុងសៀវភៅកំណត់ត្រាបើផុតមេម៉ូរី + +## Additional Notes + +### For Course Instructors + +- មើល `lessons/0-course-setup/for-teachers.md` សម្រាប់ការណែនាំបង្រៀន +- មេរៀនត្រូវបានរចនាឡើងដោយឯករាជ្យ និងអាចបង្រៀនតាមលំដាប់ ឬជ្រើសរើសជាបុគ្គល +- ពេលវេលាប៉ាន់ប្រមាណ៖ 12 សប្ដាហ៍ ជាមួយមេរៀន 2 មេរៀនក្នុងមួយសប្ដាហ៍ + +### Cloud Resources + +- **Azure សម្រាប់សិស្ស:** មានកម្រៃឥតគិតថ្លៃសម្រាប់សិស្ស +- **Microsoft Learn:** ផ្លូវចេះសិក្សាជាប់គ្នាទាំងនេះ +- **Binder:** ឥតគិតថ្លៃ ប៉ុន្តែកំណត់ធនធាន និងមានការកំណត់បណ្តាញខ្លះៗ + +### Code Execution Options + +1. **Local (Recommended):** គ្រប់គ្រងពេញលេញ ប្រសិទ្ធភាពខ្ពស់ មានចំណុច GPU +2. **GitHub Codespaces:** VS Code នៅពពក ល្អសម្រាប់ចូលរហ័ស +3. **Binder:** ប្រើ Jupyter នៅម៉ាស៊ីនមេឥតគិតថ្លៃ ប៉ុន្តែកំណត់ +4. **Azure ML Notebooks:** ជម្រើសសហគ្រាសមានសមត្ថភាព GPU +5. **Google Colab:** ផ្ទុកឯកសារចូលម៉ត់ដោយផ្ទាល់ មានជាន់ GPU ឥតគិតថ្លៃ + +### Working with Notebooks + +- សៀវភៅកំណត់ត្រាត្រូវដំណើរការដោយការ​រត់កោសិកា​តាមលំដាប់​សម្រាប់ការរៀន +- សៀវភៅកំណត់ត្រាភាគច្រើនទាញយកទិន្នន័យពេលដំណើរការដំបូង (អាចចំណាយពេល) +- ម៉ូឌែលខ្លះត្រូវការប្រើ GPU សម្រាប់ពេលហ្វឹកហាត់សមរម្យ +- ប្រើម៉ូឌែលដែលហ្វឹកហាត់រួចជាចម្បងដើម្បីកាត់បន្ថយការប្រើកំណត់គណនាបន្ថែម + +### Performance Considerations + +- មេរៀនមើលឃើញកុំព្យូទ័របន្ទាប់ៗ (CNNs, GANs) មានអត្ថប្រយោជន៍ពី GPU +- មេរៀន NLP ប្រើ transformer អាចតម្រូវ RAM ច្រើន +- ការហ្វឹកហាត់ពីដើមគឺការសិក្សា ប៉ុន្តែចំណាយពេល +- ឧទាហរណ៍រៀនប្រែបន្លាស់ជួយកាត់បន្ថយពេលហ្វឹកហាត់ + +--- + + +**ការបដិសេធ**៖ +ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈដែលយើងខិតខំប្រឹងប្រែងឱ្យបានដូចត្រឹមត្រូវ សូមយកចិត្តទុកដាក់ថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុស ឬ ការ​ខុស​ឆ្គង។ ឯកសារដើមក្នុងភាសាតំណក់នឹងត្រូវបានចាត់ទុកជាផ្លូវការជាចម្បង។ សម្រាប់ព័ត៌មានសំខាន់ៗ សូមណែនាំឱ្យប្រើការបកប្រែដោយមនុស្សដែលមានជំនាញ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬ ការបកស្រាយខុសឆ្គងណាមួយដែលកើតឡើងពីការប្រើប្រាស់ការបកប្រែនេះ។ + \ No newline at end of file diff --git a/translations/km/README.md b/translations/km/README.md new file mode 100644 index 00000000..8b42a92d --- /dev/null +++ b/translations/km/README.md @@ -0,0 +1,233 @@ +[![GitHub license](https://img.shields.io/github/license/microsoft/AI-For-Beginners.svg)](https://github.com/microsoft/AI-For-Beginners/blob/main/LICENSE) +[![GitHub contributors](https://img.shields.io/github/contributors/microsoft/AI-For-Beginners.svg)](https://GitHub.com/microsoft/AI-For-Beginners/graphs/contributors/) +[![GitHub issues](https://img.shields.io/github/issues/microsoft/AI-For-Beginners.svg)](https://GitHub.com/microsoft/AI-For-Beginners/issues/) +[![GitHub pull-requests](https://img.shields.io/github/issues-pr/microsoft/AI-For-Beginners.svg)](https://GitHub.com/microsoft/AI-For-Beginners/pulls/) +[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) + +[![GitHub watchers](https://img.shields.io/github/watchers/microsoft/AI-For-Beginners.svg?style=social&label=Watch)](https://GitHub.com/microsoft/AI-For-Beginners/watchers/) +[![GitHub forks](https://img.shields.io/github/forks/microsoft/AI-For-Beginners.svg?style=social&label=Fork)](https://GitHub.com/microsoft/AI-For-Beginners/network/) +[![GitHub stars](https://img.shields.io/github/stars/microsoft/AI-For-Beginners.svg?style=social&label=Star)](https://GitHub.com/microsoft/AI-For-Beginners/stargazers/) +[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD) +[![Gitter](https://badges.gitter.im/Microsoft/ai-for-beginners.svg)](https://gitter.im/Microsoft/ai-for-beginners?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) + +[![Microsoft Foundry Discord](https://dcbadge.limes.pink/api/server/nTYy5BXMWG)](https://discord.gg/nTYy5BXMWG) + +# បច្ចេកវិទ្យាបញ្ញាសិប្បនិម្មិតសម្រាប់អ្នកចាប់ផ្តើម - មេរៀនមួយខ្សែ + +|![Sketchnote by @girlie_mac https://twitter.com/girlie_mac](https://github.com/microsoft/AI-For-Beginners/raw/main/lessons/sketchnotes/ai-overview.png)| +|:---:| +| AI For Beginners - _ស្គេតណូតដោយ [@girlie_mac](https://twitter.com/girlie_mac)_ | + +ស្វែងយល់ពីពិភពនៃ **បញ្ញាសិប្បនិម្មិត** (AI) ជាមួយកម្មវិធីមេរៀន 12 សប្តាហ៍ 24 មេរៀនរបស់យើង! វារួមបញ្ចូលមេរៀនអនុវត្ត, ការប្រលង និងព្យួរ។ កម្មវិធីមេរៀននេះងាយស្រួលសម្រាប់អ្នកចាប់ផ្តើម និងគ្របដណ្តប់ពីឧបករណ៍ដូចជា TensorFlow និង PyTorch គ្រប់គ្រងទំព័រពិសេសសីលធម៍ក្នុង AI ផងដែរ។ + +### 🌐 ការគាំទ្រភាសាច្រើន + +#### គាំទ្រតាមរយៈ GitHub Action (ស្វ័យប្រវត្តិ & បច្ចុប្បន្នភាពអស់កល្បជានិច្ច) + + +[Arabic](../ar/README.md) | [Bengali](../bn/README.md) | [Bulgarian](../bg/README.md) | [Burmese (Myanmar)](../my/README.md) | [Chinese (Simplified)](../zh-CN/README.md) | [Chinese (Traditional, Hong Kong)](../zh-HK/README.md) | [Chinese (Traditional, Macau)](../zh-MO/README.md) | [Chinese (Traditional, Taiwan)](../zh-TW/README.md) | [Croatian](../hr/README.md) | [Czech](../cs/README.md) | [Danish](../da/README.md) | [Dutch](../nl/README.md) | [Estonian](../et/README.md) | [Finnish](../fi/README.md) | [French](../fr/README.md) | [German](../de/README.md) | [Greek](../el/README.md) | [Hebrew](../he/README.md) | [Hindi](../hi/README.md) | [Hungarian](../hu/README.md) | [Indonesian](../id/README.md) | [Italian](../it/README.md) | [Japanese](../ja/README.md) | [Kannada](../kn/README.md) | [Khmer](./README.md) | [Korean](../ko/README.md) | [Lithuanian](../lt/README.md) | [Malay](../ms/README.md) | [Malayalam](../ml/README.md) | [Marathi](../mr/README.md) | [Nepali](../ne/README.md) | [Nigerian Pidgin](../pcm/README.md) | [Norwegian](../no/README.md) | [Persian (Farsi)](../fa/README.md) | [Polish](../pl/README.md) | [Portuguese (Brazil)](../pt-BR/README.md) | [Portuguese (Portugal)](../pt-PT/README.md) | [Punjabi (Gurmukhi)](../pa/README.md) | [Romanian](../ro/README.md) | [Russian](../ru/README.md) | [Serbian (Cyrillic)](../sr/README.md) | [Slovak](../sk/README.md) | [Slovenian](../sl/README.md) | [Spanish](../es/README.md) | [Swahili](../sw/README.md) | [Swedish](../sv/README.md) | [Tagalog (Filipino)](../tl/README.md) | [Tamil](../ta/README.md) | [Telugu](../te/README.md) | [Thai](../th/README.md) | [Turkish](../tr/README.md) | [Ukrainian](../uk/README.md) | [Urdu](../ur/README.md) | [Vietnamese](../vi/README.md) + +> **ចង់ចម្លងក្នុងកុំព្យូទ័រខ្លួនឯង?** +> +> ព្រះរាជាណាចក្រនេះមានការប្រែសម្រួលជាច្រើនជាង 50+ ភាសា ដែលធ្វើឲ្យទំហំឃ្លាំងទាញយកធំឡើងយ៉ាងខ្លាំង។ ដើម្បីចម្លងដោយគ្មានការប្រែសម្រួល, ប្រើប្រាស់ sparse checkout: +> +> **Bash / macOS / Linux:** +> ```bash +> git clone --filter=blob:none --sparse https://github.com/microsoft/AI-For-Beginners.git +> cd AI-For-Beginners +> git sparse-checkout set --no-cone '/*' '!translations' '!translated_images' +> ``` +> +> **CMD (Windows):** +> ```cmd +> git clone --filter=blob:none --sparse https://github.com/microsoft/AI-For-Beginners.git +> cd AI-For-Beginners +> git sparse-checkout set --no-cone "/*" "!translations" "!translated_images" +> ``` +> +> នេះនាំឲ្យអ្នកទទួលបានអ្វីៗដែលអ្នកត្រូវការដើម្បីបញ្ចប់វគ្គនេះជាមួយការទាញយកលឿនជាងមុន។ + + +**ប្រសិនបើអ្នកចង់បានការគាំទ្រភាសាបន្ថែម សូមមើលបញ្ជីភាសាដែលគាំទ្រនៅ [នេះ](https://github.com/Azure/co-op-translator/blob/main/getting_started/supported-languages.md)** + +## ចូលរួមជាសហគមន៍ +[![Microsoft Foundry Discord](https://dcbadge.limes.pink/api/server/nTYy5BXMWG)](https://discord.gg/nTYy5BXMWG) + +## អ្វីដែលអ្នកនឹងរ learns + +**[ទីតាំងផែនការ​​នៃវគ្គសិក្សា](http://soshnikov.com/courses/ai-for-beginners/mindmap.html)** + +ក្នុងកម្មវិធីមេរៀននេះ អ្នកនឹងរៀនអំពី៖ + +* វិធីសាស្ត្រផ្សេងៗរបស់បញ្ញាសិប្បនិម្មិត ដូចជា វិធីសាស្ត្រសញ្ញាសារ "ស្វ័យប្រវត្តិចាស់" ជាមួយ **ការតំណាងជាដំណឹង** និងការត្រូវប្រើហេតុផល ([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) + +* ករណីអាជីវកម្មនៃការប្រើប្រាស់ **AI ក្នុងអាជីវកម្ម**។ សូមពិចារណាការេបរកមើលវិធីសាស្ត្ររៀន [Introduction to AI for business users](https://docs.microsoft.com/learn/paths/introduction-ai-for-business-users/?WT.mc_id=academic-77998-bethanycheum) នៅលើ Microsoft Learn ឬ [AI Business School](https://www.microsoft.com/ai/ai-business-school/?WT.mc_id=academic-77998-bethanycheum) ដែលបង្កើតឡើងដោយការសហការជាមួយ [INSEAD](https://www.insead.edu/)។ +* **វិធីសាស្ត្រមិនចាស់នៃការរៀនម៉ាស៊ីន** ដែលបានពិពណ៌នាយ៉ាងល្អនៅក្នុងកម្មវិធី [Machine Learning for Beginners Curriculum](http://github.com/Microsoft/ML-for-Beginners)។ +* កម្មវិធីអនុវត្ត AI ប្រកបដោយភាពជាក់លាក់ ដែលបានបង្កើត​ដោយ​ប្រើប្រាស់ **[សេវាកម្មចិត្តវិស័យ](https://azure.microsoft.com/services/cognitive-services/?WT.mc_id=academic-77998-bethanycheum)**។ សម្រាប់នេះ យើងណែនាំឲ្យអ្នកចាប់ផ្តើមជាមួយម៉ូឌុល 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), **[AI បង្កើតជាថ្មីជាមួយ 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), [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)។ សូមពិចារណាការប្រើប្រាស់វិធីសាស្ត្ររៀន [Build and operate machine learning solutions with Azure Machine Learning](https://docs.microsoft.com/learn/paths/build-ai-solutions-with-azure-ml-service/?WT.mc_id=academic-77998-bethanycheum) និង [Build and Operate Machine Learning Solutions with 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/) សម្រាប់ព័ត៌មានលម្អិតបន្ថែម។ +* **គណិតវិទ្យជ្រៅ** ដែលនៅពីក្រោយការរៀនជ្រៅ។ សម្រាប់នេះ យើងណែនាំសៀវភៅ [Deep Learning](https://www.amazon.com/Deep-Learning-Adaptive-Computation-Machine/dp/0262035618) ដោយ Ian Goodfellow, Yoshua Bengio និង Aaron Courville ដែលអាចទាញយកបានទំនងតាមអ៊ីនធឺណិតនៅ [https://www.deeplearningbook.org/](https://www.deeplearningbook.org/)។ + +សម្រាប់ការណែនាំយ៉ាងទន់ភ្លន់ទៅកាន់ប្រធានបទ _AI នៅលើពពក_ អ្នកអាចពិចារណាការរត់វគ្គ [ចាប់ផ្តើមជាមួយបញ្ញាសិប្បនិម្មិតនៅលើ Azure](https://docs.microsoft.com/learn/paths/get-started-with-artificial-intelligence-on-azure/?WT.mc_id=academic-77998-bethanycheum) ។ + +# មាតិកា + +| | Lesson Link | PyTorch/Keras/TensorFlow | Lab | +| :-: | :------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------: | ------------------------------------------------------------------------------ | +| 0 | [Course Setup](./lessons/0-course-setup/setup.md) | [Setup Your Development Environment](./lessons/0-course-setup/how-to-run.md) | | +| I | [**ការណែនាំអំពី AI**](./lessons/1-Intro/README.md) | | | +| 01 | [ការណែនាំ និងប្រវត្តិរូបនៃ AI](./lessons/1-Intro/README.md) | - | - | +| II | **AI វិធីសាស្ត្រសញ្ញាសារ** | +| 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 | [Perceptron](./lessons/3-NeuralNetworks/03-Perceptron/README.md) | [កំណត់ត្រា](./lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb) | [ពហុគន្លង](./lessons/3-NeuralNetworks/03-Perceptron/lab/README.md) | +| 04 | [Perceptron ស្រទាប់ច្រើន និង ការបង្កើតស៊ុមស្រាងផ្ទាល់ខ្លួន](./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 | [បណ្តាញជេស្នួរប្រភេទ Convolutional](./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 | [Autoencoders និង 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](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://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/17-GenerativeNetworks/GenerativePyTorch.ipynb) / [TensorFlow](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/17-GenerativeNetworks/GenerativeTF.ipynb) | [ពហុគន្លង](./lessons/5-NLP/17-GenerativeNetworks/lab/README.md) | +| 18 | [Transformers។ BERT។](./lessons/5-NLP/18-Transformers/README.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 | [ម៉ូឌែលភាសាធំៗ ការសរសេររបស់ Prompt និង ការងារបណ្តោះអាសន្ន](./lessons/5-NLP/20-LangModels/README.md) | [PyTorch](https://microsoft.github.io/AI-For-Beginners/lessons/5-NLP/20-LangModels/GPT-PyTorch.ipynb) | | +| VI | **បច្ចេកវិទ្យា AI ផ្សេងទៀត** || | +| 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) | [កំណត់ត្រា](./lessons/X-Extras/X1-MultiModal/Clip.ipynb) | | + +## មេរៀននីមួយៗមាន +* សម្ភារៈមុនការអាន +* Jupyter Notebooks ដែលអាចប្រតិបត្តិបាន ជាច្រើនជាទូទៅមានរចនាសម្ព័ន្ធជាក់លាក់(**PyTorch** ឬ **TensorFlow**)។ Notebook ដែលអាចប្រតិបត្តិបានក៏មានមាតិកាទ្រឹស្តីច្រើនដែរ ដូច្នេះដើម្បីយល់ដឹងពីប្រធានបទ អ្នកត្រូវតែបញ្ចប់យ៉ាងតិចមួយជំនាន់នៃ notebook (រឺជា PyTorch ឬ TensorFlow)។ +* **Labs** មានសម្រាប់ប្រធានបទខ្លះៗ ដែលផ្តល់ឱកាសឲ្យលោកអ្នកសាកល្បងអនុវត្តមាតិកាដែលបានរៀនទៅជាបញ្ហាជាក់លាក់មួយ។ +* មេរៀនខ្លះមានតំណភ្ជាប់ទៅកាន់ម៉ូដុល [**MS Learn**](https://learn.microsoft.com/en-us/collections/7w28iy2xrqzdj0?WT.mc_id=academic-77998-bethanycheum) ដែលគ្របដណ្តប់ប្រធានបទទាក់ទង។ + +## ការចាប់ផ្តើម + +### 🎯 ថ្មីចំពោះ AI? ចាប់ផ្តើមនៅទីនេះ! + +បើអ្នកថ្មីស្រឡាងចំពោះ AI ហើយចង់បានឧទាហរណ៍អនុវត្តបន្ដិចបន្ទីចលឿន សូមពិនិត្យមើល [**ឧទាហរណ៍ផ្តើមសម្រួលសម្រាប់មនុស្សថ្មី**](./examples/README.md)! គេហ្នឹងរួមបញ្ចូល: + +- 🌟 **Hello AI World** - កម្មវិធី AI ដំបូងរបស់អ្នក (ការទទួលស្គាល់លំអិត) +- 🧠 **ប្រព័ន្ធប្រសាទសាមញ្ញ** - បង្កើតប្រព័ន្ធប្រសាទពីដើម +- 🖼️ **អ្នកចាត់ថ្នាក់រូបភាព** - ចាត់ថ្នាក់រូបភាពជាមួយមតិយោបល់លម្អិត +- 💬 **អារម្មណ៍អត្ថបទ** - វិភាគអត្ថបទវិជ្ជមាន/អវិជ្ជមាន + +ឧទាហរណ៍ទាំងនេះត្រូវការចាប់ផ្តើមជួយឲ្យលោកអ្នកយល់ពីគំនិតAI មុនពេលចូលទៅការសិក្សាកម្រិតពេញលេញ។ + +### 📚 ការត្រៀមអប់រំពេញលេញ + +- យើងបានបង្កើតមេរៀន [setup lesson](./lessons/0-course-setup/setup.md) ដើម្បីជួយអ្នកក្នុងការដំឡើងបរិយាកាសអភិវឌ្ឍ។ +- សម្រាប់គ្រូបង្រៀន យើងមានមេរៀន [curricula setup lesson](./lessons/0-course-setup/for-teachers.md) ផងដែរ! +- របៀប [ចាប់ផ្តើមរត់កូដនៅក្នុង VSCode ឬ Codespace](./lessons/0-course-setup/how-to-run.md) + +ធ្វើតាមជំហានទាំងនេះ៖ + +ចម្លង Repository: ចុចប៊ូតុង "Fork" នៅជ្រុងខាងស្តាំលើនៃទំព័រនេះ។ + +ចម្លង Repository មកម paik៖ `git clone https://github.com/microsoft/AI-For-Beginners.git` + +កុំភ្លេចផ្តាក់ផ្កាយ (🌟) ដើម្បីស្វែងរកបានបានងាយនៅពេលក្រោយ។ + +## ជួបអ្នករៀនផ្សេងទៀត + +ចូលរួមក្នុង [ម៉ាស្សូហ្វក្រ្រ AI Discord server ផ្លូវការរបស់យើង](https://aka.ms/genai-discord?WT.mc_id=academic-105485-bethanycheum) ដើម្បីជួបអ្នករៀនផ្សេងទៀត និងបណ្តាញគ្នាក្នុងការសិក្សាវគ្គនេះ និងទទួលបានការគាំទ្រ។ + +បើអ្នកមានមតិយោបល់ផលិតផល ឬសំណួរពេលកំពុងបង្កើត សូមចូលកាន់ [Azure AI Foundry Developer Forum](https://aka.ms/foundry/forum) + +## សំណួរប្រលង + +> **ចំណាំអំពីសំណួរប្រលង**៖ សំណួរប្រលងទាំងអស់មាននៅក្នុងថត Quiz-app នៅ etc\quiz-app ឬ [អនឡាញនៅទីនេះ](https://ff-quizzes.netlify.app/) ពួកវាត្រូវបានភ្ជាប់ពីក្នុងមេរៀន ហើយកម្មវិធីសំណួរប្រលងអាចរត់ក្នុងទីតាំងរបស់អ្នក ឬត្រូវបានដាក់ចេញទៅ Azure។ សូមអនុវត្តតាមការណែនាំក្នុងថត `quiz-app`។ ពួកវាកំពុងត្រូវបានបកប្រែជាភាសាតំបន់។ + +## ត្រូវការជំនួយ + +តើអ្នកមានយោបល់ ឬបានរកឃើញកំហុសកូដ ឬកិរិយាសព្ទ? សូមបង្កើត issue ឬ pull request ។ + +## អរគុណយ៉ាងជ្រាលជ្រៅ + +* **✍️ អ្នកនិពន្ធដំបូង:** [Dmitry Soshnikov](http://soshnikov.com), PhD +* **🔥 អ្នកកែសម្រួល:** [Jen Looper](https://twitter.com/jenlooper), PhD +* **🎨 អ្នកគូររូបសារ Sketchnote:** [Tomomi Imura](https://twitter.com/girlie_mac) +* **✅ អ្នកបង្កើតសំណួរប្រលង:** [Lateefah Bello](https://github.com/CinnamonXI), [MLSA](https://studentambassadors.microsoft.com/) +* **🙏 អ្នករួមចំណែកសំខាន់ៗ:** [Evgenii Pishchik](https://github.com/Pe4enIks) + +## មេរៀនផ្សេងទៀត + +ក្រុមរបស់យើងផលិតមេរៀនផ្សេងទៀត! សូមពិនិត្យពួកវា៖ + + +### LangChain +[![LangChain4j for Beginners](https://img.shields.io/badge/LangChain4j%20for%20Beginners-22C55E?style=for-the-badge&&labelColor=E5E7EB&color=0553D6)](https://aka.ms/langchain4j-for-beginners) +[![LangChain.js for Beginners](https://img.shields.io/badge/LangChain.js%20for%20Beginners-22C55E?style=for-the-badge&labelColor=E5E7EB&color=0553D6)](https://aka.ms/langchainjs-for-beginners?WT.mc_id=m365-94501-dwahlin) +[![LangChain for Beginners](https://img.shields.io/badge/LangChain%20for%20Beginners-22C55E?style=for-the-badge&labelColor=E5E7EB&color=0553D6)](https://github.com/microsoft/langchain-for-beginners?WT.mc_id=m365-94501-dwahlin) +--- + +### Azure / Edge / MCP / Agents +[![AZD for Beginners](https://img.shields.io/badge/AZD%20for%20Beginners-0078D4?style=for-the-badge&labelColor=E5E7EB&color=0078D4)](https://github.com/microsoft/AZD-for-beginners?WT.mc_id=academic-105485-koreyst) +[![Edge AI for Beginners](https://img.shields.io/badge/Edge%20AI%20for%20Beginners-00B8E4?style=for-the-badge&labelColor=E5E7EB&color=00B8E4)](https://github.com/microsoft/edgeai-for-beginners?WT.mc_id=academic-105485-koreyst) +[![MCP for Beginners](https://img.shields.io/badge/MCP%20for%20Beginners-009688?style=for-the-badge&labelColor=E5E7EB&color=009688)](https://github.com/microsoft/mcp-for-beginners?WT.mc_id=academic-105485-koreyst) +[![AI Agents for Beginners](https://img.shields.io/badge/AI%20Agents%20for%20Beginners-00C49A?style=for-the-badge&labelColor=E5E7EB&color=00C49A)](https://github.com/microsoft/ai-agents-for-beginners?WT.mc_id=academic-105485-koreyst) + +--- + +### Generative AI Series +[![Generative AI for Beginners](https://img.shields.io/badge/Generative%20AI%20for%20Beginners-8B5CF6?style=for-the-badge&labelColor=E5E7EB&color=8B5CF6)](https://github.com/microsoft/generative-ai-for-beginners?WT.mc_id=academic-105485-koreyst) +[![Generative AI (.NET)](https://img.shields.io/badge/Generative%20AI%20(.NET)-9333EA?style=for-the-badge&labelColor=E5E7EB&color=9333EA)](https://github.com/microsoft/Generative-AI-for-beginners-dotnet?WT.mc_id=academic-105485-koreyst) +[![Generative AI (Java)](https://img.shields.io/badge/Generative%20AI%20(Java)-C084FC?style=for-the-badge&labelColor=E5E7EB&color=C084FC)](https://github.com/microsoft/generative-ai-for-beginners-java?WT.mc_id=academic-105485-koreyst) +[![Generative AI (JavaScript)](https://img.shields.io/badge/Generative%20AI%20(JavaScript)-E879F9?style=for-the-badge&labelColor=E5E7EB&color=E879F9)](https://github.com/microsoft/generative-ai-with-javascript?WT.mc_id=academic-105485-koreyst) + +--- + +### Core Learning +[![ML for Beginners](https://img.shields.io/badge/ML%20for%20Beginners-22C55E?style=for-the-badge&labelColor=E5E7EB&color=22C55E)](https://aka.ms/ml-beginners?WT.mc_id=academic-105485-koreyst) +[![Data Science for Beginners](https://img.shields.io/badge/Data%20Science%20for%20Beginners-84CC16?style=for-the-badge&labelColor=E5E7EB&color=84CC16)](https://aka.ms/datascience-beginners?WT.mc_id=academic-105485-koreyst) +[![AI for Beginners](https://img.shields.io/badge/AI%20for%20Beginners-A3E635?style=for-the-badge&labelColor=E5E7EB&color=A3E635)](https://aka.ms/ai-beginners?WT.mc_id=academic-105485-koreyst) +[![Cybersecurity for Beginners](https://img.shields.io/badge/Cybersecurity%20for%20Beginners-F97316?style=for-the-badge&labelColor=E5E7EB&color=F97316)](https://github.com/microsoft/Security-101?WT.mc_id=academic-96948-sayoung) +[![Web Dev for Beginners](https://img.shields.io/badge/Web%20Dev%20for%20Beginners-EC4899?style=for-the-badge&labelColor=E5E7EB&color=EC4899)](https://aka.ms/webdev-beginners?WT.mc_id=academic-105485-koreyst) +[![IoT for Beginners](https://img.shields.io/badge/IoT%20for%20Beginners-14B8A6?style=for-the-badge&labelColor=E5E7EB&color=14B8A6)](https://aka.ms/iot-beginners?WT.mc_id=academic-105485-koreyst) +[![XR Development for Beginners](https://img.shields.io/badge/XR%20Development%20for%20Beginners-38BDF8?style=for-the-badge&labelColor=E5E7EB&color=38BDF8)](https://github.com/microsoft/xr-development-for-beginners?WT.mc_id=academic-105485-koreyst) + +--- + +### Copilot Series +[![Copilot for AI Paired Programming](https://img.shields.io/badge/Copilot%20for%20AI%20Paired%20Programming-FACC15?style=for-the-badge&labelColor=E5E7EB&color=FACC15)](https://aka.ms/GitHubCopilotAI?WT.mc_id=academic-105485-koreyst) +[![Copilot for C#/.NET](https://img.shields.io/badge/Copilot%20for%20C%23/.NET-FBBF24?style=for-the-badge&labelColor=E5E7EB&color=FBBF24)](https://github.com/microsoft/mastering-github-copilot-for-dotnet-csharp-developers?WT.mc_id=academic-105485-koreyst) +[![Copilot Adventure](https://img.shields.io/badge/Copilot%20Adventure-FDE68A?style=for-the-badge&labelColor=E5E7EB&color=FDE68A)](https://github.com/microsoft/CopilotAdventures?WT.mc_id=academic-105485-koreyst) + + +## សុំជំនួយ + +បើអ្នកត្រូវការជំនួយឬមានសំណួរណាមួយអំពីការបង្កើតកម្មវិធី AI ចូលរួមជាមួយអ្នករៀន និងអ្នកអភិវឌ្ឍន៍ដែលមានបទពិសោធន៍ក្នុងការពិភាក្សាអំពី MCP។ វាជាសហគមន៍គាំទ្រដែលសំណួរនេះត្រូវបានស្វាគមន៍ និងចែករំលែកចំណេះដឹងដោយសេរី។ + +[![Microsoft Foundry Discord](https://dcbadge.limes.pink/api/server/nTYy5BXMWG)](https://discord.gg/nTYy5BXMWG) + +បើអ្នកមានមតិយោបល់ផលិតផល ឬកំហុសខណៈកំពុងបង្កើត សូមចូលកាន់: + +[![Microsoft Foundry Developer Forum](https://img.shields.io/badge/GitHub-Microsoft_Foundry_Developer_Forum-blue?style=for-the-badge&logo=github&color=000000&logoColor=fff)](https://aka.ms/foundry/forum) + +--- + + +**ការព្រមាន**៖ +ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ទោះបីយើងខិតខំរកភាពត្រឹមត្រូវក្តី អ្នកសូមយកចិត្តទុកដាក់ថាការបកប្រែអូតូម៉ាទិកអាចមានកំហុសឬការខុសត្រូវខ្លះៗ។ ឯកសារដើមក្នុងភាសារបស់វានិយមគឺជាមូលដ្ឋានលំហឈិតនៃព័ត៌មាន។ សម្រាប់ព័ត៌មានសំខាន់ៗ សូមផ្តល់អាទិភាពចំពោះការបកប្រែដោយមនុស្សជំនាញ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកប្រែខុសប្លែកណាមួយដែលបានកើតឡើងពីការប្រើប្រាស់ការបកប្រែនេះទេ។ + \ No newline at end of file diff --git a/translations/km/SECURITY.md b/translations/km/SECURITY.md new file mode 100644 index 00000000..07f720ed --- /dev/null +++ b/translations/km/SECURITY.md @@ -0,0 +1,44 @@ +## សុវត្ថិភាព + +Microsoft ចាត់ទុកសុវត្ថិភាពនៃផលិតផលនិងសេវាកម្មកម្មវិធីរបស់យើងយ៉ាងចម្បង ដែលរួមបញ្ចូលទាំងឃ្លាំងកូដប្រភពទាំងអស់ដែលគ្រប់គ្រងតាមរយៈអង្គការជាពិសេសរបស់យើងលើ GitHub ដែលរួមមាន [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), និង [អង្គការដែលជាកម្មវិធី GitHub របស់យើង](https://opensource.microsoft.com/)។ + +បើអ្នកជឿថាអ្នកបានរកឃើញចំណុចខ្សោយសុវត្ថិភាពនៅក្នុងឃ្លាំងដែលជាកម្មសិទ្ធិរបស់ Microsoft ដែលស្របតាម [ការបកស្រាយចំណុចខ្សោយសុវត្ថិភាពរបស់ Microsoft](https://aka.ms/opensource/security/definition) សូមរាយការណ៍ទៅកាន់យើងដូចបានពិពណ៌នាខាងក្រោម។ + +## រាយការណ៍បញ្ហាសុវត្ថិភាព + +**សូមមិនរាយការណ៍ចំណុចខ្សោយសុវត្ថិភាពតាមរយៈបញ្ហាសាធារណៈលើ GitHub។** + +ជំនួសមក សូមរាយការណ៍ទៅកាន់ មជ្ឈមណ្ឌលប្រតិប្រតិកម្មសុវត្ថិភាព Microsoft (MSRC) តាមរយៈ [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report)។ + +បើអ្នកចូលចិត្តដាក់សំណើដោយមិនចូលគណនីផ្ទាល់ សូមផ្ញើអ៊ីមែលទៅ [secure@microsoft.com](mailto:secure@microsoft.com)។ ប្រសិនបើអាច សូមអ៊ិនគ្រីបសាររបស់អ្នកជាមួយកូនសោ PGP របស់យើង; សូមទាញយកពី​ទំព័រ [Microsoft Security Response Center PGP Key](https://aka.ms/opensource/security/pgpkey)។ + +អ្នកគួរត្រូវទទួលបានការឆ្លើយតបក្នុងរយៈពេល ២៤ម៉ោង។ ប្រសិនបើមិនបានទទួល សូមតាមដានតាមអ៊ីមែលដើម្បីធ្វើការត្រួតពិនិត្យថា យើងបានទទួលសារដើមរបស់អ្នក។ ព័ត៌មានបន្ថែមអាចរកបាននៅ [microsoft.com/msrc](https://aka.ms/opensource/security/msrc)។ + +សូមបញ្ចូលព័ត៌មានដែលត្រូវការដូចបានបញ្ជាក់ខាងក្រោម (បើអាចផ្តល់បាន) ដើម្បីជួយឲ្យយើងយល់ពីធម្មជាតិនិងវិសាលភាពនៃបញ្ហាដែលអាចមាន៖ + + * ប្រភេទបញ្ហា (ដូចជា buffer overflow, SQL injection, cross-site scripting, ល។) + * ផ្លូវពេញនៃឯកសារប្រភពដែលពាក់ព័ន្ធនឹងបញ្ហា + * ទីតាំងកូដប្រភពដែលរងផលប៉ះពាល់ (tag/branch/commit ឬ URL ត្រង់) + * ការកំណត់ពិសេសណាមួយដែលត្រូវការសម្រាប់បង្កើតបញ្ហា + * សេចក្ដីណែនាំជំហាន​ដើម្បីបង្កើតបញ្ហា + * កូដបំភ្លឺគំរូឬកូដប្រើប្រាស់ (បើអាច) + * ផលប៉ះពាល់នៃបញ្ហា រួមទាំងរបៀបដែលអ្នកវាយប្រហារអាចប្រើប្រាស់បានបញ្ហា + +ព័ត៌មាននេះនឹងជួយយើងក្នុងការត្រួតពិនិត្យរបាយការណ៍របស់អ្នកបានយ៉ាងរហ័ស។ + +បើអ្នកកំពុងរាយការណ៍សម្រាប់រង្វាន់ bug bounty, របាយការណ៍ពេញលេញកាន់តែច្រើនអាចជួយផ្តល់រង្វាន់ខ្ពស់ជាងមុន។ សូមមកមើលទំព័រ [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) របស់យើងសម្រាប់ព័ត៌មានលម្អិតអំពីកម្មវិធីដែលកំពុងដំណើរការ។ + +## ភាសាដែលចូលចិត្ត + +យើងចូលចិត្តឲ្យការទំនាក់ទំនងទាំងអស់មានជាភាសាអង់គ្លេស។ + +## គោលនយោបាយ + +Microsoft អនុវត្តគោលការណ៍ [ការបង្ហាញចំណុចខ្សោយសុវត្ថិភាពដោយសមាសភាព](https://aka.ms/opensource/security/cvd)។ + +--- + + +**ការហាមឃាត់**៖ +ឯកសារនេះត្រូវបានបកប្រែក្នុងការប្រើប្រាស់សេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ទោះបីយើងខិតខំសម្រាប់ភាពត្រឹមត្រូវ ក៏សូមយល់ដឹងថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុស ឬកការមិនត្រឹមត្រូវ។ ឯកសារដើមនៅក្នុងភាសាដើមរបស់វាគួរត្រូវបានគិតថាជាភាពទម្លាប់ផ្លូវការសម្រាប់ប្រភព។ សម្រាប់ព័ត៌មានសំខាន់ ការបកប្រែដោយមនុស្សជំនាញគឺត្រូវបានផ្ដល់អនុសាសន៍។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំនៃការបកប្រែនេះឡើយ។ + \ No newline at end of file diff --git a/translations/km/etc/CODE_OF_CONDUCT.md b/translations/km/etc/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..dc5f9594 --- /dev/null +++ b/translations/km/etc/CODE_OF_CONDUCT.md @@ -0,0 +1,16 @@ +# នីតិវិធីអន្តរក្រសួងទូទៅរបស់ Microsoft សម្រាប់កូដបើកចំហ + +គម្រោងនេះបានអនុម័តនូវ [នីតិវិធីអន្តរក្រសួងទូទៅរបស់ Microsoft សម្រាប់កូដបើកចំហ](https://opensource.microsoft.com/codeofconduct/)។ + +ធនធានៈ: + +- [នីតិវិធីអន្តរក្រសួងទូទៅរបស់ Microsoft សម្រាប់កូដបើកចំហ](https://opensource.microsoft.com/codeofconduct/) +- [សំណួរញឹកញាប់អំពីនីតិវិធីអន្តរក្រសួងដែល Microsoft បានដាក់](https://opensource.microsoft.com/codeofconduct/faq/) +- ទំនាក់ទំនង [opencode@microsoft.com](mailto:opencode@microsoft.com) ជាមួយសំនួរឬបញ្ហា + +--- + + +**ការបដិសេធ**: +ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ក្នុងខណៈពេលដែលយើងខិតខំរកភាពត្រឹមត្រូវ សូមយល់ថាការបកប្រែដោយស្វ័យប្រវត្តិនេះអាចមានកំហុស ឬគ្មានភាពត្រឹមត្រូវបាន។ ឯកសារដើមនៅក្នុងភាសាមាតុភូមិគួរត្រូវបានគេចាត់ទុកជាអ្នកផ្គត់ផ្គង់ដើម។ សម្រាប់ព័ត៌មានសំខាន់ៗ ការបកប្រែដោយមនុស្សជំនាញត្រូវបានផ្តល់អនុសាសន៍។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំនិងការពន្យល់ខុសនៃការប្រើប្រាស់ការបកប្រែនេះឡើយ។ + \ No newline at end of file diff --git a/translations/km/etc/CONTRIBUTING.md b/translations/km/etc/CONTRIBUTING.md new file mode 100644 index 00000000..4eac7313 --- /dev/null +++ b/translations/km/etc/CONTRIBUTING.md @@ -0,0 +1,26 @@ +# ការចូលរួម + +គម្រោងនេះស្វាគមន៍ការចូលរួម និងការផ្តល់យោបល់។ ការចូលរួមភាគច្រើនតម្រូវឱ្យអ្នកយល់ព្រមនឹងកិច្ចសន្យា Contributor License Agreement (CLA) ប្រកាសថាអ្នកមានសិទ្ធិហើយពិតជាប្រើសិទ្ធិដល់ការចូលរួមរបស់អ្នក។ សម្រាប់ព័ត៌មានលម្អិត សូមចូលទៅកាន់ https://cla.microsoft.com។ + +នៅពេលអ្នកដាក់សំណើ Pull Request មួយ CLA-bot នឹងកំណត់ដោយស្វ័យប្រវត្តថាតើអ្នកត្រូវបញ្ជាក់CLA និងត្រៀមស្លាកឱ្យសមរម្យ (ដូចជា ស្លាក, មតិយោបល់)។ គ្រាន់តែអនុវត្តន៍បទបញ្ជាដែលបានផ្តល់ដោយ bot នោះ។ អ្នកត្រូវតែបំពេញនេះតែម្តងតែប៉ុណ្ណោះសម្រាប់គ្រប់ឃ្លាំងសម្រាប់ប្រើCLA របស់យើង។ + +គម្រោងនេះបានទទួលយក [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/។ +សម្រាប់ព័ត៌មានបន្ថែម សូមមើល [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) +ឬទំនាក់ទំនង [opencode@microsoft.com](mailto:opencode@microsoft.com) សម្រាប់សំណួរឬមតិយោបល់បន្ថែម។ + +# កំពុងស្វែងរកការចូលរួម + +ពេលនេះ យើងកំពុងស្វែងរកការចូលរួមយ៉ាងសកម្មនៅលើប្រធានបទដូចខាងក្រោម៖ + +- [ ] សរសេរផ្នែកអំពី ការរៀនដំណើរការពហុបញ្ញា (Deep Reinforcement Learning) +- [ ] បង្កើនផ្នែក និងសៀវភៅកំណត់កំណត់អំពី ការរកឃើញវត្ថុ (Object Detection) +- [ ] PyTorch Lightning (សម្រាប់ [ផ្នែកនេះ](https://github.com/microsoft/AI-For-Beginners/blob/main/3-NeuralNetworks/05-Frameworks/README.md)) +- [ ] សរសេរផ្នែក និងគំរូអំពី ការទទួលស្គាល់អត្តសញ្ញាណឈ្មោះ (Named Entity Recognition) +- [ ] បង្កើតគំរូសម្រាប់បណ្តុះបណ្តាល embedding របស់យើងសម្រាប់ [ផ្នែកនេះ](https://github.com/microsoft/AI-For-Beginners/tree/main/5-NLP/15-LanguageModeling) + +--- + + +**បញ្ជាក់**ៈ +ឯកសារនេះបានបកប្រែដោយប្រើសេវាបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលដែលយើងខិតខំសម្រាប់ភាពត្រឹមត្រូវ សូមជ្រាបថាការបកប្រែស្វ័យប្រវត្តិអាចមានកំហុសឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមក្នុងភាសាមូលដ្ឋានគួរត្រូវបានពិចារណាចំពោះជាឆ្នើមអំពីព័ត៌មាន។ សម្រាប់ព័ត៌មានសំខាន់ យើងបានផ្តល់អនុសាសន៍ឱ្យមានការបកប្រែដោយអ្នកជំនាញមនុស្សពិជ្រាជួយ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំន្តាក់និងការបកប្រែខុសឆ្គងណាមួយដែលកើតឡើងពីការប្រើប្រាស់ការបកប្រែនេះទេ។ + \ No newline at end of file diff --git a/translations/km/etc/Mindmap.md b/translations/km/etc/Mindmap.md new file mode 100644 index 00000000..eea3df9d --- /dev/null +++ b/translations/km/etc/Mindmap.md @@ -0,0 +1,80 @@ +# AI + +## [ការណែនាំអំពី AI](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/1-Intro/README.md) + - និយមន័យ AI + - ប្រវត្តិសាស្ត្រ AI + - ការយកវិធានដល់ AI + - ពីលើចុះ/រំលេចន័យ + - ពីក្រោមឡើង/សរសៃប្រសាទ + - វិវត្តន៍ + - Synergetic / AI កើតឡើងដោយផ្ទាល់ + - [សាលាអាជីវកម្ម Microsoft AI](https://www.microsoft.com/ai/ai-business-school/?WT.mc_id=academic-77998-cacaste) + +## [AI រូបសំណាក់](https://github.com/microsoft/AI-For-Beginners/blob/main/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) + - ឧបករណ៍ Semantic Web + +## [បណ្តាញសរសៃប្រសាទ](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/3-NeuralNetworks/README.md) + - [Perceptron](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/3-NeuralNetworks/03-Perceptron/README.md) + - [បណ្តាញច្រើនស្រទាប់](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/3-NeuralNetworks/04-OwnFramework/README.md) + - [ការណែនាំអំពី Frameworks](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/3-NeuralNetworks/05-Frameworks/README.md) + - [PyTorch](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/3-NeuralNetworks/05-Frameworks/IntroPyTorch.ipynb) + - [TensorFlow](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/3-NeuralNetworks/05-Frameworks/IntroKerasTF.md) + - [ការវាយប្រហារលើវា](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/3-NeuralNetworks/05-Frameworks/Overfitting.md) + +## [កំណត់មើលកុំព្យូទ័រ](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/README.md) + - នៅលើ MS Learn + - [គ្រឹះអំពី AI: ស្វែងយល់កំណត់មើលកុំព្យូទ័រ](https://docs.microsoft.com/learn/paths/explore-computer-vision-microsoft-azure/?WT.mc_id=academic-77998-cacaste) + - [CV ជាមួយ PyTorch](https://docs.microsoft.com/learn/modules/intro-computer-vision-pytorch/?WT.mc_id=academic-77998-cacaste) + - [CV ជាមួយ TensorFlow](https://docs.microsoft.com/learn/modules/intro-computer-vision-TensorFlow/?WT.mc_id=academic-77998-cacaste) + - [ការណែនាំអំពី CV. OpenCV](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/06-IntroCV/README.md) + - [បណ្តាញរលកស្រប](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/07-ConvNets/README.md) + - [រចនាសម្ព័ន្ធ CNN](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/07-ConvNets/CNN_Architectures.md) + - [ការរៀនផ្ទេរ](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/08-TransferLearning/README.md) + - [កន្លែងបង្រៀន](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md) + - [Autoencoders និង VAEs](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/09-Autoencoders/README.md) + - [បណ្តាញប្រកួតប្រជែងបង្កើត](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/10-GANs/README.md) + - [ផ្ទេររចនាសម្ព័ន្ធរូបភាព](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/10-GANs/StyleTransfer.ipynb) + - [ការរកឃើញវត្ថុ](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/11-ObjectDetection/README.md) + - [ការបែងចែក](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/12-Segmentation/README.md) + +## [កំណត់ភាសាធម្មជាតិ](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/README.md) + - នៅលើ MS Learn + - [គ្រឹះអំពី AI: ស្វែងយល់ NLP](https://docs.microsoft.com/learn/paths/explore-natural-language-processing/?WT.mc_id=academic-77998-cacaste) + - [NLP ជាមួយ PyTorch](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-pytorch/?WT.mc_id=academic-77998-cacaste) + - [NLP ជាមួយ TensorFlow](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-TensorFlow/?WT.mc_id=academic-77998-cacaste) + - [ការបង្ហាញអត្ថបទ](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/13-TextRep/README.md) + - ប្រអប់ពាក្យ + - TF/IDF + - [ការតម្រុយន័យភាសា](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/14-Embeddings/README.md) + - Word2Vec + - GloVE + - [ការគំរូភាសា](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/15-LanguageModeling) + - [បណ្តាញប្រសាទកើតឡើងម្តងទៀត](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/16-RNN/README.md) + - LSTM + - GRU + - [បណ្តាញបង្កើតកើតឡើងម្តងទៀត](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/17-GenerativeNetworks/README.md) + - [Transformers និង BERT](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/18-Transformers/README.md) + - [ការកំណត់ឈ្មោះបុគ្គលិក](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/19-NER/README.md) + - [ការបង្កើតអត្ថបទ និង GPT](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/20-LanguageModels/README.md) +## បច្ចេកទេសផ្សេងទៀត + - [គណិតវិទ្យាជីវិត](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/6-Other/21-GeneticAlgorithms/README.md) + - [ការរៀនជំរុញជ្រៅ](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/6-Other/22-DeepRL/README.md) + - [ប្រព័ន្ធភាគីច្រើន](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/6-Other/23-MultiagentSystems/README.md) + +## [សីលធម៌ AI](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/7-Ethics/README.md) + - [MS Learn លើការទទួលខុសត្រូវ AI](https://docs.microsoft.com/learn/paths/responsible-ai-business-principles/?WT.mc_id=academic-77998-cacaste) +## បន្ថែម + - [បណ្តាញពហុរូបមន្ត](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/X-Extras/X1-MultiModal/README.md) + - [CLIP](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/X-Extras/X1-MultiModal/Clip.ipynb) + - DALL-E + - VQ-GAN + +--- + + +**ការបដិសេធ** ៖ +ឯកសារនេះត្រូវបានបម្លែងជាភាសាខ្មែរដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលដែលយើងខិតខំសម្រាប់ភាពជាក់លាក់ សូមយកចិត្តទុកដាក់ថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុសឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមនៅក្នុងភាសាដែលមានប្រភពដំណើរការ គួរត្រូវបានពិចារណាថា ជា ផ្នែកគ្រប់គ្រងទិន្នន័យ​សំខាន់។ សម្រាប់ព័ត៌មានសំខាន់ៗ សូមអនុញ្ញាតឲ្យមានការបកប្រែដោយមនុស្សជំនាញ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកស្រាយខុសប្លែកណាមួយទេ ដែលកើតមានពីការប្រើប្រាស់ការបកប្រែនេះ។ + \ No newline at end of file diff --git a/translations/km/etc/SUPPORT.md b/translations/km/etc/SUPPORT.md new file mode 100644 index 00000000..9fb0f372 --- /dev/null +++ b/translations/km/etc/SUPPORT.md @@ -0,0 +1,18 @@ +# គាំទ្រ + +## របៀបដាក់បញ្ហា និងទទួលបានជំនួយ + +គម្រោងនេះប្រើ GitHub Issues ដើម្បីតាមដានកំហុស និងសំណើមុខងារ។ សូមស្វែងរកបញ្ហាដែលមានស្រាប់ មុនពេលដាក់បញ្ហាថ្មីដើម្បីជៀសវាងការរួមបញ្ចូល។ សម្រាប់បញ្ហាថ្មី ដាក់កំហុសរបស់អ្នក ឬសំណើមុខងារជាបញ្ហាថ្មី។ + +សម្រាប់ជំនួយ និងសំណួរទាក់ទងនឹងការប្រើគម្រោងនេះ សូមប្រើកន្លែងសម្តែងមតិយោបល់។ + +## គោលការណ៍គាំទ្ររបស់ Microsoft + +ការគាំទ្រសម្រាប់គម្រោងនេះកំណត់ត្រឹមខ្សែធនធានដែលបានរាយក្នុងខាងលើ។ + +--- + + +**ការបដិសេធ**៖ +ឯកសារនេះត្រូវបានប្រែសម្រួលដោយប្រើសេវាកម្មប្រែសម្រួល AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលដែលយើងខិតខំប្រឹងប្រែងធ្វើយឲ្យមានភាពត្រឹមត្រូវ សូមជ្រាបថាការប្រែសម្រួលដោយស្វ័យប្រវត្តិនិងអាចមានកំហុស ឬភាពមិនត្រឹមត្រូវបានចងក្រង។ ឯកសារដើមក្នុងភាសាដំណើរការដើមគួរត្រូវបានទទួលស្គាល់ថាជា ប្រភពឯកសារដែលមានអំណាចផ្លូវការ។ សម្រាប់ព័ត៌នាសំខាន់ៗ សូមផ្តល់អនុសាសន៍ឲ្យប្រើការប្រែសម្រួលដោយមនុស្សជំនាញដែលមានវិជ្ជាជីវៈ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់បកប្បន្ន ឬការបញ្ជាក់ខុសពីការប្រើប្រាស់ការប្រែសម្រួលនេះឡើយ។ + \ No newline at end of file diff --git a/translations/km/etc/TRANSLATIONS.md b/translations/km/etc/TRANSLATIONS.md new file mode 100644 index 00000000..5e2cb72a --- /dev/null +++ b/translations/km/etc/TRANSLATIONS.md @@ -0,0 +1,40 @@ +# ចូលរួមដោយបកប្រែមេរៀន + +យើងស្វាគមន៍ការបកប្រែសម្រាប់មេរៀនក្នុងកម្មវិធីសិក្សានេះ! + +## សេចក្ដីណែនាំ + +មានថតឯកសារនៅក្នុងថតមេរៀននីមួយៗ និងថតបង្កើតដំណើរកម្សាន្តមេរៀនដែលមានឯកសារបកប្រែ markdown ។ + +> សម្គាល់ សូមកុំបកប្រែកូដណាមួយនៅក្នុងឯកសារឧទាហរណ៍កូដ; អ្វីដែលត្រូវបកប្រែមានតែ README, ភារកិច្ច, និងចម្លើយសំណួរ។ អរគុណ! + +ឯកសារប្រែត្រូវតែអនុវត្តតាមនាមឯកសារខាងក្រោម៖ + +**README._[ភាសា]_.md** + +ដែល _[ភាសា]_ ជាអក្សរពីរពីររបស់ភាសាមួយ ដែលអនុវត្តតាមស្តង់ដារ ISO 639-1 (ឧ. `README.es.md` សម្រាប់ភាសាអេស្ប៉ាញ និង `README.nl.md` សម្រាប់ភាសាដាច់) + +**assignment._[ភាសា]_.md** + +ដូចបែប README សូមបកប្រែភារកិច្ចផងដែរ។ + +**ចម្លើយសំណួរ** + +1. បន្ថែមការបកប្រែរបស់អ្នកទៅកាន់កម្មវិធី right-app ដោយបន្ថែមឯកសារនៅទីនេះ៖ https://github.com/microsoft/AI-For-Beginners/tree/main/etc/quiz-app/src/assets/translations ជាមួយនាមឯកសារឱ្យត្រឹមត្រូវ (en.json, fr.json)។ **សូមកុំបកប្រែពាក្យ 'true' ឬ 'false' ទេ។ អរគុណ!** + +2. បន្ថែមកូដភាសារបស់អ្នកទៅក្នុងបញ្ជីស្រទាប់ចុះរបស់ឯកសារ App.vue របស់ right-app។ + +3. កែសម្រួលឯកសារ [translations index.js](https://github.com/microsoft/AI-For-Beginners/blob/main/etc/quiz-app/src/assets/translations/index.js) របស់ right-app ដើម្បីបន្ថែមភាសារបស់អ្នក។ + +4. ចុងបញ្ចប់ កែសម្រួលតំណភ្ជាប់ចម្លើយសំណួរទាំងអស់នៅក្នុងឯកសារ README.md ដែលបានបកប្រែរបស់អ្នក ដើម្បីបញ្ជូនទៅចម្លើយសំណួរដែលបានបកប្រែរបស់អ្នកដោយផ្ទាល់៖ https://red-field-0a6ddfd03.1.azurestaticapps.net/quiz/1 ក្លាយជា https://red-field-0a6ddfd03.1.azurestaticapps.net/quiz/1?loc=id + +**អរគុណ** + +យើងរាប់អានកិច្ចខិតខំប្រឹងប្រែងរបស់អ្នកយ៉ាងខ្លាំង! + +--- + + +**ការបដិសេធ**៖ +ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលយើងខិតខំប្រឹងប្រែងដើម្បីឱ្យបានភាពត្រឹមត្រូវ សូមយល់ឱ្យបានដឹងថាការបកប្រែដោយស្វ័យប្រវត្តិនេះអាចមានកំហុស ឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមនៅភាសាដើមគួរឱ្យទុកចិត្តជាមូលដ្ឋានសម្រាប់ព័ត៌មានដែលត្រឹមត្រូវ។ សម្រាប់ព័ត៌មានសំខាន់ៗ យើងផ្ដល់អនុសាសន៍ឱ្យប្រើការបកប្រែដោយមនុស្សជំនាញ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកប្រែខុសដែលកើតមានពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។ + \ No newline at end of file diff --git a/translations/km/etc/quiz-app/README.md b/translations/km/etc/quiz-app/README.md new file mode 100644 index 00000000..da54efca --- /dev/null +++ b/translations/km/etc/quiz-app/README.md @@ -0,0 +1,131 @@ +# ការប្រលង + +ការប្រលង​ទាំងនេះ​គឺជាការប្រលងមុននិងបន្ទាប់ពីមេរៀនសម្រាប់មុខវិជ្ជា AI នៅ https://aka.ms/ai-beginners + +## ការបន្ថែមសំណុំការប្រលងបកប្រែ + +បន្ថែមការបកប្រែការប្រលងដោយបង្កើតរចនាសម្ព័ន្ធការប្រលងដែលត្រូវគ្នានៅក្នុងថត `assets/translations`។ ការប្រលងតែមួយគត់មាននៅក្នុង `assets/translations/en`។ ការប្រលងត្រូវបានបំបែកជាក្រុមជាច្រើនតាមមេរៀន។ ពិនិត្យឲ្យប្រាកដថាជួរលេខត្រូវតាមផ្នែកការប្រលងត្រឹមត្រូវ។ មានការប្រលងសរុប ៤០ ក្នុងមុខវិជ្ជានេះ ហើយការរាប់ចាប់ផ្តើមពី ០។ + +បន្ទាប់ពីកែសម្រួលការបកប្រែ សូមកែសម្រួលឯកសារ index.js នៅក្នុងថតការបកប្រែ ដើម្បីនាំចូលឯកសារទាំងអស់តាមបទបញ្ជានៅក្នុង `en`។ + +កែសម្រួលឯកសារ `index.js` នៅក្នុង `assets/translations` ដើម្បីនាំចូលឯកសារបកប្រែថ្មី។ + +បន្ទាប់ពីនេះ កែសម្រួលចុចជ្រើសរើសភាសា(dropdown) នៅក្នុង `App.vue` ក្នុងកម្មវិធីនេះ ដើម្បីបន្ថែមភាសារបស់អ្នក។ ត្រូវផ្គូផ្គងអក្សររួមតំណាងភាសានេះជាមួយឈ្មោះថតសម្រាប់ភាសារបស់អ្នក។ + +ចុងក្រោយ កែសម្រួលតំណភ្ជាប់ការប្រលងទាំងអស់នៅក្នុងមេរៀនបកប្រែ ប្រសិនបើវាមាន ដើម្បីបញ្ចូលការបកប្រែទីនេះជាពណ៌នាការស្នើសុំនៅ query parameter: `?loc=fr` ជាឧទាហរណ៍។ + +## ការតំឡើងគម្រោង + +``` +npm install +``` + +### ការបញ្ចូលនិងផ្ទុកឡើងឡើងវិញសម្រាប់ការអភិវឌ្ឍន៍ + +``` +npm run serve +``` + +### ការបញ្ចូលនិងកាត់បន្ថយសម្រាប់ការផលិត + +``` +npm run build +``` + +### ការត្រួតពិនិត្យនិងជួសជុលឯកសារ + +``` +npm run lint +``` + +### ការប្តូរតំរូវការផ្ទាល់ខ្លួន + +មើល [យោងការកំណត់](https://cli.vuejs.org/config/)។ + +ឥណទាន៖ អរគុណចំពោះមួយនៃកំណែដើមនៃកម្មវិធីការប្រលងនេះ៖ https://github.com/arpan45/simple-quiz-vue + +## ការបង្ហោះទៅកាន់ Azure + +នេះជាមគ្គុទេសក៍ជាគន្លឹះជំហាន-ដោយ-ជំហានដើម្បីជួយអ្នកចាប់ផ្តើម៖ + +1. Fork ប្រភព GitHub មួយ +ធានាថាកូដកម្មវិធីវេបស្ថិតស្ថិតរបស់អ្នកមាននៅក្នុងកន្លែងបញ្ជារ GitHub របស់អ្នក។ Fork ប្រភពនេះ។ + +2. បង្កើត Azure Static Web App +- បង្កើត និង [គណនី Azure](http://azure.microsoft.com) +- ចូលទៅកាន់ [portal Azure](https://portal.azure.com) +- ចុចលើ “Create a resource” ហើយស្វែងរក “Static Web App”។ +- ចុច “Create”។ + +3. កំណត់រចនាសម្ព័ន្ធ Static Web App +- មូលដ្ឋាន៖ Subscription: ជ្រើសរើសការជាវ Azure របស់អ្នក។ +- Resource Group: បង្កើតក្រុមធនធានថ្មីឬប្រើក្រុមដែលមានរួចហើយ។ +- Name: ផ្ដល់ឈ្មោះសម្រាប់កម្មវិធីវេបស្ថិតរបស់អ្នក។ +- តំបន់៖ ជ្រើសរើសតំបន់ដែលនៅជិតអ្នកប្រើប្រាស់របស់អ្នកបំផុត។ + +- #### ព័ត៌មានការបង្ហោះ: +- ប្រភព: ជ្រើសរើស “GitHub”។ +- គណនី GitHub: អនុញ្ញាតអោយ Azure ទទួលបានការចូលទៅគណនី GitHub របស់អ្នក។ +- សហគមន៍: ជ្រើសរើសសហគមន៍ GitHub របស់អ្នក។ +- ឃ្លាំងកូដ: ជ្រើសឃ្លាំងកូដដែលមានកម្មវិធីវេបស្ថិតរបស់អ្នក។ +- សាខា៖ ជ្រើសរើសសាខាដែលអ្នកចង់បង្ហោះពី។ + +- #### ព័ត៌មានសំណង់: +- ការកំណត់សំណង់៖ ជ្រើសរើសបណ្ដុំអាវផេកដែលកម្មវិធីរបស់អ្នកបានសង់ជាមួយ (ឧ. React, Angular, Vue, ល។)។ +- ទីតាំងកម្មវិធី៖ បញ្ជាក់ថតឯកសារដែលមានកូដកម្មវិធីរបស់អ្នក (ឧ. / ប្រសិនបើវានៅក្នុងជម្រុះ)។ +- ទីតាំង API៖ ប្រសិនបើអ្នកមាន API បញ្ជាក់ទីតាំងរបស់វា (ជាជម្រើស)។ +- ទីតាំងលទ្ធផល៖ បញ្ជាក់ថតឯកសារដែលផលលទ្ធផលសំណង់ត្រូវបង្កើត (ឧ. build ឬ dist)។ + +4. ពិនិត្យហើយបង្កើត +ពិនិត្យការកំណត់របស់អ្នកហើយចុច "Create"។ Azure នឹងរៀបចំធនធានចាំបាច់ និងបង្កើតកម្មវិធី GitHub Actions ក្នុងឃ្លាំងកូដរបស់អ្នក។ + +5. កម្មវិធី GitHub Actions +Azure នឹងបង្កើតឯកសារកម្មវិធី GitHub Actions ដោយស្វ័យប្រវត្តិនៅក្នុងឃ្លាំងកូដរបស់អ្នក (.github/workflows/azure-static-web-apps-.yml)។ កម្មវិធីនេះនឹងរៀបចំដំណើរការសំណង់និងការបង្ហោះ។ + +6. តាមដានការបង្ហោះ +ចូលទៅកាន់ផ្ទាំង “Actions” ក្នុងឃ្លាំងកូដ GitHub របស់អ្នក។ +អ្នកគួរមើលឃើញកម្មវិធីកំពុងដំណើរការ។ កម្មវិធីនេះនឹងសង់និងបង្ហោះកម្មវិធីវេបស្ថិតរបស់អ្នកទៅ Azure។ +ពេលដែលកម្មវិធីបញ្ចប់ កម្មវិធីរបស់អ្នកនឹងមាននៅលើ URL Azure ដែលបានផ្ដល់។ + +### ឧទាហរណ៍ឯកសារ Workflow + +នេះជាឧទាហរណ៍ឯកសារកម្មវិធី GitHub Actions ដែលអាចមានរូបរាងដូចខាងក្រោម៖ +name: Azure Static Web Apps CI/CD +``` +on: + push: + branches: + - main + pull_request: + types: [opened, synchronize, reopened, closed] + branches: + - main + +jobs: + build_and_deploy_job: + runs-on: ubuntu-latest + name: Build and Deploy Job + steps: + - uses: actions/checkout@v2 + - name: Build And Deploy + id: builddeploy + uses: Azure/static-web-apps-deploy@v1 + with: + azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN }} + repo_token: ${{ secrets.GITHUB_TOKEN }} + action: "upload" + app_location: "etc/quiz-app # App source code path" + api_location: ""API source code path optional + output_location: "dist" #Built app content directory - optional +``` + +### ឧបករណ៍បន្ថែម +- [ឯកសារអំពី Azure Static Web Apps](https://learn.microsoft.com/azure/static-web-apps/getting-started) +- [ឯកសារអំពី GitHub Actions](https://docs.github.com/actions/use-cases-and-examples/deploying/deploying-to-azure-static-web-app) + +--- + + +**ការបដិសេធ**៖ +ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពួកយើងខិតខំទទួលប្រាកដភាព ពPleaseរយៈពេលដឹងថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុសឬការខុសឡើង។ ឯកសារដើមក្នុងភាសាតែមួយគួរត្រូវបានចាត់ទុកជាឯកសារដែលមានអំណាចច្បាស់លាស់។ សម្រាប់ព័ត៌មានសំខាន់ៗ សូមណែនាំឱ្យប្រើការបកប្រែដោយមនុស្សជំនាញវិជ្ជាជីវៈ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំនូវកំហុស ឬការបកប្រែខុស ណាដែលកើតឡើងពីការប្រើប្រាស់ការបកប្រែនេះទេ។ + \ No newline at end of file diff --git a/translations/km/examples/03-image-classifier.ipynb b/translations/km/examples/03-image-classifier.ipynb new file mode 100644 index 00000000..ea23caa5 --- /dev/null +++ b/translations/km/examples/03-image-classifier.ipynb @@ -0,0 +1,389 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# អ្នកចាត់ថ្នាក់រូបភាពសាមញ្ញ\n", + "\n", + "សៀវភៅកំណត់ត្រានេះបង្ហាញអ្នកពីរបៀបចាត់ថ្នាក់រូបភាពដោយប្រើបណ្តាញសរសៃប្រសammatមុនដែលបានបណ្តុះបណ្តាលរួច។\n", + "\n", + "**អ្វីដែលអ្នកនឹងរៀន:**\n", + "- របៀបផ្ទុក និងប្រើម៉ូដែលដែលបានបណ្តុះបណ្តាលរួច\n", + "- ការប្រមូលរូបភាពជាមុន\n", + "- ការធ្វើការព្យាករណ៍លើរូបភាព\n", + "- ការយល់ដឹងអំពីពិន្ទុជំនាញ\n", + "\n", + "**ករណីប្រើប្រាស់:** កំណត់អត្តសញ្ញាណវត្ថុក្នុងរូបភាព (ដូចជា \"ឆ្មា\", \"ឆ្កែ\", \"រថយន្ត\", ល។)\n", + "\n", + "---\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ជំហានទី 1៖ នាំចូលបណ្ណាល័យដែលត្រូវការ\n", + "\n", + "មកនាំចូលឧបករណ៍ដែលយើងត្រូវការគ្នា។ កុំបារម្ភបើអ្នកមិនយល់ពីអ្វីៗទាំងអស់ទេនៅឡើយ!\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Core libraries\n", + "import numpy as np\n", + "from PIL import Image\n", + "import requests\n", + "from io import BytesIO\n", + "\n", + "# TensorFlow for deep learning\n", + "try:\n", + " import tensorflow as tf\n", + " from tensorflow.keras.applications import MobileNetV2\n", + " from tensorflow.keras.applications.mobilenet_v2 import preprocess_input, decode_predictions\n", + " print(\"✅ TensorFlow loaded successfully!\")\n", + " print(f\" Version: {tf.__version__}\")\n", + "except ImportError:\n", + " print(\"❌ Please install TensorFlow: pip install tensorflow\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ជំហានទី 2: បញ្ចូលគំរូដែលបានបណ្តុះបណ្តាលរួចហើយ\n", + "\n", + "យើងនឹងប្រើ **MobileNetV2**, បណ្តាញសរសៃប្រសាទដែលបានបណ្តុះបណ្តាលរួចហើយលើរូបភាពរាប់លានលាន។\n", + "\n", + "នេះហៅថា **ការរៀនផ្ទេរ** - ប្រើគំរូដែលនរណាម្នាក់បានបណ្តុះបណ្តាលរួចហើយ!\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"📦 Loading pre-trained MobileNetV2 model...\")\n", + "print(\" This may take a minute on first run (downloading weights)...\")\n", + "\n", + "# Load the model\n", + "# include_top=True means we use the classification layer\n", + "# weights='imagenet' means it was trained on ImageNet dataset\n", + "model = MobileNetV2(weights='imagenet', include_top=True)\n", + "\n", + "print(\"✅ Model loaded!\")\n", + "print(f\" The model can recognize 1000 different object categories\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ជំហានទី 3: មុខងារជំនួយ\n", + "\n", + "មកបង្កើតមុខងារដើម្បីផ្ទុកនិងរៀបចំរូបភាពសម្រាប់ម៉ូឌែលរបស់យើង។\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def load_image_from_url(url):\n", + " \"\"\"\n", + " Load an image from a URL.\n", + " \n", + " Args:\n", + " url: Web address of the image\n", + " \n", + " Returns:\n", + " PIL Image object\n", + " \"\"\"\n", + " response = requests.get(url)\n", + " img = Image.open(BytesIO(response.content))\n", + " return img\n", + "\n", + "\n", + "def prepare_image(img):\n", + " \"\"\"\n", + " Prepare an image for the model.\n", + " \n", + " Steps:\n", + " 1. Resize to 224x224 (model's expected size)\n", + " 2. Convert to array\n", + " 3. Add batch dimension\n", + " 4. Preprocess for MobileNetV2\n", + " \n", + " Args:\n", + " img: PIL Image\n", + " \n", + " Returns:\n", + " Preprocessed image array\n", + " \"\"\"\n", + " # Resize to 224x224 pixels\n", + " img = img.resize((224, 224))\n", + " \n", + " # Convert to numpy array\n", + " img_array = np.array(img)\n", + " \n", + " # Add batch dimension (model expects multiple images)\n", + " img_array = np.expand_dims(img_array, axis=0)\n", + " \n", + " # Preprocess for MobileNetV2\n", + " img_array = preprocess_input(img_array)\n", + " \n", + " return img_array\n", + "\n", + "\n", + "def classify_image(img):\n", + " \"\"\"\n", + " Classify an image and return top predictions.\n", + " \n", + " Args:\n", + " img: PIL Image\n", + " \n", + " Returns:\n", + " List of (class_name, confidence) tuples\n", + " \"\"\"\n", + " # Prepare the image\n", + " img_array = prepare_image(img)\n", + " \n", + " # Make prediction\n", + " predictions = model.predict(img_array, verbose=0)\n", + " \n", + " # Decode predictions to human-readable labels\n", + " # top=5 means we get the top 5 most likely classes\n", + " decoded = decode_predictions(predictions, top=5)[0]\n", + " \n", + " # Convert to simpler format\n", + " results = [(label, float(confidence)) for (_, label, confidence) in decoded]\n", + " \n", + " return results\n", + "\n", + "\n", + "print(\"✅ Helper functions ready!\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ជំហានទី 4៖ សាកល្បងលើរូបភាពគំរូ\n", + "\n", + "មកព្យាយាមចាត់ថ្នាក់រូបភាពខ្លះពីអ៊ីនធឺណិត!\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Sample images to classify\n", + "# These are from Unsplash (free stock photos)\n", + "test_images = [\n", + " {\n", + " \"url\": \"https://images.unsplash.com/photo-1514888286974-6c03e2ca1dba?w=400\",\n", + " \"description\": \"A cat\"\n", + " },\n", + " {\n", + " \"url\": \"https://images.unsplash.com/photo-1552053831-71594a27632d?w=400\",\n", + " \"description\": \"A dog\"\n", + " },\n", + " {\n", + " \"url\": \"https://images.unsplash.com/photo-1511919884226-fd3cad34687c?w=400\",\n", + " \"description\": \"A car\"\n", + " },\n", + "]\n", + "\n", + "print(f\"🧪 Testing on {len(test_images)} images...\")\n", + "print(\"=\" * 70)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### ចំណាត់ថ្នាក់រាល់រូបភាព\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for i, img_data in enumerate(test_images, 1):\n", + " print(f\"\\n📸 Image {i}: {img_data['description']}\")\n", + " print(\"-\" * 70)\n", + " \n", + " try:\n", + " # Load image\n", + " img = load_image_from_url(img_data['url'])\n", + " \n", + " # Display image\n", + " display(img.resize((200, 200))) # Show smaller version\n", + " \n", + " # Classify\n", + " results = classify_image(img)\n", + " \n", + " # Show predictions\n", + " print(\"\\n🎯 Top 5 Predictions:\")\n", + " for rank, (label, confidence) in enumerate(results, 1):\n", + " # Create a visual bar\n", + " bar_length = int(confidence * 50)\n", + " bar = \"█\" * bar_length\n", + " \n", + " print(f\" {rank}. {label:20s} {confidence*100:5.2f}% {bar}\")\n", + " \n", + " except Exception as e:\n", + " print(f\"❌ Error: {e}\")\n", + "\n", + "print(\"\\n\" + \"=\" * 70)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ជំហានទី 5: ព្យាយាមរូបភាពផ្ទាល់ខ្លួនរបស់អ្នក!\n", + "\n", + "ជំនួស URL ខាងក្រោមជាមួយ URL រូបភាពណាមួយដែលអ្នកចង់ចាត់ថ្នាក់។\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Try your own image!\n", + "# Replace this URL with any image URL\n", + "custom_image_url = \"https://images.unsplash.com/photo-1472491235688-bdc81a63246e?w=400\" # A flower\n", + "\n", + "print(\"🖼️ Classifying your custom image...\")\n", + "print(\"=\" * 70)\n", + "\n", + "try:\n", + " # Load and show image\n", + " img = load_image_from_url(custom_image_url)\n", + " display(img.resize((300, 300)))\n", + " \n", + " # Classify\n", + " results = classify_image(img)\n", + " \n", + " # Show results\n", + " print(\"\\n🎯 Top 5 Predictions:\")\n", + " print(\"-\" * 70)\n", + " for rank, (label, confidence) in enumerate(results, 1):\n", + " bar_length = int(confidence * 50)\n", + " bar = \"█\" * bar_length\n", + " print(f\" {rank}. {label:20s} {confidence*100:5.2f}% {bar}\")\n", + " \n", + " # Highlight top prediction\n", + " top_label, top_confidence = results[0]\n", + " print(\"\\n\" + \"=\" * 70)\n", + " print(f\"\\n🏆 Best guess: {top_label} ({top_confidence*100:.2f}% confident)\")\n", + " \n", + "except Exception as e:\n", + " print(f\"❌ Error: {e}\")\n", + " print(\" Make sure the URL points to a valid image!\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 💡 តើមានអ្វីកើតឡើង?\n", + "\n", + "1. **យើងបានបញ្ចូលម៉ូដែលដែលបានបណ្តុះមុន** - MobileNetV2 បានបណ្តុះលើរូបភាពលានលាន\n", + "2. **យើងបានកំណត់រូបភាពជាមុន** - បម្លែងទំហំ និងទ្រង់ទ្រាយសម្រាប់ម៉ូដែល\n", + "3. **ម៉ូដែលបានទស្សន៍ទាយ** - វាបានផ្តល់ព្រាប្បុលភាពសម្រាប់ ១០០០ ចំណាត់ថ្នាក់វត្ថុ\n", + "4. **យើងបានបកស្រាយលទ្ធផល** - បម្លែងលេខទៅជាអត្ថបទដែលមនុស្សអាចអានបាន\n", + "\n", + "### ការយល់ដឹងអំពីពិន្ទុទំនុកចិត្ត\n", + "\n", + "- **៩០-១០០%**: មានទំនុកចិត្តខ្លាំង (ភាគច្រើនត្រឹមត្រូវ)\n", + "- **៧០-៩០%**: មានទំនុកចិត្ត (ប្រហែលត្រឹមត្រូវ)\n", + "- **៥០-៧០%**: មានទំនុកចិត្តខ្លះៗ (ប្រហែលជាត្រឹមត្រូវ)\n", + "- **ក្រោម ៥០%**: មិនមានទំនុកចិត្តខ្លាំង (មិនប្រាកដ)\n", + "\n", + "### ហេតុអ្វីបានជា ការទស្សន៍ទាយអាចខុស?\n", + "\n", + "- **មុំឬពន្លឺមិនធម្មតា** - ម៉ូដែលបានបណ្តុះដោយរូបថតទំរង់ទូទៅ\n", + "- **វត្ថុច្រើនកន្លែង** - ម៉ូដែលនឹកស្រមៃមានវត្ថុមួយដើម\n", + "- **វត្ថុសម្បូរទ្រង់ទ្រាយកោសិកា** - ម៉ូដែលស្គាល់តែ ១០០០ ប្រភេទ\n", + "- **រូបភាពគុណភាពទាប** - រូបភាពមិនច្បាស់ឬម៉ូសេតារីមានការលំបាក\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 🚀 ជំហានបន្ទាប់\n", + "\n", + "1. **សាកល្បងរូបភាពផ្សេងៗ:**\n", + " - ស្វែងរករូបភាពនៅលើ [Unsplash](https://unsplash.com)\n", + " - ចុចមែកខាងស្តាំ → \"ចម្លងអាសយដ្ឋានរូបភាព\" ដើម្បីទទួលបាន URL\n", + "\n", + "2. **សាកល្បង:**\n", + " - តើមានអ្វីកើតឡើងជាមួយសិល្បៈ abstract?\n", + " - តើវាអាចរកឃើញវត្ថុពីមุมផ្សេងៗទេ?\n", + " - តើវាដំណើរការយ៉ាងដូចម្តេចជាមួយវត្ថុច្រើន?\n", + "\n", + "3. **រៀនបន្ថែម:**\n", + " - ស្វែងយល់អំពី [មេរៀនទស្សនវិទ្យាកុំព្យូទ័រ](../lessons/4-ComputerVision/README.md)\n", + " - រៀនបណ្ដុះបណ្ដាលម៉ាស៊ីនចាត់ថ្នាក់រូបភាពឯង\n", + " - យល់ដឹងពីរបៀប CNNs (បណ្តាញប្រសាទបូកបញ្ចូល) ធ្វើការ\n", + "\n", + "---\n", + "\n", + "## 🎉 សូមអបអរសាទរ!\n", + "\n", + "អ្នកទើបបង្កើតម៉ាស៊ីនចាត់ថ្នាក់រូបភាពដោយប្រើបណ្តាញប្រសាទទំនើប!\n", + "\n", + "បច្ចេកវិទ្យានេះត្រូវបានប្រើសម្រាប់:\n", + "- Google Photos (ចាត់តាំងរូបថតរបស់អ្នក)\n", + "- ឡានបើកដោយខ្លួនឯង (ស្គាល់វត្ថុ)\n", + "- ការធ្វើវិភាគវេជ្ជសាស្រ្ត (វិភាគរូបថត X-ray)\n", + "- ការត្រួតពិនិត្យគុណភាព (រកកោសិលិ្អ)\n", + "\n", + "បន្តស្វែងយល់ និងរៀនបន្ថែម! 🚀\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**កំណត់សម្គាល់**៖ \nឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលដែលយើងខំប្រឹងប្រែងរកភាពត្រឹមត្រូវ សូមកត់សម្គាល់ថាការបកប្រែដោយស្វ័យប្រវត្តិសមត្ថភាពអាចមានកំហុស ឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមជាភាសាតំណើរការរបស់វាគួរត្រូវបានគេចាត់ទុកថាជា ប្រភពផ្លូវការ។ សម្រាប់ព័ត៌មានសំខាន់ៗ គេបนะนำឲ្យប្រើការបកប្រែដោយមនុស្សឯកទេសជំនាញ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកស្រាយខុសផ្សេង ដែលកើតឡើងពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.0" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} \ No newline at end of file diff --git a/translations/km/examples/README.md b/translations/km/examples/README.md new file mode 100644 index 00000000..df23685f --- /dev/null +++ b/translations/km/examples/README.md @@ -0,0 +1,87 @@ +# ឧទាហរណ៍ AI សមរម្យសម្រាប់អ្នកចាប់ផ្តើម + +ស្វាគមន៍! មូលដ្ឋានទិន្នន័យនេះរួមមានឧទាហរណ៍សាមញ្ញឯករាជ្យដើម្បីជួយអ្នកចាប់ផ្តើមជាមួយ AI និងការសិក្សាម៉ាស៊ីន។ ឧទាហរណ៍នីមួយៗត្រូវបានរចនាឡើងសម្រាប់អ្នកចាប់ផ្តើមជាមួយមតិលម្អិត និងការពន្យល់ជំរុញជជែកជំហាន-បន្ទាត់។ + +## 📚 ទិដ្ឋភាពទូទៅនៃឧទាហរណ៍ + +| ឧទាហរណ៍ | ពិពណ៌នា | កម្រិតកម្អិត | ការត្រៀមការ | +|---------|-------------|------------|---------------| +| [Hello AI World](../../../examples/01-hello-ai-world.py) | កម្មវិធី AI ដំបូងរបស់អ្នក - ការទទួលស្គាល់ម៉ូតសាមញ្ញ | ⭐ សម្រាប់អ្នកចាប់ផ្តើម | មូលដ្ឋាន Python | +| [Simple Neural Network](../../../examples/02-simple-neural-network.py) | បង្កើតបណ្ដាញសរសៃប្រសាទពីដើម | ⭐⭐ សម្រាប់អ្នកចាប់ផ្តើម+ | Python, គណិតវិទ្យាមូលដ្ឋាន | +| [Image Classifier](./03-image-classifier.ipynb) | ចាត់ថ្នាក់រូបភាពជាមួយម៉ូដែលដែលបានបណ្តុះជាមុន | ⭐⭐ សម្រាប់អ្នកចាប់ផ្តើម+ | Python, numpy | +| [Text Sentiment](../../../examples/04-text-sentiment.py) | វិភាគអារម្មណ៍អត្ថបទ (វិជ្ជមាន/អវិជ្ជមាន) | ⭐⭐ សម្រាប់អ្នកចាប់ផ្តើម+ | Python | + +## 🚀 ការចាប់ផ្តើម + +### ការត្រៀមភាព + +ធ្វើការតំឡើង Python (ប្រភេទ 3.8 ឬខ្ពស់ជាងនេះកាន់តែផ្ដល់អនុសាសន៍)។ តំឡើងកញ្ចប់ដែលត្រូវការ៖ + +```bash +# សម្រាប់ស្គ្រីប Python +pip install numpy + +# សម្រាប់សៀវភៅកំណត់ត្រា Jupyter (កម្មវិធីចាត់ថ្នាក់រូបភាព) +pip install jupyter numpy pillow tensorflow +``` + +ឬប្រើបរិយាកាស conda ពីមេរៀនសិក្សាសំខាន់៖ + +```bash +conda env create --name ai4beg --file ../environment.yml +conda activate ai4beg +``` + +### ការប្រតិបត្តិឧទាហរណ៍ + +**សម្រាប់ស្គ្រីប Python (.py files):** +```bash +python 01-hello-ai-world.py +``` + +**សម្រាប់កំណត់ត្រា Jupyter (.ipynb files):** +```bash +jupyter notebook 03-image-classifier.ipynb +``` + +## 📖 ផ្លូវការសិក្សា + +យើងសូមណែនាំឲ្យអនុវត្តឧទាហរណ៍តាមលំដាប់៖ + +1. **ចាប់ផ្តើមជាមួយ "Hello AI World"** - រៀនមូលដ្ឋាននៃការទទួលស្គាល់ម៉ូត +2. **បង្កើតបណ្ដាញសរសៃប្រសាទសាមញ្ញ** - យល់ដឹងពីរបៀបដែលបណ្ដាញប្រសាទដំណើរការ +3. **សាកល្បងកម្មវិធីចាត់ថ្នាក់រូបភាព** - មើល AI ដំណើរការជាមួយរូបភាពពិត +4. **វិភាគអារម្មណ៍អត្ថបទ** - សិក្សាអំពីការដំណើរការភាសាមនុស្សធម្មតា + +## 💡 គន្លឹះសម្រាប់អ្នកចាប់ផ្តើម + +- **អានមតិកូដយ៉ាងប្រុងប្រយ័ត្ន** - ពួកវាអធិប្បាយពីអ្វីដែលបន្ទាត់នីមួយៗធ្វើ +- **សាកល្បង!** - ព្យាយាមបម្លែងតម្លៃ ហើយមើលថាតើអ្វីកើតឡើង +- **កុំបារម្ភចំពោះការយល់ដឹងទាំងអស់** - ការសិក្សាដែលត្រូវការពេលវេលា +- **សួរប្រធានបទ** - ប្រើ [ក្រុមសន្ទនា](https://github.com/microsoft/AI-For-Beginners/discussions) + +## 🔗 ជំហានបន្ទាប់ + +បន្ទាប់ពីបញ្ចប់ឧទាហរណ៍ទាំងនេះ ស្វែងយល់ពីមេរៀនពេញលេញ៖ +- [ការណែនាំ AI](../lessons/1-Intro/README.md) +- [បណ្ដាញសរសៃប្រសាទ](../lessons/3-NeuralNetworks/README.md) +- [ចក្ខុវិស័យកុំព្យូទ័រ](../lessons/4-ComputerVision/README.md) +- [ការដំណើរការភាសាមនុស្សធម្មតា](../lessons/5-NLP/README.md) + +## 🤝 ការចូលរួម + +ឃើញឧទាហរណ៍ទាំងនេះមានប្រយោជន៍ទេ? ជួយយើងបង្កើនគុណភាពរបស់ពួកវា: +- រាយការណ៍បញ្ហាឬសំណើរកែលម្អ +- បន្ថែមឧទាហរណ៍សម្រាប់អ្នកចាប់ផ្តើម +- បង្កើនឯកសារនិងមតិកូដ + +--- + +*ចងចាំ៖ អ្នកជំនាញគ្រប់រូបដែលផ្តើមពីអ្នកចាប់ផ្តើម។ សូមសំណាងល្អក្នុងការសិក្សា! 🎓* + +--- + + +**ការបដិសេធ**៖ +ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលយើងខិតខំមានភាពត្រឹមត្រូវ សូមយកចិត្តទុកដាក់ថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុសឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមក្នុងភាសាតំបន់គឺជាចំណោមព័ត៌មានដែលមានអំណាច។ សម្រាប់ព័ត៌មានសំខាន់ គួរតែប្រើការបកប្រែដោយវិជ្ជាជីវៈមនុស្ស។ យើងពុំទទួលខុសត្រូវចំពោះការយល់ច្រឡំឬការបកស្រាយខុសៗចេញពីការប្រើប្រាស់ការបកប្រែនេះទេ។ + \ No newline at end of file diff --git a/translations/km/lessons/0-course-setup/for-teachers.md b/translations/km/lessons/0-course-setup/for-teachers.md new file mode 100644 index 00000000..77b5edda --- /dev/null +++ b/translations/km/lessons/0-course-setup/for-teachers.md @@ -0,0 +1,30 @@ +# សម្រាប់អ្នកបង្រៀន + +តើអ្នកចង់ប្រើកម្មវិធីសិក្សានេះនៅក្នុងថ្នាក់រៀនរបស់អ្នកទេ? សូមសាងសង់ដោយសេរី! + +ជាក់ស្តែង អ្នកអាចប្រើវាតាមក្នុង GitHub ដោយប្រើ GitHub Classroom។ + +ដើម្បីធ្វើនេះ សូម fork repo នេះ។ អ្នកនឹងត្រូវបង្កើត repo សម្រាប់មេរៀននីមួយៗ ដូច្នេះអ្នកត្រូវសម្រង់ថតបណ្ដុំមួយៗទៅ repo ផ្សេងទៀត។ ដូច្នេះ [GitHub Classroom](https://classroom.github.com/classrooms) អាចយកមេរៀននីមួយៗបានបំបែកជាពីរធាតុ។ + +[ការណែនាំពេញលេញនេះ](https://github.blog/2020-03-18-set-up-your-digital-classroom-with-github-classroom/) នឹងផ្តល់ឱ្យអ្នកនូវគំនិតពីរបៀបតំឡើងថ្នាក់រៀនរបស់អ្នក។ + +## ការប្រើប្រាស់ repo ដូចដែលមាន + +ប្រសិនបើអ្នកចង់ប្រើ repo នេះដូចដែលវាជាសព្វថ្ងៃ ដោយមិនប្រើ GitHub Classroom ក៏អាចធ្វើបានដែរ។ អ្នកនឹងត្រូវតែទំនាក់ទំនងជាមួយសិស្សរបស់អ្នកថាមេរៀនណាដែលត្រូវធ្វើរួមគ្នា។ + +នៅក្នុងរៀបចំតាមអនឡាញ (Zoom, Teams, ឬកម្មវិធីផ្សេងៗ) អ្នកអាចបង្កើតបន្ទប់បំបែកសម្រាប់សំណួរquiz ហើយណែនាំសិស្សដើម្បីជួយពួកគេច្រៀនរៀន។ បន្ទាប់មកអញ្ជើញសិស្សធ្វើសំណួរquiz និងដាក់ចម្លើយរបស់ពួកគេទៅជាបញ្ហា (issues) នៅពេលណាមួយ។ អ្នកអាចធ្វើដូចគ្នានឹងការចែកចាយការងារ ប្រសិនបើអ្នកចង់ឱ្យសិស្សធ្វើការជាក្រុមក្នុងសាធារណៈ។ + +ប្រសិនបើអ្នកពេញចិត្តនូវរៀបចំច្រើនជាងនេះជារបៀបឯកជន សូមសុំសិស្សរបស់អ្នក fork កម្មវិធីសិក្សា មេរៀនមួយមេរៀន ទៅកាន់ repo GitHub ផ្ទាល់ខ្លួនជារឿងឯកជន ហើយផ្ដល់សិទ្ធិចូលប្រើឱ្យអ្នក។ បន្ទាប់មកពួកគេអាចបញ្ចប់សំណួរquiz និងការងារជារឿងឯកជន ហើយដាក់ស្នើតាមរយៈ issues នៅលើ repo ថ្នាក់រៀនរបស់អ្នក។ + +មានវិធីជាច្រើនក្នុងការលើកឡើងការងារនេះក្នុងរៀបចំថ្នាក់រៀនតាមអនឡាញ។ សូមប្រាប់យើងអំពីរបៀបណាដែលប្រសើរបំផុតសម្រាប់អ្នក! + +## សូមផ្តល់មតិយោបល់របស់អ្នក + +យើងចង់ធ្វើឱ្យកម្មវិធីសិក្សានេះមានប្រយោជន៍សម្រាប់អ្នក និងសិស្សរបស់អ្នក។ សូមផ្តល់មតិយោបល់នៅលើផ្ទាំងពិភាក្សា! + +--- + + +**ការបដិសេធ**៖ +ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ បូករួមទាំងយើងខ្ញុំខិតខំប្រឹងប្រែងឱ្យបានច្បាស់លាស់ ប៉ុន្តែសូមបញ្ជាក់ថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុស ឬការខ្វះខាត។ ឯកសារដើមក្នុងភាសាទំនើបរបស់វា ត្រូវបានកត់សម្គាល់ថាជា ប្រភពត្រឹមត្រូវ។ សម្រាប់ព័ត៌មានសំខាន់ៗ សូមបង្ហាញការបកប្រែដោយមនុស្សជំនាញវិជ្ជាជីវៈ។ យើងខ្ញុំមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកប្រែខុសឆ្គង​ដែលកើតពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។ + \ No newline at end of file diff --git a/translations/km/lessons/0-course-setup/how-to-run.md b/translations/km/lessons/0-course-setup/how-to-run.md new file mode 100644 index 00000000..dd394043 --- /dev/null +++ b/translations/km/lessons/0-course-setup/how-to-run.md @@ -0,0 +1,71 @@ +# របៀបដំណើរកូដ + +កម្មវិធីសិក្សានេះមានឧទាហរណ៍អាចអនុវត្ត និងប laboratorio ច្រើនដែលអ្នកត្រូវការដំណើរការ។ ដើម្បីធ្វើដូចនេះ អ្នកត្រូវការជំនាញក្នុងការអនុវត្តកូដ Python ក្នុង Jupyter Notebooks ដែលបានផ្ដល់ជាសមាសធាតុនៃកម្មវិធីសិក្សានេះ។ អ្នកមានជម្រើសជាច្រើនសម្រាប់ការប្រតិបត្តិកូដ៖ + +## ដំណើរការកូដក្នុងកុំព្យូទ័ររបស់អ្នក + +ដើម្បីដំណើរការកូដក្នុងកុំព្យូទ័រផ្ទាល់ខ្លួន អ្នកត្រូវតែដំឡើង Python។ មួយក្នុងចំណោមការផ្ដល់អនុសាសន៍គឺដំឡើង **[miniconda](https://conda.io/en/latest/miniconda.html)** - វាជាការដំឡើងដែលស្រាលដែលគាំទ្រកម្មវិធីគ្រប់គ្រងកញ្ចប់ `conda` សម្រាប់ **បរិស្ថានកម្រិត Python លំដាប់ខុសគ្នា**។ + +បន្ទាប់ពីអ្នកដំឡើង miniconda ចប់ សូមលីងគ្មានអ្នកទៅកាន់ឃ្លាំងហើយបង្កើតបរិស្ថានកម្រិតដែលនឹងប្រើសម្រាប់វគ្គនេះ៖ + +```bash +git clone http://github.com/microsoft/ai-for-beginners +cd ai-for-beginners +conda env create --name ai4beg --file .devcontainer/environment.yml +conda activate ai4beg +``` + +### ការប្រើប្រាស់ Visual Studio Code ជាមួយផ្នែកបន្ថែម Python + +កម្មវិធីសិក្សានេះប្រើប្រាស់បានល្អបំផុតនៅពេលបើកវាក្នុង [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) ជាមួយផ្នែកបន្ថែម [Python Extension](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste)។ + +> **សម្គាល់**៖ មួយពេលអ្នកបានលីងគ្មានម្ដងហើយបើកថតក្នុង VS Code វានឹងស្វ័យប្រវត្តិផ្ដល់ការផ្ដល់អនុសាសន៍ដំឡើងផ្នែក Python ។ អ្នកក៏ត្រូវតែដំឡើង miniconda ដូចបានពិពណ៌នាលើកនៅខាងលើផងដែរ។ + +> **សម្គាល់**៖ ប្រសិនបើ VS Code ផ្ដល់អនុសាសន៍ឲ្យអ្នកបើកឃ្លាំងឡើងវិញក្នុងផ្ទុក container អ្នកគួរត្រូវបដិសេធដើម្បីប្រើប្រាស់ Python ដំឡើងក្នុងកុំព្យូទ័រផ្ទាល់ខ្លួន។ + +### ការប្រើប្រាស់ Jupyter ក្នុងកម្មវិធីជ្រើសរើស + +អ្នកក៏អាចប្រើបរិស្ថាន Jupyter ពីកម្មវិធីជ្រើសរើសនៅលើកុំព្យូទ័ររបស់អ្នកផ្ទាល់។ Jupyter ពីផ្លូវចាស់ និង JupyterHub ផ្តល់បរិស្ថានអភិវឌ្ឍន៍ងាយស្រួលជាមួយការបំពេញឯកសារអូតូ ការពណ៌លើកូដ និង ផ្សេងៗទៀត។ + +ដើម្បីចាប់ផ្តើម Jupyter ក្នុងកុំព្យូទ័ររបស់អ្នក សូមទៅកាន់ថតនៃវគ្គនោះ ហើយដំណើរការ៖ + +```bash +jupyter notebook +``` +or +```bash +jupyterhub +``` +អ្នកអាចរុករកទៅឯកសារ `.ipynb` មួយណាមួយ បើកវា ហើយចាប់ផ្តើមធ្វើការងារ។ + +### ការដំណើរការនៅក្នុង container + +ជម្រើសមួយផ្សេងទៀតសម្រាប់ការដំឡើង Python គឺដំណើរការកូដក្នុង container។ ព្រោះឃ្លាំងរបស់យើងផ្ដល់ថត `.devcontainer` ពិសេសមួយ ដែលបញ្ជាក់ពីរបៀបសែត container សម្រាប់ repo នេះ VS Code ផ្តល់ឱកាសឲ្យបើកកូដឡើងវិញក្នុង container។ វាត្រូវការដំឡើង Docker ហើយក៏ស្មុគស្មាញជាងនេះ ដូច្នេះយើងផ្ដល់អនុសាសន៍ឲ្យអ្នកប្រើប្រាស់មានបទពិសោធន៍ជាង។ + +## ដំណើរការនៅពាណិជ្ជកម្ម Cloud + +ប្រសិនបើអ្នកមិនចង់ដំឡើង Python ក្នុងកុំព្យូទ័រផ្ទាល់ខ្លួន និងមានចូលដំណើរការទៅធនធាន Cloud មួយចំនួន - ជម្រើសល្អមួយគឺដំណើរការកូដនៅពាណិជ្ជកម្ម Cloud។ មានវិធីជាច្រើនដែលអ្នកអាចធ្វើបានដូចខាងក្រោម៖ + +* ប្រើប្រាស់ **[GitHub Codespaces](https://github.com/features/codespaces)** ដែលជាបរិស្ថានកម្រិតមានជីវិតបង្កើតឡើងសម្រាប់អ្នកលើ GitHub ដែលអាចចូលដំណើរការចេញតាម VS Code browser។ ប្រសិនបើអ្នកមានចូលដំណើរការទៅ Codespaces អ្នកអាចចុចប៊ូតុង **Code** នៅក្នុងឃ្លាំង ដំណើរកាត់ codespace ហើយចាប់ផ្តើមប្រើបានភ្លាមៗ។ +* ប្រើប្រាស់ **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**។ [Binder](https://mybinder.org) ផ្តល់ធនធានកុំព្យូទ័រដោយឥតគិតថ្លៃនៅពាណិជ្ជកម្ម Cloud សម្រាប់អ្នកដែលចង់សាកល្បងកូដលើ GitHub។ មានប៊ូតុងនៅមុខទំព័រដើម្បីបើកឃ្លាំងនៅក្នុង Binder - វាចំនាយពេលរហូតដល់ទៅបណ្ដាញ Binder ដែលនឹងសាងសង់ container មូលដ្ឋាន ហើយចាប់ផ្តើមផ្ទាំងវ៉ិប Jupyter សម្រាប់អ្នកបានយ៉ាងរលូន។ + +> **សម្គាល់**៖ ដើម្បីរារាំងការប្រើប្រាស់មិនត្រឹមត្រូវ Binder បានគ្របដណ្តប់ចូលដំណើរការទៅធនធានវ៉ិបមួយចំនួន។ វាអាចលើកឡើងបញ្ហាមួយចំនួនក្នុងកូដដែលយកម៉ូដែលនិង/ឬទិន្នន័យពីអ៊ិនធឺរណិតសាធារណៈ។ អ្នកអាចត្រូវការស្វែងរកវិធីជៀសវាងខ្លះ។ រួចទៀតធនធានកុំព្យូទ័រដែល Binder ផ្តល់គឺមូលដ្ឋានបំផុត ដូច្នេះការបណ្តុះបណ្តាលនឹងយឺតជាង ពិសេសនៅមេរៀនក្រោយៗ ដែលស្មុគស្មាញជាង។ + +## ដំណើរការនៅពាណិជ្ជកម្ម Cloud ជាមួយ GPU + +មេរៀនខាងក្រោយៗក្នុងកម្មវិធីសិក្សានេះនឹងទទួលផលប្រយោជន៍យ៉ាងខ្លាំងពីការគាំទ្រ GPU។ ការបណ្តុះបណ្តាលម៉ូដែល ដូចជាគំរូ អាចយឺតយ៉ាវបើគ្មាន GPU។ មានជម្រើសពីរបៀបដែលអ្នកអាចអនុវត្តបាន ជាពិសេស ប្រសិនបើអ្នកមានចូលដំណើរការទៅពាណិជ្ជកម្ម Cloud តាមរយៈ [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) ឬតាមដំណើរការស្ថាប័នរបស់អ្នក៖ + +* បង្កើត [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) ហើយភ្ជាប់តាមរយៈ Jupyter។ អ្នកអាចលីងគ្មាន repo ទៅម៉ាស៊ីននោះបានដោយផ្ទាល់ ហើយចាប់ផ្តើមរៀន។ ម៉ាស៊ីន NC-series មានការគាំទ្រ GPU។ + +> **សម្គាល់**៖ សេវាកម្មខ្លះៗ រួមទាំង Azure for Students មិនផ្តល់ជាការគាំទ្រ GPU ដើមទេ។ អ្នកអាចត្រូវស្នាក់រស្នើការកំណត់ GPU បន្ថែមជាមួយសំណើស្វាគមន៍បច្ចេកទេស។ + +* បង្កើត [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) ហើយប្រើលក្ខណៈពិសេស Notebook នៅទីនោះ។ [វីដេអូនេះ](https://azure-for-academics.github.io/quickstart/azureml-papers/) បង្ហាញពីរបៀបលីង repo ទៅក្នុង Azure ML notebook ហើយចាប់ផ្តើមប្រើប្រាស់។ + +អ្នកក៏អាចប្រើ Google Colab ដែលមានការគាំទ្រពី GPU ដោយឥតគិតថ្លៃ និងផ្ទុក Jupyter Notebooks ទៅទីនោះដើម្បីអនុវត្តមួយម៉ឺនុយម្ដង។ + +--- + + +**ការបដិសេធ**៖ +ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ បើទោះបីយើងខិតខំរកភាពត្រឹមត្រូវក្របខ័ណ្ឌក៏ដោយ សូមដឹងថាការបកប្រែដោយស្វ័យប្រវត្តអាចមានកំហុស ឬការមិនត្រឹមត្រូវខ្លះ។ ឯកសារដើមជាភាសាដើមគួរត្រូវបានគិតថាជា ប្រភពផ្លូវការបំផុត។ សម្រាប់ព័ត៌មានសំខាន់ៗ អង្គការបកប្រែដោយមនុស្សជំនាញត្រូវបានផ្ដល់អនុសាសន៍។ យើងមិនមានការទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកស្រាយខុសប្រកបដោយការប្រើប្រាស់ការបកប្រែនេះឡើយ។ + \ No newline at end of file diff --git a/translations/km/lessons/0-course-setup/setup.md b/translations/km/lessons/0-course-setup/setup.md new file mode 100644 index 00000000..f1af07d8 --- /dev/null +++ b/translations/km/lessons/0-course-setup/setup.md @@ -0,0 +1,49 @@ +# ការចាប់ផ្តើមជាមួយមេរៀននេះ + +## តើអ្នកជានិស្សិតផ្លូវ? + +ចាប់ផ្តើមជាមួយធនធានដូចខាងក្រោម៖ + +* [ទំព័រ Student Hub](https://docs.microsoft.com/learn/student-hub?WT.mc_id=academic-77998-cacaste) នៅលើទំព័រនេះ អ្នកនឹងឃើញធនធានសម្រាប់អ្នកចាប់ផ្តើម, កញ្ចប់សិស្ស, និងវិធីសាស្រ្តក្នុងការទទួលបានវិញ្ញាបនបត្រដោយឥតគិតថ្លៃ។ នេះគឺជាទំព័រមួយដែលអ្នកចង់រក្សាទុកជាមេម៉ូ និងពិនិត្យមើលជាប្រចាំដោយយើងប្តូរកម្រងខ្លឹមសារតិចតួចយ៉ាងតិចម្តងក្នុងមួយខែ។ +* [ស្ថាប័នសិស្ស Microsoft Student Learn](https://studentambassadors.microsoft.com?WT.mc_id=academic-77998-cacaste) ចូលរួមជាមួយសហគមន៍ស្ថាប័នសិស្សពិភពលោក ដើម្បីបើកបង្ហាញទៅMicrosoft។ + +**សិស្ស**, មានវិធីខ្លះៗក្នុងការប្រើប្រាស់មេរៀននេះ។ ជាដំបូង អ្នកអាចអានអត្ថបទ និងមើលកូដដោយផ្ទាល់លើ GitHub។ ប្រសិនបើអ្នកចង់រត់កូដក្នុងកំណត់ត្រាណាមួយ - [អានសេចក្ដីណែនាំរបស់យើង](./how-to-run.md) ហើយស្វែងរកដំណឹងបន្ថែមអំពីរបៀបអនុវត្តវា [ក្នុងអត្ថបទប្លុកនេះ](https://soshnikov.com/education/how-to-execute-notebooks-from-github/)។ + +> **ចំណាំ**: [សេចក្ដីណែនាំអំពីរបៀបរត់កូដក្នុងមេរៀននេះ](./how-to-run.md) + +## សិក្សាដោយខ្លួនឯង + +ទោះយ៉ាងណា ប្រសិនបើអ្នកចង់យកវគ្គសិក្សានេះជាគម្រោងសិក្សាដោយខ្លួនឯង យើងសូមផ្ដល់អនុសាសន៍ឲ្យអ្នកចម្លងគេហទំព័រទាំងមូលទៅគណនី GitHub ផ្ទាល់ខ្លួនរបស់អ្នក ហើយបញ្ចប់លំហាត់ដោយខ្លួនឯង ឬជាក្រុម៖ + +* ចាប់ផ្តើមជាមួយសំនួរជំនួយមុនមេរៀន។ +* អានអត្ថបទណែនាំសម្រាប់មេរៀន។ +* ប្រសិនបើមេរៀនមានកំណត់ត្រាបន្ថែម បើកមើលវា អាន និងអនុវត្តកូដ។ ប្រសិនបើមានកំណត់ត្រា TensorFlow និង PyTorch ទាំងពីរ អ្នកអាចជ្រើសរើសមួយក្នុងចំណោមវា - ជ្រើសរើសគ្រោងការប្រើប្រាស់ដែលអ្នកចូលចិត្ត។ +* កំណត់ត្រាធម្មតាមានបញ្ហាដែលត្រូវការអ្នកកែប្រែកូដបន្តិច ដើម្បីធ្វើការប្រឡងផ្ទាល់ខ្លួន។ +* ធ្វើសំនួរជំនួយបន្ទាប់មេរៀន។ +* ប្រសិនបើមានមាសិនភ្ជាប់ជាមួយមូឌុល - បញ្ចប់ភារកិច្ច។ +* ចូលទៅកាន់ [ក្រឡាផ្ទេរ](https://github.com/microsoft/AI-For-Beginners/discussions) ដើម្បី "រៀនដោយសូរ"។ + +> សម្រាប់ការសិក្សាបន្ថែម យើងណែនាំឲ្យធ្វើតាមមូឌុល និងផ្លូវសិក្សា [Microsoft Learn](https://docs.microsoft.com/en-us/users/dmitrysoshnikov-9132/collections/31zgizg2p418yo/?WT.mc_id=academic-77998-cacaste) ទាំងនេះ។ + +**គ្រូបង្រៀន**, យើងបាន [បញ្ចូលការផ្ដល់អនុសាសន៍មួយចំនួន](./for-teachers.md) អំពីរបៀបប្រើប្រាស់មេរៀននេះ។ + +--- + +## វិធីសាស្រ្តបង្រៀន + +យើងបានជ្រើសរើសគ្រឹះវិធីសាស្រ្តបង្រៀនពីរប្រភេទខណៈកំពុងកសាងមេរៀននេះ ៖ ប្រាកដថាវាជាគម្រោងដៃអនុវត្ត **project-based** និងមាន **សំនួរផ្សព្វផ្សាយជាញឹកញាប់**។ + +ដោយប្រាកដថាខ្លឹមសារត្រូវគ្នាជាមួយគម្រោង ការប្រតិបត្តិការ មានការចូលរួមច្រើនសម្រាប់សិស្ស ហើយការចងចាំគំនិតនឹងត្រូវខ្ពស់ឡើង។ លើសពីនេះ មុនពេលថ្នាក់ អ្នកសិស្សធ្វើសំនួរតិចតួច ដើម្បីកំណត់ចិត្តសម្រាប់ការរៀនប្រធានបទ មួយខណៈសំនួរចុងក្រោយបន្ទាប់ថ្នាក់ធានាគម្រោងចងចាំបន្ថែមផងដែរ។ មេរៀននេះត្រូវបានរចនាឡើងឲ្យរាបស្មើនិងរីករាយ ហើយអាចយកការសិក្សាទាំងមូល ឬផ្នែកមួយផ្នែកបាន។ គម្រោងចាប់ផ្តើមតូចហើយកើនឡើងស្មុគស្មាញទៅតាមចុងសប្តាហ៍១២។ + +> **ចំណាំអំពីសំនួរ**: សំនួរទាំងអស់ ស្ថិតនៅក្នុង [កម្មវិធីនេះ](https://red-field-0a6ddfd03.1.azurestaticapps.net/), មានសំនួរចំនួន ៥០ មុខ សំណួរបីសំណួរនៅក្នុងមួយមុខ។ ពួកវាត្រូវបានភ្ជាប់ពីមេរៀន ប៉ុន្តែកម្មវិធីសំនួរអាចរត់បានក្នុងកុំព្យូទ័រផ្ទាល់; អនុវត្តតាមសេចក្ដីណែនាំក្នុងថត `etc/quiz-app` ។ + +## ចូលប្រើដោយអ៊ិនធឺរណិតមិនមាន + +អ្នកអាចរត់ឯកសារនេះដោយអ៊ិនធឺរណិតអនឡាញដោយប្រើប្រាស់ [Docsify](https://docsify.js.org/#/). ចម្លងគេហទំព័រនេះ, [ដំឡើង Docsify](https://docsify.js.org/#/quickstart) នៅលើកុំព្យូទ័រផ្ទាល់ខ្លួនរបស់អ្នក ហើយនៅក្នុងថតបុព្វផ្ទាល់នៃគេហទំព័រនេះ វាយពាក្យ `docsify serve` ។ វេបសាយនឹងត្រូវបម្រើ នៅកំពូលប្រាំង 3000 នៅ localhost របស់អ្នក៖ `localhost:3000` ។ ឯកសារ pdf នៃមេរៀនមានស្រាប់ [នៅតំណនេះ](../../../../../../../../../etc/pdf/readme.pdf)។ + +--- + + +**ការបដិសេធ**៖ +ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ទោះបីយើងខិតខំឱ្យបានត្រឹមត្រូវ ប៉ុន្តែកន្លែងណាមួយការបកប្រែដោយស្វ័យប្រវត្តិកើតមានកំហុសឬគ្មានភាពត្រឹមត្រូវ។ ឯកសារដើមនៅក្នុងភាសាម្តុំណើតគួរត្រូវបានចាត់ទុកជាហេតុសំខាន់។ សម្រាប់ព័ត៌មានសំខាន់ៗ មានការផ្តល់អនុសាសន៍ឱ្យប្រើការបកប្រែមនុស្សអ្នកជំនាញ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកប្រែខុសពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។ + \ No newline at end of file diff --git a/translations/km/lessons/1-Intro/README.md b/translations/km/lessons/1-Intro/README.md new file mode 100644 index 00000000..b673c886 --- /dev/null +++ b/translations/km/lessons/1-Intro/README.md @@ -0,0 +1,161 @@ +# បំណើតនៃ AI + +![សង្ខេបខ្លឹមសារបំណើតនៃ AI ក្នុងរូបគំនូរ](../../../../translated_images/km/ai-intro.bf28d1ac4235881c.webp) + +> ស្កេតឈូសដោយ [Tomomi Imura](https://twitter.com/girlie_mac) + +## [សំណួរប្រលងមុខមុខបង្រៀន](https://ff-quizzes.netlify.app/en/ai/quiz/1) + +**បញ្ញាសិប្បនិម្មិត** គឺជាវិស័យវិទ្យាសាស្រ្តដ៏រំភើបមួយដែលសិក្សាថាតើយើងអាចធ្វើឱ្យកុំព្យូទ័របង្ហាញអាកប្បកិរិយាដូចមានបញ្ញាបានយ៉ាងដូចម្តេច ឧ. ធ្វើរឿងទាំងនេះដែលមនុស្សបានល្អក្នុងការធ្វើ។ + +ភាគចំបង កុំព្យូទ័រត្រូវបានបង្កើតដោយ [Charles Babbage](https://en.wikipedia.org/wiki/Charles_Babbage) ដើម្បីប្រតិបត្តិលើលេខតាមនីតិវិធីបញ្ជាក់បានល្អ - គឺអាល់គុណ។ កុំព្យូទ័រពិចារណា ស្ថិតក្នុងសម័យសព្វវេលា ទោះបីច្រើនជាងគំរូដើមនៅសតវត្សទី១៩យ៉ាងខ្លាំងក៏ដោយ ក៏នៅតែអនុវត្តន៍គំនិតដូចគ្នា នៃការគណនា តាមបណ្តាដំណាក់កាលបានគ្រប់គ្រង។ ដូច្នេះ អាចកំណត់កម្មវិធីឱ្យកុំព្យូទ័រធ្វើអ្វីមួយបាន ប្រសិនបើយើងដឹងលំអិតលំអាំងរបៀបដំណើរការដើម្បីសម្រេចគោលដៅ។ + +![រូបថតមនុស្សម្នាក់](../../../../translated_images/km/dsh_age.d212a30d4e54fb5f.webp) + +> រូបថតដោយ [Vickie Soshnikova](http://twitter.com/vickievalerie) + +> ✅ ការកំណត់អាយុមនុស្សពីរូបថតរបស់គេជាការងារដែលមិនអាចចាត់តាមកម្មវិធីបានយ៉ាងច្បាស់ ព្រោះយើងមិនដឹងបែបណាដើម្បីយកលេខមួយនៅក្នុងក្បាលពេលធ្វើការងារនេះឡើយ។ + +--- + +មានការងារមួយចំនួន ដែលយើងមិនដឹងច្បាស់ពីរបៀបដោះស្រាយ។ គិតពីការកំណត់អាយុមនុស្សពីរូបថតរបស់គេ។ យើងយ៉ាងណាមានការរៀនធ្វើបាន ព្រោះឃើញឧទាហរណ៍មនុស្សអាយុផ្សេងៗជាច្រើន ប៉ុន្ដែមិនអាចពន្យល់ច្បាស់បានជាគោលការណ៍ មិនអាចកម្មវិធីកុំព្យូទ័រធ្វើបានផង។ នេះជាបញ្ហាប្រភេទដែលមានចំណាប់អារម្មណ៍ចំពោះ **បញ្ញាសិប្បនិម្មិត** (AI សម្រាប់ខ្លី)។ + +✅ សូមគិតពីកិច្ចការមួយចំនួនដែលអ្នកអាចផ្តាច់បន្ទុកទៅកុំព្យូទ័រដែលអាចទទួលបានអត្ថប្រយោជន៍ពី AI។ គិតពីវិស័យហិរញ្ញវត្ថុ វេជ្ជសាស្រ្ត និងសិល្បៈ - តើវិស័យទាំងនេះទទួលបានអត្ថប្រយោជន៍ពី AI ដូចម្តេចខ្លះនៅសព្វថ្ងៃ? + +## AI ខ្សោយ និង AI ខ្លាំង + +AI ខ្សោយ | AI ខ្លាំង +---------------------------------------|------------------------------------- +AI ខ្សោយ ជាប្រព័ន្ធ AI ដែលបុគ្គលិកដើម្បីបំពេញបេសកកម្មជាក់លាក់ឬកិច្ចការត្រឹមតែបន្ថែមបន្តិចបន្តួច។ | AI ខ្លាំង ឬ បញ្ញាសិប្បនិម្មិតទូទៅ (AGI) ជាប្រព័ន្ធ AI ដែលមានបញ្ញាថ្នាក់មនុស្ស និងការយល់ដឹង។ +ប្រព័ន្ធ AI ទាំងនេះមិនមានបញ្ញាទូលំទូលាយទេ; ពួកវាសំខាន់ក្នុងការបំពេញកិច្ចការដែលបានកំណត់ខ្លួន តែកម្រិតនៃការយល់ដឹង ឬ ភាពជារូបចរិតគឺគ្មាន។ | ប្រព័ន្ធ AI ទាំងនេះមានសមត្ថភាពធ្វើកិច្ចការនៃបញ្ញាណាមួយដែលមនុស្សអាចធ្វើបាន ប្តូរតួបានប្រភេទ ផងមានរូបរាងនៃការយល់ដឹង ឬ មានសក្ដានុពលការចេះដឹងខ្លួនឯង។ +ឧទាហរណ៍ AI ខ្សោយ រួមមានជំនួយផ្ទាល់ខ្លួនដូចជា Siri ឬ Alexa, អាល់ហ្គរីធម៍ផ្តល់អនុសាសន៍ដែលប្រើប្រាស់ដោយសេវាកម្មផ្សាយផ្ទាល់អេឡិចត្រូនិច និង ប្ដូរគណនីសម្រាប់បំរើអតិថិជនជាក់លាក់។ | ការសម្រេចបាន AI ខ្លាំង ជាគោលបំណងរយៈពេលវែងនៃការស្រាវជ្រាវ AI ហើយត្រូវការការអភិវឌ្ឍប្រព័ន្ធ AI ដែលអាច ហែកហូត រៀន យល់ និងប្តូរតាមបរិបទ និងកិច្ចការផ្សេងៗ។ +AI ខ្សោយមានជំនាញជាក់លាក់ខ្ពស់ ហើយមិនមានសមត្ថភាពគិតមនុស្សដូច ឬ ជំនាញដោះស្រាយបញ្ហាទូលំទូលាយក្រៅពីវិស័យតូចៗរបស់វា។ | AI ខ្លាំងគឺជាគំនិតទ្រឹស្តី នៅឡើយទេ មានប្រព័ន្ធ AI មួយណាដែលបានចូលដល់កម្រិតបញ្ញាទូលំទូលាយនេះ។ + +សម្រាប់ព័ត៌មានបន្ថែម សូមយោងទៅ **[បញ្ញាសិប្បនិម្មិតទូទៅ](https://en.wikipedia.org/wiki/Artificial_general_intelligence)** (AGI)។ + +## ការបកស្រាយនៃបញ្ញា និងសាកល្បង Turing + +បញ្ហាមួយក្នុងការដោះស្រាយពាក្យ **[បញ្ញា](https://en.wikipedia.org/wiki/Intelligence)** គឺថាគ្មានការបកស្រាយច្បាស់លាស់សម្រាប់ពាក្យនេះទេ។ អ្នកម្នាក់អាចតវ៉ាថាបញ្ញាទាក់ទងនឹង **ការគិតអប្សរាហ៍** ឬ **ការយល់ដឹងខ្លួនឯង** ប៉ុន្តែយើងមិនអាចកំណត់វាយ៉ាងត្រឹមត្រូវបានទេ។ + +![រូបថតឆ្មា](../../../../translated_images/km/photo-cat.8c8e8fb760ffe457.webp) + +> [រូបថត](https://unsplash.com/photos/75715CVEJhI) ដោយ [Amber Kipp](https://unsplash.com/@sadmax) ពី Unsplash + +ដើម្បីមើលភាពមិនច្បាស់លាស់នៃពាក្យ *បញ្ញា* សូមព្យាយាមឆ្លើយសំណួរ៖ "តើឆ្មាមានបញ្ញាទេ?"។ មនុស្សជាច្រើនប្រាកដជាផ្តល់ចម្លើយខុសគ្នា សម្រាប់សំណួរនេះពីព្រោះគ្មានការសាកល្បងទន្ទេញទស្សន៍ទូលាយសំរាប់បញ្ជាក់ថាអត្ថន័យនេះត្រឹមត្រូវ ឬមិនត្រឹមត្រូវឡើយ។ ហើយប្រសិនបើអ្នកគិតថាមាន សូមជួយផាត់ឆ្មារបស់អ្នកតាមសាកល្បង IQ មួយបានទេ... + +✅ សូមគិតរយៈពេលមួយ នៃរបៀបដែលអ្នកកំណត់បញ្ញា។ តើកកណ្តុរ ដែលអាចដោះស្រាយបន្ទាត់ឬរកម្ហូបបាន មានបញ្ញាថែមទៀតទេ? តើកុមារមានបញ្ញាទេ? + +--- + +ពេលនិយាយអំពី AGI យើងត្រូវការបទបង្ហាញមួយសម្រាប់បញ្ជាក់ថាយើងបានបង្កើតប្រព័ន្ធដែលមានបញ្ញារបស់ពិតប្រាកដ។ [Alan Turing](https://en.wikipedia.org/wiki/Alan_Turing) បានណែនាំវិធីមួយហៅថា **[សាកល្បង Turing](https://en.wikipedia.org/wiki/Turing_test)** ដែលក៏ដើរតួជាការបកស្រាយនៃបញ្ញា។ ការសាកល្បងប្រៀបធៀបប្រព័ន្ធមួយទៅនឹងអ្វីដែលមានបញ្ញាខ្ទង់មនុស្សពិតប្រាកដ ហើយដោយសារការប្រៀបធៀបដោយស្វ័យប្រវត្តិអាចត្រូវបានល្បួងដោយកម្មវិធីកុំព្យូទ័រ យើងប្រើអ្នកសួរសំណួរមនុស្ស។ ដូច្នេះ ប្រសិនបើមនុស្សម្នាក់មិនអាចបង្កប់ចន្លោះមនុស្សពិត និង ប្រព័ន្ធកុំព្យូទ័រពាក្យសម្រាប់ជជែកដោយអក្សរ - ប្រព័ន្ធនោះត្រូវបានគេចាត់ទុកថាមានបញ្ញា។ + +> បូតជជែកមួយហៅថា [Eugene Goostman](https://en.wikipedia.org/wiki/Eugene_Goostman) ដែលអភិវឌ្ឍនៅ St.Petersburg បានឈានច្រើនដល់ការឆ្លងការសាកល្បង Turing ក្នុងឆ្នាំ 2014 ដោយប្រើទេពកោសល្យជាប់ចិត្តនៃអត្តសញ្ញាណ។ វាប្រកាសជាមុនថាវាជាកុមារវ័យ 13 ឆ្នាំ មកពីអ៊ុយក្រែន ធ្វើឲ្យពន្យល់បានពីការខ្វះចំណេះដឹង និងភាពខុសគ្នាខ្លះក្នុងអត្ថបទ។ បូតបានហេដ្ឋារចនាអ្នកវិនិច្ឆ័យ 30% ថាវាជាមនុស្ស បន្ទាប់ពីជជែករយៈពេល 5 នាទី គឺគន្លងមួយដែល Turing ជឿថា ឧបករណ៍អាចឆ្លងតាមបានឆាប់ៗនៅឆ្នាំ 2000។ ទោះជាយ៉ាងណា គេគួរយល់ថា វានៅមិនប្រហែលបានបញ្ជាក់ថាយើងបានបង្កើតប្រព័ន្ធមានបញ្ញា ឬថាប្រព័ន្ធកុំព្យូទ័របោកអ្នកសួរសំណួរមនុស្ស។ ប្រព័ន្ធមិនបានបោកមនុស្សទេ តែជាមនុស្សបង្កើតប្រាត់ចិត្ត​ប៉ុណ្ណោះ! + +✅ តើអ្នកដែលធ្លាប់ត្រូវបានបោកដោយបូតជជែក ដូចជាគិតថាអ្នកកំពុងនិយាយនឹងមនុស្សទេ? វាប៉ុន្មានដល់អ្នកយ៉ាងដូចម្តេច? + +## វិធីសាស្ត្រផ្សេងៗទៅ AI + +បើជាចង់ឲ្យកុំព្យូទ័រប្រុងប្រយ័ត្នដូចមនុស្ស យើងត្រូវបានត្រឹមតែគំរូដឺកបែបគិតនៅក្នុងកុំព្យូទ័រ។ ដូច្នេះយើងត្រូវព្យាយាមយល់ពីអ្វីដែលធ្វើឲ្យមនុស្សមានបញ្ញា។ + +> ដើម្បីអាចកំណត់កម្មវិធីបញ្ញាទៅ機械មួយ យើងត្រូវយល់ពីវិធីនៃដំណើរការអ្នកជ្រើសរើសសេចក្តីសម្រេចចិត្តរបស់ខ្លួន។ ប្រសិនបើអ្នកពិចារណាគ្រប់ខ្លួន អ្នកនឹងសង្កេតឃើញថាមានដំណើរការខ្លះដែលកើតឡើងដោយដោយស្វ័យ (subconscious) មិនចាំបាច់គិត - ឧ. យើងអាចបំភ្លឺឆ្មាចេញពីឆ្កែដោយមិនគិតអំពីវា ខណៈដែលការចាប់អារម្មណ៍ផ្សេងៗទៀតពាក់ព័ន្ធនឹងហេតុផល។ + +មានវិធីទាំងពីរ​ដើម្បីដោះស្រាយបញ្ហានេះ៖ + +វិធីខ្ពស់ទៅទាប (កំណត់ត្រាសមួង) | វិធីទាបទៅខ្ពស់ (បណ្តាញប្រសាទ) +---------------------------------------|------------------------------------- +វិធីខ្ពស់ទៅទាបគំរូរបៀបគិតរបស់មនុស្សដើម្បីដោះស្រាយបញ្ហា។ វាពាក់ព័ន្ធនឹងការដកស្រង់ **ចំណេះដឹង** ពីមនុស្ស និងតំណាងវាទៅជាទម្រង់ដែលកុំព្យូទ័រអាចអានបាន។ យើងក៏ត្រូវអភិវឌ្ឍវិធីសាស្ត្រមួយក្នុងការគំរូ **ការគិត** នៅក្នុងកុំព្យូទ័រផងដែរ។ | វិធីទាបទៅខ្ពស់គំរូរាងសមាសភាគខួរក្បាលមនុស្ស មានសមាសភាគតិចមួយចំនួនហៅថា **ប្រសាទ**។ ប្រសាទនីមួយៗប្រតិបត្តិដូចជាមធ្យមភាពទំងន់នៃវាសព្វសំរបសំរួល, ហើយយើងអាចបណ្តុះបណ្តាលបណ្តាញប្រសាទដើម្បីដោះស្រាយបញ្ហាមានប្រយោជន៍ដោយផ្តល់ **ទិន្នន័យបណ្តុះបណ្តាល**។ + +នៅមានវិធីផ្សេងទៀតសម្រាប់បញ្ញា៖ + +* វិធីសាស្ត្រនៃ **ការលេចមក**, **ស៊ុមសេរី** ឬ **វិធីជាមួយតួអង្គច្រើន** សហការណ៍ផ្អែកលើការប្រតិកម្មរបស់តួអង្គសាមញ្ញជាច្រើនចំនួន។ យោងតាម [evolutionary cybernetics](https://en.wikipedia.org/wiki/Global_brain#Evolutionary_cybernetics), បញ្ញាអាច *លេចឡើង* ពីសកម្មភាពសាមញ្ញ ឆ្លើយតបក្នុងដំណើរនៃ *ការផ្លាស់ប្តូរប្រព័ន្ធកម្រិត*។ + +* វិធីសាស្ត្រនៃ **កំណើតវិកល**, ឬ **អាល់ហ្គរីធម៍អូសត្រូវបានកំណត់** គឺជាដំណើរការបង្កើតប្រសើរឡើង មួយផ្អែកទៅលើគោលការណ៍នៃការវិវឌ្ឍ។ + +យើងនឹងពិចារណាវិធីទាំងនេះនៅពេលក្រោយនៅក្នុងវគ្គនេះ ប៉ុន្តែពេលនេះយើងនឹងផ្ដោតសំខាន់ទៅលើទិសដៅសំខាន់ទាំងពីរ៖ ខ្ពស់ទៅទាប និង ទាបទៅខ្ពស់។ + +### វិធីខ្ពស់ទៅទាប + +ក្នុង **វិធីខ្ពស់ទៅទាប** យើងព្យាយាមគំរូការគិតរបស់យើង។ ពីព្រោះយើងអាចតាមដានគំនិតពេលគិត យើងអាចបង្ហាញវិធីនេះជារូបមន្ត និងកំណត់កម្មវិធីវានៅក្នុងកុំព្យូទ័រ។ វាសម្ពោធឈ្មោះថា **ការគិតសញ្ញា**។ + +មនុស្សជាទូទៅមានច្បាប់ក្នុងក្បាលដែលនាំឲ្យដំណើរការសេចក្តីសម្រេចចិត្ត។ ឧទាហរណ៍ ពេលអ្នកគ្រូពេទ្យបញ្ជាក់ជំងឺអ្នកជម្ងឺ គាត់អាចសង្កេតឃើញថា មនុស្សមានកាំជម្រាល ហើយវាអាចបណ្តាលឲ្យមានការរលាកខ្លះនៅក្នុងរាងកាយ។ ដោយអនុវត្តច្បាប់ជាច្រើនទៅកាន់ករណីជាក់លាក់ អ្នកគ្រូពេទ្យអាចរកបានការបញ្ជាក់ចុងក្រោយ។ + +វិធីសាស្ត្រនេះពឹងផ្អែកខ្លាំងលើ **តំណាងចំណេះដឹង** និង **ការគិត**។ ការដកចំណេះដឹងពីអ្នកជំនាញអាចជាផ្នែកលំបាកបំផុត ពីព្រោះអ្នកគ្រូពេទ្យជាច្រើនករណីមិនដឹងថាអំពីហេតុអ្វីបានជាគាត់រកឃើញការបញ្ជាក់ប្លែកៗមួយ។ នៅពេលខ្លះដំណោះស្រាយបង្ហាញនូវមកក្នុងក្បាលគាត់ដោយមិនចាំបាច់គិតច្បាស់លាស់ឡើយ។ ការងារផ្សេងៗដូចជាការកំណត់អាយុមនុស្សពីរូបថត មិនអាចបង្រួមទៅការរំលាយចំណេះដឹងបានទេ។ + +### វិធីទាបទៅខ្ពស់ + +វាគឺជាគំនិតផ្សេងពីវីធីខ្ពស់ទៅទាប។ យើងអាចព្យាយាមគំរូធាតុសាមញ្ញបំផុតខាងក្នុងខួរក្បាលយើង គឺប្រសាទមួយ។ យើងអាចបង្កើតអ្វីហៅថា **បណ្តាញប្រសាទសិប្បនិម្មិត** នៅក្នុងកុំព្យូទ័រ ហើយសាកល្បងបង្រៀនវាដោះស្រាយបញ្ហាដោយផ្តល់ឧទាហរណ៍។ ដំណើរការនេះប្រហែលដូចបុត្របង្កើតថ្មីរៀនអំពីពិភពជុំវិញវាតាមរយៈការបង្កើតសំគាល់។ + +✅ សូមស្រាវជ្រាវពីរបៀបកុមាររៀន។ ធាតុសំខាន់ៗនៃខួរក្បាលកុមារមិនអី? + +> | តើអ្វីអំពី ML? | | +> |--------------|-----------| +> | ផ្នែកមួយនៃបញ្ញាសិប្បនិម្មិត ដែលផ្អែកលើការសិក្សាកុំព្យូទ័រដើម្បីដោះស្រាយបញ្ហាម្ដងទៀតដោយផ្អែកលើទិន្នន័យហៅថា **ការរៀនម៉ាស៊ីន**។ យើងមិនទាក់ទងនៅវគ្គនេះទេ - យើងគឺផ្ដល់អ្នកទៅសៀវភៅរៀន **Machine Learning for Beginners** ផ្សេងទៀត។ | ![ML for Beginners](../../../../translated_images/km/ml-for-beginners.9e4fed176fd5817d.webp) | + +## ប្រវត្តិសង្ខេបនៃ AI + +បញ្ញាសិប្បនិម្មិតចាប់ផ្តើមក្នុងស្រុកវិស័យនៅកណ្តាលសតវត្សទី ២០។ គំរូការគិតសញ្ញាគឺជា វិធីធំមួយ ហើយនាំឲ្យមានជោគជ័យសំខាន់ជាច្រើន ដូចជាប្រព័ន្ធអ្នកជំនាញ - កម្មវិធីកុំព្យូទ័រដែលអាចមានតួនាទីជាអ្នកជំនាញក្នុងវិស័យកំណត់មួយចំនួន។ ប៉ុន្តែវាបានដំណឹងឲ្យយើងឃើញថាវិធីនេះមិនអាចពង្រីកបានល្អទេ។ ការដកចំណេះដឹងពីអ្នកជំនាញ ការតំណាងវាគ្នា ក្នុងកុំព្យូទ័រ និងការថែរក្សាការចងចាំចំណេះដឹងបញ្ចាក់ថាជាការលំបាក និងមានតម្លៃថ្លៃសម្រាប់ភាពជាក់លាក់ជាច្រើន។ នេះបាននាំឲ្យមាន [រដូវរងារ AI](https://en.wikipedia.org/wiki/AI_winter) ក្នុងទសវត្សទី ៧០ ។ + +ប្រវត្តិសង្ខេបនៃ AI + +> រូបភាពដោយ [Dmitry Soshnikov](http://soshnikov.com) + +ពេលកន្លងមក ធនធានកុំព្យូទ័រតម្លៃថោកចុះ ហើយទិន្នន័យបានមានច្រើនរំពេច ចំណុចគំរូប្រសាទបានបង្ហាញទម្រង់ល្អក្នុងការប្រកួតជាមួយមនុស្សនៅក្នុងវិស័យជាច្រើន ដូចជា ការយល់ដឹងពីរូបភាព ឬការយល់ពីសំឡេង។ ក្នុងទសវត្សចុងក្រោយ ពាក្យបញ្ញាសិប្បនិម្មិតត្រូវបានប្រើប្រាស់ជាសមីការជាមួយបណ្តាញប្រសាទ ព្រោះចំាងជោគជ័យ AI ដែលយើងបានដឹងអំពីភាគច្រើនមានមូលដ្ឋានលើវា។ + +យើងអាចមើលឃើញការប្រែប្រួលនៃវិធីសាស្ត្រចំពោះកម្មវិធីលេងស៊ុតចៀក៖ + +* កម្មវិធីលេងស៊ុតចៀកដំបូងៗផ្អែកលើការស្វែងរក - កម្មវិធីព្យាយាមប៉ាន់ស្មានចលនាសមត្ថភាពរបស់សត្រូវសម្រាប់ចលនាដ៏អាចធ្វើបានមួយចំនួន ហើយជ្រើសរើសចលនាល្អបំផុតដើម្បីទទួលការតាំងរូបភាពល្អ។ វានាំឲ្យមានអាល់ហ្គរីធម៍ស្វែងរកហៅថា [alpha-beta pruning](https://en.wikipedia.org/wiki/Alpha%E2%80%93beta_pruning)។ +* យុទ្ធសាស្ត្រស្វែងរកដំណើរការល្អនៅចុងហ្គេម ដែលមូលដ្ឋានលើចំនួនចលនាអាចធ្វើបានមានកំណត់។ ទោះជា ពីការចាប់ផ្តើមហ្គេម ចន្លោះស្វែងរកធំធេង ហើយអាល់ហ្គរីធម៍អាចត្រូវបានបង្កើតឡើងល្អជាងនេះដោយសិក្សាពីការប្រកួតរវាងកីឡាករមនុស្ស។ ការវាយតម្លៃបន្ទាប់បានប្រើ [case-based reasoning](https://en.wikipedia.org/wiki/Case-based_reasoning) ដើម្បីស្វែងរកករណីនៅក្នុងខ្នាតចំណេះដឹងជិតស្និទនឹងទីតាំងបច្ចុប្បន្ននៅក្នុងហ្គេម។ +* កម្មវិធីសម័យទំនើបដែលឈ្នះលើកីឡាករមនុស្សផ្អែកលើបណ្តាញប្រសាទ និង [reinforcement learning](https://en.wikipedia.org/wiki/Reinforcement_learning) ដែលកម្មវិធីរៀនលេងដោយខ្លួនឯងជាច្រើននៅពេលណាមួយ ហើយរៀនពីកំហុសផ្ទាល់ខ្លួន - ដូចមនុស្សរៀនលេងស៊ុតចៀក។ ទោះជាយ៉ាងណា កម្មវិធីកុំព្យូទ័រអាចលេងហ្គេមច្រើនជាងយ៉ាងខ្លាំងក្នុងពេលតិច ជាបណ្ដាលឲ្យវាអាចរៀនបានលឿនជាង។ + +✅ សូមស្រាវជ្រាវពីហ្គេមផ្សេងៗដែល AI បានលេង។ + +ដូចគ្នា អាចឃើញការផ្លាស់ប្តូររបៀបនៅក្នុងការបង្កើតកម្មវិធី "និយាយ" (ដែលអាចឆ្លងតេស្ត Turing) : + +* កម្មវិធីដំបូងៗដូចជា [Eliza](https://en.wikipedia.org/wiki/ELIZA) ផ្អែកលើច្បាប់វេយ្យាករណ៍សាមញ្ញបំផុត និងកែប្រែប្រយោគបញ្ចូលទៅជាសំណួរ។ +* ជំនួយការសម័យថ្មីៗដូច Cortana, Siri ឬ Google Assistant ជាប្រព័ន្ធផ្សំ ផ្ទុកប្រើបណ្តាញប្រសាទ ដើម្បីបំលែងសំឡេងទៅអត្ថបទ និងរៀបរាប់ចេតនារបស់យើង បន្ទាប់ហេតុផល ឬ កម្មវិធីច្បាស់លាស់ក្នុងការអនុវត្តន៍សកម្មភាពចាំបាច់។ +* អនាគត យើងអាចរំពឹងបានគំរូបណ្តាញប្រសាទពេញលេញមួយ សម្រាប់ដោះស្រាយការជជែកដោយខ្លួនឯង។ GPT និង [Turing-NLG](https://www.microsoft.com/research/blog/turing-nlg-a-17-billion-parameter-language-model-by-microsoft) ជាលំនាំមួយរបស់បណ្តាញប្រសាទថា របួសនៃជោគជ័យ។ + +ការវិវត្តនៃសាកល្បង Turing +> រូបភាពដោយ Dmitry Soshnikov, [រូបថត](https://unsplash.com/photos/r8LmVbUKgns) ដោយ [Marina Abrosimova](https://unsplash.com/@abrosimova_marina_foto), Unsplash + +## ការស្រាវជ្រាវ AI ថ្មីៗ + +កំណើនធំទូលាយចុងក្រោយក្នុងការស្រាវជ្រាវបណ្តាញប្រសាទបានចាប់ផ្តើមជុំវិញឆ្នាំ 2010 នៅពេលដែលឯកសារសាធារណៈធំៗបានចាប់ផ្តើមមានស្រេច។ អំពីការប្រមូលរូបភាពជាច្រើនហៅថា [ImageNet](https://en.wikipedia.org/wiki/ImageNet) ដែលមានរូបភាពបម្រាស់ប្រហែល 14លានបានបង្កើតជាច្រកចូលសម្រាប់ [ImageNet Large Scale Visual Recognition Challenge](https://image-net.org/challenges/LSVRC/)។ + +![ILSVRC Accuracy](../../../../lessons/1-Intro/images/ilsvrc.gif) + +> រូបភាពដោយ [Dmitry Soshnikov](http://soshnikov.com) + +នៅឆ្នាំ 2012, [បណ្តាញប្រសាទ Convolutional Neural Networks](../4-ComputerVision/07-ConvNets/README.md) ត្រូវបានប្រើលើកដំបូងសម្រាប់ចាត់ថ្នាក់រូបភាពដែលនាំឲ្យកំហុសចាត់ថ្នាក់ធ្លាក់យ៉ាងគាប់ចិត្ត (ចាប់ពីបង្គោល 30% ទៅកាន់16.4%)។ នៅឆ្នាំ 2015, រចនាសម្ព័ន្ធ ResNet ពី Microsoft Research [បានទទួលភាពត្រឹមត្រូវនៅកម្រិតមនុស្ស](https://doi.org/10.1109/ICCV.2015.123)។ + +ចាប់តាំងពីពេលនោះ បណ្តាញប្រសាទបានបង្ហាញនូវសមត្ថភាពជោគជ័យខ្ពស់ក្នុងភារកិច្ចជាច្រើន៖ + +--- + +ឆ្នាំ | ទទួលបានភាពស្មើមនុស្ស +-----|-------- +2015 | [ចាត់ថ្នាក់រូបភាព](https://doi.org/10.1109/ICCV.2015.123) +2016 | [ការទទួលសម្លេងបែបសន្ទនាគ្នា](https://arxiv.org/abs/1610.05256) +2018 | [ការបកប្រែយានយន្តស្វ័យប្រវត្តិ](https://arxiv.org/abs/1803.05567) (ចិនទៅអង់គ្លេស) +2020 | [ការរៀបរាប់រូបភាព](https://arxiv.org/abs/2009.13682) + +ក្នុងរយៈពេលប៉ុន្មានឆ្នាំចុងក្រោយនេះ យើងបានឃើញជោគជ័យដ៏ធំធេងជាមួយម៉ូដែលភាសាធំៗ ដូចជា BERT និង GPT-3។ នេះកើតឡើងចម្បងដោយសារតែមានទិន្នន័យអត្ថបទទូទៅច្រើនដែលអាចអនុញ្ញាតឲ្យយើងបណ្តុះបណ្តាលម៉ូដែល ដើម្បីចាប់យករចនាសម្ព័ន្ធ និងអត្ថន័យនៃអត្ថបទ បណ្តុះបណ្តាលពួកវា លើការប្រមូលអត្ថបទទូទៅ ហើយបន្ទាប់មកពិសេសអោយម៉ូដែលទាំងនោះសម្រាប់ភារកិច្ចជាក់លាក់ជាងនេះ។ យើងនឹងរៀនបន្ថែមអំពី [ការបដិសេធភាសាធម្មជាតិ](../5-NLP/README.md) បន្ដទៀតនៅវគ្គនេះ។ + +## 🚀 챌린지 + +ធ្វើដំណើរស្វែងរកអ៊ីនធឺណិតដើម្បីកំណត់ថា នៅតាមមើលរបស់អ្នក AI ត្រូវបានប្រើប្រាស់យ៉ាងមានប្រសិទ្ធភាពនៅឯណា។ តើវាជាកម្មវិធីរៀបចំផែនទី បច្ចេកវិទ្យាសំឡេងទៅអត្ថបទ ឬហ្គេមវីដេអូវ៉ា? ស្រាវជ្រាវពីរបៀបដែលប្រព័ន្ធត្រូវបានបង្កើតឡើង។ + +## [សំណួរបន្ទាប់មកជប់](https://ff-quizzes.netlify.app/en/ai/quiz/2) + +## ពិនិត្យឡើងវិញ និង សិក្សាផ្ទាល់ខ្លួន + +ពិនិត្យប្រវត្តិការរបស់ AI និង ML ដោយអានតាមរយៈ [មេរៀននេះ](https://github.com/microsoft/ML-For-Beginners/tree/main/1-Introduction/2-history-of-ML)។ ជ្រើសរើសធាតុមួយពីសកេតណូតនៅចំណុចខាងលើនៃមេរៀននោះ ឬនេះ ហើយស្រាវជ្រាវវាឱ្យជ្រាលជ្រៅឡើង ដើម្បីយល់ពីបរិបទវប្បធម៌ដែលជំរុញអោយវាកើតមានចំណែក។ + +**កិច្ចការងារ**: [Game Jam](assignment.md) + +--- + + +**ការធ្វើច្បាប់**៖ +ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលដែលយើងខិតខំបំពាក់ភាពត្រឹមត្រូវ សូមយល់ដឹងថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុសឬភាពមិនត្រឹមត្រូវខ្លះ។ ឯកសារដើមក្នុងភាសាដើមគួរត្រូវបានគិតថាជា ប្រភពផ្លូវការជាចម្បង។ សម្រាប់ព័ត៌មានសំខាន់ៗ ភាសាបកប្រែដោយមនុស្សជំនាញគឺត្រូវបានណែនាំ។ យើងមិនមានកាតព្វកិច្ចចំពោះការយល់ច្រឡំ ឬការប្រែរូបន័យខុសពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។ + \ No newline at end of file diff --git a/translations/km/lessons/1-Intro/assignment.md b/translations/km/lessons/1-Intro/assignment.md new file mode 100644 index 00000000..321bd522 --- /dev/null +++ b/translations/km/lessons/1-Intro/assignment.md @@ -0,0 +1,10 @@ +# ការប្រកួតលេងហ្គេម + +ហ្គេមជាលំហដែលត្រូវបានដឹកនាំយ៉ាងខ្លាំងដោយការវិវឌ្ឍន៍នៅក្នុង AI និង ML។ ក្នុងកិច្ចការនេះ សូមសរសេរអត្ថបទខ្លីអំពីហ្គេមមួយដែលអ្នកចូលចិត្តដែលបានទទួលឥទ្ធិពលពីការវិវឌ្ឍន៍ AI។ វាគួរតែជាហ្គេមចាស់គEnoughផងដែរដើម្បីបានទទួលឥទ្ធិពលពីប្រព័ន្ធដំណើរការកុំព្យូទ័រជាច្រើនប្រភេទ។ ឧទាហរណ៍ល្អគឺ Chess ឬ Go ប៉ុន្តែអ្នកក៏អាចមើលទៅហ្គេមវីដេអូច្រើនដូចជា pong រឺ Pac-Man ផងដែរ។ សូមសរសេរអត្ថបទមួយដែលពិភាក្សាអំពីអតីតកាល បច្ចុប្បន្នភាព និងអនាគត AI របស់ហ្គេមនោះ។ + +--- + + +**ការពន្យល់​ពី​កំហុស**៖ +ឯកសារ​នេះ​ត្រូវ​បាន​បកប្រែ​ដោយ​ប្រើ​សេវាកម្ម​បកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈ​ពេល​យើងខិតខំ​ប្រឹងប្រែង​សម្រាប់​ការពិត​ច្បាស់ សូម​យល់ដឹង​ថា​បកប្រែ​ដោយ​ស្វ័យប្រវត្តិ​អាច​មាន​បញ្ហា​កំហុស ឬ ការ​ខ្វះខាត​នៅ​ក្នុង​វា។ ឯកសារ​ដើម​នៅ​នៅ​ភាសា​ដើម​គួរត្រូវបាន​គេ​រាប់​ប៉ុន្តែ​ជា​ឯកសារ​ដើម​ដែល​មាន​អំណាច​ដែល​គួរ​ឱ្យ​ជឿទុក​ចិត្ត។ សម្រាប់​ព័ត៌មាន​សំខាន់ៗ ការ​បកប្រែ​ដោយ​មនុស្ស​ជំនាញ​ត្រូវ​បាន​ណែនាំ។ យើង​មិនទទួល​ខុសត្រូវ​សម្រាប់​ការ​យល់​ច្រឡំ ឬ​ការ​បកប្រែ​ខុស​កើត​ចេញ​ពី​ការ​ប្រើ​ប្រាស់​បកប្រែ​នេះឡើយ។ + \ No newline at end of file diff --git a/translations/km/lessons/2-Symbolic/Animals.ipynb b/translations/km/lessons/2-Symbolic/Animals.ipynb new file mode 100644 index 00000000..f73dc38f --- /dev/null +++ b/translations/km/lessons/2-Symbolic/Animals.ipynb @@ -0,0 +1,471 @@ +{ + "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", + "![](../../../../translated_images/km/AND-OR-Tree.5592d2c70187f283.webp)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## របៀបផ្ទាល់ខ្លួនរបស់យើងសម្រាប់ប្រព័ន្ធឯកទេសជាមួយការអនុReasonត្រឡប់ក្រោយ\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។ ហេតុបីឡើយ ការពិតខ្លះអាចត្រូវបាន `Ask`-នៅបាន។\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": [ + "ដើម្បីធ្វើការ​អនុញ្ញាណផ្ទុយក្រោយ យើងនឹងកំណត់ថ្នាក់ `Knowledgebase`។ វានឹងមាន៖\n", + "* `memory` កំពុងធ្វើការ - ជាផ្លូវដំណាក់ដែលភ្ជាប់លទ្ធផលទៅកាន់តម្លៃ\n", + "* `rules` នៃ Knowledgebase នៅក្នុងទ្រង់ទ្រាយដូចបានកំណត់ខាងលើ\n", + "\n", + "វិធីសាស្រ្តសំខាន់ពីរ គឺ៖\n", + "* `get` ដើម្បីទទួលបានតម្លៃនៃអេត្រ៊ីប៊ុតមួយ បំពេញការអនុញ្ញាណបើចាំបាច់។ ឧទាហរណ៍ `get('color')` នឹងទទួលបានតម្លៃនៃចំណុចពណ៌ (វានឹងសួរបើចាំបាច់ ហើយរក្សាទុកតម្លៃសម្រាប់ប្រើប្រាស់បន្ទាប់ក្នុង memory កំពុងធ្វើការ)។ បើយើងសួរ `get('color:blue')` វានឹងសួរពណ៌ ហើយបើកមកតម្លៃ `y`/`n` អាស្រ័យលើយ៉ាងពណ៌។\n", + "* `eval` ប្រតិបត្តិការអនុញ្ញាណពិតប្រាកដ គឺ ដំណើរការលើឈើ AND/OR ការវាយតម្លៃរងគោលបំណង ដូចជា។\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": [ + "## ការប្រើប្រាស់ Experta សម្រាប់ការបន្លាស់បញ្ញា​មុខ​ទៅ​មុខ\n", + "\n", + "ក្នុងឧទាហរណ៍ក្រោយនេះ យើងនឹងព្យាយាមអនុវត្តការបន្លាស់បញ្ញាមុខទៅមុខដោយប្រើម៉ាស៊ីនមួយនៃបណ្ណាល័យសម្រាប់ការបង្ហាញចំណេះដឹង, [Experta](https://github.com/nilp0inter/experta). **Experta** គឺជាបណ្ណាល័យសម្រាប់បង្កើតប្រព័ន្ធបន្លាស់បញ្ញា​មុខទៅ​មុខក្នុងភាសា Python ដែលបានរចនាឡើងអោយស្រដៀងទៅនឹងប្រព័ន្ធបុរាណ [CLIPS](http://www.clipsrules.net/index.html)។\n", + "\n", + "យើងក៏អាចអនុវត្តឱ្យគេបន្លាស់បញ្ញា​ជំហៀងមុខដោយខ្លួនឯងដោយគ្មានបញ្ហាច្រើនទេ ប៉ុន្តែការអនុវត្តឲ្យសាមញ្ញជារឿយៗមិនមានប្រសិទ្ធភាពខ្លាំង។ ដើម្បីធ្វើការចូលគ្នានូវច្បាប់បានមានប្រសិទ្ធភាព សិក្សាការបើកបង្កើត​គាត់មេរៀនពិសេសមួយដែលហៅថា [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/nilp0inter/experta\n", + " Cloning https://github.com/nilp0inter/experta to /tmp/pip-req-build-7qurtwk3\n", + " Running command git clone --filter=blob:none --quiet https://github.com/nilp0inter/experta /tmp/pip-req-build-7qurtwk3\n", + " Resolved https://github.com/nilp0inter/experta to commit c6d5834b123861f5ae09e7d07027dc98bec58741\n", + " Installing build dependencies ... \u001b[?25ldone\n", + "\u001b[?25h Getting requirements to build wheel ... \u001b[?25ldone\n", + "\u001b[?25h Preparing metadata (pyproject.toml) ... \u001b[?25ldone\n", + "\u001b[?25hRequirement already satisfied: frozendict~=2.4.6 in /opt/conda/envs/ai4beg/lib/python3.12/site-packages (from experta==1.9.5.dev1) (2.4.7)\n", + "Collecting schema~=0.6.7 (from experta==1.9.5.dev1)\n", + " Downloading schema-0.6.8-py2.py3-none-any.whl.metadata (14 kB)\n", + "Downloading schema-0.6.8-py2.py3-none-any.whl (14 kB)\n", + "Building wheels for collected packages: experta\n", + " Building wheel for experta (pyproject.toml) ... \u001b[?25ldone\n", + "\u001b[?25h Created wheel for experta: filename=experta-1.9.5.dev1-py3-none-any.whl size=34804 sha256=888c459512a5e713f4b674caa9a0f96cfdf07ec0d6eb56cc318ce0653d218014\n", + " Stored in directory: /tmp/pip-ephem-wheel-cache-1eeii9zy/wheels/3d/e8/bb/22d7956359603fa8dd679aa09f5b8efb3f29991c3986fdc787\n", + "Successfully built experta\n", + "Installing collected packages: schema, experta\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2/2\u001b[0m [experta]\n", + "\u001b[1A\u001b[2KSuccessfully installed experta-1.9.5.dev1 schema-0.6.8\n" + ] + } + ], + "source": [ + "import sys\n", + "!{sys.executable} -m pip install git+https://github.com/nilp0inter/experta" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "trusted": true + }, + "outputs": [], + "source": [ + "from experta import *\n", + "#import experta" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "យើងនឹងកំណត់ប្រព័ន្ធរបស់យើងជា class មួយដែលជាកូនថ្នាក់ `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": [ + "ពេលដែលយើងបានកំណត់មូលដ្ឋានចំណេះដឹងមួយហើយ យើងបញ្ចូលច្រកចម្លងការងាររបស់យើងជាមួយនឹងត-Thនៃដើមហើយបន្ទាប់មកហៅមេធង់ `run()` ដើម្បីអនុវត្តន៍ការសន្និដ្ឋាន។ អ្នកអាចមើលឃើញជាលទ្ធផលថា ត-Thនៃដែលបានសន្និដ្ឋានថ្មីត្រូវបានបន្ថែមចូលទៅក្នុងច្រកចម្លងការងារ រួមមានត-Thនៃចុងក្រោយអំពីសត្វ (បើសិនជាយើងបានដាក់កម្រិតនូវត-Thនៃដើមទាំងអស់យ៉ាងត្រឹមត្រូវ)។\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\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" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} \ No newline at end of file diff --git a/translations/km/lessons/2-Symbolic/FamilyOntology.ipynb b/translations/km/lessons/2-Symbolic/FamilyOntology.ipynb new file mode 100644 index 00000000..6d3b6c18 --- /dev/null +++ b/translations/km/lessons/2-Symbolic/FamilyOntology.ipynb @@ -0,0 +1,589 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "# អង្គភាពទំនាក់ទំនងគ្រួសារ\n", + "\n", + "ឧទាហរណ៍នេះជាផ្នែកមួយនៃ [កម្រងសូត្រសម្រាប់អ្នកចាប់ផ្តើម AI](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": [ + "### ការទាញយក Family Ontology\n", + "\n", + "បន្ទាប់មក យើងមកមើល [family ontology](https://raw.githubusercontent.com/blokhin/genealogical-trees/master/data/header.ttl) ដែលបានកំណត់ជាសំណុំរបស់ Semantic Web triplets។ ontology នេះកំណត់ទំនាក់ទំនងដូចជា `isUncleOf`, `isCousinOf`, និងទំនាក់ទំនងផ្សេងទៀតជាច្រើន។ ទំនាក់ទំនងទាំងអស់នោះត្រូវបានកំណត់ជាការប្រើប្រាស់ predicate មូលដ្ឋាន `isMotherOf`, `isFatherOf`, `isBrotherOf` និង `isSisterOf`។ យើងនឹងប្រើការយល់ឃើញស្វ័យប្រវត្តិ ដើម្បីសន្និដ្ឋានទំនាក់ទំនងផ្សេងទៀតទាំងអស់ដោយប្រើ ontology។\n", + "\n", + "នេះគឺជាការបកស្រាយគំរូនៃគុណលក្ខណៈ `isAuntOf` ដែលបានកំណត់ជាការបង្រួបបង្រួមរវាង `isSisterOf` និង `isParentOf` (*Aunt គឺជា​បងពីរនៃម៉ាក់ឬឪពុកម្នាក់*)។\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: .\n", + "@prefix owl: .\n", + "@prefix rdf: .\n", + "@prefix rdfs: .\n", + "@prefix xml: .\n", + "@prefix xsd: .\n", + "\n", + " 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 Graph នៅក្នុងរចនាប័ទ្មផ្សេងៗ សម្រាប់សាកសួរ វា ល។\n", + "\n", + "សម្រាប់ការសន្មតតាមតុល្យភាព នោះយើងនឹងប្រើបណ្ណាល័យ [OWL-RL](https://github.com/RDFLib/OWL-RL) ដែលអនុញ្ញាតឲ្យយើងបង្កើត **Closure** របស់ RDF Graph គឺបន្ថែមគំនិត និងទំនាក់ទំនងទាំងអស់ដែលអាចសន្មតបាន។\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": [ + "ពីចំហារឯកសារ ontology ហើយមើលថាវាត្រូវបានផ្ទុកប៉ុន្មាន triplets:\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": [ + "ឥឡូវនេះយើងត្រូវបង្កើត closure ហើយមើលថាចំនួន triplets ប្រែប្រួលយ៉ាងដូចម្តេច៖\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": [ + "### ស្វែងរកសំណួរសម្រាប់សាច់ញាតិ \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\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" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} \ No newline at end of file diff --git a/translations/km/lessons/2-Symbolic/MSConceptGraph.ipynb b/translations/km/lessons/2-Symbolic/MSConceptGraph.ipynb new file mode 100644 index 00000000..7b3f3ed0 --- /dev/null +++ b/translations/km/lessons/2-Symbolic/MSConceptGraph.ipynb @@ -0,0 +1,532 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "## គំនូសតំណាងគំនិតដោយប្រើ ConceptNet\n", + "\n", + "> **ចំណាំ៖** [Microsoft Concept Graph](https://concept.research.microsoft.com/) API ដើមមិនមានម្តងទៀត។ សៀវភៅកំណត់ត្រានេះត្រូវបានធ្វើបច្ចុប្បន្នភាពឲ្យប្រើប្រាស់ [ConceptNet](https://conceptnet.io/) ជាជំនួស ដែលជាក្រាហ្វិចចំណេះដឹងបើកសេរីមួយដែលមានទំនាក់ទំនង `is-a` ដូចគ្នា​រវាងគំនិត។\n", + "\n", + "[ConceptNet](https://conceptnet.io/) គឺជាបណ្ដាញអត្ថន័យធំហ្នឹងនៃគំនិតដែលមានទំនាក់ទំនងដូចជា `IsA`។ `PartOf`, `UsedFor` និងផ្សេងទៀត។ វាអាចប្រើបានជាៈ\n", + " * ឯកសារទិន្នន័យដែលអាចទាញយកបាន\n", + " * REST API (មិនត្រូវការខ្សែ API)\n", + "\n", + "ស្ថិតិ ConceptNet៖\n", + " * លើស ៨ លានកំពូល\n", + " * ២១+ លានចំណុចឆ្លងកាត់ភាសា ៨៣ ចំណាត់ថ្នាក់\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ការប្រើបណ្តាញសេវាកម្ម ConceptNet\n", + "\n", + "[ConceptNet](https://conceptnet.io/) ផ្តល់ជូន API REST ដើម្បីស្វែងយល់ទំនាក់ទំនង `is-a` (IsA) រវាងយោបល់។ មិនត្រូវការខ្សែ API ទេ។\n", + "នេះគឺជាលីងគំរូសម្រាប់ការហៅ: `https://api.conceptnet.io/query?start=/c/en/microsoft&rel=/r/IsA&limit=10`\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "trusted": true + }, + "outputs": [], + "source": [ + "import urllib\n", + "import json\n", + "\n", + "def http(x):\n", + " response = urllib.request.urlopen(x)\n", + " data = response.read()\n", + " return data.decode('utf-8')\n", + "\n", + "def query(x):\n", + " concept = x.lower().replace(' ', '_')\n", + " url = \"https://api.conceptnet.io/query?start=/c/en/{}&rel=/r/IsA&limit=10\".format(\n", + " urllib.parse.quote(concept))\n", + " try:\n", + " result = json.loads(http(url))\n", + " except Exception:\n", + " return {}\n", + " edges = result.get('edges', [])\n", + " if not edges:\n", + " return {}\n", + " total_weight = sum(edge['weight'] for edge in edges)\n", + " if total_weight == 0:\n", + " return {}\n", + " return {edge['end']['label']: edge['weight'] / total_weight for edge in edges}\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 = ''\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)\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\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" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} \ No newline at end of file diff --git a/translations/km/lessons/2-Symbolic/README.md b/translations/km/lessons/2-Symbolic/README.md new file mode 100644 index 00000000..119c5f76 --- /dev/null +++ b/translations/km/lessons/2-Symbolic/README.md @@ -0,0 +1,247 @@ +# ការបញ្ជូនតំណាងចំណេះដឹង និងប្រព័ន្ធឯកទេស + +![សង្ខេបអំពីមាតិកា AI សញ្ញាសិទ្ធិ](../../../../translated_images/km/ai-symbolic.715a30cb610411a6.webp) + +> ស្គេតសំគាល់ដោយ [Tomomi Imura](https://twitter.com/girlie_mac) + +ការស្វែងរកប្រាជ្ញាសិប្បនិម្មិតមានមូលដ្ឋានលើការស្វែងរកចំណេះដឹង ដើម្បីឲ្យយល់ពីពិភពលោក ដូចរបៀបដែលមនុស្សធ្វើ។ តែតើអ្នកអាចធ្វើដូចម្តេចបាន? + +## [ប្រលងមុនមេរៀន](https://ff-quizzes.netlify.app/en/ai/quiz/3) + +នៅពេលដំបូងនៃ AI វិធីសាស្រ្តពីលើចុះក្រោមក្នុងការបង្កើតប្រព័ន្ធឆ្លាតវាង (ដែលបានពិភាក្សានៅមេរៀនមុន) បានពេញនិយម។ គំនិតគឺពន្លឿនចំណេះដឹងពីមនុស្សទៅក្នុងទ្រង់ទ្រាយអាចអានបញ្ចូលម៉ាស៊ីនបាន ហើយបន្ទាប់មកប្រើវាដើម្បីដោះស្រាយបញ្ហាអូតូម៉ាទិច។ វិធីនេះមានមូលដ្ឋានលើគំនិតធំពីរយ៉ាង៖ + +* ការបញ្ជូនតំណាងចំណេះដឹង +* ការអោយហRaz + +## ការបញ្ជូនតំណាងចំណេះដឹង + +មួយក្នុងចំណោមគំនិតសំខាន់ៗក្នុង Symbolic AI គឺ **ចំណេះដឹង**។ វាសំខាន់ក្នុងការផ្សេងបែកចំណេះដឹងពី *ព័ត៌មាន* ឬ *ទិន្នន័យ*។ ឧទាហរណ៍ អ្នកអាចនិយាយថាសៀវភៅមានចំណេះដឹង ព្រោះអ្នកអាចសិក្សាសៀវភៅហើយក្លាយជាឧទិ្ឋជជាញ។ ទោះយ៉ាងណា អ្វីដែលសៀវភៅមានគឺត្រូវបានគេហៅថា *ទិន្នន័យ* ហើយដោយការអានសៀវភៅនិងបញ្ចូលទិន្នន័យនេះក្នុងគំរូពិភពលោករបស់យើងយើងបំលែងទិន្នន័យនេះទៅជាចំណេះដឹង។ + +> ✅ **ចំណេះដឹង** គឺជាអ្វីដែលមាននៅក្នុងខួរក្បាលរបស់យើង ហើយបង្ហាញពីការយល់ដឹងរបស់យើងអំពីពិភពលោក។ វាត្រូវបានទទួលបានដោយដំណើរការសិក្សាដោយសកម្ម ដែលបញ្ចូលរបស់ពត៌មានដែលយើងទទួលបានទៅក្នុងគំរូសកម្មនៃពិភពលោករបស់យើង។ + +ភាគច្រើន យើងមិនតែងតែកំណត់ចំណេះដឹងយ៉ាងតឹងរឹងទេ ប៉ុន្តែយើងត្បិតវាជាមួយគំនិតផ្សេងទៀតដោយប្រើ [DIKW Pyramid](https://en.wikipedia.org/wiki/DIKW_pyramid)។ វាមានគំនិតដូចខាងក្រោម៖ + +* **ទិន្នន័យ** គឺជាអ្វីដែលត្រូវបានបង្ហាញនៅលើបរិមាណរូបមន្តពហុ និងគ្រើនដូចជា អត្ថបទសរសេរ ឬពាក្យនិយាយ។ ទិន្នន័យមានអត្តសញ្ញាណដោយឯករាជ្យពីមនុស្ស ហើយអាចបញ្ជូនពីមនុស្សម្នាក់ទៅម្នាក់បាន។ +* **ព័ត៌មាន** គឺជាវិធីដែលយើងបកស្រាយទិន្នន័យនៅក្នុងខួរក្បាលរបស់យើង។ ឧទាហរណ៍ ពេលយើងស្តាប់ពាក្យ *កុំព្យូទ័រ* យើងមានការយល់ដឹងខ្លះអំពីវា។ +* **ចំណេះដឹង** គឺជាព័ត៌មានដែលបានបញ្ចូលទៅក្នុងគំរូពិភពលោករបស់យើង។ ឧទាហរណ៍ បន្ទាប់ពីយើងរៀនថាគុំព្យូទ័រជាអ្វី យើងចាប់ផ្តើមមានគំនិតអំពីរបៀបដែលវាធ្វើការ តម្លៃរបស់វា និងអ្វីដែលវាអាចប្រើបាន។ បណ្ដាញគំនិតទាំងនេះបង្កើតចំណេះដឹងរបស់យើង។ +* **ប្រាជ្ញា** គឺជាកម្រិតបន្ថែមមួយទៀតនៃការយល់ដឹងរបស់យើងអំពីពិភពលោក ហើយវាបង្ហាញពី *ចំណេះដឹងលើចំណេះដឹង* ឧ. គំនិតមួយអំពីរបៀប និងពេលដែលចំណេះដឹងគួរត្រូវបានប្រើ។ + + + +*រូបភាព [ពីវិគីភីឌា](https://commons.wikimedia.org/w/index.php?curid=37705247), ដោយ Longlivetheux - ឯកម្មារបស់ខ្លួន, CC BY-SA 4.0* + +ដូច្នេះ បញ្ហានៃ **ការបញ្ជូនតំណាងចំណេះដឹង** គឺស្វែងរកវិធីមានប្រសិទ្ធិភាពក្នុងការបង្ហាញចំណេះដឹងនៅក្នុងកុំព្យូទ័រជាទ្រង់ទ្រាយទិន្នន័យ ដើម្បីឲ្យវាអាចប្រើបានដោយស្វ័យប្រវត្តិ។ វាអាចត្រូវបានមើលឃើញជាផ្ទៃពណ៌៖ + +![ទីតាំងបញ្ជូនតំណាងចំណេះដឹង](../../../../translated_images/km/knowledge-spectrum.b60df631852c0217.webp) + +> រូបភាពដោយ [Dmitry Soshnikov](http://soshnikov.com) + +* នៅខាងខាងឆ្វេង មានប្រភេទបញ្ជូនតំណាងចំណេះដឹងសាមញ្ញដែលអាចប្រើប្រាស់បានយ៉ាងមានប្រសិទ្ធភាពដោយកុំព្យូទ័រ។ ប្រភេទសាមញ្ញជាងគេគឺអាល់ហ្គោរីធមិក ដែលចំណេះដឹងត្រូវបានបង្ហាញដោយកម្មវិធីកុំព្យូទ័រ។ ទោះយ៉ាងណា វាមិនមែនជាវិធីល្អបំផុតសម្រាប់បង្ហាញចំណេះដឹងទេ ព្រោះវាមិនបត់បែន។ ចំណេះដឹងនៅក្នុងខួរក្បាលយើងជាច្រើនជាបណ្តាលអាល់ហ្គោរីធមិកមិនឈរជាក់។ +* នៅខាងស្ដាំ មានការបង្ហាញដូចជអត្ថបទធម្មជាតិ។ វាអំណាចបំផុត ប៉ុន្តែមិនអាចប្រើសម្រាប់ការរាំរានស្វ័យប្រវត្តិបានទេ។ + +> ✅ សូមគិតមួយនាទីអំពីរបៀបដែលអ្នកបង្ហាញចំណេះដឹងនៅក្នុងខួរក្បាលរបស់អ្នក ហើយបំលែងវាទៅជាកំណត់ត្រា។ តើមានទ្រង់ទ្រាយពិសេសណារឺទេដែលមានប្រសិទ្ធភាពសម្រាប់អ្នកក្នុងការជួយរក្សាទុក? + +## ការប្រើប្រាស់ចំណេះដឹងតំណាងកុំព្យូទ័រ + +យើងអាចចាត់ថ្នាក់វិធីសាស្រ្តលំដាប់ចំណេះដឹងនៅក្នុងកុំព្យូទ័រជាក្រុមខាងក្រោម៖ + +* **ការបង្ហាញបណ្តាញ** មានមូលដ្ឋានលើការពិតថាយើងមានបណ្តាញគំនិតដែលពាក់ព័ន្ធគ្នានៅក្នុងខួរក្បាល។ យើងអាចព្យាយាមបង្កើតបណ្តាញដូចគ្នាជាក្រាបក្នុងកុំព្យូទ័រ - ឈ្មោះថា **បណ្តាញសមនិយម**។ + +1. **Object-Attribute-Value triplets** ឬ **attribute-value pairs**។ ព្រោះក្រាបអាចត្រូវបានបង្ហាញនៅក្នុងកុំព្យូទ័រជារាយនាមនៃចំណុចនិងរន្ធ យើងអាចបញ្ចេញបណ្តាញសមនិយមដោយបញ្ជី triplets ដែលមានវត្ថុ សម្បត្តិ និងតម្លៃ។ ឧទាហរណ៍ យើងបង្កើត triplets ខាងក្រោមអំពីភាសាស្វាគមន៍៖ + +Object | Attribute | Value +-------|-----------|------ +Python | គឺជា | Untyped-Language +Python | បង្កើតដោយ | Guido van Rossum +Python | ផ្នែករាងកូដ | indentation +Untyped-Language | មិនមាន | ការបញ្ជាក់ប្រភេទ + +> ✅ សូមគិតពីរបៀបដែល triplets អាចប្រើសម្រាប់បង្ហាញចំណេះដឹងប្រភេទផ្សេងៗបាន។ + +2. **ការបង្ហាញជាដំបូល** ផ្តោតលើការពិតដែលយើងជាញឹកញាប់បង្កើតដំបូលនៃវត្ថុនៅក្នុងខួរក្បាល។ ឧទាហរណ៍ យើងដឹងថាគានារីគឺជា បក្សី ហើយបក្សីទាំងអស់មានប្រចាញ់ និងយើងក៏មានគំនិតខ្លះអំពីពណ៌ដែលគានារីភាគច្រើនមាន និងល្បឿនហោះរបស់វា។ + + - **ការ​បង្ហាញ​បែបផែន (Frame representation)** មានមូលដ្ឋានលើការបង្ហាញរាល់វត្ថុឬថ្នាក់វត្ថុជា **បែបផែន** ដែលមាន **ផ្នែក[slots]**។ ផ្នែកនីមួយៗមានតម្លៃលំនាំដើម ជម្រើសតម្លៃ កំណត់តម្លៃ ឬនីតិវិធីដែលអាចហៅបានដើម្បីទទួលបានតម្លៃផ្នែកនោះ។ បែបផែនទាំងអស់បង្កើតដំបូលដូចដំបូលវត្ថុជាភាសាស្វាគមន៍ដែលផ្អែកលើវត្ថុ។ + - **សេចក្ដីស្ថានភាព** គឺជាបែបផែនពិសេសមួយដែលបង្ហាញពីស្ថានភាពស្មុគស្មាញដែលអាចប៉ុនប៉ងឡើងវិញនៅពេលវេលា។ + +**Python** + +Slot | Value | Default value | Interval | +-----|-------|---------------|----------| +Name | Python | | | +Is-A | Untyped-Language | | | +Variable Case | | CamelCase | | +Program Length | | | 5-5000 បន្ទាត់ | +Block Syntax | Indent | | | + +3. **ការបង្ហាញនីតិវិធី** មានមូលដ្ឋានលើការបង្ហាញចំណេះដឹងជាបញ្ជីសកម្មភាពដែលអាចដំណើរការប្រារព្ធនៅពេលមានលក្ខខណ្ឌណាមួយកើតឡើង។ + - ច្បាប់ផលិតកម្មគឺជាសេចក្ដីថ្លែងការណ៍បើ-ដូច្នេះ ដែលអនុញ្ញាតិឲ្យយើងធ្វើការសន្និដ្ឋាន។ ឧទាហរណ៍ វេជ្ជបណ្ឌិតអាចមានច្បាប់ថា **បើ** អ្នកជំងឺមានកម្តៅខ្ពស់ **ឬ** កម្រិត C-reactive protein ខ្ពស់ក្នុងការធ្វើតេស្តឈាម **ដូច្នេះ** លោកអ្នកមានការរលាក។ ពេលដែលយើងជួបលក្ខខណ្ឌមួយយើងអាចទាញយកសន្និដ្ឋានអំពីការរលាក ហើយបន្ទាប់មកប្រើវានៅក្នុងការយល់ដឹងបន្ថែម។ + - អាល់ហ្គរីធម​ក៏អាចត្រូវបានគេចាត់ទុកជាទ្រង់ទ្រាយនីតិវិធីមួយទៀត ក៏ប៉ុន្តែវាកាត់បន្តិចមិនត្រូវបានប្រើជាប្រភេទផ្ទាល់ក្នុងប្រព័ន្ធផ្អែកលើចំណេះដឹង។ + +4. **លូហ្សិក** ត្រូវបានបញ្ចប់ដោយ Aristotle ក្នុងដំណើរបង្ហាញចំណេះដឹងមនុស្សទូទៅ។ + - លូហ្សិកបំពេញកិច្ចការជាទ្រឹស្តីគណិតវិទ្យាមានភាពសម្បូរបែបលើសមើលប្រាកដចំពោះកុំព្យូទ័រ ដូច្នេះសំណុំតិចតួចមួយត្រូវបានប្រើជាទូទៅដូចជា Horn clauses ដែលប្រើនៅក្នុង Prolog។ + - លូហ្សិកពិពណ៌នាគឺជាគ្រួសារប្រព័ន្ធលូហ្សិកដែលប្រើក្នុងការបង្ហាញនិងរៀបចំស្របគ្នារវាងដំបូលវត្ថុ និងការបញ្ជូនចំណេះដឹងដូចជា *បណ្តាញសមនិយម*។ + +## ប្រព័ន្ធឯកទេស + +មួយក្នុងចំណោមជោគជ័យដំបូងនៃ AI សញ្ញាសិទ្ធិគឺប្រព័ន្ធឯកទេសដែលហៅថា **expert systems** - ប្រព័ន្ធកុំព្យូទ័រ ដែលបានរចនាឡើងដើម្បីដំណើរការជាអ្នកជំនាញនៅក្នុងដែនកំណត់បញ្ហាមួយ។ វាត្រូវបានខ្ចាប់យកផ្អែកលើ **មូលដ្ឋានចំណេះដឹង** ពីអ្នកជំនាញម្នាក់ឬច្រើន ហើយមាន **ម៉ាស៊ីនសន្និដ្ឋាន** ដែលអនុវត្តការយល់ដឹងលើវា។ + +![រចនាសម្ព័ន្ធមនុស្ស](../../../../translated_images/km/arch-human.5d4d35f1bba3ab1c.webp) | ![ប្រព័ន្ធផ្អែកលើចំណេះដឹង](../../../../translated_images/km/arch-kbs.3ec5c150b09fa8da.webp) +---------------------------------------------|------------------------------------------------ +រចនាសម្ព័ន្ធសាមញ្ញនៃប្រព័ន្ធសរសៃប្រសាទមនុស្ស | រចនាសម្ព័ន្ធប្រព័ន្ធផ្អែកលើចំណេះដឹង + +ប្រព័ន្ធឯកទេសត្រូវបានកសាងដូចប្រព័ន្ធយល់ដឹងមនុស្ស ដែលមាន **ចងចាំខ្លីរយៈ** និង **ចងចាំបណ្តោះអាសន្ន**។ ដូចគ្នាពីរក្នុងប្រព័ន្ធផ្អែកលើចំណេះដឹង យើងចាត់ចែងថា៖ + +* **ចងចាំបញ្ហា**៖ រួមបញ្ចូលចំណេះដឹងអំពីបញ្ហាដែលកំពុងបានដោះស្រាយ ម៉ាតាបូកកម្តៅ ឬសម្ពាធឈាមរបស់អ្នកជំងឺ ថាតើមានការរលាក ឬមិនមាន។ ចំណេះដឹងនេះហៅថា **ចំណេះដឹងស្ថិតស្ថេរ** ព្រោះវាមានរូបភាពស្ថានភាពបញ្ហាបច្ចុប្បន្នហៅថា *problem state*។ +* **មូលដ្ឋានចំណេះដឹង**៖ តំណាងឲ្យចំណេះដឹងរយៈពេលវែងអំពីដែនកំណត់បញ្ហា។ វាត្រូវបានដកចេញដោយដៃពីអ្នកជំនាញមនុស្ស ហើយមិនប្រែប្រួលក្នុងការពិគ្រោះយោបល់នីមួយៗទេ។ ព្រោះវាអនុញ្ញាតិឲ្យយើងរុករកពីស្ថានភាពបញ្ហាមួយទៅមួយទៀត វាត្រូវបានហៅថា **ចំណេះដឹងរស្មី**។ +* **ម៉ាស៊ីនសន្និដ្ឋាន**៖ គ្រប់គ្រងដំណើរការស្វែងរកក្នុងលំហស្ថានភាពបញ្ហា​ សួរព័ត៌មានពីអ្នកប្រើនៅពេលចាំបាច់។ វាក៏ទទួលខុសត្រូវសំរាប់រកច្បាប់ត្រឹមត្រូវដើម្បីអនុវត្តលើគ្រប់ស្ថានភាព។ + +ឧទាហរណ៍ មកមើលប្រព័ន្ធឯកទេសមួយសម្រាប់កំណត់សត្វដោយផ្អែកលើលក្ខណៈរាងកាយ៖ + +![ដើមឈើ AND-OR](../../../../translated_images/km/AND-OR-Tree.5592d2c70187f283.webp) + +> រូបភាពដោយ [Dmitry Soshnikov](http://soshnikov.com) + +រូបភាពនេះហៅថា **ដើមឈើ AND-OR** ហើយវាជាការតំណាងក្រាហ្វិកនៃសំណុំច្បាប់ផលិតកម្ម។ ការគូរដើមឈើមានប្រយោជន៍នៅដើមក្នុងការទាញយកចំណេះដឹងពីអ្នកជំនាញ។ ដើម្បីបង្ហាញចំណេះដឹងក្នុងកុំព្យូទ័ររូបរាងសម្រួលជាងនេះជាការប្រើច្បាប់៖ + +``` +IF the animal eats meat +OR (animal has sharp teeth + AND animal has claws + AND animal has forward-looking eyes +) +THEN the animal is a carnivore +``` + +អ្នកអាចមើលឃើញថា លក្ខខណ្ឌមួយៗនៅផ្នែកឆ្វេងនៃច្បាប់ និងសកម្មភាព អាចត្រូវបានមើលឃើញជាផ្នែក object-attribute-value (OAV) triplets។ **ចងចាំការងារ** មានចំណុច OAV ដែលសមស្របនឹងបញ្ហាដែលកំពុងត្រូវបានដោះស្រាយ។ **ម៉ាស៊ីនច្បាប់** ស្វែងរកច្បាប់ដែលលក្ខខណ្ឌត្រូវបានបំពេញ ហើយអនុវត្តពួកវា បន្ថែម triplet មួយទៀតទៅក្នុងចងចាំការងារ។ + +> ✅ សរសេរដើមឈើ AND-OR លើប្រធានបទដែលអ្នកចូលចិត្ត! + +### ការសន្និដ្ឋានមុខក្រោយ និងពីក្រោយ + +ដំណើរការដែលបានពិពណ៌នាខាងលើហៅថា **សន្និដ្ឋានមុខក្រោយ**។ វាចាប់ផ្តើមជាមួយទិន្នន័យដើមអំពីបញ្ហាដែលមាននៅក្នុងចងចាំការងារ ហើយបន្ទាប់បង្កើតរង្វិលគិតបែបនេះ៖ + +1. ប្រសិនបើបែបបទគោលដៅមាននៅក្នុងចងចាំការងារ - បញ្ឈប់ ហើយផ្តល់លទ្ធផល +2. ស្វែងរកច្បាប់ទាំងអស់ដែលលក្ខខណ្ឌបច្ចុប្បន្នត្រូវបានបំពេញ - ទទួលបាន **សំណុំជម្លោះ** នៃច្បាប់ +3. ប្រតិបត្តិ **ដោះស្រាយជម្លោះ** - ជ្រើសច្បាប់មួយច្បាប់ដែលត្រូវអនុវត្តនៅជំហាននេះ។ អាចមានយុទ្ធសាស្រ្តផ្សេងៗក្នុងការដោះស្រាយជម្លោះ៖ + - ជ្រើសច្បាប់ដំបូងដែលអាចអនុវត្តបានក្នុងមូលដ្ឋានចំណេះដឹង + - ជ្រើសច្បាប់ដោយចៃដន្យ + - ជ្រើសច្បាប់ដែល *ពិសេសជាង* គឺជាច្បាប់ដែលបំពេញលក្ខខណ្ឌច្រើនជាងគេនៅផ្នែកឆ្វេង (LHS) +4. អនុវត្តច្បាប់ដែលជ្រើស ហើយបញ្ចូលចំណេះដឹងថ្មីទៅក្នុងស្ថានភាពបញ្ហា +5. ធ្វើម្តងទៀតចាប់ពីជំហាន 1។ + +ទោះជាយ៉ាងណា ក្នុងករណីខ្លះ យើងអាចចាប់ផ្តើមដោយគ្មានចំណេះដឹងអំពីបញ្ហា ហើយសួរចម្លើយដែលជួយឲ្យយើងដល់កំណត់ចុងក្រោយ។ ឧទាហរណ៍ នៅពេលធ្វើវេជ្ជសាស្ត្រ យើងមិនធ្វើតេស្តវេជ្ជសាស្ត្រទាំងអស់ជាមុនមុនចាប់ផ្តើមផ្តល់វេជ្ជៈទេសក្នុងអ្នកជំងឺទេ។ យើងល្អប្រសើរចាប់ផ្តើមធ្វើតេស្តនៅពេលចាំបាច់។ + +ដំណើរការនេះអាចត្រូវបានគំរូដោយប្រើ **សន្និដ្ឋានពីក្រោយ**។ វាត្រូវបានគ្រប់គ្រងដោយ **គោលដៅ** - តម្លៃសម្បត្តិដែលយើងស្វែងរក៖ + +1. ជ្រើសច្បាប់ទាំងអស់ដែលអាចផ្តល់តម្លៃមួយនៃគោលដៅ (ឧ. ជាមួយគោលដៅនៅលើ RHS ("ផ្នែកស្តាំ")) - សំណុំជម្លោះ +2. ប្រសិនបើមិនមានច្បាប់សម្រាប់សម្បត្តិនេះ ឬមានច្បាប់មួយដែលបញ្ជាឲ្យសួរតម្លៃពីអ្នកប្រើ - សូមថ្លែងបែបនេះ ប្រសិនជាអត់ពីនេះ៖ +3. ប្រើយុទ្ធសាស្រ្តដោះស្រាយជម្លោះជ្រើសច្បាប់មួយដែលយើងនឹងប្រើជា *សន្និដ្ឋាន* - យើងនឹងព្យាយាមបញ្ជាក់វា +4. ធ្វើម្ដងទៀតបែបជាបន្តបន្ទាប់ចំពោះអាគុយម៉ង់ទាំងអស់នៅក្នុង LHS របស់ច្បាប់ ដើម្បីព្យាយាមបញ្ជាក់ពួកគេជាគោលដៅ +5. ប្រសិនបើនៅដំណាក់កាលណាមួយខ្ទេចខ្ទី - ប្រើច្បាប់ផ្សេងនៅជំហាន 3។ + +> ✅ តើក្នុងស្ថានការណ៍ណាដែលសន្និដ្ឋានមុខក្រោយសាកសមជាង? និយាយពីសន្និដ្ឋានពីក្រោយដូចម្តេច? + +### ការអនុវត្តប្រព័ន្ធឯកទេស + +ប្រព័ន្ធឯកទេសអាចត្រូវអនុវត្តដោយប្រើឧបករណ៍ផ្សេងៗ៖ + +* កម្មវិធីសរសេរផ្ទាល់ជាភាសាកម្មវិធីកម្រិតខ្ពស់មួយ។ នេះមិនមែនជាគំនិតល្អបំផុតទេ ពីព្រោះអត្ថប្រយោជន៍សំខាន់នៃប្រព័ន្ធផ្អែកលើចំណេះដឹងគឺចំណេះដឹងត្រូវបានបំបែកពីសន្និដ្ឋាន ហើយពួកអ្នកជំនាញដែនកំណត់អាចសរសេរច្បាប់ឲ្យបានដោយគ្មានការយល់ដឹងជ្រាបជាក់ទាក់ទងនឹងដំណើរការសន្និដ្ឋាន។ +* ប្រើ **ក្រដាសប្រព័ន្ធឯកទេស** ដែលគឺជាប្រព័ន្ធដែលរចនាឡើងជាពិសេសសម្រាប់បញ្ចូលចំណេះដឹងដោយប្រើភាសា​តំណាង​ចំណេះដឹង។ + +## ✍️ លំហាត់៖ សន្និដ្ឋានសត្វ + +សូមមើល [Animals.ipynb](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/2-Symbolic/Animals.ipynb) សម្រាប់ឧទាហរណ៍នៃការអនុវត្តសន្និដ្ឋានមុខក្រោយ និងពីក្រោយក្នុងប្រព័ន្ធឯកទេស។ + +> **កំណត់សំគាល់**៖ ឧទាហរណ៍នេះសាមញ្ញ បង្ហាញគំនិតនៃរបៀបដែលប្រព័ន្ធឯកទេសស្របៗគ្នាដូចម្តេច។ បន្ទាប់ពីអ្នកចាប់ផ្តើមបង្កើតប្រព័ន្ធដូចនេះ អ្នកនឹងសម្គាល់ភាព *ឆ្លាត* ជាច្រើន ពីវា នៅពេលច្បាប់ច្រើនជាង ២០០+។ នៅពេលនេះ ច្បាប់ចោទដំណើរការលំបាកក្នុងការចងចាំ ហើយអ្នកអាចចាប់ផ្តើមចាប់អារម្មណ៍ថាហេតុអ្វីប្រព័ន្ធបង្កើតការសម្រេចចិត្តមួយៗ។ ទោះយ៉ាងណា លក្ខណៈសំខាន់នៃប្រព័ន្ធផ្អែកលើចំណេះដឹងគឺអ្នកអាច *ពន្យល់* ដោយដូចម្តេចដែលបណ្ដាលឲ្យកើតមានសម្រេចចិត្តណាមួយ។ + +## អ៊ុងតូឡូស៊ី និង បណ្តាញសមនិយម (Semantic Web) + +នៅចុងសតវត្សទី២០ មានការចាប់ផ្តើមឱ្យប្រើការបញ្ជូនតំណាងចំណេះដឹងដើម្បីអញ្ញាតធនធានអ៊ិនធឺណិត ដើម្បីអាចស្វែងរកធនធានដែលសមស្របនឹងសំណួរពិសេស។ ចលនានេះហៅថា **បណ្តាញសមនិយម (Semantic Web)** ហើយវាអាស្រ័យលើគំនិតជាច្រើន៖ + +- ការបញ្ជូនតំណាងចំណេះដឹងពិសេសមួយផ្អែកលើ **[លូហ្សិកពិពណ៌នា](https://en.wikipedia.org/wiki/Description_logic)** (DL)។ វាដូចជាការបង្ហាញបែបបែបផែន ព្រោះវាបង្កើតដំបូលអត់ធ្មត៍នៃវត្ថុជាមួយលក្ខណៈពិសេស ប៉ុន្តែវាមានសេម៉ង់ទីកវិទ្យាផ្លូវការនិងសន្និដ្ឋាន។ មានគ្រួសារពេញលេញនៃ DL ដែលតម្រងការវិវឌ្ឍន៍រវាងភាពសម្បូរបែប និងស្មុគស្មាញអាល់ហ្គរីធម៍នៃការសន្និដ្ឋាន។ +- ការបញ្ជូនតំណាងចំណេះដឹងចែកចាយ ដែលគំនិតទាំងអស់ត្រូវបានតំណាងដោយលេខសម្គាល់ URI ពិភពលោកធ្វើឲ្យអាចបង្កើតដំបូលចំណេះដឹងដែលរំលាយនៅលើអ៊ិនធឺណិត។ +- គ្រួសារភាសាដូចជា XML សម្រាប់ការពិពណ៌នាចំណេះដឹង៖ RDF (Resource Description Framework), RDFS (RDF Schema), OWL (Ontology Web Language)។ +មាជារបស់ Semantic Web គឺជា ឧបាយកា្រណ៍នៃ **Ontology**។ វាបញ្ជាក់អំពីការបញ្ជាក់ជាក់លាក់នៃដែនបញ្ហាមួយដោយប្រើការដំណិញ្ញាតដឹកនាំចំណេះដឹងមួយ។ Ontology សាមញ្ញបំផុតអាចជាសំណុំតំណក់នៃវត្ថុក្នុងដែនបញ្ហា ប៉ុន្តែ ontology ស្មុគស្មាញជាងនេះនឹងរួមបញ្ចូលនូវច្បាប់ដែលអាចប្រើសម្រាប់ប្រមូលហេតុ។ + +នៅក្នុង semantic web ការចំណាំទាំងអស់គឺផ្អែកលើ triplets។ វត្ថុ និង ទំនាក់ទំនងនីមួយៗត្រូវបានកំណត់ដោយ URI ឯកត្ត។ ឧទាហរណ៍ ប្រសិនបើយើងចង់សំដែងពីការពិតថា AI Curriculum នេះត្រូវបានបង្កើតឡើងដោយ Dmitry Soshnikov នៅថ្ងៃទី 1 ខែមករា ឆ្នាំ 2022 – នេះគឺជាកំណត់ត្រា triplets ដែលយើងអាចប្រើបាន៖ + + + +``` +http://github.com/microsoft/ai-for-beginners http://www.example.com/terms/creation-date “Jan 1, 2022” +http://github.com/microsoft/ai-for-beginners http://purl.org/dc/elements/1.1/creator http://soshnikov.com +``` + +> ✅ នៅទីនេះ `http://www.example.com/terms/creation-date` និង `http://purl.org/dc/elements/1.1/creator` គឺជាអាសយដ្ឋាន URI ដែលល្បីនិងទទួលបានការទទួលស្គាល់យ៉ាងទូលំទូលាយ សម្រាប់បង្ហាញមនោសញ្ចេតនារបស់ *creator* និង *creation date*។ + +នៅក្នុងករណីស្មុគស្មាញជាងនេះ ប្រសិនបើយើងចង់កំណត់បញ្ជីអ្នកបង្កើត អាចប្រើរចនាសម្ព័ន្ធទិន្នន័យមួយចំនួនដែលបានកំណត់ក្នុង RDF។ + + + +> សៀវភៅគំនូរខាងលើ កំណត់ដោយ [Dmitry Soshnikov](http://soshnikov.com) + +ការរីកចម្រើននៃការសាងសង់ Semantic Web ត្រូវបានយឺតជាងមុនដោយសារជោគជ័យនៃម៉ាស៊ីនស្វែងរក និង វិធីសាស្រ្តដំណើរការភាសាធម្មជាតិ ដែលអនុញ្ញាតឲ្យដកយកទិន្នន័យដែលមានរចនាសម្ព័ន្ធពីអត្ថបទជាដំណើរ។ ទោះយ៉ាងណា នៅក្នុងតំបន់ជាក់លាក់មួយចំនួន មានការខំប្រឹងយ៉ាងខ្លាំងនៅតែមានដើម្បីថែរក្សា ontology និងមូលដ្ឋានចំណេះដឹង។ មានគម្រោងខ្លះគួរឲ្យចាប់អារម្មណ៍៖ + +* [WikiData](https://wikidata.org/) ជាសំណុំមូលដ្ឋានចំណេះដឹងអាចអានដោយម៉ាស៊ីនដែលភ្ជាប់ជាមួយ Wikipedia។ ព័ត៌មានភាគច្រើនត្រូវបានដកចេញពី Wikipedia *InfoBoxes* ដែលជាគ្រឿងចម្បងកំណត់រចនាសម្ព័ន្ធនៅក្នុងទំព័រ Wikipedia។ អ្នកអាច [query](https://query.wikidata.org/) wikidata ដោយប្រើ SPARQL ដែលជាភាសាស្វែងរកពិសេសមួយសម្រាប់ Semantic Web។ នេះគឺជាគំរូស្វែងរកដែលបង្ហាញពីពណ៌ភ្នែកពេញនិយមបំផុតនៅក្នុងមនុស្ស៖ + +```sparql +#defaultView:BubbleChart +SELECT ?eyeColorLabel (COUNT(?human) AS ?count) +WHERE +{ + ?human wdt:P31 wd:Q5. # human instance-of homo sapiens + ?human wdt:P1340 ?eyeColor. # human eye-color ?eyeColor + SERVICE wikibase:label { bd:serviceParam wikibase:language "en". } +} +GROUP BY ?eyeColorLabel +``` + +* [DBpedia](https://www.dbpedia.org/) គឺជាការខិតខំផ្សេងទៀតដែលស្រដៀងនឹង WikiData។ + +> ✅ ប្រសិនបើអ្នកចង់សាកល្បងបង្កើត ontology របស់ខ្លួនឯង ឬបើក ontology ដែលមានស្រាប់ មានកម្មវិធីចងក្រង ontology មួយដែលអស្ចារ្យហៅថា [Protégé](https://protege.stanford.edu/)។ ទាញយកវា ឬប្រើវាតាមអនឡាញបាន។ + + + +*កម្មវិធីចងក្រង Web Protégé បើកជាមួយ ontology របស់ក្រុមគ្រួសារ Romanov។ រូបថតដោយ Dmitry Soshnikov* + +## ✍️ លំហាត់៖ Ontology គ្រួសារ + + +មើល [FamilyOntology.ipynb](https://github.com/Ezana135/AI-For-Beginners/blob/main/lessons/2-Symbolic/FamilyOntology.ipynb) សម្រាប់ឧទាហរណ៍នៃការប្រើប្រាស់បច្ចេកវិទ្យា Semantic Web ដើម្បីសន្មតលទ្ធផលអំពីទំនាក់ទំនងក្នុងគ្រួសារ។ យើងនឹងយកដើមឈើគ្រួសារដែលផ្តល់ដោយទ្រង់ទ្រាយ GEDCOM សម្បូរបែប និង ontology នៃទំនាក់ទំនងក្រុមគ្រួសារ ហើយបង្កើតក្រាបនៃទំនាក់ទំនងគ្រួសារទាំងអស់សម្រាប់ជនរើសជាមនុស្សខ្លះ។ + +## Microsoft Concept Graph + +នៅភាគច្រើនករណី ontology ត្រូវបានបង្កើតយ៉ាងប្រុងប្រយ័ត្នដោយដៃ។ ទោះយ៉ាងណា វាក៏អាចធ្វើបានដែរ ដើម្បី **ស្រាវជ្រាវយក** ontology ពីទិន្នន័យដែលមិនមានរចនាសម្ព័ន្ធ ដូចជាពីអត្ថបទភាសាធម្មជាតិ។ + +ការសាកល្បងដូចនេះត្រូវបានអនុវត្តដោយ Microsoft Research ហើយបង្កើតជាលទ្ធផលជា [Microsoft Concept Graph](https://blogs.microsoft.com/ai/microsoft-researchers-release-graph-that-helps-machines-conceptualize/?WT.mc_id=academic-77998-cacaste)។ + +វាជាការប្រមូលវត្ថុយ៉ាងធំដែលបានក្រុមជាគ្នាតាមរយៈទំនាក់ទំនង `is-a` inheritance។ វាអនុញ្ញាតឲ្យឆ្លើយសំណួរដូចជា "Microsoft ជាអ្វី?" – ពីលទ្ធផលរើសបាន "ក្រុមហ៊ុនមានស(Collections probability 0.87, និងម៉ាកទំនិញមានស(Collections probability 0.75)"។ + +Graph នេះអាចប្រើទាំងជា REST API ឬជាឯកសារសរសេរមួយធំបញ្ជីគូវត្ថុទាំងអស់។ + +## ✍️ លំហាត់៖ Concept Graph + +សាកល្បង [MSConceptGraph.ipynb](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/2-Symbolic/MSConceptGraph.ipynb) ដើម្បីមើលរបៀបដែលយើងអាចប្រើ Microsoft Concept Graph ដាក់ពាណិជ្ជកម្មព័ត៌មានព័ត៌មានជាចំណាត់ថ្នាក់ជាច្រើន។ + +## សេចក្តីសន្និដ្ឋាន + +សព្វថ្ងៃ AI ត្រូវបានគេចាត់ទុកជាស្មើរនឹង *Machine Learning* ឬ *Neural Networks*។ ប៉ុន្តែមនុស្សម្នាក់ក៏បង្ហាញពីការសន្មតច្បាស់លាស់ ដែលគឺជារឿងមួយដែលបច្ចុប្បន្នវ៉េលាពេលនេះ neural networks មិនអាចដោះស្រាយបាន។ នៅក្នុងគម្រោងពិភពលោកពិត ការសន្មតច្បាស់លាស់ត្រូវបានប្រើនៅសម្រាប់អនុវត្តភារកិច្ចដែលត្រូវការពន្យល់ ឬអាចកែប្រែឥរិយាបថរបស់ប្រព័ន្ធក្នុងវិធីគ្រប់គ្រងបាន។ + +## 🚀 ការប្រលែង + +នៅក្នុងកំណត់ត្រា Family Ontology តភ្ជាប់ជាមួយមេរៀននេះ មានឱកាសសាកល្បងជាមួយទំនាក់ទំនងគ្រួសារផ្សេងៗទៀត។ ព្យាយាមស្វែងរកការតភ្ជាប់ថ្មីរវាងមនុស្សនៅក្នុងដើមឈើគ្រួសារ។ + +## [Resident-lecture quiz](https://ff-quizzes.netlify.app/en/ai/quiz/4) + +## ការត្រួតពិនិត្យ និងអនុវត្តដោយខ្លួនឯង + +ស្រាវជ្រាវតាមអ៊ីនធឺណិត ដើម្បីរកមើលដែនកំណត់ដែលមនុស្សបានព្យាយាមវាស់វែងនិងកំណត់ចំណេះដឹង។ មើលទៅ Bloom’s Taxonomy និងត្រឡប់ក្រោយទៅក្នុងប្រវត្តិសាស្ត្រដើម្បីរៀនពីរបៀបមនុស្សព្យាយាមយល់អំពីពិភពលោករបស់ពួកគេ។ ស្រាវជ្រាវកិច្ចការរបស់ Linnaeus ក្នុងការបង្កើត taxonomie សត្វស្មៅ និងព្យួរការបង្កើតរបៀបដែល Dmitri Mendeleev បានបង្កើតវិធីសាស្រ្តសម្រាប់ធាតុគីមីអាចពិពណ៌នានិងចាក់ជាក្រុម។ តើអ្នកអាចរកឃើញឧទាហរណ៍ចំណុចគួរឱកាសផ្សេងទៀតទេ? + +**ការបង្រៀន**: [បង្កើត Ontology](assignment.md) + +--- + + +**ការបដិសេធ**: +ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ក្នុងពេលដែលយើងខំប្រឹងប្រែងដើម្បីភាពត្រឹមត្រូវ សូមយល់ព្រមថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុស ឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមនៅក្នុងភាសាគេហដ្ឋានរបស់វាត្រូវបានអនុគ្រោះថាជាមូលដ្ឋានដ៏សម្បទា។ សម្រាប់ព័ត៌មានដែលមានសារៈសំខាន់ សូមផ្ដល់អាទិភាពការបកប្រែដោយអ្នកជំនាញមនុស្សវិជ្ជាជីវៈ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកស្រាយខុសពីការប្រើប្រាស់បកប្រែនេះទេ។ + \ No newline at end of file diff --git a/translations/km/lessons/2-Symbolic/assignment.md b/translations/km/lessons/2-Symbolic/assignment.md new file mode 100644 index 00000000..a07abdc1 --- /dev/null +++ b/translations/km/lessons/2-Symbolic/assignment.md @@ -0,0 +1,10 @@ +# សាងសង់អង់តូឡូജി + +ការសាងសង់មូលដ្ឋានចំណេះដឹងគឺពាក់ព័ន្ធទៅនឹងការបែងចែកម៉ូដែលដែលតំណាងឱ្យកត្តាអំពីប្រធានបទមួយ។ ជ្រើសរើសប្រធានបទមួយ - ដូចជាមនុស្សម្នាក់ ទីកន្លែងមួយ ឬរបស់មួយ - ហើយបង្កើតម៉ូដែលនៃប្រធានបទនោះ។ ប្រើបច្ចេកទេសមួយចំនួន និងយុទ្ធសាស្ត្រសាងសង់ម៉ូដែលដែលបានពិពណ៌នាក្រោមមេរៀននេះ។ ឧទាហរណ៍ គឺការបង្កើតអង់តូឡូជីនៃបន្ទប់រស់នៅមានសម្ភារៈផ្ទះ ម៉ូលចង្កៀង និងផ្សេងទៀត។ តើបន្ទប់រស់នៅខុសពីផ្ទះបាយយ៉ាងដូចម្តេច? បន្ទប់ទឹក? តើអ្នកដឹងដូចម្តេចថាវាជាបន្ទប់រស់នៅ មិនមែនបន្ទប់បរិច្ឆេទ? ប្រើ [Protégé](https://protege.stanford.edu/) ដើម្បីសាងសង់អង់តូឡូជីរបស់អ្នក។ + +--- + + +**ការព្រមាន**: +ឯកសារនេះត្រូវបានបកប្រែដោយការបម្រើការបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ពេលខ្ញុំខិតខំព្រមានភាពត្រឹមត្រូវ សូមជ្រាបថាការបកប្រែដែលធ្វើដោយប្រព័ន្ធស្វ័យប្រវត្តិអាចមានកំហុស ឬការមិនត្រឹមត្រូវ។ ឯកសារដើមនៅក្នុងភាសាគោលគួរត្រូវបានគេចាត់ទុកថាជាផ្លូវការជាមួយប្រភពត្រឹមត្រូវ។ សម្រាប់ព័ត៌មានសំខាន់ៗ និយោជន៍បកប្រែដោយមនុស្សជំនាញគឺជាជម្រើសល្អបំផុត។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកប្រែខុសដែលកើតមានពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។ + \ No newline at end of file diff --git a/translations/km/lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb b/translations/km/lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb new file mode 100644 index 00000000..0e6d972e --- /dev/null +++ b/translations/km/lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb @@ -0,0 +1,1213 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "collapsed": true, + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Perceptron\n", + "\n", + "> សៀវភៅកំណត់ហេតុនេះគឺជាផ្នែកមួយនៃ [AI សម្រាប់អ្នកដំបូងរៀន](http://github.com/microsoft/ai-for-beginners)។ សូមចូលទៅកាន់ទំព័រហាងរក្សាទុកសម្រាប់ឯកសាររៀនទាំងមូល។\n", + "\n", + "ដូចដែលយើងបានពិភាក្សា ហៅថា perceptron អនុញ្ញាតឱ្យអ្នកដោះស្រាយ **បញ្ហាការបែងចែកប្រភេទពីរជាន់**, គឺដើម្បីចាត់ថ្នាក់ឧទាហរណ៍បញ្ចូលចូលទៅក្នុងពីរប្រភេទ - យើងអាចហៅថា **វិជ្ជមាន** និង **អវិជ្ជមាន**។\n", + "\n", + "ជាដំបូង តោះនាំចូលបណ្ណាល័យដែលតម្រូវ។\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import pylab\n", + "from matplotlib import gridspec\n", + "from sklearn.datasets import make_classification\n", + "import numpy as np\n", + "from ipywidgets import interact, interactive, fixed\n", + "import ipywidgets as widgets\n", + "import pickle\n", + "import os\n", + "import gzip\n", + "\n", + "# pick the seed for reproducability - change it to explore the effects of random variations\n", + "np.random.seed(1)\n", + "import random" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## ប្រធានបទលេង\n", + "\n", + "ដើម្បីចាប់ផ្តើម យើងអាចចាប់ផ្តើមដោយប្រធានបទលេងមួយ ដែលមានលក្ខណៈបញ្ចូលពីរ។ ឧទាហរណ៍ ក្នុងវិស័យវេជ្ជសាស្ត្រ យើងអាចចង់ចែងថាតើសរីរាង្គកុមារមានប្រភេទ benign ឬ malignant នាពេលដែលគេពាក់ព័ន្ធនឹងទំហំ និងអាយុរបស់វា។\n", + "\n", + "យើងនឹងបង្កើតឧទាហរណ៍នៃឈានដល់ចំណាត់ថ្នាក់ដោយចៃដន្យដោយប្រើមុខងារ `make_classification` ពីបណ្ណាល័យ SciKit Learn ៖\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Features:\n", + " [[-1.7441838 -1.3952037 ]\n", + " [ 2.5921783 -0.08124504]\n", + " [ 0.9218062 0.91789985]\n", + " [-0.8437018 -0.18738253]]\n", + "Labels:\n", + " [-1 -1 1 -1]\n" + ] + } + ], + "source": [ + "n = 50\n", + "X, Y = make_classification(n_samples = n, n_features=2,\n", + " n_redundant=0, n_informative=2, flip_y=0)\n", + "Y = Y*2-1 # convert initial 0/1 values into -1/1\n", + "X = X.astype(np.float32); Y = Y.astype(np.int32) # features - float, label - int\n", + "\n", + "# Split the dataset into training and test\n", + "train_x, test_x = np.split(X, [ n*8//10])\n", + "train_labels, test_labels = np.split(Y, [n*8//10])\n", + "print(\"Features:\\n\",train_x[0:4])\n", + "print(\"Labels:\\n\",train_labels[0:4])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "តោះមកគូរជាមួយនឹងសំណុំទិន្នន័យផង:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + ":11: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n", + " fig.show()\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "def plot_dataset(suptitle, features, labels):\n", + " # prepare the plot\n", + " fig, ax = pylab.subplots(1, 1)\n", + " #pylab.subplots_adjust(bottom=0.2, wspace=0.4)\n", + " fig.suptitle(suptitle, fontsize = 16)\n", + " ax.set_xlabel('$x_i[0]$ -- (feature 1)')\n", + " ax.set_ylabel('$x_i[1]$ -- (feature 2)')\n", + "\n", + " colors = ['r' if l>0 else 'b' for l in labels]\n", + " ax.scatter(features[:, 0], features[:, 1], marker='o', c=colors, s=100, alpha = 0.5)\n", + " fig.show()\n", + "\n", + "plot_dataset('Training data', train_x, train_labels)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Perceptron\n", + "\n", + "ដោយសារតែ perceptron គឺជាឧបករណ៍ចម្រាញ់ពីរភាគរយ សម្រាប់វ៉ិចទ័របញ្ចូល $x$ មួយៗ ផលចេញនៃ perceptron របស់យើងនឹងត្រូវជា +1 ឬ -1 ដោយផ្អែកលើថ្នាក់។ ផលចេញនឹងត្រូវគណនាដោយប្រើរូបធរណីមួយ\n", + "\n", + "$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n", + "\n", + "ដែល $\\mathbf{w}$ គឺជាវ៉ិចទ័រទំងន់, $f$ គឺជាអនុគមន៍បញ្ចូនជំហាន:\n", + "$$\n", + "f(x) = \\begin{cases}\n", + " +1 & x \\geq 0 \\\\\n", + " -1 & x < 0\n", + " \\end{cases} \\\\\n", + "$$\n", + "\n", + "យ៉ាងណាក៏ដោយ គំរូរាបប៉ុន្មានមួយគួរត្រូវមានរង្វាស់បន្ថែមផង ដូច្នេះយើងគួរតែគណនា $y$ ជា $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$។ ដើម្បីធ្វើឱ្យគំរូរបស់យើងសាមញ្ញ យើងអាចកំចាត់គន្លងរង្វាស់បន្ថែមនេះដោយបន្ថែមវិមាត្រតែមួយទៀតទៅលើលក្ខណៈបញ្ចូលរបស់យើង ដែលតែងតែស្មើនឹង 1:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 0.92180622 0.91789985 1. ]\n", + " [-1.06435513 1.49764717 1. ]\n", + " [ 0.32839951 2.25677919 1. ]]\n" + ] + } + ], + "source": [ + "pos_examples = np.array([ [t[0], t[1], 1] for i,t in enumerate(train_x) \n", + " if train_labels[i]>0])\n", + "neg_examples = np.array([ [t[0], t[1], 1] for i,t in enumerate(train_x) \n", + " if train_labels[i]<0])\n", + "print(pos_examples[0:3])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## 알고리즘 교육\n", + "\n", + "퍼셉트론을 학습시키기 위해서는 오류를 최소화하는 가중치 $\\mathbf{w}$를 찾아야 합니다. 오류는 **퍼셉트론 기준**을 사용하여 정의됩니다:\n", + "\n", + "$$E(\\mathbf{w}) = -\\sum_{n \\in \\mathcal{M}}\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}_{n}t_{n}$$\n", + "\n", + " * $t_{n} \\in \\{-1, +1\\}$는 각각 음수 및 양수 학습 샘플에 해당합니다\n", + " * $\\mathcal{M}$ - 잘못 분류된 예제 집합입니다\n", + " \n", + "우리는 **경사 하강법** 과정을 사용할 것입니다. 초기 임의 가중치 $\\mathbf{w}^{(0)}$에서 시작하여 $E$의 기울기를 이용해 학습 각 단계에서 가중치를 조정합니다:\n", + "\n", + "$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} - \\eta \\nabla E(\\mathbf{w}) = \\mathbf{w}^{\\tau} + \\eta\\sum_{n \\in \\mathcal{M}}\\mathbf{x}_{n} t_{n}$$\n", + "\n", + "여기서 $\\eta$는 **학습률**이고, $\\tau\\in\\mathbb{N}$는 반복 횟수입니다.\n", + "\n", + "이 알고리즘을 Python에서 정의해 보겠습니다:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [], + "source": [ + "def train(positive_examples, negative_examples, num_iterations = 100, learning_rate = 0.01):\n", + " num_dims = positive_examples.shape[1]\n", + " \n", + " # Initialize weights. \n", + " # We initialize with 0 for simplicity, but random initialization is also a good idea\n", + " weights = np.zeros((num_dims,1)) \n", + " \n", + " pos_count = positive_examples.shape[0]\n", + " neg_count = negative_examples.shape[0]\n", + " \n", + " report_frequency = 10\n", + " \n", + " for i in range(num_iterations):\n", + " # Pick one positive and one negative example\n", + " pos = random.choice(positive_examples)\n", + " neg = random.choice(negative_examples)\n", + "\n", + " z = np.dot(pos, weights) \n", + " if z < 0: # positive example was classified as negative\n", + " weights = weights + learning_rate * pos.reshape(weights.shape)\n", + "\n", + " z = np.dot(neg, weights)\n", + " if z >= 0: # negative example was classified as positive\n", + " weights = weights - learning_rate * neg.reshape(weights.shape)\n", + " \n", + " # Periodically, print out the current accuracy on all examples \n", + " if i % report_frequency == 0: \n", + " pos_out = np.dot(positive_examples, weights)\n", + " neg_out = np.dot(negative_examples, weights) \n", + " pos_correct = (pos_out >= 0).sum() / float(pos_count)\n", + " neg_correct = (neg_out < 0).sum() / float(neg_count)\n", + " print(\"Iteration={}, pos correct={}, neg correct={}\".format(i,pos_correct,neg_correct))\n", + "\n", + " return weights" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**កំណត់ចិត្តអំពី អត្រាការសិក្សា**: ប៉ារ៉ាម៉ែត្ររបស់ `learning_rate` (លំនាំដើម `0.01`) គ្រប់គ្រងពីចំនួនដែលយើងកែប្រែកំលាំងខ្សែព្យួរក្នុងរៀងរាល់ជំហានបង្រៀន។ នេះអនុវត្តន៍កម្រិតធ្លាក់ទន្ទឹមនៃមូលធាតុធ្លាក់ក្រោមសមីការ៖\n", + "\n", + "$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} + \\eta \\mathbf{x}_{n} t_{n}$$\n", + "\n", + "- អត្រាការសិក្សាធំជាង (ឧ. `1.0`) ធ្វើឱ្យ perceptron រៀនលឿនជាង ប៉ុន្តែអាចឆ្លងកាត់ដល់ដំណោះស្រាយល្អបំផុត\n", + "- អត្រាការសិក្សាតិចជាង (ឧ. `0.001`) រៀនយឺតជាង ប៉ុន្តែអាចបញ្ចប់នូវការបញ្ចប់ដោយច្បាស់ជាង\n", + "- អ្នកអាចសាកល្បងដោយហៅ៖ `train(pos_examples, neg_examples, learning_rate=0.1)`\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ឥឡូវនេះចាំបង្រៀនលើសំណុំទិន្នន័យរបស់យើង៖\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Iteration=0, pos correct=0.2631578947368421, neg correct=0.6190476190476191\n", + "Iteration=10, pos correct=0.8947368421052632, neg correct=0.8571428571428571\n", + "Iteration=20, pos correct=0.8421052631578947, neg correct=1.0\n", + "Iteration=30, pos correct=0.8947368421052632, neg correct=0.9523809523809523\n", + "Iteration=40, pos correct=0.8947368421052632, neg correct=0.9523809523809523\n", + "Iteration=50, pos correct=0.9473684210526315, neg correct=0.9047619047619048\n", + "Iteration=60, pos correct=0.8947368421052632, neg correct=0.9523809523809523\n", + "Iteration=70, pos correct=0.8947368421052632, neg correct=0.9047619047619048\n", + "Iteration=80, pos correct=0.8947368421052632, neg correct=0.6190476190476191\n", + "Iteration=90, pos correct=0.8421052631578947, neg correct=1.0\n", + "[[-0.66042328 4.90850882 -1. ]]\n" + ] + } + ], + "source": [ + "wts = train(pos_examples,neg_examples)\n", + "print(wts.transpose())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ដូចដែលអ្នកអាចមើលឃើញបាន ការត្រឹមត្រូវដំបូងមានប្រហែល ៥០% ប៉ុន្តែវាដំណើរការកើនឡើងយ៉ាងឆាប់រហ័សទៅកាន់តម្លៃខ្ពស់ជិត ៩០%។\n", + "\n", + "ចង់បង្ហាញរូបភាពថាតំបន់ថ្នាក់ត្រូវបានបំបែកយ៉ាងដូចម្តេច។ អំពើចាត់ថ្នាក់របស់យើងមានរាងដូចជា $\\mathbf{w}^Tx$ ដែលវាមានតម្លៃធំជាង ០ សម្រាប់ថ្នាក់មួយ ហើយតិចជាង ០ សម្រាប់ថ្នាក់មួយផ្សេងទៀត។ ដូច្នេះ បន្ទាត់បំបែកថ្នាក់ត្រូវបានកំណត់ដោយ $\\mathbf{w}^Tx = 0$។ ព្រោះយើងមានវិមាត្រតែពីរ $x_0$ និង $x_1$ សមីការសម្រាប់បន្ទាត់គឺ $w_0x_0+w_1x_1+w_2 = 0$ (ចាំថាយើងបានកំណត់វិមាត្របន្ថែមមួយយ៉ាងច្បាស់ $x_2=1$)។ ចង់គូរបន្ទាត់នេះ៖\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [], + "source": [ + "def plot_boundary(positive_examples, negative_examples, weights):\n", + " if np.isclose(weights[1], 0):\n", + " if np.isclose(weights[0], 0):\n", + " x = y = np.array([-6, 6], dtype = 'float32')\n", + " else:\n", + " y = np.array([-6, 6], dtype='float32')\n", + " x = -(weights[1] * y + weights[2])/weights[0]\n", + " else:\n", + " x = np.array([-6, 6], dtype='float32')\n", + " y = -(weights[0] * x + weights[2])/weights[1]\n", + "\n", + " pylab.xlim(-6, 6)\n", + " pylab.ylim(-6, 6) \n", + " pylab.plot(positive_examples[:,0], positive_examples[:,1], 'bo')\n", + " pylab.plot(negative_examples[:,0], negative_examples[:,1], 'ro')\n", + " pylab.plot(x, y, 'g', linewidth=2.0)\n", + " pylab.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_boundary(pos_examples,neg_examples,wts)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## សាកល្បងជាមួយអត្រាការរៀន\n", + "\n", + "ឥឡូវនេះយើងចង់ស្វែងយល់ថាតើអត្រាការរៀនផ្សេងៗគ្នាប៉ះពាល់ដល់ដំណើរការបណ្តុះបណ្តាលយ៉ាងដូចម្តេច។ អត្រាការរៀនគ្រប់គ្រងទំហំនូវជំហានក្នុងការធ្លាក់ក្រាម - ជាប៉ារ៉ាម៉ែត្រសំខាន់មួយដែលប៉ះពាល់ទាំងល្បឿនការបញ្ចូលវិញ និងស្ថិរភាព។\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Compare different learning rates\n", + "learning_rates = [0.001, 0.01, 0.1, 1.0]\n", + "fig, axes = pylab.subplots(2, 2, figsize=(12, 10))\n", + "fig.suptitle('Effect of Different Learning Rates', fontsize=16)\n", + "\n", + "for idx, lr in enumerate(learning_rates):\n", + " ax = axes[idx // 2, idx % 2]\n", + " \n", + " # Train with this learning rate\n", + " weights_lr = train(pos_examples, neg_examples, num_iterations=100, learning_rate=lr)\n", + " \n", + " # Plot decision boundary\n", + " if np.isclose(weights_lr[1], 0):\n", + " if np.isclose(weights_lr[0], 0):\n", + " x = y = np.array([-6, 6], dtype='float32')\n", + " else:\n", + " y = np.array([-6, 6], dtype='float32')\n", + " x = -(weights_lr[1] * y + weights_lr[2])/weights_lr[0]\n", + " else:\n", + " x = np.array([-6, 6], dtype='float32')\n", + " y = -(weights_lr[0] * x + weights_lr[2])/weights_lr[1]\n", + " \n", + " ax.set_xlim(-6, 6)\n", + " ax.set_ylim(-6, 6)\n", + " ax.plot(pos_examples[:, 0], pos_examples[:, 1], 'bo', label='Positive', alpha=0.7)\n", + " ax.plot(neg_examples[:, 0], neg_examples[:, 1], 'ro', label='Negative', alpha=0.7)\n", + " ax.plot(x, y, 'g-', linewidth=2)\n", + " ax.set_title(f'Learning Rate = {lr}')\n", + " ax.set_xlabel('Feature 1')\n", + " ax.set_ylabel('Feature 2')\n", + " ax.legend()\n", + " ax.grid(True, alpha=0.3)\n", + "\n", + "pylab.tight_layout()\n", + "pylab.show()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### សាកល្បងអត្រាសិក្សាផ្ទាល់\n", + "\n", + "ប្រើរបារលីងខាងក្រោមដើម្បីសាកល្បងអត្រាសិក្សាផ្សេងៗ និងមើលថាវាអះអាងដែនកំណត់នៃការសម្រេចចិត្តយ៉ាងដូចម្តេច៖\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def train_and_plot_with_lr(learning_rate=0.01):\n", + " \"\"\"Train perceptron with specified learning rate and plot results\"\"\"\n", + " weights_lr = train(pos_examples, neg_examples, num_iterations=100, learning_rate=learning_rate)\n", + " \n", + " fig, (ax1, ax2) = pylab.subplots(1, 2, figsize=(14, 5))\n", + " \n", + " # Plot 1: Decision boundary\n", + " if np.isclose(weights_lr[1], 0):\n", + " if np.isclose(weights_lr[0], 0):\n", + " x = y = np.array([-6, 6], dtype='float32')\n", + " else:\n", + " y = np.array([-6, 6], dtype='float32')\n", + " x = -(weights_lr[1] * y + weights_lr[2])/weights_lr[0]\n", + " else:\n", + " x = np.array([-6, 6], dtype='float32')\n", + " y = -(weights_lr[0] * x + weights_lr[2])/weights_lr[1]\n", + " \n", + " ax1.set_xlim(-6, 6)\n", + " ax1.set_ylim(-6, 6)\n", + " ax1.plot(pos_examples[:, 0], pos_examples[:, 1], 'bo', label='Positive', s=100, alpha=0.6)\n", + " ax1.plot(neg_examples[:, 0], neg_examples[:, 1], 'ro', label='Negative', s=100, alpha=0.6)\n", + " ax1.plot(x, y, 'g-', linewidth=3, label='Decision Boundary')\n", + " ax1.set_title(f'Decision Boundary (lr={learning_rate})', fontsize=14)\n", + " ax1.set_xlabel('Feature 1')\n", + " ax1.set_ylabel('Feature 2')\n", + " ax1.legend()\n", + " ax1.grid(True, alpha=0.3)\n", + " \n", + " # Plot 2: Weight values\n", + " ax2.bar(['w0', 'w1', 'bias'], weights_lr.flatten(), color=['blue', 'green', 'red'], alpha=0.7)\n", + " ax2.set_title('Final Weight Values', fontsize=14)\n", + " ax2.set_ylabel('Weight Value')\n", + " ax2.grid(True, alpha=0.3, axis='y')\n", + " ax2.axhline(y=0, color='black', linestyle='-', linewidth=0.5)\n", + " \n", + " pylab.tight_layout()\n", + " pylab.show()\n", + " \n", + " print(f\"Final weights: {weights_lr.flatten()}\")\n", + "\n", + "# Create interactive widget\n", + "interact(train_and_plot_with_lr, \n", + " learning_rate=widgets.FloatSlider(value=0.01, min=0.001, max=1.0, step=0.001, \n", + " description='Learning Rate:', continuous_update=False))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## វាយតម្លៃលើទិន្នន័យសាកល្បង\n", + "\n", + "នៅដើម នោះយើងបានដកចេញទិន្នន័យមួយចំនួនទៅកាន់ទិន្នន័យសាកល្បង។ មកមើលថាតើអ្នកចាត់ថ្នាក់របស់យើងមានភាពត្រឹមត្រូវប៉ុនណាលើទិន្នន័យសាកល្បងនេះ។ ដើម្បីធ្វើការនេះ យើងក៏ពង្រីកទិន្នន័យសាកល្បងជាមួយវិមាត្របន្ថែម មធ្យោបាយគុណដោយមាត្រដ្ឋានទំងន់ ហើយធ្វើការត្រួតពិនិត្យថាមูลค่ាដែលទទួលបានមានសញ្ញាដូចគ្នានឹងស្លាក (+1 ឬ -1) ឬអត់។ បន្ទាប់មកយើងបូកតម្លៃ boolean ទាំងអស់ និងបែងចែកដោយប្រវែងនៃគំរូសាកល្បង ដើម្បីទទួលបានភាពត្រឹមត្រូវ៖\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "1.0" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def accuracy(weights, test_x, test_labels):\n", + " res = np.dot(np.c_[test_x,np.ones(len(test_x))],weights)\n", + " return (res.reshape(test_labels.shape)*test_labels>=0).sum()/float(len(test_labels))\n", + "\n", + "accuracy(wts, test_x, test_labels)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## ការមើលការបណ្តុះបណ្តាល\n", + "\n", + "យើងបានឃើញពីមុនថាអត្រាត្រឹមត្រូវបានបន្ថយខណៈពេលបណ្តុះបណ្តាល។ វានឹងល្អបើអាចមើលឃើញរបារចុះបំបែកធ្វើដំណើរដូចម្ដេចខណៈពេលបណ្តុះបណ្តាល។ កូដខាងក្រោមនឹងបង្ហាញរូបភាពគ្រប់យ៉ាងលើក្រាបមួយ ហើយអ្នកគួរតែអាចចល័តស្លាយទៅកាន់ពេលវល់ដើម្បី \"ធ្វើដំណើរតាមពេល\" តាមដំណើរការបណ្តុះបណ្តាល។\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [], + "source": [ + "def train_graph(positive_examples, negative_examples, num_iterations = 100, learning_rate = 0.01):\n", + " num_dims = positive_examples.shape[1]\n", + " weights = np.zeros((num_dims,1)) # initialize weights\n", + " \n", + " pos_count = positive_examples.shape[0]\n", + " neg_count = negative_examples.shape[0]\n", + " \n", + " report_frequency = 15;\n", + " snapshots = []\n", + " \n", + " for i in range(num_iterations):\n", + " pos = random.choice(positive_examples)\n", + " neg = random.choice(negative_examples)\n", + "\n", + " z = np.dot(pos, weights) \n", + " if z < 0:\n", + " weights = weights + learning_rate * pos.reshape(weights.shape)\n", + "\n", + " z = np.dot(neg, weights)\n", + " if z >= 0:\n", + " weights = weights - learning_rate * neg.reshape(weights.shape)\n", + " \n", + " if i % report_frequency == 0: \n", + " pos_out = np.dot(positive_examples, weights)\n", + " neg_out = np.dot(negative_examples, weights) \n", + " pos_correct = (pos_out >= 0).sum() / float(pos_count)\n", + " neg_correct = (neg_out < 0).sum() / float(neg_count)\n", + " snapshots.append([np.copy(weights).flatten(), (pos_correct+neg_correct)/2.0])\n", + "\n", + " return np.array(snapshots, dtype=object)\n", + "\n", + "snapshots = train_graph(pos_examples,neg_examples)\n", + "\n", + "def plotit(pos_examples,neg_examples,snapshots,step):\n", + " fig = pylab.figure(figsize=(10,4))\n", + " fig.add_subplot(1, 2, 1)\n", + " plot_boundary(pos_examples, neg_examples, snapshots[step][0])\n", + " fig.add_subplot(1, 2, 2)\n", + " pylab.plot(np.arange(len(snapshots[:,1])), snapshots[:,1])\n", + " pylab.ylabel('Accuracy')\n", + " pylab.xlabel('Iteration')\n", + " pylab.plot(step, snapshots[step,1], \"bo\")\n", + " pylab.show()\n", + "def pl1(step): plotit(pos_examples,neg_examples,snapshots,step)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8561af1ae77c421f9ca068fe0bdac566", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "interactive(children=(IntSlider(value=0, description='step', max=6), Output()), _dom_classes=('widget-interact…" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "interact(pl1, step=widgets.IntSlider(value=0, min=0, max=len(snapshots)-1))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## ការរឹតបន្តឹងនៃ Perceptron\n", + "\n", + "ដូចដែលអ្នកបានឃើញខាងលើ Perceptron គឺជា **ម៉ាស៊ីនចាត់ថ្នាក់បន្ទាត់**។ វាអាចបំបែកចន្លោះពីរប្រភេទបានល្អប្រសើរបើសិនវា **អាចបំបែកដោយបន្ទាត់បន្តផ្ទាល់** ដែលមានន័យថាអាចបំបែកដោយបន្ទាត់ត្រង់។ រឺមិនដូច្នោះទេ ដំណើរការបណ្តុះបណ្តាល Perceptron នឹងមិនស្ទាក់ស្ទើរទេ។\n", + "\n", + "ឧទាហរណ៍ដែលច្បាស់ជាងគេនៃបញ្ហាដែលមិនអាចដោះស្រាយបានដោយ Perceptron គឺបញ្ហា​ដែលហៅថា **បញ្ហា XOR**។ យើងចង់ឱ្យ Perceptron របស់យើងរៀនមុខងារ boolean XOR ដែលមានតារាងត្រឹមត្រូវដូចខាងក្រោម៖\n", + "\n", + "| | 0 | 1 |\n", + "|---|---|---|\n", + "| 0 | 0 | 1 | \n", + "| 1 | 1 | 0 |\n", + "\n", + "ចង់សាកល្បងធ្វើវា! យើងនឹងបំពេញគំរូបណ្តុះបណ្តាលវិជ្ជមាននិងអវិជ្ជមានយ៉ាងម៉ាស៊ីនវិភាគហើយបន្ទាប់មកហៅមុខងារបណ្តុះបណ្តាលដែលបានកំណត់ខាងលើ៖\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [], + "source": [ + "pos_examples_xor = np.array([[1,0,1],[0,1,1]])\n", + "neg_examples_xor = np.array([[1,1,1],[0,0,1]])\n", + "\n", + "snapshots_xor = train_graph(pos_examples_xor,neg_examples_xor,1000)\n", + "def pl2(step): plotit(pos_examples_xor,neg_examples_xor,snapshots_xor,step)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8f45bf78e4c8471fbc6eea233dde2bf6", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "interactive(children=(IntSlider(value=0, description='step', max=6), Output()), _dom_classes=('widget-interact…" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "interact(pl2, step=widgets.IntSlider(value=0, min=0, max=len(snapshots)-1))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true, + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "ដូចដែលអ្នកអាចមើលឃើញពីក្រាផខាងលើ ការពិតណាស់មិនដែលលើស75% ទេ ព្រោះវាមិនអាចគូររបារស្រង់ជាប់ត្រូវបានទាំងអស់ក្នុងលក្ខណៈដូច្នេះបានឡើយ។\n", + "\n", + "បញ្ហា XOR គឺជាឧទាហរណ៍បុរាណនៃកំណត់កំណត់នៃ perceptron ហើយវាត្រូវបានបញ្ចេញដោយ Marvin Minsky និង Seymour Papert ក្នុងឆ្នាំ1969 ក្នុងសៀវភៅ [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book))។ ការសង្កេតនេះបានកំណត់ការស្រាវជ្រាវនៅក្នុងដែននៃបណ្តាញប្រសាទរយៈពេលប្រហែល១០ឆ្នាំ ទោះបីៈ - ហើយយើងនឹងមើលទៅក្នុងផ្នែកបន្ទាប់នៃវគ្គសិក្សារបស់យើង - តែ perceptrons ដែលមានជាន់ច្រើនអាចដោះស្រាយបញ្ហាដូចខាងលើបានយ៉ាងល្អ។\n", + "\n", + "## ឧទាហរណ៍ស្មុគស្មាញ - MNIST\n", + "\n", + "មិនថា perceptron មិនអាចដោះស្រាយបញ្ហា XOR បានទេ ប៉ុន្តែវាអាចដោះស្រាយបញ្ហាស្មុគស្មាញជាច្រើនទៀត ដូចជាការទទួលស្គាល់តួអក្សរដៃ។\n", + "\n", + "ឧបករណ៍ទិន្នន័យមួយដែលត្រូវបានប្រើប្រាស់ជាញឹកញាប់នៅពេលរៀនអំពីការសិក្សាម៉ាស៊ីនខ្សែសង្វាក់មានឈ្មោះថា [MNIST](https://en.wikipedia.org/wiki/MNIST_database)។ វាត្រូវបានបង្កើតឡើងដោយ Modified National Institute of Standards and Technology ហើយមានសំណុំទិន្នន័យបណ្ដុះបណ្ដាលមានចំនួន៦០០០០អក្សរដែលបានសរសេរដោយដៃ ប្រមូលផ្តុំពីសិស្សនិងនិយោជកប្រហែល ២៥០នាក់ក្នុងស្ថាប័ន។ ក៏មានសំណុំទិន្នន័យសាកល្បងចំនួន ១០០០០អក្សរដែលបានប្រមូលផ្តុំពីមនុស្សផ្សេងទៀតផងដែរ។\n", + "\n", + "អក្សរទាំងអស់ត្រូវបានតំណាងដោយរូបភាពស៊េរីពណ៌ប្រផេះដោយមានទំហំ ២៨x២៨ ពិក្សែល។\n", + "\n", + "> សំណុំទិន្នន័យ MNIST គឺមានសម្រាប់ការប្រកួតបណ្ដុះបណ្ដាលលើ [Kaggle](https://www.kaggle.com/c/digit-recognizer) ដែលជាទំព័រដែលរៀបចំការប្រកួតនិងប្រកួតប្រជែងការសិក្សាម៉ាស៊ីន។ ពេលអ្នករៀនរបៀបចាត់ថ្នាក់អក្សរ MNIST បាន អ្នកអាចដាក់ដំណោះស្រាយរបស់អ្នកទៅកាន់ Kaggle ដើម្បីមើលពីរបៀបវាត្រូវបាន매기ោសាកល្បងពីអ្នកចូលរួមផ្សេងទៀត។\n", + "\n", + "យើងចាប់ផ្តើមដោយផ្ទុកសំណុំទិន្នន័យ MNIST៖\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [], + "source": [ + "# If you are not running this notebook from a cloned repository, you may need to grab the binary dataset file first\n", + "# !wget https://github.com/microsoft/AI-For-Beginners/raw/main/data/mnist.pkl.gz?raw=true\n", + "# In this case correct the link to the dataset below as well.\n", + "\n", + "with gzip.open('../../../data/mnist.pkl.gz', 'rb') as mnist_pickle:\n", + " MNIST = pickle.load(mnist_pickle, encoding='latin1')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ឥឡូវនេះចូរយើងគូរទិន្នន័យសំណុំ៖\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 0 0 188 255 94 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 191 250 253 93 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "1\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "print(MNIST['Train']['Features'][0][130:180])\n", + "print(MNIST['Train']['Labels'][0])\n", + "features = MNIST['Train']['Features'].astype(np.float32) / 256.0\n", + "labels = MNIST['Train']['Labels']\n", + "fig = pylab.figure(figsize=(10,5))\n", + "for i in range(10):\n", + " ax = fig.add_subplot(1,10,i+1)\n", + " pylab.imshow(features[i].reshape(28,28))\n", + "pylab.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ដោយសារតែ perceptron គឺជាឧបករណ៍ចំណាត់ថ្នាក់ទ្វេមុខយើងនឹងកំណត់បញ្ហារបស់យើងទៅក្នុងការទទួលស្គាល់តែកេខ្សែពីរតែប៉ុណ្ណោះ។ មុខងារខាងក្រោមនឹងបំពេញអារេគំរូវិជ្ជមាននិងអារេគំរូអវិជ្ជមានជាមួយលេខពីរដែលបានផ្ដល់ (ហើយវានៅតែបង្ហាញគំរូនៃលេខទាំងនោះសម្រាប់ភាពច្បាស់)។\n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [], + "source": [ + "def set_mnist_pos_neg(positive_label, negative_label):\n", + " positive_indices = [i for i, j in enumerate(MNIST['Train']['Labels']) \n", + " if j == positive_label]\n", + " negative_indices = [i for i, j in enumerate(MNIST['Train']['Labels']) \n", + " if j == negative_label]\n", + "\n", + " positive_images = MNIST['Train']['Features'][positive_indices]\n", + " negative_images = MNIST['Train']['Features'][negative_indices]\n", + "\n", + " fig = pylab.figure()\n", + " ax = fig.add_subplot(1, 2, 1)\n", + " pylab.imshow(positive_images[0].reshape(28,28), cmap='gray', interpolation='nearest')\n", + " ax.set_xticks([])\n", + " ax.set_yticks([])\n", + " ax = fig.add_subplot(1, 2, 2)\n", + " pylab.imshow(negative_images[0].reshape(28,28), cmap='gray', interpolation='nearest')\n", + " ax.set_xticks([])\n", + " ax.set_yticks([])\n", + " pylab.show()\n", + " \n", + " return positive_images, negative_images" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "យើងនឹងចាប់ផ្តើមដោយព្យាយាមចាត់ថ្នាក់ចម្លើយរវាង 0 និង 1:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pos1,neg1 = set_mnist_pos_neg(1,0)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [], + "source": [ + "def plotit2(snapshots_mn,step):\n", + " fig = pylab.figure(figsize=(10,4))\n", + " ax = fig.add_subplot(1, 2, 1)\n", + " pylab.imshow(snapshots_mn[step][0].reshape(28, 28), interpolation='nearest')\n", + " ax.set_xticks([])\n", + " ax.set_yticks([])\n", + " pylab.colorbar()\n", + " ax = fig.add_subplot(1, 2, 2)\n", + " ax.set_ylim([0,1])\n", + " pylab.plot(np.arange(len(snapshots_mn[:,1])), snapshots_mn[:,1])\n", + " pylab.plot(step, snapshots_mn[step,1], \"bo\")\n", + " pylab.show()\n", + "def pl3(step): plotit2(snapshots_mn,step)\n", + "def pl4(step): plotit2(snapshots_mn2,step) " + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "afbc754ef0d04c95a1af039574b46a6b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "interactive(children=(IntSlider(value=0, description='step', max=66), Output()), _dom_classes=('widget-interac…" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "snapshots_mn = train_graph(pos1,neg1,1000) \n", + "interact(pl3, step=widgets.IntSlider(value=0, min=0, max=len(snapshots_mn) - 1))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "សូមចំណាំថាការត្រឹមត្រូវកើនឡើងដល់ប្រហែល ១០០% បានយ៉ាងលឿន។\n", + "\n", + "សូមផ្លាស់ទីស្លៃឌ័រទៅកន្លែងមួយក្នុងចំណោមចុងបង្អស់នៃការបណ្តុះបណ្តាល ហើយសង្កេតមាត្រដ្ឋានទំងន់ដែលបង្ហាញនៅខាងឆ្វេង។ មាត្រដ្ឋាននេះនឹងអនុញ្ញាតឲ្យអ្នកយល់ពីរបៀបដែល perceptron ប្រារព្ធការងារពិតប្រាកដ។ អ្នកអាចឃើញតម្លៃទំងន់កំពូលនៅកណ្តាល​ខ្នងវាល ដែលផ្គូផ្គងទៅនឹងភីកសែលដែលភាគច្រើនមានសម្រាប់លេខ ១ ហើយតម្លៃអវិជ្ជមានទាបនៅផ្នែកខាងនៃកន្លែង ដែលជាផ្នែកនៃលេខ ០។ ដូច្នេះ ប្រសិនបើលេខដែលបានដាក់ទៅកាន់ perceptron គឺជាលេខ ១ ខណៈផ្នែកកណ្តាលនៃវានឹងត្រូវបានគុណដោយតម្លៃខ្ពស់ បង្កើតលទ្ធផលវិជ្ជមាន។ ផ្ទុយទៅវិញ នៅពេលដែល perceptron មើលឃើញលេខ ០ ភីកសែលសម្រូវនឹងត្រូវបានគុណដោយលេខអវិជ្ជមាន។\n", + "\n", + "> អ្នកអាចចាប់ផ្តើមយល់ថាបើយើងផ្គាប់លេខ ១ មួយចំណុចចេញថ្នាំងផើយ, ដូច្នេះភីកសែលរបស់វាអាចកាន់កន្លែងដែលមានផ្នែកចំនួនបញ្ឈរនៃលេខ ០, យើងអាចទទួលបានលទ្ធផលខុស។ ព្រោះធម្មជាតិនៃទិន្នន័យ MNIST របស់យើង គឺទាំងអស់ត្រូវបានផ្ដោតមុខ និងចងក្រងត្រឹមត្រូវ ហើយ perceptron អាស្រ័យលើរឿងនេះដើម្បីបំបែកអក្សរចេញពីគ្នា។\n", + "\n", + "ឥឡូវនេះសូមសាកល្បងលេខផ្សេងៗ៖\n" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pos2,neg2 = set_mnist_pos_neg(2,5)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "bf6f25d14c3b4d548ac026af97f70e2a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "interactive(children=(IntSlider(value=0, description='step', max=66), Output()), _dom_classes=('widget-interac…" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "snapshots_mn2 = train_graph(pos2,neg2,1000)\n", + "interact(pl4, step=widgets.IntSlider(value=0, min=0, max=len(snapshots_mn2) - 1))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## ពិភាក្សា\n", + "\n", + "ដោយមូលហេតុនៃអ្វីមួយ 2 និង 5 មិនងាយបំបែកបានយ៉ាងងាយស្រួលទេ។ ទោះបីយើងទទួលបានកម្រិតត្រឹមត្រូវខ្ពស់ជាប់លើស 85% ក៏ដោយ យើងអាចមើលឃើញបានច្បាស់ថា perceptron បានបញ្ឈប់ការរៀននៅចំណុចមួយ។\n", + "\n", + "ដើម្បីយល់ថាហេតុអ្វីកើតមានដូចនេះ យើងអាចសាកល្បងប្រើ [Principal Component Analysis](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA)។ វាជាបច្ចេកវិទ្យាសិក្សាម៉ាស៊ីនដែលប្រើសម្រាប់កាត់បន្ថយបរិមាណវិមាត្រនៃសំណុំទិន្នន័យបញ្ចូល ដោយវិធីដែលទទួលបានការបំបែកល្អបំផុតរវាងថ្នាក់។\n", + "\n", + "ក្នុងករណីរបស់យើង រូបភាពបញ្ចូលមាន pixel 784 (លក្ខណៈបញ្ចូល), ហើយយើងចង់ប្រើ PCA ដើម្បីកាត់បន្ថយចំនួនប៉ារ៉ាម៉ែត្រទៅត្រឹមតែ 2 ប៉ុន្មាន ដើម្បីយើងអាចគូសវា​លើបទូតក្រាហ្វ។ ប៉ារ៉ាម៉ែត្រទាំងពីរនេះនឹងជាការរួមបញ្ចូលតាមរយៈបន្ទាត់នៃលក្ខណៈដើម ហើយយើងអាចមើលឃើញដំណើរការនេះជាការបង្វិលលំហာវិមាត្រ 784 ដើមរបស់យើង និងសង្កេតការផលិតិចទៅលំហារវិមាត្រ 2D របស់យើង រហូតដល់យើងទទួលបានទិដ្ឋភាពល្អបំផុតដែលបំបែកថ្នាក់បាន។\n" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "from sklearn.decomposition import PCA\n", + "\n", + "def pca_analysis(positive_label, negative_label):\n", + " positive_images, negative_images = set_mnist_pos_neg(positive_label, negative_label)\n", + " M = np.append(positive_images, negative_images, 0)\n", + "\n", + " mypca = PCA(n_components=2)\n", + " mypca.fit(M)\n", + " \n", + " pos_points = mypca.transform(positive_images[:200])\n", + " neg_points = mypca.transform(negative_images[:200])\n", + "\n", + " pylab.plot(pos_points[:,0], pos_points[:,1], 'bo')\n", + " pylab.plot(neg_points[:,0], neg_points[:,1], 'ro')" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "pca_analysis(1,0)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "scrolled": false, + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "pca_analysis(2,5)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "ដូចដែលអ្នកអាចមើលឃើញ ០ និង ១ អាចបំបែកបានយ៉ាងច្បាស់ជាបន្ទាត់ស្រប។ វាសំដៅថានៅក្នុងកន្លែង ៧៨៤-មิติដើមទិន្នន័យចំណុចដែលផ្គូផ្គងនឹងលេខក៏អាចបំបែកមានបន្ទាត់ផងដែរ។ សម្រាប់ករណី ២ និង ៥ យើងមិនអាចស្វែងរកការបង្ហាញល្អដែលនឹងបំបែកលេខទាំងនេះបានយ៉ាងច្បាស់ទេ ហើយដូច្នេះមានករណីច្រើននៃការផ្ទៀងផ្ទាត់ខុស។\n", + "\n", + "> បន្ទាប់មកនៅវគ្គនេះ យើងនឹងរៀនពីរបៀបបង្កើតកម្មវិធីចាត់ថ្នាក់មិនមែនបន្ទាត់ប្រើប្រាស់បណ្ដាញប្រស្មីស្មារតី និងរបៀបដោះស្រាយបញ្ហាលេខដែលមិនត្រូវបានរៀបចំឲ្យសមរម្យ។ មិនយូរទេយើងនឹងឈានដល់ការត្រឹមត្រូវលើស ៩៩% ក្នុងការចាត់ថ្នាក់លេខ MNIST ខណៈពេលចាត់ថ្នាក់ពួកវាទៅជាក្រុមទី ១០ ផ្សេងៗ។\n", + "\n", + "## អ្វីដែលទទួលបាន\n", + "\n", + " * យើងបានរៀនអំពីសំណង់បណ្ដាញប្រស្មីស្មារតីសាមញ្ញបំផុត - perceptron ជាន់ដើម្បី។\n", + " * យើងបានអនុវត្តន៍ perceptron \"ដោយដៃ\" ប្រើនីតិវិធីបណ្តុះបណ្តាលសាមញ្ញមួយដោយផ្អែកលើចុះស្រមោល gradient descent\n", + " * ទោះបីជាសាមញ្ញ យន្តការចាត់ថ្នាក់ជាន់មួយអាចដោះស្រាយបញ្ហាស្មុគស្មាញនៃការទស្សនលេខដៃបាន។\n", + " * perceptron ជាន់មួយគឺជាអ្នកចាត់ថ្នាក់បន្ទាត់ ដូច្នេះវាបន្ដឲ្យមានសមត្ថភាពចាត់ថ្នាក់ដូចជាការបង្វែរឡូស ជាស្តិក។\n", + " * នៅក្នុងលំហឧទាហរណ៍ perceptron អាចបំបែក ២ថ្នាក់នៃទិន្នន័យចូលដោយប្រើ hyperplane។\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ការទទួលស្គាល់\n", + "\n", + "សៀវភៅកំណត់ត្រានេះគឺជាផ្នែកមួយនៃ [កម្មវិធីសិក្សា AI សម្រាប់អ្នកចាប់ផ្តើម](http://github.com/microsoft/ai-for-beginners) ហើយត្រូវបានរៀបចំដោយ [Dmitry Soshnikov](http://soshnikov.com)។ វាត្រូវបានបង្កើតពីកម្មវិធីសិក្សា Neural Network Workshop នៅ Microsoft Research Cambridge។ កូដ និងសម្ភារៈបង្ហាញខ្លះត្រូវបានយកពីការបង្ហាញដោយ [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) និង [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/) ហើយពីឃ្លាំងទិន្នន័យ [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop)។\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**ការមិនទទួលខុសត្រូវ**៖ \nឯកសារនេះត្រូវបានបកប្រែក្នុងការប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលដែលយើងខិតខំប្រឹងប្រែងដើម្បីបានភាពត្រឹំត្រូវ សូមយល់ថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុស ឬភាពមិនត្រឹមត្រូវខ្លះ។ ឯកសារដើមដែលមានភាសាដើមគួរត្រូវបានចាត់ទុកជាការយោងដើម និងមានសុពលភាពខ្ពស់។ សម្រាប់ព័ត៌មានសំខាន់ៗ សូមយកការបកប្រែដោយអ្នកបកប្រែដែលមានជំនាញជាមនុស្ស។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកប្រែខុសឡើងពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។\n\n" + ] + } + ], + "metadata": { + "celltoolbar": "Slideshow", + "interpreter": { + "hash": "16aeaa504b544176258e5caf576fc030dfd6fff62d0c15825e7863ff13e121ff" + }, + "kernelspec": { + "display_name": "Python 3.8.0 64-bit (conda)", + "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.0" + }, + "livereveal": { + "start_slideshow_at": "selected" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} \ No newline at end of file diff --git a/translations/km/lessons/3-NeuralNetworks/03-Perceptron/README.md b/translations/km/lessons/3-NeuralNetworks/03-Perceptron/README.md new file mode 100644 index 00000000..f189d472 --- /dev/null +++ b/translations/km/lessons/3-NeuralNetworks/03-Perceptron/README.md @@ -0,0 +1,99 @@ +# ការណែនាំអំពីបណ្តាញប្រសាទ: Perceptron + +## [មេរៀនមុនការសំរេចចិត្ត](https://ff-quizzes.netlify.app/en/ai/quiz/5) + +មួយក្នុងចំណោមព្យាយាមដំបូងៗក្នុងការអនុវត្តអ្វីដែលស្រដៀងនឹងបណ្តាញប្រសាទសម័យទំនើប ត្រូវបានធ្វើឡើងដោយ Frank Rosenblatt ពីមន្ទីរសហគ្រាស Cornell Aeronautical Laboratory នៅឆ្នាំ ១៩៥៧។ វាជាការអនុវត្តនៅលើឧបករណ៍ហា៊ដវែរដែលគេហៅថា "Mark-1", ដែលរចនាឡើងដើម្បីស្គាល់រូបរាង Geometry ដំបូងៗ ដូចជាត្រីកោណ, មូលបត់ និងចតុកោណ។ + +| | | +|--------------|-----------| +|Frank Rosenblatt | The Mark 1 Perceptron| + +> រូបភាព [ចេញពី Wikipedia](https://en.wikipedia.org/wiki/Perceptron) + +រូបភាពដែលបញ្ចូលត្រូវបានតំណាងដោយចំណុចរូបភាព ២០x២០ ដូច្នេះបណ្តាញប្រសាទមានចំណុចបញ្ចូលចំនួន ៤០០ និងចេញលទ្ធផលធ្ងន់តែ១។ បណ្តាញសាមញ្ញមានកោណម៉ាណ័រមួយដែលហៅថា **threshold logic unit**។ ទម្ងន់បណ្តាញប្រសាទដូចជាតិចនីយបរមាអ្នកប្រើដែលត្រូវការការកែសម្រួលដោយដៃក្នុងដំណាក់កាលបណ្តុះបណ្តាល។ + +> ✅ តិចនីយបូម៉ែតឺ (potentiometer) គឺជាឧបករណ៍ដែលអនុញ្ញាតឲ្យអ្នកប្រើកែប្រែការជ្រាបរបស់សៀគ្វីមួយ។ + +> The New York Times បានសរសេរអំពី perceptron នៅពេលនោះថា: *ជាកូនពូជនៃកុំព្យូទ័រអេឡិចត្រូនិចមួយដែល [ទ័ពជើងទឹក] យល់ថា វាអាចដើរ និយាយ មើល សរសេរ ផលិតខ្លួនឯង និងមានភាពទំនុកចិត្តអំពីការបង្កើតរបស់វា។* + +## ម៉ូដែល Perceptron + +កំណត់ថាយើងមានលក្ខណៈ N ក្នុងម៉ូដែលរបស់យើង ដែលនៅក្នុងករណីនេះ វ៉ិចទ័របញ្ចូលគឺជាវ៉ិចទ័រមានទំហំ N។ Perceptron គឺជាម៉ូដែល **ចាត់ថ្នាក់ពីរភាគ** មានន័យថាវាអាចបំបែកចន្លោះពីរប្រភេទទិន្នន័យដែលបញ្ចូលបាន។ យើងនឹងប៉ាន់ស្មានថាសម្រាប់វ៉ិចទ័របញ្ចូល x ហើយលទ្ធផលជាបុព្វបទនៃ perceptron យើងគឺ +1 ឬ -1, អាស្រ័យទៅលើថ្នាក់។ លទ្ធផលនឹងត្រូវគណនាដោយគាំទ្រតាមរូបមន្ត៖ + +y(x) = f(wTx) + +ដែល f គឺជាឧបករណ៍សកម្មភាពជំហាន + + + + +## បណ្ដុះបណ្ដាល Perceptron + +ដើម្បីបណ្ដុះបណ្ដាល perceptron យើងត្រូវរកវ៉ិចទ័រ w ដែលចាត់ថ្នាក់តង់គិតភាគច្រើនត្រឹមត្រូវ គឺមានន័យថាបញ្ជូនលទ្ធផល **កំហុស** តិចបំផុត។ កំហុស E ត្រូវបានកំណត់ដោយស្តង់ដារ **perceptron criterion** ដូចខាងក្រោម៖ + +E(w) = -∑wTxiti + +ដែល៖ + +* ផ្សំសរុបគឺយកតែករណីទិន្នន័យបណ្ដុះបណ្ដាល i ដែលបំបែកថ្នាក់ខុស +* xi គឺទិន្នន័យបញ្ចូល ហើយ ti គឺ -1 ឬ +1 សម្រាប់ឧទាហរណ៍ដ៏អវិជ្ជមាន និងវិជ្ជមានតាមលំដាប់។ + +ស្តង់ដារនេះត្រូវបានគេពិចារណាថាជាអនុគមន៍នៃវ៉ិចទ័រ w ហើយយើងត្រូវបង្រួមវា។ ជាញឹកញាប់មានវិធីហៅថា **gradient descent** ដែលគេចាប់ផ្តើមជាមួយវ៉ិចទ័រចាប់ផ្តើម w(0) ហើយនៅក្នុងជំហាននីមួយៗធ្វើបច្ចុប្បន្នភាពវ៉ិចទ័រតាមរូបមន្ត៖ + +w(t+1) = w(t) - η∇E(w) + +នៅទីនេះ η គឺជាអត្រាសិក្សាដែលហៅថា **learning rate**, ∇E(w) ជា **កំណែនៃ** E។ បន្ទាប់ពីគណនាកំណែនហើយ គេបាន + +w(t+1) = w(t) + ∑ηxiti + +អាល់ករីធម៍ជាភាសា Python មានរូបរាងដូចខាងក្រោម៖ + +```python +def train(positive_examples, negative_examples, num_iterations = 100, eta = 1): + + weights = [0,0,0] # ចាប់ផ្តើមបាក់តទម្ងន់ (ប្រហែលជាដោយចៃដន្យ :) + + for i in range(num_iterations): + pos = random.choice(positive_examples) + neg = random.choice(negative_examples) + + z = np.dot(pos, weights) # គណនា​ផលប៉ះពាល់​ទ្រង់ទ្រាយ + if z < 0: # ឧទាហរណ៍វិជ្ជមានត្រូវបានចាត់ថ្នាក់ជាអវិជ្ជមាន + weights = weights + eta*weights.shape + + z = np.dot(neg, weights) + if z >= 0: # ឧទាហរណ៍អវិជ្ជមានត្រូវបានចាត់ថ្នាក់ជាវិជ្ជមាន + weights = weights - eta*weights.shape + + return weights +``` + +## សេចក្ដីសន្និដ្ឋាន + +ក្នុងមេរៀននេះ អ្នកបានសិក្សាអំពី perceptron ដែលជាម៉ូដែលចាត់ថ្នាក់ពីរភាគ ហើយរបៀបបណ្ដុះបណ្ដាលវាដោយប្រើវ៉ិចទ័រទម្ងន់។ + +## 🚀 thle + +បើអ្នកចង់សាកល្បងបង្កើត perceptron របស់អ្នកផ្ទាល់ សូមសាកល្បង [មន្ទីរពិសោធន៍នេះនៅ Microsoft Learn](https://docs.microsoft.com/en-us/azure/machine-learning/component-reference/two-class-averaged-perceptron?WT.mc_id=academic-77998-cacaste) ដែលប្រើ [Azure ML designer](https://docs.microsoft.com/en-us/azure/machine-learning/concept-designer?WT.mc_id=academic-77998-cacaste)។ + +## [មេរៀនបន្ទាប់](https://ff-quizzes.netlify.app/en/ai/quiz/6) + +## សិក្សាទៅ និង ពិនិត្យឡើងវិញ + +ដើម្បីមើលពីរបៀបដែលយើងអាចប្រើ perceptron ដើម្បីដោះស្រាយបញ្ហាបែបលេងក្មេង និងបញ្ហាជីវិតពិត ដូច្នេះអាចបន្តសិក្សាបាន - សូមទៅកាន់ទាស៍ [Perceptron](Perceptron.ipynb) notebook។ + +មានអត្ថបទមួយគួរឲ្យចាប់អារម្មណ៍ [អំពី perceptrons](https://towardsdatascience.com/what-is-a-perceptron-basics-of-neural-networks-c4cfea20c590) ផងដែរ។ + +## [ផែនការងារ](lab/README.md) + +ក្នុងមេរៀននេះ យើងបានអនុវត្ត perceptron សម្រាប់បេសកកម្មចាត់ថ្នាក់ពីរភាគ ហើយយើងបានប្រើវា ដើម្បីចាត់ថ្នាក់ចំនួនសរសេរដៃពីរប្រភេទ។ នៅក្នុងមន្ទីរពិសោធន៍នេះ អ្នកត្រូវដោះស្រាយបញ្ហាចាត់ថ្នាក់លេខឲ្យបានចប់ ពោលគឺកំណត់ថាលេខណាមានសក្ដានុពលថាជារូបភាពមួយ។ + +* [បទបញ្ជា](lab/README.md) +* [សៀវភៅកំណត់ហេតុ](lab/PerceptronMultiClass.ipynb) + +--- + + +**ការបដិសេធ**៖ +ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវា​បកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ កាលណាយើងខិតខំការពារ​ពត៌មានឱ្យមានភាពត្រឹមត្រូវ សូមដឹងថា ការបកប្រែដោយស្វ័យប្រវត្តិ​អាចមានកំហុសឬខុសត្រូវប_some។ ឯកសារដើមក្នុងភាសាដើមគួរត្រូវបានពិចារណាជាផ្លូវការនៃព័ត៌មាន។ សម្រាប់ព័ត៌មានមានសារៈសំខាន់ ការបកប្រែ​ដោយមនុស្សវិជ្ជាជីវៈគឺត្រូវបានផ្តល់អាទិភាព។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំឬការបកប្រែខុសដែលកើតមានពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។ + \ No newline at end of file diff --git a/translations/km/lessons/3-NeuralNetworks/03-Perceptron/lab/PerceptronMultiClass.ipynb b/translations/km/lessons/3-NeuralNetworks/03-Perceptron/lab/PerceptronMultiClass.ipynb new file mode 100644 index 00000000..ac049a13 --- /dev/null +++ b/translations/km/lessons/3-NeuralNetworks/03-Perceptron/lab/PerceptronMultiClass.ipynb @@ -0,0 +1,271 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "collapsed": true, + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# ការបែងចែកចំណ៉ាត់ច្រើនថ្នាក់ដោយ Perceptron\n", + "\n", + "ភារកិច្ចមន្ទីរពិសោធន៍ពី [កម្មវិធីសិក្សា AI សម្រាប់អ្នកដំបូង](https://github.com/microsoft/ai-for-beginners)។\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import pickle\n", + "import os" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "អ្នកអាចប្រើកូដរៀនប្រាក់ត្រាប្រភេទ Perceptron ខាងក្រោមពីមេរៀនបាន៖\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [], + "source": [ + "def train(positive_examples, negative_examples, num_iterations = 100):\n", + " num_dims = positive_examples.shape[1]\n", + " weights = np.zeros((num_dims,1)) # initialize weights\n", + " \n", + " pos_count = positive_examples.shape[0]\n", + " neg_count = negative_examples.shape[0]\n", + " \n", + " report_frequency = 10\n", + " \n", + " for i in range(num_iterations):\n", + " pos = random.choice(positive_examples)\n", + " neg = random.choice(negative_examples)\n", + "\n", + " z = np.dot(pos, weights) \n", + " if z < 0:\n", + " weights = weights + pos.reshape(weights.shape)\n", + "\n", + " z = np.dot(neg, weights)\n", + " if z >= 0:\n", + " weights = weights - neg.reshape(weights.shape)\n", + " \n", + " if i % report_frequency == 0: \n", + " pos_out = np.dot(positive_examples, weights)\n", + " neg_out = np.dot(negative_examples, weights) \n", + " pos_correct = (pos_out >= 0).sum() / float(pos_count)\n", + " neg_correct = (neg_out < 0).sum() / float(neg_count)\n", + " print(\"Iteration={}, pos correct={}, neg correct={}\".format(i,pos_correct,neg_correct))\n", + "\n", + " return weights" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "1.0" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def accuracy(weights, test_x, test_labels):\n", + " res = np.dot(np.c_[test_x,np.ones(len(test_x))],weights)\n", + " return (res.reshape(test_labels.shape)*test_labels>=0).sum()/float(len(test_labels))\n", + "\n", + "accuracy(wts, test_x, test_labels)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true, + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### ការអានឯកសារ Dataset\n", + "\n", + "កូដនេះទាញយកឯកសារ dataset ពីឃ្លាំងទិន្នន័យនៅលើអ៊ីនធឺណិត។ អ្នកក៏អាចចម្លងឯកសារ dataset ពីថត `/data` នៃឃ្លាំង AI Curriculum បានដែរ។\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [], + "source": [ + "!rm *.pkl\n", + "https://github.com/mnielsen/neural-networks-and-deep-learning/blob/master/data/mnist.pkl.gz", + "!gzip -d mnist.pkl.gz" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "with open('mnist.pkl', 'rb') as mnist_pickle:\n", + " MNIST = pickle.load(mnist_pickle)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 0 0 188 255 94 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 191 250 253 93 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "1\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlIAAABRCAYAAAAZ1Ej0AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAABJF0lEQVR4nO2dd3Rc133nP/eV6R29EyABgmBv6t2qlhzJsuPY2Y1LsnaKnbWTbE682STr3XU2PtmUdbKbeB3HiRU7cZEtybZkqzdSIilS7A0s6L0MBtNn3nt3/xiwSSwAiDKE3uccHBIzr9wv3i2/d+/v/n5CSomNjY2NjY2Njc3MURa7ADY2NjY2NjY21yq2IWVjY2NjY2NjM0tsQ8rGxsbGxsbGZpbYhpSNjY2NjY2NzSyxDSkbGxsbGxsbm1liG1I2NjY2NjY2NrPkqgwpIcT9QojjQoiTQogvzlWhiglb47XPUtcHtsalwlLXuNT1ga3xPYmUclY/gAqcApoAB7AfaJvt9Yrxx9Z47f8sdX22xsUvm63R1mdrXFoaZ/pzNTNS1wEnpZSnpZQ54LvAw1dxvWLE1njts9T1ga1xqbDUNS51fWBrfE+iXcW5NUDPeb/3Ate/8yAhxGeAzwCoqJs9BK7ilguLCy8meQIiIjMkAT7Oe1DjUtE39VEceOydxy0Vje/legpLX+NS0Tf1kd0WsTUWOxmS5GRWXO6YqzGkLnbhd+WbkVJ+Hfg6QEBE5PXifVdxy4VlSPYyxiBtYgs75YvkycF7UONS0Qfwgnx8lPfgMwRbY7Fjt8UCS0Xje7mewrWt8Xx2yheveMzVLO31AnXn/V4L9F/F9YoOJ24ypM//yNZ4jXERfQ6WkD5Y+s8QbI1LAbstLg3eCxpnytUYUm8BzUKIRiGEA/go8OO5KVZxECBMmgRpmUQWDG5b4zXG+fosaQFEWEL6YOk/Q7A1LgXstrg0eC9onCmzXtqTUhpCiM8Bz1Lw4v+mlPLwnJWsCFCEwkq5gb28TpoUwPdtjdcW5+ubavTjS0kfLP1nCLbGpYDdFpcG7wWNM+VqfKSQUj4DPDNHZVkw1BWNWCEvht+Bmsyj9Y1hTcSwksl3HVsqqiilip3yRSbl+J8uSAEVFaGqCFVB+P0Q8hc+FwLL60LJGYixCaRpgbQwxyfAMmd9u0XR+A602hqkxwWASKYx+uZupviMPoAX5OODc3bhImIxnqHQHQiXE6WsBKmpoKkYYQ+mU73gOD2eQ0lkYGAYK5lG5nOzul8x1FOYqqteN5bfheVQMV0aasZASRsoPYPIVBorlZrVtYtF43xht8WlwUJoFLoDxedF+LxIl2PqQ1EYB/0u8gFn4SMpUZN5lEweJZZExiaxEkmkJUFaIN/lvjXnXJUhda3S/psVbLmhnf9e+xP+Zvgutn9rMxVvxmBPcRjVaiSEcDqRXjfjW8sYvqFQEaQuWdnSx4nBMoIvRdAyEi0tCbx6EnN0bJFLPUuEQKgqvb/YwGSLgbAEgeMqlX83jDTNBWkENrNACNTyUvINZZx82IMRMFEDef7zpp/xAd+pCw79g777efV4M42PBXCdGsHo7luwDm5OOb+urs5x46pTbAl28bHAAb4XX8PPh1Yz8f+aCR6egMPHrz19NjZFgtAdqJXlJNdUMbZGJ1k3NVGggHRabF11mq/WP4UqBHFL8tfD72N7fyPZXXVU7M7h2d+DTKWRuRxWJjPv5X1PGVLKhjZGtgapW9fPB0r3U6vqhPQUlgooi5gtRwiEw4FaXYlRFqDrfX5yQYnllKhVKW6oK0SZcKoGtwRPsMe/jJ9l1iAUiZSQCbXg7zNw7+lEJpOzfhteFISC0DQmmw1u3XAMSyq8Ya2kUlXBkiBnP9M23yQ/fD3xGhXHpMTfl0d/Ye+sDQShaSgeD9RVISbiczojN2dMGRJKYz25mhDdt7nIVBusXdVByJEi4khxg7uDctV7wWkPl+zF25bj6Y+txdlXS/X2clxdE5jHTy6SkFmgqChtzUQ3hEhfn+DWhk5UIenORvhRYhUeJccHKg/wlw9WEG2NsExtRRkaxxgcWuyS27xHUcNhRNBPYk0lplMgFTAdAtMhSFUKrKlJHi0NelziGzBxTBg4O0eR8QTm2PiCl1nxeFACfuI3NDBZrxHbkKOsYoTVocJEgYLEq+W4I3SMctUDgE8YPBDeT6UzxnOuVXQ2laDf0UTpfom3L4uy/cBVrdhMh/eUITWyNcjaXzvEr5e/wjqHiS5ULCkQkkV9exSajuLzkmopI7rSwR984vt82NePU1z88dzjPcl1/tO0OfuoVLN8pOKTdB8vpXmoHHVw7JoypIRSMCJXtvbxT/WvAHBvKoDQNDBNCj6pRYgQDD2a5fc2PM8zI2s58tYyml/TsXL5WRl/wuFAREKMbQwTOOVCFKUhpSDcbhKrSxlZp/EXH/8m97vfWdecmO94aB/wTPIBz5t8tfpNfp728DvOT1H+VgneEx3z3sHNCUIgdI3xjWHyvzjO37Q9ySbnOL/V+TAnJsp4Md3Cr7W8waeCR3n0jqN8e9N6ftB1L+EjGtiGVPEgLhMKaKnNHgoB5SWk64J0f0Ci+nNomknIl6bKm+Avlv2Q5ZobgO1ZhZ9MbOTx/ZtwdbmoeqMcV58bxqML/ndRAn7M2jJ63i9Zv/IUP1hxac+hM72MLlTudSe5132YPyg5DGsgYWXZUvtZPPvd1OzSkFnbkLpqtMoKhh5sInpbhk+Vv06TniEh4X8O3cRT+zbQ+moU0T/KgnfpQqD6/eQ3LufEI04qVw3zcNVx7vJ04hSeS55Wqji4y3Mav1BwCgd/uvIJjjTU8r1Vmxnb0UTDUyUFgyqRxEokll4nUQxISfW/Ovi/+x7mM594mlONJQifFxFPzKrRKgE/2cZSJh9JkHk1QMWb81Dmq0BxucjdvJqOT0jWNHTzSEk7W51jgHtG19nqHOPzv/BT/rr+fZS6t1Lyeh9GV8+VT1xEtOoq+h5dRvLGFH/b9iQ/jm7kj4fqcf5zGGfUoMKUfPWX7yF7o87Hgnt5yHeQ9t+s5LUX1rFioBZrZHRBlhdsLkTxelH8PkbvaSJVIUjWmyilWRrKz820mJbCUMyPcdqHIybQE+AesVDzhT7T25tGPdaFlc4g80ZxG/5CoHg85K9byeD1LoxNcdoqu/mv5fvxKxlUYeERWQJKhmr1nB9jm56kJPIGG27qpn9riD33NHB4uBJj/43UvphGeX3vgkmI3tFItFXhrnUHuCl4kpiVwSN0VCF4NhVk3PSRkxoJ08Vo3sdYvjD7/UD4IMu0MVY7CiaNU2g8uOoQOyLL6HZtpnxvHufTb81buZe8IaW4XFjlYcY3WGxa1sN6RxpQ6DXg+c6VeE454PRxrHT6iteac4SC8PuI1zrZvPUEn6jcPvWGf2kjCgqVpEY99+jucOW53nmcmzwn+NXMJ5g4GSSkCtQhDSuZKurlsYuhKyZKKIgVnUAaxmIX55L4dnfhiFfT8OkRakMxqChFkRIzm53ZhYQAXScX1HiwaS9PnbihUG9z+eLouIVAuJwkqh38zuZnuN17nNW6g5kaUQAlipvfCHZxYMVxXm7bQOBUBHV8omgNfsXjwSoLEVuf446mU9zomuBLI7XEDpWw4uXjZ5c/3DffxP7VtXwwsI8GTeO/Vz3L7cuXY1aEUBJJWERDSnG5QNcRLhdYJjKdAcs6kzcNLIk0TYQiQCigXHrmRnE6QdcQbvfUjLGFjCewMtnFratnlp09nkL5XC6skgDZiIexdaDUJrlneTu3Bdv5oHfg7GlZafBWNsjfld/F6WiEyQkPqQEHSq7g6pENeIlY9ajxDCKTQ07GkZnsRTcmLSqKiuL1QGMNY6tcWFsm+f3VL3CP9yQ6oAqBKSXq1Kxc3JLEOde3RhSTu9xd4O7ilwL7eb20gb913slEdxllR0uwJmIL0hfn/IJs2MKpGmSkzmnDgYokLxUeH93CaMaHaSkk8g4m0y7SKScISbpRZ62/D7+yn4ii4FF0bg8cJ6BleHKTg9h4kPJ5LPfSNqQUlfRdaxlZr/MP7/9/NOsxPMLNz1J+nhrbRPVf6zg6OjEWqRNXXE4SG2sZWy/4ccOP8Qmd2T4St3CwxmHy803/QM96J7/07GeJvO2n/N9iWPH43BZ8nrm+pJMnful2qrbFYdfBxS7OJTGGhtEDPiZMD/dVHOFvf+cu6p8M4vrprlldL+9W+I2S13mhbSWZO9bi2dddFD42QlWhNEK6XPDx4DE8wnHV1/xU6TYqH5zkO85bCbWtofyHRzBjk0VlTAlNI33naoY36Hzrrr8jZTl5LNaK9b0ymp89jTEePXusnoTTsRKOlFegOgap19xsqeth/72raHgqD9HoZe40v+RuWs1kg4OxjRaOCYWyvRZ63EDNFAwfNWui9Y8h3U4svwfLpSHVixhTqmBorZtUpaR0yxDjcS+ZUTf1T4Pv8BBGV++iGVNqeRlEggzdWkqiHgIbxriv9jAPBPZTpqbRkagCRkwHL2fOpSrRMQmpKb7R9CMyUmIBGSkwZUF/SmokpYOnopvYF61l4NVWQu0WgR/uLp7NMEKg1VUT31jFuv+yn08EnuUmdw9BRSVlwZ8M3Ec05yZj6iiiUF5LXtxY9mg5Hi17mxotyj+1PcbnfvmjtK9upuXro1inu2e943a6lH33EBVeDyeXt7Jr1Ub+z30JjNM+vL2CqtcnUKJxNMMkZKUIySRSSoSiMFxZx49WtfF399zBpzdv4/dLjnCfZ5itrn5WuIb40xMfsg2p2SCcThSfl/FVOumVWdr0GB5FJWZleHz0TrafWk5r3zjW2PiiNAa1JAIlYcZXaYj6BCXK5d/un0yGOJ6pImp4qHFGuct7jGrVJHzeeRoq5aqHchVWtvRx3KqhbE89Wv8YxsC1s9O4xhElscwkd9jJ1Q/Z84iUiGyO7ZPNhPQ01bXjZIPluISYXZ0S4FcELkce0yVAVa98zjwjnE6UQICRWyuJr8zjE853HWMh6TbSHM6V06yPElIK3gu6EPgVBxrv1lGtpbnZ286Lq1fS5y6l/LUSFNMqHqN/agPI2CqdzMoMrXqSb8ea+Gb7jVT05Aq7ZM97xoEuk+E9ZfxR5mHaygf5q/qnqPNEebM5ixFyI2ZbJ+aAbFgjVSmobx1iMuOk3x9GzTpQpsZEJSdwD/swXYK8FywHSPXdZZUKGA1pIuEkj9TupytdytFwBclgNV51ETfrAKnNDcQadSY25SitmOTh+gOscA6RkTovJesYyIfYP1FLfyLAeKywHKQISSSYZEtZD39ZvY2daT+7k010pyOkTR2AiCNFpTOGUzFYFRxiaKOfEV8AX+8a9M7hxd8UMlVPY1urGV2r8gvht2nWo1SpbvbmLN5Or+DF3WtQkwrC5Fxit0tURanC3to6SsNxbqs8VTC4KrNYHidC1+bdkLLicaxkCl0IwqKSTImfYK+FdyCH6OzDuNjLlqKiqSraMh8OTx6PWlgRcAodv7CIqAmkNr9tb8kaUkooiKwqJXDPIJ9r2EFEdRKzcvQYOm9sb6NyF1hDI4vmu2A21xJb7qHy/h4eqLhy2IUv7n4U/bAH96gk3gid95TyaHg3Nzsv7o39WPP3eau+hC92/Colhz04ryFDarWzl3XrO+nf01TchhRANsdzh9toqBnjgeojPB6pJORwIHO5qxo45eUcYxcQJRTEbKxkza8f4uGSd/tKWEiyMs9T8XX804kbeLRpP+vcBZ+nMm2SNj2JR+jv2jhRo3qocWd539rH2d6i8MfPfAavlFAkhpTQdITfR+DuQb7Y+CphxcW/dW6h9BseXEe6Md6xzOF5YifLnhSoKxrp2drMzi9Vs9nbQcXWSX74zD34HQ7kTJd854h0iUKq3uDrK79Do+bC2lzoMxQULCxiVo43MhVE1ATLtAQRRcMpdCwuPO7M/wEsLEYCWbpKPHwu/LlF0XUWIej6sOTz1z/Dp4JHzxr7fxVt5mtdt9NzpBL3gELNqwnKBqKEu04AU35/N63m+feVkfr4y/zR4UcwtkUoOZJHTxSeb0eNk8kGBccN49xee5LXt/4DP1i1gj/zP0TDT2pwLrIhJTQdxe8j+rEEH2/eze3uFBoeLCR/P3QXr7Y3s+rLXRhDI9ObLRQCNRjAbKnn6TtvIr0mzbKqMcxACbrTCQuxkckyMQYGUQYGqdl27uPLlt6hky5V+GjrHm5wn7rckfPCkjOkFL8fUVvJwJ1lTKw1+E/1r3Oz+xQKDr4R3cQ/HriJyp2S4IExrNz8WteXY2SDl+h6k09Xv8VmVxdQeAOykGzP6HTmS9kea8aSAguBftRDuN3E35EkeMrJq73X8WzJdeTCFh+7Yzt3+w9zsyuPMvXK4RM6y7QoydVZ1IyTikVTurSRhoES1clUaNzrP8i/Bu9C8fsKQVKn65smJRgGSl4yYipk81rRNMzkdcsYXaPxqfAh1jsGOd9/r89MsSNTwx/teQRx0kPpQclPIrfxpKtQB3NByDZmuX/1YX6t9DVW6Vx0J2qdmqDvl3NoJ6qoeS2C6+Twojugy40rGV3l497KbZSpk/z+4PVMHCmhrH0QK564xEkSkcqgZgsGdL02znJ9hO9E7iNUWoIxMLRoS19KWuFDb3+abFbDGHajlOQIBpJIKTAthXTagaJa6LqJplgoioWcWv4RQtIYGqfFN8xvlbxBleoBFLal6/jnvpvw9xowOs6ibbGVEv9hB1/lbv61YiuJtJNsrw9vj4Jn0KJ+1ECfzKN1DhV8Rs/DdCm4hgU37fh1nK/5qX4rgTY8Cbk8AOFhD/5OD5M9IZ6vu45bP9WOS+RYsXKAyR21OBV1UX3D8reuZXS9k4ebtnGf/yAaGtuzCk9FN/HGi2uoOCSxJuPTL6OUWMk0Wvcw1a8pZI47SfqqKTnVg1mku8EVh05mWQnJGsED/gM0aGlm4795NRRLfz0nCE1DiYSIt4SJXZ/hd7e8yKO+o0RUJ1mZ5+WRFsKvugjtGcA43bmoZU0sg1WtvXzAd+rssl5WGiRknm3J1eyL1bKnfRlYhc6s8pSF/3QCDpzAIS2qdnkQAT9WxM/TjavxN2W40XUEZWoZxSk0ytQ8rQ0DnBxoQGha8azpLyWkRI8r5AyVzQ4VwycRLhdCVZEz6GClYaLmJSOml7y5+Et6Z4g2a2TXprjJ3UONes6IspAMmk62TbYQfM5D5HACdh3Ed965Wl0tsetreM7RygZfN3XaiYsaUhWqgy9vfop/rryJ/lgDVfEQdPcual2NN3oZ2yC5038Ev5LhmRNtBE6Bebr7soOSzOVRcxJVWFSoaWo1N7mAQPo8CEUsiq0hVRCmwNoVIjAsKd0fJ9biI1l1brBxnXe8ybvf/vcsD9FRF+Gj4V1UqYUZqT3JZRw/XkNLfxpzIrYQUi5JuN1ATTtIBsvwjEoadkYR/SMXBCp+l6u0omDpAveYhfqSj/IdMeTew+eOO+PArqpETgUJNlZy4KN1LHcOcVPpaX7sr5txO59rxlud5G+e5EOh3axzqGSlwZvJ1fzkxBqq3zDw7OqcsQEk8zmMwSHE4BBuCiZJ8W75AVSVdLlOttRko9NCWWAjCpaQIaV4PMTfv5bhzQq/+/CP2eDqpkFLk5HwZsbJ1wbvoGtnLSu2jWKNLHIUcCGQFNboz/csePj4h+h6qxbXiMA5Llm1YxTMqZ53fKKQemJqjdpMJBHpDEoiQepgG/8qt/Ab4QP4xLlB2CkUbi89QWdzhNSDm/AdHsE82bFwOt8DyFyewGnJSGXgygdfBisaxTVczePjW0mMewjNTfFmz5TvRXxVnk+u3kVQudC4s7DYmVrB633LqX6hB2s8yjttBHNwmMDLKXLelXxl9AMk7nqeu7xHWevQLzjOKTTu8/RR2fAzvvWRm3nbWkvtUC1m/9C8+2S8C0VFcbsYWyN44Ja3adZjPJNYScX33fjao1iXGzSFQPg8ZAMK6x2DVGvv9idbcIRgYpVF8+o+ul+tR09JxNEOwp0uIs7pl+/0f1hGVVscHYuoleaFVC2P791M82NZ1FN9Cx865h14t53A53SAriNzuUJAyczll1KtdBrfaydA0xCqgjUZP+s6pHi9yFWNxJp9RFsVwtcNcVvlAT4d3slfj9zGC4/dQNWu+MLXz3cQX27x5bVP06QZnMwbfOHUR+jYWceyn6TQTnZiRRc+FtSCoqgIl5NsUCAdJifzBhWqRVBxXfncOWRJGFJC0xB+H9EWFb0lxqeDPYDAwMmraQ/bky3sPLScklPA8BjyCg1sXsuqO1C8boygyTLvOCrnfGE6h0qIHAb3WB7neBbz2MlLNwLLRFomVhL8HTDhDvLtlha2uk+z2VEY9HRUVroGqI9EGawP4OnzXvxai4yUkomMm24jRa3mBorDP2haWBZ6ykLkrs7ZVhoGSs5kNOcFRZIJKQTeYXAsJGooBGURAmUJtnhPo7/DYTwvTV6PrmBiIEDlSOdFfQ1lPoc5Nk7wdAbD7eJfGq7jdHUZv1f+IiFFIXBeZxdQXKzUJ3m4ZC+vNrcxuakafyK54NGVFa8HUVdFrsLglkA7PYaHtyYb8Z2OI0auXBapKkhV4FcEGirWpbx6FxDpMan1TtDhrkOqFLbuz2T7vqIirGWUuRI4hMW4Jfjp2HpcPQ60k11Yk5dY6lxAzNnsipTy3HlCoJZE0CrLMUv8ZMNOoiscJOolzpYYj9btY72rm8cmNvPM6dVUHc6iDk8s2kyN0B0oQT9myGC9sw+n0Og33Zw4VkPpcdCOdhbyzZ3x5ZuaXSv8Xzm7DFvM4WUuiaKiRkIQCWFGvKRDThJ14ApnSEoNiwuNW6+SxfRaaI0NWMOjhYDVc2xcLglDSgmHMRsqWPvgMR4pPecQm5cmf9V9L+0H61j1X49iJZKYi1xx1PJSco3l3LjuBH9ZvQ3tvEl1OeCiZPcosquvENdqGg9b5nOUfustKqoq+Wb7Q3zt/hj7rvs2MBWUzBMjU/MGf3RDOcleL57d8yZtVkhLIkyT4dMlfKX0Hr5S9SIXLjQUOVKi5iXCmLtdS5WVEwzeECFyNAiLNIGYW99I750ufm3Fs9zrTqKc11VkpcGIaXDwhZXU7TMK8a4ug7L9AOU7VJQXa9m3fgN/+QfwQHj/u6Kil6seHvTE8N//DZ67aS17f2s9yluTC9vZN9XS8cEwd607wAPefh45+lG6D1bRcuowZrI4fUSmg1vNY1RnSQ+7CM7gvDOpi3Ihiy2BTvyK4JV0NfufbKNqXw5zZGTeyrxgKCqKQ2fifc2MbBTccecBbg0e535vFzkpSUnBE5Mb+F9d96N+MURj9xDmyBjGIqZdUKsriN5YQ13tEHWagi5UtiVW0vrVURgefddSq9B0lFAQoSqF3cCWhcznr70crYqKGg4yeccK+u6W3LyuneuDHejCIKIlcLxjXtwpNOq0STavPs3BX2um8akAysETc77J7Jo2pISmIRwOxu9bznib4CORI7Q5BwAHWWkwbhm091bg7VEKWeeLwPqWHhfZEgchR/rstnALScLKIvICkc1jzdCXSRoGMh4n0Jmnc9TLpJXBpzhRECgIdGEihCzOiR5pIfMG3m6Vl0ubSVY+v9glmhmWhZKVKHmBMUcLHA2BKIEVWfKBShZrTmqywUndLT1c7zl1dgPDGToMk7cyTQROS7wnJ7GuNKBMzZ4yMob/pIvnXtzEnvW1+Ff+kDY9eUEIDwVBkxbjRt9J3nZsnA9pl0UqCqZT4lbzqAiGJ304owrkrxwcVagqE1sqGF8NulAwMIlbOZQ8iLxRyEa/gCgeD0o4hDuUock9AgkdLTmzMgi3GyrLMMMGq519vJSq5ftDW4gcNXD1Ti76kt47EZqGWlpCbkUVqOJdu1+VnImSNbBcOpZDIe/VyAYVklUKibYcKxqGcCoGO+Ir+EbXrYwnPaQmXWiDDlwjgrre0wUjZTGDjyoqRlWYoevhA6U96FPuHHmpIiYTmMlCcGnF40F4vWTX1ZOs1Ik1K5gOidRAWKAlBCVHTLwdCeT+Y8UR/PcKCEUgdJ14jcqt6w/xUMl+lusjmAhcwiSiGJgSolYGc2oMDSmCB0oPEb/RRadZT6BtI6U7RmBiEnNoeE7KdW0bUg4HSsDP6ANZfmfjC3zY33F262tC5uk33DhPuQidMguO1kWA9DhJl6j4tXMWcVbmGbEkigFYViFZ7wyx0hk87SPoo9WMWBJd5HGfFzhRiMVfYrgoUiLzOcLHDUZ1H7EbisfRejpIKdEyJkpeKzTcOfgzbwz0sKaih/8Z+uSiGVLxRsGuVT8BwHyHpoPZan4+tobwwUmsQ8emfU1zIoY4mqH561V0/WI1T5VvoqRkO+F3TObVax50MYipK6higeMTqQJLA00xMZGkxj2EoiDNK88+CE1j6AZYsbYHHZWUlWfIVAq7+K4wazcfKMEARl0pTaUjrHH1oEcVnLEZGlIeN9naEJGySTY6k3x64E72Hl3Gqh0dWJOT81Ty2SMcDszaMvpu9yC1Quyr89FS4JiUZEMCwyvJlRmEKif4QssrbHB1U6Hm+GLvQ+zqaqD0KTdVvRkcHQNYY+NYmUxROF0rDp14rZsP3LabR0Jvnw1JkZcqVjJV8NsSAiUYwKwsoeceB+7WCb69/lvUaXlKFDcJmeXNTIjPvvnLhF8LUHZUx8pR/MaUUMDlJFkr+cf6l6c+PDNmKIBOr5FmxHRgSQWXMFjlUPh4oI+PB/r4n6VreW6glclEGf5TDrANqULHhdtFdekE7/cexXVesMBbtv8moZ97WbY3ijIawyiSCiJyBnpSng34BtBlSL4TvRH3sEBOxGZl9MlcDmtoBF9XNV/qfYjfq36WDVN2VKtjiA+37uVn1bfg83rnZY141kyt3cdrNdKNOTzCZGKxyzQDZC6H41AP/hUr2JV14Vo1QcenGmj8tjbjSM/KZJqdB1eQWaVzd/1h8m6B4vUWXTqKbw/cwPFdy2iZ6J/xwCJzOazBYWpf8PL60PUMfSbAf6v5KfWa+4KZLxXIlOi4K8sxenrntPyXI1vqZvmmHm7ynyAvLfxHdUr3p6fXJhUFSrOsCfWjCsHbWT8/HN+Kd9DCGh1btEEqmnHTmS9DzGIlKru6jtH/mOI3l2/HkpLdpxvwndCRyWQhVloRIZxO8te3MrzRRdv97TR6x6hyXLjElbF0UpYDv5pBERbDuQCHY1V8+bUPoI9pOKOC8AmDhrE8js5eZDpdyFm6SDHA3oUQCJ+XdEThk5HtVGsGeanztYlW3hxuJPcLFcQbFHJrUoQCKSLuGL9VuZ1m5yBNmoFHKQwKLqGx3jHGn13/I77sfz9D2kYqXxjCPHF6kQVeHmmayFicwCn44ImHWBfso9xxoUH/f/bfgeOIBzULphPSjTnuWH2cr9e9wkeCu1nl7uMPHvxFgntDVOybm3Jdu4aUoiKCAXK1EZYFTlGvFbZmG5hkpIFy3Efpk4cxJxOX32mzkAiBdOrk/AK3eu4NNSNVRnJ+lLwsJMaczdq7lFipFO4xi7f7aukrD7HBUXACLVMt7vAf5Sn/LQiHA9KZ4sq/p6pkSqG0chJXMS4/Xg4pMUdGcI828XJiFfWhCU6u1TAjPpQBHSsz/b+zyOVxDmmMLPMSUnKYLhA+byEIXrEYvkBfLIinX8xulmWqnirt3ZSNhTn+4XLGqpzUYp0N3QGF3GDZkMAqCUDvAkUFV1TyXoU7Sk9To0WJWxLPkIU+MIE5nTYpBE5XnnJHHAWFvnyYvaM1eCaNRQn8Ky0LkTUZGg/wWqAFNS1QczPrWzIlGr/T+iJbXV2YSJjQcY3Lqw44Ox8IVSUX0Mj7oNodo9U9QLPz4oGIS5Q0urA4kS9hIBPEOaQROSIJnJhEHO3ASqWKYvbpoqgqli6o1oyptGLQmSkhbymMrxG4VkX5StvTLNdHCCp5/IrAAuJSkjQLBmFI0YioTj7oHWdPw1G+v/Y6Svf5EacWNy7WFZEWMp3GN2hy5HA9XdVhwp4L8+S693mofDONmsph+hwMpdwcKK+COlihOwkpfaxoGKJ7oHbOinVNGlJn1sH7PlhP2y8d5XOVL3Jmeu9k3uDfJq7DPVLYmr5oQeLeiaKiBgN03xfiP37ySe73tnMmuOEah+DPq5/nuoZ1VFWUIfsGZh0FOXAiTuaFIDuaV/CgZx9QSBR7uzuF4ZOFrb6LFM/mYghVRTgcRG4c5PG2xyhV3Zwu2h7s0gT2D/H039yG5yOD/POWf+bzbZ+jJFEL7aemP+DkDVxjkM7p1GtuJhshsLEB1yuTixaBf76wEglkOk08tYoJ0wNc6MjtFArRG3MYnhBVh/X532auqGgVZaTKFR4K7GPCcvN8qgXPiAHDY9N+hkJIlKmpn/3JeoaPldEcSyzK3j1zeAQxPkHLf6tn1FdDQ2IYkZiZgZD3KHzQ14WOSqJYOo1LYKVSeJ89gG+7l5M/WMaxcBuG7+KL43236hiNGT6zfhutvkEyd2oczbTg69bOJvYtSqTEmojhHTL58tAdPBrew82uPH9S8Qr5ckm8TeARkpCioQuVuCX4p9g6jiWqeHuoYDhoqsUfr/wpG5zDVKluPh5+k1V39fN/d3+I8s6y6UdBXwykxMpk8P78AK3bvIVVqXek0vIlD2OlM2BJ9GW1ZO92UfEOY2uuuSYNKSUYYPLGZUyuNPmF0n1Uq1kMnJzMG3w/toXv7LiR+i5jananON6ahCJAVTA8cKv7JBHl3J9eQyWgqEhNIq8yZ5VI53CPW0waFwYl01CRgstmdl8shBD4HVnKzwv4eK0hJ+NEjoXoT3qIqBkmVoKWKcF/qnPamxxkNot3wGRw0kNemoWt6nrxPa85QUqkaZIddfNsbC3Xu7ZfEAMNQHMamDOIdXTVqCpSLTitjhgBjqcqUVPG9JawhEDoGk7dwK8UjN6JvAc9LhA5Y3GCIEz5H8r+IZSpUBpX2mF5FkVFKy8lFxTnklTLPHpMwRmzFtxxfrpYmQzk8iiJJNqoH91z8R3ApaEaEmNuvpa9Hd2bI+RPk64y6b/NS7hiDe6hDMquw0WxQeldmCausTzPHF9DzboJbnQdIay4sZAEpclJw2JbuoqXY62cjpdysqMCZVLDNVoYWzI6HKivp16LUqVChWqxwdlTCBwb8iNGRovmRftSWJkMXOHlUi0twSgPYC1Psy7UN6/luSYNKVlVzsTH4/xK034+5BsF3MSsDI9Fb+b7O6+j9fcOI7PZomsEQtMwnZIWff6294tUBtdonqRZ9FnqlhTm6BhidIzUL1/PiOnmlrsP8nLtSgI/0aZdD62JGKFtXYxsbCRm5Wbl03JNISWhQxo/0jfzuXtfw1cMvdGUfXAoXcsbw42EJjPTmg0UDgfC7abMm6TOUdhSHs25cY4LRHZx+6HZJIJWHDqp9XUka+RZ3zVTSvyd4D8eu/JOzcXEMgtL6pd5br6uHnxCUO10ItesoOvBMlpu7+J3H3iOr/XfUXCoP+LFnEwU3eyMNAyc7YPUfLeWH4Y28NnwQTShYmExZOb4TvQWHj+8kaonHQT2j7CyY98FfZDi9/PcTatY5epntSNKWHETdEgyZZJsVQD9tApFNnbOGEXFaKllZKOHf7j+a6zQJ5nPtDHF0HXNCMXvxwi7aQgPUj/VYeWlyZCp8P1dWwnvVwtGVJHs0juDNE2seAJvv+APhzfxyfAb82pQ2SwuccOJnGGQTmmaWIkkzgnB86llOFZMMiADNO8OIUdGi+7FYC6wdBAOE/UiE2/5qBP/uFy45Xldw9IhqJjUOsap8k6SUsundaridCJ9HsKuCcrUOAoq0awH15hEZIvLKXta6Dqpch0jaGIheTHt4eex6wh05RCDI0Uz06+GglAagVgCmclgJRLTL5uUWLk8as8wtS/pDI028FuNv8Z1Nx7n+jWn2POHbUQOQunL3VijY0W1vG5NxPAedZJ8spL1x79QSAMkQc0I3IOCmk4D35FRGBl791hoWVjyXINLyCzjpokeF+ixzKx2jRcbQhFEWzxMLreo0yYJKfNr6lxbhpQQKKEg2RKd1f4RKvUJoBDq4ES+gtB+ncixTHEOOFNOtp5hi6c7VnOb/xgt+oV+IVID6XYU8jfN9j6aiulU0M6bzrCQZGW+MMOxBBpJUWNBRuqkDAeYl1mWEwKEUog2rExFHRYCoSooOTiYqmNjVR9HHXlkOICSTGEW4XbzWTO1W9Nygu4yeKfJaUmJHlNxTSxMfRWKQGoqlgZeoVCmxal0xzmtTjPdt9OJ9LqIOFKElBzgJplz4I6acA0aUkJVyEQEqr+wFLgt0cILXSupH0gUVRBHEQ6RbirB1aWixJSCITUTLBNzaBhlaJjq7jrytSXkrld5qOwAq+4b5FveWwmdKEHNZCCbLRoD0kom4WQHFeksZTsDSFVFWBYikz8bH+lSUwlCVVGmwuFYWMQtkx7Th54AJZbCLLJJiJlyJohsolag1yQoVVWcU075FhZ5IJ3XEcbcuU1cM4aUGgggIiGOfaGamlVD/HbpK3gERC3Bnbs+g3UgSNPP+5Gj40UXJO4sUuLtyzLxdpAjLTXc7z5xwdcfu2M7T9avo/bPlqMcPlUIUzBdppzZB++ppvSXeviVsu1nv3o57eJP2n+J8DGJFY0Wp6G5RPB1qPxR+yO0hYc4XZYq7JI8vwNWVLSqCmTIT6ohQKJGI10myK5J4fdm0DWT+6vf4LdLtpGXcLy8hN/++K9ScjBC8Ds7FlfcHKKuaCS+pozK+3r448afUKZe6AuVkRbluy2C2zsxFqC+SksiDBPFgKS0yMuZxTMzWmoYW+3ml/ynqVV10jJHPOUiMpRe1JRUs8bpZLLVYH1tPwqC5/paYWcQEeta7JIB5zYc9Xywhts+toc3v7GJ8u0aYnRs1v2b2T+EFpuk7+9X8ZXWZv79Iy/zizftpGdDmJP/0Erp9iGsju6i6j/NoWHE2DhCKbyKWKYJlzGEtJpqjJoS1kXaWescQMHFoVwJ3xu9Dn+PgdXTX3RLmdNCURF6IUB3+rZWxtp0nFvHubG684L0VjuzOs9NbsL653KWnYjNme/iNWNIiXCQfE2EspZRHq3dS63mZNzM0mk4yJ0KUHHIxBocnpnxsQhosTS+XhftyUrGggcoOS+q893+w6jLLZ5ZexthrRntRG8hUfEVNAlNKyx5rqpnsgk+X7ODJi0BeLCQHM9WM3q0lPpho6g6gaWIe1Qy2FXCTeUd1IRjyKZa1EQaYZhYPg+WRydW7yETVEhVCbIRCyuQpyKUwOsozFxYUnDa8NGmJ2nSxzF9FoZrgQNTXoZyX4KO8jDS50E4nTPbYSoEitOJUeZnsl7l1kgXWxw5tPO6osP5HDvSLbiHsgs/+yEK+3+VaTqoCd2BEvAx3uhiolVSp4+Rx2RbJkxm3IUSGy+6eEvTQSgKeihLrWcCgFjCTXBIIotkdk04HFgVEbIlki3+DrarmxGmeVUDo8znMGN5QkcmEVaAp7euZnNpLx8q28MfLm/FPVaKp3+osFRWJDNT0phZn27UlTK+ykuTe4TQVJfSmStl/3A1kUlj1rvFFxOhO1Cal2EGXKRLXQxv0sg1p7mrsod13p5CKBWZJ24ZPD5+Jy91t1B7PI7Se+lZu5lyzRhSybZKRjbq/NcVT/CwdxQFhf1TlnT16yaup/cUT7yoy3Gym7KRCV66u4Xv+Xr5VPD42QjkN7vybHHuQfm85One1ej/vIJA+yTsP3rZSyolEfItNXT8Brx/5W4+5h9CmQqtELMy/HRwLc3/MonoGyne2bolQvjgJErez8rbB7kneJjPfvJTqKkgWlog18VZXTnAn9Q8R5maxi8k34uv4aXRVjp+2oQclDgnTZ5rquXxti18+bYf0eoYINCuEuwong7uvzT+lJdL23j+7VsJmCbmqc5pDyyK04lorGN8tYfkdWk2eztxigu7od869suMb6uksadnQWajYGppz6FjOqBUdeNVpvf3VivKmNxaS+rDMZ7Y8E+s0BR259x87uVfoXy7VghwWCSD7ozQNFqqhtni78BCkou6CHRmkUXiJ6QEA/TfEsbSJH9+6F6qj2Qun+R9ukiJtf8owVM+OFrL8x/exLoP93DLPQfZvbYO3+GrC0+z2HTf7+Oeh97ig/4DZ1MzvRJdSfbNEhxDo9fc+CB0B2plOUc/G2Z5az/faf43XEKgCwUdFVUIFBRO5i1eT63m9X/aSv0rY1jtHZhzGFLlioaUEKIOeAyoBCzg61LKrwohIsD3gGVAJ/ARKeUsUnBfHjUcxlpew9BWHc/WUVr0YVKWyds5P/+7+2463qynqXviqoyojExxmLfIkkEgqKGRetFMXuY4yA7SpMiRQQgRvlqNMpfDSiTxHHDzVeVOmq8bZKU+Rr3mQUHgFDp3+o+Qr1H57g03k/eEKBufChwmz70RCk0tRFJ26AzcV028CR5qfYu7AkfO7rJJyxxPJZZz/LBO8vA/ks0XHDEvps+NB8nC78RRVi5nfEOYm4O7ruo603mG7oJxOa85aNRoHF+/g+OpSioDEyxb008qr5PNa7gdeUbTPv6s+0HShs5owku8O4CnX6V8fw5HNIuSzKLkg2DpnLyuglbHAMICIeWC1lM1A7uyeZq1PAHlwk0RdWqC672n+G7bHQizHM/p7ssGeD0/51eqQmdsrYDGJO9fcZRmxzBQeJHoNFJ8q72Fvb/1Q8TgJL2ZPDWyYd40XrK8CHRM3EoOqSmgXCRI4dQSbWJDDb0PmXys4TCVqsnenIMfRbcQ2qcT6Hh34vHp1tPFaItnUMvKyNeWcGN4N23OvrOBUsU0jZQFaYuKglQKDtbZjI6St+bOYJUSmU6jDI4RPBXifx++i3sbj3F77UkONa3DLSWJ00cXrC3OBWpZGbk1deRWpLkvdJCQojBqpvm3yXXsPN5Ew4E8InqhD+ZC9jdnyxkIIPw+UmuqUXMWjsE4jIxjjk8U2qCiogZ8CK8X6fMQW1dCvE5l07p27i45SoV64c48C4tRM83XR+/m5zvW03gsC8PjSGNuUzZNZ0bKAH5PSvm2EMIP7BFCPA98EnhRSvkVIcQXgS8CfzCnpQMoizB0XYDKW/v4Rst3qFIdDJkWT4xv4fSuepq/0Y81dHUZyAWCZtYREGEMmWcXLxKRFQzQSYRylolWXpNPY2JctcYzCYarX4kzMeDjp80byIUOUq8VnCQVBDc7LerCbzJxm4dn9A0Eugo7h4Qp0eJZpBBIp4qlKRhejbJf7OELNTumZqLOOdClpMn3+7eg9nlYkWst6OPi+jrlMbo5cdEyzyexthATDye5PXDsvLxqMx9EpvMMO+UxxhmunFsFF2KNjOEA9kVrWe/t5r83PXn2uz/teoj2gXIcRz24RiSlJ3LUnuzH6OoBCjvvTcAzVo5ruJzjH6ngocDMNM5VPdXj8LPJ9YRCbxG4SC68MjWGvinKiBqm8WeXieA+lfPLKg/Tc7cDrTnOP216jAYtRZXq4YwRBbAvW823T9xAc2OWio5+DCs3rxovhYXEpeQJaBksXUXVNWT2Qn1C18gvK2d4s8ZLd/85EVXFJRw8F1/Lcx2tLHtpBIbH3vWGP916uhht8QyyupT4MjcPBvax2TFzW2ch26IwwMqoYM3twCgNA3NomMj+MkxnAM9v5PhQaDefXrEFNRtBnF64tjgnemrK6L3Tyd0t+7jfnQJcHM9Kvn7kZsJv6bie24PxDuNiIfubs/eMhMjXROi+T0NLCUoOOQgeUVESSaxcISwHZSXkywMkq50MPZLjzhXt/Fn1cwSVd++Cz0iDHtPJzw6tZtXfjSN7BzFnEQ7kSlzRkJJSDgADU/+PCyGOAjXAw8AdU4d9C3iFuawwQqD4fMRXl1Lx4S5+pWYHFWohWuvBXDnPvbiJsj0W1tAI1lU6czqFG+dUjAlN6HiknyxpRuhnM7cDoOMgR/oR5kijeqKXklgJL/xsE6+ta+KGzd/AJ/SzyxwVqoPPlL3Kxnu62HZdMwB5S6U3EUIIiVfP4dOz+LUsv1K2nSYtcXY57wxjpuDUvlpK+wUBEb6svioaOMWRuZA2Iwy3Qk0kRkg95wc2mz2L03mGVTRwkkPhuSn5xbHSGRgeRX5lFV8PfghLO2fYOicMGpMG2sQ4IpOFWOLiMX7SGdTxBBnzwua5kPW06pUxfjZxG698spnPL3uRe93jFyzBOYXOl1c/xY6GFXy3cQuOTieh4xc+t3SZwmRbHk9JispgnN+o3MlKVz9tegbneQm1s9LgtYyfvz59N7XPleLrHsWUcsHaIhRCTzA8hre/jL+NNrPe3cVDgX08seEOyq1ViDcPnp2VUvx+lEiIga0ecs1pylSNnVkvO5Mr+MHjtxM+ZkJfd6EuvIPp1tPFaIvvxJIKFvKCl7PpsBBtUebyOCckiQbJ2uZeJirq8fr9Mwt/MA2U7gEqsnmefaiVZa5RoutNhHRR+vrCjxmzQegOWN9C/60BPvPoz7nbdwRVuBg1k7ya3EDoKS+hY5OFGZp3/N0Wsr9RPB6UcIjjn6umbv0AX6jeh4ng9P1lvNzTTGJgHUpOwXJY+KoSVAbG2BgY5rbgMZbrI3jEuQj2P0yU8kZ8BbcE2unPh/k/++8gvMuB7B3ESs6PD/WMfKSEEMuAjcBOoGLKyEJKOSCEuGjAFSHEZ4DPALiYQeRqoaCEgqTKFb5Q+zobnP04ReGhTpgefJ3g7c/OuXN5WiaJM0GQCDmyZ+85lWF7zjSa0ShKLkfJoVKGPEEOrg2wUo9RpRYeiVNorNZhtd7PJwP9QOFN+Wg+j4okopj4Fe2sfxXn3ddC0mukeTvbgK9LwTtwztC8lD6ncCMv0QHN+hlOA0uDsDOFS+SBi6dzmCmX04i8eJ2fM42WiZVKob+w55JqrjTfJg0Dkc1hXGbn2HzXU3mqi8jwOEdvW8brkRZud227wJBSENznibHJ+Qb1W8b414rrGHBeOMFgVaf55LqdbPGeplUfpVZzoqEC594cs9Jg1Mrx4+hG+jpKadvdhxWdWBCNFwqWWIkkrqjJK2MtNFUPs8kRJ1EvcU64KTnoLWQF0B3IihIyFV7iy00aKsZRUDiSqeXF4ZWU7TPwHR7GiMevOKAXW1ucD+atLVomzkkThMK6YB/PBRvxBwOFgXIO84ia0RhKMsXExCoGciF8lQnSZaFpaZyXejpdpiYilICf8RYfk80Gnw+fRBUuTGlxPO/mrYkGwgcnEANjmLOsq3OlUTh0pNdNuHWcLy9/go0OA12oEDrFE4F2ttW1EDdc+LUMdwcPs1wfo0U/M/Zd2E/uSCznxa4WRit9DKX9uA54CHbkZxWYdrpM25ASQviAHwJfkFJOimnmI5JSfh34OkBARKb9qqB4PYzcVcf4RpP7PMPo4tz2aIcwMbwC06XOqbe8IQ0O8CYr2YAmdKY7MTJbjVYySeCnB/D2tfDr4tM8fMcu/rxy9yWPVxCs0vULfn8nCZllyLS478UvENznoPqZARibwFwEfbPFnOEb8PlcKxqvhoXQeCbVRs1zTTzTfwP/4VPb3rXEp6FSobr594FTPNrWzkTrhd+7hCSoqOio6MJ90fr6WsbPj6MbOfIna1l1agyjfxAsc1Geo8zn8PTEOfFSE0+/P86Dta/xnx96gh9s3kzUaCNVrpBotNi6tZ17Ike4yX0agN05D1/dfyf+7R6q93Vj9A1c0Yi6VurpTGejzmc+NVqxSXxvdOBY18xtvmN8d80taNk6gk9Pzu2slGViZS2suE5vJsz9DUd5fGjr2a+L8TkKTUO43Yx/cA3RVvj4Qy9zo/cEFhJD5hk3s/z7l75A8ICDqpP7MNOXz0O3IBp1B9LjJJOHnnwJ6x0DnDGQ3u8Z4i53/9lDXUJFF5ce+Z/au4GGHwlGJhvQk3nqO48i0+l59Tqclh0ihNApGFHfkVL+aOrjISFE1dRsVBUwPNeFs3RAt9CFesbyBUAXJnkfmC5lzgwpS1oc4E0qqadc1ADgwElWpnEKN1bhMcy9xlQKfWCC0JEqXlu5grfCb7HGkT9vpulCLtexZaXBC6kKvjN4Pf5DDiJHsjA2gZVKXVFfVqYRV9FpzgXmVUawno5GKN6k7mexLGQuz0gqQGe+FMMFhktFZYHrqWXi60piOnz8j74Hub/kIP/Of+GlFQRu4cAtoGQaERoMTPqNLAdz5exIrOCnXatJ9ARoPTUKg4VkqYvVFgGUeBpfd4jORISszLPZ1UW8wsXf3FKLEkrTVDnKo2V7uMHVR5XqZldW8Bc996Mf9xA+kUPGJq8Yh+daaItnSMscI6aBGlfRYonLxig6n/lui9I0kfE47mHJN4duhZo0Q6oL93ALzr4Y5omOOYmHpFaUY1WXoUcylDnivB2tQ5tQp6VxPuupcDpRwyFwOkBRMHsHEKqCaKonV+EjWeVg5HqL0mXj3O07TIOWBtzszOpsS6zBf9RBuD1fcIu5jNG5YBrzOUQyQ7K7nG+Hb6Bt2RNUqxmCigun0M8G1IRCJpOTeYPDuUpaHUNElEI16jXcvJRow93pwNM1hogVEqOb0fn39Z/Orj0B/CNwVEr5V+d99WPgE8BXpv59aq4LJ0zAFJhSns21m5cmLiVHpsIgG1SZi5SmUkqOsBsvfhpEy9nPy6hmgC6W0UqeHMyDRgCzp5/yJyfpqGnlzwP3878anmCZNrNceQYm41aOr7Tfj/4vEere6Mbo6cVkevoG6EKbo6W1xWC6GoGJxSrjdLFyeZR4nMHBel4sbSMXkmRDKo5FqKdy9yHC7QHavat588bl/Lv7v35V14tZOZ5PtfDVI3fieClIzavjcPog5tQS/WK3RWtkjLIdOu33lDDebLDK4WSt4zS//cjfv+PIQoy2H0W30PedRpbtmsDad+SK28evtbbYb5o8n1yFZ0DAqR6sK8xewAK1RSmxMhlK9yY46mrlg594k4/euJMP+z5LaH85lT39BSPhKo2p7Oo6et/n4OGWHdzgO8n3X7yJkiOLX0/VcIj0ujqyIQ3DJSj5WQrhdNDzQCnJDWk+u/E5HvIfpFE7s4xeWIr7m767efvtFbQ+NYB5suOy91hIjeZkApHOUPtSKZ39jTz7K6u51dPO5ncM8BYWMSvHv03cyPeObObRVfu4zluYGf7ByBb2P9tKzbYMVnsHcg7DG1yJ6Uzo3Az8CnBQCLFv6rM/pGBAfV8I8WtAN/CLc1kwmclSuidKNhLhzfe5cYk8eanxpVMfoquzjIanJZ6OuYliHmOMQbrxEWSHfB6AFayhgZUcZAd9shOTPBQ0zznSyGMlktS8lqFrcAV3b/4dPKUpNlf3cF/kMB/1jZy3o+0cj02W8vOxtezY24I2qaDmBIFTktC+EayJ2Iz0uXDj5N27HuabYEeWg68288YHT7LZUWgQb6SaOfpaE/Wd049ZM12NTG2cKGosE2kIyKhM5NzkKvOkhx1Yi1RPrXSGsrcmcI8FWDX0WWhKsqZ6gA9VvE2zY/CSO7sO53N8a+wmhrIBJnJu+mJBYhMe/PtchPos/KdiiIFhzPM2iyx6W8xkEYOjlP2khLs7f598qYEjmOWepuM0uEdpcozQnw/TnY3wo8MbcLa7adg1geib3s7hYm6LZxhfF2JsHQSVLK+nlvMXrz1A/QmjEKF9GktmC9kWte5hqiQ8WXMDz7W0cvf6IxxvKOdkw3oiByF8LIFyug8rkZx27CetphqrLMTI5iDjGy3uuW4fJ+LlvNjbQtUbEt/pScYXuZ6i62SDKoM3QWXrEEdvawBVsrX5OFtDndzlPUqZIshLk0N5wVvpJn7Qu5nh16ppeCsHo+NXvMWCtkXLROZBS5q4h1X+4Sf38v/qb+PT67YxnPMzkvPx9kAdyZgLR68D97Cgss/kueqbeNp7EwCucUnt0RSOzpF37UCcb6aza28bXHKe+X1zW5zz7pvPIQ8cI7j8el5LtOIUBlmpMbijispjEtezuzHnKFhfSJRyNx++6HdndifslC8yKcevXPtmg5TIbBZt+yEq3nbh628lURPg9Y2tpFY7uN395Fl3ujOGowo8OXwPew810vJYCq17uBBaIZ3BTCZnrA8KGhcaR0+Uyp1l7LiziQ/7DxXKEW2kcqeJoyc67bn/6Wp8QT5+TcSck6aJyCmkDAeecJqc30HFItVTmc8h9x/Fd9xF4M0gI/c1sX/9cpStkq2hLiqDe9+VKw9gR7qFn7SvJR9zok2qePoElYMWwafexsrlkZb5rhehxW6LMp/DjOYI//w4kTf9pFvKSVR7eeau1ZSWxFldMkjHZAkD0QCVP3Hi74hj7Zv+DrtibotniDcIAivH8CsW+5N1lO1Q8XREsab5hr+QbdEYHILBIapqrmNsIswjv/oE3tIc26pa+KbndsBHSaoMdUzHmoghTQukhZzKOSqUMzkvFVAUhKZh1JUSb/AwfmuO21vb+R9VL3D/3l8lcShC1a5uzJHRRa+naCqGW6GqdYh/bXuMiVYNHYsW3YWFxEIhIy3GrRw7U6v58eA6Bt+spu71NMqre6c1AbHgGi0TLWXgHlcJPmsQXenih6ENTEx6yE86CO/TiAyY+HecxoonsJJJfF4vQi+YMTKXx0qlFsV3o+gjm/tfaWfHpzed/X35UC8ymZozI6qYkPkcpmni3X4Cn9NBxUteEr4KPhn8jxc9XotlWZUYRfYPYWazhc7hKv2MFhqrpx/v2AQTn6s+q1OLZfF2nji73POeYypvlPQbVLgnOXyiiUjP4vu/W9kscnSM0mcsyl73kghW8JKzmhectyAvsvlEyZqsmEiBEUcYJmSyyHwes4iSv14KMzaJSCRxjU/gcrsofTOAdGoM6PW4DYvl+QwM9SIz2TnL11UUCEGuLcWfrHwOv6JyNFZJ6c9OFXy/ihjfqyfwHwjypYFPkWgQ+LeO0NLWS2hjYSlyKOWn60gjvm6FyLE8Sr7w1NKlGpmIQqJeojQkaa4YYWt4Dx4lx7jhZdtQEzfs/l3qn7GoOtKHOTQy58EcZ0U6g7c/x2jGiQ40aBJ9ajhvz+fYnl7ONztuYqgvTOVLKt7BHMtP92CNTyxiqNcrox48jU/TkIZB5TEP1vYwpWYKzARiMoHM5jDj8UK4Ego+xpxZrVnEsa/oDSkzGoVd55zFlp759A4s85xz3GDhn0ttgj8TwPFaRmazhYE1Gj2rcynomgv0QZ3X/CvwdQs8Q0WQ40zKQqDCkREYObeUdTkf82v2OVpmYcYsn4PJSRg650+7pAyn8xEC4XAQ9KdY7+xDRyOd11GGeha7ZFfEjEYRiSSle1w4J4MMBEqYqPJQXRLjprLT1LmjxBpdRF0BTKeOMtWc0hUS02/gLU/SVj7Iav8AES3JuOHlzeFGBk6WEdmn4D02hNHZvbgiz0NmcziiGZIdQf5Hzd141SyKkKhYtCfKOTVeSvJomGCfIPz2MIxFMRY6b+UsOD9EgRWPw+DQ5U+Qck7DXcyWojekbGzec1gmMmvS9N/eRqgqMm+cfQOzsZkvFI8HJRKmLhBjlcODKS0Uce2YjTKfQx48jveQQvNPtUJqoqCfJz5xC5mGHJubO1nbcJBb7j7OmOkD4C53P8fzbr45fBs7+xt468Bygkc1fAMmgVdPszIzikynMYqs/ZnRKLw9QfMhBx2aBorv3JdWmkrZjTQ7wJKYFwm2aTO32IaUjU2RIrNLbNnIprhRzs0t5qXJ0Xye8aSHmkUs0oyZmqGQWRPLNBG5HBW7K0h16Rw90cJBXzPf8t+KMAQIsHwmIqPgGlZxjkFFzMLfm0aLpgs+VcVshEz51l6rCZSXErYhZWNjY2MDVsHHxJAKCSvLG6lmkrHF2z14tUjDQBoGzqffwgnMJB9NMfsR2RQftiFlY2NjY1PIDTgySubP1vBA2e+ipyTNg9MPQWJj817FNqRsbGxsbApR5TMmjmd3M7NwwDY2723EpZJjzsvNhBgBksDogt109pRyYTkbpJRlVzppqWu8xvTB0tdo19NLsNQ1XuP6YOlrtOvpFEtd44IaUgBCiN1Syi0LetNZcDXlXOoarxV9sPQ12vV0/s5dSOx6Oj/nLiS2xvk7dyGZTTmnkWbUxsbGxsbGxsbmYtiGlI2NjY2NjY3NLFkMQ+rq0scvHFdTzqWu8VrRB0tfo11P5+/chcSup/Nz7kJia5y/cxeSGZdzwX2kbGxsbGxsbGyWCvbSno2NjY2NjY3NLLENKRsbGxsbGxubWbJghpQQ4n4hxHEhxEkhxBcX6r5XQghRJ4R4WQhxVAhxWAjx+anPvySE6BNC7Jv6ef80rmVrXCTmSmOx6oOlr9Gup7bGd1ynKPXB0tdo19OZaURKOe8/gAqcApoAB7AfaFuIe0+jbFXApqn/+4F2oA34EvCfbI3vHY3FrO+9oNGup7bGa0Hfe0GjXU+nr1FKuWAzUtcBJ6WUp6WUOeC7wMMLdO/LIqUckFK+PfX/OHAUZpXw3Na4iMyRxqLVB0tfo11PZ8RS11i0+mDpa7Tr6cxYKEOqBug57/deZlng+UQIsQzYCOyc+uhzQogDQohvCiGulDzc1lgkXIXGa0IfLH2Ndj19z2u8JvTB0tdo19MralwwQ0pc5LOiirsghPABPwS+IKWcBP4eWA5sAAaAv7zSJS7yma1xgblKjUWvD5a+Rrue2hq5BvTB0tdo19NpaVwwQ6oXqDvv91qgf4HufUWEEDqFP+R3pJQ/ApBSDkkpTSmlBfwDhSnKy2FrXGTmQGNR64Olr9Gup7bGKYpaHyx9jXY9nbbGBTOk3gKahRCNQggH8FHgxwt078sihBDAPwJHpZR/dd7nVecd9kHg0BUuZWtcROZIY9Hqg6Wv0a6nZ7E1FrE+WPoa7Xp6luloXJhde7LgFf9+Cl7xp4D/slD3nUa5bqEw1XgA2Df1837gX4CDU5//GKiyNS59jcWq772g0a6ntsZrQd97QaNdT2em0U4RY2NjY2NjY2MzS+zI5jY2NjY2NjY2s8Q2pGxsbGxsbGxsZoltSNnY2NjY2NjYzBLbkLKxsbGxsbGxmSW2IWVjY2NjY2NjM0tsQ8rGxsbGxsbGZpbYhpSNjY2NjY2NzSz5/zlHSon0X6T7AAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "print(MNIST['Train']['Features'][0][130:180])\n", + "print(MNIST['Train']['Labels'][0])\n", + "features = MNIST['Train']['Features'].astype(np.float32) / 256.0\n", + "labels = MNIST['Train']['Labels']\n", + "fig = plt.figure(figsize=(10,5))\n", + "for i in range(10):\n", + " ax = fig.add_subplot(1,10,i+1)\n", + " plt.imshow(features[i].reshape(28,28))\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "កូដសម្រាប់បង្កើត dataset *one-vs-other* សម្រាប់ការបែងចែកប្រភេទពីរជួរខ្ទង់។ អ្នកត្រូវកែសម្រួលកូដនេះដើម្បីបង្កើត dataset *one-vs-all*។\n" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [], + "source": [ + "def set_mnist_pos_neg(positive_label, negative_label):\n", + " positive_indices = [i for i, j in enumerate(MNIST['Train']['Labels']) \n", + " if j == positive_label]\n", + " negative_indices = [i for i, j in enumerate(MNIST['Train']['Labels']) \n", + " if j == negative_label]\n", + "\n", + " positive_images = MNIST['Train']['Features'][positive_indices]\n", + " negative_images = MNIST['Train']['Features'][negative_indices]\n", + "\n", + " return positive_images, negative_images" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ឥឡូវអ្នកត្រូវតែ៖\n", + "1. បង្កើតឃ្លាំងទិន្នន័យ *one-vs-all* ចំនួន 10 សម្រាប់ពុម្ពលេខទាំងអស់\n", + "2. បណ្តុះបណ្តាល perceptrons ចំនួន 10\n", + "3. កំណត់មុខងារ `classify` ដើម្បីអនុវត្តការបែងចែកពុម្ពលេខ\n", + "4. វាស់ប្រាក់កម្រៃនៃការបែងចែក និងព្រីន *confusion matrix*\n", + "5. [ជាជម្រើស] បង្កើតមុខងារ `classify` ដល់កម្រិតល្អប្រសើរដែលអនុវត្តការបែងចែកដោយប្រើការពាក់ព័ន្ធម៉ាទ្រិចតែមួយ។\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**ការបដិសេធ**: \nឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលយើងខិតខំប្រឹងប្រែងដើម្បីភាពត្រឹមត្រូវ សូមយល់ថាការបកប្រែដោយគ្រឿងយន្តអាចមានកំហុស ឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមក្នុងភាសាមូលដ្ឋានគួរត្រូវបានពិចារណានូវប្រភពដែលមានអំណាច។ សម្រាប់ព័ត៌មានសំខាន់ ការបកប្រែដោយមនុស្សដែលមានជំនាញគឺជាគន្លងណែនាំ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកប្រែខុសពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។\n\n" + ] + } + ], + "metadata": { + "celltoolbar": "Slideshow", + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.5" + }, + "livereveal": { + "start_slideshow_at": "selected" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} \ No newline at end of file diff --git a/translations/km/lessons/3-NeuralNetworks/03-Perceptron/lab/README.md b/translations/km/lessons/3-NeuralNetworks/03-Perceptron/lab/README.md new file mode 100644 index 00000000..0fa03429 --- /dev/null +++ b/translations/km/lessons/3-NeuralNetworks/03-Perceptron/lab/README.md @@ -0,0 +1,26 @@ +# ចំណាត់ថ្នាក់ច្រើនថ្នាក់ជាមួយ Perceptron + +ការចាត់តាំងមើលល្បិចពី [មេរៀន AI សម្រាប់អ្នកចាប់ផ្តើម](https://github.com/microsoft/ai-for-beginners)។ + +## ការងារ + +ដោយប្រើកូដដែលយើងបានអភិវឌ្ឍក្នុងមេរៀននេះសម្រាប់ចំណាត់ថ្នាក់ពីរភាគសាស្ត្រចំនួនអក្សរដៃ MNIST សូមបង្កើតចំណាត់ថ្នាក់ច្រើនថ្នាក់ទាំងមូលដែលអាចស្គាល់លេខណាមួយបាន។ គណនាការពិតនៃចំណាត់ថ្នាក់លើទិន្នន័យបណ្តុះបណ្តាល និងចេញតារាងកំហុស។ + +## ពីរបៀប + +1. សម្រាប់លេខនីមួយៗ បង្កើតទិន្នន័យសម្រាប់ចំណាត់ថ្នាក់ពីរភាគសាស្ត្រដោយប្រើ "លេខនេះប្រៀបធៀបទៅនឹងលេខផ្សេងទៀតទាំងអស់" +1. បណ្តុះ Perceptron ទាំង ១០ សម្រាប់ចំណាត់ថ្នាក់ពីរភាគសាស្ត្រ (មួយសម្រាប់លេខមួយៗ) +1. កំណត់មុខងារមួយដែលអាចចំណាត់ថ្នាក់លេខដែលបញ្ចូល + +> **កំណត់ចំណាំ**៖ ប្រសិនបើយើងផ្គុំទម្ងន់របស់ Perceptron ទាំង ១០ ទៅក្នុងម៉ាទ្រីសមួយ យើងគួរតែអាចអនុវត្ត Perceptron ទាំង ១០ ទៅលើលេខបញ្ចូលដោយប្រើការបូកគុណម៉ាទ្រីស៍តែមួយបាន។ លេខដែលមានប្រភេទខ្ពស់បំផុតអាចរកឃើញដោយប្រើសកម្មភាព `argmax` លើលទ្ធផល។ + +## សៀវភៅចាប់ផ្តើម + +ចាប់ផ្តើមមើលល្បិចដោយបើក [PerceptronMultiClass.ipynb](PerceptronMultiClass.ipynb) + +--- + + +**ការប្រកាស**៖ +ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ យើងខិតខំរកភាពត្រឹមត្រូវ ប៉ុន្តែសូមយល់ដឹងថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុស ឬមិនត្រឹមត្រូវ។ ឯកសារដើមនៅក្នុងភាសាជាតិរបស់វាគួរឱ្យត្រូវបានគេចាត់ទុកជាឈុតឯកសារផ្លូវការដែលមានអំណាច។ សម្រាប់ព័ត៌មានសំខាន់ យើងផ្ដល់អនុសាសន៍ឲ្យមានការបកប្រែដោយមនុស្សដែលជាប្រពន្ធដៃវិជ្ជាជីវៈ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការពន្យល់មិនត្រឹមត្រូវណាមួយដែលកើតឡើងពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។ + \ No newline at end of file diff --git a/translations/km/lessons/3-NeuralNetworks/04-OwnFramework/OwnFramework.ipynb b/translations/km/lessons/3-NeuralNetworks/04-OwnFramework/OwnFramework.ipynb new file mode 100644 index 00000000..4c2ff601 --- /dev/null +++ b/translations/km/lessons/3-NeuralNetworks/04-OwnFramework/OwnFramework.ipynb @@ -0,0 +1,1339 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Multi-Layered Perceptrons\n", + "## ការបង្កើតស៊ុមប្រព័ន្ធប្រសារជាសូន្យរបស់យើងឯង\n", + "\n", + "> សៀវភៅកំណត់ត្រានេះជាពាណិជ្ជកម្មមួយខ្នាតសម្រាប់ [មេរៀន AI សម្រាប់អ្នកចាប់ផ្តើម](http://github.com/microsoft/ai-for-beginners)។ សូមចូលទៅកាន់ repository សម្រាប់បានសមាសធាត្ររៀនទាំងមូល។\n", + "\n", + "នៅក្នុងសៀវភៅកំណត់ត្រានេះ យើងនឹងបង្កើតស៊ុមប្រព័ន្ធប្រសារជាសូន្យផ្ទាល់ខ្លួនដែលអាចដោះស្រាយបញ្ហាចំណាត់ថ្នាក់ពហុថ្នាក់ និងក៏បញ្ហាការប្រែប្រួលជាមួយ preceptrons ប្រកបដោយស្រទាប់ច្រើន។\n", + "\n", + "ដំបូង យើងខ្ទង់បញ្ចូលបណ្ណាល័យខ្លះៗដែលត្រូវការ។\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [], + "source": [ + "%matplotlib nbagg\n", + "import matplotlib.pyplot as plt \n", + "from matplotlib import gridspec\n", + "from sklearn.datasets import make_classification\n", + "import numpy as np\n", + "# pick the seed for reproducibility - change it to explore the effects of random variations\n", + "np.random.seed(0)\n", + "import random" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## សំណុំទិន្នន័យគំរូ\n", + "\n", + "ដូចដែលមុន ពួកយើងនឹងចាប់ផ្តើមជាមួយសំណុំទិន្នន័យគំរូសាមញ្ញមួយមានប៉ារ៉ាម៉ែត្រ២។\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "scrolled": false, + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [], + "source": [ + "n = 100\n", + "X, Y = make_classification(n_samples = n, n_features=2,\n", + " n_redundant=0, n_informative=2, flip_y=0.2)\n", + "X = X.astype(np.float32)\n", + "Y = Y.astype(np.int32)\n", + "\n", + "# Split into train and test dataset\n", + "train_x, test_x = np.split(X, [n*8//10])\n", + "train_labels, test_labels = np.split(Y, [n*8//10])" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "scrolled": false, + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [], + "source": [ + "def plot_dataset(suptitle, features, labels):\n", + " # prepare the plot\n", + " fig, ax = plt.subplots(1, 1)\n", + " #pylab.subplots_adjust(bottom=0.2, wspace=0.4)\n", + " fig.suptitle(suptitle, fontsize = 16)\n", + " ax.set_xlabel('$x_i[0]$ -- (feature 1)')\n", + " ax.set_ylabel('$x_i[1]$ -- (feature 2)')\n", + "\n", + " colors = ['r' if l else 'b' for l in labels]\n", + " ax.scatter(features[:, 0], features[:, 1], marker='o', c=colors, s=100, alpha = 0.5)\n", + " fig.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "scrolled": false, + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.get_websocket_type = function () {\n if (typeof WebSocket !== 'undefined') {\n return WebSocket;\n } else if (typeof MozWebSocket !== 'undefined') {\n return MozWebSocket;\n } else {\n alert(\n 'Your browser does not have WebSocket support. ' +\n 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n 'Firefox 4 and 5 are also supported but you ' +\n 'have to enable WebSockets in about:config.'\n );\n }\n};\n\nmpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n this.id = figure_id;\n\n this.ws = websocket;\n\n this.supports_binary = this.ws.binaryType !== undefined;\n\n if (!this.supports_binary) {\n var warnings = document.getElementById('mpl-warnings');\n if (warnings) {\n warnings.style.display = 'block';\n warnings.textContent =\n 'This browser does not support binary websocket messages. ' +\n 'Performance may be slow.';\n }\n }\n\n this.imageObj = new Image();\n\n this.context = undefined;\n this.message = undefined;\n this.canvas = undefined;\n this.rubberband_canvas = undefined;\n this.rubberband_context = undefined;\n this.format_dropdown = undefined;\n\n this.image_mode = 'full';\n\n this.root = document.createElement('div');\n this.root.setAttribute('style', 'display: inline-block');\n this._root_extra_style(this.root);\n\n parent_element.appendChild(this.root);\n\n this._init_header(this);\n this._init_canvas(this);\n this._init_toolbar(this);\n\n var fig = this;\n\n this.waiting = false;\n\n this.ws.onopen = function () {\n fig.send_message('supports_binary', { value: fig.supports_binary });\n fig.send_message('send_image_mode', {});\n if (fig.ratio !== 1) {\n fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\n }\n fig.send_message('refresh', {});\n };\n\n this.imageObj.onload = function () {\n if (fig.image_mode === 'full') {\n // Full images could contain transparency (where diff images\n // almost always do), so we need to clear the canvas so that\n // there is no ghosting.\n fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n }\n fig.context.drawImage(fig.imageObj, 0, 0);\n };\n\n this.imageObj.onunload = function () {\n fig.ws.close();\n };\n\n this.ws.onmessage = this._make_on_message_function(this);\n\n this.ondownload = ondownload;\n};\n\nmpl.figure.prototype._init_header = function () {\n var titlebar = document.createElement('div');\n titlebar.classList =\n 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n var titletext = document.createElement('div');\n titletext.classList = 'ui-dialog-title';\n titletext.setAttribute(\n 'style',\n 'width: 100%; text-align: center; padding: 3px;'\n );\n titlebar.appendChild(titletext);\n this.root.appendChild(titlebar);\n this.header = titletext;\n};\n\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._init_canvas = function () {\n var fig = this;\n\n var canvas_div = (this.canvas_div = document.createElement('div'));\n canvas_div.setAttribute(\n 'style',\n 'border: 1px solid #ddd;' +\n 'box-sizing: content-box;' +\n 'clear: both;' +\n 'min-height: 1px;' +\n 'min-width: 1px;' +\n 'outline: 0;' +\n 'overflow: hidden;' +\n 'position: relative;' +\n 'resize: both;'\n );\n\n function on_keyboard_event_closure(name) {\n return function (event) {\n return fig.key_event(event, name);\n };\n }\n\n canvas_div.addEventListener(\n 'keydown',\n on_keyboard_event_closure('key_press')\n );\n canvas_div.addEventListener(\n 'keyup',\n on_keyboard_event_closure('key_release')\n );\n\n this._canvas_extra_style(canvas_div);\n this.root.appendChild(canvas_div);\n\n var canvas = (this.canvas = document.createElement('canvas'));\n canvas.classList.add('mpl-canvas');\n canvas.setAttribute('style', 'box-sizing: content-box;');\n\n this.context = canvas.getContext('2d');\n\n var backingStore =\n this.context.backingStorePixelRatio ||\n this.context.webkitBackingStorePixelRatio ||\n this.context.mozBackingStorePixelRatio ||\n this.context.msBackingStorePixelRatio ||\n this.context.oBackingStorePixelRatio ||\n this.context.backingStorePixelRatio ||\n 1;\n\n this.ratio = (window.devicePixelRatio || 1) / backingStore;\n\n var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n 'canvas'\n ));\n rubberband_canvas.setAttribute(\n 'style',\n 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n );\n\n // Apply a ponyfill if ResizeObserver is not implemented by browser.\n if (this.ResizeObserver === undefined) {\n if (window.ResizeObserver !== undefined) {\n this.ResizeObserver = window.ResizeObserver;\n } else {\n var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n this.ResizeObserver = obs.ResizeObserver;\n }\n }\n\n this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n var nentries = entries.length;\n for (var i = 0; i < nentries; i++) {\n var entry = entries[i];\n var width, height;\n if (entry.contentBoxSize) {\n if (entry.contentBoxSize instanceof Array) {\n // Chrome 84 implements new version of spec.\n width = entry.contentBoxSize[0].inlineSize;\n height = entry.contentBoxSize[0].blockSize;\n } else {\n // Firefox implements old version of spec.\n width = entry.contentBoxSize.inlineSize;\n height = entry.contentBoxSize.blockSize;\n }\n } else {\n // Chrome <84 implements even older version of spec.\n width = entry.contentRect.width;\n height = entry.contentRect.height;\n }\n\n // Keep the size of the canvas and rubber band canvas in sync with\n // the canvas container.\n if (entry.devicePixelContentBoxSize) {\n // Chrome 84 implements new version of spec.\n canvas.setAttribute(\n 'width',\n entry.devicePixelContentBoxSize[0].inlineSize\n );\n canvas.setAttribute(\n 'height',\n entry.devicePixelContentBoxSize[0].blockSize\n );\n } else {\n canvas.setAttribute('width', width * fig.ratio);\n canvas.setAttribute('height', height * fig.ratio);\n }\n canvas.setAttribute(\n 'style',\n 'width: ' + width + 'px; height: ' + height + 'px;'\n );\n\n rubberband_canvas.setAttribute('width', width);\n rubberband_canvas.setAttribute('height', height);\n\n // And update the size in Python. We ignore the initial 0/0 size\n // that occurs as the element is placed into the DOM, which should\n // otherwise not happen due to the minimum size styling.\n if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n fig.request_resize(width, height);\n }\n }\n });\n this.resizeObserverInstance.observe(canvas_div);\n\n function on_mouse_event_closure(name) {\n return function (event) {\n return fig.mouse_event(event, name);\n };\n }\n\n rubberband_canvas.addEventListener(\n 'mousedown',\n on_mouse_event_closure('button_press')\n );\n rubberband_canvas.addEventListener(\n 'mouseup',\n on_mouse_event_closure('button_release')\n );\n rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\n );\n // Throttle sequential mouse events to 1 every 20ms.\n rubberband_canvas.addEventListener(\n 'mousemove',\n on_mouse_event_closure('motion_notify')\n );\n\n rubberband_canvas.addEventListener(\n 'mouseenter',\n on_mouse_event_closure('figure_enter')\n );\n rubberband_canvas.addEventListener(\n 'mouseleave',\n on_mouse_event_closure('figure_leave')\n );\n\n canvas_div.addEventListener('wheel', function (event) {\n if (event.deltaY < 0) {\n event.step = 1;\n } else {\n event.step = -1;\n }\n on_mouse_event_closure('scroll')(event);\n });\n\n canvas_div.appendChild(canvas);\n canvas_div.appendChild(rubberband_canvas);\n\n this.rubberband_context = rubberband_canvas.getContext('2d');\n this.rubberband_context.strokeStyle = '#000000';\n\n this._resize_canvas = function (width, height, forward) {\n if (forward) {\n canvas_div.style.width = width + 'px';\n canvas_div.style.height = height + 'px';\n }\n };\n\n // Disable right mouse context menu.\n this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n event.preventDefault();\n return false;\n });\n\n function set_focus() {\n canvas.focus();\n canvas_div.focus();\n }\n\n window.setTimeout(set_focus, 100);\n};\n\nmpl.figure.prototype._init_toolbar = function () {\n var fig = this;\n\n var toolbar = document.createElement('div');\n toolbar.classList = 'mpl-toolbar';\n this.root.appendChild(toolbar);\n\n function on_click_closure(name) {\n return function (_event) {\n return fig.toolbar_button_onclick(name);\n };\n }\n\n function on_mouseover_closure(tooltip) {\n return function (event) {\n if (!event.currentTarget.disabled) {\n return fig.toolbar_button_onmouseover(tooltip);\n }\n };\n }\n\n fig.buttons = {};\n var buttonGroup = document.createElement('div');\n buttonGroup.classList = 'mpl-button-group';\n for (var toolbar_ind in mpl.toolbar_items) {\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) {\n /* Instead of a spacer, we start a new button group. */\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n buttonGroup = document.createElement('div');\n buttonGroup.classList = 'mpl-button-group';\n continue;\n }\n\n var button = (fig.buttons[name] = document.createElement('button'));\n button.classList = 'mpl-widget';\n button.setAttribute('role', 'button');\n button.setAttribute('aria-disabled', 'false');\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n\n var icon_img = document.createElement('img');\n icon_img.src = '_images/' + image + '.png';\n icon_img.srcset = '_images/' + image + '_large.png 2x';\n icon_img.alt = tooltip;\n button.appendChild(icon_img);\n\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n var fmt_picker = document.createElement('select');\n fmt_picker.classList = 'mpl-widget';\n toolbar.appendChild(fmt_picker);\n this.format_dropdown = fmt_picker;\n\n for (var ind in mpl.extensions) {\n var fmt = mpl.extensions[ind];\n var option = document.createElement('option');\n option.selected = fmt === mpl.default_extension;\n option.innerHTML = fmt;\n fmt_picker.appendChild(option);\n }\n\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n};\n\nmpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n // which will in turn request a refresh of the image.\n this.send_message('resize', { width: x_pixels, height: y_pixels });\n};\n\nmpl.figure.prototype.send_message = function (type, properties) {\n properties['type'] = type;\n properties['figure_id'] = this.id;\n this.ws.send(JSON.stringify(properties));\n};\n\nmpl.figure.prototype.send_draw_message = function () {\n if (!this.waiting) {\n this.waiting = true;\n this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n }\n};\n\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n var format_dropdown = fig.format_dropdown;\n var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n fig.ondownload(fig, format);\n};\n\nmpl.figure.prototype.handle_resize = function (fig, msg) {\n var size = msg['size'];\n if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n fig._resize_canvas(size[0], size[1], msg['forward']);\n fig.send_message('refresh', {});\n }\n};\n\nmpl.figure.prototype.handle_rubberband = function (fig, msg) {\n var x0 = msg['x0'] / fig.ratio;\n var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n var x1 = msg['x1'] / fig.ratio;\n var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n x0 = Math.floor(x0) + 0.5;\n y0 = Math.floor(y0) + 0.5;\n x1 = Math.floor(x1) + 0.5;\n y1 = Math.floor(y1) + 0.5;\n var min_x = Math.min(x0, x1);\n var min_y = Math.min(y0, y1);\n var width = Math.abs(x1 - x0);\n var height = Math.abs(y1 - y0);\n\n fig.rubberband_context.clearRect(\n 0,\n 0,\n fig.canvas.width / fig.ratio,\n fig.canvas.height / fig.ratio\n );\n\n fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n};\n\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n var cursor = msg['cursor'];\n switch (cursor) {\n case 0:\n cursor = 'pointer';\n break;\n case 1:\n cursor = 'default';\n break;\n case 2:\n cursor = 'crosshair';\n break;\n case 3:\n cursor = 'move';\n break;\n }\n fig.rubberband_canvas.style.cursor = cursor;\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n for (var key in msg) {\n if (!(key in fig.buttons)) {\n continue;\n }\n fig.buttons[key].disabled = !msg[key];\n fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n }\n};\n\nmpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n if (msg['mode'] === 'PAN') {\n fig.buttons['Pan'].classList.add('active');\n fig.buttons['Zoom'].classList.remove('active');\n } else if (msg['mode'] === 'ZOOM') {\n fig.buttons['Pan'].classList.remove('active');\n fig.buttons['Zoom'].classList.add('active');\n } else {\n fig.buttons['Pan'].classList.remove('active');\n fig.buttons['Zoom'].classList.remove('active');\n }\n};\n\nmpl.figure.prototype.updated_canvas_event = function () {\n // Called whenever the canvas gets updated.\n this.send_message('ack', {});\n};\n\n// A function to construct a web socket function for onmessage handling.\n// Called in the figure constructor.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\n /* FIXME: We get \"Resource interpreted as Image but\n * transferred with MIME type text/plain:\" errors on\n * Chrome. But how to set the MIME type? It doesn't seem\n * to be part of the websocket stream */\n img.type = 'image/png';\n }\n\n /* Free the memory for the previous frames */\n if (fig.imageObj.src) {\n (window.URL || window.webkitURL).revokeObjectURL(\n fig.imageObj.src\n );\n }\n\n fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n img\n );\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n } else if (\n typeof evt.data === 'string' &&\n evt.data.slice(0, 21) === 'data:image/png;base64'\n ) {\n fig.imageObj.src = evt.data;\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n }\n\n var msg = JSON.parse(evt.data);\n var msg_type = msg['type'];\n\n // Call the \"handle_{type}\" callback, which takes\n // the figure and JSON message as its only arguments.\n try {\n var callback = fig['handle_' + msg_type];\n } catch (e) {\n console.log(\n \"No handler for the '\" + msg_type + \"' message type: \",\n msg\n );\n return;\n }\n\n if (callback) {\n try {\n // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n callback(fig, msg);\n } catch (e) {\n console.log(\n \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n e,\n e.stack,\n msg\n );\n }\n }\n };\n};\n\n// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.findpos = function (e) {\n //this section is from http://www.quirksmode.org/js/events_properties.html\n var targ;\n if (!e) {\n e = window.event;\n }\n if (e.target) {\n targ = e.target;\n } else if (e.srcElement) {\n targ = e.srcElement;\n }\n if (targ.nodeType === 3) {\n // defeat Safari bug\n targ = targ.parentNode;\n }\n\n // pageX,Y are the mouse positions relative to the document\n var boundingRect = targ.getBoundingClientRect();\n var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n\n return { x: x, y: y };\n};\n\n/*\n * return a copy of an object with only non-object keys\n * we need this to avoid circular references\n * http://stackoverflow.com/a/24161582/3208463\n */\nfunction simpleKeys(original) {\n return Object.keys(original).reduce(function (obj, key) {\n if (typeof original[key] !== 'object') {\n obj[key] = original[key];\n }\n return obj;\n }, {});\n}\n\nmpl.figure.prototype.mouse_event = function (event, name) {\n var canvas_pos = mpl.findpos(event);\n\n if (name === 'button_press') {\n this.canvas.focus();\n this.canvas_div.focus();\n }\n\n var x = canvas_pos.x * this.ratio;\n var y = canvas_pos.y * this.ratio;\n\n this.send_message(name, {\n x: x,\n y: y,\n button: event.button,\n step: event.step,\n guiEvent: simpleKeys(event),\n });\n\n /* This prevents the web browser from automatically changing to\n * the text insertion cursor when the button is pressed. We want\n * to control all of the cursor setting manually through the\n * 'cursor' event from matplotlib */\n event.preventDefault();\n return false;\n};\n\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.figure.prototype.toolbar_button_onclick = function (name) {\n if (name === 'download') {\n this.handle_save(this, null);\n } else {\n this.send_message('toolbar_button', { name: name });\n }\n};\n\nmpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n this.message.textContent = tooltip;\n};\n\n///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n// prettier-ignore\nvar _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\nmpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar comm_websocket_adapter = function (comm) {\n // Create a \"websocket\"-like object which calls the given IPython comm\n // object with the appropriate methods. Currently this is a non binary\n // socket, so there is still some room for performance tuning.\n var ws = {};\n\n ws.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\n\n ws.close = function () {\n comm.close();\n };\n ws.send = function (m) {\n //console.log('sending', m);\n comm.send(m);\n };\n // Register the callback with on_msg.\n comm.on_msg(function (msg) {\n //console.log('receiving', msg['content']['data'], msg);\n var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.mpl_figure_comm = function (comm, msg) {\n // This is the function which gets called when the mpl process\n // starts-up an IPython Comm through the \"matplotlib\" channel.\n\n var id = msg.content.data.id;\n // Get hold of the div created by the display call when the Comm\n // socket was opened in Python.\n var element = document.getElementById(id);\n var ws_proxy = comm_websocket_adapter(comm);\n\n function ondownload(figure, _format) {\n window.open(figure.canvas.toDataURL());\n }\n\n var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n\n // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n // web socket which is closed, not our websocket->open comm proxy.\n ws_proxy.onopen();\n\n fig.parent_element = element;\n fig.cell_info = mpl.find_output_cell(\"
\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.on(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\nmpl.figure.prototype.handle_close = function (fig, msg) {\n var width = fig.canvas.width / fig.ratio;\n fig.cell_info[0].output_area.element.off(\n 'cleared',\n fig._remove_fig_handler\n );\n fig.resizeObserverInstance.unobserve(fig.canvas_div);\n\n // Update the output cell to use the data from the current canvas.\n fig.push_to_output();\n var dataURL = fig.canvas.toDataURL();\n // Re-enable the keyboard manager in IPython - without this line, in FF,\n // the notebook keyboard shortcuts fail.\n IPython.keyboard_manager.enable();\n fig.parent_element.innerHTML =\n '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.figure.prototype.push_to_output = function (_remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width / this.ratio;\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] =\n '';\n};\n\nmpl.figure.prototype.updated_canvas_event = function () {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message('ack', {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () {\n fig.push_to_output();\n }, 1000);\n};\n\nmpl.figure.prototype._init_toolbar = function () {\n var fig = this;\n\n var toolbar = document.createElement('div');\n toolbar.classList = 'btn-toolbar';\n this.root.appendChild(toolbar);\n\n function on_click_closure(name) {\n return function (_event) {\n return fig.toolbar_button_onclick(name);\n };\n }\n\n function on_mouseover_closure(tooltip) {\n return function (event) {\n if (!event.currentTarget.disabled) {\n return fig.toolbar_button_onmouseover(tooltip);\n }\n };\n }\n\n fig.buttons = {};\n var buttonGroup = document.createElement('div');\n buttonGroup.classList = 'btn-group';\n var button;\n for (var toolbar_ind in mpl.toolbar_items) {\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) {\n /* Instead of a spacer, we start a new button group. */\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n buttonGroup = document.createElement('div');\n buttonGroup.classList = 'btn-group';\n continue;\n }\n\n button = fig.buttons[name] = document.createElement('button');\n button.classList = 'btn btn-default';\n button.href = '#';\n button.title = name;\n button.innerHTML = '';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\nmpl.figure.prototype._remove_fig_handler = function (event) {\n var fig = event.data.fig;\n if (event.target !== this) {\n // Ignore bubbled events from children.\n return;\n }\n fig.close_ws(fig, {});\n};\n\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.figure.prototype._canvas_extra_style = function (el) {\n // this is important to make the div 'focusable\n el.setAttribute('tabindex', 0);\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n } else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n};\n\nmpl.figure.prototype._key_event_extra = function (event, _name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager) {\n manager = IPython.keyboard_manager;\n }\n\n // Check for shift+enter\n if (event.shiftKey && event.which === 13) {\n this.canvas_div.blur();\n // select the cell after this one\n var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n IPython.notebook.select(index + 1);\n }\n};\n\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.find_output_cell = function (html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i = 0; i < ncells; i++) {\n var cell = cells[i];\n if (cell.cell_type === 'code') {\n for (var j = 0; j < cell.output_area.outputs.length; j++) {\n var data = cell.output_area.outputs[j];\n if (data.data) {\n // IPython >= 3 moved mimebundle to data attribute of output\n data = data.data;\n }\n if (data['text/html'] === html_output) {\n return [cell, data, j];\n }\n }\n }\n }\n};\n\n// Register the function which deals with the matplotlib target/channel.\n// The kernel may be null if the page has been refreshed.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_dataset('Scatterplot of the training data', train_x, train_labels)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 1.3382818 -0.98613256]\n", + " [ 0.5128146 0.43299454]\n", + " [-0.4473693 -0.2680512 ]\n", + " [-0.9865851 -0.28692 ]\n", + " [-1.0693829 0.41718036]]\n", + "[1 1 0 0 0]\n" + ] + } + ], + "source": [ + "print(train_x[:5])\n", + "print(train_labels[:5])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## បញ្ហា Machine Learning\n", + "\n", + "សូមសន្និដ្ឋានថាយើងមានឌាតាសែតបញ្ចូល $\\langle X,Y\\rangle$, ដែល $X$ ជាសំណុំលក្ខណៈ Features និង $Y$ ជាអត្តសញ្ញាណ Label ដែលខ្លួនប៉ុនប៉ង។ សម្រាប់បញ្ហាការព្យាករណ៍ Regression, $y_i\\in\\mathbb{R}$ និងសម្រាប់បញ្ហាការបែងចែក Classfication វាត្រូវបានតំណាងដោយលេខថ្នាក់ $y_i\\in\\{0,\\dots,n\\}$។\n", + "\n", + "ម៉ូដែល machine learning ណាមួយអាចត្រូវបានតំណាងដោយអនុគមន៍ $f_\\theta(x)$ ដែល $\\theta$ គឺជាសំណុំ **ប៉ារ៉ាម៉ែត្រ Parameters**។ គោលបំណងរបស់យើងគឺស្វែងរកប៉ារ៉ាម៉ែត្រ $\\theta$ ដូច្នេះម៉ូដែលរបស់យើងអាចផ្គូផ្គងឌាតា best ដែលបំផុត។ ក្រិតស្នូលត្រូវបានកំណត់ដោយ **អនុគមន៍ការបាត់បង់** $\\mathcal{L}$ ហើយយើងត្រូវស្វែងរកតម្លៃអប្បបរមា optimal value\n", + "\n", + "$$\n", + "\\theta = \\mathrm{argmin}_\\theta \\mathcal{L}(f_\\theta(X),Y)\n", + "$$\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "មុខងារបាត់បង់អាស្រ័យទៅលើបញ្ហាដែលកំពុងដោះស្រាយ។\n", + "\n", + "### មុខងារបាត់បង់សម្រាប់ការសង្ស័យថេរ\n", + "\n", + "សម្រាប់ការសង្ស័យថេរ យើងភាគច្រើនប្រើ **កំហុសសរុប** $\\mathcal{L}_{abs}(\\theta) = \\sum_{i=1}^n |y_i - f_{\\theta}(x_i)|$, ឬ **កំហុសសរុបជាដើម**: $\\mathcal{L}_{sq}(\\theta) = \\sum_{i=1}^n (y_i - f_{\\theta}(x_i))^2$\n" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [], + "source": [ + "# helper function for plotting various loss functions\n", + "def plot_loss_functions(suptitle, functions, ylabels, xlabel):\n", + " fig, ax = plt.subplots(1,len(functions), figsize=(9, 3))\n", + " plt.subplots_adjust(bottom=0.2, wspace=0.4)\n", + " fig.suptitle(suptitle)\n", + " for i, fun in enumerate(functions):\n", + " ax[i].set_xlabel(xlabel)\n", + " if len(ylabels) > i:\n", + " ax[i].set_ylabel(ylabels[i])\n", + " ax[i].plot(x, fun)\n", + " plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.get_websocket_type = function () {\n if (typeof WebSocket !== 'undefined') {\n return WebSocket;\n } else if (typeof MozWebSocket !== 'undefined') {\n return MozWebSocket;\n } else {\n alert(\n 'Your browser does not have WebSocket support. ' +\n 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n 'Firefox 4 and 5 are also supported but you ' +\n 'have to enable WebSockets in about:config.'\n );\n }\n};\n\nmpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n this.id = figure_id;\n\n this.ws = websocket;\n\n this.supports_binary = this.ws.binaryType !== undefined;\n\n if (!this.supports_binary) {\n var warnings = document.getElementById('mpl-warnings');\n if (warnings) {\n warnings.style.display = 'block';\n warnings.textContent =\n 'This browser does not support binary websocket messages. ' +\n 'Performance may be slow.';\n }\n }\n\n this.imageObj = new Image();\n\n this.context = undefined;\n this.message = undefined;\n this.canvas = undefined;\n this.rubberband_canvas = undefined;\n this.rubberband_context = undefined;\n this.format_dropdown = undefined;\n\n this.image_mode = 'full';\n\n this.root = document.createElement('div');\n this.root.setAttribute('style', 'display: inline-block');\n this._root_extra_style(this.root);\n\n parent_element.appendChild(this.root);\n\n this._init_header(this);\n this._init_canvas(this);\n this._init_toolbar(this);\n\n var fig = this;\n\n this.waiting = false;\n\n this.ws.onopen = function () {\n fig.send_message('supports_binary', { value: fig.supports_binary });\n fig.send_message('send_image_mode', {});\n if (fig.ratio !== 1) {\n fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\n }\n fig.send_message('refresh', {});\n };\n\n this.imageObj.onload = function () {\n if (fig.image_mode === 'full') {\n // Full images could contain transparency (where diff images\n // almost always do), so we need to clear the canvas so that\n // there is no ghosting.\n fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n }\n fig.context.drawImage(fig.imageObj, 0, 0);\n };\n\n this.imageObj.onunload = function () {\n fig.ws.close();\n };\n\n this.ws.onmessage = this._make_on_message_function(this);\n\n this.ondownload = ondownload;\n};\n\nmpl.figure.prototype._init_header = function () {\n var titlebar = document.createElement('div');\n titlebar.classList =\n 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n var titletext = document.createElement('div');\n titletext.classList = 'ui-dialog-title';\n titletext.setAttribute(\n 'style',\n 'width: 100%; text-align: center; padding: 3px;'\n );\n titlebar.appendChild(titletext);\n this.root.appendChild(titlebar);\n this.header = titletext;\n};\n\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._init_canvas = function () {\n var fig = this;\n\n var canvas_div = (this.canvas_div = document.createElement('div'));\n canvas_div.setAttribute(\n 'style',\n 'border: 1px solid #ddd;' +\n 'box-sizing: content-box;' +\n 'clear: both;' +\n 'min-height: 1px;' +\n 'min-width: 1px;' +\n 'outline: 0;' +\n 'overflow: hidden;' +\n 'position: relative;' +\n 'resize: both;'\n );\n\n function on_keyboard_event_closure(name) {\n return function (event) {\n return fig.key_event(event, name);\n };\n }\n\n canvas_div.addEventListener(\n 'keydown',\n on_keyboard_event_closure('key_press')\n );\n canvas_div.addEventListener(\n 'keyup',\n on_keyboard_event_closure('key_release')\n );\n\n this._canvas_extra_style(canvas_div);\n this.root.appendChild(canvas_div);\n\n var canvas = (this.canvas = document.createElement('canvas'));\n canvas.classList.add('mpl-canvas');\n canvas.setAttribute('style', 'box-sizing: content-box;');\n\n this.context = canvas.getContext('2d');\n\n var backingStore =\n this.context.backingStorePixelRatio ||\n this.context.webkitBackingStorePixelRatio ||\n this.context.mozBackingStorePixelRatio ||\n this.context.msBackingStorePixelRatio ||\n this.context.oBackingStorePixelRatio ||\n this.context.backingStorePixelRatio ||\n 1;\n\n this.ratio = (window.devicePixelRatio || 1) / backingStore;\n\n var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n 'canvas'\n ));\n rubberband_canvas.setAttribute(\n 'style',\n 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n );\n\n // Apply a ponyfill if ResizeObserver is not implemented by browser.\n if (this.ResizeObserver === undefined) {\n if (window.ResizeObserver !== undefined) {\n this.ResizeObserver = window.ResizeObserver;\n } else {\n var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n this.ResizeObserver = obs.ResizeObserver;\n }\n }\n\n this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n var nentries = entries.length;\n for (var i = 0; i < nentries; i++) {\n var entry = entries[i];\n var width, height;\n if (entry.contentBoxSize) {\n if (entry.contentBoxSize instanceof Array) {\n // Chrome 84 implements new version of spec.\n width = entry.contentBoxSize[0].inlineSize;\n height = entry.contentBoxSize[0].blockSize;\n } else {\n // Firefox implements old version of spec.\n width = entry.contentBoxSize.inlineSize;\n height = entry.contentBoxSize.blockSize;\n }\n } else {\n // Chrome <84 implements even older version of spec.\n width = entry.contentRect.width;\n height = entry.contentRect.height;\n }\n\n // Keep the size of the canvas and rubber band canvas in sync with\n // the canvas container.\n if (entry.devicePixelContentBoxSize) {\n // Chrome 84 implements new version of spec.\n canvas.setAttribute(\n 'width',\n entry.devicePixelContentBoxSize[0].inlineSize\n );\n canvas.setAttribute(\n 'height',\n entry.devicePixelContentBoxSize[0].blockSize\n );\n } else {\n canvas.setAttribute('width', width * fig.ratio);\n canvas.setAttribute('height', height * fig.ratio);\n }\n canvas.setAttribute(\n 'style',\n 'width: ' + width + 'px; height: ' + height + 'px;'\n );\n\n rubberband_canvas.setAttribute('width', width);\n rubberband_canvas.setAttribute('height', height);\n\n // And update the size in Python. We ignore the initial 0/0 size\n // that occurs as the element is placed into the DOM, which should\n // otherwise not happen due to the minimum size styling.\n if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n fig.request_resize(width, height);\n }\n }\n });\n this.resizeObserverInstance.observe(canvas_div);\n\n function on_mouse_event_closure(name) {\n return function (event) {\n return fig.mouse_event(event, name);\n };\n }\n\n rubberband_canvas.addEventListener(\n 'mousedown',\n on_mouse_event_closure('button_press')\n );\n rubberband_canvas.addEventListener(\n 'mouseup',\n on_mouse_event_closure('button_release')\n );\n rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\n );\n // Throttle sequential mouse events to 1 every 20ms.\n rubberband_canvas.addEventListener(\n 'mousemove',\n on_mouse_event_closure('motion_notify')\n );\n\n rubberband_canvas.addEventListener(\n 'mouseenter',\n on_mouse_event_closure('figure_enter')\n );\n rubberband_canvas.addEventListener(\n 'mouseleave',\n on_mouse_event_closure('figure_leave')\n );\n\n canvas_div.addEventListener('wheel', function (event) {\n if (event.deltaY < 0) {\n event.step = 1;\n } else {\n event.step = -1;\n }\n on_mouse_event_closure('scroll')(event);\n });\n\n canvas_div.appendChild(canvas);\n canvas_div.appendChild(rubberband_canvas);\n\n this.rubberband_context = rubberband_canvas.getContext('2d');\n this.rubberband_context.strokeStyle = '#000000';\n\n this._resize_canvas = function (width, height, forward) {\n if (forward) {\n canvas_div.style.width = width + 'px';\n canvas_div.style.height = height + 'px';\n }\n };\n\n // Disable right mouse context menu.\n this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n event.preventDefault();\n return false;\n });\n\n function set_focus() {\n canvas.focus();\n canvas_div.focus();\n }\n\n window.setTimeout(set_focus, 100);\n};\n\nmpl.figure.prototype._init_toolbar = function () {\n var fig = this;\n\n var toolbar = document.createElement('div');\n toolbar.classList = 'mpl-toolbar';\n this.root.appendChild(toolbar);\n\n function on_click_closure(name) {\n return function (_event) {\n return fig.toolbar_button_onclick(name);\n };\n }\n\n function on_mouseover_closure(tooltip) {\n return function (event) {\n if (!event.currentTarget.disabled) {\n return fig.toolbar_button_onmouseover(tooltip);\n }\n };\n }\n\n fig.buttons = {};\n var buttonGroup = document.createElement('div');\n buttonGroup.classList = 'mpl-button-group';\n for (var toolbar_ind in mpl.toolbar_items) {\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) {\n /* Instead of a spacer, we start a new button group. */\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n buttonGroup = document.createElement('div');\n buttonGroup.classList = 'mpl-button-group';\n continue;\n }\n\n var button = (fig.buttons[name] = document.createElement('button'));\n button.classList = 'mpl-widget';\n button.setAttribute('role', 'button');\n button.setAttribute('aria-disabled', 'false');\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n\n var icon_img = document.createElement('img');\n icon_img.src = '_images/' + image + '.png';\n icon_img.srcset = '_images/' + image + '_large.png 2x';\n icon_img.alt = tooltip;\n button.appendChild(icon_img);\n\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n var fmt_picker = document.createElement('select');\n fmt_picker.classList = 'mpl-widget';\n toolbar.appendChild(fmt_picker);\n this.format_dropdown = fmt_picker;\n\n for (var ind in mpl.extensions) {\n var fmt = mpl.extensions[ind];\n var option = document.createElement('option');\n option.selected = fmt === mpl.default_extension;\n option.innerHTML = fmt;\n fmt_picker.appendChild(option);\n }\n\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n};\n\nmpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n // which will in turn request a refresh of the image.\n this.send_message('resize', { width: x_pixels, height: y_pixels });\n};\n\nmpl.figure.prototype.send_message = function (type, properties) {\n properties['type'] = type;\n properties['figure_id'] = this.id;\n this.ws.send(JSON.stringify(properties));\n};\n\nmpl.figure.prototype.send_draw_message = function () {\n if (!this.waiting) {\n this.waiting = true;\n this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n }\n};\n\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n var format_dropdown = fig.format_dropdown;\n var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n fig.ondownload(fig, format);\n};\n\nmpl.figure.prototype.handle_resize = function (fig, msg) {\n var size = msg['size'];\n if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n fig._resize_canvas(size[0], size[1], msg['forward']);\n fig.send_message('refresh', {});\n }\n};\n\nmpl.figure.prototype.handle_rubberband = function (fig, msg) {\n var x0 = msg['x0'] / fig.ratio;\n var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n var x1 = msg['x1'] / fig.ratio;\n var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n x0 = Math.floor(x0) + 0.5;\n y0 = Math.floor(y0) + 0.5;\n x1 = Math.floor(x1) + 0.5;\n y1 = Math.floor(y1) + 0.5;\n var min_x = Math.min(x0, x1);\n var min_y = Math.min(y0, y1);\n var width = Math.abs(x1 - x0);\n var height = Math.abs(y1 - y0);\n\n fig.rubberband_context.clearRect(\n 0,\n 0,\n fig.canvas.width / fig.ratio,\n fig.canvas.height / fig.ratio\n );\n\n fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n};\n\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n var cursor = msg['cursor'];\n switch (cursor) {\n case 0:\n cursor = 'pointer';\n break;\n case 1:\n cursor = 'default';\n break;\n case 2:\n cursor = 'crosshair';\n break;\n case 3:\n cursor = 'move';\n break;\n }\n fig.rubberband_canvas.style.cursor = cursor;\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n for (var key in msg) {\n if (!(key in fig.buttons)) {\n continue;\n }\n fig.buttons[key].disabled = !msg[key];\n fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n }\n};\n\nmpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n if (msg['mode'] === 'PAN') {\n fig.buttons['Pan'].classList.add('active');\n fig.buttons['Zoom'].classList.remove('active');\n } else if (msg['mode'] === 'ZOOM') {\n fig.buttons['Pan'].classList.remove('active');\n fig.buttons['Zoom'].classList.add('active');\n } else {\n fig.buttons['Pan'].classList.remove('active');\n fig.buttons['Zoom'].classList.remove('active');\n }\n};\n\nmpl.figure.prototype.updated_canvas_event = function () {\n // Called whenever the canvas gets updated.\n this.send_message('ack', {});\n};\n\n// A function to construct a web socket function for onmessage handling.\n// Called in the figure constructor.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\n /* FIXME: We get \"Resource interpreted as Image but\n * transferred with MIME type text/plain:\" errors on\n * Chrome. But how to set the MIME type? It doesn't seem\n * to be part of the websocket stream */\n img.type = 'image/png';\n }\n\n /* Free the memory for the previous frames */\n if (fig.imageObj.src) {\n (window.URL || window.webkitURL).revokeObjectURL(\n fig.imageObj.src\n );\n }\n\n fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n img\n );\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n } else if (\n typeof evt.data === 'string' &&\n evt.data.slice(0, 21) === 'data:image/png;base64'\n ) {\n fig.imageObj.src = evt.data;\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n }\n\n var msg = JSON.parse(evt.data);\n var msg_type = msg['type'];\n\n // Call the \"handle_{type}\" callback, which takes\n // the figure and JSON message as its only arguments.\n try {\n var callback = fig['handle_' + msg_type];\n } catch (e) {\n console.log(\n \"No handler for the '\" + msg_type + \"' message type: \",\n msg\n );\n return;\n }\n\n if (callback) {\n try {\n // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n callback(fig, msg);\n } catch (e) {\n console.log(\n \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n e,\n e.stack,\n msg\n );\n }\n }\n };\n};\n\n// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.findpos = function (e) {\n //this section is from http://www.quirksmode.org/js/events_properties.html\n var targ;\n if (!e) {\n e = window.event;\n }\n if (e.target) {\n targ = e.target;\n } else if (e.srcElement) {\n targ = e.srcElement;\n }\n if (targ.nodeType === 3) {\n // defeat Safari bug\n targ = targ.parentNode;\n }\n\n // pageX,Y are the mouse positions relative to the document\n var boundingRect = targ.getBoundingClientRect();\n var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n\n return { x: x, y: y };\n};\n\n/*\n * return a copy of an object with only non-object keys\n * we need this to avoid circular references\n * http://stackoverflow.com/a/24161582/3208463\n */\nfunction simpleKeys(original) {\n return Object.keys(original).reduce(function (obj, key) {\n if (typeof original[key] !== 'object') {\n obj[key] = original[key];\n }\n return obj;\n }, {});\n}\n\nmpl.figure.prototype.mouse_event = function (event, name) {\n var canvas_pos = mpl.findpos(event);\n\n if (name === 'button_press') {\n this.canvas.focus();\n this.canvas_div.focus();\n }\n\n var x = canvas_pos.x * this.ratio;\n var y = canvas_pos.y * this.ratio;\n\n this.send_message(name, {\n x: x,\n y: y,\n button: event.button,\n step: event.step,\n guiEvent: simpleKeys(event),\n });\n\n /* This prevents the web browser from automatically changing to\n * the text insertion cursor when the button is pressed. We want\n * to control all of the cursor setting manually through the\n * 'cursor' event from matplotlib */\n event.preventDefault();\n return false;\n};\n\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.figure.prototype.toolbar_button_onclick = function (name) {\n if (name === 'download') {\n this.handle_save(this, null);\n } else {\n this.send_message('toolbar_button', { name: name });\n }\n};\n\nmpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n this.message.textContent = tooltip;\n};\n\n///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n// prettier-ignore\nvar _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\nmpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar comm_websocket_adapter = function (comm) {\n // Create a \"websocket\"-like object which calls the given IPython comm\n // object with the appropriate methods. Currently this is a non binary\n // socket, so there is still some room for performance tuning.\n var ws = {};\n\n ws.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\n\n ws.close = function () {\n comm.close();\n };\n ws.send = function (m) {\n //console.log('sending', m);\n comm.send(m);\n };\n // Register the callback with on_msg.\n comm.on_msg(function (msg) {\n //console.log('receiving', msg['content']['data'], msg);\n var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.mpl_figure_comm = function (comm, msg) {\n // This is the function which gets called when the mpl process\n // starts-up an IPython Comm through the \"matplotlib\" channel.\n\n var id = msg.content.data.id;\n // Get hold of the div created by the display call when the Comm\n // socket was opened in Python.\n var element = document.getElementById(id);\n var ws_proxy = comm_websocket_adapter(comm);\n\n function ondownload(figure, _format) {\n window.open(figure.canvas.toDataURL());\n }\n\n var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n\n // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n // web socket which is closed, not our websocket->open comm proxy.\n ws_proxy.onopen();\n\n fig.parent_element = element;\n fig.cell_info = mpl.find_output_cell(\"
\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.on(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\nmpl.figure.prototype.handle_close = function (fig, msg) {\n var width = fig.canvas.width / fig.ratio;\n fig.cell_info[0].output_area.element.off(\n 'cleared',\n fig._remove_fig_handler\n );\n fig.resizeObserverInstance.unobserve(fig.canvas_div);\n\n // Update the output cell to use the data from the current canvas.\n fig.push_to_output();\n var dataURL = fig.canvas.toDataURL();\n // Re-enable the keyboard manager in IPython - without this line, in FF,\n // the notebook keyboard shortcuts fail.\n IPython.keyboard_manager.enable();\n fig.parent_element.innerHTML =\n '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.figure.prototype.push_to_output = function (_remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width / this.ratio;\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] =\n '';\n};\n\nmpl.figure.prototype.updated_canvas_event = function () {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message('ack', {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () {\n fig.push_to_output();\n }, 1000);\n};\n\nmpl.figure.prototype._init_toolbar = function () {\n var fig = this;\n\n var toolbar = document.createElement('div');\n toolbar.classList = 'btn-toolbar';\n this.root.appendChild(toolbar);\n\n function on_click_closure(name) {\n return function (_event) {\n return fig.toolbar_button_onclick(name);\n };\n }\n\n function on_mouseover_closure(tooltip) {\n return function (event) {\n if (!event.currentTarget.disabled) {\n return fig.toolbar_button_onmouseover(tooltip);\n }\n };\n }\n\n fig.buttons = {};\n var buttonGroup = document.createElement('div');\n buttonGroup.classList = 'btn-group';\n var button;\n for (var toolbar_ind in mpl.toolbar_items) {\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) {\n /* Instead of a spacer, we start a new button group. */\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n buttonGroup = document.createElement('div');\n buttonGroup.classList = 'btn-group';\n continue;\n }\n\n button = fig.buttons[name] = document.createElement('button');\n button.classList = 'btn btn-default';\n button.href = '#';\n button.title = name;\n button.innerHTML = '';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\nmpl.figure.prototype._remove_fig_handler = function (event) {\n var fig = event.data.fig;\n if (event.target !== this) {\n // Ignore bubbled events from children.\n return;\n }\n fig.close_ws(fig, {});\n};\n\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.figure.prototype._canvas_extra_style = function (el) {\n // this is important to make the div 'focusable\n el.setAttribute('tabindex', 0);\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n } else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n};\n\nmpl.figure.prototype._key_event_extra = function (event, _name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager) {\n manager = IPython.keyboard_manager;\n }\n\n // Check for shift+enter\n if (event.shiftKey && event.which === 13) {\n this.canvas_div.blur();\n // select the cell after this one\n var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n IPython.notebook.select(index + 1);\n }\n};\n\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.find_output_cell = function (html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i = 0; i < ncells; i++) {\n var cell = cells[i];\n if (cell.cell_type === 'code') {\n for (var j = 0; j < cell.output_area.outputs.length; j++) {\n var data = cell.output_area.outputs[j];\n if (data.data) {\n // IPython >= 3 moved mimebundle to data attribute of output\n data = data.data;\n }\n if (data['text/html'] === html_output) {\n return [cell, data, j];\n }\n }\n }\n }\n};\n\n// Register the function which deals with the matplotlib target/channel.\n// The kernel may be null if the page has been refreshed.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x = np.linspace(-2, 2, 101)\n", + "plot_loss_functions(\n", + " suptitle = 'Common loss functions for regression',\n", + " functions = [np.abs(x), np.power(x, 2)],\n", + " ylabels = ['$\\mathcal{L}_{abs}}$ (absolute loss)',\n", + " '$\\mathcal{L}_{sq}$ (squared loss)'],\n", + " xlabel = '$y - f(x_i)$')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### អនុគមន៍ធ្លាក់សម្រាប់ការបែងចែក\n", + "\n", + "សូមយកការបែងចែកពីរជាការពិចារណាផ្អែកមួយ។ នៅក្នុងករណីនេះ យើងមានថ្នាក់ពីរជាលេខ 0 និង 1។ លទ្ធផលនៃបណ្ដាញ $f_\\theta(x_i)\\in [0,1]$ ជាទូទៅកំណត់ប្រហាក់ប្រហែលនៃការជ្រើសរើសថ្នាក់ 1។\n", + "\n", + "**ការខូចខាត 0-1**\n", + "\n", + "ការខូចខាត 0-1 គឺដូចគ្នានឹងការគណនាកម្រិតត្រឹមត្រូវនៃម៉ូដែល - យើងគណនាចំនួនការបែងចែកត្រឹមត្រូវ៖\n", + "\n", + "$$\\mathcal{L}_{0-1} = \\sum_{i=1}^n l_i \\quad l_i = \\begin{cases}\n", + " 0 & (f(x_i)<0.5 \\land y_i=0) \\lor (f(x_i)<0.5 \\land y_i=1) \\\\\n", + " 1 & \\mathrm{ otherwise}\n", + " \\end{cases} \\\\\n", + "$$\n", + "\n", + "ទោះជាយ៉ាងណា កម្រិតត្រឹមត្រូវផ្ទាល់មិនបង្ហាញថាយើងឆ្ងាយពីការបែងចែកត្រឹមត្រូវប៉ុណ្ណាដើម្បី។ វាអាចកើតមានថាយើងខកខានថ្នាក់ត្រឹមត្រូវត្រឹមតែបន្តិចបន្តួច ប៉ុន្តែវាជា \"ល្អជាង\" (នៅក្នុងអារម្មណ៍យើងត្រូវកែប្រែទំងន់តិចជាង) ពីការខកខានយ៉ាងសំខាន់។ ដូច្នេះ ជាញឹកញាប់កំពុងប្រើការខូចខាត logistic ដែលគិតទៅការនេះផង។\n", + "\n", + "**ការខូចខាត Logistic**\n", + "\n", + "$$\\mathcal{L}_{log} = \\sum_{i=1}^n -y\\log(f_{\\theta}(x_i)) - (1-y)\\log(1-f_\\theta(x_i))$$\n" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "x = np.linspace(0,1,100)\n", + "def zero_one(d):\n", + " if d < 0.5:\n", + " return 0\n", + " return 1\n", + "zero_one_v = np.vectorize(zero_one)\n", + "\n", + "def logistic_loss(fx):\n", + " # assumes y == 1\n", + " return -np.log(fx)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\dmitryso\\AppData\\Local\\Temp/ipykernel_55820/331859503.py:10: RuntimeWarning: divide by zero encountered in log\n", + " return -np.log(fx)\n" + ] + }, + { + "data": { + "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.get_websocket_type = function () {\n if (typeof WebSocket !== 'undefined') {\n return WebSocket;\n } else if (typeof MozWebSocket !== 'undefined') {\n return MozWebSocket;\n } else {\n alert(\n 'Your browser does not have WebSocket support. ' +\n 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n 'Firefox 4 and 5 are also supported but you ' +\n 'have to enable WebSockets in about:config.'\n );\n }\n};\n\nmpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n this.id = figure_id;\n\n this.ws = websocket;\n\n this.supports_binary = this.ws.binaryType !== undefined;\n\n if (!this.supports_binary) {\n var warnings = document.getElementById('mpl-warnings');\n if (warnings) {\n warnings.style.display = 'block';\n warnings.textContent =\n 'This browser does not support binary websocket messages. ' +\n 'Performance may be slow.';\n }\n }\n\n this.imageObj = new Image();\n\n this.context = undefined;\n this.message = undefined;\n this.canvas = undefined;\n this.rubberband_canvas = undefined;\n this.rubberband_context = undefined;\n this.format_dropdown = undefined;\n\n this.image_mode = 'full';\n\n this.root = document.createElement('div');\n this.root.setAttribute('style', 'display: inline-block');\n this._root_extra_style(this.root);\n\n parent_element.appendChild(this.root);\n\n this._init_header(this);\n this._init_canvas(this);\n this._init_toolbar(this);\n\n var fig = this;\n\n this.waiting = false;\n\n this.ws.onopen = function () {\n fig.send_message('supports_binary', { value: fig.supports_binary });\n fig.send_message('send_image_mode', {});\n if (fig.ratio !== 1) {\n fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\n }\n fig.send_message('refresh', {});\n };\n\n this.imageObj.onload = function () {\n if (fig.image_mode === 'full') {\n // Full images could contain transparency (where diff images\n // almost always do), so we need to clear the canvas so that\n // there is no ghosting.\n fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n }\n fig.context.drawImage(fig.imageObj, 0, 0);\n };\n\n this.imageObj.onunload = function () {\n fig.ws.close();\n };\n\n this.ws.onmessage = this._make_on_message_function(this);\n\n this.ondownload = ondownload;\n};\n\nmpl.figure.prototype._init_header = function () {\n var titlebar = document.createElement('div');\n titlebar.classList =\n 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n var titletext = document.createElement('div');\n titletext.classList = 'ui-dialog-title';\n titletext.setAttribute(\n 'style',\n 'width: 100%; text-align: center; padding: 3px;'\n );\n titlebar.appendChild(titletext);\n this.root.appendChild(titlebar);\n this.header = titletext;\n};\n\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._init_canvas = function () {\n var fig = this;\n\n var canvas_div = (this.canvas_div = document.createElement('div'));\n canvas_div.setAttribute(\n 'style',\n 'border: 1px solid #ddd;' +\n 'box-sizing: content-box;' +\n 'clear: both;' +\n 'min-height: 1px;' +\n 'min-width: 1px;' +\n 'outline: 0;' +\n 'overflow: hidden;' +\n 'position: relative;' +\n 'resize: both;'\n );\n\n function on_keyboard_event_closure(name) {\n return function (event) {\n return fig.key_event(event, name);\n };\n }\n\n canvas_div.addEventListener(\n 'keydown',\n on_keyboard_event_closure('key_press')\n );\n canvas_div.addEventListener(\n 'keyup',\n on_keyboard_event_closure('key_release')\n );\n\n this._canvas_extra_style(canvas_div);\n this.root.appendChild(canvas_div);\n\n var canvas = (this.canvas = document.createElement('canvas'));\n canvas.classList.add('mpl-canvas');\n canvas.setAttribute('style', 'box-sizing: content-box;');\n\n this.context = canvas.getContext('2d');\n\n var backingStore =\n this.context.backingStorePixelRatio ||\n this.context.webkitBackingStorePixelRatio ||\n this.context.mozBackingStorePixelRatio ||\n this.context.msBackingStorePixelRatio ||\n this.context.oBackingStorePixelRatio ||\n this.context.backingStorePixelRatio ||\n 1;\n\n this.ratio = (window.devicePixelRatio || 1) / backingStore;\n\n var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n 'canvas'\n ));\n rubberband_canvas.setAttribute(\n 'style',\n 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n );\n\n // Apply a ponyfill if ResizeObserver is not implemented by browser.\n if (this.ResizeObserver === undefined) {\n if (window.ResizeObserver !== undefined) {\n this.ResizeObserver = window.ResizeObserver;\n } else {\n var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n this.ResizeObserver = obs.ResizeObserver;\n }\n }\n\n this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n var nentries = entries.length;\n for (var i = 0; i < nentries; i++) {\n var entry = entries[i];\n var width, height;\n if (entry.contentBoxSize) {\n if (entry.contentBoxSize instanceof Array) {\n // Chrome 84 implements new version of spec.\n width = entry.contentBoxSize[0].inlineSize;\n height = entry.contentBoxSize[0].blockSize;\n } else {\n // Firefox implements old version of spec.\n width = entry.contentBoxSize.inlineSize;\n height = entry.contentBoxSize.blockSize;\n }\n } else {\n // Chrome <84 implements even older version of spec.\n width = entry.contentRect.width;\n height = entry.contentRect.height;\n }\n\n // Keep the size of the canvas and rubber band canvas in sync with\n // the canvas container.\n if (entry.devicePixelContentBoxSize) {\n // Chrome 84 implements new version of spec.\n canvas.setAttribute(\n 'width',\n entry.devicePixelContentBoxSize[0].inlineSize\n );\n canvas.setAttribute(\n 'height',\n entry.devicePixelContentBoxSize[0].blockSize\n );\n } else {\n canvas.setAttribute('width', width * fig.ratio);\n canvas.setAttribute('height', height * fig.ratio);\n }\n canvas.setAttribute(\n 'style',\n 'width: ' + width + 'px; height: ' + height + 'px;'\n );\n\n rubberband_canvas.setAttribute('width', width);\n rubberband_canvas.setAttribute('height', height);\n\n // And update the size in Python. We ignore the initial 0/0 size\n // that occurs as the element is placed into the DOM, which should\n // otherwise not happen due to the minimum size styling.\n if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n fig.request_resize(width, height);\n }\n }\n });\n this.resizeObserverInstance.observe(canvas_div);\n\n function on_mouse_event_closure(name) {\n return function (event) {\n return fig.mouse_event(event, name);\n };\n }\n\n rubberband_canvas.addEventListener(\n 'mousedown',\n on_mouse_event_closure('button_press')\n );\n rubberband_canvas.addEventListener(\n 'mouseup',\n on_mouse_event_closure('button_release')\n );\n rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\n );\n // Throttle sequential mouse events to 1 every 20ms.\n rubberband_canvas.addEventListener(\n 'mousemove',\n on_mouse_event_closure('motion_notify')\n );\n\n rubberband_canvas.addEventListener(\n 'mouseenter',\n on_mouse_event_closure('figure_enter')\n );\n rubberband_canvas.addEventListener(\n 'mouseleave',\n on_mouse_event_closure('figure_leave')\n );\n\n canvas_div.addEventListener('wheel', function (event) {\n if (event.deltaY < 0) {\n event.step = 1;\n } else {\n event.step = -1;\n }\n on_mouse_event_closure('scroll')(event);\n });\n\n canvas_div.appendChild(canvas);\n canvas_div.appendChild(rubberband_canvas);\n\n this.rubberband_context = rubberband_canvas.getContext('2d');\n this.rubberband_context.strokeStyle = '#000000';\n\n this._resize_canvas = function (width, height, forward) {\n if (forward) {\n canvas_div.style.width = width + 'px';\n canvas_div.style.height = height + 'px';\n }\n };\n\n // Disable right mouse context menu.\n this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n event.preventDefault();\n return false;\n });\n\n function set_focus() {\n canvas.focus();\n canvas_div.focus();\n }\n\n window.setTimeout(set_focus, 100);\n};\n\nmpl.figure.prototype._init_toolbar = function () {\n var fig = this;\n\n var toolbar = document.createElement('div');\n toolbar.classList = 'mpl-toolbar';\n this.root.appendChild(toolbar);\n\n function on_click_closure(name) {\n return function (_event) {\n return fig.toolbar_button_onclick(name);\n };\n }\n\n function on_mouseover_closure(tooltip) {\n return function (event) {\n if (!event.currentTarget.disabled) {\n return fig.toolbar_button_onmouseover(tooltip);\n }\n };\n }\n\n fig.buttons = {};\n var buttonGroup = document.createElement('div');\n buttonGroup.classList = 'mpl-button-group';\n for (var toolbar_ind in mpl.toolbar_items) {\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) {\n /* Instead of a spacer, we start a new button group. */\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n buttonGroup = document.createElement('div');\n buttonGroup.classList = 'mpl-button-group';\n continue;\n }\n\n var button = (fig.buttons[name] = document.createElement('button'));\n button.classList = 'mpl-widget';\n button.setAttribute('role', 'button');\n button.setAttribute('aria-disabled', 'false');\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n\n var icon_img = document.createElement('img');\n icon_img.src = '_images/' + image + '.png';\n icon_img.srcset = '_images/' + image + '_large.png 2x';\n icon_img.alt = tooltip;\n button.appendChild(icon_img);\n\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n var fmt_picker = document.createElement('select');\n fmt_picker.classList = 'mpl-widget';\n toolbar.appendChild(fmt_picker);\n this.format_dropdown = fmt_picker;\n\n for (var ind in mpl.extensions) {\n var fmt = mpl.extensions[ind];\n var option = document.createElement('option');\n option.selected = fmt === mpl.default_extension;\n option.innerHTML = fmt;\n fmt_picker.appendChild(option);\n }\n\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n};\n\nmpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n // which will in turn request a refresh of the image.\n this.send_message('resize', { width: x_pixels, height: y_pixels });\n};\n\nmpl.figure.prototype.send_message = function (type, properties) {\n properties['type'] = type;\n properties['figure_id'] = this.id;\n this.ws.send(JSON.stringify(properties));\n};\n\nmpl.figure.prototype.send_draw_message = function () {\n if (!this.waiting) {\n this.waiting = true;\n this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n }\n};\n\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n var format_dropdown = fig.format_dropdown;\n var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n fig.ondownload(fig, format);\n};\n\nmpl.figure.prototype.handle_resize = function (fig, msg) {\n var size = msg['size'];\n if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n fig._resize_canvas(size[0], size[1], msg['forward']);\n fig.send_message('refresh', {});\n }\n};\n\nmpl.figure.prototype.handle_rubberband = function (fig, msg) {\n var x0 = msg['x0'] / fig.ratio;\n var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n var x1 = msg['x1'] / fig.ratio;\n var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n x0 = Math.floor(x0) + 0.5;\n y0 = Math.floor(y0) + 0.5;\n x1 = Math.floor(x1) + 0.5;\n y1 = Math.floor(y1) + 0.5;\n var min_x = Math.min(x0, x1);\n var min_y = Math.min(y0, y1);\n var width = Math.abs(x1 - x0);\n var height = Math.abs(y1 - y0);\n\n fig.rubberband_context.clearRect(\n 0,\n 0,\n fig.canvas.width / fig.ratio,\n fig.canvas.height / fig.ratio\n );\n\n fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n};\n\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n var cursor = msg['cursor'];\n switch (cursor) {\n case 0:\n cursor = 'pointer';\n break;\n case 1:\n cursor = 'default';\n break;\n case 2:\n cursor = 'crosshair';\n break;\n case 3:\n cursor = 'move';\n break;\n }\n fig.rubberband_canvas.style.cursor = cursor;\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n for (var key in msg) {\n if (!(key in fig.buttons)) {\n continue;\n }\n fig.buttons[key].disabled = !msg[key];\n fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n }\n};\n\nmpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n if (msg['mode'] === 'PAN') {\n fig.buttons['Pan'].classList.add('active');\n fig.buttons['Zoom'].classList.remove('active');\n } else if (msg['mode'] === 'ZOOM') {\n fig.buttons['Pan'].classList.remove('active');\n fig.buttons['Zoom'].classList.add('active');\n } else {\n fig.buttons['Pan'].classList.remove('active');\n fig.buttons['Zoom'].classList.remove('active');\n }\n};\n\nmpl.figure.prototype.updated_canvas_event = function () {\n // Called whenever the canvas gets updated.\n this.send_message('ack', {});\n};\n\n// A function to construct a web socket function for onmessage handling.\n// Called in the figure constructor.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\n /* FIXME: We get \"Resource interpreted as Image but\n * transferred with MIME type text/plain:\" errors on\n * Chrome. But how to set the MIME type? It doesn't seem\n * to be part of the websocket stream */\n img.type = 'image/png';\n }\n\n /* Free the memory for the previous frames */\n if (fig.imageObj.src) {\n (window.URL || window.webkitURL).revokeObjectURL(\n fig.imageObj.src\n );\n }\n\n fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n img\n );\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n } else if (\n typeof evt.data === 'string' &&\n evt.data.slice(0, 21) === 'data:image/png;base64'\n ) {\n fig.imageObj.src = evt.data;\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n }\n\n var msg = JSON.parse(evt.data);\n var msg_type = msg['type'];\n\n // Call the \"handle_{type}\" callback, which takes\n // the figure and JSON message as its only arguments.\n try {\n var callback = fig['handle_' + msg_type];\n } catch (e) {\n console.log(\n \"No handler for the '\" + msg_type + \"' message type: \",\n msg\n );\n return;\n }\n\n if (callback) {\n try {\n // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n callback(fig, msg);\n } catch (e) {\n console.log(\n \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n e,\n e.stack,\n msg\n );\n }\n }\n };\n};\n\n// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.findpos = function (e) {\n //this section is from http://www.quirksmode.org/js/events_properties.html\n var targ;\n if (!e) {\n e = window.event;\n }\n if (e.target) {\n targ = e.target;\n } else if (e.srcElement) {\n targ = e.srcElement;\n }\n if (targ.nodeType === 3) {\n // defeat Safari bug\n targ = targ.parentNode;\n }\n\n // pageX,Y are the mouse positions relative to the document\n var boundingRect = targ.getBoundingClientRect();\n var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n\n return { x: x, y: y };\n};\n\n/*\n * return a copy of an object with only non-object keys\n * we need this to avoid circular references\n * http://stackoverflow.com/a/24161582/3208463\n */\nfunction simpleKeys(original) {\n return Object.keys(original).reduce(function (obj, key) {\n if (typeof original[key] !== 'object') {\n obj[key] = original[key];\n }\n return obj;\n }, {});\n}\n\nmpl.figure.prototype.mouse_event = function (event, name) {\n var canvas_pos = mpl.findpos(event);\n\n if (name === 'button_press') {\n this.canvas.focus();\n this.canvas_div.focus();\n }\n\n var x = canvas_pos.x * this.ratio;\n var y = canvas_pos.y * this.ratio;\n\n this.send_message(name, {\n x: x,\n y: y,\n button: event.button,\n step: event.step,\n guiEvent: simpleKeys(event),\n });\n\n /* This prevents the web browser from automatically changing to\n * the text insertion cursor when the button is pressed. We want\n * to control all of the cursor setting manually through the\n * 'cursor' event from matplotlib */\n event.preventDefault();\n return false;\n};\n\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.figure.prototype.toolbar_button_onclick = function (name) {\n if (name === 'download') {\n this.handle_save(this, null);\n } else {\n this.send_message('toolbar_button', { name: name });\n }\n};\n\nmpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n this.message.textContent = tooltip;\n};\n\n///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n// prettier-ignore\nvar _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\nmpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar comm_websocket_adapter = function (comm) {\n // Create a \"websocket\"-like object which calls the given IPython comm\n // object with the appropriate methods. Currently this is a non binary\n // socket, so there is still some room for performance tuning.\n var ws = {};\n\n ws.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\n\n ws.close = function () {\n comm.close();\n };\n ws.send = function (m) {\n //console.log('sending', m);\n comm.send(m);\n };\n // Register the callback with on_msg.\n comm.on_msg(function (msg) {\n //console.log('receiving', msg['content']['data'], msg);\n var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.mpl_figure_comm = function (comm, msg) {\n // This is the function which gets called when the mpl process\n // starts-up an IPython Comm through the \"matplotlib\" channel.\n\n var id = msg.content.data.id;\n // Get hold of the div created by the display call when the Comm\n // socket was opened in Python.\n var element = document.getElementById(id);\n var ws_proxy = comm_websocket_adapter(comm);\n\n function ondownload(figure, _format) {\n window.open(figure.canvas.toDataURL());\n }\n\n var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n\n // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n // web socket which is closed, not our websocket->open comm proxy.\n ws_proxy.onopen();\n\n fig.parent_element = element;\n fig.cell_info = mpl.find_output_cell(\"
\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.on(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\nmpl.figure.prototype.handle_close = function (fig, msg) {\n var width = fig.canvas.width / fig.ratio;\n fig.cell_info[0].output_area.element.off(\n 'cleared',\n fig._remove_fig_handler\n );\n fig.resizeObserverInstance.unobserve(fig.canvas_div);\n\n // Update the output cell to use the data from the current canvas.\n fig.push_to_output();\n var dataURL = fig.canvas.toDataURL();\n // Re-enable the keyboard manager in IPython - without this line, in FF,\n // the notebook keyboard shortcuts fail.\n IPython.keyboard_manager.enable();\n fig.parent_element.innerHTML =\n '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.figure.prototype.push_to_output = function (_remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width / this.ratio;\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] =\n '';\n};\n\nmpl.figure.prototype.updated_canvas_event = function () {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message('ack', {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () {\n fig.push_to_output();\n }, 1000);\n};\n\nmpl.figure.prototype._init_toolbar = function () {\n var fig = this;\n\n var toolbar = document.createElement('div');\n toolbar.classList = 'btn-toolbar';\n this.root.appendChild(toolbar);\n\n function on_click_closure(name) {\n return function (_event) {\n return fig.toolbar_button_onclick(name);\n };\n }\n\n function on_mouseover_closure(tooltip) {\n return function (event) {\n if (!event.currentTarget.disabled) {\n return fig.toolbar_button_onmouseover(tooltip);\n }\n };\n }\n\n fig.buttons = {};\n var buttonGroup = document.createElement('div');\n buttonGroup.classList = 'btn-group';\n var button;\n for (var toolbar_ind in mpl.toolbar_items) {\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) {\n /* Instead of a spacer, we start a new button group. */\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n buttonGroup = document.createElement('div');\n buttonGroup.classList = 'btn-group';\n continue;\n }\n\n button = fig.buttons[name] = document.createElement('button');\n button.classList = 'btn btn-default';\n button.href = '#';\n button.title = name;\n button.innerHTML = '';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\nmpl.figure.prototype._remove_fig_handler = function (event) {\n var fig = event.data.fig;\n if (event.target !== this) {\n // Ignore bubbled events from children.\n return;\n }\n fig.close_ws(fig, {});\n};\n\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.figure.prototype._canvas_extra_style = function (el) {\n // this is important to make the div 'focusable\n el.setAttribute('tabindex', 0);\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n } else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n};\n\nmpl.figure.prototype._key_event_extra = function (event, _name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager) {\n manager = IPython.keyboard_manager;\n }\n\n // Check for shift+enter\n if (event.shiftKey && event.which === 13) {\n this.canvas_div.blur();\n // select the cell after this one\n var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n IPython.notebook.select(index + 1);\n }\n};\n\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.find_output_cell = function (html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i = 0; i < ncells; i++) {\n var cell = cells[i];\n if (cell.cell_type === 'code') {\n for (var j = 0; j < cell.output_area.outputs.length; j++) {\n var data = cell.output_area.outputs[j];\n if (data.data) {\n // IPython >= 3 moved mimebundle to data attribute of output\n data = data.data;\n }\n if (data['text/html'] === html_output) {\n return [cell, data, j];\n }\n }\n }\n }\n};\n\n// Register the function which deals with the matplotlib target/channel.\n// The kernel may be null if the page has been refreshed.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_loss_functions(suptitle = 'Common loss functions for classification (class=1)',\n", + " functions = [zero_one_v(x), logistic_loss(x)],\n", + " ylabels = ['$\\mathcal{L}_{0-1}}$ (0-1 loss)',\n", + " '$\\mathcal{L}_{log}$ (logistic loss)'],\n", + " xlabel = '$p$')\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ដើម្បីយល់ពីការបាត់បង់ logistic សូមពិចារណាពីករណីពីរនៃលទ្ធផលដែលរំពឹងទុក៖\n", + "* ប្រសិនបើយើងរំពឹងថាលទ្ធផលគួរតែជា ១ ($y=1$) នោះការ​បាត់បង់គឺ $-log f_\\theta(x_i)$។ ការបាត់បង់គឺ ០ ប្រសិនបើបណ្តាញព្យាករណ៍បាន 1 ជាមួយប្រូបាប៊ីលីតេ 1 ហើយវាកើនឡើងធំជាងឡើងពេលប្រូបាប៊ីលីតេនៃ 1 ត្រូវបានធ្លាក់ចុះ។\n", + "* ប្រសិនបើយើងរំពឹងថាលទ្ធផលគួរតែជា ០ ($y=0$) នោះការ​បាត់បង់គឺ $-log(1-f_\\theta(x_i))$។ នៅទីនេះ $1-f_\\theta(x_i)$ គឺជាប្រូបាប៊ីលីតេនៃ 0 ដែលបានព្យាករណ៍ដោយបណ្តាញ ហើយអត្ថន័យនៃ log-loss គឺដូចគ្នានឹងបានពិពណ៌នានៅករណីមុន។\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## សំណង់បណ្តាញស្រព្ធខួរក្បាល\n", + "\n", + "យើងបានបង្កើតគណនីទិន្នន័យសម្រាប់បញ្ហាការបែងចែកពីរប្រភេទ។ ទោះជា​ដូច្នោះ​ក៏ដោយ​ យើងមកពិចារណាវាជាការបែងចែកច្រើនប្រភេទចាប់តាំងពីដើម ដើម្បីឲ្យយើងអាចប្ដូរកូដទៅការបែងចែកច្រើនប្រភេទបានយ៉ាងងាយស្រួល។ ក្នុងករណីនេះ ច្រកតែមួយរបស់យើងនឹងមានសំណង់ដូចខាងក្រោម៖\n", + "\n", + "\n", + "\n", + "លទ្ធផលពីររបស់បណ្តាញតំណាងឲ្យថ្នាក់ពីរ ហើយថ្នាក់ដែលមានតម្លៃខ្ពស់ជាងគេទាំងពីរនោះតំណាងឲ្យដំណោះស្រាយត្រឹមត្រូវ។\n", + "\n", + "ម៉ូដែលត្រូវបានកំណត់ជា\n", + "$$\n", + "f_\\theta(x) = W\\times x + b\n", + "$$\n", + "ដែល $$\\theta = \\langle W,b\\rangle$$ គឺជាអ៉ើម៉៉ែត្រ។\n", + "\n", + "យើងនឹងកំណត់ស្រទាប់បន្សំពីនេះជាក្លាស Python មួយដែលមានមុខងារ `forward` ដែលធ្វើការគណនា។ វាទទួលបានតម្លៃបញ្ចូល $x$ ហើយបញ្ចេញលទ្ធផលនៃស្រទាប់។ អ៉ើម៉ែត្រ `W` និង `b` ត្រូវបានរក្សាទុកក្នុងក្នងថ្នាក់ស្រទាប់ ហើយត្រូវបានចាប់ផ្តើមនៅពេលបង្កើតជាមួយតម្លៃចៃដន្យ និងសូន្យដោយលំដាប់។\n" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 1.77202116, -0.25384488],\n", + " [ 0.28370828, -0.39610552],\n", + " [-0.30097433, 0.30513182],\n", + " [-0.8120485 , 0.56079421],\n", + " [-1.23519653, 0.3394973 ]])" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "class Linear:\n", + " def __init__(self,nin,nout):\n", + " self.W = np.random.normal(0, 1.0/np.sqrt(nin), (nout, nin))\n", + " self.b = np.zeros((1,nout))\n", + " \n", + " def forward(self, x):\n", + " return np.dot(x, self.W.T) + self.b\n", + " \n", + "net = Linear(2,2)\n", + "net.forward(train_x[0:5])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "នៅក្នុងករណីជាច្រើន វាមានប្រសិទ្ធិភាពជាងក្នុងការប្រតិបត្តិនៅលើតម្លៃបញ្ចូលមួយ ដោយសារពួកយើងប្រើប្រតិបត្តិការនៃ Numpy អាចផ្ញើតម្លៃបញ្ចូលជាចង្វាក់ទៅកាន់បណ្តាញរបស់យើង ហើយវានឹងផ្ដល់ជូនយើងនូវចង្វាក់នៃតម្លៃលទ្ធផល។\n", + "\n", + "## Softmax: បម្លែងលទ្ធផលទៅជាប្រាបាប់ប៉ុណ្ណានៃការកើតមាន\n", + "\n", + "ដូចដែលអ្នកអាចឃើញ លទ្ធផលរបស់យើងមិនមែនជាប្រាបាប់ប៉ុណ្ណា - ពួកវាអាចយកតម្លៃណាមួយបាន។ ដើម្បីបម្លែងពួកវាទៅជាប្រាបាប់ប៉ុណ្ណា យើងត្រូវតែធ្វើការបញ្ញាតិគ្នារវាងតម្លៃទាំងអស់ក្នុងថ្វីថ្វាលនៃថ្នាក់ទាំងអស់។ នេះត្រូវបានអនុវត្តដោយប្រើមុខងារ **softmax**៖ $$\\sigma(\\mathbf{z}_c) = \\frac{e^{z_c}}{\\sum_{j} e^{z_j}}, \\quad\\mathrm{for}\\quad c\\in 1 .. |C|$$\n", + "\n", + "\n", + "\n", + "> លទ្ធផលនៃបណ្តាញ $\\sigma(\\mathbf{z})$ អាចត្រូវបានអារាយន័យថាជាការចែកចាយប្រាបាប់ប៉ុណ្ណាចំពោះបណ្ដុំថ្នាក់ $C$: $q = \\sigma(\\mathbf{z}_c) = \\hat{p}(c | x)$\n", + "\n", + "យើងនឹងកំណត់ថ្នាក់ `Softmax` ទ្រង់ទ្រាយដូចគ្នា ជាថ្នាក់មួយដែលមានមុខងារ `forward`:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[0.88348621, 0.11651379],\n", + " [0.66369714, 0.33630286],\n", + " [0.35294795, 0.64705205],\n", + " [0.20216095, 0.79783905],\n", + " [0.17154828, 0.82845172],\n", + " [0.24279153, 0.75720847],\n", + " [0.18915732, 0.81084268],\n", + " [0.17282951, 0.82717049],\n", + " [0.13897531, 0.86102469],\n", + " [0.72746882, 0.27253118]])" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "class Softmax:\n", + " def forward(self,z):\n", + " zmax = z.max(axis=1,keepdims=True)\n", + " expz = np.exp(z-zmax)\n", + " Z = expz.sum(axis=1,keepdims=True)\n", + " return expz / Z\n", + "\n", + "softmax = Softmax()\n", + "softmax.forward(net.forward(train_x[0:10]))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "អ្នកអាចឃើញថា ឥឡូវនេះយើងកំពុងទទួលបានប្រសិទ្ធភាពជាផលបញ្ចេញ, មានន័យថា សរុបនៃវ៉ិចទ័រផលបញ្ចេញនីមួយៗគឺ 1 ដោយច្បាស់។\n", + "\n", + "ករណីដែលយើងមានច្រើនជាង 2 ចំណាត់ថ្នាក់ទៅ, softmax នឹងធ្វើការសមមូលប្រសិទ្ធភាពនៅក្នុងចំណាត់ថ្នាក់ទាំងអស់។ នេះគឺជាអ៊ិកស្បាញនៃសំណុំបែបបទបណ្ដាញដែលធ្វើការចាត់ថ្នាក់លេខ MNIST ៖\n", + "\n", + "![MNIST Classifier](../../../../../translated_images/km/Cross-Entropy-Loss.7acff482d48cc41b.webp)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## ការបាត់បង់ Cross-Entropy\n", + "\n", + "អនុគមន៍បាត់បង់ក្នុងការបែងចែកប្រភេទជាទូទៅគឺជាអនុគមន៍ឡូជីស្ទិច ដែលអាចបូកបន្ថែមជាអនុគមន៍ **ការបាត់បង់ cross-entropy**។ ការបាត់បង់ cross-entropy គឺជា​អនុគមន៍មួយដែលអាចគណនាប្រភេទស្រដៀងគ្នារវាងចែកចាយប្រតិបត្តិការព្យាករណ៍ពីរប任ា។ អ្នកអាចរកឃើញការពិភាក្សាបន្ថែមស្តីពីវានៅ [លើវិគីភីឌា](https://en.wikipedia.org/wiki/Cross_entropy)។\n", + "\n", + "សម្រាប់ករណីរបស់យើង ចែកចាយដំបូងគឺជា​លទ្ធផលប្រតិបត្តិការព្យាករណ៍នៃបណ្ដាញរបស់យើង ហើយចែកចាយទីពីរគឺហៅថា​ចែកចាយ **one-hot** ដែលកំណត់ថាពានរង្វាន់ $c$ មានប្រតិបត្តិការព្យាករណ៍តម្លៃ 1 (ដែលសព្វគ្រប់ផ្សេងទៀតស្មើ 0)។ ក្នុងករណីដូចនេះ ការបាត់បង់ cross-entropy អាចគណនាជា $-\\log p_c$ ដែល $c$ គឺជាពានរង្វាន់ដែលរំពឹងទុក និង $p_c$ គឺប្រតិបត្តិការព្យាករណ៍ត្រូវនៃពានរង្វាន់នេះដែលផ្តល់ដោយបណ្ដាញប្រសិទ្ធស្នូលរបស់យើង។\n", + "\n", + "> បើបណ្ដាញប្រសិទ្ធស្នូលប័តប្រតិបត្តិការព្យាករណ៍ 1 សម្រាប់ពានរង្វាន់ដែលរំពឹងទុក ការបាត់បង់ cross-entropy នឹងស្មើ 0។ semakin ប្រតិបត្តិការព្យាករណ៍នៃពានរង្វាន់ពិតទៅកាន់ 0 ការបាត់បង់ cross-entropy នឹងកើនឡើងខ្ពស់ (ហើយវាអាចឈានដល់អតិបរមា!)។\n" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [], + "source": [ + "def plot_cross_ent():\n", + " p = np.linspace(0.01, 0.99, 101) # estimated probability p(y|x)\n", + " cross_ent_v = np.vectorize(cross_ent)\n", + " f3, ax = plt.subplots(1,1, figsize=(8, 3))\n", + " l1, = plt.plot(p, cross_ent_v(p, 1), 'r--')\n", + " l2, = plt.plot(p, cross_ent_v(p, 0), 'r-')\n", + " plt.legend([l1, l2], ['$y = 1$', '$y = 0$'], loc = 'upper center', ncol = 2)\n", + " plt.xlabel('$\\hat{p}(y|x)$', size=18)\n", + " plt.ylabel('$\\mathcal{L}_{CE}$', size=18)\n", + " plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "scrolled": true, + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.get_websocket_type = function () {\n if (typeof WebSocket !== 'undefined') {\n return WebSocket;\n } else if (typeof MozWebSocket !== 'undefined') {\n return MozWebSocket;\n } else {\n alert(\n 'Your browser does not have WebSocket support. ' +\n 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n 'Firefox 4 and 5 are also supported but you ' +\n 'have to enable WebSockets in about:config.'\n );\n }\n};\n\nmpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n this.id = figure_id;\n\n this.ws = websocket;\n\n this.supports_binary = this.ws.binaryType !== undefined;\n\n if (!this.supports_binary) {\n var warnings = document.getElementById('mpl-warnings');\n if (warnings) {\n warnings.style.display = 'block';\n warnings.textContent =\n 'This browser does not support binary websocket messages. ' +\n 'Performance may be slow.';\n }\n }\n\n this.imageObj = new Image();\n\n this.context = undefined;\n this.message = undefined;\n this.canvas = undefined;\n this.rubberband_canvas = undefined;\n this.rubberband_context = undefined;\n this.format_dropdown = undefined;\n\n this.image_mode = 'full';\n\n this.root = document.createElement('div');\n this.root.setAttribute('style', 'display: inline-block');\n this._root_extra_style(this.root);\n\n parent_element.appendChild(this.root);\n\n this._init_header(this);\n this._init_canvas(this);\n this._init_toolbar(this);\n\n var fig = this;\n\n this.waiting = false;\n\n this.ws.onopen = function () {\n fig.send_message('supports_binary', { value: fig.supports_binary });\n fig.send_message('send_image_mode', {});\n if (fig.ratio !== 1) {\n fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\n }\n fig.send_message('refresh', {});\n };\n\n this.imageObj.onload = function () {\n if (fig.image_mode === 'full') {\n // Full images could contain transparency (where diff images\n // almost always do), so we need to clear the canvas so that\n // there is no ghosting.\n fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n }\n fig.context.drawImage(fig.imageObj, 0, 0);\n };\n\n this.imageObj.onunload = function () {\n fig.ws.close();\n };\n\n this.ws.onmessage = this._make_on_message_function(this);\n\n this.ondownload = ondownload;\n};\n\nmpl.figure.prototype._init_header = function () {\n var titlebar = document.createElement('div');\n titlebar.classList =\n 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n var titletext = document.createElement('div');\n titletext.classList = 'ui-dialog-title';\n titletext.setAttribute(\n 'style',\n 'width: 100%; text-align: center; padding: 3px;'\n );\n titlebar.appendChild(titletext);\n this.root.appendChild(titlebar);\n this.header = titletext;\n};\n\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._init_canvas = function () {\n var fig = this;\n\n var canvas_div = (this.canvas_div = document.createElement('div'));\n canvas_div.setAttribute(\n 'style',\n 'border: 1px solid #ddd;' +\n 'box-sizing: content-box;' +\n 'clear: both;' +\n 'min-height: 1px;' +\n 'min-width: 1px;' +\n 'outline: 0;' +\n 'overflow: hidden;' +\n 'position: relative;' +\n 'resize: both;'\n );\n\n function on_keyboard_event_closure(name) {\n return function (event) {\n return fig.key_event(event, name);\n };\n }\n\n canvas_div.addEventListener(\n 'keydown',\n on_keyboard_event_closure('key_press')\n );\n canvas_div.addEventListener(\n 'keyup',\n on_keyboard_event_closure('key_release')\n );\n\n this._canvas_extra_style(canvas_div);\n this.root.appendChild(canvas_div);\n\n var canvas = (this.canvas = document.createElement('canvas'));\n canvas.classList.add('mpl-canvas');\n canvas.setAttribute('style', 'box-sizing: content-box;');\n\n this.context = canvas.getContext('2d');\n\n var backingStore =\n this.context.backingStorePixelRatio ||\n this.context.webkitBackingStorePixelRatio ||\n this.context.mozBackingStorePixelRatio ||\n this.context.msBackingStorePixelRatio ||\n this.context.oBackingStorePixelRatio ||\n this.context.backingStorePixelRatio ||\n 1;\n\n this.ratio = (window.devicePixelRatio || 1) / backingStore;\n\n var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n 'canvas'\n ));\n rubberband_canvas.setAttribute(\n 'style',\n 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n );\n\n // Apply a ponyfill if ResizeObserver is not implemented by browser.\n if (this.ResizeObserver === undefined) {\n if (window.ResizeObserver !== undefined) {\n this.ResizeObserver = window.ResizeObserver;\n } else {\n var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n this.ResizeObserver = obs.ResizeObserver;\n }\n }\n\n this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n var nentries = entries.length;\n for (var i = 0; i < nentries; i++) {\n var entry = entries[i];\n var width, height;\n if (entry.contentBoxSize) {\n if (entry.contentBoxSize instanceof Array) {\n // Chrome 84 implements new version of spec.\n width = entry.contentBoxSize[0].inlineSize;\n height = entry.contentBoxSize[0].blockSize;\n } else {\n // Firefox implements old version of spec.\n width = entry.contentBoxSize.inlineSize;\n height = entry.contentBoxSize.blockSize;\n }\n } else {\n // Chrome <84 implements even older version of spec.\n width = entry.contentRect.width;\n height = entry.contentRect.height;\n }\n\n // Keep the size of the canvas and rubber band canvas in sync with\n // the canvas container.\n if (entry.devicePixelContentBoxSize) {\n // Chrome 84 implements new version of spec.\n canvas.setAttribute(\n 'width',\n entry.devicePixelContentBoxSize[0].inlineSize\n );\n canvas.setAttribute(\n 'height',\n entry.devicePixelContentBoxSize[0].blockSize\n );\n } else {\n canvas.setAttribute('width', width * fig.ratio);\n canvas.setAttribute('height', height * fig.ratio);\n }\n canvas.setAttribute(\n 'style',\n 'width: ' + width + 'px; height: ' + height + 'px;'\n );\n\n rubberband_canvas.setAttribute('width', width);\n rubberband_canvas.setAttribute('height', height);\n\n // And update the size in Python. We ignore the initial 0/0 size\n // that occurs as the element is placed into the DOM, which should\n // otherwise not happen due to the minimum size styling.\n if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n fig.request_resize(width, height);\n }\n }\n });\n this.resizeObserverInstance.observe(canvas_div);\n\n function on_mouse_event_closure(name) {\n return function (event) {\n return fig.mouse_event(event, name);\n };\n }\n\n rubberband_canvas.addEventListener(\n 'mousedown',\n on_mouse_event_closure('button_press')\n );\n rubberband_canvas.addEventListener(\n 'mouseup',\n on_mouse_event_closure('button_release')\n );\n rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\n );\n // Throttle sequential mouse events to 1 every 20ms.\n rubberband_canvas.addEventListener(\n 'mousemove',\n on_mouse_event_closure('motion_notify')\n );\n\n rubberband_canvas.addEventListener(\n 'mouseenter',\n on_mouse_event_closure('figure_enter')\n );\n rubberband_canvas.addEventListener(\n 'mouseleave',\n on_mouse_event_closure('figure_leave')\n );\n\n canvas_div.addEventListener('wheel', function (event) {\n if (event.deltaY < 0) {\n event.step = 1;\n } else {\n event.step = -1;\n }\n on_mouse_event_closure('scroll')(event);\n });\n\n canvas_div.appendChild(canvas);\n canvas_div.appendChild(rubberband_canvas);\n\n this.rubberband_context = rubberband_canvas.getContext('2d');\n this.rubberband_context.strokeStyle = '#000000';\n\n this._resize_canvas = function (width, height, forward) {\n if (forward) {\n canvas_div.style.width = width + 'px';\n canvas_div.style.height = height + 'px';\n }\n };\n\n // Disable right mouse context menu.\n this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n event.preventDefault();\n return false;\n });\n\n function set_focus() {\n canvas.focus();\n canvas_div.focus();\n }\n\n window.setTimeout(set_focus, 100);\n};\n\nmpl.figure.prototype._init_toolbar = function () {\n var fig = this;\n\n var toolbar = document.createElement('div');\n toolbar.classList = 'mpl-toolbar';\n this.root.appendChild(toolbar);\n\n function on_click_closure(name) {\n return function (_event) {\n return fig.toolbar_button_onclick(name);\n };\n }\n\n function on_mouseover_closure(tooltip) {\n return function (event) {\n if (!event.currentTarget.disabled) {\n return fig.toolbar_button_onmouseover(tooltip);\n }\n };\n }\n\n fig.buttons = {};\n var buttonGroup = document.createElement('div');\n buttonGroup.classList = 'mpl-button-group';\n for (var toolbar_ind in mpl.toolbar_items) {\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) {\n /* Instead of a spacer, we start a new button group. */\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n buttonGroup = document.createElement('div');\n buttonGroup.classList = 'mpl-button-group';\n continue;\n }\n\n var button = (fig.buttons[name] = document.createElement('button'));\n button.classList = 'mpl-widget';\n button.setAttribute('role', 'button');\n button.setAttribute('aria-disabled', 'false');\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n\n var icon_img = document.createElement('img');\n icon_img.src = '_images/' + image + '.png';\n icon_img.srcset = '_images/' + image + '_large.png 2x';\n icon_img.alt = tooltip;\n button.appendChild(icon_img);\n\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n var fmt_picker = document.createElement('select');\n fmt_picker.classList = 'mpl-widget';\n toolbar.appendChild(fmt_picker);\n this.format_dropdown = fmt_picker;\n\n for (var ind in mpl.extensions) {\n var fmt = mpl.extensions[ind];\n var option = document.createElement('option');\n option.selected = fmt === mpl.default_extension;\n option.innerHTML = fmt;\n fmt_picker.appendChild(option);\n }\n\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n};\n\nmpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n // which will in turn request a refresh of the image.\n this.send_message('resize', { width: x_pixels, height: y_pixels });\n};\n\nmpl.figure.prototype.send_message = function (type, properties) {\n properties['type'] = type;\n properties['figure_id'] = this.id;\n this.ws.send(JSON.stringify(properties));\n};\n\nmpl.figure.prototype.send_draw_message = function () {\n if (!this.waiting) {\n this.waiting = true;\n this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n }\n};\n\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n var format_dropdown = fig.format_dropdown;\n var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n fig.ondownload(fig, format);\n};\n\nmpl.figure.prototype.handle_resize = function (fig, msg) {\n var size = msg['size'];\n if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n fig._resize_canvas(size[0], size[1], msg['forward']);\n fig.send_message('refresh', {});\n }\n};\n\nmpl.figure.prototype.handle_rubberband = function (fig, msg) {\n var x0 = msg['x0'] / fig.ratio;\n var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n var x1 = msg['x1'] / fig.ratio;\n var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n x0 = Math.floor(x0) + 0.5;\n y0 = Math.floor(y0) + 0.5;\n x1 = Math.floor(x1) + 0.5;\n y1 = Math.floor(y1) + 0.5;\n var min_x = Math.min(x0, x1);\n var min_y = Math.min(y0, y1);\n var width = Math.abs(x1 - x0);\n var height = Math.abs(y1 - y0);\n\n fig.rubberband_context.clearRect(\n 0,\n 0,\n fig.canvas.width / fig.ratio,\n fig.canvas.height / fig.ratio\n );\n\n fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n};\n\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n var cursor = msg['cursor'];\n switch (cursor) {\n case 0:\n cursor = 'pointer';\n break;\n case 1:\n cursor = 'default';\n break;\n case 2:\n cursor = 'crosshair';\n break;\n case 3:\n cursor = 'move';\n break;\n }\n fig.rubberband_canvas.style.cursor = cursor;\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n for (var key in msg) {\n if (!(key in fig.buttons)) {\n continue;\n }\n fig.buttons[key].disabled = !msg[key];\n fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n }\n};\n\nmpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n if (msg['mode'] === 'PAN') {\n fig.buttons['Pan'].classList.add('active');\n fig.buttons['Zoom'].classList.remove('active');\n } else if (msg['mode'] === 'ZOOM') {\n fig.buttons['Pan'].classList.remove('active');\n fig.buttons['Zoom'].classList.add('active');\n } else {\n fig.buttons['Pan'].classList.remove('active');\n fig.buttons['Zoom'].classList.remove('active');\n }\n};\n\nmpl.figure.prototype.updated_canvas_event = function () {\n // Called whenever the canvas gets updated.\n this.send_message('ack', {});\n};\n\n// A function to construct a web socket function for onmessage handling.\n// Called in the figure constructor.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\n /* FIXME: We get \"Resource interpreted as Image but\n * transferred with MIME type text/plain:\" errors on\n * Chrome. But how to set the MIME type? It doesn't seem\n * to be part of the websocket stream */\n img.type = 'image/png';\n }\n\n /* Free the memory for the previous frames */\n if (fig.imageObj.src) {\n (window.URL || window.webkitURL).revokeObjectURL(\n fig.imageObj.src\n );\n }\n\n fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n img\n );\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n } else if (\n typeof evt.data === 'string' &&\n evt.data.slice(0, 21) === 'data:image/png;base64'\n ) {\n fig.imageObj.src = evt.data;\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n }\n\n var msg = JSON.parse(evt.data);\n var msg_type = msg['type'];\n\n // Call the \"handle_{type}\" callback, which takes\n // the figure and JSON message as its only arguments.\n try {\n var callback = fig['handle_' + msg_type];\n } catch (e) {\n console.log(\n \"No handler for the '\" + msg_type + \"' message type: \",\n msg\n );\n return;\n }\n\n if (callback) {\n try {\n // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n callback(fig, msg);\n } catch (e) {\n console.log(\n \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n e,\n e.stack,\n msg\n );\n }\n }\n };\n};\n\n// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.findpos = function (e) {\n //this section is from http://www.quirksmode.org/js/events_properties.html\n var targ;\n if (!e) {\n e = window.event;\n }\n if (e.target) {\n targ = e.target;\n } else if (e.srcElement) {\n targ = e.srcElement;\n }\n if (targ.nodeType === 3) {\n // defeat Safari bug\n targ = targ.parentNode;\n }\n\n // pageX,Y are the mouse positions relative to the document\n var boundingRect = targ.getBoundingClientRect();\n var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n\n return { x: x, y: y };\n};\n\n/*\n * return a copy of an object with only non-object keys\n * we need this to avoid circular references\n * http://stackoverflow.com/a/24161582/3208463\n */\nfunction simpleKeys(original) {\n return Object.keys(original).reduce(function (obj, key) {\n if (typeof original[key] !== 'object') {\n obj[key] = original[key];\n }\n return obj;\n }, {});\n}\n\nmpl.figure.prototype.mouse_event = function (event, name) {\n var canvas_pos = mpl.findpos(event);\n\n if (name === 'button_press') {\n this.canvas.focus();\n this.canvas_div.focus();\n }\n\n var x = canvas_pos.x * this.ratio;\n var y = canvas_pos.y * this.ratio;\n\n this.send_message(name, {\n x: x,\n y: y,\n button: event.button,\n step: event.step,\n guiEvent: simpleKeys(event),\n });\n\n /* This prevents the web browser from automatically changing to\n * the text insertion cursor when the button is pressed. We want\n * to control all of the cursor setting manually through the\n * 'cursor' event from matplotlib */\n event.preventDefault();\n return false;\n};\n\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.figure.prototype.toolbar_button_onclick = function (name) {\n if (name === 'download') {\n this.handle_save(this, null);\n } else {\n this.send_message('toolbar_button', { name: name });\n }\n};\n\nmpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n this.message.textContent = tooltip;\n};\n\n///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n// prettier-ignore\nvar _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\nmpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar comm_websocket_adapter = function (comm) {\n // Create a \"websocket\"-like object which calls the given IPython comm\n // object with the appropriate methods. Currently this is a non binary\n // socket, so there is still some room for performance tuning.\n var ws = {};\n\n ws.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\n\n ws.close = function () {\n comm.close();\n };\n ws.send = function (m) {\n //console.log('sending', m);\n comm.send(m);\n };\n // Register the callback with on_msg.\n comm.on_msg(function (msg) {\n //console.log('receiving', msg['content']['data'], msg);\n var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.mpl_figure_comm = function (comm, msg) {\n // This is the function which gets called when the mpl process\n // starts-up an IPython Comm through the \"matplotlib\" channel.\n\n var id = msg.content.data.id;\n // Get hold of the div created by the display call when the Comm\n // socket was opened in Python.\n var element = document.getElementById(id);\n var ws_proxy = comm_websocket_adapter(comm);\n\n function ondownload(figure, _format) {\n window.open(figure.canvas.toDataURL());\n }\n\n var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n\n // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n // web socket which is closed, not our websocket->open comm proxy.\n ws_proxy.onopen();\n\n fig.parent_element = element;\n fig.cell_info = mpl.find_output_cell(\"
\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.on(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\nmpl.figure.prototype.handle_close = function (fig, msg) {\n var width = fig.canvas.width / fig.ratio;\n fig.cell_info[0].output_area.element.off(\n 'cleared',\n fig._remove_fig_handler\n );\n fig.resizeObserverInstance.unobserve(fig.canvas_div);\n\n // Update the output cell to use the data from the current canvas.\n fig.push_to_output();\n var dataURL = fig.canvas.toDataURL();\n // Re-enable the keyboard manager in IPython - without this line, in FF,\n // the notebook keyboard shortcuts fail.\n IPython.keyboard_manager.enable();\n fig.parent_element.innerHTML =\n '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.figure.prototype.push_to_output = function (_remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width / this.ratio;\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] =\n '';\n};\n\nmpl.figure.prototype.updated_canvas_event = function () {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message('ack', {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () {\n fig.push_to_output();\n }, 1000);\n};\n\nmpl.figure.prototype._init_toolbar = function () {\n var fig = this;\n\n var toolbar = document.createElement('div');\n toolbar.classList = 'btn-toolbar';\n this.root.appendChild(toolbar);\n\n function on_click_closure(name) {\n return function (_event) {\n return fig.toolbar_button_onclick(name);\n };\n }\n\n function on_mouseover_closure(tooltip) {\n return function (event) {\n if (!event.currentTarget.disabled) {\n return fig.toolbar_button_onmouseover(tooltip);\n }\n };\n }\n\n fig.buttons = {};\n var buttonGroup = document.createElement('div');\n buttonGroup.classList = 'btn-group';\n var button;\n for (var toolbar_ind in mpl.toolbar_items) {\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) {\n /* Instead of a spacer, we start a new button group. */\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n buttonGroup = document.createElement('div');\n buttonGroup.classList = 'btn-group';\n continue;\n }\n\n button = fig.buttons[name] = document.createElement('button');\n button.classList = 'btn btn-default';\n button.href = '#';\n button.title = name;\n button.innerHTML = '';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\nmpl.figure.prototype._remove_fig_handler = function (event) {\n var fig = event.data.fig;\n if (event.target !== this) {\n // Ignore bubbled events from children.\n return;\n }\n fig.close_ws(fig, {});\n};\n\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.figure.prototype._canvas_extra_style = function (el) {\n // this is important to make the div 'focusable\n el.setAttribute('tabindex', 0);\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n } else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n};\n\nmpl.figure.prototype._key_event_extra = function (event, _name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager) {\n manager = IPython.keyboard_manager;\n }\n\n // Check for shift+enter\n if (event.shiftKey && event.which === 13) {\n this.canvas_div.blur();\n // select the cell after this one\n var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n IPython.notebook.select(index + 1);\n }\n};\n\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.find_output_cell = function (html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i = 0; i < ncells; i++) {\n var cell = cells[i];\n if (cell.cell_type === 'code') {\n for (var j = 0; j < cell.output_area.outputs.length; j++) {\n var data = cell.output_area.outputs[j];\n if (data.data) {\n // IPython >= 3 moved mimebundle to data attribute of output\n data = data.data;\n }\n if (data['text/html'] === html_output) {\n return [cell, data, j];\n }\n }\n }\n }\n};\n\n// Register the function which deals with the matplotlib target/channel.\n// The kernel may be null if the page has been refreshed.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def cross_ent(prediction, ground_truth):\n", + " t = 1 if ground_truth > 0.5 else 0\n", + " return -t * np.log(prediction) - (1 - t) * np.log(1 - prediction)\n", + "plot_cross_ent()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "បាត់បង់ Cross-entropy នឹងត្រូវបានគណនាឡើងវិញជាស្រទាប់មួយផ្សេងទៀត ប៉ុន្តែមុខងារ `forward` នឹងមានតម្លៃបញ្ចូលពីរដែលបានបញ្ចូល៖ លទ្ធផលពីស្រទាប់មុនៗនៃបណ្ដាញ `p` និងថ្នាក់ដែលរំពឹងទុក `y` ៖\n" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1.429664938969559" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "class CrossEntropyLoss:\n", + " def forward(self,p,y):\n", + " self.p = p\n", + " self.y = y\n", + " p_of_y = p[np.arange(len(y)), y]\n", + " log_prob = np.log(p_of_y)\n", + " return -log_prob.mean() # average over all input samples\n", + "\n", + "cross_ent_loss = CrossEntropyLoss()\n", + "p = softmax.forward(net.forward(train_x[0:10]))\n", + "cross_ent_loss.forward(p,train_labels[0:10])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "> **សារៈសំខាន់**៖ មុខងារបាត់បង់បង្ហាញលេខមួយដែលបញ្ជាក់ពីភាពល្អ (ឬអាក្រក់) នៃការប្រតិបត្តិរបស់បណ្តាញរបស់យើង។ វាគួរត្រូវតែប្រគល់លេខមួយសម្រាប់ទិន្នន័យទាំងមូល ឬសម្រាប់ផ្នែកនៃទិន្នន័យ (minibatch)។ ដូចនេះ បន្ទាប់ពីគណនាបាត់បង់ cross-entropy សម្រាប់គ្រប់ធាតុទាំងអស់នៃវ៉ិចទ័របញ្ចូល យើងត្រូវធ្វើការបង្ហាញមធ្យម (ឬបន្ថែម) ធាតុទាំងអស់គ្នា - ដែលត្រូវបានធ្វើដោយការហៅ `.mean()`។\n", + "\n", + "## ក្រាហ្វិកគណនា\n", + "\n", + "\n", + "\n", + "រហូតដល់ពេលនេះ យើងបានកំណត់ថ្នាក់ខុសៗគ្នាសម្រាប់ស្រទាប់ផ្សេងៗនៃបណ្តាញ។ ការចងក្រងរបស់ស្រទាប់ទាំងនោះអាចត្រូវបានតំណាងជាគ្រាហ្វិច **គណនាផ្នែក**។ ឥឡូវនេះ យើងអាចគណនាបាត់បង់សម្រាប់ទិន្នន័យបណ្តុះបណ្តាលដែលបានផ្តល់ (ឬផ្នែកខ្លះ) ដូចខាងក្រោម៖\n" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1.429664938969559\n" + ] + } + ], + "source": [ + "z = net.forward(train_x[0:10])\n", + "p = softmax.forward(z)\n", + "loss = cross_ent_loss.forward(p,train_labels[0:10])\n", + "print(loss)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## បញ្ហាការចុះខ្ទង់នៃការបាត់បង់ និងការបណ្តុះបណ្តាលបណ្ដាញ\n", + "\n", + "ពេលដែលយើងបានកំណត់បណ្ដាញជាខ្ទង់ $f_\\theta$ ហើយបញ្ជាក់មុខងារបាត់បង់ $\\mathcal{L}(Y,f_\\theta(X))$ យើងអាចពិចារណា $\\mathcal{L}$ ដូចជាមុខងាររបស់ $\\theta$ ក្នុងសំណុំទិន្នន័យបណ្តុះបណ្តាលដែលបានកំណត់៖ $\\mathcal{L}(\\theta) = \\mathcal{L}(Y,f_\\theta(X))$\n", + "\n", + "ក្នុងករណីនេះ ការបណ្តុះបណ្តាលបណ្ដាញគឺជាបញ្ហាចុះខ្ទង់នៃ $\\mathcal{L}$ តាមអគ្គិសនី $\\theta$៖\n", + "$$\n", + "\\theta = \\mathrm{argmin}_{\\theta} \\mathcal{L}(Y,f_\\theta(X))\n", + "$$\n", + "\n", + "មានវិធីសាស្រ្តល្បីល្បាញមួយសម្រាប់កំណត់មុខងារដែលហៅថា **ការចុះខ្ទង់តាមកំណត់ប៉ារ៉ាម៉ែត្រ**។ គំនិតគឺយើងអាចគណនាអប់រំ (ក្នុងករណីចម្រុះវិមាត្រហៅថា **gradient**) នៃមុខងារបាត់បង់រួមទាំងប៉ារ៉ាម៉ែត្រហើយបម្លែងប៉ារ៉ាម៉ែត្រដើម្បីឲ្យកំហុសធ្លាក់ចុះ។\n", + "\n", + "ការចុះខ្ទង់ធ្វើការដូចខាងក្រោម៖\n", + " * បង្កើតប៉ារ៉ាម៉ែត្រជាលេខចៃដន្យ $w^{(0)}$, $b^{(0)}$\n", + " * ធ្វើម្តងម្ដងកូដខាងក្រោម៖\n", + "\n", + " $$\\begin{align}\n", + " W^{(i+1)}&=W^{(i)}-\\eta\\frac{\\partial\\mathcal{L}}{\\partial W}\\\\\n", + " b^{(i+1)}&=b^{(i)}-\\eta\\frac{\\partial\\mathcal{L}}{\\partial b}\n", + " \\end{align}\n", + " $$\n", + "\n", + "ក្នុងអំឡុងពេលបណ្តុះបណ្តាល ជំហានបង្កើតអប្បបរមាត្រូវបានគណនាលើសំណុំទិន្នន័យទាំងមូល (ចងចាំថាបាត់បង់គឺគណនាជាចំនួនសរុប / មធ្យមពីគំរូបណ្តុះបណ្តាលទាំងអស់)។ ទោះយ៉ាងណាក្នុងជីវិតពិត យើងយកផ្នែកតូចៗនៃសំណុំទិន្នន័យហៅថា **minibatches** ហើយគណនាអប់រំដោយផ្អែកលើជម្រើសតូចនៃទិន្នន័យ។ ពីព្រោះជម្រើសតូចគឺជារបៀបស៊ើបអង្កេតជារឿយៗ ដូច្នេះវិធីនេះហៅថា **ការចុះខ្ទង់បែបស៊្តូកាស្ទិច** (SGD)។\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## ការផ្ទេរប្រតិកម្មត្រឡប់ក្រោយ\n", + "\n", + "\n", + "\n", + "$$\\def\\L{\\mathcal{L}}\\def\\zz#1#2{\\frac{\\partial#1}{\\partial#2}}\n", + "\\begin{align}\n", + "\\zz{\\L}{W} =& \\zz{\\L}{p}\\zz{p}{z}\\zz{z}{W}\\cr\n", + "\\zz{\\L}{b} =& \\zz{\\L}{p}\\zz{p}{z}\\zz{z}{b}\n", + "\\end{align}\n", + "$$\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "ដើម្បីគណនា $\\partial\\mathcal{L}/\\partial W$ យើងអាចប្រើ **ច្បាប់ខ្សែង** សម្រាប់គណនាផ្ទែមិនប្រសើររបស់មុខងារប្រមូលបញ្ចូល មិនខុសពីរូបមន្តខាងលើទេ។ វាសមនឹងគំនិតដូចខាងក្រោម៖\n", + "\n", + "* សន្ថិតថាក្រោមinput មួយដែលបានផ្ដល់ យើងបានទទួលការបាត់បង់ $\\Delta\\mathcal{L}$\n", + "* ដើម្បីប៉ុនប៉ងធ្វើអោយវាតិចតួច អ្នកត្រូវតែប្ដូរចេញបណ្ដោយ softmax ផលចេញ $p$ ដោយតម្លៃ $\\Delta p = (\\partial\\mathcal{L}/\\partial p)\\Delta\\mathcal{L}$ \n", + "* វាសមនឹងការផ្លាស់ប្តូរទៅកាន់ចំណុច $z$ ដោយ $\\Delta z = (\\partial\\mathcal{p}/\\partial z)\\Delta p$\n", + "* ដើម្បីបង្ហាញកំហុសនេះ យើងត្រូវតែប្ដូរពណ៌នា parameter តាមលក្ខណៈចេញ៖ $\\Delta W = (\\partial\\mathcal{z}/\\partial W)\\Delta z$ (ហើយចំណុចដូចគ្នាក្នុង $b$)\n", + "\n", + "\n", + "\n", + "ដំណើរការនេះចាប់ផ្តើមចែកចាយកំហុសបាត់បង់ចេញពីផលចុងក្រោយនៃបណ្ដាញត្រលប់ទៅកាន់ parameter របស់វា។ ដូច្នេះដំណើរការនេះហៅថា **បង្កើតត្រឡប់ក្រោយ**។\n", + "\n", + "មួយដងនៃការបណ្តុះបណ្តាលនៃបណ្ដាញមានពីរផ្នែក៖\n", + "* **ចូលទៅមុខ (Forward pass)**, ប្រើគណនាតម្លៃនៃមុខងារបាត់បង់សម្រាប់ input minibatch មួយដែលបានផ្ដល់\n", + "* **ត្រឡប់ក្រោយ (Backward pass)**, ពេលយើងព្យាយាមបង្ហាញកំហុសនេះដោយចែកចាយវាត្រលប់ទៅកាន់ប៉ារ៉ាម៉ែត្រក្នុងគំនរគណនាដោយដំណើរការ។\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### ការអនុវត្តន៍នៃការបញ្ជូនត្រឡប់ក្រោយ\n", + "\n", + "* មកដាក់បន្ថែមមុខងារ `backward` ទៅក្នុងកំណត់ត្រាក្នុងអ៊ីចិនរបស់យើងដែលនឹងគណនាដេរីវេនិងផ្សព្វផ្សាយកំហុសក្នុងអំឡុងពេលបញ្ជូនត្រឡប់ក្រោយ។\n", + "* យើងត្រូវការអនុវត្តការអាប់ដេតប៉ារ៉ាម៉ែត្រតាមលំដាប់ដដែលដែលបានពិពណ៌នាក្រោយ។\n", + "\n", + "យើងត្រូវគណនាដេរីវេសម្រាប់ស្រទាប់នីមួយៗដោយដៃ ឧទាហរណ៍សម្រាប់ស្រទាប់ឌឺស្យូត $z = x\\times W+b$៖\n", + "$$\\begin{align}\n", + "\\frac{\\partial z}{\\partial W} &= x \\\\\n", + "\\frac{\\partial z}{\\partial b} &= 1 \\\\\n", + "\\end{align}$$\n", + "\n", + "បើយើងត្រូវការសងសងកំហុស $\\Delta z$ នៅចុងប្រត្តិបត្តិការស្រទាប់ យើងត្រូវតែធ្វើអាប់ដេតឱ្យវ៉ែតមានតាមលំដាប់​​៖\n", + "$$\\begin{align}\n", + "\\Delta x &= \\Delta z \\times W \\\\\n", + "\\Delta W &= \\frac{\\partial z}{\\partial W} \\Delta z = \\Delta z \\times x \\\\\n", + "\\Delta b &= \\frac{\\partial z}{\\partial b} \\Delta z = \\Delta z \\\\\n", + "\\end{align}$$\n", + "\n", + "**សំខាន់:** ការគណនាត្រូវបានធ្វើមិនមែនសម្រាប់គំរូបណ្តុះបណ្តាលនីមួយៗឡែកទេ ប៉ុន្ត่าสម្រាប់ **minibatch** ពេញ។ ការអាប់ដេតប៉ារ៉ាម៉ែត្រ $\\Delta W$ និង $\\Delta b$ ត្រូវបានគណនាផ្ទាល់រួមគ្នាទាំងមូលប្រភេទ minibatch ហើយវ៉ែតទាំងនេះមានវិមាត្រ: $x\\in\\mathbb{រពល{R}}^{\\mathrm{minibatch}\\, \\times\\, \\mathrm{nclass}}$\n" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "class Linear:\n", + " def __init__(self,nin,nout):\n", + " self.W = np.random.normal(0, 1.0/np.sqrt(nin), (nout, nin))\n", + " self.b = np.zeros((1,nout))\n", + " self.dW = np.zeros_like(self.W)\n", + " self.db = np.zeros_like(self.b)\n", + " \n", + " def forward(self, x):\n", + " self.x=x\n", + " return np.dot(x, self.W.T) + self.b\n", + " \n", + " def backward(self, dz):\n", + " dx = np.dot(dz, self.W)\n", + " dW = np.dot(dz.T, self.x)\n", + " db = dz.sum(axis=0)\n", + " self.dW = dW\n", + " self.db = db\n", + " return dx\n", + " \n", + " def update(self,lr):\n", + " self.W -= lr*self.dW\n", + " self.b -= lr*self.db" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ក្នុងវិធីដូចគ្នា យើងអាចកំណត់អនុគមន៍ `backward` សម្រាប់ស្រទាប់ដែលเหลือរបស់យើងបានដូចគ្នា៖\n" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "class Softmax:\n", + " def forward(self,z):\n", + " self.z = z\n", + " zmax = z.max(axis=1,keepdims=True)\n", + " expz = np.exp(z-zmax)\n", + " Z = expz.sum(axis=1,keepdims=True)\n", + " return expz / Z\n", + " def backward(self,dp):\n", + " p = self.forward(self.z)\n", + " pdp = p * dp\n", + " return pdp - p * pdp.sum(axis=1, keepdims=True)\n", + " \n", + "class CrossEntropyLoss:\n", + " def forward(self,p,y):\n", + " self.p = p\n", + " self.y = y\n", + " p_of_y = p[np.arange(len(y)), y]\n", + " log_prob = np.log(p_of_y)\n", + " return -log_prob.mean()\n", + " def backward(self,loss):\n", + " dlog_softmax = np.zeros_like(self.p)\n", + " dlog_softmax[np.arange(len(self.y)), self.y] -= 1.0/len(self.y)\n", + " return dlog_softmax / self.p" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ការ​បណ្តុះ​បណ្តាល​គំរូ\n", + "\n", + "ឥឡូវនេះ​យើង​ត្រៀមខ្លួន​រៀបចំ​ **training loop** ដែល​នឹង​ធ្វើ​ដំណើរ​តាម​ទិន្នន័យ​របស់​យើង ហើយ​បំពេញកិច្ចការ​បង្កើន​ប្រសិទ្ធិភាព​មីនីបាតមីនីបាតមីមួយ។ ការឆ្លងកាត់​ពេញលេញ​តាម​ទិន្នន័យ​មួយ​ទៅ​ហៅថា **an epoch**៖\n" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initial accuracy: 0.725\n", + "Final accuracy: 0.825\n" + ] + } + ], + "source": [ + "lin = Linear(2,2)\n", + "softmax = Softmax()\n", + "cross_ent_loss = CrossEntropyLoss()\n", + "\n", + "learning_rate = 0.1\n", + "\n", + "pred = np.argmax(lin.forward(train_x),axis=1)\n", + "acc = (pred==train_labels).mean()\n", + "print(\"Initial accuracy: \",acc)\n", + "\n", + "batch_size=4\n", + "for i in range(0,len(train_x),batch_size):\n", + " xb = train_x[i:i+batch_size]\n", + " yb = train_labels[i:i+batch_size]\n", + " \n", + " # forward pass\n", + " z = lin.forward(xb)\n", + " p = softmax.forward(z)\n", + " loss = cross_ent_loss.forward(p,yb)\n", + " \n", + " # backward pass\n", + " dp = cross_ent_loss.backward(loss)\n", + " dz = softmax.backward(dp)\n", + " dx = lin.backward(dz)\n", + " lin.update(learning_rate)\n", + " \n", + "pred = np.argmax(lin.forward(train_x),axis=1)\n", + "acc = (pred==train_labels).mean()\n", + "print(\"Final accuracy: \",acc)\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "សប្បាយចិត្តដែលបានឃើញពីរបៀបដែលយើងអាចបន្ថែមភាពត្រឹមត្រូវរបស់ម៉ូដែលពីប្រហែល ៥០% ទៅជារង្វង់ ៨០% ក្នុងមួយ epoch ។\n", + "\n", + "## ថ្នាក់បណ្ដាញ\n", + "\n", + "ដោយសារតែស្ថានការណ៍ជាច្រើនដែលបណ្តាញសរសៃប្រសាមរាមគឺគ្រាន់តែជាការប្រមូលផ្តុំស្រទាប់ជាច្រើន យើងអាចបង្កើតថ្នាក់មួយដែលនឹងអនុញ្ញាតឱ្យយើងដាក់ស្រទាប់ជាភាគផ្សំ មកគ្នា និងធ្វើការបញ្ជូនទៅមុខនិងត្រឡប់ក្រោយតាមរយៈពួកវាដោយមិនចាំបាច់កម្មវិធីតាមរយៈឡូជិកនោះជាពិសេសទេ។ យើងនឹងផ្ទុកបញ្ជីស្រទាប់នៅខាងក្នុងថ្នាក់ `Net` ហើយប្រើមុខងារ `add()` ដើម្បីបន្ថែមស្រទាប់ថ្មីៗ៖\n" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "scrolled": true, + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [], + "source": [ + "class Net:\n", + " def __init__(self):\n", + " self.layers = []\n", + " \n", + " def add(self,l):\n", + " self.layers.append(l)\n", + " \n", + " def forward(self,x):\n", + " for l in self.layers:\n", + " x = l.forward(x)\n", + " return x\n", + " \n", + " def backward(self,z):\n", + " for l in self.layers[::-1]:\n", + " z = l.backward(z)\n", + " return z\n", + " \n", + " def update(self,lr):\n", + " for l in self.layers:\n", + " if 'update' in l.__dir__():\n", + " l.update(lr)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ជាមួយនឹងថ្នាក់ `Net` นี้ ការបញ្ជាក់និងការបណ្តុះបណ្តាលគំរូរបស់យើងក្លាយទៅជាច្បាស់លាស់ជាងមុន៖\n" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initial loss=0.6212072429381601, accuracy=0.6875: \n", + "Final loss=0.44369925927417986, accuracy=0.8: \n", + "Test loss=0.4767711377257787, accuracy=0.85: \n" + ] + } + ], + "source": [ + "net = Net()\n", + "net.add(Linear(2,2))\n", + "net.add(Softmax())\n", + "loss = CrossEntropyLoss()\n", + "\n", + "def get_loss_acc(x,y,loss=CrossEntropyLoss()):\n", + " p = net.forward(x)\n", + " l = loss.forward(p,y)\n", + " pred = np.argmax(p,axis=1)\n", + " acc = (pred==y).mean()\n", + " return l,acc\n", + "\n", + "print(\"Initial loss={}, accuracy={}: \".format(*get_loss_acc(train_x,train_labels)))\n", + "\n", + "def train_epoch(net, train_x, train_labels, loss=CrossEntropyLoss(), batch_size=4, lr=0.1):\n", + " for i in range(0,len(train_x),batch_size):\n", + " xb = train_x[i:i+batch_size]\n", + " yb = train_labels[i:i+batch_size]\n", + "\n", + " p = net.forward(xb)\n", + " l = loss.forward(p,yb)\n", + " dp = loss.backward(l)\n", + " dx = net.backward(dp)\n", + " net.update(lr)\n", + " \n", + "train_epoch(net,train_x,train_labels)\n", + " \n", + "print(\"Final loss={}, accuracy={}: \".format(*get_loss_acc(train_x,train_labels)))\n", + "print(\"Test loss={}, accuracy={}: \".format(*get_loss_acc(test_x,test_labels)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## គូប្រ៊ូប្រតិបត្តិការបណ្ដុះបណ្ដាល\n", + "\n", + "វានឹងល្អបើបានឃើញដំណើរការបណ្ដុះបណ្ដាលបណ្តាញឆ្លាតវិជ្ជាដោយមើលឃើញជាថ្នាក់ភ្នាក់ងារ! យើងនឹងកំណត់មុខងារ `train_and_plot` សម្រាប់បញ្ចូលចូលនោះ។ ដើម្បីមើលស្ថិតិរបស់បណ្តាញ យើងនឹងប្រើផែនទីកម្រិត អ្នកនេះយើងនឹងបង្ហាញតម្លៃនៃលទ្ធផលបណ្តាញដោយប្រើពណ៌ផ្សេងៗគ្នា។\n", + "\n", + "> កុំបារម្ភ ប្រសិនបើអ្នកមិនយល់អ្វីពីកូដគូប្រ៊ូខាងក្រោម - វាអសំខាន់ជាងគេក្នុងការយល់ដឹងពីមូលដ្ឋាននៃគំនិតបណ្តាញយួរ។\n" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [], + "source": [ + "def train_and_plot(n_epoch, net, loss=CrossEntropyLoss(), batch_size=4, lr=0.1):\n", + " fig, ax = plt.subplots(2, 1)\n", + " ax[0].set_xlim(0, n_epoch + 1)\n", + " ax[0].set_ylim(0,1)\n", + "\n", + " train_acc = np.empty((n_epoch, 3))\n", + " train_acc[:] = np.NAN\n", + " valid_acc = np.empty((n_epoch, 3))\n", + " valid_acc[:] = np.NAN\n", + "\n", + " for epoch in range(1, n_epoch + 1):\n", + "\n", + " train_epoch(net,train_x,train_labels,loss,batch_size,lr)\n", + " tloss, taccuracy = get_loss_acc(train_x,train_labels,loss)\n", + " train_acc[epoch-1, :] = [epoch, tloss, taccuracy]\n", + " vloss, vaccuracy = get_loss_acc(test_x,test_labels,loss)\n", + " valid_acc[epoch-1, :] = [epoch, vloss, vaccuracy]\n", + " \n", + " ax[0].set_ylim(0, max(max(train_acc[:, 2]), max(valid_acc[:, 2])) * 1.1)\n", + "\n", + " plot_training_progress(train_acc[:, 0], (train_acc[:, 2],\n", + " valid_acc[:, 2]), fig, ax[0])\n", + " plot_decision_boundary(net, fig, ax[1])\n", + " fig.canvas.draw()\n", + " fig.canvas.flush_events()\n", + "\n", + " return train_acc, valid_acc" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [], + "source": [ + "import matplotlib.cm as cm\n", + "\n", + "def plot_decision_boundary(net, fig, ax):\n", + " draw_colorbar = True\n", + " # remove previous plot\n", + " while ax.collections:\n", + " ax.collections.pop()\n", + " draw_colorbar = False\n", + "\n", + " # generate countour grid\n", + " x_min, x_max = train_x[:, 0].min() - 1, train_x[:, 0].max() + 1\n", + " y_min, y_max = train_x[:, 1].min() - 1, train_x[:, 1].max() + 1\n", + " xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1),\n", + " np.arange(y_min, y_max, 0.1))\n", + " grid_points = np.c_[xx.ravel().astype('float32'), yy.ravel().astype('float32')]\n", + " n_classes = max(train_labels)+1\n", + " while train_x.shape[1] > grid_points.shape[1]:\n", + " # pad dimensions (plot only the first two)\n", + " grid_points = np.c_[grid_points,\n", + " np.empty(len(xx.ravel())).astype('float32')]\n", + " grid_points[:, -1].fill(train_x[:, grid_points.shape[1]-1].mean())\n", + "\n", + " # evaluate predictions\n", + " prediction = np.array(net.forward(grid_points))\n", + " # for two classes: prediction difference\n", + " if (n_classes == 2):\n", + " Z = np.array([0.5+(p[0]-p[1])/2.0 for p in prediction]).reshape(xx.shape)\n", + " else:\n", + " Z = np.array([p.argsort()[-1]/float(n_classes-1) for p in prediction]).reshape(xx.shape)\n", + " \n", + " # draw contour\n", + " levels = np.linspace(0, 1, 40)\n", + " cs = ax.contourf(xx, yy, Z, alpha=0.4, levels = levels)\n", + " if draw_colorbar:\n", + " fig.colorbar(cs, ax=ax, ticks = [0, 0.5, 1])\n", + " c_map = [cm.jet(x) for x in np.linspace(0.0, 1.0, n_classes) ]\n", + " colors = [c_map[l] for l in train_labels]\n", + " ax.scatter(train_x[:, 0], train_x[:, 1], marker='o', c=colors, s=60, alpha = 0.5)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [], + "source": [ + "def plot_training_progress(x, y_data, fig, ax):\n", + " styles = ['k--', 'g-']\n", + " # remove previous plot\n", + " while ax.lines:\n", + " ax.lines.pop()\n", + " # draw updated lines\n", + " for i in range(len(y_data)):\n", + " ax.plot(x, y_data[i], styles[i])\n", + " ax.legend(ax.lines, ['training accuracy', 'validation accuracy'],\n", + " loc='upper center', ncol = 2)" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.get_websocket_type = function () {\n if (typeof WebSocket !== 'undefined') {\n return WebSocket;\n } else if (typeof MozWebSocket !== 'undefined') {\n return MozWebSocket;\n } else {\n alert(\n 'Your browser does not have WebSocket support. ' +\n 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n 'Firefox 4 and 5 are also supported but you ' +\n 'have to enable WebSockets in about:config.'\n );\n }\n};\n\nmpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n this.id = figure_id;\n\n this.ws = websocket;\n\n this.supports_binary = this.ws.binaryType !== undefined;\n\n if (!this.supports_binary) {\n var warnings = document.getElementById('mpl-warnings');\n if (warnings) {\n warnings.style.display = 'block';\n warnings.textContent =\n 'This browser does not support binary websocket messages. ' +\n 'Performance may be slow.';\n }\n }\n\n this.imageObj = new Image();\n\n this.context = undefined;\n this.message = undefined;\n this.canvas = undefined;\n this.rubberband_canvas = undefined;\n this.rubberband_context = undefined;\n this.format_dropdown = undefined;\n\n this.image_mode = 'full';\n\n this.root = document.createElement('div');\n this.root.setAttribute('style', 'display: inline-block');\n this._root_extra_style(this.root);\n\n parent_element.appendChild(this.root);\n\n this._init_header(this);\n this._init_canvas(this);\n this._init_toolbar(this);\n\n var fig = this;\n\n this.waiting = false;\n\n this.ws.onopen = function () {\n fig.send_message('supports_binary', { value: fig.supports_binary });\n fig.send_message('send_image_mode', {});\n if (fig.ratio !== 1) {\n fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\n }\n fig.send_message('refresh', {});\n };\n\n this.imageObj.onload = function () {\n if (fig.image_mode === 'full') {\n // Full images could contain transparency (where diff images\n // almost always do), so we need to clear the canvas so that\n // there is no ghosting.\n fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n }\n fig.context.drawImage(fig.imageObj, 0, 0);\n };\n\n this.imageObj.onunload = function () {\n fig.ws.close();\n };\n\n this.ws.onmessage = this._make_on_message_function(this);\n\n this.ondownload = ondownload;\n};\n\nmpl.figure.prototype._init_header = function () {\n var titlebar = document.createElement('div');\n titlebar.classList =\n 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n var titletext = document.createElement('div');\n titletext.classList = 'ui-dialog-title';\n titletext.setAttribute(\n 'style',\n 'width: 100%; text-align: center; padding: 3px;'\n );\n titlebar.appendChild(titletext);\n this.root.appendChild(titlebar);\n this.header = titletext;\n};\n\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._init_canvas = function () {\n var fig = this;\n\n var canvas_div = (this.canvas_div = document.createElement('div'));\n canvas_div.setAttribute(\n 'style',\n 'border: 1px solid #ddd;' +\n 'box-sizing: content-box;' +\n 'clear: both;' +\n 'min-height: 1px;' +\n 'min-width: 1px;' +\n 'outline: 0;' +\n 'overflow: hidden;' +\n 'position: relative;' +\n 'resize: both;'\n );\n\n function on_keyboard_event_closure(name) {\n return function (event) {\n return fig.key_event(event, name);\n };\n }\n\n canvas_div.addEventListener(\n 'keydown',\n on_keyboard_event_closure('key_press')\n );\n canvas_div.addEventListener(\n 'keyup',\n on_keyboard_event_closure('key_release')\n );\n\n this._canvas_extra_style(canvas_div);\n this.root.appendChild(canvas_div);\n\n var canvas = (this.canvas = document.createElement('canvas'));\n canvas.classList.add('mpl-canvas');\n canvas.setAttribute('style', 'box-sizing: content-box;');\n\n this.context = canvas.getContext('2d');\n\n var backingStore =\n this.context.backingStorePixelRatio ||\n this.context.webkitBackingStorePixelRatio ||\n this.context.mozBackingStorePixelRatio ||\n this.context.msBackingStorePixelRatio ||\n this.context.oBackingStorePixelRatio ||\n this.context.backingStorePixelRatio ||\n 1;\n\n this.ratio = (window.devicePixelRatio || 1) / backingStore;\n\n var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n 'canvas'\n ));\n rubberband_canvas.setAttribute(\n 'style',\n 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n );\n\n // Apply a ponyfill if ResizeObserver is not implemented by browser.\n if (this.ResizeObserver === undefined) {\n if (window.ResizeObserver !== undefined) {\n this.ResizeObserver = window.ResizeObserver;\n } else {\n var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n this.ResizeObserver = obs.ResizeObserver;\n }\n }\n\n this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n var nentries = entries.length;\n for (var i = 0; i < nentries; i++) {\n var entry = entries[i];\n var width, height;\n if (entry.contentBoxSize) {\n if (entry.contentBoxSize instanceof Array) {\n // Chrome 84 implements new version of spec.\n width = entry.contentBoxSize[0].inlineSize;\n height = entry.contentBoxSize[0].blockSize;\n } else {\n // Firefox implements old version of spec.\n width = entry.contentBoxSize.inlineSize;\n height = entry.contentBoxSize.blockSize;\n }\n } else {\n // Chrome <84 implements even older version of spec.\n width = entry.contentRect.width;\n height = entry.contentRect.height;\n }\n\n // Keep the size of the canvas and rubber band canvas in sync with\n // the canvas container.\n if (entry.devicePixelContentBoxSize) {\n // Chrome 84 implements new version of spec.\n canvas.setAttribute(\n 'width',\n entry.devicePixelContentBoxSize[0].inlineSize\n );\n canvas.setAttribute(\n 'height',\n entry.devicePixelContentBoxSize[0].blockSize\n );\n } else {\n canvas.setAttribute('width', width * fig.ratio);\n canvas.setAttribute('height', height * fig.ratio);\n }\n canvas.setAttribute(\n 'style',\n 'width: ' + width + 'px; height: ' + height + 'px;'\n );\n\n rubberband_canvas.setAttribute('width', width);\n rubberband_canvas.setAttribute('height', height);\n\n // And update the size in Python. We ignore the initial 0/0 size\n // that occurs as the element is placed into the DOM, which should\n // otherwise not happen due to the minimum size styling.\n if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n fig.request_resize(width, height);\n }\n }\n });\n this.resizeObserverInstance.observe(canvas_div);\n\n function on_mouse_event_closure(name) {\n return function (event) {\n return fig.mouse_event(event, name);\n };\n }\n\n rubberband_canvas.addEventListener(\n 'mousedown',\n on_mouse_event_closure('button_press')\n );\n rubberband_canvas.addEventListener(\n 'mouseup',\n on_mouse_event_closure('button_release')\n );\n rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\n );\n // Throttle sequential mouse events to 1 every 20ms.\n rubberband_canvas.addEventListener(\n 'mousemove',\n on_mouse_event_closure('motion_notify')\n );\n\n rubberband_canvas.addEventListener(\n 'mouseenter',\n on_mouse_event_closure('figure_enter')\n );\n rubberband_canvas.addEventListener(\n 'mouseleave',\n on_mouse_event_closure('figure_leave')\n );\n\n canvas_div.addEventListener('wheel', function (event) {\n if (event.deltaY < 0) {\n event.step = 1;\n } else {\n event.step = -1;\n }\n on_mouse_event_closure('scroll')(event);\n });\n\n canvas_div.appendChild(canvas);\n canvas_div.appendChild(rubberband_canvas);\n\n this.rubberband_context = rubberband_canvas.getContext('2d');\n this.rubberband_context.strokeStyle = '#000000';\n\n this._resize_canvas = function (width, height, forward) {\n if (forward) {\n canvas_div.style.width = width + 'px';\n canvas_div.style.height = height + 'px';\n }\n };\n\n // Disable right mouse context menu.\n this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n event.preventDefault();\n return false;\n });\n\n function set_focus() {\n canvas.focus();\n canvas_div.focus();\n }\n\n window.setTimeout(set_focus, 100);\n};\n\nmpl.figure.prototype._init_toolbar = function () {\n var fig = this;\n\n var toolbar = document.createElement('div');\n toolbar.classList = 'mpl-toolbar';\n this.root.appendChild(toolbar);\n\n function on_click_closure(name) {\n return function (_event) {\n return fig.toolbar_button_onclick(name);\n };\n }\n\n function on_mouseover_closure(tooltip) {\n return function (event) {\n if (!event.currentTarget.disabled) {\n return fig.toolbar_button_onmouseover(tooltip);\n }\n };\n }\n\n fig.buttons = {};\n var buttonGroup = document.createElement('div');\n buttonGroup.classList = 'mpl-button-group';\n for (var toolbar_ind in mpl.toolbar_items) {\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) {\n /* Instead of a spacer, we start a new button group. */\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n buttonGroup = document.createElement('div');\n buttonGroup.classList = 'mpl-button-group';\n continue;\n }\n\n var button = (fig.buttons[name] = document.createElement('button'));\n button.classList = 'mpl-widget';\n button.setAttribute('role', 'button');\n button.setAttribute('aria-disabled', 'false');\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n\n var icon_img = document.createElement('img');\n icon_img.src = '_images/' + image + '.png';\n icon_img.srcset = '_images/' + image + '_large.png 2x';\n icon_img.alt = tooltip;\n button.appendChild(icon_img);\n\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n var fmt_picker = document.createElement('select');\n fmt_picker.classList = 'mpl-widget';\n toolbar.appendChild(fmt_picker);\n this.format_dropdown = fmt_picker;\n\n for (var ind in mpl.extensions) {\n var fmt = mpl.extensions[ind];\n var option = document.createElement('option');\n option.selected = fmt === mpl.default_extension;\n option.innerHTML = fmt;\n fmt_picker.appendChild(option);\n }\n\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n};\n\nmpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n // which will in turn request a refresh of the image.\n this.send_message('resize', { width: x_pixels, height: y_pixels });\n};\n\nmpl.figure.prototype.send_message = function (type, properties) {\n properties['type'] = type;\n properties['figure_id'] = this.id;\n this.ws.send(JSON.stringify(properties));\n};\n\nmpl.figure.prototype.send_draw_message = function () {\n if (!this.waiting) {\n this.waiting = true;\n this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n }\n};\n\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n var format_dropdown = fig.format_dropdown;\n var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n fig.ondownload(fig, format);\n};\n\nmpl.figure.prototype.handle_resize = function (fig, msg) {\n var size = msg['size'];\n if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n fig._resize_canvas(size[0], size[1], msg['forward']);\n fig.send_message('refresh', {});\n }\n};\n\nmpl.figure.prototype.handle_rubberband = function (fig, msg) {\n var x0 = msg['x0'] / fig.ratio;\n var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n var x1 = msg['x1'] / fig.ratio;\n var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n x0 = Math.floor(x0) + 0.5;\n y0 = Math.floor(y0) + 0.5;\n x1 = Math.floor(x1) + 0.5;\n y1 = Math.floor(y1) + 0.5;\n var min_x = Math.min(x0, x1);\n var min_y = Math.min(y0, y1);\n var width = Math.abs(x1 - x0);\n var height = Math.abs(y1 - y0);\n\n fig.rubberband_context.clearRect(\n 0,\n 0,\n fig.canvas.width / fig.ratio,\n fig.canvas.height / fig.ratio\n );\n\n fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n};\n\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n var cursor = msg['cursor'];\n switch (cursor) {\n case 0:\n cursor = 'pointer';\n break;\n case 1:\n cursor = 'default';\n break;\n case 2:\n cursor = 'crosshair';\n break;\n case 3:\n cursor = 'move';\n break;\n }\n fig.rubberband_canvas.style.cursor = cursor;\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n for (var key in msg) {\n if (!(key in fig.buttons)) {\n continue;\n }\n fig.buttons[key].disabled = !msg[key];\n fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n }\n};\n\nmpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n if (msg['mode'] === 'PAN') {\n fig.buttons['Pan'].classList.add('active');\n fig.buttons['Zoom'].classList.remove('active');\n } else if (msg['mode'] === 'ZOOM') {\n fig.buttons['Pan'].classList.remove('active');\n fig.buttons['Zoom'].classList.add('active');\n } else {\n fig.buttons['Pan'].classList.remove('active');\n fig.buttons['Zoom'].classList.remove('active');\n }\n};\n\nmpl.figure.prototype.updated_canvas_event = function () {\n // Called whenever the canvas gets updated.\n this.send_message('ack', {});\n};\n\n// A function to construct a web socket function for onmessage handling.\n// Called in the figure constructor.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\n /* FIXME: We get \"Resource interpreted as Image but\n * transferred with MIME type text/plain:\" errors on\n * Chrome. But how to set the MIME type? It doesn't seem\n * to be part of the websocket stream */\n img.type = 'image/png';\n }\n\n /* Free the memory for the previous frames */\n if (fig.imageObj.src) {\n (window.URL || window.webkitURL).revokeObjectURL(\n fig.imageObj.src\n );\n }\n\n fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n img\n );\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n } else if (\n typeof evt.data === 'string' &&\n evt.data.slice(0, 21) === 'data:image/png;base64'\n ) {\n fig.imageObj.src = evt.data;\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n }\n\n var msg = JSON.parse(evt.data);\n var msg_type = msg['type'];\n\n // Call the \"handle_{type}\" callback, which takes\n // the figure and JSON message as its only arguments.\n try {\n var callback = fig['handle_' + msg_type];\n } catch (e) {\n console.log(\n \"No handler for the '\" + msg_type + \"' message type: \",\n msg\n );\n return;\n }\n\n if (callback) {\n try {\n // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n callback(fig, msg);\n } catch (e) {\n console.log(\n \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n e,\n e.stack,\n msg\n );\n }\n }\n };\n};\n\n// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.findpos = function (e) {\n //this section is from http://www.quirksmode.org/js/events_properties.html\n var targ;\n if (!e) {\n e = window.event;\n }\n if (e.target) {\n targ = e.target;\n } else if (e.srcElement) {\n targ = e.srcElement;\n }\n if (targ.nodeType === 3) {\n // defeat Safari bug\n targ = targ.parentNode;\n }\n\n // pageX,Y are the mouse positions relative to the document\n var boundingRect = targ.getBoundingClientRect();\n var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n\n return { x: x, y: y };\n};\n\n/*\n * return a copy of an object with only non-object keys\n * we need this to avoid circular references\n * http://stackoverflow.com/a/24161582/3208463\n */\nfunction simpleKeys(original) {\n return Object.keys(original).reduce(function (obj, key) {\n if (typeof original[key] !== 'object') {\n obj[key] = original[key];\n }\n return obj;\n }, {});\n}\n\nmpl.figure.prototype.mouse_event = function (event, name) {\n var canvas_pos = mpl.findpos(event);\n\n if (name === 'button_press') {\n this.canvas.focus();\n this.canvas_div.focus();\n }\n\n var x = canvas_pos.x * this.ratio;\n var y = canvas_pos.y * this.ratio;\n\n this.send_message(name, {\n x: x,\n y: y,\n button: event.button,\n step: event.step,\n guiEvent: simpleKeys(event),\n });\n\n /* This prevents the web browser from automatically changing to\n * the text insertion cursor when the button is pressed. We want\n * to control all of the cursor setting manually through the\n * 'cursor' event from matplotlib */\n event.preventDefault();\n return false;\n};\n\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.figure.prototype.toolbar_button_onclick = function (name) {\n if (name === 'download') {\n this.handle_save(this, null);\n } else {\n this.send_message('toolbar_button', { name: name });\n }\n};\n\nmpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n this.message.textContent = tooltip;\n};\n\n///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n// prettier-ignore\nvar _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\nmpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar comm_websocket_adapter = function (comm) {\n // Create a \"websocket\"-like object which calls the given IPython comm\n // object with the appropriate methods. Currently this is a non binary\n // socket, so there is still some room for performance tuning.\n var ws = {};\n\n ws.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\n\n ws.close = function () {\n comm.close();\n };\n ws.send = function (m) {\n //console.log('sending', m);\n comm.send(m);\n };\n // Register the callback with on_msg.\n comm.on_msg(function (msg) {\n //console.log('receiving', msg['content']['data'], msg);\n var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.mpl_figure_comm = function (comm, msg) {\n // This is the function which gets called when the mpl process\n // starts-up an IPython Comm through the \"matplotlib\" channel.\n\n var id = msg.content.data.id;\n // Get hold of the div created by the display call when the Comm\n // socket was opened in Python.\n var element = document.getElementById(id);\n var ws_proxy = comm_websocket_adapter(comm);\n\n function ondownload(figure, _format) {\n window.open(figure.canvas.toDataURL());\n }\n\n var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n\n // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n // web socket which is closed, not our websocket->open comm proxy.\n ws_proxy.onopen();\n\n fig.parent_element = element;\n fig.cell_info = mpl.find_output_cell(\"
\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.on(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\nmpl.figure.prototype.handle_close = function (fig, msg) {\n var width = fig.canvas.width / fig.ratio;\n fig.cell_info[0].output_area.element.off(\n 'cleared',\n fig._remove_fig_handler\n );\n fig.resizeObserverInstance.unobserve(fig.canvas_div);\n\n // Update the output cell to use the data from the current canvas.\n fig.push_to_output();\n var dataURL = fig.canvas.toDataURL();\n // Re-enable the keyboard manager in IPython - without this line, in FF,\n // the notebook keyboard shortcuts fail.\n IPython.keyboard_manager.enable();\n fig.parent_element.innerHTML =\n '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.figure.prototype.push_to_output = function (_remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width / this.ratio;\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] =\n '';\n};\n\nmpl.figure.prototype.updated_canvas_event = function () {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message('ack', {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () {\n fig.push_to_output();\n }, 1000);\n};\n\nmpl.figure.prototype._init_toolbar = function () {\n var fig = this;\n\n var toolbar = document.createElement('div');\n toolbar.classList = 'btn-toolbar';\n this.root.appendChild(toolbar);\n\n function on_click_closure(name) {\n return function (_event) {\n return fig.toolbar_button_onclick(name);\n };\n }\n\n function on_mouseover_closure(tooltip) {\n return function (event) {\n if (!event.currentTarget.disabled) {\n return fig.toolbar_button_onmouseover(tooltip);\n }\n };\n }\n\n fig.buttons = {};\n var buttonGroup = document.createElement('div');\n buttonGroup.classList = 'btn-group';\n var button;\n for (var toolbar_ind in mpl.toolbar_items) {\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) {\n /* Instead of a spacer, we start a new button group. */\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n buttonGroup = document.createElement('div');\n buttonGroup.classList = 'btn-group';\n continue;\n }\n\n button = fig.buttons[name] = document.createElement('button');\n button.classList = 'btn btn-default';\n button.href = '#';\n button.title = name;\n button.innerHTML = '';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\nmpl.figure.prototype._remove_fig_handler = function (event) {\n var fig = event.data.fig;\n if (event.target !== this) {\n // Ignore bubbled events from children.\n return;\n }\n fig.close_ws(fig, {});\n};\n\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.figure.prototype._canvas_extra_style = function (el) {\n // this is important to make the div 'focusable\n el.setAttribute('tabindex', 0);\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n } else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n};\n\nmpl.figure.prototype._key_event_extra = function (event, _name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager) {\n manager = IPython.keyboard_manager;\n }\n\n // Check for shift+enter\n if (event.shiftKey && event.which === 13) {\n this.canvas_div.blur();\n // select the cell after this one\n var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n IPython.notebook.select(index + 1);\n }\n};\n\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.find_output_cell = function (html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i = 0; i < ncells; i++) {\n var cell = cells[i];\n if (cell.cell_type === 'code') {\n for (var j = 0; j < cell.output_area.outputs.length; j++) {\n var data = cell.output_area.outputs[j];\n if (data.data) {\n // IPython >= 3 moved mimebundle to data attribute of output\n data = data.data;\n }\n if (data['text/html'] === html_output) {\n return [cell, data, j];\n }\n }\n }\n }\n};\n\n// Register the function which deals with the matplotlib target/channel.\n// The kernel may be null if the page has been refreshed.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib nbagg \n", + "net = Net()\n", + "net.add(Linear(2,2))\n", + "net.add(Softmax())\n", + "\n", + "res = train_and_plot(30,net,lr=0.005)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "បន្ទាប់ពីរត់ក្រឡាចត្រង្គខាងលើអ្នកគួរតែអាចមើលឃើញយ៉ាងអន្តរជាតិថា ខ្សែស្រមោលរវាងថ្នាក់ប្រែប្រួលដូចម្តេចក្នុងអំឡុងពេលហ្វឹកហាត់។ សូមកត់សម្គាល់ថាយើងបានជ្រើសរើសអត្រាការរៀនតិចណាស់ ដូច្នេះយើងអាចឃើញដំណើរការនេះបាន។\n", + "\n", + "## ម៉ូដែលបន្ទាត់ច្រើន\n", + "\n", + "បណ្តាញខាងលើត្រូវបានបង្កើតឡើងពីបន្ទាត់ជាច្រើន តែយើងនៅតែមានតែថ្នាក់ `Linear` មួយប៉ុណ្ណោះ ដែលជាផ្នែកបែងចែកពិតប្រាកដ។ តើអ្វីប្រសើរទៅប្រសិនបើយើងសម្រេចចិត្តបន្ថែមបន្ទាត់បែបនេះច្រើន?\n", + "\n", + "អស្ចារ្យណាស់ កូដរបស់យើងនឹងដំណើរការ! អ្វីដែលមានសារៈសំខាន់ខ្លាំង គឺនៅចន្លោះបន្ទាត់ linear យើងត្រូវមានមុខងារបើកបរ**activation function**មិនមែនលីនេអ៊ែរ ដូចជា `tanh`។ បើគ្មានមុខងារមិនលីនេអ៊ែរនេះ បន្ទាត់ linear ច្រើននឹងមានអំណាចបញ្ចេញពន្យល់ដូចតែបន្ទាន់ linear តែមួយប៉ុណ្ណោះ - ពីព្រោះការរួមបញ្ចូលមុខងារ linear ស្របគ្នាលីនេអ៊ែរផងដែរ!\n" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [], + "source": [ + "class Tanh:\n", + " def forward(self,x):\n", + " y = np.tanh(x)\n", + " self.y = y\n", + " return y\n", + " def backward(self,dy):\n", + " return (1.0-self.y**2)*dy" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ការបន្ថែមស្រទាប់ជាច្រើនមានហេតុផល ព្រោះខុសពីបណ្តាញស្រទាប់តែមួយ ម៉ូដែលមានស្រទាប់ច្រើននឹងអាចចាត់ថ្នាក់បានយ៉ាងត្រឹមត្រូវនូវក្រុមទិន្នន័យដែលមិនអាចបំបែកដោយរបារដោយបន្ទាត់។ វា​ជា​ឧទាហរណ៍​ម៉ូ​ដែល​ដែល​មាន​ស្រទាប់​ច្រើន​នឹង **ជាប់មានប្រសិទ្ធភាព** ជាង។\n", + "\n", + "> វាអាចបង្ហាញបានថា ជាមួយនឹងចំនួនធ neuron គ្រប់គ្រាន់ ម៉ូដែលស្រទាប់ពីរអាចចាត់ថ្នាក់ក្រុមទិន្នន័យកោងណាមួយបាន ហើយបណ្តាញស្រទាប់បីអាចចាត់ថ្នាក់បានគ្រប់ក្រុមដោយស្មើរនឹងគ្រាន់តែប៉ះពាល់។\n", + "\n", + "ជាតារាង គណិតវិទ្យា multi-layered perceptron នឹងត្រូវបានបង្ហាញតាមមុខងារដែលស្មុគស្មាញជាងក្រោមកំណត់ដោយ$f_\\theta$ ដែលអាចគណនាក្នុងជំហានជាច្រើន៖\n", + "* $z_1 = W_1\\times x+b_1$\n", + "* $z_2 = W_2\\times\\alpha(z_1)+b_2$\n", + "* $f = \\sigma(z_2)$\n", + "\n", + "នៅទីនេះ $\\alpha$ គឺជាមុខងារបញ្ចេញសញ្ញាពុំមែនបន្ទាត់មួយ, $\\sigma$ គឺជាមុខងារ softmax, ហើយ $\\theta=\\langle W_1,b_1,W_2,b_2\\rangle$ គឺជាពារ៉ាម៉ែត្រ។\n", + "\n", + "អាល់ហ្គារីធึម gradient descent នឹងនៅដដែល ប៉ុន្តែជំហានគណនាគន្លងនៃ gradient នឹងពិបាកជាង។ ដោយប្រើច្បាប់ច្របាច់ខ្សែ បើយើងអាចគណនាដេរីវេជាចាងដូចជា៖\n", + "\n", + "$$\\begin{align}\n", + "\\frac{\\partial\\mathcal{L}}{\\partial W_2} &= \\color{red}{\\frac{\\partial\\mathcal{L}}{\\partial\\sigma}\\frac{\\partial\\sigma}{\\partial z_2}}\\color{black}{\\frac{\\partial z_2}{\\partial W_2}} \\\\\n", + "\\frac{\\partial\\mathcal{L}}{\\partial W_1} &= \\color{red}{\\frac{\\partial\\mathcal{L}}{\\partial\\sigma}\\frac{\\partial\\sigma}{\\partial z_2}}\\color{black}{\\frac{\\partial z_2}{\\partial\\alpha}\\frac{\\partial\\alpha}{\\partial z_1}\\frac{\\partial z_1}{\\partial W_1}}\n", + "\\end{align}\n", + "$$\n", + "\n", + "សូមគោរពថា ចំណុចចាប់ផ្តើមនៃអប្បបរមាទាំងឡាយទាំងនេះនៅតែដូចគ្នា ហើយអាចបន្តការបង្រ្កាបត្រឡប់ក្រោយលើស្រទាប់បន្ទាត់តែមួយ ដើម្បីកែតម្រូវទំងន់បន្ថែមទៅលើក្រាហ្វិចគណនា។\n", + "\n", + "ឥឡូវនេះចូលចិត្តសាកល្បងជាមួយបណ្តាញស្រទាប់ពីរ៖\n" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [], + "source": [ + "net = Net()\n", + "net.add(Linear(2,10))\n", + "net.add(Tanh())\n", + "net.add(Linear(10,2))\n", + "net.add(Softmax())\n", + "loss = CrossEntropyLoss()" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "scrolled": false, + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.get_websocket_type = function () {\n if (typeof WebSocket !== 'undefined') {\n return WebSocket;\n } else if (typeof MozWebSocket !== 'undefined') {\n return MozWebSocket;\n } else {\n alert(\n 'Your browser does not have WebSocket support. ' +\n 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n 'Firefox 4 and 5 are also supported but you ' +\n 'have to enable WebSockets in about:config.'\n );\n }\n};\n\nmpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n this.id = figure_id;\n\n this.ws = websocket;\n\n this.supports_binary = this.ws.binaryType !== undefined;\n\n if (!this.supports_binary) {\n var warnings = document.getElementById('mpl-warnings');\n if (warnings) {\n warnings.style.display = 'block';\n warnings.textContent =\n 'This browser does not support binary websocket messages. ' +\n 'Performance may be slow.';\n }\n }\n\n this.imageObj = new Image();\n\n this.context = undefined;\n this.message = undefined;\n this.canvas = undefined;\n this.rubberband_canvas = undefined;\n this.rubberband_context = undefined;\n this.format_dropdown = undefined;\n\n this.image_mode = 'full';\n\n this.root = document.createElement('div');\n this.root.setAttribute('style', 'display: inline-block');\n this._root_extra_style(this.root);\n\n parent_element.appendChild(this.root);\n\n this._init_header(this);\n this._init_canvas(this);\n this._init_toolbar(this);\n\n var fig = this;\n\n this.waiting = false;\n\n this.ws.onopen = function () {\n fig.send_message('supports_binary', { value: fig.supports_binary });\n fig.send_message('send_image_mode', {});\n if (fig.ratio !== 1) {\n fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\n }\n fig.send_message('refresh', {});\n };\n\n this.imageObj.onload = function () {\n if (fig.image_mode === 'full') {\n // Full images could contain transparency (where diff images\n // almost always do), so we need to clear the canvas so that\n // there is no ghosting.\n fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n }\n fig.context.drawImage(fig.imageObj, 0, 0);\n };\n\n this.imageObj.onunload = function () {\n fig.ws.close();\n };\n\n this.ws.onmessage = this._make_on_message_function(this);\n\n this.ondownload = ondownload;\n};\n\nmpl.figure.prototype._init_header = function () {\n var titlebar = document.createElement('div');\n titlebar.classList =\n 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n var titletext = document.createElement('div');\n titletext.classList = 'ui-dialog-title';\n titletext.setAttribute(\n 'style',\n 'width: 100%; text-align: center; padding: 3px;'\n );\n titlebar.appendChild(titletext);\n this.root.appendChild(titlebar);\n this.header = titletext;\n};\n\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._init_canvas = function () {\n var fig = this;\n\n var canvas_div = (this.canvas_div = document.createElement('div'));\n canvas_div.setAttribute(\n 'style',\n 'border: 1px solid #ddd;' +\n 'box-sizing: content-box;' +\n 'clear: both;' +\n 'min-height: 1px;' +\n 'min-width: 1px;' +\n 'outline: 0;' +\n 'overflow: hidden;' +\n 'position: relative;' +\n 'resize: both;'\n );\n\n function on_keyboard_event_closure(name) {\n return function (event) {\n return fig.key_event(event, name);\n };\n }\n\n canvas_div.addEventListener(\n 'keydown',\n on_keyboard_event_closure('key_press')\n );\n canvas_div.addEventListener(\n 'keyup',\n on_keyboard_event_closure('key_release')\n );\n\n this._canvas_extra_style(canvas_div);\n this.root.appendChild(canvas_div);\n\n var canvas = (this.canvas = document.createElement('canvas'));\n canvas.classList.add('mpl-canvas');\n canvas.setAttribute('style', 'box-sizing: content-box;');\n\n this.context = canvas.getContext('2d');\n\n var backingStore =\n this.context.backingStorePixelRatio ||\n this.context.webkitBackingStorePixelRatio ||\n this.context.mozBackingStorePixelRatio ||\n this.context.msBackingStorePixelRatio ||\n this.context.oBackingStorePixelRatio ||\n this.context.backingStorePixelRatio ||\n 1;\n\n this.ratio = (window.devicePixelRatio || 1) / backingStore;\n\n var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n 'canvas'\n ));\n rubberband_canvas.setAttribute(\n 'style',\n 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n );\n\n // Apply a ponyfill if ResizeObserver is not implemented by browser.\n if (this.ResizeObserver === undefined) {\n if (window.ResizeObserver !== undefined) {\n this.ResizeObserver = window.ResizeObserver;\n } else {\n var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n this.ResizeObserver = obs.ResizeObserver;\n }\n }\n\n this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n var nentries = entries.length;\n for (var i = 0; i < nentries; i++) {\n var entry = entries[i];\n var width, height;\n if (entry.contentBoxSize) {\n if (entry.contentBoxSize instanceof Array) {\n // Chrome 84 implements new version of spec.\n width = entry.contentBoxSize[0].inlineSize;\n height = entry.contentBoxSize[0].blockSize;\n } else {\n // Firefox implements old version of spec.\n width = entry.contentBoxSize.inlineSize;\n height = entry.contentBoxSize.blockSize;\n }\n } else {\n // Chrome <84 implements even older version of spec.\n width = entry.contentRect.width;\n height = entry.contentRect.height;\n }\n\n // Keep the size of the canvas and rubber band canvas in sync with\n // the canvas container.\n if (entry.devicePixelContentBoxSize) {\n // Chrome 84 implements new version of spec.\n canvas.setAttribute(\n 'width',\n entry.devicePixelContentBoxSize[0].inlineSize\n );\n canvas.setAttribute(\n 'height',\n entry.devicePixelContentBoxSize[0].blockSize\n );\n } else {\n canvas.setAttribute('width', width * fig.ratio);\n canvas.setAttribute('height', height * fig.ratio);\n }\n canvas.setAttribute(\n 'style',\n 'width: ' + width + 'px; height: ' + height + 'px;'\n );\n\n rubberband_canvas.setAttribute('width', width);\n rubberband_canvas.setAttribute('height', height);\n\n // And update the size in Python. We ignore the initial 0/0 size\n // that occurs as the element is placed into the DOM, which should\n // otherwise not happen due to the minimum size styling.\n if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n fig.request_resize(width, height);\n }\n }\n });\n this.resizeObserverInstance.observe(canvas_div);\n\n function on_mouse_event_closure(name) {\n return function (event) {\n return fig.mouse_event(event, name);\n };\n }\n\n rubberband_canvas.addEventListener(\n 'mousedown',\n on_mouse_event_closure('button_press')\n );\n rubberband_canvas.addEventListener(\n 'mouseup',\n on_mouse_event_closure('button_release')\n );\n rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\n );\n // Throttle sequential mouse events to 1 every 20ms.\n rubberband_canvas.addEventListener(\n 'mousemove',\n on_mouse_event_closure('motion_notify')\n );\n\n rubberband_canvas.addEventListener(\n 'mouseenter',\n on_mouse_event_closure('figure_enter')\n );\n rubberband_canvas.addEventListener(\n 'mouseleave',\n on_mouse_event_closure('figure_leave')\n );\n\n canvas_div.addEventListener('wheel', function (event) {\n if (event.deltaY < 0) {\n event.step = 1;\n } else {\n event.step = -1;\n }\n on_mouse_event_closure('scroll')(event);\n });\n\n canvas_div.appendChild(canvas);\n canvas_div.appendChild(rubberband_canvas);\n\n this.rubberband_context = rubberband_canvas.getContext('2d');\n this.rubberband_context.strokeStyle = '#000000';\n\n this._resize_canvas = function (width, height, forward) {\n if (forward) {\n canvas_div.style.width = width + 'px';\n canvas_div.style.height = height + 'px';\n }\n };\n\n // Disable right mouse context menu.\n this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n event.preventDefault();\n return false;\n });\n\n function set_focus() {\n canvas.focus();\n canvas_div.focus();\n }\n\n window.setTimeout(set_focus, 100);\n};\n\nmpl.figure.prototype._init_toolbar = function () {\n var fig = this;\n\n var toolbar = document.createElement('div');\n toolbar.classList = 'mpl-toolbar';\n this.root.appendChild(toolbar);\n\n function on_click_closure(name) {\n return function (_event) {\n return fig.toolbar_button_onclick(name);\n };\n }\n\n function on_mouseover_closure(tooltip) {\n return function (event) {\n if (!event.currentTarget.disabled) {\n return fig.toolbar_button_onmouseover(tooltip);\n }\n };\n }\n\n fig.buttons = {};\n var buttonGroup = document.createElement('div');\n buttonGroup.classList = 'mpl-button-group';\n for (var toolbar_ind in mpl.toolbar_items) {\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) {\n /* Instead of a spacer, we start a new button group. */\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n buttonGroup = document.createElement('div');\n buttonGroup.classList = 'mpl-button-group';\n continue;\n }\n\n var button = (fig.buttons[name] = document.createElement('button'));\n button.classList = 'mpl-widget';\n button.setAttribute('role', 'button');\n button.setAttribute('aria-disabled', 'false');\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n\n var icon_img = document.createElement('img');\n icon_img.src = '_images/' + image + '.png';\n icon_img.srcset = '_images/' + image + '_large.png 2x';\n icon_img.alt = tooltip;\n button.appendChild(icon_img);\n\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n var fmt_picker = document.createElement('select');\n fmt_picker.classList = 'mpl-widget';\n toolbar.appendChild(fmt_picker);\n this.format_dropdown = fmt_picker;\n\n for (var ind in mpl.extensions) {\n var fmt = mpl.extensions[ind];\n var option = document.createElement('option');\n option.selected = fmt === mpl.default_extension;\n option.innerHTML = fmt;\n fmt_picker.appendChild(option);\n }\n\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n};\n\nmpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n // which will in turn request a refresh of the image.\n this.send_message('resize', { width: x_pixels, height: y_pixels });\n};\n\nmpl.figure.prototype.send_message = function (type, properties) {\n properties['type'] = type;\n properties['figure_id'] = this.id;\n this.ws.send(JSON.stringify(properties));\n};\n\nmpl.figure.prototype.send_draw_message = function () {\n if (!this.waiting) {\n this.waiting = true;\n this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n }\n};\n\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n var format_dropdown = fig.format_dropdown;\n var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n fig.ondownload(fig, format);\n};\n\nmpl.figure.prototype.handle_resize = function (fig, msg) {\n var size = msg['size'];\n if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n fig._resize_canvas(size[0], size[1], msg['forward']);\n fig.send_message('refresh', {});\n }\n};\n\nmpl.figure.prototype.handle_rubberband = function (fig, msg) {\n var x0 = msg['x0'] / fig.ratio;\n var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n var x1 = msg['x1'] / fig.ratio;\n var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n x0 = Math.floor(x0) + 0.5;\n y0 = Math.floor(y0) + 0.5;\n x1 = Math.floor(x1) + 0.5;\n y1 = Math.floor(y1) + 0.5;\n var min_x = Math.min(x0, x1);\n var min_y = Math.min(y0, y1);\n var width = Math.abs(x1 - x0);\n var height = Math.abs(y1 - y0);\n\n fig.rubberband_context.clearRect(\n 0,\n 0,\n fig.canvas.width / fig.ratio,\n fig.canvas.height / fig.ratio\n );\n\n fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n};\n\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n var cursor = msg['cursor'];\n switch (cursor) {\n case 0:\n cursor = 'pointer';\n break;\n case 1:\n cursor = 'default';\n break;\n case 2:\n cursor = 'crosshair';\n break;\n case 3:\n cursor = 'move';\n break;\n }\n fig.rubberband_canvas.style.cursor = cursor;\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n for (var key in msg) {\n if (!(key in fig.buttons)) {\n continue;\n }\n fig.buttons[key].disabled = !msg[key];\n fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n }\n};\n\nmpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n if (msg['mode'] === 'PAN') {\n fig.buttons['Pan'].classList.add('active');\n fig.buttons['Zoom'].classList.remove('active');\n } else if (msg['mode'] === 'ZOOM') {\n fig.buttons['Pan'].classList.remove('active');\n fig.buttons['Zoom'].classList.add('active');\n } else {\n fig.buttons['Pan'].classList.remove('active');\n fig.buttons['Zoom'].classList.remove('active');\n }\n};\n\nmpl.figure.prototype.updated_canvas_event = function () {\n // Called whenever the canvas gets updated.\n this.send_message('ack', {});\n};\n\n// A function to construct a web socket function for onmessage handling.\n// Called in the figure constructor.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\n /* FIXME: We get \"Resource interpreted as Image but\n * transferred with MIME type text/plain:\" errors on\n * Chrome. But how to set the MIME type? It doesn't seem\n * to be part of the websocket stream */\n img.type = 'image/png';\n }\n\n /* Free the memory for the previous frames */\n if (fig.imageObj.src) {\n (window.URL || window.webkitURL).revokeObjectURL(\n fig.imageObj.src\n );\n }\n\n fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n img\n );\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n } else if (\n typeof evt.data === 'string' &&\n evt.data.slice(0, 21) === 'data:image/png;base64'\n ) {\n fig.imageObj.src = evt.data;\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n }\n\n var msg = JSON.parse(evt.data);\n var msg_type = msg['type'];\n\n // Call the \"handle_{type}\" callback, which takes\n // the figure and JSON message as its only arguments.\n try {\n var callback = fig['handle_' + msg_type];\n } catch (e) {\n console.log(\n \"No handler for the '\" + msg_type + \"' message type: \",\n msg\n );\n return;\n }\n\n if (callback) {\n try {\n // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n callback(fig, msg);\n } catch (e) {\n console.log(\n \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n e,\n e.stack,\n msg\n );\n }\n }\n };\n};\n\n// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.findpos = function (e) {\n //this section is from http://www.quirksmode.org/js/events_properties.html\n var targ;\n if (!e) {\n e = window.event;\n }\n if (e.target) {\n targ = e.target;\n } else if (e.srcElement) {\n targ = e.srcElement;\n }\n if (targ.nodeType === 3) {\n // defeat Safari bug\n targ = targ.parentNode;\n }\n\n // pageX,Y are the mouse positions relative to the document\n var boundingRect = targ.getBoundingClientRect();\n var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n\n return { x: x, y: y };\n};\n\n/*\n * return a copy of an object with only non-object keys\n * we need this to avoid circular references\n * http://stackoverflow.com/a/24161582/3208463\n */\nfunction simpleKeys(original) {\n return Object.keys(original).reduce(function (obj, key) {\n if (typeof original[key] !== 'object') {\n obj[key] = original[key];\n }\n return obj;\n }, {});\n}\n\nmpl.figure.prototype.mouse_event = function (event, name) {\n var canvas_pos = mpl.findpos(event);\n\n if (name === 'button_press') {\n this.canvas.focus();\n this.canvas_div.focus();\n }\n\n var x = canvas_pos.x * this.ratio;\n var y = canvas_pos.y * this.ratio;\n\n this.send_message(name, {\n x: x,\n y: y,\n button: event.button,\n step: event.step,\n guiEvent: simpleKeys(event),\n });\n\n /* This prevents the web browser from automatically changing to\n * the text insertion cursor when the button is pressed. We want\n * to control all of the cursor setting manually through the\n * 'cursor' event from matplotlib */\n event.preventDefault();\n return false;\n};\n\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.figure.prototype.toolbar_button_onclick = function (name) {\n if (name === 'download') {\n this.handle_save(this, null);\n } else {\n this.send_message('toolbar_button', { name: name });\n }\n};\n\nmpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n this.message.textContent = tooltip;\n};\n\n///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n// prettier-ignore\nvar _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\nmpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar comm_websocket_adapter = function (comm) {\n // Create a \"websocket\"-like object which calls the given IPython comm\n // object with the appropriate methods. Currently this is a non binary\n // socket, so there is still some room for performance tuning.\n var ws = {};\n\n ws.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\n\n ws.close = function () {\n comm.close();\n };\n ws.send = function (m) {\n //console.log('sending', m);\n comm.send(m);\n };\n // Register the callback with on_msg.\n comm.on_msg(function (msg) {\n //console.log('receiving', msg['content']['data'], msg);\n var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.mpl_figure_comm = function (comm, msg) {\n // This is the function which gets called when the mpl process\n // starts-up an IPython Comm through the \"matplotlib\" channel.\n\n var id = msg.content.data.id;\n // Get hold of the div created by the display call when the Comm\n // socket was opened in Python.\n var element = document.getElementById(id);\n var ws_proxy = comm_websocket_adapter(comm);\n\n function ondownload(figure, _format) {\n window.open(figure.canvas.toDataURL());\n }\n\n var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n\n // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n // web socket which is closed, not our websocket->open comm proxy.\n ws_proxy.onopen();\n\n fig.parent_element = element;\n fig.cell_info = mpl.find_output_cell(\"
\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.on(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\nmpl.figure.prototype.handle_close = function (fig, msg) {\n var width = fig.canvas.width / fig.ratio;\n fig.cell_info[0].output_area.element.off(\n 'cleared',\n fig._remove_fig_handler\n );\n fig.resizeObserverInstance.unobserve(fig.canvas_div);\n\n // Update the output cell to use the data from the current canvas.\n fig.push_to_output();\n var dataURL = fig.canvas.toDataURL();\n // Re-enable the keyboard manager in IPython - without this line, in FF,\n // the notebook keyboard shortcuts fail.\n IPython.keyboard_manager.enable();\n fig.parent_element.innerHTML =\n '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.figure.prototype.push_to_output = function (_remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width / this.ratio;\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] =\n '';\n};\n\nmpl.figure.prototype.updated_canvas_event = function () {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message('ack', {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () {\n fig.push_to_output();\n }, 1000);\n};\n\nmpl.figure.prototype._init_toolbar = function () {\n var fig = this;\n\n var toolbar = document.createElement('div');\n toolbar.classList = 'btn-toolbar';\n this.root.appendChild(toolbar);\n\n function on_click_closure(name) {\n return function (_event) {\n return fig.toolbar_button_onclick(name);\n };\n }\n\n function on_mouseover_closure(tooltip) {\n return function (event) {\n if (!event.currentTarget.disabled) {\n return fig.toolbar_button_onmouseover(tooltip);\n }\n };\n }\n\n fig.buttons = {};\n var buttonGroup = document.createElement('div');\n buttonGroup.classList = 'btn-group';\n var button;\n for (var toolbar_ind in mpl.toolbar_items) {\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) {\n /* Instead of a spacer, we start a new button group. */\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n buttonGroup = document.createElement('div');\n buttonGroup.classList = 'btn-group';\n continue;\n }\n\n button = fig.buttons[name] = document.createElement('button');\n button.classList = 'btn btn-default';\n button.href = '#';\n button.title = name;\n button.innerHTML = '';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\nmpl.figure.prototype._remove_fig_handler = function (event) {\n var fig = event.data.fig;\n if (event.target !== this) {\n // Ignore bubbled events from children.\n return;\n }\n fig.close_ws(fig, {});\n};\n\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.figure.prototype._canvas_extra_style = function (el) {\n // this is important to make the div 'focusable\n el.setAttribute('tabindex', 0);\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n } else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n};\n\nmpl.figure.prototype._key_event_extra = function (event, _name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager) {\n manager = IPython.keyboard_manager;\n }\n\n // Check for shift+enter\n if (event.shiftKey && event.which === 13) {\n this.canvas_div.blur();\n // select the cell after this one\n var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n IPython.notebook.select(index + 1);\n }\n};\n\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.find_output_cell = function (html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i = 0; i < ncells; i++) {\n var cell = cells[i];\n if (cell.cell_type === 'code') {\n for (var j = 0; j < cell.output_area.outputs.length; j++) {\n var data = cell.output_area.outputs[j];\n if (data.data) {\n // IPython >= 3 moved mimebundle to data attribute of output\n data = data.data;\n }\n if (data['text/html'] === html_output) {\n return [cell, data, j];\n }\n }\n }\n }\n};\n\n// Register the function which deals with the matplotlib target/channel.\n// The kernel may be null if the page has been refreshed.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "res = train_and_plot(30,net,lr=0.01)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## ហេតុអ្វីមិនប្រើគំរូការពិតច្រើនស្រទាប់ភាគច្រើននោះទេ?\n", + "\n", + "យើងបានឃើញថាគំរូការពិតច្រើនស្រទាប់មានភាព *រឹងមាំ* និង *បង្ហាញអត្ថន័យ* ច្រើនជាងគំរូការពិតស្រទាប់តែ១។ អ្នកអាចសំណួរថាហេតុអ្វីយើងមិនប្រើគំរូច្រើនស្រទាប់ជានិច្ចនោះទេ។ ចម្លើយសម្រាប់សំណួរនេះគឺ **ការវិលវិញលើបណ្តាញ**។\n", + "\n", + "យើងនឹងជួបប្រទាំងពាក្យនេះបន្ថែមទៀតនៅចុងក្រោយនៃផ្នែក, ប៉ុន្តែមនោសញ្ចេតនាគឺដូចជា៖ **គំរូមានអំណាចច្រើនប៉ុណ្ណា វាស្រួលបំផុតក្នុងការប៉ាន់ស្មានទិន្នន័យហ្វឹកហាត់ ហើយត្រូវការទិន្នន័យច្រើនដើម្បីធ្វើការបូកបន្ថែមបានត្រឹមត្រូវសម្រាប់ទិន្នន័យថ្មីដែលវាមិនទាន់បានឃើញមុន**។\n", + "\n", + "**គំរូរាងបន្ទាត់៖** \n", + "* យើងមានហានិភ័យទទួលបានការខាតបាត់ក្នុងការហ្វឹកហាត់ខ្ពស់ —ដែលហៅថា **underfitting**— នៅពេលគំរូមិនមានអំណាចគ្រប់គ្រាន់ក្នុងការបំបែកទិន្នន័យទាំងអស់បានត្រឹមត្រូវ។ \n", + "* ការបាត់បង់ក្នុងការត្រួតពិនិត្យ និងការបាត់បង់ក្នុងការហ្វឹកហាត់ស្រដៀងគ្នា បើសិនហើយគំរូនឹងអាចបូកបន្ថែមបានល្អចំពោះទិន្នន័យតេស្ដ។\n", + "\n", + "**គំរូច្រើនស្រទាប់ស្មុគស្មាញ** \n", + "* ការបាត់បង់ក្នុងការហ្វឹកហាត់ទាប — គំរូអាចប៉ាន់ស្មានទិន្នន័យហ្វឹកហាត់បានល្អ ពីព្រោះវាមានអំណាចបង្ហាញគ្រប់គ្រាន់។ \n", + "* ការបាត់បង់ក្នុងការត្រួតពិនិត្យអាចខ្ពស់ជាងការបាត់បង់ក្នុងការហ្វឹកហាត់ និងអាចចាប់ផ្តើមកើនឡើងក្នុងអំឡុងពេលហ្វឹកហាត់ — នេះគឺដោយសារគំរូ \"ចងចាំ\" ចំណុចហ្វឹកហាត់ ហើយបាត់បង់ \"ទិដ្ឋភាពទូទៅ\"។\n", + "\n", + "![Overfitting](../../../../../translated_images/km/overfit.a0bd57f717c15769.webp)\n", + "\n", + "> នៅលើរូបភាពនេះ, `x` គឺសម្រាប់ទិន្នន័យហ្វឹកហាត់, `o` គឺសម្រាប់ទិន្នន័យត្រួតពិនិត្យ។ ខាងឆ្វេង - គំរូរាងបន្ទាត់ (ស្រទាប់តែមួយ), វាប៉ាន់ស្មានធម្មជាតិនៃទិន្នន័យបានល្អ។ ខាងស្តាំ - គំរូដែលមានបញ្ហាវិលវិញលើបណ្តាញ, គំរូអាចប៉ាន់ស្មានទិន្នន័យហ្វឹកហាត់បានជាទៀងទាត់ ប៉ុន្តែបញ្ឈប់ការមានអត្ថន័យចំពោះទិន្នន័យផ្សេងទៀត (កំហុសត្រួតពិនិត្យខ្ពស់ណាស់)។\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## លទ្ធផលសរុប\n", + "\n", + "* ម៉ូដែលសាមញ្ញ (ស្រទាប់តិច, ន្រើនយូរ​តិច) ដែលមានចំនួនប៉ារ៉ាម៉ែត្រ​ចុះ​ខ្សោយ (\"សមត្ថភាពទាប\") មិនងាយប្រឈមនឹងបញ្ហាហូបលើពេក\n", + "* ម៉ូដែលស្មុគស្មាញ (ស្រទាប់​ច្រើន, នើរ៉ូនច្រើននៅលើស្រទាប់នីមួយៗ, សមត្ថភាពខ្ពស់) គឺមានហានិភ័យក្នុងការហូបលើពេក។ យើងត្រូវត្រួតពិនិត្យកំហុសផ្ទៀងផ្ទាត់ ដើម្បីធានាថាវាមិនបានកើនឡើងជាមួយការបន្តឱ្យបណ្តុះបណ្តាលទៀត\n", + "* ម៉ូដែលស្មុគស្មាញត្រូវការទិន្នន័យច្រើនជាងសម្រាប់បណ្តុះបណ្តាល។\n", + "* អ្នកអាចដោះស្រាយបញ្ហាហូបលើពេកដោយ:\n", + " - ធ្វើឱ្យម៉ូដែលរបស់អ្នកមានភាពសាមញ្ញ\n", + " - បង្កើនចំនួនទិន្នន័យបណ្តុះបណ្តាល\n", + "* **ចរន្តនៃការជម្លោះចន្លោះកំរិតតម្លៃ និងភាពខុសគ្នា** ជាការបង្ហាញពីការត្រូវការធ្វើការសម្របសម្រួល\n", + " - រវាងឥទ្ធិពលរបស់ម៉ូដែល និងចំនួនទិន្នន័យ\n", + " - រវាងការហូបលើពេក និងការខ្វះហូប\n", + "* មិនមានរូបមន្តតែមួយសម្រាប់បច្ចេកទេសនៃចំនួនស្រទាប់ប៉ារ៉ាម៉ែត្រ អ្វីដែលល្អសម្រាប់អ្នកគឺការធ្វើបទពិសោធន៍ផ្ទាល់\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## គោរសំណង\n", + "\n", + "សៀវភៅកំណត់ត្រានេះជាផ្នែកមួយនៃ [មេរៀនឱ្យអ្នកចាប់ផ្ដើម AI](http://github.com/microsoft/ai-for-beginners) ហើយត្រូវបានរៀបចំដោយ [Dmitry Soshnikov](http://soshnikov.com)។ វាបានចាប់ផ្ដើមពីសិក្ខាសាលាច្រកបណ្តាញប្រសាសន៍ (Neural Network Workshop) នៅ Microsoft Research Cambridge។ កូដខ្លះ និងសម្ភារៈលើកទឹកចិត្តខ្លះៗត្រូវបានយកពីការពិពណ៌នារបស់ [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) និង [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), ហើយពីឃ្លាំង [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop)។\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**ការបដិសេធ**៖ \nឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលយើងខិតខំសំរាប់ភាពត្រឹមត្រូវ សូមជ្រាបថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុស ឬការមិនត្រឹមត្រូវបាន។ ឯកសារដើមក្នុងភាសាដើមគួរត្រូវបានគេចាត់ទុកជាផ្លូវការជានិច្ច។ សម្រាប់ព័ត៌មានសំខាន់ៗ សូមផ្តល់អាទិភាពការបកប្រែដោយមនុស្សជំនាញ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ឃើញខុស ឬការបកប្រែខុសពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។\n\n" + ] + } + ], + "metadata": { + "celltoolbar": "Slideshow", + "interpreter": { + "hash": "86193a1ab0ba47eac1c69c1756090baa3b420b3eea7d4aafab8b85f8b312f0c5" + }, + "kernelspec": { + "display_name": "Python 3.9.5 64-bit ('base': conda)", + "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" + }, + "livereveal": { + "start_slideshow_at": "selected" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} \ No newline at end of file diff --git a/translations/km/lessons/3-NeuralNetworks/04-OwnFramework/README.md b/translations/km/lessons/3-NeuralNetworks/04-OwnFramework/README.md new file mode 100644 index 00000000..5ecaac66 --- /dev/null +++ b/translations/km/lessons/3-NeuralNetworks/04-OwnFramework/README.md @@ -0,0 +1,93 @@ +# សេចក្តីផ្តើមអំពីបណ្តាញប្រសាទ. Multi-Layered Perceptron + +នៅក្នុងផ្នែកមុន អ្នកបានរៀនអំពីម៉ូដែលបណ្តាញប្រសាទដ៏សាមញ្ញបំផុត - one-layered perceptron ដែលជាម៉ូដែលកម្រាស់បែងចែកពីរប្រភេទដោយបន្ទាត់។ + +នៅក្នុងផ្នែកនេះ យើងនឹងពង្រីកម៉ូដែលនេះទៅជាស៊ុមប្រព័ន្ធបណ្តាញដែលអាចបត់បែនបានច្រើនជាងនេះ ដើម្បីឲ្យយើងអាច: + +* បង្កើតការបែងចែកនៃជាច្រើនថ្នាក់ **multi-class classification** លើសពីការបែងចែកពីរថ្នាក់ +* ដោះស្រាយបញ្ហា **regression problems** លើសពីការបែងចែក +* បំបែកថ្នាក់ដែលមិនអាចបំបែកដោយបន្ទាត់បាន + +យើងនឹងបង្កើតស៊ុមប្រព័ន្ធតាមផ្នែកផ្នែកផ្ទាល់ខ្លួនក្នុងភាសា Python ដែលនឹងអនុញ្ញាតឲ្យយើងសង់ស្ថាបត្យកម្មបណ្តាញប្រសាទចម្រុះ។ + +## [សំណួរជម្រាបមុនថ្នាក់](https://ff-quizzes.netlify.app/en/ai/quiz/7) + +## ការបញ្ជាក់ច្បាស់នៃការសិក្សាម៉ាស៊ីន + +មកដើមដោយកំណត់បញ្ហាសិក្សាម៉ាស៊ីនយ៉ាងច្បាស់។ សន្មត់ថាយើងមានឈុតទិន្នន័យបណ្តុះបណ្តាល **X** ជាមួយស្លាក **Y** ហើយយើងត្រូវតែបង្កើតម៉ូដែល *f* ដែលនឹងទាយបានយ៉ាងត្រឹមត្រូវបំផុត។ គុណភាពនៃការទាយវាស់ដោយ **Loss function** ℒ. Loss functions ខាងក្រោមត្រូវបានប្រើប្រាស់ជាញឹកញាប់៖ + +* សម្រាប់បញ្ហា regression នៅពេលដែលយើងត្រូវទាយចំនួនមួយ អាចប្រើ **absolute error** ∑i|f(x(i))-y(i)|, ឬ **squared error** ∑i(f(x(i))-y(i))2 +* សម្រាប់បញ្ហាបែងចែក ថយម៉ៃយើងប្រើ **0-1 loss** (ដែលគឺដូចនឹង **accuracy** នៃម៉ូដែល), ឬ **logistic loss** + +សម្រាប់ perceptron មួយកម្រិត មុខងារ *f* ត្រូវបានកំណត់ជាមុខងារបន្ទាត់ *f(x)=wx+b* (នៅទីនេះ *w* ជាម៉ាទ្រីសទំយោល, *x* ជាវ៉ិចទ័រពិសេសបញ្ចូល, និង *b* ជាវ៉ិចទ័រជម្រុះ)។ សម្រាប់ស្ថាបត្យកម្មបណ្តាញប្រសាទផ្សេងៗ មុខងារនេះអាចមានរាងកាយស្មុគស្មាញជាងនេះ។ + +> ក្នុងករណីបែងចែក វាជាការគួរឱ្យចង់បានក្នុងការទទួលបានប្រូបាបូលហ្គី (probabilities) នៃថ្នាក់ដែលផ្គូផ្គងជាចេញពីបណ្តាញ។ ដើម្បីបម្លែងលេខដែលណាមួយទៅប្រូបាបូលហ្គី (ឧ​ត្ដ​ហរណ៍ ដើម្បីធ្វើការធម្មតារ output) យើងជាញឹកញាប់ប្រើមុខងារ **softmax** σ, ហើយមុខងារ *f* ក្លាយជា *f(x)=σ(wx+b)* + +ក្នុងការកំណត់ *f* ខាងលើ, *w* និង *b* ត្រូវបានហៅថា **parameters** θ=⟨*w,b*⟩។ បើបានផ្តល់ឈុតទិន្នន័យ ⟨**X**,**Y**⟩ យើងអាចគណនាកំហុសសរុបនៅលើទិន្នន័យទាំងមូលជាមុខងារនៃ parameters θ។ + +> ✅ **គោលបំណងនៃការបណ្តុះបណ្តាលបណ្តាញប្រសាទ គឺដើម្បីបង្រួមកំហុសដោយផ្លាស់ប្តូរ parameters θ** + +## ការរកល្បឿន Gradient Descent + +មានវិធីសាស្រ្តល្បីល្បាញមួយសម្រាប់ធ្វើអុបទីមមា​មុខងារ ដែលហៅថា **gradient descent**។ គំនិតគឺថាយើងអាចគណនាអេរកាំបន្ទាត់ (derivative) (សម្រាប់ករណីច្រើនវិមាត្រហៅថា **gradient**) នៃ loss function ទៅលើ parameters ហើយផ្លាស់ប្តូរ parameters ដោយផ្លូវមួយដែលធ្វើឲ្យកំហុសតិចបញ្ចុះ។ វាអាចកំណត់ច្បាស់បានដូចខាងក្រោម៖ + +* ចាប់ផ្តើម parameters ជាមួយតម្លៃចៃដន្យ w(0), b(0) +* ចម្លងជំហានខាងក្រោមនេះច្រើនដង៖ + - w(i+1) = w(i)-η∂ℒ/∂w + - b(i+1) = b(i)-η∂ℒ/∂b + +ក្នុងខណៈពេលបណ្តុះបណ្តាល ជំហានអុបទីមមា​ត្រូវគណនាលើទិន្នន័យទាំងមូល (ចងចាំថា loss គណនាជាមាឌតាមគំរូបណ្ដុះបណ្ដាលទាំងអស់)។ ទោះបីជាយ៉ាងណា ជីវិតពិតយើងយកផ្នែកតូចៗនៃទិន្នន័យហៅថា **minibatches** ហើយគណនាអេរកាំបន្ទាត់ផ្អែកលើផ្នែកតូចនោះ។ ដោយសារផ្នែកតូចស្រូវបានយកដោយចៃដន្យរាល់ពេល វិធីសាស្រ្តនេះហៅថា **stochastic gradient descent** (SGD)។ + +## Multi-Layered Perceptrons និង Backpropagation + +បណ្តាញមួយកម្រិត ដូចដែលយើងបានឃើញខាងលើ អាចបែងចែកថ្នាក់ដែលអាចបំបែកដោយបន្ទាត់បាន។ ដើម្បីបង្កើតម៉ូដែលខុសគ្នាជាងនេះ យើងអាចផ្គុំបណ្ដាលជាមួយស្រទាប់នៃបណ្តាញច្រើន។ គណិតវិទ្យាមានន័យថា មុខងារ *f* នឹងមានរាងស្មុគស្មាញជាងនេះ ហើយនឹងត្រូវគណនាតាមជំហានច្រើន៖ +* z1=w1x+b1 +* z2=w2α(z1)+b2 +* f = σ(z2) + +នៅទីនេះ α ជា **មុខងារបើកប្រតិកម្មមិនបន្ទាត់** (non-linear activation function) σ ជាមុខងារ softmax និង parameters θ=<*w1,b1,w2,b2*>។ + +អាល់ហ្គូរីថึម gradient descent នឹងនៅដូចគ្នា ប៉ុន្តែវារីករាជ្យញឹកញាប់ក្នុងការគណនាអេរកាំបន្ទាត់។ អាស្រ័យលើច្បាប់ការប្រមាណខ្សែ សូមគណនាអេរកាំបន្ទាត់ជា៖ + +* ∂ℒ/∂w2 = (∂ℒ/∂σ)(∂σ/∂z2)(∂z2/∂w2) +* ∂ℒ/∂w1 = (∂ℒ/∂σ)(∂σ/∂z2)(∂z2/∂α)(∂α/∂z1)(∂z1/∂w1) + +> ✅ ច្បាប់ការប្រមាណខ្សែត្រូវបានប្រើដើម្បីគណនាអេរកាំបន្ទាត់នៃមុខងារ loss ទៅលើ parameters។ + +ចំណាំថា ផ្នែកខាងឆ្វេងបំផុតនៃសមីការទាំងនេះដូចគ្នា ដូច្នោះយើងអាចគណនាអេរកាំបន្ទាត់ជាប្រសិទ្ធិភាពចាប់ពីមុខងារ loss ហើយត្រឡប់ក្រោយតាមតப்பារមខ្យល់គណនា។ ដូចនេះវិធីសាស្រ្តបណ្តុះបណ្តាល multi-layered perceptron ត្រូវបានហៅថា **backpropagation** ឬ 'backprop'។ + +compute graph + +> TODO: image citation + +> ✅ យើងនឹងពិនិត្យរឿង backprop ជាច្រើនលម្អិតនៅក្នុងឧទាហរណ៍សៀវភៅកំណត់ត្រារៀន។ + +## សន្និដ្ឋាន + +នៅក្នុងមេរៀននេះ យើងបានបង្កើតបណ្ណាល័យបណ្តាញប្រសាទផ្ទាល់ខ្លួន និងបានប្រើវាសម្រាប់បញ្ហាបែងចែកពីរគោលខ្នាតពីរសាមញ្ញមួយ។ + +## 🚀 thách thức + +ក្នុងសៀវភៅកំណត់ត្រារួមមាន អ្នកនឹងអនុវត្តស៊ុមប្រព័ន្ធផ្ទាល់ខ្លួនសម្រាប់សង់និងបណ្តុះបណ្តាល multi-layered perceptrons។ អ្នកនឹងអាចមើលឃើញលម្អិតពីរៀបរាប់របៀបដំណើរការរបស់បណ្តាញប្រសាទទំនើប។ + +បន្តទៅសៀវភៅកំណត់ត្រា [OwnFramework](OwnFramework.ipynb) ហើយអនុវត្តវា។ + +## [សំណួរបន្ទាប់ថ្នាក់](https://ff-quizzes.netlify.app/en/ai/quiz/8) + +## រៀនឡើងវិញ និងសិក្សាផ្ទាល់ខ្លួន + +Backpropagation គឺជាអាល់ហ្គូរីធម៍ទូទៅមួយដែលប្រើនៅក្នុង AI និង ML ដែលគួរឱ្យសិក្សា [លម្អិតបន្ថែម](https://wikipedia.org/wiki/Backpropagation) + +## [ការប្រឡង](lab/README.md) + +នៅក្នុងមន្ទីរពិសោធន៍នេះ អ្នកត្រូវប្រើស៊ុមប្រព័ន្ធដែលបានសង់ក្នុងមេរៀននេះ ដើម្បីដោះស្រាយបញ្ហាបែងចែកលេខគំនូរ MNIST។ + +* [ការណែនាំ](lab/README.md) +* [សៀវភៅកំណត់ត្រា](lab/MyFW_MNIST.ipynb) + +--- + + +**ការព្រមាន**៖ +ឯកសារនេះត្រូវបានបปลែរប្រែដោយសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលដែលយើងព្យាយាមសំរាប់ភាពត្រឹមត្រូវ សូមយល់ថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុស ឬការខកខាន។ ឯកសារដើមក្នុងភាសាដើមគួរត្រូវបានពិចារណាថាជាអ្នកផ្គត់ផ្គង់ព័ត៌មានដែលមានតុល្យភាព។ សម្រាប់ព័ត៌មានសំខាន់ៗ ការបកប្រែដោយមនុស្សជំនាញគឺបានណែនាំ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការយល់ខុសដែលកើតមានពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។ + \ No newline at end of file diff --git a/translations/km/lessons/3-NeuralNetworks/04-OwnFramework/lab/MyFW_MNIST.ipynb b/translations/km/lessons/3-NeuralNetworks/04-OwnFramework/lab/MyFW_MNIST.ipynb new file mode 100644 index 00000000..e4a953d2 --- /dev/null +++ b/translations/km/lessons/3-NeuralNetworks/04-OwnFramework/lab/MyFW_MNIST.ipynb @@ -0,0 +1,177 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# ការធ្វើចំណាត់ថ្នាក់លេខ MNIST ដោយប្រើ Framework របស់យើងផ្ទាល់\n", + "\n", + "ការងារពិសោធន៍ពី [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners)។\n", + "\n", + "### ការអានទិន្នន័យសំណុំ\n", + "\n", + "កូដនេះទាញយកទិន្នន័យសំណុំពីឃ្លាំងតាមអ៊ីនធឺណិត។ អ្នកក៏អាចចម្លងទិន្នន័យសំណុំដោយដៃពីថត `/data` របស់ឃ្លាំង 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": [ + "មកមើលទ្រង់ទ្រាយនៃទិន្នន័យដែលយើងមាន៖\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. កំណត់ និង​បណ្តុះបណ្តាល perceptron មួយស្រទាប់ ដោយខិតខំាត់តាមការបណ្តុះបណ្តាល និងការត្រួតពិនិត្យភាពត្រឹមត្រូវ ក្នុងអំឡុងពេលបណ្តុះបណ្តាល\n", + "1. ព្យាយាមយល់ថា តើការបណ្តុះបណ្តាលមានការតម្រឹមពេក (overfitting) បើកើតឡើង ឬអត់ ហើយកំណត់ប៉ារ៉ាម៉ែត្រស្រទាប់ឡើងវិញ ដើម្បីបង្កើនភាពត្រឹមត្រូវ\n", + "1. សារាំសារេនជំហានមុនសម្រាប់ perceptron ២-ស្រទាប់ និង ៣-ស្រទាប់។ ព្យាយាមសាកល្បងជាមួយមុខងារបង្កើតសកម្មភាពផ្សេងៗនៅក្នុងទីរួមរវាងស្រទាប់\n", + "1. ព្យាយាមឆ្លើយសំណួរខាងក្រោមៈ\n", + " - តើមុខងារបង្កើតសកម្មភាពរវាងស្រទាប់មានឥណ្ឌិពលទៅលើការងារបណ្តាញទេ?\n", + " - តើយើងត្រូវការបណ្តាញ ២-ស្រទាប់ ឬ ៣-ស្រទាប់សម្រាប់បេសកកម្មនេះទេ?\n", + " - តើអ្នកបានជួបប្រទៈបញ្ហាអ្វីខ្លះនៅពេលបណ្តុះបណ្តាលបណ្តាញ? ជាពិសេសនៅពេលចំនួនស្រទាប់កើនឡើង។\n", + " - តើទំងន់របស់បណ្តាញប្រព្រឹត្តិដូចម្តេចនៅពេលបណ្តុះបណ្តាល? អ្នកអាចបង្ហាញក្រាបតម្លៃសរុបអាប់សូរុតធំបំផុតនៃទំងន់ប្រៀបធៀបនឹងចំនួនជំនាន់ ដើម្បីយល់ពីទំនាក់ទំនង។\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\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 + }, + "nbformat": 4, + "nbformat_minor": 2 +} \ No newline at end of file diff --git a/translations/km/lessons/3-NeuralNetworks/04-OwnFramework/lab/README.md b/translations/km/lessons/3-NeuralNetworks/04-OwnFramework/lab/README.md new file mode 100644 index 00000000..8461e829 --- /dev/null +++ b/translations/km/lessons/3-NeuralNetworks/04-OwnFramework/lab/README.md @@ -0,0 +1,27 @@ +# ការបែងចែកប្រភេទ MNIST ជាមួយស៊ុមរចនាសម្ព័ន្ធផ្ទាល់ខ្លួន + +ការសិក្សាក្នុងមន្ទីរពិសោធន៍ពី [មេរៀន AI សម្រាប់អ្នកចាប់ផ្តើម](https://github.com/microsoft/ai-for-beginners)។ + +## ភារកិច្ច + +ដោះស្រាយបញ្ហាបែងចែកលេខសរសេរដោយដៃ MNIST ដោយប្រើ perceptron មាន 1, 2 និង 3 ស្រទាប់។ ប្រើស៊ុមបណ្តាញសរសៃប្រសាទដែលយើងបានបង្កើតក្នុងមេរៀន។ + +## កំណត់ត្រា Notebook + +ចាប់ផ្តើមមន្ទីរពិសោធន៍ដោយបើក [MyFW_MNIST.ipynb](MyFW_MNIST.ipynb) + +## សំណួរ + +ជាលទ្ធផលនៃមន្ទីរពិសោធន៍នេះ សូមព្យាយាមឆ្លើយសំណួរខាងក្រោម៖ + +- តើមុខងារបង្កើតសកម្មភាពរវាងស្រទាប់ មានឥទ្ធិពលដល់កម្រិតសមត្ថភាពបណ្តាញទេរឺ? +- តើយើងត្រូវការបណ្តាញមាន 2 ឬ 3 ស្រទាប់សម្រាប់ភារកិច្ចនេះទេ? +- តើអ្នកបានប្រឈមមុខនឹងបញ្ហាណាមួយក្នុងការបណ្តុះបណ្តាលបណ្តាញទេ? ជាពិសេសនៅពេលជាន់ស្រទាប់កើនឡើង។ +- តើទំងន់នៃបណ្តាញមានអាកប្បកិរិយាយ៉ាងដូចម្តេចក្នុងអំឡុងការបណ្តុះបណ្តាល? អ្នកអាចគូសតម្លៃអប្បបរមា នៃទំងន់ទល់នឹង epoch ដើម្បីយល់ពីទំនាក់ទំនងនេះ។ + +--- + + +**ការព្រមាន**៖ +ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ នៅពេលយើងខ្ញុំខំប្រឹងសម្រាប់ភាពត្រឹមត្រូវ សូមយកចិត្តទុកដាក់ថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុស ឬការខុសឆ្គង។ ឯកសារដើមនៅភាសាមូលដ្ឋានគួរត្រូវបានចាត់ទុកជាធនធានមានអំណាច។ សម្រាប់ព័ត៌មានវិជ្ជាជីវៈ សូមផ្តល់អនុសាសន៍ឲ្យប្រើការបកប្រែដោយមនុស្សវិជ្ជាជីវៈ។ យើងខ្ញុំមិនទទួលបន្ទុកចំពោះការយល់ច្រឡំ ឬការពន្យល់ខុសផ្សេងៗ ដែលើកមកពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។ + \ No newline at end of file diff --git a/translations/km/lessons/3-NeuralNetworks/05-Frameworks/IntroKeras.ipynb b/translations/km/lessons/3-NeuralNetworks/05-Frameworks/IntroKeras.ipynb new file mode 100644 index 00000000..24b34a91 --- /dev/null +++ b/translations/km/lessons/3-NeuralNetworks/05-Frameworks/IntroKeras.ipynb @@ -0,0 +1,757 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "En2vX4FuwHlu" + }, + "source": [ + "## ការណែនាំសាមញ្ញបំផុតទៅកាន់បណ្តាញប្រសាលជាមួយ Keras\n", + "\n", + "> សៀវភៅកំណត់ត្រានេះជាផ្នែកមួយនៃ [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners). សូមចូលទៅកាន់ឃ្លាំងកូដដើម្បីទទួលបានឯកសារសិក្សាពេញលេញ។\n", + "\n", + "### រចនាសម្ព័ន្ធសម្រាប់បណ្តាញប្រសាល\n", + "\n", + "មានរចនាសម្ព័ន្ធជាច្រើនសម្រាប់បណ្តុះបណ្តាលបណ្តាញប្រសាល។ ទោះបីជាយ៉ាងណាក៏ដោយ ប្រសិនបើអ្នកចង់ចាប់ផ្តើមយ៉ាងឆាប់រហ័ស និងមិនចង់ចូលទៅក្នុងព័ត៌មានលម្អិតពីរបៀបដែលវាធ្វើការពីក្នុង - អ្នកគួរតែពិចារណាប្រើ [Keras](https://keras.io/). មេរៀនខ្លីនេះនឹងជួយអ្នកចាប់ផ្តើម ហើយប្រសិនបើអ្នកចង់យល់ដល់ជ្រៅទៀតអំពីរបៀបដែលវាធ្វើការ - សូមមើលសៀវភៅកំណត់ត្រា [Introduction to Tensorflow and Keras](IntroKerasTF.ipynb).\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "8cACQoFMwHl3" + }, + "source": [ + "### ត្រៀមឱ្យបានត្រឹមត្រូវ\n", + "\n", + "Keras គឺជាផ្នែកមួយនៃរចនាសម្ព័ន្ធ Tensorflow 2.x។ សូមប្រាកដថា យើងមានកំណែ 2.x.x របស់ Tensorflow ដែលបានដំឡើង:\n", + "```\n", + "pip install tensorflow\n", + "```\n", + "ឬ\n", + "```\n", + "conda install tensorflow\n", + "```\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "xwqVx9-bwHl3", + "outputId": "2aa591b4-b647-441f-9c8e-4e0da2d517a0", + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tensorflow version = 2.7.0\n", + "Keras version = 2.7.0\n" + ] + } + ], + "source": [ + "import tensorflow as tf\n", + "from tensorflow import keras\n", + "import numpy as np\n", + "from sklearn.datasets import make_classification\n", + "import matplotlib.pyplot as plt\n", + "print(f'Tensorflow version = {tf.__version__}')\n", + "print(f'Keras version = {keras.__version__}')" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "6tp2xGV7wHl4" + }, + "source": [ + "## គំនិតមូលដ្ឋាន: តង់ស័រ\n", + "\n", + "**តង់ស័រ** គឺជាអារេពហុវិមាត្រ។ វាស្រួលយ៉ាងខ្លាំងក្នុងការប្រើតង់ស័រដើម្បីតំណាងឲ្យប្រភេទទិន្នន័យផ្សេងៗ៖\n", + "* 400x400 - រូបភាពខ្មៅ-ស\n", + "* 400x400x3 - រូបភាពពណ៌ \n", + "* 16x400x400x3 - ក្រុមតូចមួយដែលមានរូបភាពពណ៌ចំនួន 16\n", + "* 25x400x400x3 - វីដេអូ 25-fps រយៈពេលមួយវិនាទី\n", + "* 8x25x400x400x3 - ក្រុមតូចមួយដែលមានវីដេអូរយៈពេល 1 វិនាទីចំនួន 8\n", + "\n", + "តង់ស័រផ្តល់ឱ្យយើងវិធីងាយស្រួលមួយក្នុងការតំណាងទិន្នន័យបញ្ចូល/បញ្ចេញ ក៏ដូចជាទម្ងន់នៅក្នុងបណ្តាញប្រសាទ។\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "A10prCPowHl7" + }, + "source": [ + "## បញ្ហាគំរូ\n", + "\n", + "ចូរយើងពិចារណាបញ្ហាការបែងចែកចំណាត់ថ្នាក់ពីរភេទ។ ឧទាហរណ៍ល្អនៃបញ្ហាបែបនេះ គឺការបែងចែក tumour រវាង malignant និង benign អាស្រ័យលើទំហំ និងអាយុរបស់វា។ យើងចាប់ផ្តើមដោយបង្កើតទិន្នន័យគំរូ​មួយចំនួន៖\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "id": "j0OTPkGpwHl7", + "scrolled": false, + "trusted": true + }, + "outputs": [], + "source": [ + "np.random.seed(0) # pick the seed for reproducibility - change it to explore the effects of random variations\n", + "\n", + "n = 100\n", + "X, Y = make_classification(n_samples = n, n_features=2,\n", + " n_redundant=0, n_informative=2, flip_y=0.05,class_sep=1.5)\n", + "X = X.astype(np.float32)\n", + "Y = Y.astype(np.int32)\n", + "\n", + "split = [ 70*n//100 ]\n", + "train_x, test_x = np.split(X, split)\n", + "train_labels, test_labels = np.split(Y, split)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "id": "c-_BjSHPwHl8", + "scrolled": false, + "trusted": true + }, + "outputs": [], + "source": [ + "def plot_dataset(features, labels, W=None, b=None):\n", + " # prepare the plot\n", + " fig, ax = plt.subplots(1, 1)\n", + " ax.set_xlabel('$x_i[0]$ -- (feature 1)')\n", + " ax.set_ylabel('$x_i[1]$ -- (feature 2)')\n", + " colors = ['r' if l else 'b' for l in labels]\n", + " ax.scatter(features[:, 0], features[:, 1], marker='o', c=colors, s=100, alpha = 0.5)\n", + " if W is not None:\n", + " min_x = min(features[:,0])\n", + " max_x = max(features[:,1])\n", + " min_y = min(features[:,1])*(1-.1)\n", + " max_y = max(features[:,1])*(1+.1)\n", + " cx = np.array([min_x,max_x],dtype=np.float32)\n", + " cy = (0.5-W[0]*cx-b)/W[1]\n", + " ax.plot(cx,cy,'g')\n", + " ax.set_ylim(min_y,max_y)\n", + " fig.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 283 + }, + "id": "tq0vFchQwHl8", + "outputId": "9a5aa6a0-c92f-4d72-9e78-c0f615804bff", + "scrolled": false, + "trusted": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\dmitryso\\AppData\\Local\\Temp/ipykernel_103052/2721537645.py:17: UserWarning: Matplotlib is currently using module://matplotlib_inline.backend_inline, which is a non-GUI backend, so cannot show the figure.\n", + " fig.show()\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_dataset(train_x, train_labels)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ការធ្វើឲ្យទិន្នន័យមានស្ដង់ដារ\n", + "\n", + "មុនការហ្វឹកហាត់ វាគឺទូទៅដែលយើងនាំលក្ខណៈបញ្ចូលទៅក្នុងជួរស្តង់ដារ [0,1] (ឬ [-1,1])។ មូលហេតុច្បាស់លាស់សម្រាប់ចំណុចនេះយើងនឹងពន្យល់នៅពេលក្រោយក្នុងវគ្គ ប៉ុន្តែនៅសង្ខេបមូលហេតុមានដូចខាងក្រោម។ យើងចង់ជៀសវាងតម្លៃដែលឆ្លងកាត់បណ្តាញរបស់យើងឲ្យកើនឬតូចពេក ហើយយើងភាគច្រើនយល់ព្រមថាគួររក្សាតម្លៃទាំងអស់នៅក្នុងជួរតូចជិត 0។ ដូច្នេះ យើងបង្ហាប់ទម្ងន់ដោយលេខចៃដន្យតូចៗ ហើយយើងរក្សាសញ្ញាទាំងអស់នៅក្នុងជួរដូចគ្នា។\n", + "\n", + "នៅពេលធ្វើការធម្មតាទិន្នន័យ យើងត្រូវដកតម្លៃទាបបំផុត និងចែកដោយចន្លោះ។ យើងគណនាតម្លៃទាបបំផុត និងចន្លោះដោយប្រើសំណុំទិន្នន័យហ្វឹកហាត់ ហើយបន្ទាប់មកធម្មតាសំណុំទិន្នន័យសាកល្បង/ផ្ទៀងផ្ទាត់ដោយប្រើតម្លៃទាបបំផុត/ចន្លោះដូចគ្នាពីសំណុំហ្វឹកហាត់។ នេះដោយសារថាក្នុងជីវិតពិតយើងស្គាល់តែសំណុំហ្វឹកហាត់ ហើយមិនស្គាល់ទិន្នន័យថ្មីៗទាំងអស់ដែលបណ្តាញនឹងត្រូវបានស្នើឲ្យទាយ។ ពេលខ្លះ តម្លៃថ្មីអាចស្ថិតក្រៅជួរ [0,1] ប៉ុន្តែវាមិនមែនសារៈសំខាន់ខ្លាំងទេ។\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "train_x_norm = (train_x-np.min(train_x,axis=0)) / (np.max(train_x,axis=0)-np.min(train_x,axis=0))\n", + "test_x_norm = (test_x-np.min(train_x,axis=0)) / (np.max(train_x,axis=0)-np.min(train_x,axis=0))" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "SjPlpf2-wHl8" + }, + "source": [ + "## ការបណ្តុះបណ្តាលបណ្តាញមួយស្រទាប់ (Perceptron)\n", + "\n", + "នៅក្នុងករណីជាច្រើន បណ្តាញប្រសាទអាចជាលំដាប់នៃស្រទាប់។ វាអាចត្រូវបានកំណត់ក្នុង Keras ដោយប្រើម៉ូដែល `Sequential` ដូចខាងក្រោម៖\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"sequential_2\"\n", + "_________________________________________________________________\n", + " Layer (type) Output Shape Param # \n", + "=================================================================\n", + " dense_2 (Dense) (None, 1) 3 \n", + " \n", + " activation_1 (Activation) (None, 1) 0 \n", + " \n", + "=================================================================\n", + "Total params: 3\n", + "Trainable params: 3\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "model = keras.models.Sequential()\n", + "model.add(keras.Input(shape=(2,)))\n", + "model.add(keras.layers.Dense(1))\n", + "model.add(keras.layers.Activation(keras.activations.sigmoid))\n", + "\n", + "model.summary()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "នៅទីនេះ យើងបង្កើតម៉ូឌែលជាមុន ហើយបន្ទាប់មកបន្ថែមស្រទាប់ចូលទៅក្នុងវា:\n", + "* ស្រទាប់ `Input` ដំបូង (ដែលតាមពិតមិនចាត់ទុកថាជាស្រទាប់ទាំងស្រុង) មានការបញ្ជាក់អំពីទំហំការបញ្ចូលរបស់បណ្ដាញ\n", + "* ស្រទាប់ `Dense` គឺជាប្រភេទ perceptron ពិតប្រាកដ ដែលមានទម្ងន់អាចហ្វឹកហាត់បាន\n", + "* ចុងក្រោយ មានស្រទាប់មួយដែលមានមុខងារ *sigmoid* `Activation` ដើម្បីយកលទ្ធផលរបស់បណ្ដាញទៅក្នុងជួរ 0-1 (ដើម្បីធ្វើឲ្យវាជាសក្តានុភាព).\n", + "\n", + "ទំហំការបញ្ចូល និងមុខងារ activation ក៏អាចកំណត់ដោយផ្ទាល់នៅក្នុងស្រទាប់ `Dense` សម្រាប់ការសង្ខេប:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"sequential_9\"\n", + "_________________________________________________________________\n", + " Layer (type) Output Shape Param # \n", + "=================================================================\n", + " dense_9 (Dense) (None, 1) 3 \n", + " \n", + "=================================================================\n", + "Total params: 3\n", + "Trainable params: 3\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "model = keras.models.Sequential()\n", + "model.add(keras.layers.Dense(1,input_shape=(2,),activation='sigmoid'))\n", + "model.summary()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "មុនពេលបណ្តុះម៉ូដែល យើងត្រូវការ **compile it**, ដែលមានន័យចម្បងក្នុងការបញ្ជាក់ៈ\n", + "* **Loss function**, ដែលកំណត់របៀបគណនាការខាត។ ពីព្រោះយើងមានបញ្ហាការបែងចែកពីរថ្នាក់ យើងនឹងប្រើ *binary cross-entropy loss*។\n", + "* **Optimizer** សម្រាប់ប្រើ។ ជម្រើសសាមញ្ញបំផុតគឺប្រើ `sgd` សម្រាប់ *stochastic gradient descent*, ឬអ្នកអាចប្រើ optimizers ដែលស្មុគស្មាញជាង ដូចជា `adam`।\n", + "* **Metrics** ដែលយើងចង់ប្រើដើម្បីវាស់ភាពជោគជ័យនៃការបណ្តុះ។ ពីព្រោះនេះជាកិច្ចការបែងចែក (classification) មេត្រិចល្អមួយគឺ `Accuracy` (ឬ `acc` សម្រាប់ខ្លី)\n", + "\n", + "We can specify loss, metrics and optimizer either as strings, or by providing some objects from Keras framework. In our example, we need to specify `learning_rate` parameter to fine-tune learning speed of our model, and thus we provide full name of Keras SGD optimizer.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [], + "source": [ + "model.compile(optimizer=keras.optimizers.SGD(learning_rate=0.2),loss='binary_crossentropy',metrics=['acc'])" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "បន្ទាប់ពីធ្វើការ compile ម៉ូដែលរួច យើងអាចធ្វើការបណ្ដុះបណ្ដាលជាក់ស្តែងដោយហៅមុខងារ `fit`។ ព័ត៌មានប៉ារ៉ាម៉ែត្រសំខាន់បំផុតមានដូចជា៖\n", + "* `x` និង `y` កំណត់ទិន្នន័យសម្រាប់បណ្ដុះបណ្ដាល ដែលជាលក្ខណៈ (features) និង ស្លាក (labels) រៀងៗគ្នា\n", + "* បើយើងចង់អោយមានការត្រួតពិនិត្យ (validation) ក្នុងរាល់ epoch យើងអាចកំណត់ប៉ារ៉ាម៉ែត្រ `validation_data` ដែលជាក្រុមទិន្នន័យ (tuple) រួមមានលក្ខណៈ និង ស្លាក\n", + "* `epochs` កំណត់ចំនួន epoch\n", + "* បើយើងចង់ឲ្យការបណ្ដុះបណ្ដាលកើតឡើងជាក្រុមតូច (minibatches) យើងអាចកំណត់ប៉ារ៉ាម៉ែត្រ `batch_size`។ អ្នកក៏អាចបែងទិន្នន័យជាមុនដោយដៃ មុនពេលផ្ទុកចូលទៅ `x`/`y`/`validation_data` ដែលក្នុងករណីនោះអ្នកមិនចាំបាច់ប្រើ `batch_size` ទេ\n" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/10\n", + "70/70 [==============================] - 0s 4ms/step - loss: 0.3379 - acc: 0.9000 - val_loss: 0.3282 - val_acc: 0.9000\n", + "Epoch 2/10\n", + "70/70 [==============================] - 0s 2ms/step - loss: 0.3270 - acc: 0.9429 - val_loss: 0.3336 - val_acc: 0.9000\n", + "Epoch 3/10\n", + "70/70 [==============================] - 0s 2ms/step - loss: 0.3195 - acc: 0.9143 - val_loss: 0.3137 - val_acc: 0.9000\n", + "Epoch 4/10\n", + "70/70 [==============================] - 0s 2ms/step - loss: 0.3087 - acc: 0.9286 - val_loss: 0.2970 - val_acc: 0.9333\n", + "Epoch 5/10\n", + "70/70 [==============================] - 0s 3ms/step - loss: 0.3006 - acc: 0.9429 - val_loss: 0.3210 - val_acc: 0.9000\n", + "Epoch 6/10\n", + "70/70 [==============================] - 0s 3ms/step - loss: 0.3003 - acc: 0.9000 - val_loss: 0.2985 - val_acc: 0.9000\n", + "Epoch 7/10\n", + "70/70 [==============================] - 0s 3ms/step - loss: 0.2956 - acc: 0.9286 - val_loss: 0.3037 - val_acc: 0.9000\n", + "Epoch 8/10\n", + "70/70 [==============================] - 0s 3ms/step - loss: 0.2891 - acc: 0.9429 - val_loss: 0.3035 - val_acc: 0.9000\n", + "Epoch 9/10\n", + "70/70 [==============================] - 0s 3ms/step - loss: 0.2809 - acc: 0.9000 - val_loss: 0.2815 - val_acc: 0.9000\n", + "Epoch 10/10\n", + "70/70 [==============================] - 0s 3ms/step - loss: 0.2809 - acc: 0.9286 - val_loss: 0.2907 - val_acc: 0.9000\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.fit(x=train_x_norm,y=train_labels,validation_data=(test_x_norm,test_labels),epochs=10,batch_size=1)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "s4_Atvn5K4K9" + }, + "source": [ + "អ្នកអាចសាកល្បងជាមួយប៉ារ៉ាម៉ែត្រការបណ្តុះបណ្តាលផ្សេងៗ ដើម្បីមើលថាវាស្រែកលើការបណ្តុះបណ្តាលយ៉ាងដូចម្ដេច:\n", + "* ការកំណត់ `batch_size` ឱ្យធំពេក (ឬមិនបានបញ្ជាក់ឡើយ) អាចនាំឱ្យការបណ្តុះបណ្តាលមានស្ថិរភាពតិចជាងមុន, ព្រោះក្នុងទិន្នន័យដែលមានវិមាត្រទាប ការប្រើ batch តូចៗ នឹងផ្តល់ទិសដៅនៃក្រាឌីយ៉ង់បានច្បាស់ជាងសម្រាប់ករណីនិមួយៗ\n", + "* `learning_rate` ខ្ពស់ពេក អាចបណ្តាលអោយមាន overfitting ឬលទ្ធផលមិនស្ថិរម្យ, ខណៈដែល learning rate ទាបពេក មានន័យថាត្រូវការពេល epochs ច្រើនជាងដើម្បីទទួលបានលទ្ធផល\n", + "\n", + "> ចំណាំ ថា អ្នកអាចហៅមុខងារ `fit` ជាច្រើនដងជាប់ៗគ្នា ដើម្បីបន្តបណ្តុះបណ្តាញ។ ប្រសិនបើអ្នកចង់ចាប់ផ្តើមបណ្តុះពីដើម - អ្នកត្រូវរត់ឡើងវិញ cell ដែលមានការកំណត់និយមន័យម៉ូឌែល។ \n", + "\n", + "ដើម្បីធានាថាការបណ្តុះបណ្តាលរបស់យើងបានដំណើរការ យើងចូរគូសបន្ទាត់ដែលបំបែកពីរថ្នាក់។ បន្ទាត់បំបែកត្រូវបានកំណត់ដោយសមីការ $W\\times x + b = 0.5$\n" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 283 + }, + "id": "PgRTHttLwHl9", + "outputId": "e4407e1b-edf5-48e5-fdc2-da28120a3c6b", + "trusted": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\dmitryso\\AppData\\Local\\Temp/ipykernel_103052/2721537645.py:17: UserWarning: Matplotlib is currently using module://matplotlib_inline.backend_inline, which is a non-GUI backend, so cannot show the figure.\n", + " fig.show()\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_dataset(train_x,train_labels,model.layers[0].weights[0],model.layers[0].weights[1])" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "dvAiaj_JndyP" + }, + "source": [ + "## គូរក្រាហ្វនៃការបណ្តុះបណ្តាល\n", + "\n", + "`fit` មុខងារ​ត្រូវ​បង្វិល​ទៅ​វត្ថុ `history` ជាលទ្ធផល ដែលអាចប្រើសម្រាប់មើលការបាត់បង់ និងមាត្រដ្ឋាននៅលើរៀបចំ(epoch) នីមួយៗ។ ក្នុងឧទាហរណ៍ខាងក្រោម យើងនឹងចាប់ផ្តើមបណ្តុះបណ្តាលម្ដងទៀតដោយមានអត្រាសិក្សាតិច ហើយនឹងសង្កេតឃើញពីរបៀបដែលការបាត់បង់ និងភាពត្រឹមត្រូវប្រព្រឹត្តទៅ។\n", + "\n", + "> **ចំណាំ** យើងកំពុងប្រើវិធីសាស្ត្រសរសេរខុសគ្នាបន្តិចសម្រាប់កំណត់ម៉ូឌែល `Sequential`។ ជំនួសការបន្ថែមស្រទាប់មួយៗដោយប្រើ `add` យើងអាចកំណត់បញ្ជីស្រទាប់នៅពេលបង្កើតម៉ូឌែលពីដំបូង — នេះគឺជាវិធីសាស្ត្រសរសេរខ្លីជាង ហើយអ្នកប្រហែលជាចូលចិត្តប្រើវា។\n" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/10\n", + "70/70 [==============================] - 1s 5ms/step - loss: 0.6600 - acc: 0.6143 - val_loss: 0.6351 - val_acc: 0.8000\n", + "Epoch 2/10\n", + "70/70 [==============================] - 0s 2ms/step - loss: 0.6384 - acc: 0.7143 - val_loss: 0.6187 - val_acc: 0.8333\n", + "Epoch 3/10\n", + "70/70 [==============================] - 0s 2ms/step - loss: 0.6188 - acc: 0.7571 - val_loss: 0.6001 - val_acc: 0.8667\n", + "Epoch 4/10\n", + "70/70 [==============================] - 0s 3ms/step - loss: 0.6022 - acc: 0.7714 - val_loss: 0.5837 - val_acc: 0.9000\n", + "Epoch 5/10\n", + "70/70 [==============================] - 0s 2ms/step - loss: 0.5860 - acc: 0.8571 - val_loss: 0.5673 - val_acc: 0.9000\n", + "Epoch 6/10\n", + "70/70 [==============================] - 0s 2ms/step - loss: 0.5702 - acc: 0.8571 - val_loss: 0.5597 - val_acc: 0.8667\n", + "Epoch 7/10\n", + "70/70 [==============================] - 0s 2ms/step - loss: 0.5568 - acc: 0.8286 - val_loss: 0.5458 - val_acc: 0.9000\n", + "Epoch 8/10\n", + "70/70 [==============================] - 0s 2ms/step - loss: 0.5430 - acc: 0.8714 - val_loss: 0.5325 - val_acc: 0.9000\n", + "Epoch 9/10\n", + "70/70 [==============================] - 0s 2ms/step - loss: 0.5308 - acc: 0.8714 - val_loss: 0.5234 - val_acc: 0.9000\n", + "Epoch 10/10\n", + "70/70 [==============================] - 0s 3ms/step - loss: 0.5175 - acc: 0.9143 - val_loss: 0.5170 - val_acc: 0.8667\n" + ] + } + ], + "source": [ + "model = keras.models.Sequential([\n", + " keras.layers.Dense(1,input_shape=(2,),activation='sigmoid')])\n", + "model.compile(optimizer=keras.optimizers.SGD(learning_rate=0.05),loss='binary_crossentropy',metrics=['acc'])\n", + "hist = model.fit(x=train_x_norm,y=train_labels,validation_data=(test_x_norm,test_labels),epochs=10,batch_size=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(hist.history['acc'])\n", + "plt.plot(hist.history['val_acc'])" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ការបែងចែកច្រើនថ្នាក់\n", + "\n", + "If you need to solve a problem of multi-class classification, your network would have more that one output - corresponding to the number of classes $C$. Each output will contain the probability of a given class.\n", + "\n", + "> សូមចំណាំថា អ្នកអាចក៏ប្រើបណ្តាញដែលមានចេញពីរ ដើម្បីអនុវត្តចាត់ថ្នាក់ពីរភេទ ក្នុងវិធីដូចគ្នា។ នេះជាអ្វីដែលយើងនឹងបង្ហាញឥឡូវនេះ។\n", + "\n", + "When you expect a network to output a set of probabilities $p_1,\\dots, p_C$, we need all of them to add up to 1. To ensure this, we use `softmax` as a final activation function on the last layer. **Softmax** takes a vector input, and makes sure that all components of that vector are transformed into probabilities.\n", + "\n", + "Also, since the output of the network is a $C$-dimensional vector, we need labels to have the same form. This can be achieved by using **one-hot encoding**, when the number of a class $i$ is converted to a vector of zeroes, with 1 at the $i$-th position.\n", + "\n", + "To compare the probability output of the neural network with expected one-hot-encoded label, we use **cross-entropy loss** function. It takes two probability distributions, and outputs a value of how different they are.\n", + "\n", + "So, to summarize what we need to do for multi-class classification with $C$ classes:\n", + "* បណ្ដាញគួរតែមាន $C$ នឺរ៉ុង ក្នុងស្រទាប់ចុងក្រោយ\n", + "* អនុគមន៍​សកម្មភាព​ចុងក្រោយ​គួរតែ​ជា **softmax**\n", + "* ការបាត់បង់គួរតែ​ជា **cross-entropy loss**\n", + "* ស្លាកគួរត្រូវបានបម្លែងទៅជា **one-hot encoding** (this can be done using `numpy`, or using Keras utils `to_categorical`)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/10\n", + "70/70 [==============================] - 1s 6ms/step - loss: 0.6524 - acc: 0.7000 - val_loss: 0.5936 - val_acc: 0.9000\n", + "Epoch 2/10\n", + "70/70 [==============================] - 0s 2ms/step - loss: 0.5715 - acc: 0.8286 - val_loss: 0.5255 - val_acc: 0.8333\n", + "Epoch 3/10\n", + "70/70 [==============================] - 0s 3ms/step - loss: 0.4820 - acc: 0.8714 - val_loss: 0.4213 - val_acc: 0.9000\n", + "Epoch 4/10\n", + "70/70 [==============================] - 0s 3ms/step - loss: 0.4426 - acc: 0.9000 - val_loss: 0.3694 - val_acc: 0.9333\n", + "Epoch 5/10\n", + "70/70 [==============================] - 0s 3ms/step - loss: 0.3602 - acc: 0.9000 - val_loss: 0.3454 - val_acc: 0.9000\n", + "Epoch 6/10\n", + "70/70 [==============================] - 0s 3ms/step - loss: 0.3209 - acc: 0.8857 - val_loss: 0.2862 - val_acc: 0.9333\n", + "Epoch 7/10\n", + "70/70 [==============================] - 0s 3ms/step - loss: 0.2905 - acc: 0.9286 - val_loss: 0.2787 - val_acc: 0.9000\n", + "Epoch 8/10\n", + "70/70 [==============================] - 0s 3ms/step - loss: 0.2698 - acc: 0.9000 - val_loss: 0.2381 - val_acc: 0.9333\n", + "Epoch 9/10\n", + "70/70 [==============================] - 0s 3ms/step - loss: 0.2639 - acc: 0.8857 - val_loss: 0.2217 - val_acc: 0.9667\n", + "Epoch 10/10\n", + "70/70 [==============================] - 0s 2ms/step - loss: 0.2592 - acc: 0.9286 - val_loss: 0.2391 - val_acc: 0.9000\n" + ] + } + ], + "source": [ + "model = keras.models.Sequential([\n", + " keras.layers.Dense(5,input_shape=(2,),activation='relu'),\n", + " keras.layers.Dense(2,activation='softmax')\n", + "])\n", + "model.compile(keras.optimizers.Adam(0.01),'categorical_crossentropy',['acc'])\n", + "\n", + "# Two ways to convert to one-hot encoding\n", + "train_labels_onehot = keras.utils.to_categorical(train_labels)\n", + "test_labels_onehot = np.eye(2)[test_labels]\n", + "\n", + "hist = model.fit(x=train_x_norm,y=train_labels_onehot,\n", + " validation_data=[test_x_norm,test_labels_onehot],batch_size=1,epochs=10)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### ការបាត់បង់ប្រភេទរាយ (Sparse Categorical Cross-Entropy)\n", + "\n", + "ជាញឹកញាប់ ស្លាកនៅក្នុងការបែងចែកច្រើនថ្នាក់ ត្រូវបានតំណាងដោយលេខថ្នាក់។ Keras ក៏គាំទ្រការបាត់បង់ប្រភេទមួយទៀតដែលហៅថា **sparse categorical crossentropy** ដែលរំពឹងថាលេខថ្នាក់ជា​ចំនួនគត់ (integers) មិនមែនជា​វិចទ័រ one-hot ទេ។ ការប្រើប្រភេទបាត់បង់នេះ យើងអាចសម្រួលកូដបណ្តុះបណ្តាលរបស់យើង:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/10\n", + "70/70 [==============================] - 1s 6ms/step - loss: 0.2353 - acc: 0.9143 - val_loss: 0.2190 - val_acc: 0.9000\n", + "Epoch 2/10\n", + "70/70 [==============================] - 0s 3ms/step - loss: 0.2243 - acc: 0.9286 - val_loss: 0.1886 - val_acc: 0.9333\n", + "Epoch 3/10\n", + "70/70 [==============================] - 0s 2ms/step - loss: 0.2366 - acc: 0.9143 - val_loss: 0.2262 - val_acc: 0.9000\n", + "Epoch 4/10\n", + "70/70 [==============================] - 0s 2ms/step - loss: 0.2259 - acc: 0.9429 - val_loss: 0.2124 - val_acc: 0.9000\n", + "Epoch 5/10\n", + "70/70 [==============================] - 0s 2ms/step - loss: 0.2061 - acc: 0.9429 - val_loss: 0.2691 - val_acc: 0.9000\n", + "Epoch 6/10\n", + "70/70 [==============================] - 0s 2ms/step - loss: 0.2200 - acc: 0.9286 - val_loss: 0.2344 - val_acc: 0.9000\n", + "Epoch 7/10\n", + "70/70 [==============================] - 0s 3ms/step - loss: 0.2133 - acc: 0.9286 - val_loss: 0.1973 - val_acc: 0.9000\n", + "Epoch 8/10\n", + "70/70 [==============================] - 0s 3ms/step - loss: 0.2062 - acc: 0.9429 - val_loss: 0.1893 - val_acc: 0.9000\n", + "Epoch 9/10\n", + "70/70 [==============================] - 0s 3ms/step - loss: 0.2060 - acc: 0.9571 - val_loss: 0.2719 - val_acc: 0.9000\n", + "Epoch 10/10\n", + "70/70 [==============================] - 0s 3ms/step - loss: 0.2021 - acc: 0.9571 - val_loss: 0.2293 - val_acc: 0.9000\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 55, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.compile(keras.optimizers.Adam(0.01),'sparse_categorical_crossentropy',['acc'])\n", + "model.fit(x=train_x_norm,y=train_labels,validation_data=[test_x_norm,test_labels],batch_size=1,epochs=10)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ការចាត់​ថ្នាក់​ពហុ​ស្លាក\n", + "\n", + "ខ្លះពេលមានករណីដែលវត្ថុរបស់យើងអាចជាសមាជិករបស់ថ្នាក់ពីរនៅពេលតែមួយ។ ជាឧទាហរណ៍ សន្មតថាយើងចង់អភិវឌ្ឍម៉ូឌែលចាត់ថ្នាក់សម្រាប់ឆ្មា និងឆ្កែក្នុងរូបភាព ប៉ុន្តាយើងក៏ចង់អនុញ្ញាតករណីដែលមានទាំងឆ្មា និងឆ្កែផ្តល់រួមនៅក្នុងរូបភាពផងដែរ។\n", + "\n", + "ជាមួយការចាត់ថ្នាក់ពហុស្លាក មិនប្រើវិទ័រ one-hot encoded vector តែប៉ុណ្ណោះទេ យើងនឹងមានវិទ័រមួយដែលមាន 1 នៅទីតាំងដែលសមនឹងថ្នាក់ទាំងអស់ដែលពាក់ព័ន្ធនឹងគំរូបញ្ចូល។ ដូច្នេះ ផលចេញនៃបណ្តាញមិនគួរតែមានប្រហែលដែលបានធម្មតាសម្រាប់ថ្នាក់ទាំងអស់ទេ ប៉ុន្តែគួរតែព្យាករណ៍សម្រាប់មួយថ្នាក់ដោយឡែក — ដែលសមនឹងការប្រើ **sigmoid** activation function។ Cross-entropy loss នៅតែអាចប្រើជា loss function បាន។\n", + "\n", + "> **សម្គាល់** ថានេះស្រដៀងទៅនឹងការប្រើ **បណ្តាញ​ញឺរ៉ាល់​ខុសគ្នា** ដើម្បីធ្វើការចាត់ថ្នាក់ប៊ីណារីសម្រាប់ថ្នាក់ជាក់លាក់និមួយៗ - គ្រាន់តែផ្នែកដំបូងនៃបណ្តាញ (up to final classification layer) ត្រូវបានចែករំលែកសម្រាប់ថ្នាក់ទាំងអស់។\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "BmHNhUU8bqEX" + }, + "source": [ + "## សេចក្តីសង្ខេបអំពីអនុគមន៍បាត់បង់សម្រាប់ការបែងចែក\n", + "\n", + "យើងបានឃើញថា ការបែងចែកប្រភេទ **binary**, **multi-class** និង **multi-label** មានភាពខុសគ្នាតាមប្រភេទនៃអនុគមន៍បាត់បង់ និងអនុគមន៍សកម្មនៅលើស្រទាប់ចុងក្រោយនៃបណ្តាញ។ វាអាចធ្វើឲ្យភាន់ច្រឡំបន្តិច ប្រសិនបើអ្នកទើបចាប់ផ្តើមរៀន ប៉ុន្តែនេះជាកន្សោមច្បាស់ៗខ្លះដែលគួរឲ្យចងចាំ៖\n", + "* បើបណ្តាញមានចេញតែមួយ (**binary classification**), យើងប្រើអនុគមន៍សកម្ម **sigmoid**, សម្រាប់ **multiclass classification** - **softmax**\n", + "* បើថ្នាក់ចេញត្រូវបានបង្ហាញជា one-hot-encoding, អនុគមន៍បាត់បង់នឹងជា **cross entropy loss** (categorical cross-entropy), បើចេញមានជាលេខថ្នាក់ - **sparse categorical cross-entropy**. សម្រាប់ **binary classification** - ប្រើ **binary cross-entropy** (ដូចគ្នានឹង **log loss**)\n", + "* **Multi-label classification** គឺពេលដែលយើងអាចមានវត្ថុខុសគ្នាផ្សេងគ្នា ដែលទៅជាថ្នាក់ច្រើនក្នុងពេលតែមួយ។ ក្នុងករណីនេះ យើងត្រូវ encode ស្លាកដោយប្រើ one-hot encoding, ហើយប្រើ **sigmoid** ជាអនុគមន៍សកម្ម, ដូច្នេះប្រូបាប៊ីលីទីនៃថ្នាក់នីមួយៗនៅចន្លោះ 0 និង 1។\n", + "\n", + "| Classification | Label Format | Activation Function | Loss |\n", + "|---------------|-----------------------|-----------------|----------|\n", + "| ចំណាត់ថ្នាក់ពីរ (Binary) | ប្រាកដភាពនៃថ្នាក់ទី១ | sigmoid | binary crossentropy |\n", + "| ចំណាត់ថ្នាក់ពីរ (Binary) | ការកូដជា one-hot (លទ្ធផល 2 ចេញ) | softmax | categorical crossentropy |\n", + "| ចំណាត់ថ្នាក់ច្រើន (Multiclass) | ការកូដជា one-hot | softmax | categorical crossentropy |\n", + "| ចំណាត់ថ្នាក់ច្រើន (Multiclass) | លេខថ្នាក់ | softmax | sparse categorical crossentropy |\n", + "| ចំណាត់ថ្នាក់ច្រើនស្លាក (Multilabel) | ការកូដជា one-hot | sigmoid | categorical crossentropy |\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "gZ-kWx84bMDH" + }, + "source": [ + "**ភារកិច្ច**: \n", + "ប្រើ Keras ដើម្បីបណ្តុះម៉ូឌែលចាត់ថ្នាក់សម្រាប់លេខសរសេដៃ MNIST:\n", + "* ចំណាំថា Keras មាននូវសំណុំទិន្នន័យស្តង់ដារខ្លះៗ រួមទាំង MNIST។ ដើម្បីប្រើ MNIST ពី Keras អ្នកត្រូវការតែបន្ទាត់កូដពីរបីប៉ុណ្ណោះ (ព័ត៌មានបន្ថែម [នៅទីនេះ](https://www.tensorflow.org/api_docs/python/tf/keras/datasets/mnist))\n", + "* សាកល្បងកំណត់រចនាសម្ព័ន្ធបណ្តាញជាច្រើន ប្រើចំនួនស្រទាប់/នឺរ៉ូនផ្សេងៗ និងមុខងារសកម្មផ្សេងៗ។\n", + "\n", + "តើភាពត្រឹមត្រូវល្អបំផុត (accuracy) ដែលអ្នកអាចសម្រេចបានគឺប៉ុន្មាន?\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "yX6hqiafwHl9" + }, + "source": [ + "## ចំណុចសំខាន់\n", + "\n", + "* **Keras** ត្រូវបានផ្ដល់អនុសាសន៍យ៉ាងខ្លាំងសម្រាប់អ្នកចាប់ផ្តើម ព្រោះវាអនុញ្ញាតឲ្យបង្កើតបណ្ដាញពីស្រទាប់បានយ៉ាងងាយ ហើយបណ្តុះវាត្រឹមតែបន្ទាត់កូដពីរបី\n", + "* បើអ្នកត្រូវការរចនាសម្ព័ន្ធមិនស្តង់ដារ អ្នកនឹងត្រូវរៀនជ្រៅជាងនេះអំពី Tensorflow។ ឬ​អ្នកអាចសុំឲ្យនរណាម្នាក់អនុវត្តលទ្ធិភាពផ្ទាល់ខ្លួនជា Keras layer ហើយបន្ទាប់មកប្រើវា​នៅក្នុង Keras models\n", + "* គឺជាគំនិតល្អក្នុងការមើល PyTorch ផងដែរ ហើយប្រៀបធៀបវិធីសាស្ត្រ។\n", + "\n", + "សៀវភៅកំណត់ត្រា ឧទាហរណ៍ល្អមួយពីអ្នកបង្កើត Keras ស្តីអំពី Keras និង Tensorflow 2.0 អាចរកបាន [នៅទីនេះ](https://t.co/k694J95PI8).\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**សេចក្ដីបដិសេធ**:\nឯកសារ​នេះ​ត្រូវ​បាន​បកប្រែ​ដោយ​ប្រើ​សេវាបកប្រែ​ដោយបញ្ញាសិប្បនិម្មិត (AI) [Co-op Translator](https://github.com/Azure/co-op-translator)។ ទោះយើងខិតខំឲ្យបានត្រឹមត្រូវក៏ដោយ សូមយកចិត្តទុកដាក់ថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុស ឬមិនត្រឹមត្រូវ។ ឯកសារដើមនៅក្នុងភាសាដើមគួរត្រូវបានចាត់ទុកថាជាប្រភពដែលអាចទុកចិត្តបាន។ សម្រាប់ព័ត៌មានសំខាន់ៗ យើងសូមណែនាំឱ្យប្រើការបកប្រែដោយមនុស្សដែលមានវិជ្ជាជីវៈ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកប្រែខុសដែលកើតឡើងពីការប្រើប្រាស់ការបកប្រែនេះទេ។\n\n" + ] + } + ], + "metadata": { + "celltoolbar": "Slideshow", + "colab": { + "collapsed_sections": [], + "name": "IntroKerasTF.ipynb", + "provenance": [] + }, + "interpreter": { + "hash": "0cb620c6d4b9f7a635928804c26cf22403d89d98d79684e4529119355ee6d5a5" + }, + "kernelspec": { + "display_name": "Python 3.8.12 64-bit (conda)", + "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" + }, + "livereveal": { + "start_slideshow_at": "selected" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/translations/km/lessons/3-NeuralNetworks/05-Frameworks/IntroKerasTF.ipynb b/translations/km/lessons/3-NeuralNetworks/05-Frameworks/IntroKerasTF.ipynb new file mode 100644 index 00000000..e30b2b57 --- /dev/null +++ b/translations/km/lessons/3-NeuralNetworks/05-Frameworks/IntroKerasTF.ipynb @@ -0,0 +1,1449 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "En2vX4FuwHlu" + }, + "source": [ + "## ការណែនាំអំពី Tensorflow និង Keras\n", + "\n", + "> សៀវភៅកំណត់ត្រានេះជាផ្នែកមួយនៃ [កម្មវិធីសិក្សា AI សម្រាប់អ្នកចាប់ផ្ដើម](http://github.com/microsoft/ai-for-beginners). ចូលទៅកាន់ repository ដើម្បីទទួលបានសម្ភារៈសិក្សាពេញលេញ។\n", + "\n", + "### ស៊ុមសម្រាប់បណ្តាញសរសៃប្រសាទ\n", + "\n", + "យើងបានរៀនថា ដើម្បីបណ្តុះបណ្តាលបណ្តាញសរសៃប្រសាទ អ្នកត្រូវការ:\n", + "* គុណម៉ាទ្រីស (tensors) យ៉ាងរហ័ស\n", + "* គណនាអត្រាផ្លាស់ប្តូរ (gradients) ដើម្បីអនុវត្តអុបទីម៉ាយសិន gradient descent\n", + "\n", + "អ្វីដែលស៊ុមសម្រាប់បណ្តាញសរសៃប្រសាទអនុញ្ញាតឲ្យអ្នកធ្វើបាន:\n", + "* ដំណើរការជាមួយទង់ស័រ (tensors) លើឧបករណ៍គណនាណាមួយដែលមាន ដូចជា CPU ឬ GPU រឺក៏ TPU\n", + "* គណនា gradients ដោយស្វ័យប្រវត្តិ (វាត្រូវបានកូដឡើងយ៉ាងច្បាស់សម្រាប់មុខងារ tensor ទាំងអស់​ដែលមានមកជាស្រាប់)\n", + "\n", + "ជាជម្រើសបន្ថែម:\n", + "* កម្មវិធីកសាងបណ្តាញសរសៃប្រសាទ / API កម្រិតខ្ពស់ (ពិពណ៌នាបណ្តាញជា លំដាប់ស្រទាប់)\n", + "* មុខងារបណ្តុះបណ្តាលសាមញ្ញ (`fit`, ដូចក្នុង Scikit Learn)\n", + "* មានអាល់ហ្គូរិធមអុបទីម៉ាយសិនជាច្រើន លើសពី gradient descent\n", + "* អាបស្ត្រាក់ស្យុងសម្រាប់គ្រប់គ្រងទិន្នន័យ (ដែលយ៉ាងល្អគួរតែដំណើរការលើ GPU ផងដែរ)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "8cACQoFMwHl3" + }, + "source": [ + "### ស៊ុមដែលពេញនិយមបំផុត\n", + "\n", + "* Tensorflow 1.x - ស៊ុមដែលមានចូលប្រើយ៉ាងទូលំទូលាយជាលើកដំបូង (Google). អាចកំណត់ក្រាហ្វវិស្វកម្មថេរ, បញ្ចូនវាទៅ GPU, និងវាយតម្លៃវាដោយច្បាស់\n", + "* PyTorch - ស៊ុមមួយពី Facebook ដែលកំពុងកាន់តែពេញនិយម\n", + "* Keras - API កម្រិតខ្ពស់លើ Tensorflow/PyTorch សម្រាប់បញ្ចូលគ្នា និងសម្រួលការប្រើបណ្ដាញប្រសាទ (Francois Chollet)\n", + "* Tensorflow 2.x + Keras - កំណែថ្មីនៃ Tensorflow ដែលរួមបញ្ចូលមុខងារ Keras, ដែលគាំទ្រ **ក្រាហ្វវិស្វកម្មឌីណាមិច**, អនុញ្ញាតឲ្យធ្វើប្រតិបត្តិការលើ tensor ដែលស្រដៀងយ៉ាងខ្លាំងនឹង numpy (និង PyTorch)\n", + "\n", + "យើងនឹងពិចារណា Tensorflow 2.x និង Keras។ សូមធ្វើឲ្យប្រាកដថាអ្នកបានដំឡើងកំណែ 2.x.x នៃ Tensorflow:\n", + "```\n", + "pip install tensorflow\n", + "```\n", + "ឬ\n", + "```\n", + "conda install tensorflow\n", + "```\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "xwqVx9-bwHl3", + "outputId": "2aa591b4-b647-441f-9c8e-4e0da2d517a0", + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.7.0\n" + ] + } + ], + "source": [ + "import tensorflow as tf\n", + "import numpy as np\n", + "print(tf.__version__)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "6tp2xGV7wHl4" + }, + "source": [ + "## គំនិតមូលដ្ឋាន: តង់ស័រ\n", + "\n", + "**តង់ស័រ** គឺជា​អារេ​មានវិមាត្រច្រើន។ វាសមរម្យយ៉ាងខ្លាំងក្នុងការប្រើតង់ស័រដើម្បីតំណាងឱ្យប្រភេទទិន្នន័យផ្សេងៗ៖\n", + "* 400x400 - រូបភាពខ្មៅ-ស\n", + "* 400x400x3 - រូបភាពពណ៌ \n", + "* 16x400x400x3 - កញ្ចប់តូច (minibatch) នៃរូបភាពពណ៌ 16\n", + "* 25x400x400x3 - មួយវិនាទីនៃវីដេអូ 25-fps\n", + "* 8x25x400x400x3 - កញ្ចប់តូចនៃវីដេអូ 8 ដែលមានរយៈពេល 1 វិនាទី\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qG2bsaR7wHl4" + }, + "source": [ + "### តង់ស័រសាមញ្ញ\n", + "\n", + "អ្នកអាចងាយស្រួលបង្កើតតង់ស័រសាមញ្ញពីបញ្ជីនៃ np-arrays ឬ បង្កើតតង់ស័រចៃដន្យ:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ybpnk08HwHl4", + "outputId": "fad9ed4a-df82-44a0-84ea-324bc71ea46f", + "trusted": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "tf.Tensor(\n", + "[[1 2]\n", + " [3 4]], shape=(2, 2), dtype=int32)\n", + "tf.Tensor(\n", + "[[-0.33552304 -1.8252622 -1.8532339 ]\n", + " [ 1.0871267 -1.2779568 0.5240014 ]\n", + " [-0.12793781 -1.8618349 -0.9020286 ]\n", + " [ 0.5948797 0.11144501 -2.0396452 ]\n", + " [ 0.47620854 1.1726047 -0.4405675 ]\n", + " [-0.27211484 -0.08985762 -0.03376012]\n", + " [ 0.64274263 0.53368104 -0.9006528 ]\n", + " [-0.43745974 -1.0081122 -0.13442488]\n", + " [ 0.36497566 1.3221073 -1.8739727 ]\n", + " [ 0.94821155 -0.02817811 1.3563292 ]], shape=(10, 3), dtype=float32)\n" + ] + } + ], + "source": [ + "a = tf.constant([[1,2],[3,4]])\n", + "print(a)\n", + "a = tf.random.normal(shape=(10,3))\n", + "print(a)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "AXFMsV3r09Ux" + }, + "source": [ + "អ្នកអាចប្រើប្រតិបត្តិការគណិតលើទង់ស័រ ដែលអនុវត្តទៅលើធាតុរាល់មួយ ដូចជា​ក្នុង numpy។ ទង់ស័រត្រូវបានពង្រីកដោយស្វ័យប្រវត្តិទៅវិមាណដែលទាមទារ ប្រសិនបើចាំបាច់។ ដើម្បីយក numpy-array ចេញពីទង់ស័រ សូមប្រើ `.numpy()`:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "e5Nu5Xgj1DnQ", + "outputId": "0dfc8758-4ffd-4968-c7bf-6ba8d435df2e" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "tf.Tensor(\n", + "[[ 0. 0. 0. ]\n", + " [ 1.4226497 0.54730535 2.3772354 ]\n", + " [ 0.20758523 -0.03657269 0.9512053 ]\n", + " [ 0.93040276 1.9367073 -0.18641126]\n", + " [ 0.8117316 2.9978669 1.4126664 ]\n", + " [ 0.0634082 1.7354046 1.8194739 ]\n", + " [ 0.97826564 2.3589432 0.9525811 ]\n", + " [-0.1019367 0.81715 1.718809 ]\n", + " [ 0.7004987 3.1473694 -0.02073872]\n", + " [ 1.2837346 1.7970841 3.2095633 ]], shape=(10, 3), dtype=float32)\n", + "[0.71496403 0.16117539 0.15672949]\n" + ] + } + ], + "source": [ + "print(a-a[0])\n", + "print(tf.exp(a)[0].numpy())" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "uQ5zN6cVyrG7" + }, + "source": [ + "## អថេរ\n", + "\n", + "អថេរមានប្រយោជន៍សម្រាប់តំណាងឱ្យតម្លៃ tensor ដែលអាចផ្លាស់ប្តូរបានដោយប្រើ `assign` និង `assign_add`។ វាញឹកញាប់ត្រូវបានប្រើដើម្បីតំណាងឱ្យទម្ងន់របស់បណ្ដាញប្រសាទ។\n", + "\n", + "ជាឧទាហរណ៍ នេះជាវិធីមិនសូវល្អមួយ ដើម្បីទទួលបានផលបូកនៃជួរទាំងអស់នៃ tensor `a`:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "7pu0UZ-_yqfB", + "outputId": "6708c83e-02e6-4442-8757-45918eb1fbc2" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "s = tf.Variable(tf.zeros_like(a[0]))\n", + "for i in a:\n", + " s.assign_add(i)\n", + "\n", + "print(s)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "rIh1EHcezlNo" + }, + "source": [ + "Much better way to do it:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "aQIdWZ1kzn6P", + "outputId": "1c123d9a-ecd2-4f2e-828e-5ade85ac8f63" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tf.reduce_sum(a,axis=0)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "U-auwezDwHl6" + }, + "source": [ + "## ការគណនាអាំងក្រេឌីង\n", + "\n", + "សម្រាប់ការបន្ថែមក្រោយ, អ្នកត្រូវការគណនាអាំងក្រេឌីង។ វាត្រូវបានអនុវត្តដោយប្រើ idiom `tf.GradientTape()`៖\n", + " * បន្ថែមប្លុក `with tf.GradientTape` នៅជុំវិញការគណនា\n", + " * សម្គាល់នូវ tensor ដែលយើងត្រូវគណនាអាំងក្រេឌីងដោយហៅ `tape.watch` (អថេរ​ទាំងអស់ត្រូវបានតាមដានដោយស្វ័យប្រវត្តិ)\n", + " * គណនាអ្វីក៏បានដែលយើងត្រូវការ (សង់ក្រាហ្វិចកំឡុងកូដ)\n", + " * ទទួលយកអាំងក្រេឌីងដោយប្រើ `tape.gradient`\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "m8vFOXr7wHl6", + "outputId": "860ac72e-50c7-4ff2-f258-747f27194f90", + "trusted": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "tf.Tensor(\n", + "[[ 0.40935674 -0.3495818 ]\n", + " [ 0.94165146 -0.33209163]], shape=(2, 2), dtype=float32)\n" + ] + } + ], + "source": [ + "a = tf.random.normal(shape=(2, 2))\n", + "b = tf.random.normal(shape=(2, 2))\n", + "\n", + "with tf.GradientTape() as tape:\n", + " tape.watch(a) # Start recording the history of operations applied to `a`\n", + " c = tf.sqrt(tf.square(a) + tf.square(b)) # Do some math using `a`\n", + " # What's the gradient of `c` with respect to `a`?\n", + " dc_da = tape.gradient(c, a)\n", + " print(dc_da)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "8sfjBMBu59B5" + }, + "source": [ + "## ឧទាហរណ៍ ១៖ សមីការជង្ហាញស្របបន្ទាត់\n", + "\n", + "ឥឡូវនេះយើងបានដឹងគ្រប់គ្រាន់ដើម្បីដោះស្រាយបញ្ហាបុរាណនៃ **សមីការជង្ហាញស្របបន្ទាត់**។ យើងមកបង្កើតឧទាហរណ៍ទិន្នន័យសិក្សាតូចមួយ៖\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "id": "j723455WwHl7", + "trusted": true + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "from sklearn.datasets import make_classification, make_regression\n", + "from sklearn.model_selection import train_test_split\n", + "import random" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 282 + }, + "id": "WJNK_J6v6I-Z", + "outputId": "eb4a66a6-6b9a-4c8a-bc24-d81eeb2d3f27" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "np.random.seed(13) # pick the seed for reproducability - change it to explore the effects of random variations\n", + "\n", + "train_x = np.linspace(0, 3, 120)\n", + "train_labels = 2 * train_x + 0.9 + np.random.randn(*train_x.shape) * 0.5\n", + "\n", + "plt.scatter(train_x,train_labels)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Ng4rZmGc6oxk" + }, + "source": [ + "ការព្រោលការស្រោចដោយប្រើបន្ទាត់ស្រប $f_{W,b}(x) = Wx+b$ ដែល $W, b$ គឺជាប៉ារ៉ាម៉ែត្រម៉ូដែលដែលយើងត្រូវរក។ កំហុសលើសំណុំទិន្នន័យរបស់យើង $\\{x_i,y_u\\}_{i=1}^N$ (ហៅថា **មុខងារបាត់បង់**) អាចត្រូវបានកំណត់ជាកំហុសមធ្យមឯកសារ:\n", + "$$\n", + "\\mathcal{L}(W,b) = {1\\over N}\\sum_{i=1}^N (f_{W,b}(x_i)-y_i)^2\n", + "$$\n", + "\n", + "ឲ្យយើងកំណត់ម៉ូដែល និងមុខងារបាត់បង់របស់យើង៖\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "id": "QxhI4GlB6aiH" + }, + "outputs": [], + "source": [ + "input_dim = 1\n", + "output_dim = 1\n", + "learning_rate = 0.1\n", + "\n", + "# This is our weight matrix\n", + "w = tf.Variable([[100.0]])\n", + "# This is our bias vector\n", + "b = tf.Variable(tf.zeros(shape=(output_dim,)))\n", + "\n", + "def f(x):\n", + " return tf.matmul(x,w) + b\n", + "\n", + "def compute_loss(labels, predictions):\n", + " return tf.reduce_mean(tf.square(labels - predictions))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "JUxwj3367gD2" + }, + "source": [ + "យើងនឹងបណ្តុះម៉ូដែលលើជួរនៃមីនីបាច់។ យើងនឹងប្រើការបញ្ឈប់ចុះ (gradient descent) ដើម្បីកែសម្រួលប៉ារ៉ាម៉ែត្រម៉ូដែលដោយប្រើរូបមន្តដូចខាងក្រោម៖\n", + "$$\n", + "\\begin{array}{l}\n", + "W^{(n+1)}=W^{(n)}-\\eta\\frac{\\partial\\mathcal{L}}{\\partial W} \\\\\n", + "b^{(n+1)}=b^{(n)}-\\eta\\frac{\\partial\\mathcal{L}}{\\partial b} \\\\\n", + "\\end{array}\n", + "$$\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "id": "-991PErM7fJU" + }, + "outputs": [], + "source": [ + "def train_on_batch(x, y):\n", + " with tf.GradientTape() as tape:\n", + " predictions = f(x)\n", + " loss = compute_loss(y, predictions)\n", + " # Note that `tape.gradient` works with a list as well (w, b).\n", + " dloss_dw, dloss_db = tape.gradient(loss, [w, b])\n", + " w.assign_sub(learning_rate * dloss_dw)\n", + " b.assign_sub(learning_rate * dloss_db)\n", + " return loss" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "idr2VEWb9rr0" + }, + "source": [ + "ចាប់ផ្ដើមហ្វឹកហាត់។ យើងនឹងធ្វើការរត់ជាច្រើនដងតាមតម្រងទិន្នន័យ (ហៅថា **epochs**) បំបែកវាទៅជាមិនីឡុងបត់ ហើយហៅមុខងារដែលបានកំណត់ខាងលើ៖\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "id": "nOuu0qpx-wAp" + }, + "outputs": [], + "source": [ + "# Shuffle the data.\n", + "indices = np.random.permutation(len(train_x))\n", + "features = tf.constant(train_x[indices],dtype=tf.float32)\n", + "labels = tf.constant(train_labels[indices],dtype=tf.float32)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "3zdIf6c_85Ht", + "outputId": "43b04684-8b90-4c65-d5ff-20ebac61c73c" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 0: last batch loss = 94.5247\n", + "Epoch 1: last batch loss = 9.3428\n", + "Epoch 2: last batch loss = 1.4166\n", + "Epoch 3: last batch loss = 0.5224\n", + "Epoch 4: last batch loss = 0.3807\n", + "Epoch 5: last batch loss = 0.3495\n", + "Epoch 6: last batch loss = 0.3413\n", + "Epoch 7: last batch loss = 0.3390\n", + "Epoch 8: last batch loss = 0.3384\n", + "Epoch 9: last batch loss = 0.3382\n" + ] + } + ], + "source": [ + "batch_size = 4\n", + "for epoch in range(10):\n", + " for i in range(0,len(features),batch_size):\n", + " loss = train_on_batch(tf.reshape(features[i:i+batch_size],(-1,1)),tf.reshape(labels[i:i+batch_size],(-1,1)))\n", + " print('Epoch %d: last batch loss = %.4f' % (epoch, float(loss)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ឥឡូវនេះ យើងបានទទួលប៉ារ៉ាម៉ែត្រ​ដែលបានបង្កើតឡើង $W$ និង $b$។ សូមចូរយកចិត្តទុកដាក់ថា តម្លៃរបស់ពួកវាស្រដៀងគ្នាជាមួយតម្លៃដើមដែលបានប្រើនៅពេលបង្កើតដាតាសេត ($W=2, b=1$)។\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "US6q0nCBD-LL", + "outputId": "65a79620-a3eb-445b-aafb-60a60575ab0e" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(,\n", + " )" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "w,b" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 282 + }, + "id": "_e6xRMZFDnyI", + "outputId": "d202b7fe-4383-4d82-b98e-a20f3180093e" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.scatter(train_x,train_labels)\n", + "x = np.array([min(train_x),max(train_x)])\n", + "y = w.numpy()[0,0]*x+b.numpy()[0]\n", + "plt.plot(x,y,color='red')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0giuwC9GHzi8" + }, + "source": [ + "## ក្រាហ្វគណនានិងការគណនាក្នុង GPU\n", + "\n", + "ពេលណាដែលយើងគណនាលក្ខណៈ tensor មួយ Tensorflow នឹងបង្កើតក្រាហ្វគណនាដែលអាចគណនាបានលើឧបករណ៍គណនាដែលមានស្រាប់ ដូចជា CPU ឬ GPU។ ពីព្រោះយើងបានប្រើមុខងារ Python ដែលចៃដន្យនៅក្នុងកូដរបស់យើង ពួកវាមិនអាចបញ្ចូលជាផ្នែកមួយនៃក្រាហ្វគណនាបានទេ ហើយអំពីពេលបញ្ចូលកូដរបស់យើងលើ GPU យើងនឹងត្រូវបញ្ជូនទិន្នន័យចេញចូលរវាង CPU និង GPU ជាបន្តបន្ទាប់ ហើយគណនាតម្លៃមុខងារប្រភេទផ្ទាល់ខ្លួនលើ CPU។\n", + "\n", + "Tensorflow អនុញ្ញាតឱ្យយើងសម្គាល់មុខងារ Python របស់យើងដោយប្រើ `@tf.function` decorator ដែលជួយធ្វើឱ្យមុខងារនេះក្លាយជាផ្នែកមួយនៃក្រាហ្វគណនាដូចគ្នា។ decorator នេះអាចប្រើបានលើមុខងារដែលប្រើប្រតិបត្តិការលើ tensor តាមស្តង់ដារ Tensorflow។\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "id": "HK7HPLz3Hyrl" + }, + "outputs": [], + "source": [ + "@tf.function\n", + "def train_on_batch(x, y):\n", + " with tf.GradientTape() as tape:\n", + " predictions = f(x)\n", + " loss = compute_loss(y, predictions)\n", + " # Note that `tape.gradient` works with a list as well (w, b).\n", + " dloss_dw, dloss_db = tape.gradient(loss, [w, b])\n", + " w.assign_sub(learning_rate * dloss_dw)\n", + " b.assign_sub(learning_rate * dloss_db)\n", + " return loss" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "J7HusxWkGjLX" + }, + "source": [ + "កូដមិនបានផ្លាស់ប្តូរទេ ប៉ុន្តែបើអ្នកកំពុងរត់កូដនេះលើ GPU និងលើទិន្នន័យធំជាងនេះ អ្នកនឹងបានប្រទះឃើញការប្រែប្រួលនៅល្បឿន។ \n", + "\n", + "## Dataset API\n", + "\n", + "Tensorflow មាន API សមរម្យមួយសម្រាប់ធ្វើការជាមួយទិន្នន័យ។ ចូរព្យាយាមប្រើវា។ យើងនឹងបណ្តុះម៉ូឌែលរបស់យើងពីដើមផងដែរ។\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "oYro9Lbr8q0M", + "outputId": "78c0a6de-71bd-4eef-8819-439495b28672" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 0: last batch loss = 173.4585\n", + "Epoch 1: last batch loss = 13.8459\n", + "Epoch 2: last batch loss = 4.5407\n", + "Epoch 3: last batch loss = 3.7364\n", + "Epoch 4: last batch loss = 3.4334\n", + "Epoch 5: last batch loss = 3.1790\n", + "Epoch 6: last batch loss = 2.9458\n", + "Epoch 7: last batch loss = 2.7311\n", + "Epoch 8: last batch loss = 2.5332\n", + "Epoch 9: last batch loss = 2.3508\n" + ] + } + ], + "source": [ + "w.assign([[10.0]])\n", + "b.assign([0.0])\n", + "\n", + "# Create a tf.data.Dataset object for easy batched iteration\n", + "dataset = tf.data.Dataset.from_tensor_slices((train_x.astype(np.float32), train_labels.astype(np.float32)))\n", + "dataset = dataset.shuffle(buffer_size=1024).batch(256)\n", + "\n", + "for epoch in range(10):\n", + " for step, (x, y) in enumerate(dataset):\n", + " loss = train_on_batch(tf.reshape(x,(-1,1)), tf.reshape(y,(-1,1)))\n", + " print('Epoch %d: last batch loss = %.4f' % (epoch, float(loss)))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "A10prCPowHl7" + }, + "source": [ + "## ឧទាហរណ៍ 2៖ ការបែងចែកចំណាត់ថ្នាក់\n", + "\n", + "ឥឡូវនេះយើងនឹងពិចារណាបញ្ហាបែងចែកចំណាត់ថ្នាក់ពីរជាន់។ ឧទាហរណ៍មួយល្អនៃបញ្ហាបែបនេះគឺការបែងចែកមហារីករវាងមហារីកគ្រុនកំហែង និងមហារីកមិនគ្រុនកំហែងដាក់លើទំហំនិងអាយុរបស់វា។\n", + "\n", + "ម៉ូឌែលមូលដ្ឋានស្រដៀងទៅនឹង regression ប៉ុន្តែយើងត្រូវប្រើមុខងារខាតខាតផ្សេង។ ដើមចាប់ផ្តើមដោយបង្កើតទិន្នន័យគំរូ៖\n" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "id": "j0OTPkGpwHl7", + "scrolled": false, + "trusted": true + }, + "outputs": [], + "source": [ + "np.random.seed(0) # pick the seed for reproducibility - change it to explore the effects of random variations\n", + "\n", + "n = 100\n", + "X, Y = make_classification(n_samples = n, n_features=2,\n", + " n_redundant=0, n_informative=2, flip_y=0.05,class_sep=1.5)\n", + "X = X.astype(np.float32)\n", + "Y = Y.astype(np.int32)\n", + "\n", + "split = [ 70*n//100, (15+70)*n//100 ]\n", + "train_x, valid_x, test_x = np.split(X, split)\n", + "train_labels, valid_labels, test_labels = np.split(Y, split)" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "id": "c-_BjSHPwHl8", + "scrolled": false, + "trusted": true + }, + "outputs": [], + "source": [ + "def plot_dataset(features, labels, W=None, b=None):\n", + " # prepare the plot\n", + " fig, ax = plt.subplots(1, 1)\n", + " ax.set_xlabel('$x_i[0]$ -- (feature 1)')\n", + " ax.set_ylabel('$x_i[1]$ -- (feature 2)')\n", + " colors = ['r' if l else 'b' for l in labels]\n", + " ax.scatter(features[:, 0], features[:, 1], marker='o', c=colors, s=100, alpha = 0.5)\n", + " if W is not None:\n", + " min_x = min(features[:,0])\n", + " max_x = max(features[:,1])\n", + " min_y = min(features[:,1])*(1-.1)\n", + " max_y = max(features[:,1])*(1+.1)\n", + " cx = np.array([min_x,max_x],dtype=np.float32)\n", + " cy = (0.5-W[0]*cx-b)/W[1]\n", + " ax.plot(cx,cy,'g')\n", + " ax.set_ylim(min_y,max_y)\n", + " fig.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 283 + }, + "id": "tq0vFchQwHl8", + "outputId": "9a5aa6a0-c92f-4d72-9e78-c0f615804bff", + "scrolled": false, + "trusted": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\dmitryso\\AppData\\Local\\Temp/ipykernel_66184/2721537645.py:17: UserWarning: Matplotlib is currently using module://matplotlib_inline.backend_inline, which is a non-GUI backend, so cannot show the figure.\n", + " fig.show()\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_dataset(train_x, train_labels)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ការធ្វើឲ្យទិន្នន័យមានស្តង់ដារ\n", + "\n", + "មុនការបណ្តុះបណ្តាល វា​ធម្មតា​ប្រើ​ដើម្បីយកលក្ខណៈបញ្ចូល​របស់​យើង​មកក្នុង​ជួរមាន​ស្តង់ដា [0,1] (ឬ [-1,1])។ ហេតុផលជាក់លាក់សម្រាប់នេះយើង​នឹងពិភាក្សាថ្មីក្រោមវគ្គបង្រៀន ប៉ុន្តែនៅជាសង្ខេបហេតុផលគឺដូចខាងក្រោម។ យើងចង់ជៀសវាងតម្លៃ​ដែលឆ្លងកាត់បណ្ដាញរបស់យើងឲ្យធំធេងឬតូចពេក ហើយយើងទូទៅយល់ព្រមរក្សាតម្លៃទាំងអស់នៅក្នុង​ជួរតូចជិតលេខ 0។ ដូច្នេះយើងចាប់ផ្ដើមទម្រង់ទម្រង់ថាមពលជាមួយចំនួនចៃដន្យតូចៗ ហើយយើងរក្សាសញ្ញាក្នុងជួរដូចគ្នា។\n", + "\n", + "ពេលធ្វើឲ្យទិន្នន័យមានស្តង់ដា យើងត្រូវដកតម្លៃអប្បបរមា ហើយបំបែកដោយជួរ។ យើងគណនាតម្លៃអប្បបរមា និងជួរដោយប្រើទិន្នន័យបណ្តុះបណ្តាល ហើយបន្ទាប់មកធ្វើស្តង់ដាទិន្នន័យសាកល្បង/ផ្ទៀងផ្ទាត់ដោយប្រើតម្លៃអប្បបរមា/ជួរដូចគ្នាពីតម្លៃបណ្តុះបណ្តាល។ នេះគឺដោយសារថាក្នុងជីវិតពិតយើងនឹងដឹងតែប្រភេទបណ្តុះបណ្តាល ប៉ុន្តែមិនដឹងទាំងអស់នៃតម្លៃថ្មីៗដែលបណ្ដាញនឹងត្រូវបានស្នើឲ្យទាយទុកទេ។ ជាពេលខ្លះ តម្លៃថ្មីអាចធ្លាក់ចេញពីជួរ [0,1] ប៉ុន្តែវាមិនសំខាន់ទេ។\n" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [], + "source": [ + "train_x_norm = (train_x-np.min(train_x)) / (np.max(train_x)-np.min(train_x))\n", + "valid_x_norm = (valid_x-np.min(train_x)) / (np.max(train_x)-np.min(train_x))\n", + "test_x_norm = (test_x-np.min(train_x)) / (np.max(train_x)-np.min(train_x))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "SjPlpf2-wHl8" + }, + "source": [ + "## ការបណ្តុះបណ្តាលបរិមាណមួយស្រទាប់ Perceptron\n", + "\n", + "ចាប់ផ្តើមយើងនឹងប្រើម៉ាស៊ីនគណនាឌីផេរ៉ង់ស្យែលរបស់ Tensorflow ដើម្បីបណ្តុះបណ្តាលបរិមាណមួយស្រទាប់ perceptron។\n", + "\n", + "បណ្តាញប្រារព្ធចុងខ្សែសួតរបស់យើងនឹងមានបញ្ចូល 2 និងចេញ 1។ ម៉ាទ្រីកទំងន់ $W$ នឹងមានទំហំ $2\\times1$ ហើយវ៉ិចទ័រប៉ះពាល់ $b$ -- $1$។\n", + "\n", + "ម៉ូដែលស្នូលនឹងដូចគ្នានៅក្នុងឧទាហរណ៍មុន ប៉ុន្តែអនុគមន៍ការបាត់បង់នឹងជាអនុគមន៍ខូចភ្លិចលូហ្ស៊ីស្ទិក។ ដើម្បីអនុវត្តអនុគមន៍ខូចភ្លិចលូហ្ស៊ីស្ទិក យើងត្រូវទទួលបានតម្លៃ **ប្រយុទ្ធភាព** ជាចេញពីបណ្តាញរបស់យើង យ៉ាងហោចណាស់យើងត្រូវយកចេញ $z$ ទៅក្នុងចន្លោះ [0,1] ដោយប្រើអនុគមន៍សកម្មភាព `sigmoid`: $p=\\sigma(z)$។\n", + "\n", + "បើយើងទទួលបានប្រយុទ្ធភាព $p_i$ សម្រាប់តម្លៃបញ្ចូល i-th ដែលសម្របទៅនឹងចំណាត់ថ្នាក់ពិត $y_i\\in\\{0,1\\}$ យើងគណនាការខូចជា $\\mathcal{L_i}=-(y_i\\log p_i + (1-y_i)log(1-p_i))$។\n", + "\n", + "នៅក្នុង Tensorflow ជំហានទាំងពីរពីរ (អនុវត្ត sigmoid ហើយបន្ទាប់មកខូចលូហ្ស៊ីស្ទិក) អាចធ្វើបានតែមួយជាលេខហៅទៅហៅ `sigmoid_cross_entropy_with_logits`។ ពេលយើងកំពុងបណ្តុះបណ្តាលបណ្តាញនៅក្នុង minibatches យើងត្រូវរកមធ្យមនៃការខូចទាំងអស់របស់ធាតុក្នុង minibatch ដោយប្រើ `reduce_mean`:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": { + "id": "kdDxWeCqwHl8", + "trusted": true + }, + "outputs": [], + "source": [ + "W = tf.Variable(tf.random.normal(shape=(2,1)),dtype=tf.float32)\n", + "b = tf.Variable(tf.zeros(shape=(1,),dtype=tf.float32))\n", + "\n", + "learning_rate = 0.1\n", + "\n", + "@tf.function\n", + "def train_on_batch(x, y):\n", + " with tf.GradientTape() as tape:\n", + " z = tf.matmul(x, W) + b\n", + " loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=y,logits=z))\n", + " dloss_dw, dloss_db = tape.gradient(loss, [W, b])\n", + " W.assign_sub(learning_rate * dloss_dw)\n", + " b.assign_sub(learning_rate * dloss_db)\n", + " return loss" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "zAAgw0h6KzUd" + }, + "source": [ + "យើងនឹងប្រើមីនីបាសជាមួយធាតុ ១៦ ខ្នាត និងធ្វើការបណ្តុះបណ្តាលជាដំណែកប៉ុន្មានដង៖\n" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "PfyqjVb2wHl8", + "outputId": "308850b8-fe17-4cda-ac27-8bcda210f113", + "trusted": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 0: last batch loss = 0.3823\n", + "Epoch 1: last batch loss = 0.5243\n", + "Epoch 2: last batch loss = 0.4510\n", + "Epoch 3: last batch loss = 0.3261\n", + "Epoch 4: last batch loss = 0.4177\n", + "Epoch 5: last batch loss = 0.3323\n", + "Epoch 6: last batch loss = 0.6294\n", + "Epoch 7: last batch loss = 0.6334\n", + "Epoch 8: last batch loss = 0.2571\n", + "Epoch 9: last batch loss = 0.3425\n" + ] + } + ], + "source": [ + "# Create a tf.data.Dataset object for easy batched iteration\n", + "dataset = tf.data.Dataset.from_tensor_slices((train_x_norm.astype(np.float32), train_labels.astype(np.float32)))\n", + "dataset = dataset.shuffle(128).batch(2)\n", + "\n", + "for epoch in range(10):\n", + " for step, (x, y) in enumerate(dataset):\n", + " loss = train_on_batch(x, tf.expand_dims(y,1))\n", + " print('Epoch %d: last batch loss = %.4f' % (epoch, float(loss)))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "s4_Atvn5K4K9" + }, + "source": [ + "ដើម្បីធ្វើឱ្យប្រាកដថាការបណ្តុះបណ្តាលរបស់យើងបានប្រសើរឡើង សូមគូររូបបន្ទាត់ដែលបំបែកថ្នាក់ពីរនេះ។ បន្ទាត់បំបែកត្រូវបានកំណត់ដោយសមីការនេះ $W\\times x + b = 0.5$។\n" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 283 + }, + "id": "PgRTHttLwHl9", + "outputId": "e4407e1b-edf5-48e5-fdc2-da28120a3c6b", + "trusted": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\dmitryso\\AppData\\Local\\Temp/ipykernel_66184/2721537645.py:17: UserWarning: Matplotlib is currently using module://matplotlib_inline.backend_inline, which is a non-GUI backend, so cannot show the figure.\n", + " fig.show()\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_dataset(train_x,train_labels,W.numpy(),b.numpy())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "មកមើលថាម៉ូដែលរបស់យើងបង្ហាញខ្លួនយ៉ាងដូចម្តេចលើទិន្នន័យផ្ទៀងផ្ទាត់។\n" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 282 + }, + "id": "oEQswfCGrmHw", + "outputId": "3cf61882-60e1-4baa-8e51-0c31ea80875c" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 61, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "pred = tf.matmul(test_x,W)+b\n", + "fig,ax = plt.subplots(1,2)\n", + "ax[0].scatter(test_x[:,0],test_x[:,1],c=pred[:,0]>0.5)\n", + "ax[1].scatter(test_x[:,0],test_x[:,1],c=valid_labels)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ដើម្បីគណនាការត្រឹមត្រូវលើទិន្នន័យផ្ទៀងផ្ទាត់ យើងអាចបម្លែងប្រភេទប៊ូលីយ៉ែនទៅជាប៊្លរុត និងគណនាមធ្យមបាន៖\n" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "HUjdeIefsIsg", + "outputId": "f267f505-8ba4-43ef-9ebe-df124c3c05a1" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 62, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tf.reduce_mean(tf.cast(((pred[0]>0.5)==test_labels),tf.float32))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "មកពន្យល់អំពីអ្វីដែលកើតឡើងនៅទីនេះ៖ \n", + "* `pred` គឺជាអត្រានៃតម្លាភាពដែលបណ្តាញបានទាយ។ វាមិនមែនជាសមាមាត្រពិតទេ ពីព្រោះយើងមិនបានប្រើរបៀបធ្វើជាយ៉ាងសកម្ម ប៉ុន្តែតម្លៃដែលធំជាង 0.5 មានន័យសម្រាប់ថ្នាក់ 1 ហើយតម្លៃតិចជាង - សម្រាប់ថ្នាក់ 0។ \n", + "* `pred[0]>0.5` បង្កើត tensor បែប boolean នៃលទ្ធផល ដែល `True` មានន័យថា ថ្នាក់ 1 និង `False` មានន័យថា ថ្នាក់ 0 \n", + "* យើងប្រៀបធៀប tensor នោះជាមួយនឹងស្លាកដែលរំពឹងទុក `valid_labels` ទទួលបានវ៉ិកទ័របែប boolean នៃការទាយបានត្រឹមត្រូវ ដែល `True` មានន័យថា ការទាយត្រឹមត្រូវ និង `False` មានន័យថា មិនត្រឹមត្រូវ \n", + "* យើងបម្លែង tensor នោះទៅជាទ្រង់ទ្រាយចំណុចទឹកប្រាក់ ដោយប្រើ `tf.cast` \n", + "* បន្ទាប់មកយើងគណនាមធ្យមភាគដោយប្រើ `tf.reduce_mean` — នេះគឺជាចំនួនភាពត្រឹមត្រូវ ដែលយើងចង់បាន\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_95qF9lY2kHp" + }, + "source": [ + "## ការប្រើប្រាស់ Optimizers របស់ TensorFlow/Keras\n", + "\n", + "Tensorflow បានបញ្ចូលយ៉ាងជិតស្និទ្ធជាមួយ Keras ដែលមានមុខងារជាច្រើនប្រយោជន៍។ ឧទាហរណ៍ យើងអាចប្រើ **algorithm ការបង្កើនដំណើរការ** ផ្សេងៗបាន។ យើងមកធ្វើវា ហើយបោះពុម្ពចេញភាពត្រឹមត្រូវដែលទទួលបាននៅពេលបណ្តុះបណ្តាលផង។\n" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ups7nlV22ofp", + "outputId": "aa4dff06-82b9-4b2f-ca00-33970ea2b989" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 0: last batch loss = 4.7787, acc = 1.0000\n", + "Epoch 1: last batch loss = 8.4343, acc = 0.5000\n", + "Epoch 2: last batch loss = 8.3255, acc = 0.5000\n", + "Epoch 3: last batch loss = 7.5579, acc = 0.5000\n", + "Epoch 4: last batch loss = 6.5254, acc = 0.5000\n", + "Epoch 5: last batch loss = 7.3800, acc = 0.5000\n", + "Epoch 6: last batch loss = 7.7586, acc = 0.5000\n", + "Epoch 7: last batch loss = 10.4724, acc = 0.0000\n", + "Epoch 8: last batch loss = 9.4423, acc = 0.5000\n", + "Epoch 9: last batch loss = 4.1888, acc = 1.0000\n", + "Epoch 10: last batch loss = 11.2127, acc = 0.0000\n", + "Epoch 11: last batch loss = 9.0417, acc = 0.5000\n", + "Epoch 12: last batch loss = 7.9847, acc = 0.5000\n", + "Epoch 13: last batch loss = 3.7879, acc = 1.0000\n", + "Epoch 14: last batch loss = 6.8455, acc = 0.5000\n", + "Epoch 15: last batch loss = 6.5204, acc = 0.5000\n", + "Epoch 16: last batch loss = 9.2386, acc = 0.5000\n", + "Epoch 17: last batch loss = 6.2447, acc = 0.5000\n", + "Epoch 18: last batch loss = 3.9107, acc = 1.0000\n", + "Epoch 19: last batch loss = 5.7645, acc = 1.0000\n" + ] + } + ], + "source": [ + "optimizer = tf.keras.optimizers.Adam(0.01)\n", + "\n", + "W = tf.Variable(tf.random.normal(shape=(2,1)))\n", + "b = tf.Variable(tf.zeros(shape=(1,),dtype=tf.float32))\n", + "\n", + "@tf.function\n", + "def train_on_batch(x, y):\n", + " vars = [W, b]\n", + " with tf.GradientTape() as tape:\n", + " z = tf.sigmoid(tf.matmul(x, W) + b)\n", + " loss = tf.reduce_mean(tf.keras.losses.binary_crossentropy(z,y))\n", + " correct_prediction = tf.equal(tf.round(y), tf.round(z))\n", + " acc = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))\n", + " grads = tape.gradient(loss, vars)\n", + " optimizer.apply_gradients(zip(grads,vars))\n", + " return loss,acc\n", + "\n", + "for epoch in range(20):\n", + " for step, (x, y) in enumerate(dataset):\n", + " loss,acc = train_on_batch(tf.reshape(x,(-1,2)), tf.reshape(y,(-1,1)))\n", + " print('Epoch %d: last batch loss = %.4f, acc = %.4f' % (epoch, float(loss),acc))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dvAiaj_JndyP" + }, + "source": [ + "**ការងារ 1**: គូសក្រាហ្វនៃអនុគមន៍ខូច និងភាពត្រឹមត្រូវលើទិន្នន័យបណ្តុះបណ្តាល និងផ្ទៀងផ្ទាត់ ខណៈពេលបណ្តុះបណ្តាល\n", + "\n", + "**ការងារ 2**: សាកល្បងដោះស្រាយបញ្ហាការបែងចែកចំណាត់ថ្នាក់ MNIST ដោយប្រើកូដនេះ។ គន្លឹះ៖ ប្រើ `softmax_crossentropy_with_logits` ឬ `sparse_softmax_cross_entropy_with_logits` ជាអនុគមន៍ខូច។ ក្នុងករណីដំបូង អ្នកត្រូវផ្តល់តម្លៃចេញដែលរំពឹងទុកជារូបមន្ត *one hot encoding* ហើយក្នុងករណីទីពីរជា - ជាលេខថ្នាក់ចំណាត់ថ្នាក់តាំងការណ៍។\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "995iCprDrgYQ" + }, + "source": [ + "## Keras\n", + "### ការរៀនជ្រៅសម្រាប់មនុស្ស\n", + "\n", + "* Keras គឺជាបណ្ណាល័យដែលបានបង្កើតដំបូងដោយ Francois Chollet ដើម្បីដំណើរការលើ Tensorflow, CNTK និង Theano ដើម្បីរួមបញ្ចូលគ្នារំលងគ្រប់ស៊ុមក្រោមមួយ។ អ្នកនៅតែអាចដំឡើង Keras ជាបណ្ណាល័យរាល់ខ្ទង់ ប៉ុន្តាមិនបានផ្តល់អនុសាសន៍ឱ្យធ្វើបែបនេះទេ។\n", + "* ឥឡូវនេះ Keras ត្រូវបានរួមបញ្ចូលជាផ្នែកមួយនៃបណ្ណាល័យ Tensorflow\n", + "* អ្នកអាចបង្រួមបា្រស់ណឺរ៉ូលពីស្រទាប់បានយ៉ាងងាយស្រួល\n", + "* មានអនុគមន៍ `fit` សម្រាប់បង្រៀនទាំងអស់ ជាមួយនឹងអនុគមន៍ជាច្រើនសម្រាប់ដំណើរការទិន្នន័យទូរទៅ (រូបភាព, ខ្ទឹមអក្សរ, ល។)\n", + "* មានគំរូជាច្រើន\n", + "* API មុខងារ ប្រឆាំងនឹង API តម្រៀប\n", + "\n", + "Keras ផ្តល់ជូននូវការបកស្រាយកម្រិតខ្ពស់សម្រាប់បណ្តាញណឺរ៉ូល ដែលអាចអនុញ្ញាតឱ្យយើងបញ្ជាពីរបៀបស្រទាប់, ម៉ូដែល និង អូបធីម៉ាហ្ស័រ មិនប្រើក្នុងរយៈពេលតេនស័រ និង អត្រាប្រែប្រួលឡើយ។\n", + "\n", + "សៀវភៅអំពីការរៀនជ្រៅបែបបុរាណពីអ្នកបង្កើត Keras: [Deep Learning with Python](https://www.manning.com/books/deep-learning-with-python)\n", + "\n", + "### API មុខងារ\n", + "\n", + "នៅពេលប្រើ API មុខងារ យើងកំណត់ **វត្ថុបញ្ចូល** ទៅបណ្តាញជា `keras.Input` បន្ទាប់មកគណនារក **លទ្ធផល** ដោយផ្លាស់ប្តូរពីរបៀបគណនាជាច្រើនជួរ។ ចុងបញ្ចប់ យើងកំណត់ **ម៉ូដែល** ជាឧបករណ៍ដែលផ្លាស់ប្ដូរពីវត្ថុបញ្ចូលទៅលទ្ធផល។\n", + "\n", + "ពេលយើងបាន **ម៉ូដែល** រួច អ្នកត្រូវ:\n", + "* **បញ្ចូល** វា ដោយកំណត់អនុគមន៍ខាតនិងអូបធីម៉ាហ្ស័រដែលយើងចង់ប្រើជាមួយម៉ូដែលរបស់យើង\n", + "* **បង្រៀន** វា ដោយហៅអនុគមន៍ `fit` ជាមួយទិន្នន័យបង្រៀន (ហើយអាចមានទិន្នន័យផ្ទៀងផ្ទាត់)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "QJWplVfy34Eo", + "outputId": "9be976f2-4f9a-495c-bddc-a7f9ec30989a" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"model\"\n", + "_________________________________________________________________\n", + " Layer (type) Output Shape Param # \n", + "=================================================================\n", + " input_1 (InputLayer) [(None, 2)] 0 \n", + " \n", + " dense (Dense) (None, 1) 3 \n", + " \n", + "=================================================================\n", + "Total params: 3\n", + "Trainable params: 3\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n", + "Epoch 1/15\n", + "9/9 [==============================] - 1s 2ms/step - loss: 0.7812 - accuracy: 0.2857\n", + "Epoch 2/15\n", + "9/9 [==============================] - 0s 2ms/step - loss: 0.7142 - accuracy: 0.4000\n", + "Epoch 3/15\n", + "9/9 [==============================] - 0s 2ms/step - loss: 0.6683 - accuracy: 0.6143\n", + "Epoch 4/15\n", + "9/9 [==============================] - 0s 2ms/step - loss: 0.6221 - accuracy: 0.8429\n", + "Epoch 5/15\n", + "9/9 [==============================] - 0s 2ms/step - loss: 0.5843 - accuracy: 0.8857\n", + "Epoch 6/15\n", + "9/9 [==============================] - 0s 2ms/step - loss: 0.5447 - accuracy: 0.9429\n", + "Epoch 7/15\n", + "9/9 [==============================] - 0s 2ms/step - loss: 0.5135 - accuracy: 0.9286\n", + "Epoch 8/15\n", + "9/9 [==============================] - 0s 2ms/step - loss: 0.4878 - accuracy: 0.9429\n", + "Epoch 9/15\n", + "9/9 [==============================] - 0s 2ms/step - loss: 0.4679 - accuracy: 0.9429\n", + "Epoch 10/15\n", + "9/9 [==============================] - 0s 2ms/step - loss: 0.4446 - accuracy: 0.9429\n", + "Epoch 11/15\n", + "9/9 [==============================] - 0s 2ms/step - loss: 0.4349 - accuracy: 0.8714\n", + "Epoch 12/15\n", + "9/9 [==============================] - 0s 2ms/step - loss: 0.4156 - accuracy: 0.9286\n", + "Epoch 13/15\n", + "9/9 [==============================] - 0s 2ms/step - loss: 0.4019 - accuracy: 0.9429\n", + "Epoch 14/15\n", + "9/9 [==============================] - 0s 2ms/step - loss: 0.3908 - accuracy: 0.9286\n", + "Epoch 15/15\n", + "9/9 [==============================] - 0s 2ms/step - loss: 0.3777 - accuracy: 0.9286\n" + ] + } + ], + "source": [ + "inputs = tf.keras.Input(shape=(2,))\n", + "z = tf.keras.layers.Dense(1,kernel_initializer='glorot_uniform',activation='sigmoid')(inputs)\n", + "model = tf.keras.models.Model(inputs,z)\n", + "\n", + "model.compile(tf.keras.optimizers.Adam(0.1),'binary_crossentropy',['accuracy'])\n", + "model.summary()\n", + "h = model.fit(train_x_norm,train_labels,batch_size=8,epochs=15)" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 282 + }, + "id": "K2Kf60IrZcqs", + "outputId": "b60b868d-3562-4715-f5d5-1f9764e45f09" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 65, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(h.history['accuracy'])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "iJruFXmb_dur" + }, + "source": [ + "### Sequential API\n", + "\n", + "ជាជម្រើសមួយទៀត យើងអាចចាប់ផ្តើមគិតពីគំរូមួយជា **លំដាប់ស្រទាប់មួយស្រទាប់** ហើយគ្រាន់តែបញ្ជាក់ស្រទាប់ទាំងនោះដោយបន្ថែមពួកវាទៅក្នុងវត្ថុ `model`:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "iWc_kSr8_YXt", + "outputId": "345dbe65-629d-468f-ed75-1d412c966340" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"sequential\"\n", + "_________________________________________________________________\n", + " Layer (type) Output Shape Param # \n", + "=================================================================\n", + " dense_1 (Dense) (None, 5) 15 \n", + " \n", + " dense_2 (Dense) (None, 1) 6 \n", + " \n", + "=================================================================\n", + "Total params: 21\n", + "Trainable params: 21\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n", + "Epoch 1/15\n", + "9/9 [==============================] - 1s 64ms/step - loss: 0.6994 - accuracy: 0.5000 - val_loss: 0.6719 - val_accuracy: 0.4667\n", + "Epoch 2/15\n", + "9/9 [==============================] - 0s 6ms/step - loss: 0.6635 - accuracy: 0.5429 - val_loss: 0.6531 - val_accuracy: 0.4667\n", + "Epoch 3/15\n", + "9/9 [==============================] - 0s 5ms/step - loss: 0.6469 - accuracy: 0.5857 - val_loss: 0.5775 - val_accuracy: 1.0000\n", + "Epoch 4/15\n", + "9/9 [==============================] - 0s 4ms/step - loss: 0.5639 - accuracy: 0.9143 - val_loss: 0.5395 - val_accuracy: 0.7333\n", + "Epoch 5/15\n", + "9/9 [==============================] - 0s 5ms/step - loss: 0.5236 - accuracy: 0.7143 - val_loss: 0.4498 - val_accuracy: 0.9333\n", + "Epoch 6/15\n", + "9/9 [==============================] - 0s 5ms/step - loss: 0.4573 - accuracy: 0.8714 - val_loss: 0.3584 - val_accuracy: 1.0000\n", + "Epoch 7/15\n", + "9/9 [==============================] - 0s 5ms/step - loss: 0.3867 - accuracy: 0.8714 - val_loss: 0.2989 - val_accuracy: 0.9333\n", + "Epoch 8/15\n", + "9/9 [==============================] - 0s 7ms/step - loss: 0.3388 - accuracy: 0.8857 - val_loss: 0.2204 - val_accuracy: 1.0000\n", + "Epoch 9/15\n", + "9/9 [==============================] - 0s 6ms/step - loss: 0.2815 - accuracy: 0.9429 - val_loss: 0.1957 - val_accuracy: 1.0000\n", + "Epoch 10/15\n", + "9/9 [==============================] - 0s 6ms/step - loss: 0.2692 - accuracy: 0.8857 - val_loss: 0.1323 - val_accuracy: 1.0000\n", + "Epoch 11/15\n", + "9/9 [==============================] - 0s 5ms/step - loss: 0.2591 - accuracy: 0.9429 - val_loss: 0.1105 - val_accuracy: 1.0000\n", + "Epoch 12/15\n", + "9/9 [==============================] - 0s 6ms/step - loss: 0.2229 - accuracy: 0.9286 - val_loss: 0.1051 - val_accuracy: 1.0000\n", + "Epoch 13/15\n", + "9/9 [==============================] - 0s 5ms/step - loss: 0.2146 - accuracy: 0.9143 - val_loss: 0.0919 - val_accuracy: 1.0000\n", + "Epoch 14/15\n", + "9/9 [==============================] - 0s 5ms/step - loss: 0.2031 - accuracy: 0.9429 - val_loss: 0.0859 - val_accuracy: 1.0000\n", + "Epoch 15/15\n", + "9/9 [==============================] - 0s 5ms/step - loss: 0.1997 - accuracy: 0.9429 - val_loss: 0.0829 - val_accuracy: 1.0000\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 66, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model = tf.keras.models.Sequential()\n", + "model.add(tf.keras.layers.Dense(5,activation='sigmoid',input_shape=(2,)))\n", + "model.add(tf.keras.layers.Dense(1,activation='sigmoid'))\n", + "\n", + "model.compile(tf.keras.optimizers.Adam(0.1),'binary_crossentropy',['accuracy'])\n", + "model.summary()\n", + "model.fit(train_x_norm,train_labels,validation_data=(test_x_norm,test_labels),batch_size=8,epochs=15)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "BmHNhUU8bqEX" + }, + "source": [ + "## មុខងារបាត់បង់ចំណាត់ថ្នាក់\n", + "\n", + "វាសំខាន់ក្នុងការបញ្ជាក់បានត្រឹមត្រូវពីមុខងារបាត់បង់ និងមុខងារបើកបរ នៅលើស្រទាប់ចុងក្រោយនៃបណ្តាញ។ នីតិវិធីសំខាន់ៗមានដូចជា៖\n", + "* ប្រសិនបើបណ្តាញមានចេញតែមួយ (**ចំណាត់ថ្នាក់ពីរប្រភេទ**), យើងប្រើមុខងារបើកបរ **sigmoid**, សម្រាប់ **ចំណាត់ថ្នាក់ច្រើនប្រភេទ** - **softmax**\n", + "* ប្រសិនបើចេញប្រភេទត្រូវបានតំណាងជាការអេនកូដ one-hot, មុខងារបាត់បង់នឹងជា **cross entropy loss** (categorical cross-entropy), ប្រសិនបើចេញមានលេខប្រភេទ - **sparse categorical cross-entropy**។ សម្រាប់ **ចំណាត់ថ្នាក់ពីរប្រភេទ** - ប្រើ **binary cross-entropy** (ដូចគ្នានឹង **log loss**)\n", + "* **ចំណាត់ថ្នាក់មុខងារច្រើនលំដាប់** នឺងពេលដែលវាអាចមានអវកាសអោយវត្ថុត្រូវបានផ្ដល់ជាប្រភេទជាច្រើននៅពេលតែមួយ។ ក្នុងករណីនេះ ត្រូវការអេនកូដបរិស្តានជាមួយ one-hot ហើយប្រើ **sigmoid** ក្នុងនាមមុខងារបើកបរ ដូច្នេះប្រសិទ្ធភាពប្រភេទនីមួយៗស្ថិតនៅរវាង 0 និង 1។\n", + "\n", + "| ចំណាត់ថ្នាក់ | ទ្រង់ទ្រាយស្លាក | មុខងារបើកបរ | បាត់បង់ |\n", + "|---------------|-----------------------|-----------------|----------|\n", + "| ពីរប្រភេទ | ប្រសិទ្ធភាពនៃប្រភេទទី១ | sigmoid | binary crossentropy |\n", + "| ពីរប្រភេទ | ការអេនកូដ one-hot (ចេញពីរចំណុច) | softmax | categorical crossentropy |\n", + "| ច្រើនប្រភេទ | ការអេនកូដ one-hot | softmax | categorical crossentropy |\n", + "| ច្រើនប្រភេទ | លេខប្រភេទ | softmax | sparse categorical crossentropy |\n", + "| ច្រើនលំដាប់ | ការអេនកូដ one-hot | sigmoid | categorical crossentropy |\n", + "\n", + "> ចំណាត់ថ្នាក់ពីរប្រភេទក៏អាចដំណើរការជាគ្រោងពិសេសនៃចំណាត់ថ្នាក់ច្រើនប្រភេទដែលមានចេញពីរចំណុចផងដែរ។ ក្នុងករណីនេះ យើងត្រូវប្រើ **softmax**។\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "gZ-kWx84bMDH" + }, + "source": [ + "**Task 3**: \n", + "Use Keras to train MNIST classifier:\n", + "* សូមចំណាំថា Keras មានសំណុំទិន្នន័យស្តង់ដារមួយចំនួន រួមមាន MNIST។ ដើម្បីប្រើ MNIST ពី Keras អ្នកត្រឹមតែត្រូវការបន្ទាត់កូដប៉ុន្មានតួ (ព័ត៌មានបន្ថែម [ទីនេះ](https://www.tensorflow.org/api_docs/python/tf/keras/datasets/mnist))\n", + "* សូមសាកល្បងកំណត់រចនាសម្ព័ន្ធបណ្តាញជាច្រើន ដោយប្រើចំនួនស្រទាប់/ណឺរូនដែលខុសគ្នា ហើយប្រើមុខងារការបូចច្របល់ផ្សេងៗ។\n", + "\n", + "តើភាពត្រឹមត្រូវល្អបំផុតដែលអ្នកអាចចូលដល់បានជាអ្វី?\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "yX6hqiafwHl9" + }, + "source": [ + "## Takeaways\n", + "\n", + "* Tensorflow អនុញ្ញាតឱ្យអ្នកប្រតិបត្តិការលើ tensors នៅកម្រិតទាប អ្នកមានភាពល្អឥតខ្ចោះច្រើនជាងគេ។\n", + "* មានឧបករណ៍ងាយស្រួលក្នុងការធ្វើការជាមួយទិន្នន័យ (`td.Data`) និងស្រទាប់ (`tf.layers`)\n", + "* សម្រាប់អ្នកចាប់ផ្តើម/កិច្ចការប្រចាំថ្ងៃ គណនាដែលបានណែនាំឱ្យប្រើ **Keras** ដែលអនុញ្ញាតឱ្យបង្កើតបណ្ដាញពីស្រទាប់\n", + "* ប្រសិនបើតម្រូវការស្ថាបត្យកម្មមិនស្តង់ដារ អ្នកអាចអនុវត្តស្រទាប់ Keras របស់អ្នកផ្ទាល់ ហើយបន្ទាប់មកប្រើវា ក្នុងគំរូ Keras\n", + "* វាជាគំនិតល្អក្នុងការមើល PyTorch ហើយប្រៀបធៀបវិធីសាស្រ្តជាមួយគ្នា។\n", + "\n", + "កំណត់ត្រាទំព័រដ៏ល្អមួយពីអ្នកបង្កើត Keras អំពី Keras និង Tensorflow 2.0 អាចជួយបាន [នៅទីនេះ](https://t.co/k694J95PI8)។\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**ការបដិសេធ**៖\nឯកសារនេះត្រូវបានបកប្រែជាភាសាដោយការប្រើសេវាបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ទោះយើងខិតខំសំដែងភាពត្រឹមត្រូវ ក៏សូមយកចិត្តទុកដាក់ថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុសឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមក្នុងភាសាម្ដដើមគួរត្រូវបានកាត់ទុកជាដើមផ្លូវការនៃព័ត៌មាន។ សម្រាប់ព័ត៌មានសំខាន់ សូមប្រើការបកប្រែដោយអ្នកជំនាញមនុស្ស។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំឬការបកស្រាយខុសអ្វីៗឡើងពីការប្រើប្រាស់ការបកប្រែនេះទេ។\n\n" + ] + } + ], + "metadata": { + "celltoolbar": "Slideshow", + "colab": { + "collapsed_sections": [], + "name": "IntroKerasTF.ipynb", + "provenance": [] + }, + "interpreter": { + "hash": "0cb620c6d4b9f7a635928804c26cf22403d89d98d79684e4529119355ee6d5a5" + }, + "kernelspec": { + "display_name": "Python 3.8.12 64-bit (conda)", + "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" + }, + "livereveal": { + "start_slideshow_at": "selected" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/translations/km/lessons/3-NeuralNetworks/05-Frameworks/IntroPyTorch.ipynb b/translations/km/lessons/3-NeuralNetworks/05-Frameworks/IntroPyTorch.ipynb new file mode 100644 index 00000000..cadf1915 --- /dev/null +++ b/translations/km/lessons/3-NeuralNetworks/05-Frameworks/IntroPyTorch.ipynb @@ -0,0 +1,13907 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "En2vX4FuwHlu" + }, + "source": [ + "## ការណែនាំអំពី PyTorch\n", + "\n", + "> សៀវភៅកំណត់ត្រានេះជាផ្នែកមួយនៃ [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners). សូមចូលទៅកាន់ repository ដើម្បីទទួលបានសម្ភារៈសិក្សាផ្តុំពេញលេញ។\n", + "\n", + "### ស៊ុមរចនាសម្ព័ន្ធបណ្តាញប្រសាទ\n", + "\n", + "We have learnt that to train neural networks you need:\n", + "* គុណម៉ាទ្រីស (តង់ស័រ) ឲ្យបានយ៉ាងលឿន\n", + "* គណនាដេរីវេ (gradients) ដើម្បីអនុវត្តអុបទីម៉ីសេន gradient descent\n", + "\n", + "What neural network frameworks allow you to do:\n", + "* Operate with tensors on whatever compute is available, CPU or GPU, or even TPU\n", + "* គណនាដេរីវេដោយស្វ័យប្រវត្តិ (ពួកវាត្រូវបានកម្មវិធីកំណត់យ៉ាងច្បាស់សម្រាប់មុខងារ​តង់ស័រទាំងអស់)\n", + "\n", + "Optionally:\n", + "* ម៉ូឌុលកសាងបណ្តាញប្រសាទ / API កម្រិតខ្ពស់ (ពិពណ៌នាបណ្តាញជា​លំដាប់នៃស្រទាប់)\n", + "* មុខងារបណ្តុះបណ្តាលសាមញ្ញ (`fit`, as in Scikit Learn)\n", + "* មានអាល់ហ្គ័រីធមអុបទីម៉ីសេនជាច្រើន បន្ថែមពី gradient descent\n", + "* យុទ្ធសាស្រ្តផ្នែកដោះស្រាយទិន្នន័យ (ដែលគួរតែដំណើរការលើ GPU ផងដែរ)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "8cACQoFMwHl3" + }, + "source": [ + "### Frameworks ដែលពេញនិយមបំផុត\n", + "\n", + "* Tensorflow 1.x - ជា framework ដែលមានឈានដល់ទូលំទូលាយជាលើកដំបូង (Google)។ អនុញ្ញាត​ឱ្យកំណត់ក្រាហ្វគណនាស្ថិតស្ថេរ, បញ្ចូនវាទៅលើ GPU, និងវាយតម្លៃវាប្រកបដោយច្បាស់\n", + "* PyTorch - ជា framework មួយពី Facebook ដែលកំពុងកើនឡើងក្នុងភាពពេញនិយម\n", + "* Keras - ជា API កម្រិតខ្ពស់លើ Tensorflow/PyTorch ដើម្បីរួមបញ្ចូល និងធ្វើឱ្យការប្រើបណ្ដាញប្រសាទសិប្បនិម្មិតងាយស្រួល (Francois Chollet)\n", + "* Tensorflow 2.x + Keras - កំណែថ្មីនៃ Tensorflow ដែលភ្ជាប់មុខងារ Keras ជាមួយ, ដែលគាំទ្រ **ក្រាហ្វគណនាឌីណាមិច**, អនុញ្ញាតឱ្យអនុវត្តប្រតិបត្តិការលើ tensor ដែលស្ទៀងស្ទាត់ទៅនឹង numpy (និង PyTorch)\n", + "\n", + "នៅក្នុង Notebook នេះ យើងនឹងរៀនប្រើ PyTorch។ អ្នកត្រូវប្រាកដថាអ្នកបានដំឡើងកំណែថ្មីនៃ PyTorch - ដើម្បីធ្វើបាន សូមអនុវត្តតាម [ការណែនាំលើគេហទំព័ររបស់ពួកគេ](https://pytorch.org/get-started/locally/). ជាទូទៅ វាសាមញ្ញគ្រាន់តែធ្វើដូចខាងក្រោម\n", + "```\n", + "pip install torch torchvision\n", + "```\n", + "ឬ\n", + "```\n", + "conda install pytorch -c pytorch\n", + "```\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 36 + }, + "id": "xwqVx9-bwHl3", + "outputId": "7fdf1bd8-a54b-4eb0-cb09-dbb81a42d99c", + "tags": [] + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "'1.11.0+cu113'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 10 + } + ], + "source": [ + "import torch\n", + "torch.__version__" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "6tp2xGV7wHl4" + }, + "source": [ + "## គំនិតមូលដ្ឋាន: Tensor\n", + "\n", + "**Tensor** គឺជា​អារេ​មួយ​ដែល​មាន​វិមាត្រ​ច្រើន។\n", + "\n", + "វា​ងាយស្រួលយ៉ាង​ខ្លាំងក្នុង​ការ​ប្រើ tensors ដើម្បី​តំណាងឱ្យ​ប្រភេទ​ទិន្នន័យ​ផ្សេងៗ៖\n", + "* 400x400 - រូបភាព​ខ្មៅ-ស\n", + "* 400x400x3 - រូបភាព​ពណ៌\n", + "* 16x400x400x3 - minibatch នៃ​រូបភាពពណ៌ចំនួន 16\n", + "* 25x400x400x3 - វីដេអូ 25-fps រយៈពេល​មួយ​វិនាទី\n", + "* 8x25x400x400x3 - minibatch នៃ​វីដេអូ 1 វិនាទី​ចំនួន 8\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qG2bsaR7wHl4" + }, + "source": [ + "### តង់ស័រ សាមញ្ញ\n", + "\n", + "អ្នកអាចយ៉ាងងាយស្រួលបង្កើតតង់ស័រ សាមញ្ញពីបញ្ជីនៃ np-arrays ឬបង្កើតតង់ស័រចៃដន្យ:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ybpnk08HwHl4", + "outputId": "377e6e25-bc5a-4d2e-fe8e-17dac1d20c2c", + "trusted": true + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "tensor([[1, 2],\n", + " [3, 4]])\n", + "tensor([[ 0.8995, -1.6137, 1.4489],\n", + " [-0.2796, -2.1443, -2.4618],\n", + " [-0.2358, -0.4249, -0.0716],\n", + " [-0.1267, -0.6382, 0.0593],\n", + " [-0.4956, 1.7054, 0.3874],\n", + " [ 1.3479, -1.6329, 0.2793],\n", + " [ 1.1211, -1.5430, 0.7186],\n", + " [-1.5197, 0.5559, -1.6421],\n", + " [ 0.1900, -0.4175, -0.3922],\n", + " [ 1.8994, 0.1497, -0.7039]])\n" + ] + } + ], + "source": [ + "a = torch.tensor([[1,2],[3,4]])\n", + "print(a)\n", + "a = torch.randn(size=(10,3))\n", + "print(a)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "AXFMsV3r09Ux" + }, + "source": [ + "អ្នកអាចប្រើប្រតិបត្តិការគណិតលើ tensors ដែលអនុវត្តលើមូលធាតុៗ ដូចជា​ក្នុង numpy។ Tensors នឹងត្រូវបានពង្រីកដោយស្វ័យប្រវត្តិឱ្យទៅវិមាត្រដែលត្រូវការ ប្រសិនបើចាំបាច់។ ដើម្បីដក numpy-array ពី tensor សូមប្រើ `.numpy()`:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "e5Nu5Xgj1DnQ", + "outputId": "c1fbcd86-dde6-40b6-8edf-7a37f9d60901" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "tensor([[ 0.0000, 0.0000, 0.0000],\n", + " [-2.0583, -0.5631, 1.4932],\n", + " [-1.0613, -1.0738, 2.2078],\n", + " [-1.5101, 0.5896, 2.4722],\n", + " [-2.8219, -2.0846, 1.2405],\n", + " [ 0.8706, -0.2485, 2.3679],\n", + " [-1.6590, 0.1935, 1.8698],\n", + " [-0.3316, 0.8065, 1.6490],\n", + " [-1.5788, -1.1844, -0.4816],\n", + " [ 0.0680, -1.4526, 1.8159]])\n", + "[3.887189 2.1276016 0.17371987]\n" + ] + } + ], + "source": [ + "print(a-a[0])\n", + "print(torch.exp(a)[0].numpy())" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "uQ5zN6cVyrG7" + }, + "source": [ + "## ប្រតិបត្តិការក្នុងកន្លែង និងក្រៅកន្លែង\n", + "\n", + "ប្រតិបត្តិការលើ Tensor ដូចជា `+`/`add` នឹងត្រឡប់ជា tensor ថ្មី។ ទោះបីជាយ៉ាងណា ពេលខ្លះ អ្នកត្រូវការកែប្រែ tensor ដែលមានស្រាប់ ដោយផ្ទាល់ (in-place)។ ភាគច្រើននៃប្រតិបត្តិការទាំងនេះមានមុខស្រដៀងក្នុងកន្លែង ដែលបញ្ចប់ដោយ `_`:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Mjkbcw3-ACKS", + "outputId": "ca021008-9ab6-4b09-c5a5-bbe854cd1493" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Result when adding out-of-place: tensor(8)\n", + "Result after adding in-place: tensor(8)\n" + ] + } + ], + "source": [ + "u = torch.tensor(5)\n", + "print(\"Result when adding out-of-place:\",u.add(torch.tensor(3)))\n", + "u.add_(torch.tensor(3))\n", + "print(\"Result after adding in-place:\", u)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "DLPUcVsXACKT" + }, + "source": [ + "នេះជាវិធីដែលយើងអាចគណនាសរុប ឬ ជួរទាំងអស់ក្នុងម៉ាទ្រីសដោយវិធីសាមញ្ញ៖\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "7pu0UZ-_yqfB", + "outputId": "bd2e8c6a-39e1-4f29-990b-9591e866936c" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "tensor([ 3.4945, 2.5325, -2.8684])\n" + ] + } + ], + "source": [ + "s = torch.zeros_like(a[0])\n", + "for i in a:\n", + " s.add_(i)\n", + "\n", + "print(s)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "rIh1EHcezlNo" + }, + "source": [ + "ប៉ុន្តែវាប្រសើរជាងណាស់ក្នុងការប្រើ\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "aQIdWZ1kzn6P", + "outputId": "89000bb4-f45e-493b-a7b0-39fa4e7d92c1" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([ 3.4945, 2.5325, -2.8684])" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "torch.sum(a,axis=0)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5UzUmEZhACKT" + }, + "source": [ + "អ្នកអាចអានព័ត៌មានបន្ថែមអំពីតេនស័ររបស់ PyTorch នៅក្នុង [ឯកសារផ្លូវការ](https://pytorch.org/tutorials/beginner/basics/tensorqs_tutorial.html)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "U-auwezDwHl6" + }, + "source": [ + "## ការគណនាក្រាឌីអង់\n", + "\n", + "សម្រាប់ការបង្វិលត្រឡប់ក្រោយ អ្នកត្រូវគណនាក្រាឌីអង់។ យើងអាចកំណត់លក្ខណៈ `requires_grad` របស់ PyTorch Tensor មួយណាមួយទៅជា `True` ដែលនឹងធ្វើឱ្យប្រតិបត្តិការទាំងអស់ជាមួយ tensor នេះត្រូវបានតាមដានសម្រាប់ការគណនាក្រាឌីអង់។ ដើម្បីគណនាក្រាឌីអង់ អ្នកត្រូវហៅមេតូដ `backward()` បន្ទាប់មកក្រាឌីអង់នឹងអាចប្រើបានតាមរយៈលក្ខណៈ `grad`:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "m8vFOXr7wHl6", + "outputId": "7054c2b1-0b61-4938-937d-813f75f0b195", + "trusted": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "tensor([[-0.1728, 0.0913],\n", + " [-0.1666, -0.1942]])\n" + ] + } + ], + "source": [ + "a = torch.randn(size=(2, 2), requires_grad=True)\n", + "b = torch.randn(size=(2, 2))\n", + "\n", + "c = torch.mean(torch.sqrt(torch.square(a) + torch.square(b))) # Do some math using `a`\n", + "c.backward() # call backward() to compute all gradients\n", + "# What's the gradient of `c` with respect to `a`?\n", + "print(a.grad)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "nPj3rtrtACKU" + }, + "source": [ + "ដើម្បីច្បាស់ជាងនេះ, PyTorch ធ្វើការ **សរុប** ក្រាឌីអង់ ដោយស្វ័យ​ប្រវត្តិ។ បើអ្នកបញ្ជាក់ `retain_graph=True` នៅពេលហៅ `backward`, ក្រាហ្វគណនានឹងត្រូវរក្សាទុក ហើយក្រាឌីអង់​ថ្មី​នឹងត្រូវបន្ថែមទៅក្នុងវាល `grad`។ ដើម្បីចាប់ផ្តើមគណនាក្រាឌីអង់ឡើងវិញពីដើម យើងត្រូវកំណត់វាល `grad` ទៅជា 0 យ៉ាងច្បាស់ ដោយហៅ `zero_()`:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "z_VIw8MoACKU", + "outputId": "36a28b11-6919-47ab-c3f9-c7f1d8500423" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "tensor([[-0.5185, 0.2739],\n", + " [-0.4998, -0.5826]])\n", + "tensor([[-0.1728, 0.0913],\n", + " [-0.1666, -0.1942]])\n" + ] + } + ], + "source": [ + "c = torch.mean(torch.sqrt(torch.square(a) + torch.square(b)))\n", + "c.backward(retain_graph=True)\n", + "c.backward(retain_graph=True)\n", + "print(a.grad)\n", + "a.grad.zero_()\n", + "c.backward()\n", + "print(a.grad)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HM9sUkVgCiG9" + }, + "source": [ + "ដើម្បីគណនា gradients, PyTorch បង្កើត និងថែរក្សា **compute graph**។ សម្រាប់តង់ស័រ​នីមួយៗ ដែលស្លាក `requires_grad` ត្រូវបានកំណត់ជា `True`, PyTorch នឹងថែរក្សាអនុគមន៍ពិសេសមួយឈ្មោះ `grad_fn` ដែលគណនាអាណុភាព (derivative) នៃសមីការតាមច្បាប់ chain rule:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "PcxHb-7jC7Vv", + "outputId": "3b3fa138-6d09-4636-8a71-f4a4051c7827" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "tensor(0.9143, grad_fn=)\n" + ] + } + ], + "source": [ + "print(c)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "rvLfNiblACKV" + }, + "source": [ + "នៅទីនេះ `c` ត្រូវបានគណនា ដោយប្រើមុខងារ `mean` ដូច្នេះ `grad_fn` បង្ហាញទៅមុខងារ ដែលមានឈ្មោះ `MeanBackward`។\n", + "\n", + "នៅក្នុងករណីភាគច្រើន យើងចង់ឲ្យ PyTorch គណនា gradient នៃមុខងារតែមួយ (ដូចជា មុខងារ loss)។ ទោះជាយ៉ាងណា ប្រសិនបើយើងចង់គណនាក្រាឌីអង់នៃ tensor មួយ ទល់នឹង tensor ផ្សេងទៀត PyTorch អនុញ្ញាតឲ្យយើងគណនាបូគ្គលផលរវាងម៉ាទ្រីស Jacobian និងវ៉ិចទ័រមួយដែលបានផ្ដល់។\n", + "\n", + "Suppose we have a vector function $\\vec{y}=f(\\vec{x})$, where\n", + "$\\vec{x}=\\langle x_1,\\dots,x_n\\rangle$ and\n", + "$\\vec{y}=\\langle y_1,\\dots,y_m\\rangle$, then a gradient of $\\vec{y}$ with respect to $\\vec{x}$ is defined by a **Jacobian**:\n", + "\n", + "$$\n", + "\\begin{align}J=\\left(\\begin{array}{ccc}\n", + " \\frac{\\partial y_{1}}{\\partial x_{1}} & \\cdots & \\frac{\\partial y_{1}}{\\partial x_{n}}\\\\\n", + " \\vdots & \\ddots & \\vdots\\\\\n", + " \\frac{\\partial y_{m}}{\\partial x_{1}} & \\cdots & \\frac{\\partial y_{m}}{\\partial x_{n}}\n", + "\\end{array}\\right)\\end{align}\n", + "$$\n", + "\n", + "ជំនួសការផ្ដល់ឱ្យយើងនូវការចូលដំណើរការ ទៅលើ Jacobian ទាំងមូល PyTorch គណនាបូគ្គលផល $v^T\\cdot J$ រវាង Jacobian និងវ៉ិចទ័រណាមួយ\n", + "$v=(v_1 \\dots v_m)$. In order to do that, we need to call ``backward`` and pass `v` as an argument. The size of `v` should be the same as the size of the original tensor, with respect to which we compute the gradient.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "VUNYiQCOACKV", + "outputId": "e3127c21-fce6-420d-f347-ec40cc827e7e" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "tensor([[-0.8642, 0.0913],\n", + " [-0.1666, -0.9710]])\n" + ] + } + ], + "source": [ + "c = torch.sqrt(torch.square(a) + torch.square(b))\n", + "c.backward(torch.eye(2)) # eye(2) means 2x2 identity matrix\n", + "print(a.grad)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dGHlkVlvACKV" + }, + "source": [ + "ព័ត៌មានបន្ថែមអំពីការគណនា Jacobians ក្នុង PyTorch អាចរកបាននៅក្នុង [ឯកសារផ្លូវការ](https://pytorch.org/tutorials/beginner/basics/autogradqs_tutorial.html)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "FnVvj4LkD15r" + }, + "source": [ + "# ឧទាហរណ៍ 0: ការស្វែងរកអប្បបរមា ដោយ Gradient Descent\n", + "\n", + "យើងមកព្យាយាមប្រើ automatic differentiation ដើម្បីស្វែងរកតម្លៃអប្បបរមានៃអនុគមន៍សាមញ្ញមានអថេរ ២ $f(x_1,x_2)=(x_1-3)^2+(x_2+2)^2$។ ឲ្យ tensor `x` កាន់កូអរដោនេបច្ចុប្បន្ននៃចំណុច។\n", + "\n", + "យើងចាប់ផ្តើមពីចំណុចចាប់ផ្តើម $x^{(0)}=(0,0)$ ហើយគណនា​ចំណុច​បន្ទាប់​នៅ​ក្នុង​លំដាប់ដោយប្រើសមីការធ្លាក់ចុះតាម gradient៖\n", + "$$\n", + "x^{(n+1)} = x^{(n)} - \\eta\\nabla f\n", + "$$\n", + "នៅទីនេះ $\\eta$ គឺជា所谓 **learning rage** (យើង​នឹង​សម្គាល់​វា​ដោយ `lr` ក្នុង​កូដ), និង $\\nabla f = (\\frac{\\partial f}{\\partial x_1},\\frac{\\partial f}{\\partial x_2})$ - gradient នៃ $f$។\n", + "\n", + "ដើម្បីចាប់ផ្តើម យើងនឹងកំណត់តម្លៃចាប់ផ្តើមរបស់ `x` និងអនុគមន៍ `f`:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "nDw5mV9KEeOa" + }, + "outputs": [], + "source": [ + "x = torch.zeros(2,requires_grad=True)\n", + "f = lambda x : (x-torch.tensor([3,-2])).pow(2).sum()\n", + "lr = 0.1" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Wt815LWdEj77" + }, + "source": [ + "ឥឡូវនេះ យើងសូមធ្វើ 15 វដ្តនៃ gradient descent។ នៅក្នុងរាល់វដ្ត យើងនឹងធ្វើបច្ចុប្បន្នភាពកូអរដោណេ `x` ហើយបង្ហាញពួកវា ដើម្បីធានាថាយើងកំពុងជិតចំនុចអប្បបរមា (3,-2):\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "KfwMf555EyWJ", + "outputId": "67e2199c-61ff-4ad1-9c48-b4a646bf8bbd" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Step 0: x[0]=0.6000000238418579, x[1]=-0.4000000059604645\n", + "Step 1: x[0]=1.0800000429153442, x[1]=-0.7200000286102295\n", + "Step 2: x[0]=1.4639999866485596, x[1]=-0.9760000705718994\n", + "Step 3: x[0]=1.7711999416351318, x[1]=-1.1808000802993774\n", + "Step 4: x[0]=2.0169599056243896, x[1]=-1.3446400165557861\n", + "Step 5: x[0]=2.2135679721832275, x[1]=-1.4757120609283447\n", + "Step 6: x[0]=2.370854377746582, x[1]=-1.5805696249008179\n", + "Step 7: x[0]=2.4966835975646973, x[1]=-1.6644556522369385\n", + "Step 8: x[0]=2.597346782684326, x[1]=-1.7315645217895508\n", + "Step 9: x[0]=2.677877426147461, x[1]=-1.7852516174316406\n", + "Step 10: x[0]=2.7423019409179688, x[1]=-1.8282012939453125\n", + "Step 11: x[0]=2.793841600418091, x[1]=-1.8625609874725342\n", + "Step 12: x[0]=2.835073232650757, x[1]=-1.8900487422943115\n", + "Step 13: x[0]=2.868058681488037, x[1]=-1.912039041519165\n", + "Step 14: x[0]=2.894446849822998, x[1]=-1.929631233215332\n" + ] + } + ], + "source": [ + "for i in range(15):\n", + " y = f(x)\n", + " y.backward()\n", + " gr = x.grad\n", + " x.data.add_(-lr*gr)\n", + " x.grad.zero_()\n", + " print(\"Step {}: x[0]={}, x[1]={}\".format(i,x[0],x[1]))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "8sfjBMBu59B5" + }, + "source": [ + "## ឧទាហរណ៍ 1: រេក្រេស្យុងបន្ទាត់\n", + "\n", + "ឥឡូវនេះយើងមានចំណេះដឹងគ្រប់គ្រាន់ដើម្បីដោះស្រាយបញ្ហាប្រពៃណីនៃ **រេក្រេស្យុងបន្ទាត់**។ ចូរយើងបង្កើតសំណុំទិន្នន័យសិប្បនិម្មិតតូចមួយ៖\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "j723455WwHl7", + "trusted": true + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from sklearn.datasets import make_classification, make_regression\n", + "from sklearn.model_selection import train_test_split\n", + "import random" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 282 + }, + "id": "WJNK_J6v6I-Z", + "outputId": "09e6386e-a6d4-4b81-c8d2-153f0acf9696" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "np.random.seed(13) # pick the seed for reproducibility - change it to explore the effects of random variations\n", + "\n", + "train_x = np.linspace(0, 3, 120)\n", + "train_labels = 2 * train_x + 0.9 + np.random.randn(*train_x.shape) * 0.5\n", + "\n", + "plt.scatter(train_x,train_labels)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Ng4rZmGc6oxk" + }, + "source": [ + "សមីការបន្ទាត់ត្រូវបានកំណត់ដោយបន្ទាត់ត្រង់ $f_{W,b}(x) = Wx+b$, ដែល $W, b$ ជាព៉ារ៉ាម៉ែត្រ​ម៉ូឌែល​ដែលយើងត្រូវស្វែងរក។ កំហុសលើឌាតាសេតរបស់យើង $\\{x_i,y_u\\}_{i=1}^N$ (ដែលត្រូវបានហៅថា **អនុគមន៍ខាត**) អាចកំណត់បានជា​កំហុសចតុកោណមធ្យម:\n", + "$$\n", + "\\mathcal{L}(W,b) = {1\\over N}\\sum_{i=1}^N (f_{W,b}(x_i)-y_i)^2\n", + "$$\n", + "\n", + "ចាំកំណត់ម៉ូឌែល និង​អនុគមន៍ខាតរបស់យើង:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "QxhI4GlB6aiH" + }, + "outputs": [], + "source": [ + "input_dim = 1\n", + "output_dim = 1\n", + "learning_rate = 0.1\n", + "\n", + "# This is our weight matrix\n", + "w = torch.tensor([100.0],requires_grad=True,dtype=torch.float32)\n", + "# This is our bias vector\n", + "b = torch.zeros(size=(output_dim,),requires_grad=True)\n", + "\n", + "def f(x):\n", + " return torch.matmul(x,w) + b\n", + "\n", + "def compute_loss(labels, predictions):\n", + " return torch.mean(torch.square(labels - predictions))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "JUxwj3367gD2" + }, + "source": [ + "យើងនឹងបណ្តុះម៉ូឌែលលើស៊េរីនៃ minibatches។\n", + "យើងនឹងប្រើ gradient descent ដើម្បីកែតម្រួលប៉ារ៉ាម៉ែត្រម៉ូឌែល ដោយប្រើសមីការខាងក្រោម:\n", + "\n", + "$$\n", + "\\begin{array}{l}\n", + "W^{(n+1)}=W^{(n)}-\\eta\\frac{\\partial\\mathcal{L}}{\\partial W} \\\\\n", + "b^{(n+1)}=b^{(n)}-\\eta\\frac{\\partial\\mathcal{L}}{\\partial b} \\\\\n", + "\\end{array}\n", + "$$\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "-991PErM7fJU" + }, + "outputs": [], + "source": [ + "def train_on_batch(x, y):\n", + " predictions = f(x)\n", + " loss = compute_loss(y, predictions)\n", + " loss.backward()\n", + " w.data.sub_(learning_rate * w.grad)\n", + " b.data.sub_(learning_rate * b.grad)\n", + " w.grad.zero_()\n", + " b.grad.zero_()\n", + " return loss" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "idr2VEWb9rr0" + }, + "source": [ + "តោះធ្វើការបណ្តុះបណ្តាល។ យើងនឹងធ្វើការឆ្លងកាត់សំណុំទិន្នន័យជាច្រើនដង (ហៅថា **epochs**), បែងវាទៅជា minibatches ហើយហៅមុខងារដែលបានកំណត់ខាងលើ:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "nOuu0qpx-wAp" + }, + "outputs": [], + "source": [ + "# Shuffle the data.\n", + "indices = np.random.permutation(len(train_x))\n", + "features = torch.tensor(train_x[indices],dtype=torch.float32)\n", + "labels = torch.tensor(train_labels[indices],dtype=torch.float32)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "3zdIf6c_85Ht", + "outputId": "6520288c-da59-4a9f-c37e-cd99779c3073" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 0: last batch loss = 94.5247\n", + "Epoch 1: last batch loss = 9.3428\n", + "Epoch 2: last batch loss = 1.4166\n", + "Epoch 3: last batch loss = 0.5224\n", + "Epoch 4: last batch loss = 0.3807\n", + "Epoch 5: last batch loss = 0.3495\n", + "Epoch 6: last batch loss = 0.3413\n", + "Epoch 7: last batch loss = 0.3390\n", + "Epoch 8: last batch loss = 0.3384\n", + "Epoch 9: last batch loss = 0.3382\n" + ] + } + ], + "source": [ + "batch_size = 4\n", + "for epoch in range(10):\n", + " for i in range(0,len(features),batch_size):\n", + " loss = train_on_batch(features[i:i+batch_size].view(-1,1),labels[i:i+batch_size])\n", + " print('Epoch %d: last batch loss = %.4f' % (epoch, float(loss)))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "JPO9xs4bToPb" + }, + "source": [ + "យើងឥឡូវបានទទួលប៉ារ៉ាម៉ែត្រដែលបានអុបទីម៉ាល់ $W$ និង $b$។ សូមសម្គាល់ថាតម្លៃរបស់ពួកវាស្រដៀងនឹងតម្លៃដើមដែលបានប្រើពេលបង្កើតសំណុំទិន្នន័យ ($W=2, b=1$)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "US6q0nCBD-LL", + "outputId": "c804b779-3231-4f6f-c854-032d211b2853" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(tensor([1.8617], requires_grad=True), tensor([1.0711], requires_grad=True))" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "w,b" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 282 + }, + "id": "_e6xRMZFDnyI", + "outputId": "79e6c360-265a-401d-ce39-8f211917a13d" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.scatter(train_x,train_labels)\n", + "x = np.array([min(train_x),max(train_x)])\n", + "with torch.no_grad():\n", + " y = w.numpy()*x+b.numpy()\n", + "plt.plot(x,y,color='red')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0giuwC9GHzi8" + }, + "source": [ + "## Computations on GPU\n", + "\n", + "ដើម្បីប្រើ GPU សម្រាប់ការគណនា, PyTorch គាំទ្រការផ្លាស់ទី tensors ទៅ GPU និងសាងសង់ក្រាហ្វគណនា សម្រាប់ GPU។ ប្រពៃណីនៅដើមកូដរបស់យើង យើងកំណត់ឧបករណ៍គណនា​ដែលអាចប្រើបាន `device` (ដែលអាចជា `cpu` ឬ `cuda`), ហើយបន្ទាប់មកផ្លាស់ទី tensors ទាំងអស់ទៅឧបករណ៍នេះ ដោយហៅ `.to(device)`។ យើងក៏អាចបង្កើត tensors នៅលើឧបករណ៍ដែលបានកំណត់ពីលើដើម ដោយផ្តល់ប៉ារ៉ាម៉ែត្រ `device=...` ទៅកូដបង្កើត tensor។ កូដដូចនេះដំណើរការ ដោយគ្មានការផ្លាស់ប្តូរ ទាំងនៅលើ CPU និង GPU៖\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "HK7HPLz3Hyrl", + "outputId": "7e14cccb-d376-4e59-be66-4ab3f5c3f6f4" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Doing computations on cpu\n", + "Epoch 0: last batch loss = 94.5247\n", + "Epoch 1: last batch loss = 9.3428\n", + "Epoch 2: last batch loss = 1.4166\n", + "Epoch 3: last batch loss = 0.5224\n", + "Epoch 4: last batch loss = 0.3807\n", + "Epoch 5: last batch loss = 0.3495\n", + "Epoch 6: last batch loss = 0.3413\n", + "Epoch 7: last batch loss = 0.3390\n", + "Epoch 8: last batch loss = 0.3384\n", + "Epoch 9: last batch loss = 0.3382\n" + ] + } + ], + "source": [ + "device = 'cuda' if torch.cuda.is_available() else 'cpu'\n", + "\n", + "print('Doing computations on '+device)\n", + "\n", + "### Changes here: indicate device\n", + "w = torch.tensor([100.0],requires_grad=True,dtype=torch.float32,device=device)\n", + "b = torch.zeros(size=(output_dim,),requires_grad=True,device=device)\n", + "\n", + "def f(x):\n", + " return torch.matmul(x,w) + b\n", + "\n", + "def compute_loss(labels, predictions):\n", + " return torch.mean(torch.square(labels - predictions))\n", + "\n", + "def train_on_batch(x, y):\n", + " predictions = f(x)\n", + " loss = compute_loss(y, predictions)\n", + " loss.backward()\n", + " w.data.sub_(learning_rate * w.grad)\n", + " b.data.sub_(learning_rate * b.grad)\n", + " w.grad.zero_()\n", + " b.grad.zero_()\n", + " return loss\n", + "\n", + "batch_size = 4\n", + "for epoch in range(10):\n", + " for i in range(0,len(features),batch_size):\n", + " ### Changes here: move data to required device\n", + " loss = train_on_batch(features[i:i+batch_size].view(-1,1).to(device),labels[i:i+batch_size].to(device))\n", + " print('Epoch %d: last batch loss = %.4f' % (epoch, float(loss)))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "A10prCPowHl7" + }, + "source": [ + "## ឧទាហរណ៍ 2: ការចាត់ថ្នាក់\n", + "\n", + "ឥឡូវនេះ យើងនឹងពិចារណាបញ្ហាការចាត់ថ្នាក់ពីរភេទ។\n", + "\n", + "ឧទាហរណ៍ល្អសម្រាប់បញ្ហាបែបនេះ គឺការចាត់ថ្នាក់អំពីថ្លើម (tumour) ថាតើវាជា malignant ឬ benign ដោយផ្អែកលើទំហំ និងអាយុ។\n", + "\n", + "គំរូមូលដ្ឋានស្រដៀងនឹង regression, ប៉ុន្តែយើងត្រូវប្រើអនុគមន៍ខាតខុសគ្នា។ ចូរយើងចាប់ផ្តើមដោយបង្កើតទិន្នន័យគំរូ៖\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "j0OTPkGpwHl7", + "scrolled": false, + "trusted": true + }, + "outputs": [], + "source": [ + "np.random.seed(0) # pick the seed for reproducibility - change it to explore the effects of random variations\n", + "\n", + "n = 100\n", + "X, Y = make_classification(n_samples = n, n_features=2,\n", + " n_redundant=0, n_informative=2, flip_y=0.1,class_sep=1.5)\n", + "X = X.astype(np.float32)\n", + "Y = Y.astype(np.int32)\n", + "\n", + "split = [ 70*n//100, (15+70)*n//100 ]\n", + "train_x, valid_x, test_x = np.split(X, split)\n", + "train_labels, valid_labels, test_labels = np.split(Y, split)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "c-_BjSHPwHl8", + "scrolled": false, + "trusted": true + }, + "outputs": [], + "source": [ + "def plot_dataset(features, labels, W=None, b=None):\n", + " # prepare the plot\n", + " fig, ax = plt.subplots(1, 1)\n", + " ax.set_xlabel('$x_i[0]$ -- (feature 1)')\n", + " ax.set_ylabel('$x_i[1]$ -- (feature 2)')\n", + " colors = ['r' if l else 'b' for l in labels]\n", + " ax.scatter(features[:, 0], features[:, 1], marker='o', c=colors, s=100, alpha = 0.5)\n", + " if W is not None:\n", + " min_x = min(features[:,0])\n", + " max_x = max(features[:,1])\n", + " min_y = min(features[:,1])*(1-.1)\n", + " max_y = max(features[:,1])*(1+.1)\n", + " cx = np.array([min_x,max_x],dtype=np.float32)\n", + " cy = (0.5-W[0]*cx-b)/W[1]\n", + " ax.plot(cx,cy,'g')\n", + " ax.set_ylim(min_y,max_y)\n", + " fig.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 283 + }, + "id": "tq0vFchQwHl8", + "outputId": "919f1922-f789-4779-cbdc-4f9e742c358b", + "scrolled": false, + "trusted": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\dmitryso\\AppData\\Local\\Temp/ipykernel_89704/2721537645.py:17: UserWarning: Matplotlib is currently using module://matplotlib_inline.backend_inline, which is a non-GUI backend, so cannot show the figure.\n", + " fig.show()\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_dataset(train_x, train_labels)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "SjPlpf2-wHl8" + }, + "source": [ + "## បណ្តុះបណ្តាល Perceptron ស្រទាប់តែមួយ\n", + "\n", + "យើងនឹងប្រើម៉ាស៊ីនគណនាក្រាឌីយង់ (gradient) របស់ PyTorch ដើម្បីបណ្តុះបណ្តាល Perceptron ស្រទាប់តែមួយ។\n", + "\n", + "បណ្ដាញប្រសាទរបស់យើង នឹងមានការ​បញ្ចូល 2 និង​ការ​បញ្ចេញ 1។ ម៉ាទ្រីសទំងន់ $W$ នឹងមានទំហំ $2\\times1$, និង​វ៉ិចទ័របៃស $b$ -- $1$។\n", + "\n", + "ដើម្បីធ្វើឲ្យកូដរបស់យើងមានរចនាសម្ព័ន្ធល្អប្រសើរជាងមុន យើងនឹងផ្គុំប៉ារ៉ាម៉ែត្រទាំងអស់ជា ថ្នាក់តែមួយ៖\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "J1KaixW-cMWJ" + }, + "outputs": [], + "source": [ + "class Network():\n", + " def __init__(self):\n", + " self.W = torch.randn(size=(2,1),requires_grad=True)\n", + " self.b = torch.zeros(size=(1,),requires_grad=True)\n", + "\n", + " def forward(self,x):\n", + " return torch.matmul(x,self.W)+self.b\n", + "\n", + " def zero_grad(self):\n", + " self.W.data.zero_()\n", + " self.b.data.zero_()\n", + "\n", + " def update(self,lr=0.1):\n", + " self.W.data.sub_(lr*self.W.grad)\n", + " self.b.data.sub_(lr*self.b)\n", + "\n", + "net = Network()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "rQ7W6TOacIAI" + }, + "source": [ + "> សូមចំណាំថា យើងប្រើ `W.data.zero_()` ជំនួស `W.zero_()`។ យើងត្រូវធ្វើបែបនេះ ព្រោះយើងមិនអាចផ្លាស់ប្តូរ tensor ដែលកំពុងត្រូវបានតាមដានដោយយន្តការ *Autograd* ដោយផ្ទាល់បានទេ។\n", + "\n", + "Core model will be the same as in previous example, but loss function will be a logistic loss. To apply logistic loss, we need to get the value of **probability** as the output of our network, i.e. we need to bring the output $z$ to the range [0,1] using `sigmoid` activation function: $p=\\sigma(z)$.\n", + "\n", + "If we get the probability $p_i$ for the i-th input value corresponding to the actual class $y_i\\in\\{0,1\\}$, we compute the loss as $\\mathcal{L_i}=-(y_i\\log p_i + (1-y_i)log(1-p_i))$. \n", + "\n", + "In PyTorch, both those steps (applying sigmoid and then logistic loss) can be done using one call to `binary_cross_entropy_with_logits` function. Since we are training our network in minibatches, we need to average out the loss across all elements of a minibatch - and that is also done automatically by `binary_cross_entropy_with_logits` function: \n", + "\n", + "> The call to `binary_crossentropy_with_logits` is equivalent to a call to `sigmoid`, followed by a call to `binary_crossentropy`\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "kdDxWeCqwHl8", + "trusted": true + }, + "outputs": [], + "source": [ + "def train_on_batch(net, x, y):\n", + " z = net.forward(x).flatten()\n", + " loss = torch.nn.functional.binary_cross_entropy_with_logits(input=z,target=y)\n", + " net.zero_grad()\n", + " loss.backward()\n", + " net.update()\n", + " return loss" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "zAAgw0h6KzUd" + }, + "source": [ + "ដើម្បីលោបតាមទិន្នន័យរបស់យើង យើងនឹងប្រើយន្តការមានក្នុង PyTorch សម្រាប់គ្រប់គ្រងសំណុំទិន្នន័យ។ វាត្រូវបានផ្អែកលើគំនិតពីរ៖\n", + "\n", + "* **Dataset** ជាប្រភពចម្បងនៃទិន្នន័យ វាអាចជាឬ **Iterable** ឬ **Map-style**\n", + "* **Dataloader** មានភារកិច្ចទទួលខុសត្រូវក្នុងការផ្ទុកទិន្នន័យពីសំណុំទិន្នន័យ និងបំបែកវាចូលទៅជា minibatches។\n", + "\n", + "ក្នុងករណីរបស់យើង យើងនឹងកំណត់សំណុំទិន្នន័យមួយដែលផ្អែកលើ tensor ហើយបំបែកវាទៅជា minibatches នៃធាតុ 16។ មួយមីនីបាចមាន tensor ពីរ គឺទិន្នន័យបញ្ចូល (size=16x2) និង ស្លាក (វ៉ិចទ័រមានប្រវែង 16 ប្រភេទចំនួនគត់ - លេខថ្នាក់)។\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "PfyqjVb2wHl8", + "outputId": "f9f5af23-005e-42e0-928b-9890b6c4e0cf", + "trusted": true + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "[tensor([[ 1.5442, 2.5290],\n", + " [-1.6284, 0.0772],\n", + " [-1.7141, 2.4770],\n", + " [-1.4951, 0.7320],\n", + " [-1.6899, 0.9243],\n", + " [-0.9474, -0.7681],\n", + " [ 3.8597, -2.2951],\n", + " [-1.3944, 1.4300],\n", + " [ 4.3627, 3.1333],\n", + " [-1.0973, -1.7011],\n", + " [-2.5532, -0.0777],\n", + " [-1.2661, -0.3167],\n", + " [ 0.3921, 1.8406],\n", + " [ 2.2091, -1.6045],\n", + " [ 1.8383, -1.4861],\n", + " [ 0.7173, -0.9718]]),\n", + " tensor([1., 0., 0., 0., 0., 0., 1., 0., 1., 0., 0., 0., 1., 1., 1., 1.])]" + ] + }, + "metadata": {}, + "execution_count": 14 + } + ], + "source": [ + "# Create a tf.data.Dataset object for easy batched iteration\n", + "dataset = torch.utils.data.TensorDataset(torch.tensor(train_x),torch.tensor(train_labels,dtype=torch.float32))\n", + "dataloader = torch.utils.data.DataLoader(dataset,batch_size=16)\n", + "\n", + "list(dataloader)[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "xrwgkbQjhkEp" + }, + "source": [ + "ឥឡូវនេះយើងអាចឆ្លងកាត់ទិន្នន័យទាំងមូល ដើម្បីបណ្តុះបណ្តាលបណ្ដាញរបស់យើងសម្រាប់ 15 អាណត្តិ:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "QGchp9D6gVJa", + "outputId": "b4c4751d-cb56-4104-d5b5-f1ae9d3d858d" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 0: last batch loss = 0.6491\n", + "Epoch 1: last batch loss = 0.6064\n", + "Epoch 2: last batch loss = 0.5822\n", + "Epoch 3: last batch loss = 0.5679\n", + "Epoch 4: last batch loss = 0.5592\n", + "Epoch 5: last batch loss = 0.5537\n", + "Epoch 6: last batch loss = 0.5501\n", + "Epoch 7: last batch loss = 0.5478\n", + "Epoch 8: last batch loss = 0.5463\n", + "Epoch 9: last batch loss = 0.5454\n", + "Epoch 10: last batch loss = 0.5447\n", + "Epoch 11: last batch loss = 0.5443\n", + "Epoch 12: last batch loss = 0.5441\n", + "Epoch 13: last batch loss = 0.5439\n", + "Epoch 14: last batch loss = 0.5438\n" + ] + } + ], + "source": [ + "for epoch in range(15):\n", + " for (x, y) in dataloader:\n", + " loss = train_on_batch(net,x,y)\n", + " print('Epoch %d: last batch loss = %.4f' % (epoch, float(loss)))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "nnyEjYAWToPd" + }, + "source": [ + "ប៉ារ៉ាម៉ែត្រ​ដែលបានទទួល:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "5QaDiCQUkFOT", + "outputId": "45b4a66b-1222-40f4-c758-d58f1c7daf8c" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "tensor([[ 0.1330],\n", + " [-0.2810]], requires_grad=True) tensor([0.], requires_grad=True)\n" + ] + } + ], + "source": [ + "print(net.W,net.b)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "s4_Atvn5K4K9" + }, + "source": [ + "ដើម្បីប្រាកដថាការបណ្តុះបណ្តាលរបស់យើងបានដំណើរការ យើងចូរគូតបន្ទាត់ដែលបំបែកចំណាត់ថ្នាក់ទាំងពីរ។ បន្ទាត់បំបែកកំណត់ដោយសមីការ $W\\times x + b = 0.5$\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 283 + }, + "id": "PgRTHttLwHl9", + "outputId": "d9abf92f-cb70-4c56-ccd0-5e027239da58", + "trusted": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\dmitryso\\AppData\\Local\\Temp/ipykernel_89704/2721537645.py:17: UserWarning: Matplotlib is currently using module://matplotlib_inline.backend_inline, which is a non-GUI backend, so cannot show the figure.\n", + " fig.show()\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_dataset(train_x,train_labels,net.W.detach().numpy(),net.b.detach().numpy())" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "1W4TZfXOmIlS" + }, + "source": [ + "ឥឡូវនេះ យើងមកគណនាភាពត្រឹមត្រូវលើសំណុំទិន្នន័យផ្ទៀងផ្ទាត់:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "HUjdeIefsIsg", + "outputId": "a1a363d4-a307-4769-9ccf-fe8a857b62af" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor(0.7333)" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pred = torch.sigmoid(net.forward(torch.tensor(valid_x)))\n", + "torch.mean(((pred.view(-1)>0.5)==(torch.tensor(valid_labels)>0.5)).type(torch.float32))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Fv7JxC3uToPe" + }, + "source": [ + "យើងមកពន្យល់អំពីអ្វីដែលកំពុងកើតឡើងនៅទីនេះ៖\n", + "* `pred` គឺជា​វ៉ិចត័រ​នៃប្រហែលភាពដែលបានទាយសម្រាប់សំណុំទិន្នន័យផ្ទៀងផ្ទាត់ទាំងមូល។ យើងគណនាវា​ដោយបញ្ជូលទិន្នន័យផ្ទៀងផ្ទាត់ដើម `valid_x` តាមបណ្ដាញរបស់យើង ហើយអនុវត្ត `sigmoid` ដើម្បីទទួលបានប្រហែលភាព។\n", + "* `pred.view(-1)` បង្កើតទិដ្ឋភាពបញ្ចេញជាបន្ទាត់នៃតង់ស័រដើម។ `view` ស្រដៀងនឹងមុខងារ `reshape` ក្នុង numpy។\n", + "* `pred.view(-1)>0.5` ទាញយកតង់ស័រប៊ូល្យែន ឬតម្លៃពិត/មិនពិតដែលបង្ហាញថាជាពាក្យថា​ដែលបានទាយ (False = class 0, True = class 1)\n", + "* ដូចគ្នានេះ, `torch.tensor(valid_labels)>0.5)` បង្កើតតង់ស័រប៊ូល្យែននៃតម្លៃពិត/មិនពិតសម្រាប់ស្លាកផ្ទៀងផ្ទាត់។\n", + "* យើងប្រៀបធៀបតង់ស័រទាំងពីរទាំងនេះម្តងៗតាមធាតុ ហើយទទួលបានតង់ស័រប៊ូល្យែនមួយផ្សេងទៀត ដែលមាន `True` សំដៅថាការព្យាករណ៍ត្រឹមត្រូវ និង `False` សម្រាប់ខុស។\n", + "* យើងបម្លែងតង់ស័រនោះទៅជាចំនួនចល័ត ហើយគណនាមធ្យមរបស់វាដោយប្រើ `torch.mean` - នេះជាពីភាគភាពត្រឹមត្រូវដែលយើងចង់បាន។\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_95qF9lY2kHp" + }, + "source": [ + "## បណ្តាញប្រសាទ និង អុបទីម៉ាយស័រ\n", + "\n", + "នៅក្នុង PyTorch មានម៉ូឌុលពិសេស `torch.nn.Module` ត្រូវបានកំណត់សម្រាប់តំណាងឱ្យបណ្តាញប្រសាទ។ មានវិធីពីរសម្រាប់កំណត់បណ្តាញប្រសាទរបស់អ្នក៖\n", + "* **Sequential**, ដោយលោកអ្នកសំគាល់តែបញ្ជីនៃស្រទាប់ដែលបង្កើតបណ្តាញរបស់អ្នក\n", + "* ជា **ថ្នាក់** ដែលទទួលមកពី `torch.nn.Module`\n", + "\n", + "វិធីទីមួយអនុញ្ញាតឱ្យលោកអ្នកកំណត់បណ្តាញស្តង់ដារជាមួយសំណុំបន្ទាត់ជាប់គ្នានៃស្រទាប់ មុនពេលវិធីទីពីរមានភាពបត់បែនច្រើនជាង និងផ្តល់ឱកាសដើម្បីបង្ហាញបណ្តាញដែលមានសំណង់ស្មុគស្មាញគ្រប់ប្រភេទ។\n", + "\n", + "នៅក្នុងម៉ូឌុល អ្នកអាចប្រើ **ស្រទាប់** ស្តង់ដារ ដូចជា៖\n", + "* `Linear` - dense linear layer, equivalent to one-layered perceptron. It has the same architecture as we have defined above for our network\n", + "* `Softmax`, `Sigmoid`, `ReLU` - ស្រទាប់ដែលទាក់ទងនឹងមុខងារបើកសកម្មភាព (activation functions)\n", + "* ក៏មានស្រទាប់ផ្សេងទៀតសម្រាប់ប្រភេទបណ្តាញពិសេសៗ ដូចជា convolution, recurrent, ល។ យើង​នឹងឆ្លេកត្រឡប់មកមើលពួកវាជាច្រើនទៀតនៅពេលក្រោយក្នុងវគ្គនេះ។\n", + "\n", + "> ភាគច្រើននៃមុខងារបើកសកម្មភាព និងមុខងារបាត់បង់ក្នុង PyTorch មានឱ្យប្រើនៅក្នុងរាងពីរប្រៀបគ្នា៖ ជា **មុខងារ** (នៅក្នុង namespace `torch.nn.functional`) និង **ជា​ស្រទាប់មួយ** (នៅក្នុង namespace `torch.nn`)។ សម្រាប់មុខងារបើកសកម្មភាព ម្តងៗវែងជាងងាយស្រួលក្នុងការប្រើធាតុមុខងារពី `torch.nn.functional` ដោយមិនចាំបាច់បង្កើតវត្ថុស្រទាប់ដាច់ដោយឡែក។\n", + "\n", + "បើយើងចង់បណ្តុះ perceptron មួយស្រទាប់ យើងអាចប្រើស្រទាប់ `Linear` មួយដែលមានក្នុងប្រព័ន្ធបាន៖\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "D77pXPR6oFRs", + "outputId": "efa49e5c-72d4-4781-89d4-4ab6597d2b0e" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[Parameter containing:\n", + "tensor([[-0.0422, 0.1821]], requires_grad=True), Parameter containing:\n", + "tensor([0.6582], requires_grad=True)]\n" + ] + } + ], + "source": [ + "net = torch.nn.Linear(2,1) # 2 inputs, 1 output\n", + "\n", + "print(list(net.parameters()))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0tbe0Et_oiNo" + }, + "source": [ + "ដូចដែលអ្នកអាចមើលឃើញ វិធីសាស្រ្ត `parameters()` នឹងត្រឡប់ប៉ារ៉ាម៉ែត្រទាំងអស់ដែលត្រូវបានកែសំរួលនៅពេលបណ្តុះបណ្តាល។ ពួកវាសមនឹងម៉ាទ្រីសទម្ងន់ $W$ និង bias $b$។\n", + "\n", + "អ្នកអាចសម្គាល់បានថាពួកវាត្រូវបានកំណត់ `requires_grad` ឲ្យជា `True` ពីព្រោះយើងត្រូវការគណនា ក្រាឌីអង់សម្រាប់ប៉ារ៉ាម៉ែត្រ។\n", + "\n", + "PyTorch ក៏មាន **optimizers** ជាស្រាប់ ដែលអនុវត្តវិធីសាស្ត្រកែលម្អ ដូចជា **gradient descent**។ នេះជារបៀបដែលយើងអាចកំណត់ **stochastic gradient descent optimizer**៖\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "B4AxyrFMozh0" + }, + "outputs": [], + "source": [ + "optim = torch.optim.SGD(net.parameters(),lr=0.05)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "6eB8v58eo9pp" + }, + "source": [ + "ដោយប្រើ optimizer វដ្តបណ្តុះបណ្តាលរបស់យើងនឹងមើលទៅដូចនេះ:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ups7nlV22ofp", + "outputId": "503d8ae9-35f3-4ecb-e2ff-4da2ec2914eb" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 0: last batch loss = 0.7596041560173035, val acc = 0.5333333611488342\n", + "Epoch 1: last batch loss = 0.6602361798286438, val acc = 0.6000000238418579\n", + "Epoch 2: last batch loss = 0.5847358107566833, val acc = 0.6666666865348816\n", + "Epoch 3: last batch loss = 0.5263020992279053, val acc = 0.7333333492279053\n", + "Epoch 4: last batch loss = 0.48015740513801575, val acc = 0.800000011920929\n", + "Epoch 5: last batch loss = 0.4430023431777954, val acc = 0.8666666746139526\n", + "Epoch 6: last batch loss = 0.41254672408103943, val acc = 0.8666666746139526\n", + "Epoch 7: last batch loss = 0.3871781527996063, val acc = 0.800000011920929\n", + "Epoch 8: last batch loss = 0.3657420873641968, val acc = 0.800000011920929\n", + "Epoch 9: last batch loss = 0.34739670157432556, val acc = 0.800000011920929\n" + ] + } + ], + "source": [ + "val_x = torch.tensor(valid_x)\n", + "val_lab = torch.tensor(valid_labels)\n", + "\n", + "for ep in range(10):\n", + " for (x,y) in dataloader:\n", + " z = net(x).flatten()\n", + " loss = torch.nn.functional.binary_cross_entropy_with_logits(z,y)\n", + " optim.zero_grad()\n", + " loss.backward()\n", + " optim.step()\n", + " acc = ((torch.sigmoid(net(val_x).flatten())>0.5).float()==val_lab).float().mean()\n", + " print(f\"Epoch {ep}: last batch loss = {loss}, val acc = {acc}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "vRLXEQ4Qrcvx" + }, + "source": [ + "> អ្នកអាចសង្កេតឃើញថា ដើម្បីអនុវត្តបណ្តាញរបស់យើងលើទិន្នន័យបញ្ចូល យើងអាចប្រើ `net(x)` ជំនួស `net.forward(x)` ដោយសារ `nn.Module` បានអនុវត្តមុខងារ Python `__call__()`\n", + "\n", + "យោងតាមចំណុចនេះ យើងអាចកំណត់មុខងារ `train` ទូទៅ:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "5c6WsBhlrlIs", + "outputId": "54de8404-4170-4a15-abba-039d06d5e946" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 0: last batch loss = 0.48486900329589844, val acc = 0.7333333492279053\n", + "Epoch 1: last batch loss = 0.41338109970092773, val acc = 0.800000011920929\n", + "Epoch 2: last batch loss = 0.35756850242614746, val acc = 0.800000011920929\n", + "Epoch 3: last batch loss = 0.31495171785354614, val acc = 0.800000011920929\n", + "Epoch 4: last batch loss = 0.2824164032936096, val acc = 0.800000011920929\n", + "Epoch 5: last batch loss = 0.2572754919528961, val acc = 0.800000011920929\n", + "Epoch 6: last batch loss = 0.23751722276210785, val acc = 0.800000011920929\n", + "Epoch 7: last batch loss = 0.2217157930135727, val acc = 0.800000011920929\n", + "Epoch 8: last batch loss = 0.2088666558265686, val acc = 0.800000011920929\n", + "Epoch 9: last batch loss = 0.19824868440628052, val acc = 0.800000011920929\n" + ] + } + ], + "source": [ + "def train(net, dataloader, val_x, val_lab, epochs=10, lr=0.05):\n", + " optim = torch.optim.Adam(net.parameters(),lr=lr)\n", + " for ep in range(epochs):\n", + " for (x,y) in dataloader:\n", + " z = net(x).flatten()\n", + " loss = torch.nn.functional.binary_cross_entropy_with_logits(z,y)\n", + " optim.zero_grad()\n", + " loss.backward()\n", + " optim.step()\n", + " acc = ((torch.sigmoid(net(val_x).flatten())>0.5).float()==val_lab).float().mean()\n", + " print(f\"Epoch {ep}: last batch loss = {loss}, val acc = {acc}\")\n", + "\n", + "net = torch.nn.Linear(2,1)\n", + "\n", + "train(net,dataloader,val_x,val_lab,lr=0.03)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "KzuIDqJ8sFYm" + }, + "source": [ + "## កំណត់បណ្ដាញជាលំដាប់នៃស្រទាប់\n", + "\n", + "ឥឡូវនេះ យើងនឹងបណ្តុះ perceptron ច្រើនស្រទាប់។ វាអាចត្រូវបានកំណត់បានដោយគ្រាន់តែបញ្ជាក់លំដាប់នៃស្រទាប់។ វត្ថុដែលទទួលបាននឹងទទួលមុខងារពី `Module`, ឧទាហរណ៍ វានឹងមានវិធី `parameters` ដែលនឹងត្រឡប់ប៉ារ៉ាម៉ែត្រទាំងអស់នៃបណ្ដាញទាំងមូល។\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "tBtytmEAsq-O", + "outputId": "06ad840b-c2b7-409e-e01e-a9170548151d" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sequential(\n", + " (0): Linear(in_features=2, out_features=5, bias=True)\n", + " (1): Sigmoid()\n", + " (2): Linear(in_features=5, out_features=1, bias=True)\n", + ")\n" + ] + } + ], + "source": [ + "net = torch.nn.Sequential(torch.nn.Linear(2,5),torch.nn.Sigmoid(),torch.nn.Linear(5,1))\n", + "print(net)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5r5RbLB1s6YB" + }, + "source": [ + "យើងអាចបណ្តុះបណ្តាលបណ្ដាញច្រើនស្រទាប់នេះដោយប្រើមុខងារ `train` ដែលយើងបានកំណត់ខាងលើ:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ogXKdcfIs_ND", + "outputId": "957ccd8d-0076-4e9b-89f1-edc1de75f18e" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 0: last batch loss = 0.5835739970207214, val acc = 0.800000011920929\n", + "Epoch 1: last batch loss = 0.4642275869846344, val acc = 0.800000011920929\n", + "Epoch 2: last batch loss = 0.35158076882362366, val acc = 0.800000011920929\n", + "Epoch 3: last batch loss = 0.26132312417030334, val acc = 0.800000011920929\n", + "Epoch 4: last batch loss = 0.19465585052967072, val acc = 0.800000011920929\n", + "Epoch 5: last batch loss = 0.14735405147075653, val acc = 0.800000011920929\n", + "Epoch 6: last batch loss = 0.11454981565475464, val acc = 0.800000011920929\n", + "Epoch 7: last batch loss = 0.09244414418935776, val acc = 0.800000011920929\n", + "Epoch 8: last batch loss = 0.07805468142032623, val acc = 0.800000011920929\n", + "Epoch 9: last batch loss = 0.06894762068986893, val acc = 0.800000011920929\n" + ] + } + ], + "source": [ + "train(net,dataloader,val_x,val_lab)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "jY4R1XEGtEzJ" + }, + "source": [ + "## ការកំណត់បណ្ដាញជាថ្នាក់\n", + "\n", + "ការប្រើថ្នាក់មួយដែលបន្តពី `torch.nn.Module` គឺជាវិធីដែលបត់បែនជាង ព្រោះយើងអាចកំណត់ការគណនាណាមួយនៅក្នុងវា។ `Module` ធ្វើអ្វីៗជាច្រើនដោយស្វ័យប្រវត្តិ; ឧទាហរណ៍ វាដឹងដោយស្វ័យប្រវត្តិនូវអថេរផ្ទៃក្នុងទាំងអស់ដែលជាស្រទាប់ (layers) របស់ PyTorch ហើយប្រមូលប៉ារ៉ាម៉ែត្ររបស់ពួកវាសម្រាប់ការអុបទីម៉ីសេន។ អ្នកគ្រាន់តែត្រូវកំណត់ស្រទាប់ទាំងអស់នៃបណ្ដាញជាសមាជិកនៃថ្នាក់៖\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "SlsJmGu0tMsZ", + "outputId": "240d5c89-096c-4392-99cd-1ade5ff3e3e1" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MyNet(\n", + " (fc1): Linear(in_features=2, out_features=10, bias=True)\n", + " (func): ReLU()\n", + " (fc2): Linear(in_features=10, out_features=1, bias=True)\n", + ")\n" + ] + } + ], + "source": [ + "class MyNet(torch.nn.Module):\n", + " def __init__(self,hidden_size=10,func=torch.nn.Sigmoid()):\n", + " super().__init__()\n", + " self.fc1 = torch.nn.Linear(2,hidden_size)\n", + " self.func = func\n", + " self.fc2 = torch.nn.Linear(hidden_size,1)\n", + "\n", + " def forward(self,x):\n", + " x = self.fc1(x)\n", + " x = self.func(x)\n", + " x = self.fc2(x)\n", + " return x\n", + " \n", + "net = MyNet(func=torch.nn.ReLU())\n", + "print(net)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "HwdapRxft-7M", + "outputId": "6eb900cf-4902-4a04-c62b-497b68455406" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 0: last batch loss = 0.7821246981620789, val acc = 0.46666666865348816\n", + "Epoch 1: last batch loss = 0.7457502484321594, val acc = 0.5333333611488342\n", + "Epoch 2: last batch loss = 0.7120334506034851, val acc = 0.5333333611488342\n", + "Epoch 3: last batch loss = 0.6811249256134033, val acc = 0.6666666865348816\n", + "Epoch 4: last batch loss = 0.6533011794090271, val acc = 0.7333333492279053\n", + "Epoch 5: last batch loss = 0.627849280834198, val acc = 0.7333333492279053\n", + "Epoch 6: last batch loss = 0.6030643582344055, val acc = 0.800000011920929\n", + "Epoch 7: last batch loss = 0.5775002837181091, val acc = 0.800000011920929\n", + "Epoch 8: last batch loss = 0.5522137880325317, val acc = 0.8666666746139526\n", + "Epoch 9: last batch loss = 0.5250465869903564, val acc = 0.8666666746139526\n" + ] + } + ], + "source": [ + "train(net,dataloader,val_x,val_lab,lr=0.005)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dvAiaj_JndyP" + }, + "source": [ + "**កិច្ចការ 1**: គូរគម្រោងក្រាហ្វនៃមុខងារខាត និងភាពត្រឹមត្រូវលើទិន្នន័យបណ្តុះ និងទិន្នន័យផ្ទៀងផ្ទាត់ ក្នុងពេលបណ្តុះ\n", + "\n", + "**កិច្ចការ 2**: ព្យាយាមដោះស្រាយបញ្ហាការបែងចែកប្រភេទ MNIST ដោយប្រើកូដនេះ។ គន្លឹះ៖ ប្រើ `crossentropy_with_logits` ជាមុខងារខាត។\n" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## ការកំណត់បណ្ដាញជា PyTorch Lightning Module\n" + ], + "metadata": { + "id": "7THJ0lhITxDi" + } + }, + { + "cell_type": "markdown", + "source": [ + "មកដាក់កូដម៉ូដែល PyTorch ដែលបានសរសេរនៅក្នុងម៉ូឌុល PyTorch Lightining។ នេះអនុញ្ញាតឱ្យធ្វើការជាមួយម៉ូដែលរបស់អ្នកយ៉ាងងាយស្រួល និងបត់បែនប្រសើរឡើង ដោយប្រើវិធីសាស្ត្រ Lightining ផ្សេងៗសម្រាប់ការបណ្តុះបណ្តាល និងការធ្វើតេស្តភាពត្រឹមត្រូវ។\n" + ], + "metadata": { + "id": "bPpYZFQAXNMV" + } + }, + { + "cell_type": "markdown", + "source": [ + "ជាដំបូង យើងត្រូវតែដំឡើង និងនាំចូល PyTorch Lightining។ អាចធ្វើបានដោយពាក្យបញ្ជា\n", + "\n", + "```\n", + "pip install pytorch-lightning\n", + "```\n", + "ឬ\n", + "```\n", + "conda install -c conda-forge pytorch-lightning\n", + "```\n" + ], + "metadata": { + "id": "Crqwpx6gZUm3" + } + }, + { + "cell_type": "code", + "source": [ + "import pytorch_lightning as pl" + ], + "metadata": { + "id": "_bBSXSELVlRK" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "ដើម្បីឱ្យកូដរបស់យើងដំណើរការ​ក្នុង Lightning, យើងត្រូវធ្វើដូចតទៅ៖\n", + "\n", + "1. បង្កើត subclass មួយ នៃ `pl.LightningModule` ហើយបន្ថែមរចនាសម្ព័ន្ធម៉ូឌែល ទៅក្នុងវិធីសាស្ត្រ `__init__` និងវិធីសាស្ត្រ `forward` សម្រាប់ការបញ្ជូនឆ្លង។\n", + "2. ដាក់ optimizer ដែលប្រើនៅក្នុងវិធីសាស្ត្រ `configure_optimizers()`។\n", + "3. កំណត់ដំណើរការ training និង validation ក្នុងវិធីសាស្ត្រ `training_step` និង `validation_step` តាមលំដាប់।\n", + "4. (ជាជម្រើស) អនុវត្តន៍ដំណើរការ testing (វិធីសាស្ត្រ `test_step`) និង prediction (វិធីសាស្ត្រ `predict_step`)។\n", + "\n", + "គួរយល់ដឹងផងដែរថា PyTorch Lightning មានមុខងារក្នុងខ្លួនសម្រាប់ផ្ទេរម៉ូឌែលទៅឧបករណ៍ផ្សេងៗ בהתאם ទៅលើទីតាំងដែលទិន្នន័យចូលពី `DataLoaders` ស្ថិត។ ដូច្នេះ ការហៅទាំងអស់ជា `.cuda()` ឬ `.to(device)` គួរត្រូវបានដកចេញពីកូដ។\n" + ], + "metadata": { + "id": "_Aaz4FNpZjqL" + } + }, + { + "cell_type": "code", + "source": [ + "class MyNetPL(pl.LightningModule):\n", + " def __init__(self, hidden_size = 10, func = torch.nn.Sigmoid()):\n", + " super().__init__()\n", + " self.fc1 = torch.nn.Linear(2,hidden_size)\n", + " self.func = func\n", + " self.fc2 = torch.nn.Linear(hidden_size,1)\n", + "\n", + " self.val_epoch_num = 0 # for logging\n", + "\n", + " def forward(self, x):\n", + " x = self.fc1(x)\n", + " x = self.func(x)\n", + " x = self.fc2(x)\n", + " return x\n", + "\n", + " def training_step(self, batch, batch_nb):\n", + " x, y = batch\n", + " y_res = self(x).view(-1)\n", + " loss = torch.nn.functional.binary_cross_entropy_with_logits(y_res, y)\n", + " return loss\n", + "\n", + " def configure_optimizers(self):\n", + " optimizer = torch.optim.SGD(self.parameters(), lr = 0.005)\n", + " return optimizer\n", + " \n", + " def validation_step(self, batch, batch_nb):\n", + " x, y = batch\n", + " y_res = self(x).view(-1)\n", + " val_loss = torch.nn.functional.binary_cross_entropy_with_logits(y_res, y)\n", + " print(\"Epoch \", self.val_epoch_num, \": val loss = \", val_loss.item(), \" val acc = \",((torch.sigmoid(y_res.flatten())>0.5).float()==y).float().mean().item(), sep = \"\")\n", + " self.val_epoch_num += 1" + ], + "metadata": { + "id": "0vp2ROQ9UHeE" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "យើងក៏បន្ថែម `Dataset` និង `DataLoader` សម្រាប់ការផ្ទៀងផ្ទាត់:\n" + ], + "metadata": { + "id": "tuWOgQabncMG" + } + }, + { + "cell_type": "code", + "source": [ + "valid_dataset = torch.utils.data.TensorDataset(torch.tensor(valid_x),torch.tensor(valid_labels,dtype=torch.float32))\n", + "valid_dataloader = torch.utils.data.DataLoader(valid_dataset, batch_size = 16)" + ], + "metadata": { + "id": "h3bAMM8RVckT" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "ឥឡូវម៉ូឌែលរបស់យើងបានត្រៀមរួចសម្រាប់ការបណ្តុះបណ្តាល។ នៅក្នុង Pytorch Lightning, ដំណើរការនេះត្រូវបានអនុវត្តតាមវត្ថុមួយនៃថ្នាក់ `Trainer` ដែលសារៈសំខាន់គឺ \"លាយ\" ម៉ូឌែលជាមួយសំណុំទិន្នន័យណាមួយ។\n" + ], + "metadata": { + "id": "yj0Cd6OOnoyy" + } + }, + { + "cell_type": "code", + "source": [ + "net = MyNetPL(func=torch.nn.ReLU())\n", + "trainer = pl.Trainer(max_epochs = 30, log_every_n_steps = 1, accelerator='gpu', devices=1)\n", + "trainer.fit(model = net, train_dataloaders = dataloader, val_dataloaders = valid_dataloader)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 864, + "referenced_widgets": [ + "1657a223e5524ca682ea081b9e4addea", + "4f111fbdbc3440f783adc3df3df46494", + "cc048e2c91ce48258934ef577cf229d1", + "d3c01678943341c5b814430145692a69", + "9b55455cc9b541ef9634be2d790bb831", + "15d7c09876074047afac1e41cb9ac121", + "90137ba0ff814f71ad964f45d704ee89", + "0919c9545ef64ed1a65f3f489d51cccc", + "12cad77b8027415b82937ad33f793a63", + "25ff491870eb4bf6ad4a320e5c99bd31", + "238a42e032c34b9183e1e6a75f886da0", + "a4fb1b2e0f8b4346bbde1b949dbce0fd", + "18876b0e4f0f4b21ad1802f36637c067", + "92ef8d6e24604b2f895e3876dc9996ee", + "d4bc1057a59c4666a7dc0f9627c45901", + "3355e659c40e4e42bbad6c8690f5055e", + "0ab539031d80478685164ce470246d57", + "271fdffaef854a67b294c0ccdfb6fe91", + "0bd01bf4a9954fe2ba2760d10b9d7971", + "bd5250b6001c4cd282a25d498ee4e673", + "21538a0928e04ca08562dda0322385a1", + "5301b071e422430e9bff6cd23c2853b5", + "3e63509c89304bccb2c7371ec5e7ca62", + "ff10f2e47185425eaa1229be76092ee5", + "03cbfa5d29d548498035ba7bf7e0b659", + "561c5a5b02894df2a66b2991877e1231", + "569851b1958f49e281770b65bf78b60a", + "2b49a1491afb4946975395080b9117e9", + "79737a473e0b4b59bb4d6f190d92b94c", + "d8a3af0177fc4707b928629952396ad5", + "34852db50a91487795451f76b57da6b2", + "046c75ea1598416497c2ef218d1f268a", + "16e49dd0c2094a87a398416bac89ef69", + "e6c4eb3c595c43ef9722654dcfabfcc6", + "62f1b983740e47cd8664eccafc926e32", + "9861f59fd71a4e3c879858ef8b4b40fb", + "d9960d4519ec42bcb8678359b278c7b5", + "118e90e145994312897584085642c03b", + "db156fc5cbfd426e8460232b8f760733", + "e68df50870c5469a9dc86346d7ad9a4e", + "c89c5ec1ca1549cbbc7dd57b3672d74e", + "84e423587f4244938844cd74d2f86dc0", + "a31f6ff7fbc54df5bd1745816b2176f8", + "d6d02c0963c54a6bbbd6753f3c3e6503", + "69eedcfbe5c14a4cbe119364ce973690", + "72eb0dd423f4486b9a63f100670e03a5", + "4b7e9cfd822d48db848319a78548b0db", + "a52a0bc61ed14e0d93f0c4768687fee8", + "d1c60311d2bc4f4c826da5c7a634202d", + "08426ffc99c44d6290ef9cb9363a5737", + "161c5cea83dc42f6b87c904303dad688", + "79c04563af9646dd9a7e82db11894c24", + "235b2edd90bf4d1383b5a0d49905a241", + "24ead65d14c54fbcb174b06b7dadbcc5", + "20b85c48964d4c85890f8a0ebc04dd1d", + "7287a9afffb5470c920734840c5d72fe", + "ae3232c87db9469fa19cb59f78be2f57", + "e2a292f657c342569a080a3d9e25852b", + "f56858c5843d446286d416e9bbc7e7c8", + "6ddb0e10ea78488aa8358ec3a7bb0780", + "df7172162b6542f08662614b084d7521", + "ca6221d153a94b4898e5a1b5043b843d", + "54e9275a7f074eeca9a5995653d16036", + "4454290d993f4350a6dc4e464c61c0a9", + "6e5f99b5aec44fff9d4cecb28dd59188", + "39ae0b5e8b8a41b79ea1a209f2aacc87", + "08a690202bbe48bf9434a3354cb560c1", + "7311cc83255f46ffa31f461c485111b5", + "6f484c87ff3e4582aad771a703151f2b", + "ab9c536f94b84922877071f760111f55", + "427f04eec07f4d94a010664b12139f0f", + "cd7f66fdfe224994a31a3c985cb7a1de", + "b74e5502e4e54847b1191b7b0304f66a", + "dbfcbe2df4f74df594606dd0bb6873b4", + "ac62ad773e7a4694b57dd8c71b81f23d", + "f20824d8dfc84640bee1cdc9b7277caa", + "fd9a33d8f6ad459594d9939fd635730c", + "e2900fe753754ede94abc1847dda4d5c", + "0c1832e2d1ab4ca4a882d76f1d896c02", + "10a5f4a004bc4a81a485604f67bab642", + "fe260f7a9c66497cad723b44c1addbe7", + "ef7d39cc71074a7faa299da2621abe03", + "3f58e2aea843451b83e3aba8c1eefc74", + "fd38fbd015e6471392cfee4464e6370e", + "a95c45bcb67f4a569fb9f88af8108fde", + "bf3bf33f0c474b54a4b472a4a7626da7", + "afcc785f069b433ba8747b01e5840763", + "ec27c6b290be4adc8d2df034fd3bb143", + "0d2b1608b987468791e1a7ffedfd0079", + "016a5fc3757c480b9c905867c4892864", + "c7c7cc7d1c0647abb11ade78ef451007", + "d0e4462fee034a67b3682e27d5cb6e27", + "ac3a80de351440e7a279f3efce37e430", + "d6204036abba495785a3674ea841746c", + "3df8a54d12604c1ebe7229f88d5811bf", + "5236935ed5874a0986f953ee21477be9", + "1355273e058041efa299727d17949855", + "68acf21436374d5eb393ada1b2298e28", + "57d592b9768545869080fc2505e5a770", + "b650b7b4420541298ea255d741f8a518", + "3d0949a3f0504bf0802082ec86ce8e17", + "3f71570951c94959ba0eea6692b2d671", + "15f97cc51d594cca91dc43cbf019ffbc", + "23e7ec609ed649e29f2c274bd76ee3dd", + "47af905082094cd5b8a4cb4ab02ec431", + "87aa955f31054e7da3fc1c93a8e1f335", + "2f79b8377db841b5b14650ed14d7c5cb", + "0560fb1045034e4b865a199dc0fba636", + "e35861641d664e2ea8140ff988b65576", + "4d683f5e6ccb4328bfd33829e05e2e35", + "8eb84c34c1a54dad903371885051bef2", + "424d7efa1e1d4c79a5a9e1e0eea97bc3", + "0d6619a581884191a205c9e1b91b3790", + "035553232bbc40c789c35bdcd78d7b88", + "6648bcb6b46e4dc893654f139a7b73df", + "d4302a261e334336b71459e74fee95a4", + "5ae44fb9f67b40bb8261defbc07bf689", + "5097652e46cf4d1d88933903e37387dd", + "82e9918bb5b648058fe32b19b0ab7059", + "28913620d1dc406db67ff7876db5d414", + "2e5b502d9c0e47449a6e7b5095d5b6ec", + "044439bda84b4d24935a46be5c14ca02", + "3aa9793c2771435b892c70a5ca86a372", + "490c7d65abaf46a1a6f781395f846b83", + "b3ad1dfdecf649988c4060e76f0c9164", + "6f0bd0ab209348d2a76ae70cfbfa47ff", + "95dc3afa44174e9f8e715dab0a3dfd7d", + "d2f7362dee2b4100930a7a1f288e649e", + "c92364fa157f4212a9a9811925605382", + "aec5035eeab04627b3d61c05bf53ef4f", + "035f91d8fd1d4ff6932f9d01aa334f3a", + "8a56ba2f8d384c0fb285ac9cf7b5e421", + "675520bc1a7e4aca9e17f7410d6380cf", + "9b19f80d8f5648b9b575515d2f8085f8", + "c0065e721652472996f40eb47071589c", + "b236adc069d049c288d81702cc0dd62c", + "5eefa033732941b39bf3bfa62fd9185e", + "5aefc7d586ae4be4aa33c1383f494b9f", + "5e0c000321a64c28a81a1e167d88bd22", + "438661c89c034656b86e936360474b24", + "ed1fca3c73ad446db422e30f5ec44b0e", + "4421eb7516c04af1972c6f5df5315bc4", + "6d52bfaf6be54d90a53e1fb465dfaf7d", + "3cd65d1d3cd0438ea94b8c4d964bc65c", + "a4653a04856c47a0b1907d864e3f1a15", + "02e9029cbe8a4db0b6ef00c4df0ae302", + "258629893fa14d178577ee19efdff31e", + "fe82872822b749ae87fac7eb4df0791e", + "07655ba9152647df80ad1efe4b117135", + "b6e87d03766a4185ad2c4d716aa456d7", + "c6f304a0747d40fea9571f99f5289986", + "5722085f090c4851a1cde4daf7db77df", + "7aed32af8b134b56a041ebb25c32640c", + "a723ce7408e14b63b6d4311051dca322", + "3a9c42437ab34710a3fd3a75cf9cfac4", + "80a0d8b6e16b4ceb98bb8911b0fa596c", + "9310b29cec49404b8dfc9feb8e5bac9f", + "44341f0cb29440a2bef7f711517a01ff", + "9739202e0849427d9fe61210e231837c", + "c43c9d3bbacf478b9fafc076ea58ad29", + "abfa8dc54e654a61b93ec9a15f5fe67e", + "979514f924c6441098f7b7231ae15900", + "bbef9cf5cf2d42adb650caba73919e06", + "3b8da849443f401bb51a038f5bb82ad9", + "36f417b9e7e247b68e3bb18519af98b4", + "71643356b8954af5ab6cdf03df2825e3", + "8d50b1a8e0ce4d018fe4a51240ddb35d", + "654d72723ed8474ca360102e896331d5", + "049d95dcfbb34e84a0060919fdb8f454", + "54955fa5560041c09f847a3afb39eecd", + "34b2c78ef1254853a377efc6fead2e95", + "4eda8d394bff4fbf98bc086737c75219", + "4ca134b9e1df4136bd0d2660a82960cf", + "87cf68c4e8a245c686fbbe439f176b87", + "6009ded338de4e5b9a204e6f1243bf05", + "f01a1f50e0a74faaacc35695590cea30", + "a76a4846aa11422785c1d0218c94b827", + "373e3dd821954f33becb388c82ffebc2", + "9f532b8a64b3410f9a2e2a99755dac55", + "b457e104ad194032ba15070b89d42e6e", + "81fc3a7b94554a1980724ac6092fc88a", + "68908006e8eb4b31a55d1c0be51453bd", + "8f5c49525abe4d7a9ea746db18135f26", + "70eb5ab30ffb4b5bbe58832c6386a536", + "970d8a7e2b5c47a5bff8a036cadc9b84", + "3ad7904ba48048bfa4b7a866cf4aa4a6", + "a20c551e949842f881c6def753eb81ed", + "67e1192ed6774aa9bb17f1d5a27695f9", + "5aea05cbd78843bcb2a9d3df9e3abefd", + "4693d306ecaf44f2b6b505ca072e22bb", + "2e46fda9b283487ba4f118bad5a880c6", + "55a8b90a0a6c44eda0bedd43fda69c41", + "a7e64bcbd09644a198b9f1c7d8a8d1c6", + "87a7b1169e1f404d81fddc56c0ba2145", + "921d621e89a64e1aab62397758e26592", + "da9024d63c56460b9ca061d5cd1bb985", + "503e7b032b3d44d49e15587060b25e56", + "1361830025974670a174df70957feabc", + "6adb0fc2977b41e7bce4e81909c6c931", + "ab9b58483e0145aab2f22a8bbf0422cf", + "6725fd421a9344feb552ee1a1ce84dda", + "0d712617055b45a3b6f5783dfe6a5842", + "1c5fdfd620eb47c28dcb91ff04ea6155", + "db2185de343a4f76a2b2ecfad4e658ad", + "bb1efececaef471c90c3bc9cc2fb5ac7", + "7a49920285474268b1cb3f57e73a450e", + "b0e5dea19289434ebe98002e3cfe6086", + "92a8cbc6f6344e49a455c9e3df2c552f", + "b41986dd9910458e95ddfff0b1a508d1", + "f2fb2d0dfed54272abbc0560a467c97e", + "08c1e9701d0b4f2e8b34027af81ab586", + "1ea2399f27404d5cbfffd68efbd472fc", + "affc022e069a41af877cf9fbe3889012", + "65490339b12e47d6b35cbf4a16d1bfeb", + "10247683189c43b6abf3df0b7818bcd9", + "10b0f64c86714778919d55c643550ff5", + "a702202230484af5b32a4653f0eac288", + "5e38b9f21ce04bcc820f711c9c47678d", + "2771553d801f4961ad94344e2d5caacd", + "134808b58f1f42b09c4b2353a94bbb0e", + "02bda666a850468086acea36156397c7", + "9abed88d016f4822bf19e71dcf997571", + "6ea72db4ae8b45ec96508a51c21b6974", + "7baafb061feb455e9b37622dc9a4c724", + "ba06f72e44694ecd9fa51e984b4dc8bf", + "136c4f60a8734c578129fd843ee7ab5f", + "28f475b19b08458c81ee0cfb11c9d9c3", + "604fd938ec7d41f285e1f1b9cb9c6eac", + "07bb79027e20401e84d02a33a628b397", + "288ab1d98c7a4e21af429773a9fe3534", + "19a6a91b0d4e46d9be72aee530a974ce", + "0de2ddf45f754c5991a62ae8e822c4b7", + "a6fb10bec45f4f1a9243b466eb95c017", + "44ce5ef7a8af4fb291da012fa53e0c5a", + "9c40cc6348cb4bcfb59e0457399cd72b", + "3f9455a7a52947638545cff45b1e807d", + "22550ebc70ef4671a65bb1a041c9def7", + "67f022dd80234c08849906615a1191dc", + "2e5e169b1ad64407ad8c3494a70b314f", + "277e7a95b41447b4a52824c212e6fa7c", + "d07c7bcf6a934fae9e015be66a1f860d", + "c5e484430b0843689d7cfb434d0aa8da", + "814e2827e8d647069f05c5b4c89deb52", + "0c8b616aecfd4e5e80a0b7c3aabd290f", + "e0f4261c913d42c9a7dcdf79a9914d4a", + "80a819740bb44d589858d4780b100255", + "5caf7d1fdd564dc2bebe48dd918d9c8f", + "10ab820d989c44b98a8bde85780c3deb", + "7e787283e4434da6b5d3f9245745547c", + "b8c86419aa4f43a3a0c9443f23298c0a", + "0270acbb7ed94626adc932afa0655eaa", + "ab0b7e4f05b24205b5e4b9e975cb8e71", + "70c85ee15c0c4427b6538acbbd0de481", + "b38c3345647c4db68a2321e3a4d9e215", + "8c7b852936ca400aa04ec3f95e9afcb3", + "3099fea4c655407582c196176cc2108c", + "a5cb3ea273f9454fbb9dcd8877f2aa33", + "b4a722f06b614e9cbb259c8fa1e9f664", + "228014c8ccd543a6af4c554cf60137bf", + "6e7ea147348f40c8acc919af41047189", + "7c315c5b62e14d2c9af6fecf536d8df5", + "a9e1b08f5ff24e1b8d652cd9ad649b54", + "df097748d93e4254be82e6dae9696167", + "ac30029d30c34fd58a7f3d1826d94d6b", + "6daac3cee4b9409cba48efa0d06bee24", + "db45da82b3594a1db11322289253a132", + "d4891374cfde42adac3f2218b879f082", + "2a009696a36748b2937ac6746460483a", + "979c7269c8394082b277435040052f45", + "42ff3dacbeb34fc79e60d382c93180d6", + "d5156d7ec0e14a60bc67ac5e3c5b32a6", + "e82400379100428a915968d7ba060fd5", + "f25f7aabffb046a388ba71ad7c3ab7de", + "5088dea18c1146d8841e50e76697b7e5", + "e36d59055aee4a48b521109b96c9faff", + "d4b061b8a44646a8b4ccc4839fe769a8", + "354425d2d3cc4be4891499c8c252e585", + "84c2e850cd944480bf1cc9bd79ca40f4", + "ecb0caf0ebd2458789aee04fd0468723", + "0689a7b924674988a587d498cb946549", + "ea131342791043d48673da5ccb559c26", + "6936e031b7f74f45998232f819666b45", + "ae8efd2c29bb4008a13be5b0483928b4", + "7728374b25ec4b45b3d9171e69173bf5", + "a7456e34baef4c89979963a8e61b98e4", + "1db1f8a2985947639120d9bccdf3208e", + "ac7a77f2fd1b4cdaab3ae8ff2bb8b963", + "2486dff82a4b41809b4a8ac2569b7e10", + "bcb064131d464033be2a95b5df8e2c82", + "4614b06d5a974ecf86238f938e58bccb", + "7d3a28c174ff4c2791039495b544b507", + "58a114346ac44a8c992da25fb7c721f8", + "58e96bfc8f6a449eafa644edf4b75228", + "3bafea3ba4b347e186da01e279f41084", + "d8fa48e20376478e9e89438aa57de80d", + "5d9aaed3cf2e451595690e72ed4c2495", + "ab7aabf047e34d5899bc3dcfa972f7fd", + "8a006c7b0f0d431c8c024aad2ea8e427", + "cc122dc799da42948360712d0b809ed9", + "d3186548246149feaa9228782d7adaab", + "96660986fcd1451d8565790e961277b5", + "e6d820247bfc42acbff367b5794b6655", + "b7ff8b76997a4235a3205fac9c531502", + "00e7a13db6174f3182a898345dd1d38d", + "adcdbc5f4ee045a2bc8c7b3b7f4cac5b", + "f4920d0dce6c4d2b8528f8b098722cfc", + "51f3bf496ca146b18b93fb58846f591e", + "78672ae9cde346c09d3a7f7701dfd151", + "a866149ec74144b385f55fdf7eb105a8", + "26b866aceb8342b5830ca76815d6fa73", + "861f32fe95c04198b9dd81c8fa1fbacb", + "963f20a5be194830b08bb215b9ee97a1", + "ddeba74ba1ba4dd1a1c4f47c358eeae5", + "7d8c57299000460680a250aa23c7b2cd", + "4aced1e370fc4b2c88d4283bcbe97ebf", + "44a36016b20647efa05d9aee60aaedb8", + "9efd3613e80e4aa78248e979a44bd88b", + "288cff3f48ab4cf2b27cfc5c37c716f7", + "179d01e55e5142acaddfff4b1975860e", + "db881594d4b9483bab4d09b536a6602a", + "1b4e9bc9196d4c7e98005bc5de040202", + "8754e0214d6c495ca4f7e75d11738f73", + "3fbb5b3e332d4444ab7623422347d7ce", + "85520aaa9c464b7f927c043a323e45f3", + "bd18214cd9624c0c97d6e5d73bd84b9e", + "67a7e78833b141778d290e31b5006277", + "67139d0ae82f4ca7be9506a5bdd2f603", + "73b4b4d832f446259513cff2c764a544", + "442b0033175d4d38ac1633814f8919b3", + "08664ffa89a04048aa7a6eecf55169a8", + "d89e128b65424ced9d2ea19e42facb67", + "6c135337a5db4da8867d9c9bb1bad8b2", + "63b03fea35f64af49787d6253d1e8aa2", + "5408ba6a5d5e4d3e8371e6d8a156aae6", + "dce0aaa1839b493a8bfa93820f85bf0b", + "aa01e299117447e692e719426dc7f53e", + "1183926027a04b39a81c603be4b7860d", + "edee1e5620214adcb701876812fd55df", + "2ddca395a3ea42c6a422cea781e4262f", + "8fc852abdc384fbfada6505cd96ea825", + "239d49bd1d6c4cc2a95548c5634a3b9a", + "40eaa223a6ef48628829d45f576c5293", + "8a9155146377424cbc114127816ba8ba", + "beda87842b744bd984629e34e8fae0b5", + "1a4e7e57b95a41869ab5642ed0e6571c", + "25b3cab0e79a4762a8cc170309e7489e", + "9f2c5a74769249b997c1558bdf4c94ce", + "71b773f3ead4430cbfac09127b801c6a", + "d6e0253023874b6faa6bf6664e55e160", + "5031681c504544388ece6bbfb3b5ad69", + "34d4e2de5bea4b7f89d44a4e7fcedbb0", + "1fd81f69f417476a95e4594e2c8b605d" + ] + }, + "id": "o3ebde8VWKdi", + "outputId": "7c60f8aa-67e6-4343-c72e-d6e356d60e6c" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "GPU available: True, used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "IPU available: False, using: 0 IPUs\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "\n", + " | Name | Type | Params\n", + "--------------------------------\n", + "0 | fc1 | Linear | 30 \n", + "1 | func | ReLU | 0 \n", + "2 | fc2 | Linear | 11 \n", + "--------------------------------\n", + "41 Trainable params\n", + "0 Non-trainable params\n", + "41 Total params\n", + "0.000 Total estimated model params size (MB)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Sanity Checking: 0it [00:00, ?it/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "1657a223e5524ca682ea081b9e4addea" + } + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 0: val loss = 0.7213451266288757 val acc = 0.3333333432674408\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Training: 0it [00:00, ?it/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "a4fb1b2e0f8b4346bbde1b949dbce0fd" + } + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "3e63509c89304bccb2c7371ec5e7ca62" + } + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 1: val loss = 0.7164624333381653 val acc = 0.3333333432674408\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "e6c4eb3c595c43ef9722654dcfabfcc6" + } + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 2: val loss = 0.7117107510566711 val acc = 0.3333333432674408\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "69eedcfbe5c14a4cbe119364ce973690" + } + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 3: val loss = 0.7070826292037964 val acc = 0.3333333432674408\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "7287a9afffb5470c920734840c5d72fe" + } + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 4: val loss = 0.7025845050811768 val acc = 0.3333333432674408\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "08a690202bbe48bf9434a3354cb560c1" + } + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 5: val loss = 0.6982313990592957 val acc = 0.2666666805744171\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "e2900fe753754ede94abc1847dda4d5c" + } + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 6: val loss = 0.6939730644226074 val acc = 0.2666666805744171\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "0d2b1608b987468791e1a7ffedfd0079" + } + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 7: val loss = 0.6897947192192078 val acc = 0.2666666805744171\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "b650b7b4420541298ea255d741f8a518" + } + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 8: val loss = 0.6857149004936218 val acc = 0.2666666805744171\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "8eb84c34c1a54dad903371885051bef2" + } + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 9: val loss = 0.6817294359207153 val acc = 0.46666669845581055\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "044439bda84b4d24935a46be5c14ca02" + } + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 10: val loss = 0.6778346300125122 val acc = 0.46666669845581055\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "675520bc1a7e4aca9e17f7410d6380cf" + } + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 11: val loss = 0.6740307807922363 val acc = 0.46666669845581055\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "3cd65d1d3cd0438ea94b8c4d964bc65c" + } + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 12: val loss = 0.6703100204467773 val acc = 0.5333333611488342\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "3a9c42437ab34710a3fd3a75cf9cfac4" + } + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 13: val loss = 0.6666661500930786 val acc = 0.5333333611488342\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "71643356b8954af5ab6cdf03df2825e3" + } + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 14: val loss = 0.663104772567749 val acc = 0.6000000238418579\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "a76a4846aa11422785c1d0218c94b827" + } + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 15: val loss = 0.6596227884292603 val acc = 0.6000000238418579\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "67e1192ed6774aa9bb17f1d5a27695f9" + } + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 16: val loss = 0.6562108993530273 val acc = 0.6000000238418579\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "6adb0fc2977b41e7bce4e81909c6c931" + } + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 17: val loss = 0.652866542339325 val acc = 0.6666666865348816\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "f2fb2d0dfed54272abbc0560a467c97e" + } + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 18: val loss = 0.649587094783783 val acc = 0.6666666865348816\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "02bda666a850468086acea36156397c7" + } + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 19: val loss = 0.6463660597801208 val acc = 0.7333333492279053\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "0de2ddf45f754c5991a62ae8e822c4b7" + } + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 20: val loss = 0.6432054042816162 val acc = 0.7333333492279053\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "814e2827e8d647069f05c5b4c89deb52" + } + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 21: val loss = 0.6401029229164124 val acc = 0.7333333492279053\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "b38c3345647c4db68a2321e3a4d9e215" + } + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 22: val loss = 0.6370567679405212 val acc = 0.7333333492279053\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "6daac3cee4b9409cba48efa0d06bee24" + } + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 23: val loss = 0.6340654492378235 val acc = 0.7333333492279053\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "d4b061b8a44646a8b4ccc4839fe769a8" + } + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 24: val loss = 0.6311267018318176 val acc = 0.7333333492279053\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "ac7a77f2fd1b4cdaab3ae8ff2bb8b963" + } + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 25: val loss = 0.6282366514205933 val acc = 0.7333333492279053\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "8a006c7b0f0d431c8c024aad2ea8e427" + } + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 26: val loss = 0.6253498792648315 val acc = 0.7333333492279053\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "a866149ec74144b385f55fdf7eb105a8" + } + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 27: val loss = 0.6225143671035767 val acc = 0.7333333492279053\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "db881594d4b9483bab4d09b536a6602a" + } + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 28: val loss = 0.6197248101234436 val acc = 0.7333333492279053\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "d89e128b65424ced9d2ea19e42facb67" + } + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 29: val loss = 0.6169812679290771 val acc = 0.7333333492279053\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "40eaa223a6ef48628829d45f576c5293" + } + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 30: val loss = 0.6142613887786865 val acc = 0.8000000715255737\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "iC7doHoWToPg" + }, + "source": [ + "## ចំណុចសំខាន់\n", + "\n", + "* PyTorch អនុញ្ញាតឲ្យអ្នកដំណើរការលើ tensors នៅកម្រិតទាប ដែលធ្វើឲ្យអ្នកមានភាពបត់បែនខ្ពស់។\n", + "* មានឧបករណ៍ដែលងាយស្រួលសម្រាប់ធ្វើការជាមួយទិន្នន័យ ដូចជា Datasets និង Dataloaders។\n", + "* អ្នកអាចកំណត់ស្ថាបត្យកម្មបណ្តាញប្រសាទដោយប្រើទម្រង់ `Sequential` ឬដោយបង្កើត class មួយដែលបន្តពី `torch.nn.Module`\n", + "* សម្រាប់វិធីសាស្ត្រដែលសាមញ្ញជាងសម្រាប់កំណត់ និងបណ្តុះបណ្តាលបណ្តាញ - សូមស្វែងយល់អំពី PyTorch Lightning\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**ការមិនទទួលខុសត្រូវ**:\nឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែដោយ AI [Co-op Translator](https://github.com/Azure/co-op-translator). ខណៈពេលយើងខិតខំប្រឹងប្រែងដើម្បីភាពត្រឹមត្រូវ សូមយល់ថាការបកប្រែស្វ័យប្រវត្តិអាចមានកំហុស ឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមនៅក្នុងភាសាមាតុភូមិរបស់វា គួរត្រូវបានចាត់ទុកជាប្រភពផ្លូវការដែលមានសុពលភាព។ សម្រាប់ព័ត៌មានសំខាន់ ការបកប្រែដោយមនុស្សវិជ្ជាជីវៈត្រូវបានណែនាំ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកមិនត្រឹមត្រូវណាមួយដែលកើតឡើងពីការប្រើប្រាស់ការបកប្រែនេះ។\n\n" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "celltoolbar": "Slideshow", + "colab": { + "collapsed_sections": [], + "name": "IntroPyTorch.ipynb", + "provenance": [] + }, + "interpreter": { + "hash": "0cb620c6d4b9f7a635928804c26cf22403d89d98d79684e4529119355ee6d5a5" + }, + "kernelspec": { + "display_name": "Python 3.8.12 64-bit (conda)", + "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" + }, + "livereveal": { + "start_slideshow_at": "selected" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "1657a223e5524ca682ea081b9e4addea": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_4f111fbdbc3440f783adc3df3df46494", + "IPY_MODEL_cc048e2c91ce48258934ef577cf229d1", + "IPY_MODEL_d3c01678943341c5b814430145692a69" + ], + "layout": "IPY_MODEL_9b55455cc9b541ef9634be2d790bb831" + } + }, + "4f111fbdbc3440f783adc3df3df46494": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_15d7c09876074047afac1e41cb9ac121", + "placeholder": "​", + "style": "IPY_MODEL_90137ba0ff814f71ad964f45d704ee89", + "value": "Sanity Checking DataLoader 0: 100%" + } + }, + "cc048e2c91ce48258934ef577cf229d1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_0919c9545ef64ed1a65f3f489d51cccc", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_12cad77b8027415b82937ad33f793a63", + "value": 1 + } + }, + "d3c01678943341c5b814430145692a69": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_25ff491870eb4bf6ad4a320e5c99bd31", + "placeholder": "​", + "style": "IPY_MODEL_238a42e032c34b9183e1e6a75f886da0", + "value": " 1/1 [00:00<00:00, 273.19it/s]" + } + }, + "9b55455cc9b541ef9634be2d790bb831": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": "inline-flex", + "flex": null, + "flex_flow": "row wrap", + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "100%" + } + }, + "15d7c09876074047afac1e41cb9ac121": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "90137ba0ff814f71ad964f45d704ee89": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "0919c9545ef64ed1a65f3f489d51cccc": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": "2", + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "12cad77b8027415b82937ad33f793a63": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "25ff491870eb4bf6ad4a320e5c99bd31": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "238a42e032c34b9183e1e6a75f886da0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a4fb1b2e0f8b4346bbde1b949dbce0fd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_18876b0e4f0f4b21ad1802f36637c067", + "IPY_MODEL_92ef8d6e24604b2f895e3876dc9996ee", + "IPY_MODEL_d4bc1057a59c4666a7dc0f9627c45901" + ], + "layout": "IPY_MODEL_3355e659c40e4e42bbad6c8690f5055e" + } + }, + "18876b0e4f0f4b21ad1802f36637c067": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_0ab539031d80478685164ce470246d57", + "placeholder": "​", + "style": "IPY_MODEL_271fdffaef854a67b294c0ccdfb6fe91", + "value": "Epoch 29: 100%" + } + }, + "92ef8d6e24604b2f895e3876dc9996ee": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_0bd01bf4a9954fe2ba2760d10b9d7971", + "max": 6, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_bd5250b6001c4cd282a25d498ee4e673", + "value": 6 + } + }, + "d4bc1057a59c4666a7dc0f9627c45901": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_21538a0928e04ca08562dda0322385a1", + "placeholder": "​", + "style": "IPY_MODEL_5301b071e422430e9bff6cd23c2853b5", + "value": " 6/6 [00:00<00:00, 44.67it/s, loss=0.597, v_num=18]" + } + }, + "3355e659c40e4e42bbad6c8690f5055e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": "inline-flex", + "flex": null, + "flex_flow": "row wrap", + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "100%" + } + }, + "0ab539031d80478685164ce470246d57": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "271fdffaef854a67b294c0ccdfb6fe91": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "0bd01bf4a9954fe2ba2760d10b9d7971": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": "2", + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "bd5250b6001c4cd282a25d498ee4e673": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "21538a0928e04ca08562dda0322385a1": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5301b071e422430e9bff6cd23c2853b5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "3e63509c89304bccb2c7371ec5e7ca62": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_ff10f2e47185425eaa1229be76092ee5", + "IPY_MODEL_03cbfa5d29d548498035ba7bf7e0b659", + "IPY_MODEL_561c5a5b02894df2a66b2991877e1231" + ], + "layout": "IPY_MODEL_569851b1958f49e281770b65bf78b60a" + } + }, + "ff10f2e47185425eaa1229be76092ee5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2b49a1491afb4946975395080b9117e9", + "placeholder": "​", + "style": "IPY_MODEL_79737a473e0b4b59bb4d6f190d92b94c", + "value": "Validation DataLoader 0: 100%" + } + }, + "03cbfa5d29d548498035ba7bf7e0b659": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d8a3af0177fc4707b928629952396ad5", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_34852db50a91487795451f76b57da6b2", + "value": 1 + } + }, + "561c5a5b02894df2a66b2991877e1231": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_046c75ea1598416497c2ef218d1f268a", + "placeholder": "​", + "style": "IPY_MODEL_16e49dd0c2094a87a398416bac89ef69", + "value": " 1/1 [00:00<00:00, 73.83it/s]" + } + }, + "569851b1958f49e281770b65bf78b60a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": "inline-flex", + "flex": null, + "flex_flow": "row wrap", + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "100%" + } + }, + "2b49a1491afb4946975395080b9117e9": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "79737a473e0b4b59bb4d6f190d92b94c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "d8a3af0177fc4707b928629952396ad5": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": "2", + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "34852db50a91487795451f76b57da6b2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "046c75ea1598416497c2ef218d1f268a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "16e49dd0c2094a87a398416bac89ef69": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e6c4eb3c595c43ef9722654dcfabfcc6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_62f1b983740e47cd8664eccafc926e32", + "IPY_MODEL_9861f59fd71a4e3c879858ef8b4b40fb", + "IPY_MODEL_d9960d4519ec42bcb8678359b278c7b5" + ], + "layout": "IPY_MODEL_118e90e145994312897584085642c03b" + } + }, + "62f1b983740e47cd8664eccafc926e32": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_db156fc5cbfd426e8460232b8f760733", + "placeholder": "​", + "style": "IPY_MODEL_e68df50870c5469a9dc86346d7ad9a4e", + "value": "Validation DataLoader 0: 100%" + } + }, + "9861f59fd71a4e3c879858ef8b4b40fb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c89c5ec1ca1549cbbc7dd57b3672d74e", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_84e423587f4244938844cd74d2f86dc0", + "value": 1 + } + }, + "d9960d4519ec42bcb8678359b278c7b5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a31f6ff7fbc54df5bd1745816b2176f8", + "placeholder": "​", + "style": "IPY_MODEL_d6d02c0963c54a6bbbd6753f3c3e6503", + "value": " 1/1 [00:00<00:00, 97.96it/s]" + } + }, + "118e90e145994312897584085642c03b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": "inline-flex", + "flex": null, + "flex_flow": "row wrap", + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "100%" + } + }, + "db156fc5cbfd426e8460232b8f760733": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e68df50870c5469a9dc86346d7ad9a4e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c89c5ec1ca1549cbbc7dd57b3672d74e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": "2", + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "84e423587f4244938844cd74d2f86dc0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "a31f6ff7fbc54df5bd1745816b2176f8": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d6d02c0963c54a6bbbd6753f3c3e6503": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "69eedcfbe5c14a4cbe119364ce973690": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_72eb0dd423f4486b9a63f100670e03a5", + "IPY_MODEL_4b7e9cfd822d48db848319a78548b0db", + "IPY_MODEL_a52a0bc61ed14e0d93f0c4768687fee8" + ], + "layout": "IPY_MODEL_d1c60311d2bc4f4c826da5c7a634202d" + } + }, + "72eb0dd423f4486b9a63f100670e03a5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_08426ffc99c44d6290ef9cb9363a5737", + "placeholder": "​", + "style": "IPY_MODEL_161c5cea83dc42f6b87c904303dad688", + "value": "Validation DataLoader 0: 100%" + } + }, + "4b7e9cfd822d48db848319a78548b0db": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_79c04563af9646dd9a7e82db11894c24", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_235b2edd90bf4d1383b5a0d49905a241", + "value": 1 + } + }, + "a52a0bc61ed14e0d93f0c4768687fee8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_24ead65d14c54fbcb174b06b7dadbcc5", + "placeholder": "​", + "style": "IPY_MODEL_20b85c48964d4c85890f8a0ebc04dd1d", + "value": " 1/1 [00:00<00:00, 108.34it/s]" + } + }, + "d1c60311d2bc4f4c826da5c7a634202d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": "inline-flex", + "flex": null, + "flex_flow": "row wrap", + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "100%" + } + }, + "08426ffc99c44d6290ef9cb9363a5737": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "161c5cea83dc42f6b87c904303dad688": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "79c04563af9646dd9a7e82db11894c24": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": "2", + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "235b2edd90bf4d1383b5a0d49905a241": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "24ead65d14c54fbcb174b06b7dadbcc5": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "20b85c48964d4c85890f8a0ebc04dd1d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "7287a9afffb5470c920734840c5d72fe": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_ae3232c87db9469fa19cb59f78be2f57", + "IPY_MODEL_e2a292f657c342569a080a3d9e25852b", + "IPY_MODEL_f56858c5843d446286d416e9bbc7e7c8" + ], + "layout": "IPY_MODEL_6ddb0e10ea78488aa8358ec3a7bb0780" + } + }, + "ae3232c87db9469fa19cb59f78be2f57": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_df7172162b6542f08662614b084d7521", + "placeholder": "​", + "style": "IPY_MODEL_ca6221d153a94b4898e5a1b5043b843d", + "value": "Validation DataLoader 0: 100%" + } + }, + "e2a292f657c342569a080a3d9e25852b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_54e9275a7f074eeca9a5995653d16036", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_4454290d993f4350a6dc4e464c61c0a9", + "value": 1 + } + }, + "f56858c5843d446286d416e9bbc7e7c8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6e5f99b5aec44fff9d4cecb28dd59188", + "placeholder": "​", + "style": "IPY_MODEL_39ae0b5e8b8a41b79ea1a209f2aacc87", + "value": " 1/1 [00:00<00:00, 126.25it/s]" + } + }, + "6ddb0e10ea78488aa8358ec3a7bb0780": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": "inline-flex", + "flex": null, + "flex_flow": "row wrap", + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "100%" + } + }, + "df7172162b6542f08662614b084d7521": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ca6221d153a94b4898e5a1b5043b843d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "54e9275a7f074eeca9a5995653d16036": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": "2", + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4454290d993f4350a6dc4e464c61c0a9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "6e5f99b5aec44fff9d4cecb28dd59188": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "39ae0b5e8b8a41b79ea1a209f2aacc87": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "08a690202bbe48bf9434a3354cb560c1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_7311cc83255f46ffa31f461c485111b5", + "IPY_MODEL_6f484c87ff3e4582aad771a703151f2b", + "IPY_MODEL_ab9c536f94b84922877071f760111f55" + ], + "layout": "IPY_MODEL_427f04eec07f4d94a010664b12139f0f" + } + }, + "7311cc83255f46ffa31f461c485111b5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_cd7f66fdfe224994a31a3c985cb7a1de", + "placeholder": "​", + "style": "IPY_MODEL_b74e5502e4e54847b1191b7b0304f66a", + "value": "Validation DataLoader 0: 100%" + } + }, + "6f484c87ff3e4582aad771a703151f2b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_dbfcbe2df4f74df594606dd0bb6873b4", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_ac62ad773e7a4694b57dd8c71b81f23d", + "value": 1 + } + }, + "ab9c536f94b84922877071f760111f55": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f20824d8dfc84640bee1cdc9b7277caa", + "placeholder": "​", + "style": "IPY_MODEL_fd9a33d8f6ad459594d9939fd635730c", + "value": " 1/1 [00:00<00:00, 105.91it/s]" + } + }, + "427f04eec07f4d94a010664b12139f0f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": "inline-flex", + "flex": null, + "flex_flow": "row wrap", + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "100%" + } + }, + "cd7f66fdfe224994a31a3c985cb7a1de": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b74e5502e4e54847b1191b7b0304f66a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "dbfcbe2df4f74df594606dd0bb6873b4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": "2", + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ac62ad773e7a4694b57dd8c71b81f23d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "f20824d8dfc84640bee1cdc9b7277caa": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "fd9a33d8f6ad459594d9939fd635730c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e2900fe753754ede94abc1847dda4d5c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_0c1832e2d1ab4ca4a882d76f1d896c02", + "IPY_MODEL_10a5f4a004bc4a81a485604f67bab642", + "IPY_MODEL_fe260f7a9c66497cad723b44c1addbe7" + ], + "layout": "IPY_MODEL_ef7d39cc71074a7faa299da2621abe03" + } + }, + "0c1832e2d1ab4ca4a882d76f1d896c02": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_3f58e2aea843451b83e3aba8c1eefc74", + "placeholder": "​", + "style": "IPY_MODEL_fd38fbd015e6471392cfee4464e6370e", + "value": "Validation DataLoader 0: 100%" + } + }, + "10a5f4a004bc4a81a485604f67bab642": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a95c45bcb67f4a569fb9f88af8108fde", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_bf3bf33f0c474b54a4b472a4a7626da7", + "value": 1 + } + }, + "fe260f7a9c66497cad723b44c1addbe7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_afcc785f069b433ba8747b01e5840763", + "placeholder": "​", + "style": "IPY_MODEL_ec27c6b290be4adc8d2df034fd3bb143", + "value": " 1/1 [00:00<00:00, 110.76it/s]" + } + }, + "ef7d39cc71074a7faa299da2621abe03": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": "inline-flex", + "flex": null, + "flex_flow": "row wrap", + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "100%" + } + }, + "3f58e2aea843451b83e3aba8c1eefc74": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "fd38fbd015e6471392cfee4464e6370e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a95c45bcb67f4a569fb9f88af8108fde": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": "2", + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "bf3bf33f0c474b54a4b472a4a7626da7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "afcc785f069b433ba8747b01e5840763": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ec27c6b290be4adc8d2df034fd3bb143": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "0d2b1608b987468791e1a7ffedfd0079": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_016a5fc3757c480b9c905867c4892864", + "IPY_MODEL_c7c7cc7d1c0647abb11ade78ef451007", + "IPY_MODEL_d0e4462fee034a67b3682e27d5cb6e27" + ], + "layout": "IPY_MODEL_ac3a80de351440e7a279f3efce37e430" + } + }, + "016a5fc3757c480b9c905867c4892864": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d6204036abba495785a3674ea841746c", + "placeholder": "​", + "style": "IPY_MODEL_3df8a54d12604c1ebe7229f88d5811bf", + "value": "Validation DataLoader 0: 100%" + } + }, + "c7c7cc7d1c0647abb11ade78ef451007": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5236935ed5874a0986f953ee21477be9", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_1355273e058041efa299727d17949855", + "value": 1 + } + }, + "d0e4462fee034a67b3682e27d5cb6e27": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_68acf21436374d5eb393ada1b2298e28", + "placeholder": "​", + "style": "IPY_MODEL_57d592b9768545869080fc2505e5a770", + "value": " 1/1 [00:00<00:00, 97.42it/s]" + } + }, + "ac3a80de351440e7a279f3efce37e430": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": "inline-flex", + "flex": null, + "flex_flow": "row wrap", + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "100%" + } + }, + "d6204036abba495785a3674ea841746c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3df8a54d12604c1ebe7229f88d5811bf": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "5236935ed5874a0986f953ee21477be9": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": "2", + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1355273e058041efa299727d17949855": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "68acf21436374d5eb393ada1b2298e28": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "57d592b9768545869080fc2505e5a770": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "b650b7b4420541298ea255d741f8a518": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_3d0949a3f0504bf0802082ec86ce8e17", + "IPY_MODEL_3f71570951c94959ba0eea6692b2d671", + "IPY_MODEL_15f97cc51d594cca91dc43cbf019ffbc" + ], + "layout": "IPY_MODEL_23e7ec609ed649e29f2c274bd76ee3dd" + } + }, + "3d0949a3f0504bf0802082ec86ce8e17": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_47af905082094cd5b8a4cb4ab02ec431", + "placeholder": "​", + "style": "IPY_MODEL_87aa955f31054e7da3fc1c93a8e1f335", + "value": "Validation DataLoader 0: 100%" + } + }, + "3f71570951c94959ba0eea6692b2d671": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2f79b8377db841b5b14650ed14d7c5cb", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_0560fb1045034e4b865a199dc0fba636", + "value": 1 + } + }, + "15f97cc51d594cca91dc43cbf019ffbc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e35861641d664e2ea8140ff988b65576", + "placeholder": "​", + "style": "IPY_MODEL_4d683f5e6ccb4328bfd33829e05e2e35", + "value": " 1/1 [00:00<00:00, 101.72it/s]" + } + }, + "23e7ec609ed649e29f2c274bd76ee3dd": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": "inline-flex", + "flex": null, + "flex_flow": "row wrap", + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "100%" + } + }, + "47af905082094cd5b8a4cb4ab02ec431": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "87aa955f31054e7da3fc1c93a8e1f335": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "2f79b8377db841b5b14650ed14d7c5cb": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": "2", + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0560fb1045034e4b865a199dc0fba636": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "e35861641d664e2ea8140ff988b65576": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4d683f5e6ccb4328bfd33829e05e2e35": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "8eb84c34c1a54dad903371885051bef2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_424d7efa1e1d4c79a5a9e1e0eea97bc3", + "IPY_MODEL_0d6619a581884191a205c9e1b91b3790", + "IPY_MODEL_035553232bbc40c789c35bdcd78d7b88" + ], + "layout": "IPY_MODEL_6648bcb6b46e4dc893654f139a7b73df" + } + }, + "424d7efa1e1d4c79a5a9e1e0eea97bc3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d4302a261e334336b71459e74fee95a4", + "placeholder": "​", + "style": "IPY_MODEL_5ae44fb9f67b40bb8261defbc07bf689", + "value": "Validation DataLoader 0: 100%" + } + }, + "0d6619a581884191a205c9e1b91b3790": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5097652e46cf4d1d88933903e37387dd", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_82e9918bb5b648058fe32b19b0ab7059", + "value": 1 + } + }, + "035553232bbc40c789c35bdcd78d7b88": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_28913620d1dc406db67ff7876db5d414", + "placeholder": "​", + "style": "IPY_MODEL_2e5b502d9c0e47449a6e7b5095d5b6ec", + "value": " 1/1 [00:00<00:00, 91.51it/s]" + } + }, + "6648bcb6b46e4dc893654f139a7b73df": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": "inline-flex", + "flex": null, + "flex_flow": "row wrap", + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "100%" + } + }, + "d4302a261e334336b71459e74fee95a4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5ae44fb9f67b40bb8261defbc07bf689": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "5097652e46cf4d1d88933903e37387dd": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": "2", + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "82e9918bb5b648058fe32b19b0ab7059": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "28913620d1dc406db67ff7876db5d414": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2e5b502d9c0e47449a6e7b5095d5b6ec": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "044439bda84b4d24935a46be5c14ca02": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_3aa9793c2771435b892c70a5ca86a372", + "IPY_MODEL_490c7d65abaf46a1a6f781395f846b83", + "IPY_MODEL_b3ad1dfdecf649988c4060e76f0c9164" + ], + "layout": "IPY_MODEL_6f0bd0ab209348d2a76ae70cfbfa47ff" + } + }, + "3aa9793c2771435b892c70a5ca86a372": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_95dc3afa44174e9f8e715dab0a3dfd7d", + "placeholder": "​", + "style": "IPY_MODEL_d2f7362dee2b4100930a7a1f288e649e", + "value": "Validation DataLoader 0: 100%" + } + }, + "490c7d65abaf46a1a6f781395f846b83": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c92364fa157f4212a9a9811925605382", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_aec5035eeab04627b3d61c05bf53ef4f", + "value": 1 + } + }, + "b3ad1dfdecf649988c4060e76f0c9164": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_035f91d8fd1d4ff6932f9d01aa334f3a", + "placeholder": "​", + "style": "IPY_MODEL_8a56ba2f8d384c0fb285ac9cf7b5e421", + "value": " 1/1 [00:00<00:00, 98.04it/s]" + } + }, + "6f0bd0ab209348d2a76ae70cfbfa47ff": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": "inline-flex", + "flex": null, + "flex_flow": "row wrap", + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "100%" + } + }, + "95dc3afa44174e9f8e715dab0a3dfd7d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d2f7362dee2b4100930a7a1f288e649e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c92364fa157f4212a9a9811925605382": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": "2", + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "aec5035eeab04627b3d61c05bf53ef4f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "035f91d8fd1d4ff6932f9d01aa334f3a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8a56ba2f8d384c0fb285ac9cf7b5e421": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "675520bc1a7e4aca9e17f7410d6380cf": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_9b19f80d8f5648b9b575515d2f8085f8", + "IPY_MODEL_c0065e721652472996f40eb47071589c", + "IPY_MODEL_b236adc069d049c288d81702cc0dd62c" + ], + "layout": "IPY_MODEL_5eefa033732941b39bf3bfa62fd9185e" + } + }, + "9b19f80d8f5648b9b575515d2f8085f8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5aefc7d586ae4be4aa33c1383f494b9f", + "placeholder": "​", + "style": "IPY_MODEL_5e0c000321a64c28a81a1e167d88bd22", + "value": "Validation DataLoader 0: 100%" + } + }, + "c0065e721652472996f40eb47071589c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_438661c89c034656b86e936360474b24", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_ed1fca3c73ad446db422e30f5ec44b0e", + "value": 1 + } + }, + "b236adc069d049c288d81702cc0dd62c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4421eb7516c04af1972c6f5df5315bc4", + "placeholder": "​", + "style": "IPY_MODEL_6d52bfaf6be54d90a53e1fb465dfaf7d", + "value": " 1/1 [00:00<00:00, 85.71it/s]" + } + }, + "5eefa033732941b39bf3bfa62fd9185e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": "inline-flex", + "flex": null, + "flex_flow": "row wrap", + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "100%" + } + }, + "5aefc7d586ae4be4aa33c1383f494b9f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5e0c000321a64c28a81a1e167d88bd22": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "438661c89c034656b86e936360474b24": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": "2", + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ed1fca3c73ad446db422e30f5ec44b0e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "4421eb7516c04af1972c6f5df5315bc4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6d52bfaf6be54d90a53e1fb465dfaf7d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "3cd65d1d3cd0438ea94b8c4d964bc65c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_a4653a04856c47a0b1907d864e3f1a15", + "IPY_MODEL_02e9029cbe8a4db0b6ef00c4df0ae302", + "IPY_MODEL_258629893fa14d178577ee19efdff31e" + ], + "layout": "IPY_MODEL_fe82872822b749ae87fac7eb4df0791e" + } + }, + "a4653a04856c47a0b1907d864e3f1a15": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_07655ba9152647df80ad1efe4b117135", + "placeholder": "​", + "style": "IPY_MODEL_b6e87d03766a4185ad2c4d716aa456d7", + "value": "Validation DataLoader 0: 100%" + } + }, + "02e9029cbe8a4db0b6ef00c4df0ae302": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c6f304a0747d40fea9571f99f5289986", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_5722085f090c4851a1cde4daf7db77df", + "value": 1 + } + }, + "258629893fa14d178577ee19efdff31e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7aed32af8b134b56a041ebb25c32640c", + "placeholder": "​", + "style": "IPY_MODEL_a723ce7408e14b63b6d4311051dca322", + "value": " 1/1 [00:00<00:00, 127.66it/s]" + } + }, + "fe82872822b749ae87fac7eb4df0791e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": "inline-flex", + "flex": null, + "flex_flow": "row wrap", + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "100%" + } + }, + "07655ba9152647df80ad1efe4b117135": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b6e87d03766a4185ad2c4d716aa456d7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c6f304a0747d40fea9571f99f5289986": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": "2", + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5722085f090c4851a1cde4daf7db77df": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "7aed32af8b134b56a041ebb25c32640c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a723ce7408e14b63b6d4311051dca322": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "3a9c42437ab34710a3fd3a75cf9cfac4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_80a0d8b6e16b4ceb98bb8911b0fa596c", + "IPY_MODEL_9310b29cec49404b8dfc9feb8e5bac9f", + "IPY_MODEL_44341f0cb29440a2bef7f711517a01ff" + ], + "layout": "IPY_MODEL_9739202e0849427d9fe61210e231837c" + } + }, + "80a0d8b6e16b4ceb98bb8911b0fa596c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c43c9d3bbacf478b9fafc076ea58ad29", + "placeholder": "​", + "style": "IPY_MODEL_abfa8dc54e654a61b93ec9a15f5fe67e", + "value": "Validation DataLoader 0: 100%" + } + }, + "9310b29cec49404b8dfc9feb8e5bac9f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_979514f924c6441098f7b7231ae15900", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_bbef9cf5cf2d42adb650caba73919e06", + "value": 1 + } + }, + "44341f0cb29440a2bef7f711517a01ff": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_3b8da849443f401bb51a038f5bb82ad9", + "placeholder": "​", + "style": "IPY_MODEL_36f417b9e7e247b68e3bb18519af98b4", + "value": " 1/1 [00:00<00:00, 142.27it/s]" + } + }, + "9739202e0849427d9fe61210e231837c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": "inline-flex", + "flex": null, + "flex_flow": "row wrap", + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "100%" + } + }, + "c43c9d3bbacf478b9fafc076ea58ad29": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "abfa8dc54e654a61b93ec9a15f5fe67e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "979514f924c6441098f7b7231ae15900": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": "2", + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "bbef9cf5cf2d42adb650caba73919e06": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "3b8da849443f401bb51a038f5bb82ad9": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "36f417b9e7e247b68e3bb18519af98b4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "71643356b8954af5ab6cdf03df2825e3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_8d50b1a8e0ce4d018fe4a51240ddb35d", + "IPY_MODEL_654d72723ed8474ca360102e896331d5", + "IPY_MODEL_049d95dcfbb34e84a0060919fdb8f454" + ], + "layout": "IPY_MODEL_54955fa5560041c09f847a3afb39eecd" + } + }, + "8d50b1a8e0ce4d018fe4a51240ddb35d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_34b2c78ef1254853a377efc6fead2e95", + "placeholder": "​", + "style": "IPY_MODEL_4eda8d394bff4fbf98bc086737c75219", + "value": "Validation DataLoader 0: 100%" + } + }, + "654d72723ed8474ca360102e896331d5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4ca134b9e1df4136bd0d2660a82960cf", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_87cf68c4e8a245c686fbbe439f176b87", + "value": 1 + } + }, + "049d95dcfbb34e84a0060919fdb8f454": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6009ded338de4e5b9a204e6f1243bf05", + "placeholder": "​", + "style": "IPY_MODEL_f01a1f50e0a74faaacc35695590cea30", + "value": " 1/1 [00:00<00:00, 275.09it/s]" + } + }, + "54955fa5560041c09f847a3afb39eecd": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": "inline-flex", + "flex": null, + "flex_flow": "row wrap", + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "100%" + } + }, + "34b2c78ef1254853a377efc6fead2e95": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4eda8d394bff4fbf98bc086737c75219": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "4ca134b9e1df4136bd0d2660a82960cf": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": "2", + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "87cf68c4e8a245c686fbbe439f176b87": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "6009ded338de4e5b9a204e6f1243bf05": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f01a1f50e0a74faaacc35695590cea30": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a76a4846aa11422785c1d0218c94b827": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_373e3dd821954f33becb388c82ffebc2", + "IPY_MODEL_9f532b8a64b3410f9a2e2a99755dac55", + "IPY_MODEL_b457e104ad194032ba15070b89d42e6e" + ], + "layout": "IPY_MODEL_81fc3a7b94554a1980724ac6092fc88a" + } + }, + "373e3dd821954f33becb388c82ffebc2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_68908006e8eb4b31a55d1c0be51453bd", + "placeholder": "​", + "style": "IPY_MODEL_8f5c49525abe4d7a9ea746db18135f26", + "value": "Validation DataLoader 0: 100%" + } + }, + "9f532b8a64b3410f9a2e2a99755dac55": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_70eb5ab30ffb4b5bbe58832c6386a536", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_970d8a7e2b5c47a5bff8a036cadc9b84", + "value": 1 + } + }, + "b457e104ad194032ba15070b89d42e6e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_3ad7904ba48048bfa4b7a866cf4aa4a6", + "placeholder": "​", + "style": "IPY_MODEL_a20c551e949842f881c6def753eb81ed", + "value": " 1/1 [00:00<00:00, 159.05it/s]" + } + }, + "81fc3a7b94554a1980724ac6092fc88a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": "inline-flex", + "flex": null, + "flex_flow": "row wrap", + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "100%" + } + }, + "68908006e8eb4b31a55d1c0be51453bd": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8f5c49525abe4d7a9ea746db18135f26": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "70eb5ab30ffb4b5bbe58832c6386a536": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": "2", + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "970d8a7e2b5c47a5bff8a036cadc9b84": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "3ad7904ba48048bfa4b7a866cf4aa4a6": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a20c551e949842f881c6def753eb81ed": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "67e1192ed6774aa9bb17f1d5a27695f9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_5aea05cbd78843bcb2a9d3df9e3abefd", + "IPY_MODEL_4693d306ecaf44f2b6b505ca072e22bb", + "IPY_MODEL_2e46fda9b283487ba4f118bad5a880c6" + ], + "layout": "IPY_MODEL_55a8b90a0a6c44eda0bedd43fda69c41" + } + }, + "5aea05cbd78843bcb2a9d3df9e3abefd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a7e64bcbd09644a198b9f1c7d8a8d1c6", + "placeholder": "​", + "style": "IPY_MODEL_87a7b1169e1f404d81fddc56c0ba2145", + "value": "Validation DataLoader 0: 100%" + } + }, + "4693d306ecaf44f2b6b505ca072e22bb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_921d621e89a64e1aab62397758e26592", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_da9024d63c56460b9ca061d5cd1bb985", + "value": 1 + } + }, + "2e46fda9b283487ba4f118bad5a880c6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_503e7b032b3d44d49e15587060b25e56", + "placeholder": "​", + "style": "IPY_MODEL_1361830025974670a174df70957feabc", + "value": " 1/1 [00:00<00:00, 109.92it/s]" + } + }, + "55a8b90a0a6c44eda0bedd43fda69c41": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": "inline-flex", + "flex": null, + "flex_flow": "row wrap", + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "100%" + } + }, + "a7e64bcbd09644a198b9f1c7d8a8d1c6": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "87a7b1169e1f404d81fddc56c0ba2145": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "921d621e89a64e1aab62397758e26592": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": "2", + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "da9024d63c56460b9ca061d5cd1bb985": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "503e7b032b3d44d49e15587060b25e56": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1361830025974670a174df70957feabc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "6adb0fc2977b41e7bce4e81909c6c931": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_ab9b58483e0145aab2f22a8bbf0422cf", + "IPY_MODEL_6725fd421a9344feb552ee1a1ce84dda", + "IPY_MODEL_0d712617055b45a3b6f5783dfe6a5842" + ], + "layout": "IPY_MODEL_1c5fdfd620eb47c28dcb91ff04ea6155" + } + }, + "ab9b58483e0145aab2f22a8bbf0422cf": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_db2185de343a4f76a2b2ecfad4e658ad", + "placeholder": "​", + "style": "IPY_MODEL_bb1efececaef471c90c3bc9cc2fb5ac7", + "value": "Validation DataLoader 0: 100%" + } + }, + "6725fd421a9344feb552ee1a1ce84dda": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7a49920285474268b1cb3f57e73a450e", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_b0e5dea19289434ebe98002e3cfe6086", + "value": 1 + } + }, + "0d712617055b45a3b6f5783dfe6a5842": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_92a8cbc6f6344e49a455c9e3df2c552f", + "placeholder": "​", + "style": "IPY_MODEL_b41986dd9910458e95ddfff0b1a508d1", + "value": " 1/1 [00:00<00:00, 197.98it/s]" + } + }, + "1c5fdfd620eb47c28dcb91ff04ea6155": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": "inline-flex", + "flex": null, + "flex_flow": "row wrap", + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "100%" + } + }, + "db2185de343a4f76a2b2ecfad4e658ad": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "bb1efececaef471c90c3bc9cc2fb5ac7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "7a49920285474268b1cb3f57e73a450e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": "2", + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b0e5dea19289434ebe98002e3cfe6086": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "92a8cbc6f6344e49a455c9e3df2c552f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b41986dd9910458e95ddfff0b1a508d1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "f2fb2d0dfed54272abbc0560a467c97e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_08c1e9701d0b4f2e8b34027af81ab586", + "IPY_MODEL_1ea2399f27404d5cbfffd68efbd472fc", + "IPY_MODEL_affc022e069a41af877cf9fbe3889012" + ], + "layout": "IPY_MODEL_65490339b12e47d6b35cbf4a16d1bfeb" + } + }, + "08c1e9701d0b4f2e8b34027af81ab586": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_10247683189c43b6abf3df0b7818bcd9", + "placeholder": "​", + "style": "IPY_MODEL_10b0f64c86714778919d55c643550ff5", + "value": "Validation DataLoader 0: 100%" + } + }, + "1ea2399f27404d5cbfffd68efbd472fc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a702202230484af5b32a4653f0eac288", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_5e38b9f21ce04bcc820f711c9c47678d", + "value": 1 + } + }, + "affc022e069a41af877cf9fbe3889012": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2771553d801f4961ad94344e2d5caacd", + "placeholder": "​", + "style": "IPY_MODEL_134808b58f1f42b09c4b2353a94bbb0e", + "value": " 1/1 [00:00<00:00, 87.08it/s]" + } + }, + "65490339b12e47d6b35cbf4a16d1bfeb": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": "inline-flex", + "flex": null, + "flex_flow": "row wrap", + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "100%" + } + }, + "10247683189c43b6abf3df0b7818bcd9": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "10b0f64c86714778919d55c643550ff5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a702202230484af5b32a4653f0eac288": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": "2", + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5e38b9f21ce04bcc820f711c9c47678d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "2771553d801f4961ad94344e2d5caacd": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "134808b58f1f42b09c4b2353a94bbb0e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "02bda666a850468086acea36156397c7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_9abed88d016f4822bf19e71dcf997571", + "IPY_MODEL_6ea72db4ae8b45ec96508a51c21b6974", + "IPY_MODEL_7baafb061feb455e9b37622dc9a4c724" + ], + "layout": "IPY_MODEL_ba06f72e44694ecd9fa51e984b4dc8bf" + } + }, + "9abed88d016f4822bf19e71dcf997571": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_136c4f60a8734c578129fd843ee7ab5f", + "placeholder": "​", + "style": "IPY_MODEL_28f475b19b08458c81ee0cfb11c9d9c3", + "value": "Validation DataLoader 0: 100%" + } + }, + "6ea72db4ae8b45ec96508a51c21b6974": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_604fd938ec7d41f285e1f1b9cb9c6eac", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_07bb79027e20401e84d02a33a628b397", + "value": 1 + } + }, + "7baafb061feb455e9b37622dc9a4c724": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_288ab1d98c7a4e21af429773a9fe3534", + "placeholder": "​", + "style": "IPY_MODEL_19a6a91b0d4e46d9be72aee530a974ce", + "value": " 1/1 [00:00<00:00, 94.33it/s]" + } + }, + "ba06f72e44694ecd9fa51e984b4dc8bf": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": "inline-flex", + "flex": null, + "flex_flow": "row wrap", + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "100%" + } + }, + "136c4f60a8734c578129fd843ee7ab5f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "28f475b19b08458c81ee0cfb11c9d9c3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "604fd938ec7d41f285e1f1b9cb9c6eac": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": "2", + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "07bb79027e20401e84d02a33a628b397": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "288ab1d98c7a4e21af429773a9fe3534": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "19a6a91b0d4e46d9be72aee530a974ce": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "0de2ddf45f754c5991a62ae8e822c4b7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_a6fb10bec45f4f1a9243b466eb95c017", + "IPY_MODEL_44ce5ef7a8af4fb291da012fa53e0c5a", + "IPY_MODEL_9c40cc6348cb4bcfb59e0457399cd72b" + ], + "layout": "IPY_MODEL_3f9455a7a52947638545cff45b1e807d" + } + }, + "a6fb10bec45f4f1a9243b466eb95c017": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_22550ebc70ef4671a65bb1a041c9def7", + "placeholder": "​", + "style": "IPY_MODEL_67f022dd80234c08849906615a1191dc", + "value": "Validation DataLoader 0: 100%" + } + }, + "44ce5ef7a8af4fb291da012fa53e0c5a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2e5e169b1ad64407ad8c3494a70b314f", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_277e7a95b41447b4a52824c212e6fa7c", + "value": 1 + } + }, + "9c40cc6348cb4bcfb59e0457399cd72b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d07c7bcf6a934fae9e015be66a1f860d", + "placeholder": "​", + "style": "IPY_MODEL_c5e484430b0843689d7cfb434d0aa8da", + "value": " 1/1 [00:00<00:00, 102.23it/s]" + } + }, + "3f9455a7a52947638545cff45b1e807d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": "inline-flex", + "flex": null, + "flex_flow": "row wrap", + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "100%" + } + }, + "22550ebc70ef4671a65bb1a041c9def7": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "67f022dd80234c08849906615a1191dc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "2e5e169b1ad64407ad8c3494a70b314f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": "2", + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "277e7a95b41447b4a52824c212e6fa7c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "d07c7bcf6a934fae9e015be66a1f860d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c5e484430b0843689d7cfb434d0aa8da": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "814e2827e8d647069f05c5b4c89deb52": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_0c8b616aecfd4e5e80a0b7c3aabd290f", + "IPY_MODEL_e0f4261c913d42c9a7dcdf79a9914d4a", + "IPY_MODEL_80a819740bb44d589858d4780b100255" + ], + "layout": "IPY_MODEL_5caf7d1fdd564dc2bebe48dd918d9c8f" + } + }, + "0c8b616aecfd4e5e80a0b7c3aabd290f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_10ab820d989c44b98a8bde85780c3deb", + "placeholder": "​", + "style": "IPY_MODEL_7e787283e4434da6b5d3f9245745547c", + "value": "Validation DataLoader 0: 100%" + } + }, + "e0f4261c913d42c9a7dcdf79a9914d4a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b8c86419aa4f43a3a0c9443f23298c0a", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_0270acbb7ed94626adc932afa0655eaa", + "value": 1 + } + }, + "80a819740bb44d589858d4780b100255": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ab0b7e4f05b24205b5e4b9e975cb8e71", + "placeholder": "​", + "style": "IPY_MODEL_70c85ee15c0c4427b6538acbbd0de481", + "value": " 1/1 [00:00<00:00, 116.82it/s]" + } + }, + "5caf7d1fdd564dc2bebe48dd918d9c8f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": "inline-flex", + "flex": null, + "flex_flow": "row wrap", + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "100%" + } + }, + "10ab820d989c44b98a8bde85780c3deb": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7e787283e4434da6b5d3f9245745547c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "b8c86419aa4f43a3a0c9443f23298c0a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": "2", + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0270acbb7ed94626adc932afa0655eaa": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "ab0b7e4f05b24205b5e4b9e975cb8e71": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "70c85ee15c0c4427b6538acbbd0de481": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "b38c3345647c4db68a2321e3a4d9e215": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_8c7b852936ca400aa04ec3f95e9afcb3", + "IPY_MODEL_3099fea4c655407582c196176cc2108c", + "IPY_MODEL_a5cb3ea273f9454fbb9dcd8877f2aa33" + ], + "layout": "IPY_MODEL_b4a722f06b614e9cbb259c8fa1e9f664" + } + }, + "8c7b852936ca400aa04ec3f95e9afcb3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_228014c8ccd543a6af4c554cf60137bf", + "placeholder": "​", + "style": "IPY_MODEL_6e7ea147348f40c8acc919af41047189", + "value": "Validation DataLoader 0: 100%" + } + }, + "3099fea4c655407582c196176cc2108c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7c315c5b62e14d2c9af6fecf536d8df5", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_a9e1b08f5ff24e1b8d652cd9ad649b54", + "value": 1 + } + }, + "a5cb3ea273f9454fbb9dcd8877f2aa33": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_df097748d93e4254be82e6dae9696167", + "placeholder": "​", + "style": "IPY_MODEL_ac30029d30c34fd58a7f3d1826d94d6b", + "value": " 1/1 [00:00<00:00, 110.19it/s]" + } + }, + "b4a722f06b614e9cbb259c8fa1e9f664": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": "inline-flex", + "flex": null, + "flex_flow": "row wrap", + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "100%" + } + }, + "228014c8ccd543a6af4c554cf60137bf": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6e7ea147348f40c8acc919af41047189": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "7c315c5b62e14d2c9af6fecf536d8df5": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": "2", + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a9e1b08f5ff24e1b8d652cd9ad649b54": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "df097748d93e4254be82e6dae9696167": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ac30029d30c34fd58a7f3d1826d94d6b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "6daac3cee4b9409cba48efa0d06bee24": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_db45da82b3594a1db11322289253a132", + "IPY_MODEL_d4891374cfde42adac3f2218b879f082", + "IPY_MODEL_2a009696a36748b2937ac6746460483a" + ], + "layout": "IPY_MODEL_979c7269c8394082b277435040052f45" + } + }, + "db45da82b3594a1db11322289253a132": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_42ff3dacbeb34fc79e60d382c93180d6", + "placeholder": "​", + "style": "IPY_MODEL_d5156d7ec0e14a60bc67ac5e3c5b32a6", + "value": "Validation DataLoader 0: 100%" + } + }, + "d4891374cfde42adac3f2218b879f082": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e82400379100428a915968d7ba060fd5", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_f25f7aabffb046a388ba71ad7c3ab7de", + "value": 1 + } + }, + "2a009696a36748b2937ac6746460483a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5088dea18c1146d8841e50e76697b7e5", + "placeholder": "​", + "style": "IPY_MODEL_e36d59055aee4a48b521109b96c9faff", + "value": " 1/1 [00:00<00:00, 188.47it/s]" + } + }, + "979c7269c8394082b277435040052f45": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": "inline-flex", + "flex": null, + "flex_flow": "row wrap", + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "100%" + } + }, + "42ff3dacbeb34fc79e60d382c93180d6": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d5156d7ec0e14a60bc67ac5e3c5b32a6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e82400379100428a915968d7ba060fd5": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": "2", + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f25f7aabffb046a388ba71ad7c3ab7de": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "5088dea18c1146d8841e50e76697b7e5": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e36d59055aee4a48b521109b96c9faff": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "d4b061b8a44646a8b4ccc4839fe769a8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_354425d2d3cc4be4891499c8c252e585", + "IPY_MODEL_84c2e850cd944480bf1cc9bd79ca40f4", + "IPY_MODEL_ecb0caf0ebd2458789aee04fd0468723" + ], + "layout": "IPY_MODEL_0689a7b924674988a587d498cb946549" + } + }, + "354425d2d3cc4be4891499c8c252e585": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ea131342791043d48673da5ccb559c26", + "placeholder": "​", + "style": "IPY_MODEL_6936e031b7f74f45998232f819666b45", + "value": "Validation DataLoader 0: 100%" + } + }, + "84c2e850cd944480bf1cc9bd79ca40f4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ae8efd2c29bb4008a13be5b0483928b4", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_7728374b25ec4b45b3d9171e69173bf5", + "value": 1 + } + }, + "ecb0caf0ebd2458789aee04fd0468723": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a7456e34baef4c89979963a8e61b98e4", + "placeholder": "​", + "style": "IPY_MODEL_1db1f8a2985947639120d9bccdf3208e", + "value": " 1/1 [00:00<00:00, 113.24it/s]" + } + }, + "0689a7b924674988a587d498cb946549": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": "inline-flex", + "flex": null, + "flex_flow": "row wrap", + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "100%" + } + }, + "ea131342791043d48673da5ccb559c26": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6936e031b7f74f45998232f819666b45": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "ae8efd2c29bb4008a13be5b0483928b4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": "2", + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7728374b25ec4b45b3d9171e69173bf5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "a7456e34baef4c89979963a8e61b98e4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1db1f8a2985947639120d9bccdf3208e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "ac7a77f2fd1b4cdaab3ae8ff2bb8b963": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_2486dff82a4b41809b4a8ac2569b7e10", + "IPY_MODEL_bcb064131d464033be2a95b5df8e2c82", + "IPY_MODEL_4614b06d5a974ecf86238f938e58bccb" + ], + "layout": "IPY_MODEL_7d3a28c174ff4c2791039495b544b507" + } + }, + "2486dff82a4b41809b4a8ac2569b7e10": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_58a114346ac44a8c992da25fb7c721f8", + "placeholder": "​", + "style": "IPY_MODEL_58e96bfc8f6a449eafa644edf4b75228", + "value": "Validation DataLoader 0: 100%" + } + }, + "bcb064131d464033be2a95b5df8e2c82": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_3bafea3ba4b347e186da01e279f41084", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_d8fa48e20376478e9e89438aa57de80d", + "value": 1 + } + }, + "4614b06d5a974ecf86238f938e58bccb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5d9aaed3cf2e451595690e72ed4c2495", + "placeholder": "​", + "style": "IPY_MODEL_ab7aabf047e34d5899bc3dcfa972f7fd", + "value": " 1/1 [00:00<00:00, 69.60it/s]" + } + }, + "7d3a28c174ff4c2791039495b544b507": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": "inline-flex", + "flex": null, + "flex_flow": "row wrap", + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "100%" + } + }, + "58a114346ac44a8c992da25fb7c721f8": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "58e96bfc8f6a449eafa644edf4b75228": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "3bafea3ba4b347e186da01e279f41084": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": "2", + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d8fa48e20376478e9e89438aa57de80d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "5d9aaed3cf2e451595690e72ed4c2495": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ab7aabf047e34d5899bc3dcfa972f7fd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "8a006c7b0f0d431c8c024aad2ea8e427": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_cc122dc799da42948360712d0b809ed9", + "IPY_MODEL_d3186548246149feaa9228782d7adaab", + "IPY_MODEL_96660986fcd1451d8565790e961277b5" + ], + "layout": "IPY_MODEL_e6d820247bfc42acbff367b5794b6655" + } + }, + "cc122dc799da42948360712d0b809ed9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b7ff8b76997a4235a3205fac9c531502", + "placeholder": "​", + "style": "IPY_MODEL_00e7a13db6174f3182a898345dd1d38d", + "value": "Validation DataLoader 0: 100%" + } + }, + "d3186548246149feaa9228782d7adaab": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_adcdbc5f4ee045a2bc8c7b3b7f4cac5b", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_f4920d0dce6c4d2b8528f8b098722cfc", + "value": 1 + } + }, + "96660986fcd1451d8565790e961277b5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_51f3bf496ca146b18b93fb58846f591e", + "placeholder": "​", + "style": "IPY_MODEL_78672ae9cde346c09d3a7f7701dfd151", + "value": " 1/1 [00:00<00:00, 101.89it/s]" + } + }, + "e6d820247bfc42acbff367b5794b6655": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": "inline-flex", + "flex": null, + "flex_flow": "row wrap", + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "100%" + } + }, + "b7ff8b76997a4235a3205fac9c531502": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "00e7a13db6174f3182a898345dd1d38d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "adcdbc5f4ee045a2bc8c7b3b7f4cac5b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": "2", + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f4920d0dce6c4d2b8528f8b098722cfc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "51f3bf496ca146b18b93fb58846f591e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "78672ae9cde346c09d3a7f7701dfd151": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a866149ec74144b385f55fdf7eb105a8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_26b866aceb8342b5830ca76815d6fa73", + "IPY_MODEL_861f32fe95c04198b9dd81c8fa1fbacb", + "IPY_MODEL_963f20a5be194830b08bb215b9ee97a1" + ], + "layout": "IPY_MODEL_ddeba74ba1ba4dd1a1c4f47c358eeae5" + } + }, + "26b866aceb8342b5830ca76815d6fa73": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7d8c57299000460680a250aa23c7b2cd", + "placeholder": "​", + "style": "IPY_MODEL_4aced1e370fc4b2c88d4283bcbe97ebf", + "value": "Validation DataLoader 0: 100%" + } + }, + "861f32fe95c04198b9dd81c8fa1fbacb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_44a36016b20647efa05d9aee60aaedb8", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_9efd3613e80e4aa78248e979a44bd88b", + "value": 1 + } + }, + "963f20a5be194830b08bb215b9ee97a1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_288cff3f48ab4cf2b27cfc5c37c716f7", + "placeholder": "​", + "style": "IPY_MODEL_179d01e55e5142acaddfff4b1975860e", + "value": " 1/1 [00:00<00:00, 111.90it/s]" + } + }, + "ddeba74ba1ba4dd1a1c4f47c358eeae5": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": "inline-flex", + "flex": null, + "flex_flow": "row wrap", + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "100%" + } + }, + "7d8c57299000460680a250aa23c7b2cd": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4aced1e370fc4b2c88d4283bcbe97ebf": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "44a36016b20647efa05d9aee60aaedb8": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": "2", + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9efd3613e80e4aa78248e979a44bd88b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "288cff3f48ab4cf2b27cfc5c37c716f7": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "179d01e55e5142acaddfff4b1975860e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "db881594d4b9483bab4d09b536a6602a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_1b4e9bc9196d4c7e98005bc5de040202", + "IPY_MODEL_8754e0214d6c495ca4f7e75d11738f73", + "IPY_MODEL_3fbb5b3e332d4444ab7623422347d7ce" + ], + "layout": "IPY_MODEL_85520aaa9c464b7f927c043a323e45f3" + } + }, + "1b4e9bc9196d4c7e98005bc5de040202": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_bd18214cd9624c0c97d6e5d73bd84b9e", + "placeholder": "​", + "style": "IPY_MODEL_67a7e78833b141778d290e31b5006277", + "value": "Validation DataLoader 0: 100%" + } + }, + "8754e0214d6c495ca4f7e75d11738f73": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_67139d0ae82f4ca7be9506a5bdd2f603", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_73b4b4d832f446259513cff2c764a544", + "value": 1 + } + }, + "3fbb5b3e332d4444ab7623422347d7ce": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_442b0033175d4d38ac1633814f8919b3", + "placeholder": "​", + "style": "IPY_MODEL_08664ffa89a04048aa7a6eecf55169a8", + "value": " 1/1 [00:00<00:00, 102.05it/s]" + } + }, + "85520aaa9c464b7f927c043a323e45f3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": "inline-flex", + "flex": null, + "flex_flow": "row wrap", + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "100%" + } + }, + "bd18214cd9624c0c97d6e5d73bd84b9e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "67a7e78833b141778d290e31b5006277": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "67139d0ae82f4ca7be9506a5bdd2f603": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": "2", + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "73b4b4d832f446259513cff2c764a544": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "442b0033175d4d38ac1633814f8919b3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "08664ffa89a04048aa7a6eecf55169a8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "d89e128b65424ced9d2ea19e42facb67": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_6c135337a5db4da8867d9c9bb1bad8b2", + "IPY_MODEL_63b03fea35f64af49787d6253d1e8aa2", + "IPY_MODEL_5408ba6a5d5e4d3e8371e6d8a156aae6" + ], + "layout": "IPY_MODEL_dce0aaa1839b493a8bfa93820f85bf0b" + } + }, + "6c135337a5db4da8867d9c9bb1bad8b2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_aa01e299117447e692e719426dc7f53e", + "placeholder": "​", + "style": "IPY_MODEL_1183926027a04b39a81c603be4b7860d", + "value": "Validation DataLoader 0: 100%" + } + }, + "63b03fea35f64af49787d6253d1e8aa2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_edee1e5620214adcb701876812fd55df", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_2ddca395a3ea42c6a422cea781e4262f", + "value": 1 + } + }, + "5408ba6a5d5e4d3e8371e6d8a156aae6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_8fc852abdc384fbfada6505cd96ea825", + "placeholder": "​", + "style": "IPY_MODEL_239d49bd1d6c4cc2a95548c5634a3b9a", + "value": " 1/1 [00:00<00:00, 129.72it/s]" + } + }, + "dce0aaa1839b493a8bfa93820f85bf0b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": "inline-flex", + "flex": null, + "flex_flow": "row wrap", + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "100%" + } + }, + "aa01e299117447e692e719426dc7f53e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1183926027a04b39a81c603be4b7860d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "edee1e5620214adcb701876812fd55df": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": "2", + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2ddca395a3ea42c6a422cea781e4262f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "8fc852abdc384fbfada6505cd96ea825": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "239d49bd1d6c4cc2a95548c5634a3b9a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "40eaa223a6ef48628829d45f576c5293": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_8a9155146377424cbc114127816ba8ba", + "IPY_MODEL_beda87842b744bd984629e34e8fae0b5", + "IPY_MODEL_1a4e7e57b95a41869ab5642ed0e6571c" + ], + "layout": "IPY_MODEL_25b3cab0e79a4762a8cc170309e7489e" + } + }, + "8a9155146377424cbc114127816ba8ba": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_9f2c5a74769249b997c1558bdf4c94ce", + "placeholder": "​", + "style": "IPY_MODEL_71b773f3ead4430cbfac09127b801c6a", + "value": "Validation DataLoader 0: 100%" + } + }, + "beda87842b744bd984629e34e8fae0b5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d6e0253023874b6faa6bf6664e55e160", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_5031681c504544388ece6bbfb3b5ad69", + "value": 1 + } + }, + "1a4e7e57b95a41869ab5642ed0e6571c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_34d4e2de5bea4b7f89d44a4e7fcedbb0", + "placeholder": "​", + "style": "IPY_MODEL_1fd81f69f417476a95e4594e2c8b605d", + "value": " 1/1 [00:00<00:00, 136.36it/s]" + } + }, + "25b3cab0e79a4762a8cc170309e7489e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": "inline-flex", + "flex": null, + "flex_flow": "row wrap", + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "100%" + } + }, + "9f2c5a74769249b997c1558bdf4c94ce": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "71b773f3ead4430cbfac09127b801c6a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "d6e0253023874b6faa6bf6664e55e160": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": "2", + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5031681c504544388ece6bbfb3b5ad69": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "34d4e2de5bea4b7f89d44a4e7fcedbb0": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1fd81f69f417476a95e4594e2c8b605d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + } + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/translations/km/lessons/3-NeuralNetworks/05-Frameworks/README.md b/translations/km/lessons/3-NeuralNetworks/05-Frameworks/README.md new file mode 100644 index 00000000..9d0da898 --- /dev/null +++ b/translations/km/lessons/3-NeuralNetworks/05-Frameworks/README.md @@ -0,0 +1,127 @@ +# ស៊ី្ទឹមបណ្តាញប្រព័ន្ធប្រឧត្តិ + +ដូចដែលយើងបានរៀនរួចហើយ ដើម្បីអាចបណ្តុះបណ្តាលស៊ី្ទឹមបណ្តាញប្រព័ន្ធប្រឧត្តិបានយ៉ាងមានប្រសិទ្ធភាព យើងត្រូវតែធ្វើពីររឿង៖ + +* ដើម្បីប្រតិបត្តិបើលលើ tensor, ឧទាហរណ៍ ដើម្បីគុណ, បូក និងគណនាអនុគមន៍មួយចំនួនដូចជា sigmoid រឺ softmax +* ដើម្បីគណនាភាពត្រឹមត្រូវនៃសមីការទាំងអស់ ដើម្បីអនុវត្តន៍ការបន្ថយដោយគ្រាប់ជ្រៅ (gradient descent) + +## [សំណួរពិសោធន៍មុនមេរៀន](https://ff-quizzes.netlify.app/en/ai/quiz/9) + +ក្នុងខណៈដែលបណ្ណាល័យ `numpy` អាចធ្វើផ្នែកដំបូងបាន យើងត្រូវតែប្រើមុខងារមួយសម្រាប់គណនាភាពត្រឹមត្រូវ។ នៅក្នុង [ស៊ី្ទឹមរបស់យើង](../04-OwnFramework/OwnFramework.ipynb) ដែលយើងបានអភិវឌ្ឍនៅផ្នែកមុន យើងត្រូវបានកម្មង់ដោយដៃសម្រាប់មុខងារច្របាច់ទាំងអស់នៅក្នុងវិធីសាស្រ្ត `backward` ដែលអនុវត្តបន្សល់ត្រឡប់ក្រោយ (backpropagation)។ ដោយល្អបំផុត ស៊ី្ទឹមគួរតែផ្តល់ឱកាសឲ្យយើងអាចគណនាភាពត្រឹមត្រូវនៃ *សមីការណ៍ណាមួយ* ដែលយើងអាចកំណត់បាន។ + +រឿងសំខាន់មួយផ្សេងទៀតគឺអាចអនុវត្តន៍ការគណនានៅលើ GPU រឺឧបករណ៍កំព្យូទ័រពិសេសផ្សេងទៀត ដូចជា [TPU](https://en.wikipedia.org/wiki/Tensor_Processing_Unit)។ ការបណ្តុះបណ្តាលស៊ី្ទឹមបណ្តាញប្រព័ន្ធ (deep neural network) តម្រូវឲ្យមាន *ការគណនាច្រើន* ហើយអាចធ្វើការបែងចែកគណនានេះលើ GPU គឺមានសារៈសំខាន់ខ្លាំង។ + +> ✅ ពាក្យ 'parallelize' មានន័យថាផ្សព្វផ្សាយការគណនាឲ្យមាននៅលើឧបករណ៍ច្រើន។ + +បច្ចុប្បន្ន គ្រប់គ្រងស៊ី្ទឹមបណ្តាញប្រព័ន្ធពេញនិយមពីរប្រភេទគឺ: [TensorFlow](http://TensorFlow.org) និង [PyTorch](https://pytorch.org/)។ ពួកវាផ្ដល់ API ដល់កម្រិតទាបសម្រាប់ប្រតិបត្តិការ tensor លើ CPU និង GPU ទាំងឡាយ។ លើសពី API កម្រិតទាប មាន API កម្រិតខ្ពស់ ផ្អែកលើគ្នា ដែលហៅថា [Keras](https://keras.io/) និង [PyTorch Lightning](https://pytorchlightning.ai/) តាមលំដាប់។ + +API កម្រិតទាប | [TensorFlow](http://TensorFlow.org) | [PyTorch](https://pytorch.org/) +--------------|-------------------------------------|-------------------------------- +API កម្រិតខ្ពស់ | [Keras](https://keras.io/) | [PyTorch Lightning](https://pytorchlightning.ai/) + +**API កម្រិតទាប** សម្រាប់ទាំងពីរស៊ី្ទឹមអនុញ្ញាតឲ្យអ្នកកសាងអ្វីដែលហៅថា **ក្រាបការគណនា** ។ ក្រាបនេះកំណត់របៀបគណនាផលបស់ (ជាធម្មតាគឺត្រូវគណនាអំពី loss function) ជាមួយប៉ារ៉ាម៉ែត្រចូលដែលបានផ្តល់ ហើយអាចបង្ខំឲ្យធ្វើការគណនាលើ GPU ប្រសិនបើមាន។ មានមុខងារសម្រាប់បូកគ្នាគណនាភាពត្រឹមត្រូវរបស់ក្រាបនេះ ហើយបានប្រើសម្រាប់បង្កើនគុណភាពប៉ារ៉ាម៉ែត្ររបស់គំរូ។ + +**API កម្រិតខ្ពស់** ចាត់ទុកស៊ី្ទឹមបណ្តាញប្រព័ន្ធប្រឧត្តិជាក្រុម **ជាន់នៃបន្ទាប់បន្សំ** និងធ្វើឲ្យការបង្កើតស៊ី្ទឹមបណ្តាញប្រព័ន្ធភាគច្រើនកាន់តែងាយស្រួល។ ការបណ្តុះបណ្តាលគំរូភាគច្រើនត្រូវតែត្រៀមទិន្នន័យ ហើយបន្ទាប់មកហៅមុខងារ `fit` សម្រាប់ធ្វើការងារ។ + +API កម្រិតខ្ពស់អនុញ្ញាតឲ្យអ្នកបង្កើតស៊ី្ទឹមបណ្តាញប្រព័ន្ធជាទម្រង់រងលឿនដោយមិនចាំបាច់ចាប់អារម្មណ៍អំពីព័ត៌មានលម្អិតជាច្រើន។ នៅខណៈពេលមួយ API កម្រិតទាបផ្តល់ការគ្រប់គ្រងបន្ថែមលើដំណើរការបណ្តុះបណ្តាល ហើយគេប្រើដើម្បីស្រាវជ្រាវពិសេសនៅពេលអ្នកកំពុងដំណើរការជាមួយបុណ្យស៊ី្ទឹមបណ្តាញប្រព័ន្ធថ្មី។ + +វាក៏មានសារៈសំខាន់ក្នុងការយល់ថាអ្នកអាចប្រើ API ពីរប្រភេទគ្នា តាមរយៈការអភិវឌ្ឍរចនាសម្ព័ន្ធជាន់បណ្ដាញរបស់អ្នកដោយប្រើ API កម្រិតទាប ហើយបន្ទាប់មកប្រើវានៅក្នុងបណ្តាញធំដែលបានបង្កើតនិងបណ្តុះបណ្តាលដោយ API កម្រិតខ្ពស់។ ឬអ្នកអាចកំណត់បណ្តាញដោយប្រើ API កម្រិតខ្ពស់ជាជួរបន្ទាប់បន្សំ ហើយប្រើលំហូរបណ្តុះបណ្តាលកម្រិតទាបរបស់ខ្លួន ដើម្បីអនុវត្តការបង្កើនគុណភាព។ API ទាំងពីរប្រើគំនិតមូលដ្ឋានដូចគ្នា ហើយបានរចនាឡើងសម្រាប់ការធ្វើការល្អជាមួយគ្នា។ + +## ការសិក្សា + +នៅក្នុងវគ្គនេះ យើងផ្ដល់មាតិកាច្រើនសម្រាប់ទាំង PyTorch និង TensorFlow។ អ្នកអាចជ្រើសរើសស៊ី្ទឹមដែលអ្នកចូលចិត្ត ហើយរត់តាមសៀវភៅបញ្ជាក់ដែលសមរម្យបានគត់។ ប្រសិនបើអ្នកមិនប្រាកដថាត្រូវជ្រើសរើសស៊ី្ទឹមណា អាចអានការពិភាក្សាដែលមាននៅលើអ៊ីនធឺណិតអំពី **PyTorch និង TensorFlow**។ អ្នកក៏អាចសាកល្បងទាំងពីរដើម្បីយល់ឲកាន់តែច្បាស់ពីស៊ី្ទឹមទាំងពីរ។ + +នៅកន្លែងដែលអាចបាន យើងនឹងប្រើ API កម្រិតខ្ពស់សម្រាប់ភាពសាមញ្ញ។ ទោះជាយ៉ាងណា យើងជឿថាសំខាន់ក្នុងការយល់ពីរបៀបដំណើរការរបស់ស៊ី្ទឹមបណ្តាញប្រព័ន្ធពីដីដើម ដូច្នេះនៅដើមវគ្គ យើងចាប់ផ្តើមធ្វើការជាមួយ API កម្រិតទាប និង tensor។ ប៉ុន្តែ ប្រសិនអ្នកចង់ចាប់ផ្តើមយ៉ាងលឿន ហើយមិនចង់ប្រើពេលច្រើនក្នុងការរៀនព័ត៌មានលម្អិតទាំងនេះ អ្នកអាចរំពឹងខ្លាចរូបខ្លួននិងចូលទៅកាន់សៀវភៅ API កម្រិតខ្ពស់ភ្លាម។ + +## ✍️ ការអនុវត្ត: ស៊ី្ទឹមបណ្តាញប្រព័ន្ធ + +បន្តការសិក្សារបស់អ្នកនៅក្នុងសៀវភៅបញ្ជាក់ខាងក្រោម៖ + +API កម្រិតទាប | [TensorFlow+Keras Notebook](IntroKerasTF.ipynb) | [PyTorch](IntroPyTorch.ipynb) +--------------|-------------------------------------|-------------------------------- +API កម្រិតខ្ពស់ | [Keras](IntroKeras.ipynb) | *PyTorch Lightning* + +បន្ទាប់ពីជំនាញក្នុងស៊ី្ទឹមហើយ អ្នកមកវិលត្រឡប់មើលចំណុចនៃ overfitting ម្តងទៀត។ + +# Overfitting + +Overfitting គឺជាគំនិតសំខាន់ណា នៅក្នុងការរៀនម៉ាស៊ីន ហើយវាចាំបាច់ត្រូវបានយល់ឲ្យបានត្រឹមត្រូវ! + +ពិចារណាបញ្ហាដែលបរសាក្សីរវាងចំណុច5 (ដែលតំណាងដោយ `x` នៅលើក្រាហ្វខាងក្រោម): + +![linear](../../../../../translated_images/km/overfit1.f24b71c6f652e59e.webp) | ![overfit](../../../../../translated_images/km/overfit2.131f5800ae10ca5e.webp) +-------------------------|-------------------------- +**ម៉ូដែលបន្ទាត់ស្រស់ មានប៉ារ៉ាម៉ែត្រ 2** | **ម៉ូដែលមិនបន្ទាត់ស្រស់ មានប៉ារ៉ាម៉ែត្រ 7** +បញ្ហាបណ្តុះបណ្តាល = 5.3 | பញ្ហាបណ្តុះបណ្តាល = 0 +បញ្ហា Scan ដើម្បីផ្ទៀងផ្ទាត់ = 5.1 | បញ្ហា Scan ដើម្បីផ្ទៀងផ្ទាត់ = 20 + +* នៅខាងឆ្វេង យើងឃើញបន្ទាត់ស្រស់ល្អ។ ព្រោះចំនួនប៉ារ៉ាម៉ែត្រត្រឹមត្រូវ ម៉ូដែលយល់ច្បាស់ពីដំណាក់កាលចែកចាយចំណុច។ +* នៅខាងស្ដាំ ម៉ូដែលមានកម្លាំងខ្លាំងពេក។ ព្រោះយើងមានតែប្រាំចំណុច ហើយម៉ូដែលមានប្រាំបីប៉ារ៉ាម៉ែត្រ វាអាចកំណត់តម្លៃឲ្យឆ្លងកាត់ចំណុចទាំងអស់បាន ធ្វើឲ្យកំហុសបណ្តុះបណ្តាលក្លាយជាសូន្យ។ ប៉ុន្តែវាបំប៉នម៉ូដែលមិនឲ្យយល់ឆ្គើយពីបាំងកូដខាងក្រោយទិន្នន័យ អ្វីដែលធ្វើឲ្យកំហុសផ្ទៀងផ្ទាត់ខ្ពស់។ + +វាមានសារៈសំខាន់យ៉ាងខ្លាំងក្នុងការរកតុល្យភាពត្រឹមត្រូវរវាងភាពសម្បូរបែបរបស់ម៉ូដែល (ចំនួនប៉ារ៉ាម៉ែត្រ) និងចំនួនគំរូបណ្តុះបណ្តាល។ + +## ហេតុអ្វីបានជា overfitting កើតឡើង + + * ទិន្នន័យបណ្តុះបណ្តាលមិនគ្រប់គ្រាន់ + * ម៉ូដែលមានអំណាចលើស + * មានសំឡេងរំខានជាច្រើននៅក្នុងទិន្នន័យចូល + +## របៀបរកឃើញ overfitting + +ដូចដែលអ្នកឃើញពីក្រាហ្វខាងលើ អាចរកឃើញ overfitting ដោយកំហុសបណ្តុះបណ្តាលទាបណាស់ និងកំហុសផ្ទៀងផ្ទាត់ខ្ពស់។ ជាទូទៅ ក្នុងដំណាក់កាលបណ្តុះបណ្តាល យើងនឹងឃើញកំហុសបណ្តុះបណ្តាល និងកំហុសផ្ទៀងផ្ទាត់បញ្ចុះចុះទាំងពីរ ហើយបន្ទាប់មកនៅពេលណាមួយ កំហុសផ្ទៀងផ្ទាត់អាចឈប់បន្ថយ ហើយចាប់ផ្ដើមកើនឡើង។ នេះជាសញ្ញានៃ overfitting និងសញ្ញាថាយើងគួរតែបញ្ឈប់ការបណ្តុះបណ្តាលនៅពេលនេះ (ឬយ៉ាងហោចណាស់ថតចម្លងម៉ូដែលនៅពេលនេះ)។ + +![overfitting](../../../../../translated_images/km/Overfitting.408ad91cd90b4371.webp) + +## របៀបការពារកុំឲ្យ overfitting កើតឡើង + +ប្រសិនបើអ្នកឃើញថា overfitting កើតឡើង អ្នកអាចធ្វើពីរបៀបដូចតទៅ៖ + + * បន្ថែមចំនួនទិន្នន័យបណ្តុះបណ្តាល + * បន្ថយស្មុគស្មាញរបស់ម៉ូដែល + * ប្រើបច្ចេកវិទ្យា [regularization technique](../../4-ComputerVision/08-TransferLearning/TrainingTricks.md) មួយចំនួន ដូចជា [Dropout](../../4-ComputerVision/08-TransferLearning/TrainingTricks.md#Dropout) ដែលយើងនឹងពិចារណានៅពេលក្រោយ។ + +## Overfitting និងការជជែកចែករវាង Bias-Variance + +Overfitting ជាករណីមួយនៃបញ្ហាទូទៅក្នុងស្ថិតិហៅថា [Bias-Variance Tradeoff](https://en.wikipedia.org/wiki/Bias%E2%80%93variance_tradeoff)។ ប្រសិនបើយើងពិចារណាពីប្រភពកំហុសក្នុងម៉ូដែល យើងអាចមើលឃើញកំហុសពីរប្រភេទ៖ + +* កំហុស **Bias** បង្កឡើងដោយអាល្គូរីធម៍បណ្តុំរបស់យើងមិនអាចចាប់យកទំនាក់ទំនងរវាងទិន្នន័យបណ្តុះបណ្តាលបានត្រឹមត្រូវ។ វាអាចបណ្តាលមកពីម៉ូដែលរបស់យើងមិនមានអំណាចគ្រប់គ្រាន់ (**underfitting**)។ +* កំហុស **Variance** បណ្តាលមកពីម៉ូដែលស៊ើបអង្កេតសំឡេងរំខានក្នុងទិន្នន័យចូល ជំនួសអោយទំនាក់ទំនងមានអត្ថន័យ (**overfitting**)។ + +ក្នុងដំណាក់កាលបណ្តុះបណ្តាល កំហុស bias កាត់បន្ថយ (ដោយសារតែម៉ូដែលរៀនចាប់យកទិន្នន័យ) ខណៈកំហុស variance កើនឡើង។ វាមានសារៈសំខាន់ក្នុងការបញ្ឈប់ការបណ្តុះបណ្តាល – ហើយអាចធ្វើដោយដៃ (នៅពេលយើងរកឃើញ overfitting) ឬដោយស្វ័យប្រវត្តិ (ដោយណែនាំ regularization) – ដើម្បីការពារការកើតឡើងនៃ overfitting។ + +## សេចក្តីសន្និដ្ឋាន + +នៅក្នុងមេរៀននេះ អ្នកបានរៀនអំពីការបម្លែងជាច្រើនរវាង API នានារបស់ស៊ី្ទឹម AI សំខាន់ៗពីរដូចជា TensorFlow និង PyTorch។ លើសពីនេះ អ្នកបានរៀនអំពីប្រធានបទសំខាន់ណាស់មួយ គឺ overfitting។ + +## 🚀 ជំហាន thách thức + +នៅក្នុងសៀវភៅបញ្ជាក់ជាប់នឹងរូបរាង អ្នកនឹងឃើញ 'ភារកិច្ច' នៅខាងក្រោម; សូមធ្វើការតាមសៀវភៅបញ្ជាក់ ហើយបញ្ចប់ភារកិច្ច។ + +## [សំណួរពិសោធន៍បន្ទាប់មក](https://ff-quizzes.netlify.app/en/ai/quiz/10) + +## ពិនិត្យឡើងវិញ និង សិក្សាផ្ទាល់ខ្លួន + +សូមស្រាវជ្រាវអំពីប្រធានបទខាងក្រោម៖ + +- TensorFlow +- PyTorch +- Overfitting + +សួរខ្លួនឯងសំណួរខាងក្រោម៖ + +- តើអ្វីទៅជាការបំផុសគ្នារវាង TensorFlow និង PyTorch? +- តើអ្វីទៅជាការបំផុសគ្នារវាង overfitting និង underfitting? + +## [ភារកិច្ច](lab/README.md) + +នៅក្នុងមន្ទីរប្រឡងនេះ អ្នកត្រូវបានស្នើឲ្យដោះស្រាយបញ្ហាកំណាត់ចំណាត់ថ្នាក់ពីរមានការតភ្ជាប់គ្នាពីរបន្តផ្នែក ដោយប្រើបណ្តាញតែមួយ និងមានច្រើនជាន់ប្រើ PyTorch ឬ TensorFlow ។ + +* [សំណើ](lab/README.md) +* [សៀវភៅបញ្ជាក់](lab/LabFrameworks.ipynb) + +--- + + +**ការបដិសេធ**៖ +ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ទោះបីយើងខិតខំថែរក្សាការត្រឹមត្រូវក៏ដោយ សូមជ្រាបថាប្រែប្រួលដោយស្វ័យប្រវត្តិក្នុងការបកប្រែអាចមានកំហុស ឬភាពមិនមានភាពត្រឹមត្រូវ។ ឯកសារដើមក្នុងភាសាទំនើបរបស់វាគួរត្រូវបានគេចាត់ទុកជាអ្នកផ្តល់ព័ត៌មានឯកទេស។ សម្រាប់ព័ត៌មានសំខាន់ៗ សូមផ្តល់ការបកប្រែដោយមនុស្សដែលមានជំនាញជំនាញ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកស្រាយខុសពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។ + \ No newline at end of file diff --git a/translations/km/lessons/3-NeuralNetworks/05-Frameworks/lab/LabFrameworks.ipynb b/translations/km/lessons/3-NeuralNetworks/05-Frameworks/lab/LabFrameworks.ipynb new file mode 100644 index 00000000..a2ab3425 --- /dev/null +++ b/translations/km/lessons/3-NeuralNetworks/05-Frameworks/lab/LabFrameworks.ipynb @@ -0,0 +1,427 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# ការបែងចែកជាប្រភេទដោយ PyTorch/TensorFlow\n", + "\n", + "ការប្រលងមន្ទីរពី [កម្មវិធីសិក្សា AI សម្រាប់អ្នកចាប់ផ្ដើម](https://github.com/microsoft/ai-for-beginners)។\n", + "\n", + "## ផ្នែកទី ១៖ ការបែងចែកប្រភេទ Iris\n", + "\n", + "ឃុំទិន្នន័យ Iris មាន ១៥០ ម៉ោងកំណត់ត្រានៃប្រភេទ Iris បីផ្សេងគ្នា។ កំណត់ត្រាទីមួយៗមានប៉ារ៉ាម៉ែត្រចំនួន ៤ នៃលេខគត់៖ ប្រវែង/ទទឹង៖ sepal និង ប្រវែង/ទទឹង៖ petal។ វាជាគំរូឃុំទិន្នន័យសាមញ្ញមួយ ដែលសម្រាប់វា អ្នកមិនចាំបាច់ប្រើបណ្តាញប្រសាទមានអំណាចខ្លាំងទេ។\n", + "\n", + "### ការទទួលបានឃុំទិន្នន័យ\n", + "\n", + "ឃុំទិន្នន័យ Iris ត្រូវបានបង្កើតចូលក្នុង Scikit Learn ដូច្នេះយើងអាចទទួលបានវាបានយ៉ាងងាយស្រួល៖\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Features: ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)'], Classes: ['setosa' 'versicolor' 'virginica']\n" + ] + } + ], + "source": [ + "from sklearn.datasets import load_iris\n", + "from sklearn.model_selection import train_test_split\n", + "\n", + "iris = load_iris()\n", + "features = iris['data']\n", + "labels = iris['target']\n", + "class_names = iris['target_names']\n", + "feature_names = iris['feature_names']\n", + "\n", + "print(f\"Features: {feature_names}, Classes: {class_names}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### សម្រួលទិន្នន័យឲ្យមើលឃើញ\n", + "\n", + "នៅក្នុងករណីជាច្រើន វាមានហេតុផលក្នុងការសម្រួលទិន្នន័យឲ្យឃើញថាតើពួកវាផ្តាច់ពីគ្នាបានទេ - វានឹងធានាបានថាយើងគួរតែអាចបង្កើតម៉ូដែលចាត់ថ្នាក់ល្អមួយបាន។ ពោលគឺ ដោយសារយើងមានលក្ខណៈមួយចំនួនតិច យើងអាចបង្កើតរបាយការណ៍ scatter 2D តាមគូជាប់គ្នាច្រើន ដែលបង្ហាញថ្នាក់ផ្សេងៗដោយពណ៌ចំណុចផ្សេងៗ។ វាអាចធ្វើបានដោយស្វ័យប្រវត្តិដោយកញ្ចប់មួយដែលហៅថា **seaborn**៖\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
sepal length (cm)sepal width (cm)petal length (cm)petal width (cm)Label
05.13.51.40.20
14.93.01.40.20
24.73.21.30.20
34.63.11.50.20
45.03.61.40.20
..................
1456.73.05.22.32
1466.32.55.01.92
1476.53.05.22.02
1486.23.45.42.32
1495.93.05.11.82
\n", + "

150 rows × 5 columns

\n", + "
" + ], + "text/plain": [ + " sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) \\\n", + "0 5.1 3.5 1.4 0.2 \n", + "1 4.9 3.0 1.4 0.2 \n", + "2 4.7 3.2 1.3 0.2 \n", + "3 4.6 3.1 1.5 0.2 \n", + "4 5.0 3.6 1.4 0.2 \n", + ".. ... ... ... ... \n", + "145 6.7 3.0 5.2 2.3 \n", + "146 6.3 2.5 5.0 1.9 \n", + "147 6.5 3.0 5.2 2.0 \n", + "148 6.2 3.4 5.4 2.3 \n", + "149 5.9 3.0 5.1 1.8 \n", + "\n", + " Label \n", + "0 0 \n", + "1 0 \n", + "2 0 \n", + "3 0 \n", + "4 0 \n", + ".. ... \n", + "145 2 \n", + "146 2 \n", + "147 2 \n", + "148 2 \n", + "149 2 \n", + "\n", + "[150 rows x 5 columns]" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import seaborn as sns\n", + "import pandas as pd\n", + "\n", + "df = pd.DataFrame(features,columns=feature_names).join(pd.DataFrame(labels,columns=['Label']))\n", + "\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAvcAAALFCAYAAABHzcwdAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAEAAElEQVR4nOyddXgc19WH35lZ3tWKmSWLzMwUcJiZmdNw2iZp86VN06Zt2iRt0jAzMzoMjmNmlixZzLDSMsz3x8orrVe2JWtF9rzPoyeZu3fu3F3fuXPm3t85R5BlGQUFBQUFBQUFBQWFkY841B1QUFBQUFBQUFBQUAgPinGvoKCgoKCgoKCgcJCgGPcKCgoKCgoKCgoKBwmKca+goKCgoKCgoKBwkKAY9woKCgoKCgoKCgoHCYpxr6CgoKCgoKCgoHCQMOTGvSAItwiCsEkQhI2CILwuCIJuX/WPOeYYGVD+lL/B+OsTythU/gbxr08oY1P5G8S/PqGMTeVvEP8OGYbUuBcEIRW4EZgqy/JYQALO2dc5jY2Ng9E1BYU+o4xNheGKMjYVhivK2FRQCD9DvnIPqAC9IAgqwABUD3F/FBQUFBQUFBQUFEYkQ2rcy7JcBfwLKAdqgDZZlhfvWU8QhKsEQVgpCMLKhoaGwe6mgsJeUcamwnBFGZsKwxVlbCooDCyCLA+dDEkQhGjgXeBsoBV4G3hHluVX9nbO1KlT5ZUrVw5OBxUOdYS+VFbG5vChZHspWzcXI0kihaPzyMrNGOouhRtlbCoEqK6qZcuGHVitNnLzsigYnYtKpRqq7ihj8yChubGFLRu301DfRHpmCkVj8zEYDUPdrf7Qp7E5khmyu7+TI4FSWZYbAARBeA+YDezVuFdQUFDYF5s2bOOKc27G2mEDIDomkqdff4j8wtwh7pmCQviprqzlpiv/wLbNxQBIksRjL/yDWfOnDXHPFEYylrZ2/vXXx/jkvS4xxR1/upFzLj4VURwOim6FfTHU/0LlwExBEAyCIAjAEcCWIe6TgoLCCObd1z8JGPYALc1tfPPFT0PYIwWFgWPT+q0Bwx7A6/Xy7789jqW1fQh7pTDSKd5eGmTYAzz89yep2FU1RD1S6AtDrblfBrwDrAY2dPbnqaHsUzhwtbXidTiGuhsKCoccXq+XnTvKQsrLdlYMfmcUFAaB1lZLSFlNVR125Rmk0A862q0hZQ6HE5vVPgS9UegrQ71yjyzL98iyXCjL8lhZli+UZdk51H3qD662FqyVpVh2bkX2eYe6OwoKhxSSJHHaOSeElB913MLB74yCwiCQV5CDf+O7i1POOo64+Jgh6pHCwUBGVhoGoz6orGhsHinpSUPUI4W+MOTG/cGGo6EObVwCkkaLq611qLujoHDIMXfBdG6+82pMEUYio8zc+ZebmTZr4lB3S0FhQBgzroCHnvwLKWlJaLQazr34NM675DQkSRrqrimMYLJy0nn8pQcYPb4ASZJYeORs/vrQH4iMNA911xR6wVA71B5U+DxuPA4busQk8PlwtbWgjY4d6m4pKBxSxMRFc9k153H8yYsQRIGExLih7pKCwoCh1qg5/Oh5TJw6FqfDRXxi7FBGylE4iJg0dRxPv/Jv2tutxMRGodPrhrpLCr1EmQHCiKejHZXOgCCISHoDzuZGZFkO2TJVUFAYeBKT44e6CwoKg0ZMbPRQd0HhICQiMoKIyIih7oZCH1GM+zDitnYg6vxvtqJKDQj4XC4krXZoO6ag0AuaGprZuG4rVZW1ZGanMXZCIZFRXVuwXq+XLRt3sGXjdvR6HWMnFpKVExw/vrqylo3rttDU2EJ+YS5jJhSg0w3+as/WTTvYvGEboiQyZnwheQU5g94HBYVwU7KjjE3rtuJyuxk9toCisXn7XDwq2V7GhrVbaGxoIicvi7z8bHYW76KqspasnHTGjC8IuscVFLrTUNfIhnVbqa2uJzs3gzETCjGbTSH1SraXsXH9FjxuL6PHF5BXkM3q5evZsmkHWq2GsRMKGTuhaAi+waGLYtyHEY/diiaya/VE0unw2q2Kca8w7Glv7+DB+5/g43e/DJRdfeNFXHXDRag1agBWL1/P1RfchsfjdxRPSIzj6dceJHtUJgB1NfXcdt09bFq3NdDG/f+9m+NPPnIQvwlsWLuFy8++CYfD75sfYTbx7BsPUzgmb1D7oaAQTnZsLeGys2+mrTM6jkar4dnXH2LClLE91q8oq+TeO//FmpUbAmXX33oZ7735KTVVdQBcfdPFXHXDhajV6oH/AgojitaWNv72f//hmy9+DJTd9PuruOTqc4L8ObZvKeGys2/C0uYPvWo0GvjHI3dz89V343F7AL9U8j9P/5UJk8cM7pc4hFEcasOELMt4HXYkTZchL6q1eOy2fZyloDA82LljV5BhD/DM/15lV2klAA67gyf+82LAsAeor2tk5bJ1geOtm4qDDHuAB+59lPq6xgHseTCyLPPOqx8FDHuAdksHX3/+w6D1QUFhIPjx218Dhj2Ay+ni5WffxuPx9Fh/y6biIMMe4IWn3uDoEw4LHD/z6CuUlypxyxVCKdleFmTYAzz+8AtUlAWPl++++jlg2AOcevZxvPTMWwHDHvyZblcsXTOwHVYIQjHuw4TP5UQQJYRub7SiRoPXqcSEVRj+2Gyh49Tr9WLvLHe63NRW14fUaW5s6WrDGvoi29ZiwekYvOi2Pp+PivLqkPKqitpB64OCwkBQVxN6/1VV1O7VuO/pnrZ22NBoNYFjr9eL3a48oxRC6Wn8uJwu7HvM5zV7PBdi46JpbGgOObenMoWBQzHuw8Seq/YAolqjJLNSGBFkZqcRExfskJdflEtaZgoAkZERnHPxqSHnTZkxIfD/OXlZAQnPbk48/SiSkhMGoMc9I0kSZ55/Ukj5MScdPmh9UFAYCBYumhtSdvZFp/To01JVUUNKaiL6PaKbzJgzhY1ru5LAF44eRVpGavg7qzDiycpOJ2IPff2kaeMwGHR8/N5iXnr6LVYtX88RR80LqvPem59x4mlHh7Q3Y/bkAe2vQjCK5j5MeBx2hD10i6Jajc/tUiLmKAx7UlKTeOyFf/Lov59h3apNzFkwnatuuIjomKhAnWNOODwgBTCbTdx0x9WMndjlJBUZHckdf7qRd177iKqKWuYfPoujjj8sxOAfaGbNm8of7ruFZx59BUklcd2tlzFl+vhB7YOCQriZOGUMf//v3TzywDO4nC4uvfY85h8+M6Tebt8Xm9XG3x7+A88/8TqlJeUsOHI2Z55/Ek/992UizCbmLpzBVTdcSFS04lCrEEp6VipPvPwv/vvPp9i8YTsLj5zN+ZeewY2X30VpSXmg3mMv/pP7//NHHv3XM7icbs6/7HSmz56M0+Hk7dc+xmjUc+UNFzJZmYMHFUGW5aHuQ5+YOnWqvHLlyqHuRggdu0oQNRrUEZHB5eWlmEcVhqzqK4wI+vRGNlzHZl+w2x20t7UTGR2Jttv2fXca65tQa9QhUTa+//oXbr3mbuYfPov4xFhWLF1DS1Mrb3/+LAlJgx+WsqmxGVEQiY6NGvRrDwKH3NhU8NPa0obH491rBtofv1nKby67AwCNRs0lV59LZk4aM2ZPIiEpIXCPR0VHBkl0wogyNg8ibFY7He0dRMdE8d1XS7j9unuCPk9JS+L1j58CZHw+mdhuO8DlZVWotWqSB3H3dj8cMqusysp9mPA6naiMoSGiRLUan9OhGPcKIwK9Xheylb8ncQk9J2azW+143B6+/fKnQJkkSbhc7rD2sbfExvVs/CgojGSioiP3+bm9m1ba5XLz1CMvIYoiH333CtC7e1xBYTcGox6DUQ/0rMNvaW7D6XT2KL/MyFIkX0OForkPA7Is43U5ENWhqyCiSo3XNXgOhQoKQ0VuQVbISuCpZx83qJp7BYVDnZz8rJBdtxNOO4okJambQj/JL8hBpZKCys656FQlC/gwRDHuw4Ds9SAgBEXK2Y2gUuN1Ksa9wsFPXkEOT77ybyZPn0BsfAyXXnMel193Piq1skGooDBY5BXk8NSrDzJt5kRi42O4+KpzuOamiwdKgqNwCFEwZhSPv/QA4yYWEZcQwzU3X8K5F5+CKCqm5HBDeeqGAa/TGeJMuxtRrVIi5igcEgiCwJTp43nshb9jszmIjYtWHMkVFIaASdPG8cjzf8dmtRMTG6UYXwphQZIkZsyZwlOvFuGwO4hR5vhhi2LchwGfy4m4N+NepcbtsvT4mYLCwYjBaMBgNAx1NxQUDmkMBj0Gg36ou6FwEGI0GTCalDl+OKMY92HA63Qgqnre8hRU/nCYCgojHbfLzYZ1W1i+ZDURkSamz55MXkHOUHdLQeGQYeumHSxbshqn08WM2ZMYM6EQlUp5jCv0n6bGFtat2siGtZsZVZDD5OnjSU5JHOpuKRwgyqwQBva1ci9IErLPi+zzIShbowojmOVLV3Pdxb9nd/hcc2QEz7/1X/IKFQNfQWGg2bJxO5eceWMgGs7jksTTrz3I1JkTh7ZjCiMel9PFC0++zotPvRkomz1/Gn//z91Exew7OpPC8ESxNsOA1+VEUO3FuBcERGX1XmGEY7PZefyhF+ieF8PS1s7KZWuHrlMKCocQP36zNCjMpdfr5cWn38Tj9gxhrxQOBsrLKnn5mbeDyn75cQUlxWVD0yGFfqMY92HA53Ih7sW4BxBUKnwuxbhXGLl4PV4sbe0h5R3t1iHojYLCoUdra6jvVktzG16fbwh6o3Aw4XZ78PUwjlxOxW4ZqSjGfT+RfT5/KMx96B5FSaWs3CuMaCLMJi668uygMlEUGTO+kGf+9wqPPPAMa1ZuwK2sIiooDAiHL5obUnb2BSfz9isf8dD9T7D8lzXY7UpkNoX909FhZckPy/jXff/jteffRavTMm3WpKA6ickJZOdmDFEPFfqLornvJz63C0Gl2mc4KEGlUhJZKYx4jjh6HoIg8PKzbxEVHcklV53Dg397nO1bSgB49rFXeerVfzN99uQh7qmCwsHH+CljePS5v/PUIy9htzm44PIz+O6rJXz9+Q8APP/E6/zn6b9y2FGhLwEKCt356tMfuOd3/wgcJyYn8J+n7+Pzj77hmy9+YvKM8Vx0+VkkKQ61IxbFuO8nPpdzn5Ic6JTlKCv3CiOc6NgoTj/3BI46fiFqtYoXn3ojYNgD+Hw+XnzyDSZPG68krlJQCDNarYb5R8xi6qyJ+Lw+vv7ih4Bhv5tH//0sU2dOJMJsGqJeKgx3GuobefjvTwSV1dXUU1VRwy13XsMV11+AwahHvZcgIQojA+UJ3E+8+9HbA4gqFW6HfZ91FBRGCrsNB0tbR8hnbZYOvD6fMrEoKAwQu2PXW9ttIZ9ZO2x4Pd7B7pLCCMLr8eKwOxFFkbSMZNpa22lrteByuRFFkcgo81B3USEMKM/gfuJzOfeptwcQJDU+t3uQeqSgMDgcdtRcXn62K8KCSq3iulsu5e1XPqS0pJy5h81kyvTxmCMjAnXaWi2sXrGBn75dSs6oTOYsnNFnXWddbQMrlq5l1bK1jJs0mhlzppCalhS276WgMJS4XW42rN3Cd1/9jFanZcERsxFFkW+//BGnw8XYiYWUl1VSNLaAUflZFG8vC5x76TXnKqELD3E2rd/GD9/8grXDxmFHzWHCpDGoNV0LkAlJ8dz2x2uxtHawY9tOYuOiiYqJpKBo1KD3VZnLBw7FuO8nPpcTUaPdZx1BpUJWjHuFg4zxk0bzxEsP8Ozjr2Gz2rnht5dz753/orqyFoC3X/2I3//pRs6/9HQAZFnmw7c/51/3PRZoI/X5d3nm9YdITU/u1TXtNjuPPPAMH73zBQDvvv4JM+dO4Z+P3kNUtGLUKIx81qzcwJXn3RoIO/vCk29ww+2X8/SjrwB+R/Zb/3Atv7n0Dh5+6j7efvUj6usaOe+S0zls0Zyh7LrCELN5wzYuPfMGHA6/j98rz77NEy8/wKx50wJ1RFFEluG/DzwdKEtIjOOYEw8f1L4qc/nAokTL6Sdel2v/K/eiiCz7kH3KdqnCwYNGq2H2guk89uI/ee7N/2C3OQKG/W7+9+9nqa2uA6Cmup7HHno+6POqihq2ddPt749dpZWBh8Fufv15FaUl5Qf4LRQUhg8ej4eXnn4rKJ+Ey+mirKSCxOR4wO/bsnLpGgrH5PH2qx/xr8f/xEvv/o/Tzjme6NioIeq5wnDg5++WBQx78C+oPP/EG7i6heKur2vgf/9+Lui8+rpGtm4qHrR+gjKXDzTKyn0/8blde81Ouxt/IisVPrcbSSsNUs8UFAYHrVYDgKcHra/L5cbr9cdP9nm9PYbK7EsSnp6u4S9XQnAqjHxkn4zNGqqldzpdQQ6ODocLjVaNzWpHklSBe1Dh0KanUKg2qw2ftyuGvc8r4+whfv1gz6HKXD6wKCv3/SAQ417a/zuSX3evRMxROHjJK8jGFGEMKjv/0tNJSkkAICklgfMuOS3o8wizibzCnF5fIyMrlWkzJwaVZY/KJCs7/cA6raAwjFBr1Jx/2RlBZYIgUDA6l8ry6kDZzLlT2Lh2KxdcfqZi2CsEmHf4zJCw3BdeeRY6vS5wnJgczyVXnxNUR2/Qk1+Y26tr7NhawpP/fYm7b7uf779eQrslNLBCb1Dm8oFFWbnvBz63C0Had4z73QgqSXGqVTio0Wg13PjbK1n2yyqqKmqZOXcKo8cVIEn+3SqVSsUFl59JckoiH7z9OQWjczn34tP65FBrjozgnn/8lk/eW8y3i39m1rypnHLWccQnxg3U11JQGFRmzp3KQ0/+hZeefguVWsWi4xagVquZMnMCsixz9PGHsW1zMQ/870/MnDdlqLurMIwYN3E0T736IC899QYWSwcXXXkWs+ZNDaojCAJnnHcicfExvPPaR2TnZnL+ZWcwqiB7v+2Xluzi8nNuobWlDYAP3/mCe/7+W04/94Q+91WZywcWobu274AbEYRZwAXAPCAZsAMbgU+BV2RZbuv3RTqZOnWqvHLlynA11y/cHRZsNZUYktP2W9fR1IBKb0Cf0DvHQYVhwf7f2roxnMbmUPD15z9y6zV3UzQ2j7iEWNav3ozH4+G9xS+QnBqcDMVhd6DWqAOG/4FgtznQ6bW9erk+CFHG5kHOk/99kWVLVrN6+XpEUWDStPEsOGI25158Kj5ZHs4r9srYHGI8bg9en2+/Y8ThcKBSqVDtx29wN599+DV33PiXoLLY+Bje/uwZ4hJiD7i/gziXHzIPi36v3AuC8DlQDXwI/BWoB3RAPnAY8KEgCA/KsvxRf6813PC5XIi9kOQAnZp7RZajcPDi63QY37JxB7AD8OvxfT5fSN3u28QHit7Q/zYUFIYrmzdsZ+WvawHw+WDF0jUkJscHhTVUUOgJlVrVK+NOp+vbHNpdu78bt8uNTw4t7wvKXB5+wiHLuVCW5cY9yjqA1Z1//xYEYa/7LIIgFABvdivKAf5PluWHw9C3AcXrciLsJ4HVbgRJhdcR6iiloHCwkFeYS4TZFKTBvOiqs4NW7R3tNuq3VVCxagdRqXGkTR5FZIqyDasw8mivb6Vm/U4aiqtIHptF4uhMjDHhSwB01gUn893in4PKTj7z2LC1rzCyaK9voXp9KY0DNN56Q8HoUegNeuy2rqScV1x/AQmJ8YPaD4X902/jfk/DXhAEc/d2ZVlu7sH4737+NmBi57kSUAW8399+DQY+l3O/2Wl3I6pUuBXNvcJBTHZuBk+/9hDvvP4x2zcXc8pZxwUS8IA/LNvOnzey8cNfAKhaU0zJT+s5/PazMMVHDWHPFRT6ht1i49dnP6dllz/Ma9XaEjKmFzD1/CNQhUkuM3n6eB5/8Z+88vy7iILABZefycQpY8PStsLIwj/evthjvBUy9YIjUA3iTk5eYQ7PvvEwb770PmWlFZxx3onMWzhz0K6v0HvC5lArCMLVwL349fa7hfwy/pX43nIEUCLL8q5w9Wsg8blcSHpDr+oKkkpxqFU46Bk9Lp+7x96Kx+0JkQ/Ymi1s+Xx5UJmjzUZrZaNi3CuMKNprmwOG1m7Kl2+jYNFUotPDs4qp1+uYs3AGM+b6nWZ7q4tWOPjoebxtpWDRlLCNt94ydkIhox/4PV6PV5GIDWPCOVvcDozZ1yp9LzgHeH3PQkEQrgKuAsjI6Fuq+oHE53Yh9nLCFVQqZI8HWZYPVQfAg5LhOjaHEkEQepz0ZVECWUZSq4hKi8fe1oGtuZ1wOPUrhKKMzYFjb2N2IKb2g9GoV8Zm35B9e5sjh2buFEURUaNEUh/OhHPWKAEOWFQuCIIGOAm4c8/PZFl+CngK/J71B3qNcCLLMj6Pe7/ZaXcjCAKCJCJ73AjqYRvlQKGPDMexOZzYtG4rP3zzC6tXrGfKjInMvvgwNq/cxFs/LSc3J4NZR40nKlXR3A8EytgcOMxJMZiTY7HUNAXKJp29kLqtFax950eSxmRhyI5n+fJ1fP3590ycOp6jj19I9qhMWppbWbZkNR+/9yU5ozI5/pRFFI7Jw2a1s2r5Ot5741Mio82ccuaxTJg85qBcDFLGZt8wJ4eOt/Sp+cg+mXXv/kRbTRNZM4pILMxAG6Ef0L5s2bidT97/irKd5Zx0+jHMmDOFqOhg7X9zUwvLf1nDpx98RUSEkRNOO5qZc6cEJJoKA09YQmECCIIwCXgeWAYE8h/LsnxjL88/GbheluWj9lVvuITN8rqcWHZswZTZe9WRtaocU3o2KoNx/5UVhgNKSLd+UF1Ryx033cvaVZsCZZOnjWfeYTP5zz+fAiAmNoqX3vsfGVn7DyerEIQyNocYS20zFSu3U7elnLzDJ1D6y2ZqN/kVpZGZCSxp2MUH734RqJ+Znc4zrz/I4s9+4IF7Hw2UR5hNvPL+Y5SWlHPzVX8MlKvUKl5691HGTigavC8VHpSxOQB0H29pk0cRNyqVH//7Pi5rV1baCafPo2DRwOU+KNlexkWnXx8UNOHOe2/i3IuDkxN+9O4X/PHW+wPHao2a/73wD2bOGfK8DAffm/JeCOdr1JPAt8CvwKpuf73lXHqQ5AxXfG4XorpvejNRUsJhKhw6FG8vDTLsAVavWE9iSpdGtLmple1bdg521xQU+o05KYYxJ8zksNvOxBgbGTDsAbSZsXz0/uKg+rtKK9iyqZgnHn4hqLzd0sGWTTt45n+vBJV73B5++VExehX8dB9v+UdMpqOhLciwB9j06TJsLe0D1oetm3aEZKR94uEXaKjr2lFobbHw6nPvBtVxu9wsW9IXc1Chv4RTluORZfnWAzlREAQDsAi4Ooz9GVB8Llevw2DuRslSq3Aw0Bu/EX9s+553BUVJZMqMCTTUNVJeVrXXegoKIwFB9Esu4/PTsNQ042zfhzp1Lzvle9fwC4HPDkZ5jkJ/2Mu8OcjTqX94hl5UpZIYO7EIu83Bts3F+/AbUBgIwrly/50gCFcJgpAsCELM7r/enCjLsk2W5dhwZrIdaLxOZ6+daXcjSCq8buf+KyooDENcdieVa4v56ZEPWP7ClzSWVIcYJds27+Aff36EK869BYNRz8QpY4I+v/KGC2msawJZZuKUsfz27uspGD1qML+GgkJYaa9roWZDKbLXR8a0fAoWTcG5q4mTTlkUVC8jK42isXlcc9PFQeURZhOyLHPB5WcGlReNzWNUfhY3X/VHbrv2Hpb/shqXS9n5PVSx1Daz6ZNf+e7Bt9n+zWoiEqLQGIOTP40+bjqGmIgB60PhmDwizKagsqtuvIj4xC6/qahoM1ffeCHX33Y5Op2O1PRkfnv3b5h7uBIyczAJ58r9eZ3/7e4Q29dQmCMGn8vZa2fa3YgqFT6XsnKvMDKp3VDKr891aYjLV27n8NvPJCYrCYCynRVcce6ttLVaALjs7Jt5/MV/sm7NZtYsX8dhR8+jvraRf933GACrlq8n6ttfmX/ErMH/MgoKYcDZbmfZ81/SXFYLQGNJNbG5KRQumkJR1FwmTB/PV599F3CoTUxO4MTTjyYhMY733/6cuPgYckZl8tc/PsTocQU8+ORf+PT9r4iKMTPvsJncdOUfAtf65osfeeb1h5g2a9JQfV2FIcLeZuWXJz8NONQ2FleTOjGXhbeczq7lW2mr7nKoHVAEmatuuJAd20ppqGtk0rTxxMZFhVRzOd385x9PBY5//OYXXnj7kYHtm0IQYTPuZVnODldbIwGf24laF9mncwSVGp/NOkA9UlAYONx2J5u/XBFU5vN4qd9eGTDut28pCRj2u7nl6rv5+IdXuO6WS6mqqOHkIy4K+ry1pY3tW3aSmZ0+sF9AQWEAsNQ1Bwz73TSVVDPxjHnEZieTMSqD0889IejzqOhIps6ayKcffMWqZev46B3/C/OKpWs44bRFPPTkXwD/vdMdWZb56J0vFOP+EMRS0xwUKQf8iaxGHzeDCafNG7R+bNm4g3//9XHSMlKIiY3i6UdfxmDQM2XGRBI6V+9tVhsvPPVm0Hkej5elP69i/OQxPTWrMACETZYjCML1giBEdTuOFgThunC1P9zwuRSHWoWRjyzLeNyeXtUVhdDporsOePf/5+ZlMWveVEwRRgRRREbAbrUDAlIPodAkScTpdCkZnBWGLbIs4/V6Q8oltYrE0ZnozMHJDEWVhNcTXN/tcgfp57duLqaqogYArVbDjDmTiY2NCdwLKpXU4/UUDj326m7R6ZPR09jcE5/X2+kL1YXH7elTnpHdzwCDUY/BaEClUiFJImL3DgoCkkpCrVEzbdYkxk30R3uSJP+53e+D3bgVRUPYCedMcaUsy//bfSDLcosgCFcCj4XxGsOCrhj3fXWo9WepVRJZKQwHNq7bwpsvf0DZzgrOOPdE5h42k9i46B7rqvVaio6bztKnPg2USWoVCQVdISwLx4zid/fcwLpVG6mpquOsC05mxuzJvPXCeyxdsppjjlvIJVefw+PdooUctmgOdruTay+6HYNBz5nnn8zMeVPQarUD9r0VFPpCS3k9JT9toLWigazZo0kdn4M+yoSlppnKVdtx2xykTc5DUkts+2o1k85eSO2mXax69RsSCtKJHJPOL7+s4pP3FzNmQhGnn3sCBUW5XHfLpfzfb//B3MNmMH7SGJoamqkor+aFi97AaDJw6tnHs3HdFqoq/DsDoihy0mlHD/GvoTAURCTHEp2RQEt5faAse84YfB4vK1/5mrbqJnLmjCV5XDb6yOBQ226Hk/qtlWz/bi0anYa8wyciRBn4+ftfefeNT8nNy+SsC05hzPiC/fZj9Lh8fn/PDaxavo76uiYuuPwMisbkEZcQG6hjMOj5zW2Xs3HdFn75YTmR0WZ+d89vmDB5LO+8/jEfvPkZ+UW5nHn+SZgijHzx8bd8t/hnZs2bxgmnHUV2rpLULByEM879emCC3NmgIAgSsF6W5bDuwwyHmLhelxNL8VZMGX1XIrWXFRNVOL7PzrgKQ8JBG695+9YSLjz1euw2e6Ds5juv5rJrztvrOR6ni4bianYt24IuwkD6tAJiOyU5ANs3FnPpuTcFhUo756JT+HXJaspKygG4+KqzKSwaxTeLf6ZoTB5JqQn84Za/BeqLosijz/+duQtnhPPrHowctGNzONFe28I3/3wDl60rEELhUVPIPWwiPz78Hu11LYHyhMJ0Co6eSvG3a6nZUAqAOS2OZW3VvPtW10txTFw0L7/3P6KiI1m3aiPbt+7kyf+8yOXXn8+j/3o2UE+SJB566j4+eW8xRpOBk888hvGTRo+EjLXK2Awz9tYOypZuxtlhx1LbQlRaPDFZiax4cTFuR5caYMxJsxh97PSgxcPKNcX88uQngWNjrJnKeJH/PfR8V5nJwCvvP05uftY++7Fj604uOPW6/T43Pvvwa+648S+BY0mS+Pt/7+a31/8pUHbcyUfS3NjCr91CZOYV5vDkK/8mLr5XsVgOhENmVTWc0XK+BN4SBOEIQRAOxx+z/ov9nDMi8bmcfZbk7EZUqRVpjsKQs31LSdAEDfDs/16lvrZxr+eotBqSx2Qx87JjmXjmgiDDHmDH1pKQGMjvv/kZhy2aEzh+8ak3iY+L4cEn7uWcS07lzZc+CKrv8/n46dtfD/BbKSiEl9bqxiDDHmD7t2tpq2wMMuwB6rdWIIpiwLAH0OfEByWyAmhubKF4WykRZhPjJo/h/Tc/ZcacyXzzxY9B9bxeLyt/XYPL5SI9K4XJ08aPBMNeYQCw1Daz4cNfKPt1C852G8Xfr6W1siHIsAfY9uVK7N3i3HtdHrZ9HRxfPqIoleefeiOozNphY9uW4v32Y9vm4pDnxnOPvUZ9XUPg2Ga18+Ie7Xu9Xlb8uoaY2KhAWUZWapBhD/6Xh90LQQr9I5zG/e+Bb4Brges7//93YWx/2OB1OvssydmNqFJ09wpDjySF6nnVGjWi2PeFDa/Hg9ftQZRCpxOVWhWiB92dglwURVQ9aIjVmgO7txQUwo3QeT9EpceTPC4bjVGHKIl7vU8EUQheG5RB6kE7v/teEQUBtVqNx+Pt0XBXqVSUbC+jw6IEYjgU8TjdyD4ZoXPO1Bh16CKNqPXaHqW9giQGC/QFAWnPceWTexxrPT0T9qSnOV6tUQf5YwmCgEajCa2nVuH1+oLq9fYaCn0nbL+iLMs+WZafkGX5DFmWT5dl+UlZlvfv5TEC8bn6HuN+N4JKjU+JVawwxBSOySM6Jjja029uuzxIO7k/vB4vdVvLWfL4x3z/8Lvk5mSS2C3eMcC5F5/GV5/9EDiet3AG2aMyATAaDZx/6RlB9TVaDfOVeMgKw4So9Hgmnb0QY6wZe2sH2bNHM+WCI7C3W4nOSAiqmzVrNJHJsWTN6lKiWnfUcv6FpwbVy8hKI7/QHyE6wmzi2lsuYdkvq1l03IKgelqthjETCqmtqeeIY+YP0DdUGI50NLax5fPlfPvAW6x583vUBi2Tzz2M2Oxk7C0dpIzPITozMcSRe+yJszBEd8W5l9QShUdNDapj2VbNdTdfElQWExdN4Zj95xspGpu/3+eG3qDjit9cEFRHp9MyZcbEoGhqO4t3ccyJhwfVmzJjAtm5mfvth8L+6bfmXhCEj4GngC9kWXbv8VkOcAlQJsvyc/26UCfDQZ/XXlaMpNWhjjD3+VxnSxOCpMKYooT+GwEc1NrRHVtL+HbxEsrLKll03AImT5+AeY8EJfuiYUcV3z34diA54diTZ+E0qVm2fC2lOyuYt3AGeXnZrF61gdWrNjB5ynhmzJ5ETlFX6ov2diurfl3L4s9+wGjSc8TR85g+e3JgdV9hrxzUY3O4YKlt5pt/vInb3iXNyZk3jqaSapLGZAICHY1tpIzLJrEoA0N0BLaWduq3VlC7eRexuSmYsuJZt2Er33+9hKIxecw/YnaQ06DNamftqo2sWbGe9Kw0lv+yBqNRz+z509hZvIvJ08czbmLRSLonlLHZDzxOF8tfWEzlmi6ZTOExU6lYtQNrQ1eez+Rx2Yw9aRY1G0ppr28ldeIo4vNS0e6R2Mrj9tC8s4byldtR6zSkTR6FKtrI6uXr+fqLH8nMTuewo+aQV9C7lETbt5bwXbfnxpTpE0ISW9ntDtav3sQXH39LZJSZRcctIC0zlRVL1/DtFz+Rm5/FwkVzMBoN/PrzSpb+vIrJ08YxZ8F00jJS+vHr7ZdDRnMfDuM+CbgVOB1oBhoAHZANFAOPyrL8YT/7GWA4TARt2zehjYlD0un7fK673YLX5SQiM3cAeqYQZpSH1D5Y+/YPbP9mTeB49PEz2PzpMiKSoolIjKF20y5A5pg/X4Qptm85IRT2izI2B4GKVdtZ+vRnQWWiJJJ/5BS2frkCtV6LIdrEjCuOJSolbi+tHHIoY7MftFY1svgvrwSV7Z5b9+TIu84jZo8dJIV9csgY9/32zpFluRa/tv53giBkAcmAHdguy7Ktv+0PR3wuF8IBOtQKKhW+jvb9V1RQGKa4nS5EUUKlC9ZV7tZQJk0ahSragMvqoK2yocf4+NYOK1qttkfNvYLCcEHsQYcsqiRkn19x6rY7sThdPY7x3XS0W9HptTjsTnR6bYje2Wa1o1JJaLTB95Pd5kAQBXQ6JSzsoYQgCAiigOyTg8pCK4IoCng9HnweH2pdqM59f1itNjRq9T79nJxOFx2WDqJjo/a5e+RwOJF9MnqDbq91FAaPsD5ZZVkuA8rC2eZww+fxICMjiPt3PukJJVqOwkjF2WGnZkMp279dg9akp+CoKUhqCa/bb+iodBrSzp3Ncy+9T1V5DUceO5+5FyzAENOlAa2tqefLj7/lg7c+Z1RBNhdfdQ5jJxQO1VdSUNgnUWlxGGPNWJu6tMKjFkygfOW2ruOFEzDGh+5MVZZX88l7i5GRcdid/PjNUorG5XPB5Wcyemw+TY3NfPvlz7zx0vukpCVx2TXnMXHqWKwdVpb8sIIXn3oDrU7L5dedz7RZk9Bq+268KYw8TAmR5B02MWhX1OPxEjcqhcbi6kBZzpyxyD4fy579AktdCzlzxpI2OQ9D9P6llfW1jXz1+Q+89/onZOakc8nV5zB+0uiQemtWbuCtVz5ky8btzF0wg+NPXUTR2PygOk6ni5W/ruGZ/72K0+Hk4qvOYc6CaZgiei/xVAg/YYtzP1gM9Raex2alo6IUY+qBJVqQZZmO0mKix01C2Mdqj8KwQNle7sbOJRtZ+fLXgWNthIGZlx1DQ3EVHocLb3ok1192BzZrV6i0My84idv+cD0Ggw6328ODf3ucV597J/C50WTg1Q8eJycvazC/ysGAMjYHCUttM7WbyrDUNpNYmIHb7qS9vhVrowVzcgyiSiLv8ImouxnfdpudP9x6P/V1jSQmxQU5lZsjI3j1w8f5/qtf+Pdfu3I8qjVqXn7vf1RV1HLbtf8X1Idn33iYabMmDfyXDQ/K2Own9jYrDTsqqdtSTkxmIolFGSAI1G0pp7msloSCdMxJMXz7r7fwuroyjBceM41xJ80ORHnqCZ/Px2MPPsdTj7wcKNPptLz64RPkFXbp7nds3ck1F95OQ31ToGz2/Gnc/58/Eh0TFShb/stqrjj3lqBrPPjEvRx5bLCD+DDhkJHlKNZlH/E6HQcc4x46t9w6M9X2BtknU/zDOn54+D1Wv/k99jYlJJrC4OOyOdi2ODgmsbPdRvOuOsaeOIuJZy5gZ0l5kGEP8MFbn1NavAuAupp63nz5g6DPrR02ireXoqAwXDEnxZB/xGSmnn8kKq2ala98Q8mPG2iramTrFyvY+OEvWBstQedUVdTw9ec/dMav/ynoM0tbO9s2l/DCHrHA3S43WzZs542X3gvpw1ef/xhSpnDwoo80kjG1gGkXLiJ3/nhM8VGY4iLJnTeOaRcuInN6IZba5iDDHmDHN2uwte5b9ltf28DLz7wdVOZwONm2pSSorGRHWZBhD/DLjyvY2Tmf7+brz39gT1557h3crt7ZOAoDgyJ47SNepwPxAGPc70ZUqfG5nEia/Wsp17z9A/Vby0mfmo+lppmv/voq8286jahUxXlLYeCRZRmLpR2NSoVKp8EQG0HS9Hx8TjflP25GpVPjdrrB5+tRP6/TaVGrVbS1WlCpVGi1GmJjo5k0bRz1tY2sXrEedT9elhUUBhKv25/DQdOpIxY6Y3B7HC7aOxMICWJo3HtJpUKlkvC4PWg0ahyO4ERYKpWEXq8jOiaS6bMnI0kS+UW5ZOdlEhkVKvExm40D8fUUhjGyLOO2OZG06p5zJfRQJmlUgZj4e0NSSej0WowRBqbOmEhjQzOrlq1Do1Hj8/lob+/AYDCg7mE+lyQJlUqF0+nC6XBijowgwmxCo9Uwa+5UVGqJpT+txBxpRhAFOtqtSJKk6PCHgLAZ94IgzAH+BGR2tisAsizLvYuvNELwOZ2I/UyyI6pUvYp1X7t5F1VrdjD53MNR6zTEj0rFFB/Fj/99n0V3nYc+UpnwFQaOqvIaPnjncz774GuKxuZx8ZVns2r5ep555GkizCYuuvws9PFmfnj4PbxOF7nHTyY1PYmqitpAG1f+5kI+/+gbvvzkO+YsnM5DT/6F775ewpLvlpGanswf/3orhWPzhvBbKij0TGNJNVs+X057fSs5c8cSn5dGW1UjUenxtFZ0ZeQsWDQJY3xU0LlpGSlcfPW5fPXpd5x2zgm89sK7gc+ycjOoqarjd/fcwKpla/nhm6XEJ8Qyefp4Xn76LU44/Sgsbe0s/2U14H9BPuyouYPynRWGB+31rez8eSOVq3cQm5NMwaLJRKcHR8WJTo9HHxOBvblrpX7cybMxRO1b6x6fEMefH/g9y5es5qfvfiUxOZ677r2ZzJx0Hrr/Cb754icmzxjPeRefxtgJhWxctzVw7hnnn4goCNx81R+pKq/mjPNO4ohj5hNhjuDLT77D5XJxyVXnMHvBND55bzEvPvUm5qgIrr7hIqbOmthjciuFgSFsmntBELYCtwCrgEDyKlmWm/Z60gEw1Pq8th2b0UTHojqAMJi7cTY3IWo0GJJS91pHlmUW3/cqaZNHET8quF7Z0i3YWiwsuOn0fWrrFPrNIasddTqd/Ol3D/DpB18BkJqezJkXnMTD9z8ZqCOKIg8/fi/1H/jlOpJGQ84Fc1m1YgNVFdXMmDOFJT8s48O3vwick5uXxbhJo/ngLX94Qb1Bz4tv/ofC8QWD+O0OCg7ZsTkYtFY28PXf38Dn6crDmDN3LA07qkgem4WkVmG3WEkZm03cqBR0PaysNze1sGbFRmpr6oiKjmTF0jVERvlzo3zx8bccc+LhPP/E64H6KrWK6265lEf/9SyPPPs31q3ehFanZfb86YwZWfeHMjb7gdvh4tdnPqNmY1mgTBth4Mjfn40xrmtXp7Wykao1O/C43Dja7ZiTYlBpVeQumLDPqDY+n4///vNpnnv8ta72tRp+d88N/OWufwfKEpMTePipv7BmxQaKt5cyYcpYcvOzuPTMG4MkN397+A/cdfNfg65xz99/y9/v+Q9OZ+fuliDw/Fv/ZfL08Qf8u4SJQ8ZgCqcsp02W5c/D2N6wQ5Zl/8p9P2UEolqFz+nYZ536bRV4nG7ickMTOmTMKGDt2z9S8uN6Ri2c0K++KCj0RHVlLZ992OU8e/ZFp/De658E1fH5fKxds5m8+EisDW14XS6avt3MpbedjaRWsXrF+iDDHvw6zu6OVnabneJtpYpxrzCsaKtqDDLsAXYt28qohRPY9tUqJI0KbYSBwqOm9mjYA8TERnPEMfMA2La5mMcefI7GhhbsNjtnnn8SH74TfG943B5sVjuiKLBx3TZ+c/sVA/PlFIY11sa2IMMe/P5NltrmIOO+rbqRTZ8uQ6XToDFo2bVsC5JKImV8LsbYvSfYrKtp4LXn3w0qczpd1Nc27lGvHktbOxdcfmag7KN3vggy7DOz0/jpu19DrvHB258xceo4li3xL/zIsszSn1YOB+P+kKHfxr0gCJM7//c7QRAeAN4DAgJDWZZX9/cawwXZ278wmLsRVGq8HR37rFPy4wZSxmX3GN9WFEUKjpjMuvd+InXSKEWeo7BXnB12RJW01xjIHZZ2HFYnccnBPhy79fHxiXFMmjoWo9GA0WQkKjqS2QumYbPaWfLDcowmA+aEGAwpMbTuqEZr0kHnmNXsRb4mScGrSlqdlpaGZkRJIrIztbm1w4bH4wmsdCooDCZid72xAAkF6UQkRiOo/GPX6/LgtNgQVRKOdhsagw5REnE5XbQ2tWKKisBhd2I06bF22NHoNLS2WLDb/A7ndpsDk8lAc2NL0HUjzEYEUexRo9zebgVZDskGqnBwIUoigihiSogkNjuZjvpWGkuqg8ckfu28IIpkzBmNOkJPw9pSrE1tiJKE2+6POa8xho4jtVqFwWQI8QORJJHcvCzGTCikbGcF61dvCsm9sGc4Vv84DrU/IiJMWCzBNk5E50twS3Mrer0Ond7fN4/Hg6Wtg4gI4z7j7Sv0jXCs3P97j+Op3f5fBg4PwzWGBV6nA0mj7TmhRB8Q1X6H2r3hdrio3VTGjMuO2WsdY5yZxKIM1r//MzMuObpf/VE4+LC3dlC+cjvF369FZzYy9sRZxOenIXYa1l6PlxVLVvPEIy9RW1PPKacdw/GnHkl6Tjrgl+H87eE/8uO3S/n155W0NLdx/a2XsuLXtXz9+Y+YIozccsfVFI3J5+9/+g8Oh5OzzjyeqUdMCDh/ZedmcPwpR/LpB107AEefcBirV2wIHGfnpKPWqrnozBvQG/TccOvl+ASZJx5+EUtbOxdecSZHHb+QmNjoQfz1FA51otPjMcaa8TjdFB03nao1xdSsLyVpbBZ5h09i50/rmXnFsWz4YAmNJdWkTBiFoTCJ1196j+z8bHbuKOPXJasYPb6AmXOmsGb5ev7yrzu565b7sFntfLv4J669+RL+/dfHA9eMS4hBUqm49c5rmDB5TKDcZrXx0/fLeOo/L+Hxerny+gtYcORsxcg/SDElRDHz8qOpXl9K3dZyIpNjmXrhkUQmxwbVi8pKIO2M6Tz+xGtUVtZy4slHcsyFh9FcXsumj3/F43RTeNQUUieOQmvqkhHHJcRyw+1X8Oc7HgiUpWWkMGHKWMp2VrBsySryi3K59193kDsqK+iaRePySUpJoLa6HoD6ukYWHDmbT95bjN3uVyNIksQ5F53KjVfcFTgvwmxi8vQJPPbQ83z49udkZadzzS2XEBMTxUvPvMWP3y5l6oyJXHLNORQUjQr3T3pIEk7NfY4syzv3V9ZfhlKf52hqwG1pQRef1K92ZFmmo6yY6DETe9wFKF+5jR3frmXcybP32Y7H6WbFS18x/8ZTiVZSUA8EI1Y7uvXLlax//+fAsSAKHP7bs4nN9o/d9Ss2cMm5N+Nxd4VSu/TKs7nxjquRVBIOu4M/3nY/iz/9HoCo6EjOu/R0Hnvwua42BYHb776OB+79X6Dsbw//kRNOXRQ4rq9tZM3KDWzZuJ3R4/IpKMqjdHsZq1esJzU9ieS0JG666o94vX4JxK13XcND9z9J93np7vtv48zzTgrvDzTyGbFjc6TQXteMpbaFX5/5HG+3+yRzRiG5CyfyyxMf4+gMTVxw2mzufeAxsvOyqK6sCXJCjEuI4diTjuSjd77ggUfv4ftvfiElNYnpsyfRbung+69/QSVJaHUannvidTxuD4+9+A9mz58OwM/fLeO6S34X1LcHn/wLRx4zfxB+hQNCGZv9wG138suTn1K3tTxQpjXpOeKOczB1k+VsXL2ZS865CZezKzjHeRedyuzkbGrXd4UXnn7JUWTN7EpQ5Xa7eenptwCo3FWNOSqCnLws3n39Y9au3BioF5cQw6sfPEFyamJQ/0pLyln561pqq+uZPnsS4yeNoay0guVLVuF0uZk5ZwoFRbls3rid5UtWYzQZmL1gGq+/8H5QKGStVsPNd17NP/70SKAsOTWRl959lMTkAbNnFM39AfAOMHmPsreBKWG8xpDidToQ1P339hYEAVGtwet0otIbQj6vWlsSMML2hUqrJmNGIeve/YmFt5ze734pHBw4LFa2f7smqEz2ybTsqg2Mqx3bSoMMe4A3Xv2IM88/ibTsNKqr6oIS78ycO4VP318c3KYsU15WRVR0JK0tbQC89vw7HHnsfHQ6f5jXhKQ4jj7hMI4+4bDAeZk5aSw8Zi7WdiuXn3NzwLCPiY2isryGPRccXnn2HY454XBlpVJhUIlIjKGloiHIsAcoX7GN7LnjAoY9QLvPxY7tpRx+zHwWf/pdUP3G+mYMBj1trRZcLjd3/OnGwGc1VXWsWbGOkh3lAckOwNqVGwPG/ScfBN93AG+9/AGHHzV3n46TCiMTa5MlyLAHv7yyvaY5yLgv3rYzyLAHeOfNTzn+2X8GGffbv11D2qQ8VFq/5KW8tJInHn4Bp9NFXEIM1nYbF115dpBhD/5xW1pSHmLcZ+dmkJ0bnMSzaEweRWOCo55NmjqOSVPHAf5sze++/nHwd3K6aG0Ozg9RU1VHWWnlQBr3hwzh0NwXAmOASEEQTuv2kRk4qIKb+hx2JGN4DIzdse7Zw7j3+XzUbt7FlPN6p2ZKHpNF5eod1G2tILEwPSx9UxiZ+LxenB0OBAG0Rl2Q8QGg6qa71+lDcyyYI02BUGUajRqdThvYarVabZgjI0LOMej1gYgIAHHxsah6iL/cEyqVRExsVODY4XCiN+jQ6bTMO3wWBqOen79fRkxsVI8xlxUUBhqd2Uj2nDHUb6sIJKpS6TRI6uAxbo4yc/q5JxIZFYEoivh8vqDPd/uZaDvvQVmWaW5s6ZTJCUGGPYApokvHHJ8QLMcAiE+MUwz7gxRRJSFKIhFJMcRmJ9HR0Er99kokTfAcqNOFmlemCCO4g8eeLsKIIHUtWKs1aiIiTcRptcyYM5nG+mYEQUCSpMBCy260e/HV6i3NTa2o1SrUGjVGk5G21mBjfk//KwCdVgmXGQ7CMTsUACcAUcCJ3f4mA1eGof1hg9fpQArDyj2AoFbjdYbq7lsrGtAYdOgiQlf0e0KURLJmFLHhg59DVjz3xO1y887rH/N/v/07Lzz5Opa2fWeyUxg5tNe1sPrN71l836useu1bRh8/I+hzXZSR2KzkwHHRmHxS05OD6tx0+xUkpPpXTFLTk7n+tssCny39aSXnXHxqkEERFR1JUmpCwDBRqSQuvOJMVKreGeJavY6LLj8r8DJgs9rJyErjN7dfTmnxLpYtWcUJpy7iN7dfEXC+UlAYDGSfTP32SjZ8sISajWUkFmUGIpONWjiB6nU7mXze4YgqiaSjxvP8s2/x3eKfqKqo4ewLTwlqa/rsSezYtpNpsyaRV5hDTVUtjz30PGcddwW3XXsPV1x/AUkpXSuVMbFRTJw6NnB8zAmHo+82/tUaNWddcPLA/gAKQ4YpPpKZlx+LOTmGqnV+VfO0CxdhTgl+ySsam0dmVlpQ2U23X0HNr9sCx4IoUHj0VKRuc3JGVhr/97fbmTVvKj99+yvNTS1kj0rn/MvOCGprwRGzyc3LOqDv0NTYwmsvvMu5J17FJWfcwOYN2/jjX28LqpObnxWyK7DouIVkH+A1FYIJp+Z+lizLS8PS2D4YKn2e7PPRsmkNpqxR/XaoBXBZWpG9Xkzp2UHlW75YQfOuOvL6EOJS9smsfPVrppx7OEljsnqsY2lr5+oLbkMQBCZOGcvO4l3s3LGLJ1/5F9mjMvvzVQ5mRoR21G13suTxj6nfXhkoi81JZswJM2kpr0dr0hGXm4o5OSbovOJNJaxeuYHGhiYmThnL+MljMEV27UxZLB1sWLOZDWu3kDMqk472Dlqa22ioa0Kr06DX6ygqyqV4005cbjf5mRmMysskc0rvw1q63W42rNzE6hXr0eq0ZOdlct0lvw+qc9e9N3POxace4K9z0DIixuZIpaW8nm/+8QY+b9cqaPbcscRkJFK+YisNO6pInZBL8rzRXHf1XVRXdiVuO+uCk5k0bTylxbtIzUhGo1YjigITp44jISmOh+5/IqB5Bn98+0eevZ/VK9ZjNpuYNG084yeNDurP1k07WLV8PT6vl8nTxzN6XEFYnkMDhDI2+0FP87nGoOXIO8/F1C1ZWktFPWUlFewoK6exvokxY/NJNJpJLkinYVslHqeb+FGpRGclBi3KeDwe/nXfY0HhMFVqFa988DgNtY1s2bid7FEZTJwy9oDlMW+/+lFQzHyAp197EIC1qzaRnJLApGnjMBgNrF+ziW2bisnNz2LC5LEkJMX11GS4GLY3TbgJ5173eYIgnLtHWRuwUpblD8N4nSHB67AjqjVhm1BFlRq3zRZSXr+1gri80Nj2+0IQBTKmFbLx419JHJ0Z0kePx8ONV9xFSnoyZ19wMoIgcNhRc/nlxxVcef6tvPnJ08TGx+yldYXhjrXJEvQgAGjaWYPP66PomGl7PW/UmFxGjcnd6+dms4k5C6YzZ8F0LG3tnHfS1ZSXVRFhNuF2uXE4nFx2xdmMsmtx21w0lW7GV9pI2vhcpF7KaNRqNZNnTWTyrIkAPP7Q8yF1XnvxPY4/dZGiuVcYNNqqm4IMe4Bdv25Ba9DRsKMKgKp1JUijk4IMe4C3XvmQE05dxPGnHBnSbk1VHW++9EFQmcftoamxhRv2Ede+cEwehWOUTM6HAj3N5y6bE0ttS5Bxb6luYscbP6HSqcmMMFD30WoaVBLpf76YUQv2vjhYX9fEO68F6989bg8l28s48bSjWHDkvgN57I+OdmtIHH2A5b+s5obfXsmMOcFumIctmsthi5QMzOEmnKI9LTAR2NH5Nx6IAS4XBOHhMF5nSPA6HYhhTJ0sajR4XcGJrHxeH02lNUSm9v3NNSE/DYfFSv22ypDPXnr6LRx2J2edf1KQ4T97/jSmz57MXbf+bb+SHoXhi6iSEHvQuas0fX93t9sd1Nc2BOnowW+Ex3Zqf9stHYEYyeYIE84OO26Hv74xxky7pYPqXdW43W76SlRMZEhZfGIs6gP4LgoKvcVptWPv5qPS072jNelw2Z0IgkDS6EzyjpgUIhebPG0851x8apBmvjsarYao6NAxbjDoaahvok2RSh6SyD4Ze2sHLptjn/O5paWNipIKbB1WpE4HWY/DjbXBH9BAY9D2eG53NBo1kZERZOWkc/aFp3DksfNRa9QYDPp9ntdbVGpVj34i0Uo440ElnMb9KOBwWZYfkWX5EeBIoAg4FTgqjNcZEjwOG2KY9PYAgqRC9nqRuzmwtFU1oo3Qo+nB2XG/7YkC6VPy2fLZsqDyhromnn3sVS68/MweHbBOPO1oqitq+OLjb/v+JRSGBab4qBCNfdLoTMypoRPsvti8YTu3XfN/nLroEv7v9r9TvK0r4oLeoOPq31yIJHU9OGLiohmVmorX5Y8mYoiJgPx4rr34d5x14lU88KdHKd1e1qc+TJ81KcjJVpIkrr7hoh6dxxQU+ovH5aFy9Q6++cebfPXXV9m6eCX2NivRmYlEJAXvZuYfMZnaTWVMOHM+HqebsqWb8Va1cuKpR6FSq7j1rmswGPV8+v5X/PefT7N1046Q68XGRXP73dcHlWXnZuDzeTnzmMu46LTr+f7rJSFRUBQOXqzNFjZ+9Atf/uUVvnvwHZzttpAd1+QJOdS0tXL79X/mnFOu4Z7f/pN2PETtsRA48cz5+01qGRcfw1/+fScTp47ji4+/pbysit//328oHJsflu+j02m58sbgZ0VUdCQz5xw0gRNHBOHU3G8Dpsuy3NZ5HAksk2W5UBCENbIsTwrHdYZKn9e+czuS0YQ6TNFyAKxV5ZjSs1EZ/Dfjju/XUbupjIIj94wo2jt8Xh/Lnv+S+TecEoh7/5e7/k27pYMzz997nPDtW0p44ck3+OSHV9Hq+v5icRAzYrSjLquD5l11tFY2YIyLJDY7CUN0aHSbvVFdWct5J18TlDEzvyiXp197kOiYKAC2fr2KqqYmdlZWodfpyIhPIG/sKBq3V+Lz+ZCTzVx+0W1B6clPPPUo7r7/tj45xO4s3sW6VZuw2eyMn1jE6PEFQQ8KBWAEjc3hTN22Cn54KFhCMPmchYxaOJGOhlaadtbgsNiIzkrEEG2io76NpU99GtipAkhfOA45wcj99z7CrtKundPEpHhefv+xIGdZ8EeF2rR+K5vWbSMmLhqtVsPvfvPnoEglz7/9CFOmjx+gbz3gKGOzl8g+mfXv/8y2r1YFygRRYMZlx2JtaPVnPzbqEBPMXHPVHbQ0twXqFY4exX+fuA9nbWtgjMZkJu13x9bt9vDAvY/yxkvvB8pUKolXPniC0ePCY+B7vV62bNzO+jWb0et1TJg8lpy8YeHbp2juD4B/AmsFQfge/w84H/ibIAhG4Ot9nTgS8DjsaKLDq0sX1Wq8TkfAuG8qqcacdOBbV6Ikkjopl61frmDWlcfTUNfE5x99w1/+dcc+z8svyiUlPYm3X/uYC/bwmFcYGWiMOpJGZ5I0+sAm0F1llUGGPfhf+ip3VRMdE4WtpZ2dP6yno6GNGLUK2ddOrbcOs6imbvMuOhraEGdmBhn2AJ999A1XXHse2QXBjuP7ImdUJjmKk7fCIFC3pTykrPiH9WRML8IUHxWkcQawVDcHGfYAFd9vIOXkqUGGPUBdbQPlu6pCjHudTsuU6ROYMn0CLc2tnHPCVSEhCNet2jiSjXuFXmJv66Dkpw1BZbJPxlLdyObPlqPSqvG6PEQfNTbIsAfYurmYqsoapszp22JgQ10j777xSVCZx+OleHtp2Ix7SZIYO6GIsROKwtKeQt8JmyxHluVngdnAB51/c2VZfkaWZassy78N13WGAp/Xg+z1IqjUYW1XVGnwOrriGzftrMGc1DcpxZ6kjM2mdnM5tuZ2Xn/xXWbMmdxjfPI9OfG0o3ju8deU7eARjM1mp7K0irY9HgK9wdDDyrokSej0OmzN7YCALsq/a+V1ewLOhvooEwmFaWTPGYNBr0Oj1XD0CYdx4RVnkV+US2RUxAHtBjnabdhaOxRfEIUBpScJgz4qAmkvumWxh7jcolrCHG3moivPYsYehpZGo8bW3I7bHhr2GPxZOuMTQ32sonvwPVEYmexrLpPUKnTmUK270LlT6XG6kWUZvSF0flapJPQGPc31zVSWVQUtrHQ0tGGpbe6xP1qdlpiYKPIKcrjg8jM59qQj0Go1mEy9C7+tMDIIdxYMEWgAmoFRgiD0Kj+2IAhRgiC8IwjCVkEQtgiCMCvM/eoXXocdURO+SDm7ETUavE6/ce+0OnB02P265X6g0qpJHJ3B1q9X8c7rn3D4Ub3zQs/MTiclNZFPP/iqX9dXGBq2bdjOH2/+G6cdcynXXfp7Vv6yZv8ndSMnL4sTTz86qOzSq8/FuqWKz//0Ikue+IjCRVPQdTOGUibmIqklKleXUL5iGzlZGfzu/35D8bZS3nntY7JzM7jv33eSktn76E8ep5vyldv4+v7X+fLel9n82TLsrR19+i4KCr0lPi8VnbnLqBElkcKjpoQkDAKo2VhK7eZdJBR0xRaX1CoyT5vBfx9+jjdf+gCfT+b2u69Ho9Ww6LiFfPbB16z4YSVLnvyUxpLqkDYNRgO/ue3yINlZYnJCILOnwsjF43RTvmKPuawteC7TmvRMOH1+kFgkIikmJGxxlFbPUcctDCq79Mpz6LDZuOzcmzn92Mu5/+6H2bm1lOIf1vHdg2/z7QNvseHDX2ivC96RjY2L5t5/3UH+6Fzee+MTtm4u5rY/Xk/hWCUa08FEODX3/wDOBjYBu2OIybIs713s3XXui8BPsiw/IwiCBjDIstzaU92h0Oc5Gutxt7ehi0/cf+U+4HU5cdTXElU4jtpNZWz48BcmnD6v3+3aWztY9srXfFy+iRvvuLrX521av4333/yUD755aTjHUB5MRoR2tKm+mRuvuJMN67YGyowmAy+//SijRu891GVIOw3NbFy3larKGjKz0lDV29j17brA55JaxbzfnExLeR2SRo3ObOCXJz8NfB5/2Ghuu+vveDxdEoMTTjuKP/39t2h6mXWwJw30xDPmk3+AfigHMSNibA536rZW0LC9AgQB2etDpdOgMerInRdsXDfurOGHh97B6/aSNWs0prhIvB4vusw4rr3qTurrGgN1U9OTufmOq/nqsx9Y/Ol3REaZue93v6FpeTGL7jqPiMRg6aXH42HLxu1s3ViM0WRgzIQCMrNHdLZxZWwCdVvL+eHh94LKJp65gPwjgt0PvW4PLeX1tFb6E1jGZCWhMelo2VWHpboJQ6yZmMxEmppa2bJpO9VVdWRlpxOTEM1FZ9wQJOk67azjmBmZiqWyazxOOH0uBYumBo7dbjf33/Nf3nn1o0CZJEm8+sHjjB7f+xwlI5RDxrAJp+b+FKBAluWe9x/3giAIZvz6/EsAZFl2AcNKG+KxW8MaBnM3olqNz+1C9vlo3lUXou88UPRRJpptHSyY0PtEWACjx+Xz1isfsmLpGqbPVoypkULVruogwx7A2mGjrKS8T8Z9bHxMIMZxW3UTX77xctDnXrcHl80ZeFCsei04wlJda2uQYQ/w2Qdfc+3Nl5Ley9X7hm0VIWUlP20ga/ZoND1sTSso9Ie6LeVs/XKFfzFDEJB9PiKSokmfko/G0CUna69txuv2j+2ypZsBfwjalNOmBRn2AFUVNezYtpPFn34HQFurhVaHHY/TjaWuJcS4V6lUjJs4mnETgxNXKYxs6rb2MJf9uJ6sWUVBc5mkVhGXm0JcbvAcmViYQWJhRuA4LcpEWm7XrtF7r34c4qvx0XtfcsR9dwYZ97uWbSNz1mh0nbKbhromPnjrs6DzvF4vxTvKDgXj/pAhnLKcncCBiNJz8Et5nhcEYY0gCM90OuEGEAThKkEQVgqCsLKhoSEcfe0TXrsdURt+w0IQRESVGq/LSVNpLRGJUWFpt7mplY2VFcQ4xD5plgVBYMGRs3nthdAEFAo9M9RjE/wxsrU9rIwbTfsOibYvVBoVal1om6puZcZYc9BnOo0GnU7LCacexaXXnMuY8YVEx0ah26Mdr8eDtcmCs8POnuzW9XfHEGMOSp+u0DuGw9gc7hii/eNNlmVkn3/D2Rhrxuv2YG22BHxLVD3cC5JK6vEeE0URqTPs8NSZE7ns2vNISE9AlMQe76lDkUNhbO4eW90xxpp7neBvf/SUSyE2PgafPXhtVB9lRKXuMs20Oi1x8TEUjc3n0mvO5aTTj0Zv0O81N4PCyCScxr0Nf7ScJwVB+O/uv16cpwImA493hsu0AkHhXWRZfkqW5amyLE+Nj48PY5f3jyzLeJ12pAFYuQcQNVq8Djst5fWYEsOT5OHXn1cSnREPPh/O+r45V86aO5XlS9aErEYp9MxQjs3dZBdkcd1NlwSVHb5oLnmjcw64TWNcJBPOCHaZSRqdGRRXOXlcFtqILmewREMEt999PevXbOLlZ98mKSWevz10V5DDYHtdC6te+YbP/+8Fvn3gLWo378Ln68oEmpCfhr7bQ1GUREYfN61HDbTCvhkOY3O4k1CQhi6qy6gRVRK5C8bzzT/f4PP/e5G1b31PR1MbUenxxOelBp075sSZ5I0dxTkXnRpUfvZFp/DzD8u4+Y6rUatVvPjUmzz40LMkHD+RyJT+BUw4WDgUxmZCfjr6PcZW0XHTw2bcF47Jo6hb1mJBELj9ruvoKO16WZLUEnmHT0Kl7TLuY+Oiufefvyc9M5VXnnuH1Ss2cPMdV1E0elRY+qUwPAin5v7insplWX5xP+clAb/KspzVeTwPuEOW5eN7qj/Y+jyPw05H6Q6M6VkD0r6zuQmfLPD1Q58y55oTw6J1v/v2vzP/iFnEoMFrd5G4cEyfzn/pmbcYP2k0V/7mwn73ZYQzYrSjbc1tbFq7hfKyKuISYhkzvoDkjOR+telxumgpr8dS24LObCA6MxHDHivrltpmWisa8Hm8tIkeLjn35qCt4qOPO4w///v3GAx6PG4Py1/4kspVXcl9BFHkyDvPITq9K1xge10LLRX1eF0eItPiiE5PUHxAQhkxY3O4017fQsuuerxuD4bYCJY//yX21q5stflHTmbCafOw1LfQUlaHs8NOREIUsTnJeFwelr/zHR06geY2C7GRZuKMJnSZcTzwl/+xYe2WQDt6g543P32KrJyMnrpxMKGMzU66z2VRafFEpceHbS5r3lVHefEuqpqbaW+3kpGeTKSoJSk3tXNO9hCZFk9cbkpQAkunw8l9d/6bD9/7MlAmiiIvvPEfJs446MOvHjIPkrAth8my/KIgCHogQ5blbX04r1YQhApBEAo6zzsC2ByufvUXr92GqB24xE6iRo2jvpmIhOiw3PTVVbV0tFtJS09G9so0/LQFj92FSt/7nYe5C2fw/BOvc/l15/eY1VZh+BEZE8nsw2cyO4xtqrQa4vPSiM9L22sdc1IM5s5Mnh+88WmIBvSrL37g2psvJqcgG0dLB5Wrg7N2yj4fltqWIOM+IjE6RJesoDBQRCREE5HgH28lP24IMuwBSn/ZRP4Rk4hMiiFyj6y1bdsqaFi9EwC9ADa5gXKg8LIjggx7ALvNTtnOikPBuFfoZCDnMktNM9vf/gUAUYTK5RVUiQJZf7kkxCG8O7VVdXz6UXDqIZ/PR0lx2aFg3B8yhM1yEwThRGAt8EXn8URBED7a50ld3AC8KgjCemAi8Ldw9au/eOxWRPVAGvdafB4nxvjwxDVesXQt+UW5CKKIqJbQJUXRvr2mT21k52agUkmsWrZu/5UVDipcNgcdDW2BRD3NDU1sWb+Nip3+BD0ej4fqilrq60J1smZzqMY0Ni46EKNZ0qjQRYTGUtbohyYrss/jwet04NvjhUShC1n24XU58bqHVYyDsGFracfW7P+zNlmITI2j8OhpRHaTnxliIoJkDd0JWjTp3AQXBAGDyYC+h9wRERHhy3Cu0IXPu/te9gx1V0KwtXZgbbIEyQ/3xO1w0VrZQHt9y17r7El3h+/d8Qn1USYkzb5dH/V6HQlJoVIos9lES1ML27aUUFdT3+t+9AWn00VVeQ3NTb3/ngoHRjiFrH8CpgPfA8iyvFYQhF6lpZRleS0wdX/1hgKvzYbaPHAJRUS1BlEEU0JUWNpb/stqDj+qK5ymIS2W1nVlRI3LQBB7tzMgCAKz50/j3dc/YdqsSfs/QeGgoLGkmtVvfEdrRQPxBanEzC/i8f+8yNIfV5CemcKtd13L1k07ePbx1zCZDNx617UsOm4BBqPfYC8YncekqeNYs9KfcdGvAb2W5HS/PEgfZWLi2Qv59emuSA3x+WlEpYcm8Rlo3B0WrFXl+JwOVBFmDElpqPRKEpfueF1OHA21OJsbEUQJQ0oaGnN0IMHOSMZldbBr+VZqNpURnZFAyQ/r8TjdZE4vRFSJRKbGkZCfRvEP65hw2ry9RmoyJ8aQf+Rktn+9OlBWdNx0skZl8JvfXsED9z4aKD/imPnk9iFTs0Lv8NisWKvK8dqtSAYjxpSMQNb3ocRtd1Kxagfr3/8Zj9PNqIUTyD9iEobo4Fw2LRX1bP1yJZWrd6AzGxh70hzSJuWi3s+iR1R6PLHZyTSVdi7eCTDp7IU9LqB0JyElgdvvupbbrv9TIODG2PGFJKQkcMvVd7N6xQZG5Wdz2x+uZc7CGQf+A+xB2c4KHnvwORZ/+j1JKQncde/NzF4wDZUSLGFACKfmfpksyzMEQVjT6RiLIAjrZVkO6z7PYOrzZFmmZdMajOlZiNLADcD6dRvwiGb0MVH9aqemup5//OkRrr7xQoRucpqmZcVET8rCmNF7I6rd0sEfbv0bX/36zqHsRX/IaEc7Glr56v7Xcdv8kWwzF03ksdfeCRjqAGqNmit/cyGPPfhcoOypVx9k5twpgePKsko2r9+OpbWdrNwMxk4qRGfocrr1uj20VDTQXtuMxqgnOjMhRMc/0Hgcdiw7toDctZIm6QxE5OQjjpwHzYCOTVmWsddW4WioDSqPyMlHbTLv5ayRQ/W6En5+/GPGnTKHDR8sCfos7/BJVKzcRsaMIjJnFBKZErtPeaLT6qClvB5bswVjrJno9ATqm1p47KHnyM7NwOFwotGoKS+t4vTzTmDytINe+jBo86bX5cRSvAXZ07ViL6jUmEcVDVgQjN5Su3kXP/73/aCy8afOofDoaYFjj9vNqle/ZdevwRKueTecQvKYrP1ew9bSTsuuOlx2F+akGKLS4/eaXbk7TruTTWu3UFpSjinCSHZeJrdf/yfKdnaF7zSaDDz35n8oGpu/3/b2ez2nkz/c8jcWf/p9oEwURV796AnGjBvU8JuK5v4A2CgIwnmAJAhCHnAj8EsY2x90fC4ngigNqGHvcbqxt9kxZ/Z/9XLVsnXkFWYHGfYAhvRYLFuq+mTcR5hNFI3J48tPvuP0c0/od98UhjcdDW0Bwx7Aa9YGGfYAbpcbjyd423v18nVBxn1aVhppWXvX6EtqFXE5ycTl9M/Ztz/4nM4gwx7A67Dhc7tGknE/oMgeD86WppByj816cBj3G0vRRxnp6EEGUbupjLi8VCpWbKXwqCn79TvSGnUkFQXr6CvXVPHJe4tD6k6bNfFQMO4HDZ/LGWTYA8geNz6Xc8iN+/ptlSFlO5dsImfeuMBOkLXRQtWa4pB6ltrmXhn3huiIkJ2A3qDVa5k8ayKTZ00EYOlPK4IMe/DnSiktqQiLcV9f28RXn/0QVObz+SgrqRhs4/6QIZxPshuAPwBO4HXgS+AvYWx/0PHYbUgD6EwLfqPK45ERZQ97V+T1jlXLgg2t3egSI2nfXo27zYY6svfSg5nzpvL+W58pxv1BTH1dIw67E70xeJyrETBHRmBpaw8q33MLNTk1EWuTBVmWMURHIEoi9jYrHqfbH195P/rPgUKWZXydOnFRrQlyVu9RViKKIS/FvcHrcoHs81/jYHI+F0UkrRaPxx1crPYbTHv+voD/WAZRoxkW0Y18Xi+25nZEScIQE2wARSREU27fhsbUtaukMxtIn5pPVHo8ukgjmTMK2XOhz2Gx4XY40ZmN+4xZbzAa0Bv02G3BuRwizH03xBT2jrCXhTdBkvC53cg+L6JKHbjnvS4nyPKg3K/GODP6KCPpU/KR1CpqNpWhjzIhdguFqdZpMMREoDHoiM9PxW13Ub5iGxqDFmuzBXubFY1eGwhaMFCYIkxotBpczmDfmqioCFqaWmlv7yAmLhrTAeZO0Rt0xCfEhoTYNkcqPigDRTij5djwG/d/CFebQ43HZkXUDGxWzI6GVmREkPvnCNTc3EpDfRNpPWQCFSQRfUoMbVuriZvR+1i24yaO5uVn36a8rJKMfazGKow8nE4X33+1hPvv+Q8tTa0cdfxCzjv7BHa8+TMAzb/u4IbfXs5f//hw4JyFR86mtHhX4DgjK438rAy+vPdlfF4foxZOIGlMFstf+BJHm5WU8TmMP23ugD+Y9sTnduForMfRWAcI6BOT0UTHIXUmcpF0ejRRMbhamwPnGJLTETW9f5GXfV5cllZsVRXIXg+ayGj0SalIA5DsbigQJQl9YirtpduhU7opanWoDEb/79vU0CnZETCkpCN7Pdjra0CW0cUmoItPDBj9Q4GtuZ2ti1dS8uMGVBoVY0+ZTeaMooDzdvLYLLZ/sxpREjHEmjFEmUgoSKf4+7UUf7+O1EmjMESZKFu6hdHHTScqNZ7azbtY9do32JrbSSzKYOKZC3qMW79l0w7eff0Trrn5Yh762xOB8iOPmU9eoaK5DyeSVosuPilIPqZLSsXnctFRtgOf2x3wqfHYrNhrK5G9XjQx8ejjkwZ08S5uVApZs8ZQ/N1aPC4P6VPzGLVgIqpuxr0hOoJJZy9k+zdr2PLFCrQmPYXHTscYF8nSpz+jubQ2kHMkeVwW0gD5uxSMzuWqGy7k0X89Gyg76fRj0Bl0XHT69ewqrWTytPHc+ZebKCjqezz8uPgY7rrvFm656o8Bnf+seVMpVGLrDxj91twLgvAxgTgBociyfFK/LrAHg6lrtpRsRR0ROaDOOVs+X4HWpCUuVY9Xm7D/E/bCt1/+zLrVGzn25CN7/Nxrd9H06w7Sz5iJqO79BPHGyx+QlZ3ODb+94oD7NoI5aDX3a1dt5KLTrg8qO/HkRVxyxok4Wjr8ERd0KppxUV5WRXRMJJlJSdSXVlPb1opGrSZGpSMxIZYNH3Sp7/KPnEzZ0s24rA4AUifmMvOyYwc1CZWjuQFb5a6gMmNGDtqorpcMr9uN12FD9rgRNTpUOn2fHEXd1nbaS4Ij/mpi4jCmZiAIg7KCP+BjU5ZlvA47XocdQRSR9AYkjTbk99UnpmCvqw4615CSji4usU/XCydbvlgRoqWf95uTSR7bZVx3NLTSWtGASqfBbXeytJujN0D2nDHUb6skPj+VgqOnsvjPrwSy2ILfeJt3/clBjo9Njc1cfPoNlJdVcvwpRzH/iJk01DcRnxBLflEOuXmHhHE/qPOmz+vBa++U1am1IAq0F28NqqMyRiCIAu52S6BMF5+EPil1wHaZajaV8dMjHwSVjTt5NkXHTu/Wdy+rXvuO0iUbA2UTz1zAzp83YKnpWnyQ1Crm33hqSCK1cNLS1MLGdVupLK8hLjGWtIwULj7tehyOLrlmXkEOz77xMFExfQ8y4na52balhNKScqKiIigckxeU4HCQGPotxUEiHE/cf4WhjWGHLMt47Da0cQducPeG9oZWzMnZgOzXAR+gYbBq+Tryi3L3+rmk16CJNtJeXEtkUe8niNnzpvLEwy9y/W2XKTHvDyJKS8pDyr784geOmTGdmp+60kwc/ruzmXvYTKzNFr7/9ztYmyyIgAeoB0zzxqGNMOBstwFQv62C2JxkajaUAlC1rgR7Wwem+KiB/1L471tXc6hW3N3WEmTcS2o1kvrAo2B5HY6QMldLM/qEZKQ+7AAMZwRBQKU3BEUR2vP3FbU6PA57yLnOlia0MXEI4uBH1nHZHJQtDU2VUr+9Msi4N8VHBcblli9WhNSv3VRG0ugsKtcUkzNnTJBhD9BYXI2tpYPIbsZ9TVUd5WV+rfWnHyzm0w/8uvvHXvznoWLYDzqipELs5gfi7LYjtxuPtR1dQnKQce9qbUYXn4igGhjpYMP2UM196dLN5C4YH9DcO9pslK8IfhHRGHVBhj34AxF0NLQOqHEfHRvNvMNnBY5//OaXIMMeYMe2ndRU1x2Qca/WqBk7oZCxEwr73VeF/dNv416W5R/2X2vkMRjOtD6PF3tLB7ooE8g2BNmNLPTdMLDZ7OwsLufoEw/bZz1DRhyWzZWYC1N6vVqRkZWG3qBj+S9retTzK4xMoqJDnSLT0pPxtHcZaqJahUavxVLbjKRRY4yPRGXSocuMA6+P9i1VaI063PauB4Ax1oy1qesBaojae4zwgUAQBCS9Ho+tI6hc0oU3zGVPjreSRjMkxuxgIggCksEQ+H1ljxuxh5ckSac/4IWK/iJpVJiTY2ivC3aWNcREIPvkQEhg2SdjbbYg+3zoo0O1v8bYSGytHRjjzEgqFWq9loxpBWiMOtqqG2ksqUG1h+7eYDRw9U0XU1NVx+JPvgsYR5FRitZ+sBB72IETVCrkPWLgi1rdgO6ymXrIXWNOiUWURNrrWxFEAbVOiyk+iraqLi26IAqotGo8zmB/F42xZ8mfraUdj8uDIcqIShs+KZw50ozBqOfYE48gJj6aspIKlv68EqNJCRk8ElCWYveCx2YdcGdaa1M7ugg9kiQhCxL4Dkx3v3HdVjKyUtDsJzqAOtqIIInYK0NXNvfFrHlTef/NTw+obwrDk8LRo5gybULgWKWSuOnWy2ne5F/RF0SB2Vcex8pXv+aLP73Etw+8QcrCMXxftYOb/nA/v7//YeoT1UhRenwefxIotV5L8rgcWiv8Ca4EQWDCGfPQmQc3lKo2Jj5IYiOo1Kgjo8J6DUlvRDJ0MwgFAUNKxiERbUcbHRdwZJS9XgRJFaSvF0QJXVzCkDnVSioVhUdPC3qpNMVH4mizsfXLFTg77Dg77GxdvJIv//wyX/zpZSS1isjULv28pJZIm5JHw44qxpwwE0NMBONPm0v1+hK2fL4ch8XGzMuOwdjNUXf9ms389rp7ePI/L7J25QZu+v1VmCMjuPDyM8kZlTWYP8EhjaQ3oDZHBZUZUtLx2LvtMAki+sSUAc3ZEJ+fHpSdVqVVU3DEJDZ8+Atf/OklvvzzS+z8eT3jT5+HKHWZYvXbKxh70qygtjJmFGJODfbv8Lo9lK/Yxld/fY0v7nmRpU9/hqU2dNfiQMnNz+Kue2/ml59W8PQjL1Oxq4q//+du0jMHbvdAIXyELc79YDFYumZrdTmyzxe0lR9uajaW0rC9ioxpBQg+f3g+3wFIBZ74z4tEx0QyYcrY/da117TgqGkl5bjeJ6faHfN+8dK3ieghC+lBzEGruW8srmbDdyuxqGXsDieJUVGkxMcSlRqPvc2KOTGGNW9+R1Op31FNHxPBDq2dF557O6idf//3/0iRjMiyTGxOClVrdqCPNiF7fYgqifb6ViaeOR+tUd9TNwYMj8OB12HzrzTr9APi6Opzu/DYbcher/8aOv1gGrRDOjY9Tgdee9fvC+B12JFlGUmnR6Ub3H/vnrDUNFG/owqnxYbL5qT4+7XIPpnZV58AAvzyxCeBuuNOmYO9tYPItDhkrw99lAmHxYbGoKWtrpn0iXksvu8VZF/X8zI2J4l5N5yKRq+lrqaec0+6msb6LuMqwmzikWfvZ1RBNubIQ2rlfsjnTZ/H7b83PR4krQ5Jp8fncfvHqM83aGPU2mShtbIBr9tLZEosTTtrWPnK10F15lx3EoboCCy1zf7oOdER7FyygbicFOwWKxqDDmtTGwkFGSR0k+U07azhm3++GdRW2pQ8pl9ydJDT7oGys3gXZx93Bc5uEXRyRmXy/Fv/JTo2qt/tDxGK5v5Qx2Ozotnj7T/ctNe1oIv0r2rKSIhy31O8e7xeNq7bysVXnd2r+rrEKDqKa3HUt6FL6N2LRITZxJjxhXz+0TecdcHJfe6jwvCjva6ZhlU7Af/2XQPVNKkkjr33EhILM2irbgoY9gARmfF89fKrIe2sX70Zm02Ls93GxDPns/PnjSF18g+fNOjGvUqnQ6Ub2Mg1olqDZggjwgwlKq0O1R4vTMMtUpAxLpLS57+kpbw+qLylvA5nN/mZWq/F3tpByY/rKVg0la1fBuvv1ToN8TkpQYY9QNPOWuwtHWj0Wqor64IMe/Avirjd7kPNsB8WiCo1mojg55uk0Q66P4wx1owx1i+B9Hq8rHgpNPdB5artzLj0GKLT4wGo2bSL4u/WUfzduuC2YszQzbjfU3YGULW6GOepc1HFHbg/UaBfu6qCDHvwG/y1NfUj2bg/ZOi3cT/Y0XIGg91RIqT4pAG9TnttK4lF6f4DQfKHw5Rl6MPq346tO4mOiez1irogChgz42ldX07SkeN6fZ3Z86fx9qsfKcb9CMLjdGFr7kBUSRjjzHg9XizVTYCMKTHGH4N5agEqjYrm8npcVgeyz0dbdSOCJKE16XF2+I0gt8VOdnYGVRXBGUsTE+Jwb/HrRXtKl26INaPS998A9rpcgZjVgyV9kb1evG4XgiggDXBI3OGO7PP6Y/ojICMjCgKiRjss4tnvDVGSiM5ICBj30RkJJI3JJG5UKoII2ggDtZvKcDvcxI1KQWPQ9jiGI5KiUem0jD5uOm3VTVSv24ksy2hN+kCse3NkBCqVhKdTogZ+WVpk1MhP+DUS8DgdyG43glod8tI5lMg+GWtTGz6vD0NMBNEZ/ghSiUWZIMtUrSshMi0et8OFrbkdlUaFxqjtUXOvNQV/L21E6IKJKT4qxA/kQImMDn1BMBj1h3LG+hGFEi2nB3xOB4IoDagez9fpzKWP6jTKBQEQQfaC0Pt/ljUrNpAzKrNP19anxtBRuhVncwfamN69FIwZX8Crz73Dlo3bw5KxTmFgaa9vZd27P1G9rgSVVs2sq46nZkMpO3/agCxD4bHTKDx6Ghs/Worb7iRlQg5Fx0zj+3+/g62lndicZCacOZ/lL3wJMrSU1HDhhaeyetUGbFa/wZ9flEt2QiJVG+oAcNtdJI7OpG6zP0yiIApMOG0uEf2IlCPLPlyWNmyVu5C9HiS9EWNaZlAEl4HA43Bgq6nA094GooghOQ1NVMyAOtgPV7xOJ/a6alytTSCIaGPi/BlA9Qa0sQmB/AHDDUEUyF0wnso1xaROyMHn9bH1y1UIi1eROaMIr8dL2qRRuB0uVrz4FV6PhwmnzycmJ5nmnTUAiCqJomOn8/P/PsTZbiMmK4lxp85h/Qc/M/m8wwPJsTKy07jlrmt54N5HA9e/7pZLycrN6LFvCuHDZWnFVl2Oz+VC1GgxpGaErNoPBU6rg9KfN7Lpk1/xejxkTi9k1IIJuOxOtn65AkEUyZ49hvhRKSx9+jNqN5Wh1mmYfN4RTDh9Hqte+zbQVs7csZiTg8NGRqUnkDQ2i9qNZQAIosikcxeiNYVnlzQ3P4vzLzuDV597J1B2559vIi0jNJeOwvBD0dz3gLOlCWdzI/rE5AG7hrWxjfUfLKHo6GmBMsHTgSzpkaXe3Zwy8Psb7uWEUxeRkBTft+uXNeCxOkg6over9x+/9yWSSsU999/ep2uNYIZcO3og+Lw+1r71PcU/rAdAbdAw5viZrH37x0CdsSfPZuOHXfHpi46dxo5v1watFsWNSmH8qXOxtbSjjTAQlRpHVW09JdvL0Om05BflYtJqaatsxOf1+RP6iAKt5Q24bA4iEqOJzUlC6sdKu8dmxVK8JahMMhiJyM4bMENbln1YqypwNTcElUfk5KM2DZuV2EEbm7baKhz1NUFlu2PbmzJy0URF7+XM4UF7fQvV63ey7p2fgspHHzcdUa0Kug8Apl20CLVei+yT0Zr1/Pr0ZzgstsDnCQXpTDhzPuakGCRV1wKQzWpnx9YSaqrrSUiKp6Ao91CNLDJoY9Njt9K+czuyt9uOiaQiIid/wBcA9kf1hp38/L+PgsoKFk2hYtV2bM3+zN8xWYkY46OoWBGcM2PqhUfisNjwujxIKommslqKjplGXG6wYe2wWGmtbMRlc2JOiiYyJS4QDSocWNra2balhKaGZtIykskrzEUbxog8Q8Dw3WoMM2F7OgqCkAfcD4wGAvtHsiznhOsag4XHZkUc4Eg57XWtGKKDtZiyICH4PMi93DCoqazF43YfUCIIQ3osDT9vxdnUjja2d5rQuQtn8OffP8Dtf7juUH1ojQic7TYqVu0IHCePzaZua0VQHa9rz8hMQsg2cGNxNQgCGVMLAmU5ozJDdoqMMcEGb39W6vfE63KGltms+NzuATPufW4P7rYeYmU77MPJuB8UfB5PUCbf3XhdTgS1GldH27A37k3xUVSt2xlS3tFoQdKETrZbvljBwltPxxAVwa7lW4MMe/DnclCpVUGGPfglCxOmjGWCEjF40PC6XEGGPYDs9eB1OYfcuG8srg4pq1pXQmxOcsC4jxuVSknnIkx3rI1t/twL3dZe0yfnhRj3OrORpNEDJ5MxR0YwbebEAWtfYeAIZyjM54HH8ee3OQx4CXg5jO0PGh67dcAdbyy1zeij9rgpBQlkd88n9MCalRvIzcs+IN2rIIkYsxNoXlXa63OiY6IoHJPHJ++HOgUpDB9UOg3mlK4oT60VjZiTg6M+iSpxn8fgDweoMfT9PrA2ttFa2YDTGproqTf4fD7cNivujvYe48YLKlVIuc/rwWO34XU66Wk30ufz4els0+ve9z0mSBJiD7pd6RB0nt2dmXZPRJUa2eNF0ujweTz4fF7c1g7c1g58ngML6TtQCIJAbHao/5TWpEPXg37YnByDWucf9z3pmg3REQiSEkV6ONDzC77QY7nX68VtbcfVbun0HxlYTAlRIWXm5NigPCDWJgsRSaEvx5JGHeLJqDX3/LLS0dBGa5V/9V5BYTfhnKH0six/g1/qs0uW5T8Bh4ex/UEh4Ew7wE45ltqWkJV7BBWC3PsH45oVG8jJyzrgPhjSYnC3WbHXtvb6nAVHzua159/t0YBSGB6odRrGnTwnEOfbUtNE/KhUDLHdsji220ka07UCX7d5F0XHTgtqZ9JZC4lI6P2qrMftpuzXzSy+71UW3/cqPz3yPq3dkrP0Bq/TiaOumvaSrbTv3Ianox1NVHB8Z2NqJlK3nA4eh5320mIsOzbTtmMTzubGoNU8r8uFo74GS8k22nduw1q+E7fNutc+iJKEITktKAmTyhiBpD/0HMkEUUQXmxDkfyRpdSDLiGo1steDvbYKZ0sT7SXbaC/ZirVqF267bR+tDj5ZM4rQdVtMMcREoDHoEESByNSunU+1QUv+EZMDjrJRafFkTOvauRJEkbzDJ/Lrs5/TUhEchUdh8JF0enQJwfJZXWJyIDzrbjwOO876Wtp3bqejdDvWyjLc1uBEd+EmIT+dqPQuuazaoCX/yElYG7uMe0ttM+NPnYuk7rq/kkZn+hdnuq3Z5c4fR1RasPTW4/Kwc8lGFv/1VRb/5RV++t+HtFX3LYeNwsFLOPe1HYI/3dsOQRB+A1QBCWFsf1DYnZl2QJ1pvT5sTRb0IVkLO+9m2etfxd8HlrZ2aqrrSM868IQSgihiyk2ieWUJKcdP7tUOQOGYPDweL8uWrFYy1g5j4nJTOPKOc7HUNqPSqolMjWPudSfRVtWI7PMRmRaPPtJIW9VuvWYM+mgTyWOzsbd2YIw1Y06N7ZN+s7WikeUvdO3qNJfVse6dH5l9zYmoe5ml1mPrwNHQFZHH0ViLPiUNU3S+36G2M2b1bmSfF3ttFd7dGWl9PmxVu5B0OtTGiK42u2nGPdZ2nE31SLpMRLHn9Q21MQJzXhFepwNRFJF0+qBETYcKsizj7rCgjfVP5aJag6hS4XXYUUdEBv6tdAnJ/qAAsoy7rQVJq0M9xLKI7kSmxnHE7WfRWt2I7JXRGHW4HU4iU+LImFZAa0UDXo+HyNQ4YjojmgDoIgxMOnshGdMKaCqtRVJJ7PhuLbbmdla+/DULbj4NjWH4RGc51PC5nHjdLozp2fg8HkSVXyrmc7uComp57TYcDd3mgA4LTo0GUedPIjkQmOIjmXfdybRWN+JzezEnxxCRGM0RvzvbH5FMFIlMjcUYY+bIO8+jvbYZlV5LVFocokrFwptPp72+FX2Uiah0/3zdndaKela+3BUzv6mkmvUfLGHWFcei0gxPJ3eFwSOcxv3NgAG4EfgL/lX7i8PY/qDgsdsGPjNtYxvaCH3Q2zoAgtBNd7/vCWfd6k1k5WSgUvVvYtIlR2Hd1YCtvBFj5v6dcgVB4PCj5/LCU28oxv0wx5wcEyTH0UcaiUoN9s/QFQZH89hT09kXrA2tIWV1W8pxtllR97BF3RMeW+hqmrOxgYicfCRNqN7d5/HgtoRe1+t0BIx7r8Me8rm7vQ2fy4m4j0Q2qmGSjGkokb1eXK3N+Dp9H1TGCJDlkH8nr92GpNPh7Vyxd7e34YtNQBxGkXSMcZEY9xL/25y092SFWpMer8fDls+XB5W3lNdjb+1QjPshxOt24W5pwt0SvGKtMUcFae49PewkedrbkGMTQT9w97g+2oQ+OjginSk+ElN88DiMTIn1ByToRkJBOgkF6Xttu6O+NaSsZsNOnBZbWOLcK4xswmbcy7K8AqBz9f5GWZbbw9X2YOKxWREHWG/fVtMccsMHCOju992H1Ss2kNsPSU7gcoJARF4Szat2Ykjvnaf9rLlT+fDtLyjeXsqo/Ox+90Hh4EBrDpWtmBIi+xTnvic5nKTT96i9BxBECUmrR9Lp/Dp5WcbV1oKo6rpmdwlP9+scimEt+4ogiqj0Blydxr3P5URlMqMSOg19wN1hQdRo8XSTOkk6PQzg7udgo4sI3YXQmQ09xsVXGDxEye9/o4mOQZBUyF6/A/ie93ZPPnSiVo8wSDkzBoKeNPjm5Jiw5BVRGPmETXMvCMJUQRA2AOuBDYIgrBMEYcQt7XrttoF3pq1uwhizlwg1ggrBt2/dvdPlYtumYrLzwhNDWRMbgahR076jZv+VAbVGzeFHz+OZR18Jy/UVDg6i0uLInFkUOBZVElPOPaJHw2hvqIymIAdOQZLQxSXuNXGVqFJhSM3A63TgqK/B0ViPJiom6CVB0ptQGbpePARRQp+QMqxWlYcrgiiiS0hC6DSWfG4X6ohIBEnl/73ra5DUGlQGE7LXP28JKjXa6Li9Sp5GIpEpcYxaOCFwLIgiUy84MtRvSmFQkXR6DKkZuNpacNTX4GprxZCSgWQInnMkgzHIZ0aQJHTxicM2R0NviE5PIH1qV84ZSS0x+ZzDBz0buMLwJJyvrc8B18my/BOAIAhz8UfQGR/GawwofmdaG9rYvoeW7Att1U1kdTOCgvogSIhyqIygO5s3bCcpNQF9mLYTd6/et67bhSk3EbEXUp/DFs3mD7f+jcryaiWphQLgX92ceOYCsmeP8ce5T4gOidKzP1R6I8b0HLwOG7LP55fGGPbuyCp7vdgbarukN7IPR30NapM5IK9T6fUY0rPx2W34fD4knR71PtpUCEalN2IeVYjX4UAQRTwOe5AUytXWgsoUgTEjB2QZSadDdZA5H2uMOsaeNIv0qfk42+2Y4iMx7yGjUBh8ZK8HW1U5ss/vQC973NiqyzEbTdAtzKna4E9+53XakX0+v0+IcWS/mOnMBiafcxi588fjsjmJSIzap7xM4dAinMZ9+27DHkCW5Z8FQRhR0hzZ4w+RJwzgdr3T6sDjdKHbS1gr/2aKDLIvKFpHd9YsX09uH7PS7g91pAGVWY9lazVRY/eu89uNwWhgwZFzeOLhF7jvwbvC2heFkYvWqCMhP61fbah0OlS63umYfV6PP4vsHnhdDtR0PbxVWh0Mo7T0Iw1Jq0PS6pBlGXtdaPxut8VCRPaoIejZ4KEx6IgfdeABDBTCj8/tChj2u5G9XnwuV8gOvEpvGPLY9+FGa9L3e75VODgJ577pckEQnhQEYaEgCAsEQXgM+F4QhMmCIEwO43UGDI/dhqjRHVDc+N5iqW7CFBu592sIAggSwl7i3ft8Ptat3khuQfi17qbcRNo2VuBze/dfGTjquAV8//UvlJaUh70vCsMDh8VKU1kt7fWtgxb+VPb58NhteGxWfF6Pf0fN6cDdmbyqO4IoIel6jsPeV7xuF26bFa/zwOLzHwrIPh8qY6i/UE9lwx2P20NrVSMtFfW4HQMf91whPPjc7sB96l+I2+NZKggjWku/L6yNbTSV1WJrGVHrpgpDQDjvgImd/71nj/LZ+NMxDPuY937jfmCdUVrLG4LijfeELEjgc4MYqv0v3l6K0WQkKjr83vDqCD2aGCOWbVVEjd2/nt9gNHDU8Qt58G+P88iz94e9PwpDS3NZHUuf+RRrowWVVs3kcw4jfWo+knrgHpxetxtnQy2OxjrAbzTq4pPo2LUTZB+iRoMpIzcg1fFr7tNpL90BPh8A6siYfUp5esJtbaejfCey240gShjSMtFERg/oi/5Iw+t0YK2uQBsVg6jW4HP7DWJRqx1xxr29tYPNny2n5Kf1IEPyuGwmnbUAUxizKyuEH4/NSkd5CT6XC0QRQ1om+qRU7LWVgTr6pLQBz1Mz2Ph8PmrW72T5S1/htjnRRRqZdfmxxCur9gp7IWwr97IsH7aPv2Fv2MPgONO2VDVgjN9PCntBheDreeV+9fL15A5ghBpjdgJtmyrxeX29qn/EMfPYsnE7y5asHrA+KQw+zg47y19aHEi44nG6Wf7i4gFPkuK1dQQMewCPtcMf/abT8c3ncmGtKAvKgqo2RmAeVYQpaxQROQUYU9P7tHLvc7uwdhr24I+dby0v7TGE5qGMq7UFr82K125DbY5Cl5CMPjEFtcncYwjT4UzD9kpKflwfyAJas6GU8hXbhrZTCvvE5/FgrSj1G/bgz2lRXgqSiD4xJTAeXS1NgZCsBwvtdS0sfeZz3J1ZaB1tVpY+85mygq+wV8IZLSdREIRnBUH4vPN4tCAIl4er/cHA67AhDmCMe7fdhbPNiiEkeVUwsiD5M9XuIYOQgVXL15M3AJKc3agj9Kgj9HQU1+6/MqDRaDjzvJP46x8fxO3q+YVEYeThsFix9GDIW5tC9e3hxNND5liPtSNoJd7rtOPzBI81lU6PxhyF2hTRZ0mOz+0OkfuA3GVEKPjj3bc1I+n0eGxWnE31OOprsNdV42xqwNNh2X8jw4i6bRUhZZVrivEoc9iwxedx9yiZk91u7HXVgfHoddjwug+ue9fWZMHnCZbLOiw27K0j66VaYfAIp+b+BeBLYHfolO34E1uNCGSvF5/bPaBZKFsq6jHGRyFK+/vZO51qCV49r9xVheyTiU8c2Gg+xqx42jZV9FpjPWnaOKJjonj6f0pozJGEz+ulraaJptIaHO3BK10agw59VKjUYs8sieHphwe3zepPIKfToTIY0SUko0tIRhMZjaTTBz3URbUGcY8Y6j63G7e1A4/Djiz78DiduCxtuNstePdjpAuSqseM1EqozG6IIipjBD6Xw5/9NyISfWIKhtRMDCkZaKJi8dhtfr8IryfgN+G2dQTtsoQDe2sHjTtraK9tRvYdmB9ITGZiSFl8XtqASs4U+ocoST3ek4KkxpiejSEtC2N6FqJWh6hS47Z24LK0BXbgfB4P7o52XO1teHfnbfB6/f49dhs+b+98zfqL2+6kubyO1sqGXr9M6iKNIa4FKp0GrUkJe6nQM+GcyeJkWX5LEIQ7AWRZ9giCMDh3SxjwOOyIGu2Aamyby2qJiO+FVl4QkDulOd0z1a5cto5RBdkDrgNWRxsRRBF7ZTOG9P2HexMEgfMuPZ37/vAgC4+czehxBQPaP4X+47I7Kf5+HZs+/hXZ58OcFMPMK44jKs3/4qiPMjHtokUsefwjvJ0O1oXHTMOcsv8sxn3B63RgrdyFx+rfXjZk5CBqdTjq/TkXJL0RfWIKHWU7/CcIAobk9KCXcI/d5tfhOp0gCJgyR+ForMXT4W9zt4Rkb+EvJa0WQ1oW1vKdgd0yfVLqQafb7Q+CIKCJjMZtaUVlNONsafTveNisuDujFalMZiSdzh/lS/bhbKwHQNIbMKVn+xNb9ZOm0lp+eeoT7C0dSGqJSWctJGNmIao+voglFmUSm51MU6l/nBljzeTMHaP4WAxjRLUGY1oW7WXFgftUl5iCqJKwVZcje70IkoQhJROPy4m9sgxk2X9eejbO1iZczY2Af0waUtJx1Nfhbm8FQBMZjT45bUCluR0Nrax+4ztqN+0CIGtWEWNPmr3ffAkRSTFMPH0+a9/9EeTOPAsXHqn4iCjslXAa91ZBEGLpVDEKgjATGNg9/DDi7TTuBwpZhubSOrLnjuldfUGF4HMhS10Gxspl6zh80dyB6mIAQRAwpMfStrmyV8Y9QExsFOdcdAq3XXsPb332DBHmkeVgd6jRUl7Pxg9/CRxbapvZ8MHPzLrqeFQav6GUWJTBorvOp6OxDW2EHnNyDGpt+Ha2ZFnG2dwYMOwBZKcDV7dU8l67FVdbM/rk9ECSJFtDLZLBgKTR4vN6sdVW+g178GdKtXYEDHug0yA17TO2vcYchSpvNF6XE1GlRtLp9poV91DFZWlFExOPz+nAY+tApTfgbu6a4j0dFiSdHlFSBTk4eu027I11GFMzEPYS3rc3ODvsrHhpMfYWvxTB6/ay8tVviEqPJyYrqU9tmeIjmXPtCVhqmvF5fZiTY5SEVCMAlcmMOW80PpcTUaVC9sm0l3U508teL9aqMoypmYEXAJ/bhdfpCBj24B+TzuZGfG5noMyfr8GMFBveBYzuVKzcHjDsAcqWbiE+P43sWfu2C1RqFTkLxhGXn4qjzYoxxkyEEtNeYR+EU5ZzK/ARkCsIwhLgJeCGMLY/oHjt1h7T1IcLa2MbiELvs3XuEQ6ztqaBjnYrKWmh28kDgS45CldzB25L7x2Tps+eTOHoUfz+xnvxDtIWp8KBYW0Mfe+u21KOs6PLiVQQBMzJMaSMyyY2Kymshj34wyq6u8WoF1TqHiU0HmsHXrs1kBHVZ+8KiSl7PXjau/TeqggzHmuo/ru7sd8TgiAgder2VQajYtjvgc/t9uvqRQF3hwVJq+vRadFrsyITKpVxW9qQPf2bExwWG5aa5pDyjqYD0/vrzEYSCtJJGp2pGPYjBEEQAv41KoMJn8cVMOwD+HzI3cpEjbZHrb67wxKUDRv843Sg8Hq8VK4tCSmv39K7UNIqtZqYjERSxuUQmRrXC3mvwqFM2FbuZVleLQjCAqAAvzpsmyzvJVj7HgiCUAa0A17AI8vy1HD1q7d4HHY0kdED1n5jSTWRyTG93/YVVLDbqVYQWPXrWvILcxAGKaW7IIroU6OxbKshdlpur88768KT+e8/n+avf3yYu/92q7LNHSY8bg8ddS14XB5M8ZG9ekl0WGx0NLah0qgwJUaj6qYn7klPH52VhEbfv90r2efD63Qg+7yIGi1SDz4sXpcLn9uJIEqozVFIWh2itjO/hKSCluD6qsho1AYjKlMEIOBorAdBwG1tR5BUSHojXrvfEddrtaIyGEMcc/saGlPBj9+J0YkgCGjjkxBEETE2HtnlChj63ZF0+h7veZXR1KNfQ1/QGHUYoiNCIoQYOseyw2Kjo6EVlVaNKTEar8tNR30rokoiIiEKVZhfThWGHkGlQVCr0UbF+nPEyDLO1iYElQpdQjLgX82XegiUodIbQ4x+lcmEz+3G63IiiCKSVtevZ66zw05bdRNet4fI1FgSC9Np2VUXVCc2V8nwrhB+wmbcC4JwJvCFLMubBEH4IzBZEIT7ZFnubYzEw2RZbtx/tfAjyzJehx0pvm9bu32hYUcVSaP3Hzs+gCD4Q2LKbmRBw/Jf1zBn/vQB619P6NNiaV5WTMzkbIRerhKoVCquvflSHrz/cf7x50f4/T03KAZ+P3F22Nn6xQq2fbMaZDAnxzDryuOITNm7Y3VbdSNLn/oMS20zCFBwxGQKj5kWcMCKzkggZ+5Ydv68EfAbThPPmI+6H8a9z+vB2dSAvbYakBHVakyZo4IMa4/NSvuu4s6wkwLGjGzc7W242vwWvToyGl1iMo46vxZaE+NfodqthxdUaoxpmf6Y9C4nCCKmzBysFaXIXi9euxVdYjLuDgu+zge3pDegMu0n/KxCCB6HHeuuEjRRMbjaWlCbo/wOyp0vUurIaHTxSTga/JG1JK0OdWQ07vZWf11LK+DfkdEnJPd7YUIfaWTaxYtY8vjHeJz+daPRJ8wgMiWW1qpGlj71Ke11LQiCQN6Rk/C5vRR/vw6A7DljGHvS7AFxCFcYOnwqNYbEVKzV5f4VfFHEmJKB1+3yj8vdc0Zktn9Xr3OXT1Cp0cUlYK3uipok6Q2oDCYsO7cGZH66+ER08UkHlBTPUtfC5k9+DYRYjUqLZ9I5h1G1bifttf4dqLhRKSSNzurnr6CgEEo4Nfd3y7L8tiAIc4GjgX8BjwMzwniNAcHndiGIYr9XlvaGraUDZ7sdY1zfEk/JggrB66S+sZ2W5lbSMpIHpH97Q2XQoorQY61oxJSV0Ovz9AYdN//+av77wNPcdfN9/Pmfv0ejrJodMM1ldWz7uusd2VLTzObPljP9kqOQesjE6PV42PL5Cr9hDyDDtq9Xk1CYTvJYfxhVXYSB8afPJ3vOGNx2F6aEKEx9HJ8h17XbsddWBY59bjfWqnIicvIQJZU/TnXVrkA8eVGjxtNhCZJ3uNtaUOlT0SemIMsykt6AdVfXVrbscWOrqUAXm4C9pgJkH9aKUkzZ+chejz+ihlaPmJGDz+lAAEStHpVeiSrRF2SfD0d9LTJ+p2fZ60X2uAOGPXT+WyX5/63AP496rO3o4pMQBDGwgyNpdWFzUkwoSGfRXef5/UBMesxJMSAKbPpkKe11/hdEWZbZ/tVqxp48O3Be6ZJNJI3OJH1Kflj6oTA8kLxu2qvKQe6U4fh8WKvL0cUmBDT3sseNraocbXQsaoMJWZaRfV6cLS1EZOfjc9oBAVGjxVZTETDsARwNdaiMZjTmvs+NjcVVQbkTWisbKPt1M/NvOoWO+jZEUcCcFIO2t1JdBYU+EE6Nx25B5fHA47Isfwj01qKTgcWCIKwSBOGqMPapVwx08qqG7RVEpcUh9nHlSu5cuV/561ryCnJCwv8NBvqUaNq31/T5PKPJwK13XkNdbSOXnHkDtdX1A9C7Q4OAkd6Nui3luDpCdaQArg4H/8/eeYc5dlR5+60blKVW5xwmB+eIsQEbk7EJZglLTv5MhiUak3NOXkwwYRdYYGGBJSwZDAYb4zD22DOe8cTOOXcr64b6/rjd6lZLM9PTebrv+zx6ZlSqe1VqlW6de+qc3+k/2FHQPtmfH+/i8Xso31RLze7mRRv2QF5y2jRWKoGckkKUlplnyKu+AGaiUKfZSiXJjI048fVFYvDtTAZlVoiRtCykZeIJl6AFQiiqiu4P4I2W4YmWuYb9ApCWhRGfQJvStZ/Wt5+LmUqSGR9x9O5Hh53cBkVF0TT0YAhPuGRJr61CCMLVpdSe1UJZczWaVyebSDPwSKFuvZnK5u0WjLTPr3aHy5mDbWRnDPtco+3sfM9uyqSRtp3Tw88MD2LExxEC9FAEPeTkXMzO35mmWLz+fBjrKFzzhg53IaSgekcjldsaXMPeZdlYSuO+RwhxK/B84LdCCO9pnP8KKeWFwNOANwghHjf7RSHEDUKIPUKIPUNDQ0s4ZAcztXxKOVJC/4FOoo0LyMAXGkiDB+59iO075x/3vpT4qkvIDMcwE4WG26nw+ry85s0vY8dZ23j+06/nj7+5fekHuMos99wECFdFC9oqttShB4pLNeoBH5Vb6wvagxURRtr6GG7tI5tIk05nOHzwGPffu4/BgcVHxBWrEaEGw064zsQYtmWhzJKXtNIpVH9hmITi8eYSZhWtiP68xwOKmtPCV3TPstanOFNZzNwUqooWDGNl0mj+AFYmXZB8CDiKRbMKgGnBEOoKOyE8AS8VReKWNZ+el1hZ2jj/3cdiGIbBscOt3H/PQ/R0uzcKi2Exc9NMJclMjGHEYwhNLzDkKaLI5FxT8h0FejCclzivqCpqsDAXqVi8/nyYlhWeTdmmWjzhlXc2jI2O89D9D/PwQ4eIxwpv0l3WH0tp3D8fp4jVU6WU40AZ8M75HCil7J36dxD4OXDpnNe/IaW8WEp5cWXl0stUWemkYzAsA5O9I0jbJli+gJhfITBMKCsL0Ni8Okk3QlXwVZcQbx04deciKIrC05/5BN7wtlfy+Y9/lZve8lFik+unqt5yz02AspYaNl2+O/fcHw1y1jMejeYpHlWneTR2X3tZXtJsy2W7mOgZ5rZP/5i/fObH3P/LO/j6F7/D859+Pa983pt4ybNfxyMPH13UOBWPD+8sGTnF68VbWk7s+BESHceJtR4hUFOfC3+zsxn0SEleVWgtHEGoWs4bZ6ZS+GblwghFxV/bSKKn01HPGerHV1WzbL/fM5nFzE2hKPirap1kxCmjXvV4827OtGAYFCWnVqL6/OiR6JKNf75oHp1dT73EKfQzRfOjd5GcVb2z7rzNVG4rvOGdL+lUmh9/7xfO7+X5b+aF197A3vv2L2rcG5mFzs1sbIJY68z1xEwlCdQ2zRj4QhCoa0TO2rERikqwvjmv4Luie5zwsdn9VJVATZ1zwzCFp7QCrYgDYj6UtdRQc1ZL7nmwooQtjz0nT9hgJWhv7eT1r7iRlz7nDbzoma/hQzd+loE+dyd9vSPmW4V02QYgRBBQpJSxqf//CfiIlPL3xfpffPHFcs+ePUs6hvFD+/BV1S5LaM7B396L6tWo3t64oOO7W48zPDyGN7I4r9NiyI7GiR3upf7ZlywqOTaTzvDT//41B/cf5rO3fJDzLjp7CUe5LJzWh12OuTlNNp0l1jeKmTEIV0fnJd2XHI0RG3TUQxKjk9z9zd/mXgtesZWb3vfZvP6XPeZivviNjxIMLmyr2IjHSPV3o4dLkFKiBULEO47nbZsLVSfUsgVp246nzOubUthJgVBQvV6ktLFSaaS0HSUdTcdKJ7FNE0X3kOzpyFWddE4qiGzdhVbEs7yOWZG5aWUdjXChKFjpFEJRsC0TLAsznXK+ayOL8HjQfMFVCYGysib3fveP+EqC6D4PQhEMHe9l9zWXgi1RNI1ITSmeE+x0zYf9Dx7kxc96XV5bU0sD3/vZLZRVLJ/K2hnKssxNM5Mm3nYUO5u/i+yvb0JRVKRtIxSF9MgggbomhADbtFA9HlSvD9syc+E5isd3QulrK5vBymSm8nd8Cw6H7br/CBN9I4Qqo0jLRkrJeM8I5z/3sacdortQpJTc/Olv8B9f+2Fe+ye++F6ufc6TV2QMa4wNo+6xFmptVwM/nzIaNeCHJzLslwNpW9iGsSzb+tlEmpHWPnY9deHKnnv3HuYJV19Ix0Bh7PFKoZcGsQ2L7FgCb9nCi1N5fV5e/Mp/4cE9D/OmV9/EG972al7wsmcv3UDXMR6fh/JNp6fmFCgLEyhzbgIe+f29ea+NThbGlu6550Emx2MLNu5tI4OZTORiswP1zQXxsNIysE0D7yzZWVGkrLyq599oK1NqN0Yinm/YA0iJbc6vjLvL6aF6PKgeD7ZhFN5UTWGlnZwl36YTqzctJ5lEir4D7Zjp/Gtkw3mb2XrV+UvyHn09hZ7OzvZuRkfGXeN+hZCmWWDYA0jDIDGYrxVvG9m8awyAomoogVOvX6rHuySOvtH2AQ7/6f68tlBlCeY1j8ITXJnq16lkmjv+cndB+4N79m9U437DsOrGvZSyFThvtd7fmoq3Xw65xp6HWok2Vi5YX3locITOzgECfg+aamBaq7PLIoTAVxslfnxgUcb9NOdffDZ1DTXc8vlv09XZw9vf+3pXLnOZqd7VTO9DrbnnZeFCz/+Fl5xDSXThxXwU3YseLcMTiToqKR4vqCrMLmgmlFPeSFtGFjudwrZtNK8P1TfjDVY0HaGoSHv2OcWCpOpcToOpGHzVH0DRPQghMFNJVK8PY3ICb2kFVjaN6nGMFtuyprykjlrOcuZEeII+Krc30LevNa89WBFdsveoqSvcOW1oqqO0fPGJ6C7zQ2iaEzs/x8AvqHo8dY0xU0lHQcvjyc3LlaS0uXDOVO9qRvOtXAihP+Djiqsu5ejh/N/GGbBr7rJINnyJMzO9PMm0lmHR89DxoomN8+Xg/iM0NtWRyliEAqtbMdNfW0qibQBpL80NRlVNBe/64Bv5x+338qkP/TurHR623qk9u4XqXTN1FkpVLy+7/vm551XVFbztPa8nsECvPTja0YqmkehsJdndQbyjlWBDixOXDU48bH1jXtz2XMx0imRPB7G2o05cbfsxjFmKOqrXS7CxZSZpTgiCDc15NwAuS4+iKHhKSrGSTqXg1EAv0rJQdB3NH8A2TeIdrZjJBLaRJdnbyeSxR4i1HmHy+CHMItVslwrNo3POMx6d26UC2HrVeUWNq4Wybcdm3v7e1+eShcOREB/93LspryhbsvdwOTma10egrjFPstpXVevk28yKuQ82tmDEJpg8etCZf0cfwUicvEL1clCxpZ7Gi2ekVyO1ZWx9/HkrWllWCMF1L7iGHbu35tqufspjuOTRF6zYGFxWh1WPuT9dljquOdHdDkIseXXarj1HGG7rZ9NluxZ0vC0lt978XS5/3CU0NpTj0RW6BhYmybVUjPzzCOWXbcNfu3R/q2Qiyec//jWuue7JvObNL1uy8y4RaybmfinIJFLEB8aRUhKuLkWqgrbjncTjSZqa66iuXZwxlJ0YJ95xLK9N9fnxVlTnvG3ZsRFCm7ahncAYT48MkezJl/H0RMsJNDTn4lSllFjZjBPrrelOFcmNt/OzonPTtm1SfV1kRvKVTfy1DZipJMa4I9fqq6xBC4aIt+fPA0+0jGBDy7JW2E6Ox50KtR6dSE3pklekNbIGbcc7GR+bpK6xmoZGt7LoCViWuWkbBrG2I+ihSM5hoAb8pHq68ZSWz7y5opLq7847VvF4iWzdueI7fNlUhvjAGJZpEa6K4ousThG10ZEx2lu70DWN5i1NRCKL34E/Q9kwC8Wqh+WsNmYqhSe6tIa9ZVh07jnC5ivOWvA5err6UFWVaFkJqbRFWWT11UB8NVHirYNLatwHggHe9M7r+eQHbmbLthae+LTHnfoglwXhDfrxbs43qnedvXRFfYrq3KdT2NkM6cGZWgnTuvfFsIp4eM1kHGkaMLXDJoRA8/rgJDsALkuMZRWtSWAmE1jpme/MTMQRRXZCjXgMaVnLatwHoiEC0eUzWnSPzvZdqyNJ7OJUwLbSqby8j0B9M7aRzbu++KoKiz3a2YyTkL/Cxr3H76Ws5fRypZaDsvJSysrd3JCNxIYOy5FSYmVSS66S0/PQcQLlkTwpwtPl4QcfoXlTAwKBZYNh2QR8qxua46uJkuwcRlr2qTufBtHSEl73b6/gw+/+DJ3t3ac+wGVNouiFvyN1SiM9h1BACDLjoxixyTyNdAAtUBgWpAVDefJ0LiuPZdtoocJ8DNXrw87O0rkPhVH1wu9KD0WWrQK4y8ZAmYq5n41QlAJd+2I3kMqU6paLy0ZhQxv3djaDUNQlXXTMjEHnfYepmRXffLpkDYMjjxynefOMfGYqbRMOru5Gi+r3oIV8JHsKK6YulpYtTVzz7Cfzzjd8GPMknl2XtYvqD+Rr0ms6/uo6jNiE06AoBBuaiXe1kehsJdZ2hNRgL9asKrRqIIQ+K0RO9frwlVWumHScSyFmOkWi7TBaIJhXyEqPRJ1Y5ylFJC0QQg+XoPmDeMpm1zvw4auqWVavvcv6R9F0go0tTh0MAAS2hEB940xej6KgeLz4a+qZjsAQmkawoQVF2/CBCi4biA0926fVHpaS7geOEa6O4i9ZeGzd0UdaKa8sIxCYCaFIpi0qoh4GRk6/UuxS4quJEj/eT7Bp6WXvrn7KY9j34EG+/dUfrsX4e5dToHqcwjB6uATbMlE9PlSfj5Jtux0PvaqQ6OlEzlK7yIwMoYciOc1pzecnUNeEXVaJlDaK1+eE4LisClJK0sMD2Nksic42/LUNiPIqFE3DtiyMiTH81U7suZlOYcYn0avrCNY24CuvnFJN8hVInbq4LAQ9GCaybRd2NotQVWzbJtF5HF951dSNpiTZ20WoZSuRbSVO0rfHsyw1bFxc1jIb27hPJpZUKcdIZenae5Ttjz9/Ued56IEDtGzOL3qVNWxUFTyaIGuuXhK0r6aEob/3YWdNlBNUSF0oQghedv3z+dh7v8CTn34lm7Y2L+n5XZYfRdNQ5oRvqF6fI5mYTGAnC0ufzw3NUXW9aGiHy8ojLQszPqM0kupzwuYCdY0YsRhGbBxjcnymv2Hgq6pFqOpGKyrmskLM1qHPTIwhDYP0UH9en2I69y4uG4kNvU9qpRKoS6io0HHfYaL1FXhDC5flGx0dZ3hohPoiSgzJtLXqoTmKruEtD5HoGDp15wVQXlHKNdc9iQ+9+7OuPOY6QNo2ZipJdtIJzdECIXyVNfiqavFX16EFQ46U3Sxsw8BIxMjGJrCKFa2RMndOM5VE2kubA7KRsTJpsrEJzEQc27IQqooemdZyFwTqmwnUN6NoHvTSQhlIvSS6EZWLXFYJRfegeH34q+ty15Tp+HozmXDmcmZ1VeZcXFaDDeu5l1JipVJ4y5dGCzmTSNO3v40dT1ycfuyDex6mZXMTahEt3FTaJhzQGJlY3WqcvpoosWP9hLcVqhIsBVc/+TH88449/PaXf+aaZz9pWd7DZfmRUpIdH3XkZgGEQqh5M/HOVpgyyL1llXm691Y2S7K7AyPu3AwIXSfcsi3nBZZSkp0YI9HVBlM3f4H6JrylFW5M9yIxEnHi7UeRU0XHPGUVBKrr8ZVVYSYS+KpqSPV1YU/lSKj+IP7aRlJ9XQBo4QieSHS1hu+yEdE9eMsrSfV25ZoCdU0YqQTp6TZFIdyy1ZHQdHHZIGzY1dDOZkARS5Zk03n3Icqaq/AEFh4fbBgmB/Y9wpbtLUVfT2Us/D6V1bZhvFURjLEERnx5PCKKovDCl13H5z/+NRLx5St+47K8WJk0iVma9Z6SKMm+rpxhD5AZHUIaMwm1ZiKWM+yBqS33AeRU0qadzTg3C7N2dZI9nfmKPC6njW2aJHs7c4Y9QHZ0GDOdRPX5CDZvwYhN5Ax7cHY+kRJfTT3Bxk2EmjYveQ6Ti8vJkJl0LlRsmmRfF+psZRzbJtHVXhD+5+Kyntmwxr2ZTCzZQpSeTNF/qIOqHY2n7nwSDh04SmlZKeFwcQlNKSGdsQgHVnfDRShKLrF2udi6YxPbd27mW1/5/rK9h8vyIk0jzwhXPF7sTGGYzexFd7aG9TRmMp6TX7VNM+/mIHcO0124F4O0raI1Bqa/G0UIrCL5EmYqgRmfJDs+hqJu2I1gl1VCmtm8a4zTKPNuUsGJwbctV4XNZeOwoY17ZYmM+457HqF8Uy26b+Hx+xK495972bZj80n7pdZA3D2Ar66M+LH+ZY2Lv+4F1/A/3/8lPV19p+7sUoCVyZCdnMCIx1bF+FV0D7O3max0Kk9KMddvVlK7FihUmdIj0ZxcraLphdK1Qjjv5bJghKqhBQvDFqYTF6W00cIlBa9rgRBmMjErLt/FZeWYe41xGhWEpuXi8H1VtaiBkKtz77Kh2MDGfXxJPPfpySSDR7qp3Fa/qPO0t3ZhmRY19SfPAUimLcJ+bdVrKOslfhCC9MDEqTsvkLLyKFc/5bF84eNfW7b3WK+YyQSTxw4Sbz9KrPUwie4O7FnhLyuB4vESatqcM8bNRAx/TcNMAq0Q+Osa0XwzCehaMIS3YuY3oAaCeMsqckmaqtdLqGlLTutaKCpBNxxk0SiqSqCuAcU7daMlBP6aBlR/ADOVZPLYIQTO9zONXlIKQuKJRNGLGP4uLsuN4gsQrG/OXWOEqhJsaMFMxEkN9JIe7CM91I+/ssbVuXfZUGzI2S5t2/EiLoFB0H73I5RvXpzXHuCfd9zHjt1bEKcw2y0bDNMm4FdJpKyT9l1OhBD468uYPNyLvya6bO/zlGsfzwfe8Sn23refCy45Z9neZz0hLYvkQE/e1rQxOY5ZWo6nZOU83EIIPJEo6tbd2KaBoumoXi/all1YhlNATvX68tRVFE0nUNOAt7QCKSWqx1uwKOvhiKN1bRgouobqcQ37pUDzB4hs2YmVnfluQDo5D6YjN6hHShxPqD+AqntBgK+00q0+67IqqKqKWlqO4vXlrgfYkszwwEwnKUn2dqIFgm69BZcNw4b03E/r2y9WXSM9kWDoaA9V2wplK0+Hrs5exkcnaNo0v5j9RNqiZA2E5vjrSkn1jGKll88j7PV6uO4FT+eTH7wZ25U8nBe2bWElC+Oni8lKrgSq14seDKFOeYUVXUcPhNB8/qKyiUJR0PwB9EDwhN421TN1TtewX1IULf+7kZaNmYznXjcmJ0gP9mEl42iBAJo/4Br2LquOHgjiLYmiB0LYZuF65Mbcu2w0NqRxbyRiqL6Fa9FP0373I1RsqUVbhFa+BP5+2z/Zfc521HnebCRTFpHQ6hv3iq7hqyph8sjyxsRfevmFmKbJ//3sD8v6PusFRdWKxkAvxZyfi21kMWKTZCfHsTIZbNN0NOonxjHTqYKcDCklZjpFdmIcIxFzF9w1jlBVPCVlebUJPKXlqF7/iod5ubgUwzIMspMTpEeGyE5OoGiFhSlVf8CNuXfZUKy+hbgKmPHJRWveJsfiDB3vZddTLl7UeY4faSMRS9CyuWnex5iWxLIkAZ9KMr16oTkAgaYKxh9sJ3pWI6KINv9SoCgKL3jps/nSp27l6qc8lnCkuJqQi4NQFPyVNViZtKNwIgS+qlo0f2Gy6mKwMmniHcdzCjd6tBwBZMdHpgYiCG/alvdbM+MxYu1HcwoXntIKArX17sK7RhFCoIfDxDtakVM3Yqo/gB6OEms7Sqh5i5vv4LJqWJZJZmyYdH9Prs1f20CgcRPJng6wbRSPl2B9sxtz77Kh2HCee2nbmMkkqn9xXsy2fzxM5dZ6NM/CjRLTMLnt93dw3kVno5xmiFAiZVGyBrz3esSPGvAQb1+eirXTbN7azFnn7uSWz397Wd9nvaD6/IRbthHZuovItt34q2qXfHEz4pN50pWa1ztj2ANI6STyTin12IZBoqc9T7ouOzaMlSqUv3RZG9imSXp4MGfYA1ipJLaRwcpmMOKTqzg6l42OlUyS7u/Na0v196DoHkq27Xauf1t2FlXhcnFZz2w4495MxFC9XoSy8DjR2MAY411DVG5dnELOXXfcR6QkTG199Wkfu1aMe4BgSyUT+zqWVRYT4Dn/eg2//eWfObj/8LK+z3pB0TS0QPCEse2LxZyji17s+7ezmVxir7StvCJIuT6uRv2aZVp8YC5WJo3i9WEW0b53cVkppGXgBLfObpRI00D1+twkWpcNy4Yz7rOTE6iLCE+QEo7d/hDVu5tR9YXfIPR09fHQAwe48NKFKcCYlsQ0JeHA6iezecrDIATJjuFlfZ9wJMS//Ou1vP8dn8Iw3Fjt1WZuaFuxBHUtGEZMhdwITc+TUpwmJ7/osmZw8iLGMDPpovkbmj+InUq6EpguK4qUEjOVJDMxhhGPoeiFjjqhqnm1M1xcNiIbyriXUpKdHFvUFt3wsR4yiTRlLafvbZ8mHk/wy5/+nosfdT7+RYQHxZMmpZHV90oIIQhtrWH0gTbkMivaXP64SwgE/Nx683eX9X1cTo0eDOGrqIZp+VZFwV9Tnysqo/r8+KtrUaYLUKkqgbqmmcReRSHQ0Jync++y+hiJGJPHHiHecZxE2xH0YBht+kZOCLzlVdiGga+iGr3IzZqLy3JhTE4wefQREh3HibUeJhsbJ9DYkudACDa0oLthOC4bnLUR17FCWKkkAjFTROc0MbMmR//6II0XbT/tGPlpUukMP/nBr9i0pYn6xtoFnWOaeMqiMeJBUwWmtbwhMafCUx5C9WpMHuqlZHfDsr2PEIKXXv98PvbeL3D5lZdw4SXnLtt7uZwcRffgr6nHU1YBUmIbBsmeDnzlVSAEdjZDoruDyNaduYRZzR8gvHkHtpGd0lJ3PWxrCduySPZ1w6yb9HjHcUJbdiCqakEIpwKoEKhLICfs4jJfrGyWRE8Hs8NwMoP9eDZvJ9SyDWkZCE1HL1IF28Vlo7GhrsyZsWEnTGCB8cetd+wjVBklXBVd0PHjY5P88D9/RnlFGbvP3bGgc8xGSoinTMrWiPc+vKOO8Yc6MBPLq6deWlbCy294Ae98w4cYHhw59QEuy4ZQFDSfH80fQFoGtpElPdRPerCP7PhoXsz9NIqmofkDrmG/BpGWVTTG3k6l0ENh9GAI3R9w8jhcw95lBZG2hSySn2ObJnoggCdc4hr2Li5TbJirs7QtsuOj6OGFSWCOtPYzfKyPunM3nfaxlmXxwH37+d63fkzTpgbOu+isU1ainS+TcZOyEg/K0udLnjZayEegsZyhfxxe9uTacy/YzeVXXsobX3UTyaSrtrIWUIpIImqhSG7L3GXto2gankhpQbvqc+UuXVYXRdNRixjvqhtf7+JSwIYx7tOjw6g+/4Iy51PjcR75w300Xbpj3tKXqVSattYu/vqnf/C1m7/LgX2HuOqJV7Bj55YlM+zBSaxNpS0qogsvpLWUBDdXY6WyjO/vXPb3esZ1T6asPMqbX/0e0unVqb7qMoPmCxBsbMkluKmBIIG6hlzMvcvaRygK/qpatOCUE0RRCNQ1FjWqXFxWEkXTCDa0oPqcuShUlWDT5mUpzuficqazIWLupWWRHuzDX1132sdmEmke+tkdVO9qIlSRrwyRSmcY6h9mZHiUsZFxxsdjTE7EmJyYxDQtyspLqawq53FXP5podHFFs07GeMygrtLHWMzAMFc39l4oguh5zYzecxQt6CW8pWb53ksIXvb/ns93bv0RN7zobfz7tz9BtNRV71gthKLgLa1AC4SRtoXi8aCoG+ISs65QfT5CLVuwsxmEoqJ4PMsipericro4OTvbnZwdVXW99i4uJ2BDrLzJvm5UX+C0KykmRmPs/987KW2upnJLHYlEio62Ljpau+jq7CUeS1BaVkKkJEwwGKSqqozmzQ2EQgF8ft+SeuhPhmlJxuMGjdV+2nqSc1V/VxzVpxO9aDOje1qxsxaRnXXLZhyoqsorX/tC/vfHv+F5T7ueT978Pi5+1HnL8l4u88ONpT/zUVQVxfXWu6xBFE1zq826uJyCdf8LSQ8Pko2NE6xrmvcxti3p3XectrsO4qkp4VB3F7/9251MjE9SVV1BZXUlj7r8QqKlEYRYG5FNk3ETr67QWOOjayDNMoe8nxI95KPski2MP9hOum+M8ku3ooWWJ25XURSe+8JnsHX7Jt75+g9y8WXn87p/ewWbt7Usy/u5uLi4uLi4uKxV1q1xb2UzpAZ6MeKTBGrqEaeI+00l0nQf66T/UCfZvgmS2SwHezvRe/xU11Ry7vm7KassQ13DChFDY1kqSj1saQgwMJIhlrROfdAyogW8lD9qG4m2Qbp/tYdAfRmhzVX4qqMonqWfeudfdDY7z9rGn3//d17xvDfT1FLPE5/2OC6+7Hy27diM1+d6lF1cXFxcXFzWN+vKuE8PD5LszU/k1EtKaTt4mPvufhBm1VdqqagkWmTbuTLoIdEUISKg8aza/HCSRGzVQ15OxVAMKmtLaK6d+WyWZfOXX+1lbDi2auNSpcBsHyTRPlT09THNotdvslSRTI+9+jIO7jvMFz7x9ZP227ZzM1/73mepqq5Ymjd2cXFxcXFxcVlFxHJLFi41QoghoKPYay+57pml77jh+vru/v7M4eOtKcM0pWGYfp8nKHURLAGEow6P3FpVK8oCIWHapsyapkwaacu0VrkS1AKxpVQVIQrc9KFIQNTWV6gAP/3+n9L9vSPLWz52niiKIsqCEbXUH1JDXr/i1T3Kg13HUv9z/18nT3SMlNIvhFiw5qVACF3zenTVo6uKpilCVYVQlayZTHUMHTxuWBmzyGHDUsqnzvs9TjI3l5AKYHiZ32MpcMe5tMwd51qcmyfjTPg7u2NcGnxSyrPn23mec/NM+Nwnwx3/6lMBHDqd6+aZzBln3J8uQog9UsqLV3scy4n7GTcOZ8rfwR3n0nKmjPNEnAnjd8e4NCzHGM+Ez30y3PGvPuvhM5wOazeA3MXFxcXFxcXFxcXltHCNexcXFxcXFxcXF5d1wkYw7r+x2gNYAdzPuHE4U/4O7jiXljNlnCfiTBi/O8alYTnGeCZ87pPhjn/1WQ+fYd6s+5h7FxcXFxcXFxcXl43CRvDcu7i4uLi4uLi4uGwIXOPexcXFxcXFxcXFZZ3gGvcuLi4uLi4uLi4u64RlN+6FEKoQYq8Q4tdFXrtKCDEhhHhw6vGB5R6Pi4uLi4uLi4uLy3pFW4H3eAvwCBA5wet3SCmvXYFxuLi4uLi4uLi4uKxrltVzL4RoAK4BvrVU53zqU58qAffhPlbicVq4c9N9rODjtHDnpvtYwcdp4c5N97GCjw3DcnvuvwS8CwifpM+jhRAPAb3AO6SUB+Z2EELcANwA0NTUtAzDdHFZGO7cdFmruHPTZa3izk0Xl+Vl2Tz3QohrgUEp5f0n6fYA0CylPA/4MvCLYp2klN+QUl4spby4srJy6Qfr4rJA3LnpslZx56bLWsWdmy4uy8tyhuVcATxTCNEO/Ai4Wgjx/dkdpJSTUsr41P9/C+hCiIplHJOLi4uLi4uLi4vLumXZwnKklDcBN4GjioMTcvOS2X2EEDXAgJRSCiEuxbnZGFmuMZ1J2JaJmYiTGR1G0XQ8ZeVo/iBCiNUemouLywZG2rZzbRobBgTesgq0YBAhXGVll7WLkYyTHRvBNgxnzgZCKNpKaIq4uKw8Kz6zhRCvBZBSfh14LvA6IYQJpIB/lVJuqKSHE2HEJkl0tuaeZ8aGiWzZiRYIruKoXFxcNjpmIkas7WjueXZ8hPDmHeihk6VWubisHmYyQez4EZA2AMbkOMHGTXhLy1d5ZC4uy8OKGPdSytuB26f+//VZ7bcAt6zEGM4kbMskPdiX3yglRiLmGvcuLi6rhpSS9MhQQXtmfMQ17l3WLEYinjPsp0kN9qFHSlBU13vvsv5wZ/Vaxd3AcDkDSSaSfPOW76NqKte/4SX4fN7VHpLLUlPs0uRerlzWNCeYoO68dVmnuMb9GkRRNXxVtSS62mYahUAPup4xl7WLbdu86dU3oaoqRtbk+OE2vviNj632sFyWECEEvopKjNh4Xrsb3uCyltGDYVJC5DnN/FW1bsy9y7rFndlrFD0SJdS8hczoMELX8ZVWoPoDqz0sF5cT8n//+0fGRie48YNvwjItPvTuz3LfP/dyyaMvWO2huSwhWjBMeNN20qNDCATe8ko3XNBlTaP6A0S27CA9OoycTqgNRVZ7WC4uy4Zr3K9RFFXFU1KKp6R0tYfi4nJKbNvm1pu/ywtffh2KoqB4FJ58zeP5zjd+5Br36wyhKOjhCHrYNY5czgyEEGiBEKFAaLWH4uKyIrjaZS4uLoui/Z5H+PXH/ouGSJQdu7fm2i+9/AIeuHcfY6Pjqzc4FxcXFxeXDYZr3Lu4uCyYvgPt7PvZHbT39fP4ph2YsVTuNb/fx+5zdvD32/65iiN0cXFxcXHZWLjGvYuLy4KQtmTvj29n02PP4c59+/A3ljO2tz2vz7kX7OK2P9yxOgN0cXFxcXHZgLjGvYuLy4LoP9COUBT6YhNUVlcQ3VpLsnsUK2Pk+uw6ewf33/MQlmWt4khdXFxcXFw2Dq5xv0aQUiJt1wByOXM4fufD1J7dwkMPHGDz1mYUXcVbESbZMZzrU1pWQqQkzOGDx1dxpC5LibRtpG2fuqOLywohpUS6DgQXlxyucb/KyKnKs/GO40weP0JmbATbNE59oIvLKmKkswwe6qRiWz37HzzIpi1NAHgrIyS6hvP6bt2xiQf37F+NYbosIbZpkp0YI9Z6hFj7MYz4pGvku6w6ZjpFqr+HyeOHSPZ1Y6bTqz0kF5dVxzXuVxkrlSTWegRjchwrlSDR1UZ2Yny1h+XiclL6D3QQqStndGwCy7QorywDwFsRJt0/gbRnisVs3trM/fc+tFpDdVkizCknhJmMY8YnibUewUwmVntYLhsY2zRIdLWRHurHSqdID/WT6GrFNs3VHpqLy6riGverjJGM51XNA0gP9rnee5c1Te/+Vsqaq3nk4cM0b2pACAGA4tFQ/TrZ0Viu7+ZtzRx46NBqDdVlCZC2TXpooKA9Ozm+8oNxcZnCSqexUsn8tlQSK5M6wREuLhsD17hfZaaNojwUBSjS7uKyBpBSMnCwk7KWag7uP0J9U23e657SIOmBydzzmtoqxscnGR+bWOmhuiwlSuFyUfT65eKyQgil+PwTwjVtXDY27i9gldECIYSi5rX5q+tQNLd4sMvaJDYwBgJ80RBHHjlOU3N93ut6JEB6aMaQVxSFls2NHNx/ZKWH6rJECEXBX1kzp1Ggl0RXZTwuLgCK14ceLslr0yNRFK93lUbk4rI2cC3IFcK2TISiFHgUNH+A8JYdTsy9YeApiaK7JbJd1jCDh7uINlYy2D+MoipEopG81/WSAPG2wby2hqY6Dh88xuWPu2Qlh+qyhGjBEOHNO8hOjiGEgh6Jonp8qz0slw3I9HqqqBqB+iaMeAwzEUMPhtFCERTVNW1cNjbuL2CZsTJpMmMjZCfG0PxBfBXVaIFAXh/NH0DzB05wBheXtcXg4W5K6so5eug4DU11BaEZatCLnTGwMgaqVwcc4/7A/sOrMVyXJUIoCnoojOr3Y8RjJHs7AYG/uhY9GEao6inP4eKyGKxshuzYKJnxETS/H19FDVogiFrmhbKK1R6ei8uawQ3LWUakZZHs73ESZDNpsuMjxNqOYGUyqz00F5cFIaVk+FgPJfUVHD3URl1ddUEfIQR62E92NJ5ra2yu48jBYys5VJdlwozHSHQcdxIXUwni7cccYQAXl2VE2japgV5SAz1T6+kYsbYjmBlX+tLFZS6ucb+MWEYWY2Isr01appvJ73LGkhyZxLZs/CVBjh1ppa6xtmg/LewnOzojk1hbV01vdz/ZTHalhuqyDEgpSY8MFbRnx0ZWYTQuGwnHa58/z6RlYaXd9dTFZS6ucb+cCOE8CppdhQmXM5Ph1j5K6itIJtOMjU5QWVVWtJ8W8pIdm/Hm6h6dyuoK2lu7VmqoLsuAEKJosr9wY5xdlhkhBBRRwXGVcVxcCnF/FcuI6vHim6MwofoDqD7/Ko3IxWVxDB/vJVxdSntrJzV1VSgniLPWQv484x6gvrGWo4dbV2KYLsuIt6ySPKleIfCUFr/Jc3FZKhSPF391/k6h4vO766mLSxFcd8syIoTAW16F5g9gJGKoPj96MIyiexZ0Pts0HMUdxU1cc1kdRlr7aHn0bh66535qaqtO2E8LeTEmU0gpcztVNbWVtB7rWKmhuiwRtmmCELkbOS0YchS+4pMIBHo4jOoPrvIoXdY7Qgi8ZRWoXj9GYhLV63cSvD0epLSRloVQVdeT7+LCChj3QggV2AP0SCmvnfOaAG4Gng4kgVdIKR9Y7jGtJKquo5aU4ikpXfA5rGzGUdwZHUbx+vBX16EHXblMl5XFMkxi/WOEq6IcP9rBpi1NJ+yr6BpCVbESGbSQI5dY11DDIweOrtRwXRaJbWTJTIyRGR5EaBqB6jq0UNiRwQyG3GuQy4qjaDqekiieWfUVzHSK9FA/ZjyGFgo7Cjp+15vvsrFZiVvctwCPnOC1pwHbph43AF9bgfGcUUjbJjXYT3qgF9vIYsYnibUewXSTiFxWmPGuIQJlYVRdo6O1i5raypP210I+shMzpeFr66tdz/0ZRGZ8jFRvF3Y2g5VMEGs7iplMnvpAF5cVwjYM4u3HyI6NYBtZsmMjxDuPYxvGag/NxWVVWVbjXgjRAFwDfOsEXZ4FfE863A1EhRDF5Tc2KLaRJTs6nN8obVchwGXFGe0YIFxdytjYBKZpFRSvmosW9GBMzhiD1TWV9PcOYhjmcg/VZZHYpkFmeKCg3XQlL13WEFYmjZ3Nl5a2M2msrCuP6bKxWW7P/ZeAdwH2CV6vB2bLZ3RPteUhhLhBCLFHCLFnaKhQhm1dIwRCdRUC1iobaW6OtPYRqorS3tpFbX3VKVWf1IAXY3zGuNc9OmXlUbo7e5d7qC4scm4KUbQolZvv47IULNV1UyjF10F3fXTZ6CzbL0AIcS0wKKW8/2TdirTJggYpvyGlvFhKeXFl5clDAdYbqseLv6Yhr03x+lDdmMI1wUaam6Pt/URqymg/3kll1amrQWoBL8ZEfhhHXX017cc7l2uILrNYzNxUVA1/Tb6fRagamhtn77IELNV1U/H68JSW57V5SstRvL7FDtHF5YxmORNqrwCeKYR4OuADIkKI70spXzKrTzfQOOt5A7Bh3HqWYYBlIjxelBN4IAA8JaUoHg9mIo7q8aIFQ6ge7wqO1GWjY6QypCYSBMrDtB/vZMv2llMeowa9GLH88DFX6/7MQQ9FCG/egZmMIzQdzR9A0fQT9rdNE5An7ePispQoqkqguh5PJIqZSqL5A2iB4Akleq1sBiklmmv8u6xzls24l1LeBNwEIIS4CnjHHMMe4FfAG4UQPwIeBUxIKfuWa0xriWxsgvRAL1Ymg14SxVdeiXYCOTlF0/CES/CES1Z4lC4uDmOdg4SroiiKQmd7D5c/7pJTHqP6PFhpA9uyUaZCy6prKmk7RVKtlJL08CDZ8VEUXSdQ24DqLsYrjlAUR2rQ6yMzPkqs/ShCUQnU1KOHI7kQHWlZZGMTpPp7QEp8lTWOQ0J3jXyX5UfxePB4PCdVpLNNEyM+QXqgD9uy8JZV4ImWobka+S7rlBUPTBNCvFYI8dqpp78FWoFjwDeB16/0eFYDMxEn3n4cM5lAWibZ0WFSA31Tni8Xl7XHaMcAoapSJsYnMQzjlMm0AEIRaH4P5izvfU1dFW0nCcuRUpLoaic7OoynJIrQNCaPH8LKuAlyq0V2YoxUXxfSMLAzaeIdx/NUc4xknERnK3Y2g21kSfZ2YsQnVnHELi75mMk4ic42rEwaaRqkB/vIjo+t9rBcXJaNFSliJaW8Hbh96v9fn9UugTesxBjWEmY6BTI/x9iYHMfKpFE0N6bVZe0x0tZPuCpKZ3sPNbWnTqadRg06xaw8UWdXqrq2ks72nhP2Tw8PYKYSBGobEIqCFggiEMS72ohs2Tnv93VZGmzLJD0yWNBuxCbQQ2EAshPjBa+nh4fwlJS6Cbgua4JiKk/ZsWG8ZeVuiKvLusRNKV8FimX4C0U9Yea/i8tqM9YxQLimlM72biqqyk99wBSqz4MZm/G6R0tLSCZTxGOJgr5WJkN6sA9/VU3eb0EviSItC2PC9bStNEKIojH0YlbIjVok/Eb1eMBVLHFZIwil0I8pNN2doy7rFndmrwKqP4DqD+S1+apr0ea0ubisBTKJNJlEmkBpmI62bqqqT62UM43q92DEZkI4hBAn9N4n+zrRI6UouievXQiBt7SM5EAvzmafy0ohFBV/dS2zhc2EqqGHZsKy9Eg0XzZTCLwV1e4ui8uaQQuGHGN+Fv6qmqI3pi4u64FThuUIIS4GHgvUASngYeDPUsrRZR7bGY1lWchsBoSC5stPBtR8fgINLVjJBLaRdYz9QKFhL6XENgyEUtx7th6wbZuhwRF8Pi8ls+K4U8k0E+OTREsj+PxuMuVqMtYxQKS6FCEEnR09nHP+rnkfqwY8pPvH89qqayrpaOti9znbc21mIo6ZTBJsaC5+Hn8QRocxE/FcOIjLyqAFw0S27sBIJqZCpUJoPj+2kQWca1No8w7nWiUliseD6vNjmwbSlii67hr6K8D42ASZTJbKqvI89bVYLEEilqC8ohTdsz7XEWlZ2JaJomq5G03LyCAtG0XT0YMhQs1bnMq1UoKqoYXcENj5kIgniU3GKS2P4vV6TthvZHgU25JUVs9/Z9dl+TihcS+EeAXwZqANuB84jCNp+RjgRiHEw8D7pZSuaPUczGSC9OgwxvgoQtfxV9WiRUpQ1Zk/t+4PoJ/EU28bWdKjw2SGBxCqir+mEU8ksq5iWHu7+/nR937Oz/7711RWlfO2976ORz/2Eo4dbuXmz3yTvffu41FXXMgb33E923dtWe3hblhG2/sJVUVJZ7KMj4xTVnFiVYq5aAEvZjw/GbaiqpyujnzPfXKgB0+07CRFaQR6uITM6JBr3K8wQgjHoA84xpBtGqSGBzHjk6g+P5nRYUDiLa3AymbQQhGsTJpUfw/SMvGWV+Etq3Bjm5cJI2vwzzv28LmPf5WRoVH+5YXX8q8vv466+hoeuHcfn/v4Vzl+pJ0nXXMl17/+xbRsblrtIS8pZipJsr8bMx5HC4UIVNc7c7S/ByubQQ+X4KusmWrrzs1Jze8D5cTGqgvs23uQL3zi6zzy8BGufMKjee1bXs7mbS15feLxBH/5/R18+XPfwsgavOp1L+ba5zyJsvL5rxMuS8/JPPdB4AopZarYi0KI84FtgGvcz8KyLNKjw2RHnap7MmOR6Goj1LIVNRKd93kyY6OkBxzJf2lZJDqPo2zesW4MG9u2+dH3fs53bv0RALHJOG9+9Xv4r59/lbfe8D4GB4YBuP3Pd3H8aAff/emXTyvW22XpGGnrp7Sxkt6ufsory1BPoCFdDNXvwUo42tLT3tvqOVr3ZjKBlU7hq6w+6bm0UJhEVzvSsopWT3VZGYzYJKneLvzVdaQGZm7S0kP9+KvrwDJJ9MzInaYH+xCKgr+qdjWGu+555MBR3vTqm3Iha9+59UcoisJ1z7+G1770HaTTGQB+9ZPfMzo8zue+8iECwfUhAWlls8TbjzoeecCMTRJPp9EjJVhpx3QxJsbQg2GSvTOmijsnT01nezeve9k7iU06yci//7+/0NszwFe/82kiJTN2yN579/O+t38y9/xzH/sKJaVhnvXcp634mF1mOGHMvZTyKycy7Kdef1BKedvyDOvMRWYzGOOFEUunI+VnmyaZ0cKS3GYitqixrSWGBkf42X//Oq/Ntm262ntyhv00XR09dHVumNpma46xjkHC1aV0dfac9parUBWErmEls7m2qpoKOtu6c89TQ/14IqWnLBmvqBqqz0825sosrhZSSjKjw6h+f1EFEiMeQxYpPJ4ZGcI2jZUY4obj6KHjBbkoP/nBrxgYGMwZ9tPc+de76esdWMnhLSuO/Gr+vLKNLGLWLrlQ1aLrrzsnT05HW3fOsJ9m3wMH6Onuz2u77Y93FBz7k+//imw2W9DusnLMJ+Z+E/AmoGV2fynlM5dvWGcwQkHoOjJjzWmev6dRCIGi69jZ/Avz3ISgMxmfz0tlVXnBxSMQKgxVEkIQCKwPT9OZRmoigWWY+EqCdLX1UF5RdtrnUAMezHgKLeiEZVTVVNDV4dys2dksZmySYFPLvM6lB0Jkx0fxRk9/HC6LRwiB4vVixiYRvsLf6oni64XuKpMsF6FwYex4VXUFXk9hyEkwFMDnWz/hUScL45tG2nZxhTrdVXQ6GYFg4e/b4/Xg9+fPn7r6moJ+DU11p7XD67L0zGdm/wJoB74MfH7Ww6UIms9XsNWneLyo/vkbp0JVne3t2QoVuo4WXD8JQCXRCG977+vyLsKbtzazZVsz//qyZ+f1fcVrXkjLlvUVJ3qmMNrWT6S2DCEEXR09VC0gWUr1ezDiMzeqJdEIyUSSZCJJemQQLRye982vGgxixCeRtn3qzi7LgresEtsyUb3e/O9NUVD9AaRpzFE8EgRq6lHcxX5ZOPvcnWzeOpOIrigKb3vv62hsrueKKy/N6/u297yO+sb1E4qien14y6vy2rzlVZiZWY4xKVEDwSJzss6dkydh6/ZNPPmax+e1vfHtr6axuT6v7aonXU60tCT33Ofz8qJX/otr3K8y8ylilZZS/vuyj2QdoUVKCLVsxcqkEYqK6vejTyejWeZUzLAGUiJtC0XTCzwLjkLFTsxUEqGqaP4Aqnd9qcY8+rGX8F8//ypHD7USjgQ569yd1DfW8rq3voorn3A5vd0D1DXVcPY5O0+ape+yfIy09ROqjCKBnu5+nnLt4095zFxUn55XpVZRFKpqKuju6KVSxgnUNsz7XIqqoXq8GIkYnnDJqQ9wWXL0QJDI1t3YpkFo0zasbAZs29lttCz0UARvWQVmKom0LOfa5cr8Lhv1TbXc8p+f5uD+Q8QmE2zbuZldZ29H1zU+9Jl3cXDfYYYHR9m0tYnd5+xY7eEuKUJV8VfV4imJIi0boaqoPh+2YeIJhbFNE9XrQwsE0TZvd6rC2xaqP+hKT5+CkmiYd3/ozTzjOU9msH+Ypk0NnHXu9gKjffvOLXz3p1/m4P4jGKbJrrO2sWP31lUatcs08zHubxZCfBD4I5C7HZZSPrBsozrTMU2ykxNkx4ZRNB1/XSPStrHSKRK9nVjJBFowhCdaTrK3E08kir+6DtU34913FCqCaIHgKn6Q5UXXNc69YDfnXrA7r720rIQrrnrUKo3KZTYjrb3UnNXM2Og4iiqKhk2dCtWfX8gKoKqmktjgANX1ZShFwgdOfr4gxuSEa9yvEkYqiTExRmZ4EAR4K6rxlJSi+fJ3J9ebM2It09BUS0NToUe+uqaS6prKVRjRymFlUiT7e5x1NRDEX1OPHoqgzdotl5aFEZ8k2eeo5fjKq1A03Sm25nJCKqrKuPKJl5+y36atzWzaWlzG2GV1mI9xfw7wUuBqYHovXE49d5mDlJL0yGBOLcc2siQ6jqNs2Um84xjSNAFH19vOZvGWVpAZHcK2bcJNm10VEJc1g7QlY52DbHvCBRw6fJyqqoUZCarfQ2ZoMq+tvKKUiGajhyMnOOrEaIEA6aF+wA3VWg3MRIz0YF/ueXqgF0XTC4x7F5flxkwniXe2IacSY81kgnhXG+GW7XnGvZlKkOhqyz1PT0tMV9et+JhdXFaC+Rj31wGbpZRu6vM8sA2D7OhIYXs2kzPsZ/pmEZrzFZixCSwji6a6C6TL2mCyfxRP0IfH76Wns4/yyoXpFqs+D2YiPzl86+Z6/B51QXkkiseLtGysbMbVTl9hLMvCmBgraDcmx/GVr28Pscvaw8pkcob9NNIwsLLpfOM+mSg4NjM6jLe8ct0WiHTZ2MwnofYhILrM41g3CEVBKVLS+lQeeaFqJ8z8d3FZDUba+ojUOKo0ne09VFQuTKFG9etYqSzSnpHrO393C4eP9SyocqkQAtUfwIhNnrqzy5KiquqcxEQHxeveZLmsPCdKiFXUfL9lMaU5xeM5pfyui8uZynxmdjVwSAjxByHEr6Yfyz2wMxVF0/DXNea1qT4/iteHtyK/SI+3rBJjSrM7UNfoeiFd1hTDx3oJVzve+p7OPioXWERMKAqKR8NMTnvvJS01Uf655+CCx6b5/bnfjsvK4iktz1PJEaqG5zQK9Lm4LBWqz4+3LH/HyFtRlZe/BqAHQyiz11ch8FfXu2GwLuuW+YTlfHDZR7GGsS0TaZoIVUPRiv+5rGwGpCNXKU0DxeMjsnUXVjrlZO/7A6geL0pVDZ5wBMvITnm/BGog6GTzn+GZ+7FYgrGRMSIl4TxZLJczl+Hjvex40kVYlsVA/9CCw3JgKqk2nkYP+fCrIIXC8ePdmKaFpp3+Aqv6AmRGh/Mq37osHmlb2IYxtQNZ6KG3bRtF0wm2bMFOp0GA6vWvm8rZZwJ9vQNYlk1tXdWGlBuUloVtGghFRdF1fFU1aOEI0sgidA+aP1CwVqteH+FN27DSKUctx+dHLVKnwWXlmbYdSqIRSqKnn4PlUpz5GPedQJ+UMg0ghPDjePPXPWYykVO3Ubw+gg3N6MGZRcy2TDJjI6T7e5HSdjxaQGZ8FH91Hd7S8rx4PkXTUcIlrLcIv0f2H+HjH/gS+x44wNbtm3j/J97OBZecs9rDclkEmXiK9ESCYEWEgb4hwiUh9EUoS6j+mbj7sGaTsgThSIjRkTGqqitO+3yKriMUFSudOuNvjNcKZjpNaqAHY2IMoekE6pvwhEty4YJmOkVmZJDM6DAIga+yBm9pubvjuEJMjE/yq5/9ga9+4T/IZg1e8qrn8qJX/su6V8OZjZlOkezrwoxNougeAg3NgCA90IuVTqH6/ARqi++Cq16fq+C0xji4/wgff/8X2b/3INt2bOZ9n3gbF1zs2g5LwXzCcn7CjEoOgDXVtq6xDYN4x3GsqUQcO5Mm3nYsr4y1mYiT6u1C2hZISXZ0GKGoCKGQ6uvGTBSWZ19vDA+N8vbXfYB9DxwA4NiRNt74qnfT1dGzyiNzWQwjrX1E6spRFIXurj6qFhiSM43q1THjaQSSoAopy5E8HRooTD6f9zl9fsxEbFHjcnGQtk16sC+XLCtNg0THccxUMtfHmBgnMzIEUoJtkx7o3RDXuLXC3vv289mP3EIinsTIGvzn1/+bv/zhjtUe1ophWxbJng7MqVwb28g6a3IqgZV26mhY6RTxrjbMdOpkp3JZAwwNjvDW17yP/Xud8Myjh1t54yvfTfdU9XKXxTEf416brZQz9f91Lw5rZTPYRr5AkLQtJwRnimIJfUZ8MqcAkp0cX9YxrgV6u/rp7urLa4tNxulyf6BnNINHuonUOgm0vV19lFUsPCQHprXuUwRUSdYGG0FJSYTB/uGFn9Pnx4i7SbVLgW0aZMcLb7SmnRm2YZCdLKKS4+Y9rBh3/PXugrZf/M9vSafSRXqvP2wjW+RmUhZUq5amkeeEc1mb9Hb309czkNcWm4zT1enaDkvBfIz7ISHEM6efCCGeBSx8RT5DEKoKRWJ5Z2fhq0UUIhTdg2040lxzk3rWI6FIEN1TGGhUUuLG4J7JDB7uIlrvhMt0dfZRvmjj3vHchzRJynJ+V5FomIH+oUWc04+ZiCOlPHVnl5PiJD0XuZ5NX+9UtfjrrkrOirFpS2Fdh207thS9/q5HhKI4ld3ntp9inXZZm4TCQTS98HuKuLbDkjAf4/61wHuEEJ1CiE7gRuCG5R3W6qN6ffhrGvLavBXVeYuZForkJ50pCnoogpVKIHR9Q1TQbGqp59/e/Zq8tpf/vxewaatbYOhMxUhniQ2MEZ6Swezp6qNisWE5Pg922iCgQtpy2qKlJQwuwrhXtKm4e9dLt2iUqRj72ajBEGrAyWdQFAVfWWWeSo6i6+ih9X+NWytcceWl1DXU5J6HwkFe9MrnbJikWtXjLZijekkU5nx+X2XNhnCsnek0tTTwlnflm5KvfO0LXdthiTjl7a2U8jhwmRAiBAgp5YYIchVC4C0rRwsEsLNZFF1H9QXyPAKaz0948w6sdBIpJYrXh7RMwpt3IDUN27KQqSSKx/HmKyfQiIapYhzSRvV48hbQtY6maTznX6/h7HN30tPdR1V1JTvP2kog6CY5nqkMH+0hUlOGqqkYhsnI8Bil5YsPyykp9+dCcgBKSiMM3b3wmHuYiruPx9zqqEuAHoo4Kl+ZNEJVHdWRqeuVbZqgqoQ2bcXKZhAIFI8XoWmYmTQCp7iYq1y0fGza2sy3/vuLHH7kOJZpsnXHZjZvbV7tYa0onkgUdetOrEwGoWlo/gDSlmj+oJP7JhRHmU7TMFOOMo7i8aIWqT1zIqRlYRlZhKK4yeLLiK5rPO/Fz+DcC3bT091PdU0FO3ZvJRBwr+VLwQmNeyHES4AfSiltACllfM7rW4BaKeWdJzjeB/wd8E69z0+llB+c0+cq4JfAdF3o/5VSfmRBn2QZUFQNJRiG4In7qF4vqteLmUqSHh4kOzYCAnwVVSBUFE0l0z2ClUoidJ1gfTN6uCS3CNqmSXZilFRfD9K28JSU4q+pP6Oy+oPBABdcco6rkLNO6D/USclUSE5/3yClZSULkqucjVAVqjZXkMzaTG8YlpZGGB4eRcqiEXDzQvX5MOKTzu/NZVEIIdACQbRA/gXPTCVJTSfbKgq+imoUj4fM8ABCVcmMOTdovvKq3Gsuy0NDUx0NTXWrPYxVQygKWiCEFpipbJ2dHCfZ24WdzaB4vQTqmjATkyT7upGmiRYI4q9tRJ9HNWwrkybZ14MxOYZQVPy1DXijZa4e/jIRcG2HZeNknvtyYK8Q4n7gfmAI8AFbgStx4u7ffZLjM8DVUsq4EEIH7hRC/E5KOTcr6A4p5bUL/gRrhOzkONmxqVQECemhAQL1TWRGhnKZ/HJKgSeydVdOvs9KJUn2dM6cZ2IMoXsI1Da4XjCXVWHgkU62PNa52PZ09S24Mu1cypuiDMSyKCHnsuP1+VAVhXgsTjhy6oW3GI7e/Yird7+MZMdGcio6TKnqBBqaUbw+0oMzyfTp4QEUnw9f2caRZnRZXYxkgkRXG9JyYv3sTAYrlSTVP6PWZiYTpPq6UJq3ntSDL6UkNTSAMZU4Lm1HnUf1etFDrv66y5nFCWPupZQ3AxcC/w1UAk+Yet4DvFRK+S9SyqMnOV7O8vbrU491mflmWyZGEWUcIx5DzA3DkRJ7luKOmUoUHJcdH0Ga5lIP08XllKQnEyRHY4RrnDCc3q7+RSvlAPi9CpZpk4ln8tpLy6IMDiw8P19oGgiR95tyWTqsbLao6pdtGFjFrl1jI26Cs8uKYWfTOcN+mrnqOeAY+Ke6RtimgTExWnisK6vpcgZy0oRaKaUlpfyTlPJDUsrXSCn/TUp5q5Sy82THTSOEUIUQDwKDwJ+klPcU6fZoIcRDQojfCSHOOsF5bhBC7BFC7BkaWngC3rIhFFRvYZyY6vUh58hpAnkZ/8Vi8FWvP1c4xmVts+bn5mnSf7CT0qYqlKn5193ZuySe+1BAIzGRxkoZee0lpZFFad0LIdB8foz4hkgFOi2WYm4KRSkaIihUFUUvjEfW/EF3B8XllCzVdVNRCz3xxeaf0PRThtYIRUUpMtdVbWOoEbmsL5bVgpy6OTgfaAAuFUKcPafLA0CzlPI84MvAL05wnm9IKS+WUl5cWbn2tnwVRcFbVlFgtKs+P56SfMPIU1aB6p+5EdCCIdTZFTaFgr+m3o3xO0NY63PzdOnb30pp00z8em93/5IY9+GASiJpYqXyvWeRkvCiPPcAis/nFrMqwlLMTUXT8FVW56vkeH0IVUPRdZRZYQ5C0/CULk5VyWVjsFTXTcXnx1dZk9cmNB09Es1rC9Q2nDLpXlFVAjUNIGbMIjUQQg2cJOnOxWWNsiJisFLKcSHE7cBTgYdntU/O+v9vhRBfFUJUSCnXjI6+bRjYpoHQNNRZXnYzlUBaNorXi6p70ENhQi3bsNJJhCJQPD5s00ANBAlt2QmWiVBVVK8/p7hjppJIyyLYuAk7m0XaFprPf1oyXsmxGNlkGn8khDfsHGeaJj1dfVimRWVNBUMDIyiKQn1jLXoRXVkXFwDbsuk/2MlFL74agGzWYGx0gmjZ4uQOFQE+j0oma2Ol8neySqKRRclhgqOYkx7oO3VHlwWhhyKENm3DSqccrXHd42RA6zrBUNip6zGlFoYQOdUSO5tBSomqe9aNsyIxOomRyuAvCeMNLVz0IB6L0987iC/gp6GxllQyRU93Px6PTkNTXW7nzOXkqLqOp6wSPRzBtqwpRToveiiMGS1DmiaK14cWDGHbNnY65cxJjzfvxnQaPRSmZNsuzHTKUYzy+U+ocLdWsS2bxPAE0rYJlJegeVZnzU+n0vR096NpGg1NtaiqSmwyTn/fIIGAn/rG2lUZ10Zh2b51IUQlYEwZ9n7gicCn5/SpAQaklFIIcSnOTsLitPGWECMRJ9HVhp3NIDSdUGMLis9PdnyM1EAP2LaTiV/XCEIhPdyPMTGGv7qOzMgwZjKeU5cw4zGsTJpAQzNaIIQxOU6qvxtpWag+P4H6ZjyR+RtRtm3Tf6Cd+773ZzKxJJGaMi59xZMRET8//M7P+I+v/RDTMLn6KY+ltr6aH33v57zs+ufz0uufR3nF0iRIuqwvho/34isJ4As7O0l9PQOUlkcXraMd8KukszbCoxaE5ZSWRmg92r6o8yu6Z6p6dBbVVWpZFvRgCBSF9GAfejCMmYyTHR8FBJ7Scke1aHIcoaoIzYNQBKmBXpASLVxCsK7xjFIAm4ttWfQ81Mr9P7iNbCJNSUMll778yZQ2nr7XufVYOx97zxfYc89DBEMB3nrTa2lv7eL73/4JXq+H17/tVfzLC691i/nMEzuddNRyjCyK7iFQ34iUCsmejqn1NYC/vhkzNk56qN+Zk6EIgZr6AmUocJwFZ6pOfjqW5NhfH+LQH/dgWxZNl+zk7Gc+mlDFytaj6O7s5eZPf4M//uZ2NF3jhje+lKue/Bg++p7Ps++BA4QjIW780Jt5yrWPx+t1r9nLwSndA0IIrxDiRUKI9wghPjD9mMe5a4G/CiH2AffhxNz/WgjxWiHEa6f6PBd4WAjxEPDvwL/KNZKNZWWzxDuO55JwpGkQaz+ONZV5z1TSjplMkBkcxJwcx5gYQ/UHMVNJx7CHnLqEHilBWiaJjuNY6WTuwgNgpVMkezuxisTnn4hY3yh3ff3XZGJJACb7R7n7P3/P/Xc/yK03fxcjayCl5Lbf/x3TNCkri/IfX/she+5+aAn/Si7rie69xyjfNONN6esZWJp4e79GOmuheHSszJyY+7IShgYXt1EnhHD07t3QnGXFmBjDSiSwLXPKsAeQOZWwbGwSoWoIRXHUSqYu5WZsgvTI4BmdaDvRM8Ld3/wt2YRTMG2ie4g93/8T2eTpFVBLpzN85fP/wZ57nOtwIp7kY+/9AmVlUQAymSxf/OTX2f/gI0s6/vWKkYiT6G7Hnlo7bSNLoqsdRVNmra9J7EzKUXaanpPxSTKjQ9hFkm/PZIaP9XLwt/dgmxZI6Lz3EF33HV7RMUgp+dXP/sAffv1XpJQYWYOvfOE/uPeuB3h4al7HJuO8722f4PDBYys6to3EfPb+fgk8CzCBxKzHSZFS7pNSXiClPFdKefa0fr2U8utSyq9P/f8WKeVZUsrzpJSXSSnvWvhHWVpsI4s08w0RpI1VJONeSjOnKKEFgxjxycI+szL67UzhOaxUEjs7f+M+MTKJbeVfmKRpc+8/9xb03fPPBzn7/F0A3Hn7XCVSFxfngtzz4DEqtsxoaHd39VK+yOJVAEG/SjpjIzQFpESaM7+FSCREPJ4imzVOcoZTo/r8GK5xv2zYhoExOY5WEsWMFV7fzHgMPVKCmYwji4iiZcfHzmgFsPjweMHNyVjHIKnx+AmOKM7o8Bh/+UNhaZhUOv8m4cC+lTXIzlRsI1OolmNZOWMfQPF4cnLUszFiE3n91gODh7oK2jrvO4yRXrnPGZuM87tf/rmg/fDBY1RW5+fkdLZ3r9SwNhzzCctpkFI+ddlHssYQquYk1sh8A1rRCv9kUoLmD+QMdNXrw0ol8883K4ZSFIn1E7qOchrhD9Px9bOxDJNt52wqaN+0tYnOdkf3d9dZ2+f9Hi4bh7GOAYQQBCtm9Jy7O/vYtGVxpcAVAV5dIZO1EQhUr46VyqJNzV8hFEqiYUYGR6htqDnF2U6M6vOTHhpY1FhdToKqovoC2KkEij8AyXyjVvX5yU6OowdDRdVKVH8AoZ65ceTToWp5bZEAuv/0KpiGQkG2bG/hyCPH89rnhiY0NW/cQlWnw2wRi5lGkdduZ42ihdWUWflv64WShsKE9rJNNagrmGsXCPg569yddLTlG+519dVMjOU7BsqXQGbZpTjzudreJYTYcOXDVK+XQH1jXpu/ug7VH0QLzypoIQS+iio80XKEpmFMTuAtLc/LuNeCoZzH31teherzoeep6AgCtQ2nFecXqS1j51MumTUMwfnPu5LLHncxO3ZvzbWXlpVw7gW7OXzwGFu2t3DFVZfO+z1cNg6de45Qua0+zzBbCqWcgM9JpJ1G8WpYc7xIpWUlDA4uLtVG8XixTSf53WXpmVYEs7IZ9GAkz0GheDyO4pdtoeienJDANEJRCVTX5SnunGmU1Few9crzcs+FIrjoxU8gUHp6cfGRaJh3f/jNecb845/8GHq7+3PPL7jkXM67qKgqtMschM+Lrzr/RshXXYth5e+yqL5AniqdUFT8VTVFnXVnMtU7m4g2zOSBeMN+tl51PsoK3lhrusbLb3gBJdEZO2n3uTu49IoLsWaFQV1z3ZPybBWXpUWcKA5SCLEfp+iUBmwDWnGqzgqcGlXnrtQgZ3PxxRfLPXv2rMh7SdvGSqewspkpaUsfiqphZtLY6RS2ZaF6fbmy1mYqgZXNOl56RUVmM44etKZjGVkUTUP1Od4CK+tU0rNNE9XrQw0ET1shwUhlmegdJj2ZIFhRQqS2HFVTGRwY5uihVkzTpKq6gu7OXgSCXedup77hxBnqtm1z+OAxJidiNDTVudnszlyfNys5N5cSaUt+/Z5vcdYzZhKvMtksb37Ve3jLjf/vtHaU5lJV6kHXFcYnHaM70TmEpyxMsKki1+e23/+dHbu38sSnPW5RnyPV34OvsgZPyYbwBq3K3Mxd41QV2zQRUiJ0HWkYU4nNNqrXg1A0rHQKaVsoPj/aGZxMO002kWaid4RMPEmoMkqktpzUeJxsIoUvEsQfnX+V5eNH2+lo7SIUCbFtx2YmJyZpPdZBSTSCbUs8usa2XZvxT8kmZzJZutp7kEgam+rw+df033NF56aZdtZRaZoITUNoOqqmY6VT2JaJ6vGi+vxYmQxWOunMUZ8fPRBEWlbO8aZ6vWf0Deg0iZFJxjoHsS2baEMFkZqlFdCwbZuujh6SyTT19TVEosVvcLvae2g91oHu0dm2YxMVVeUcP9pOZ1s34ZIw23ZuJhqN0NbayWDfEOWVZWzdXhh5sMRsmCIcJ7ttvXbFRrFGEYqCFggWZNRrXh/MWaysTIbUYH+uTLuntBykJDsxhr+6Hm95ZZ6RpHq8qJ7T29Kdi+735MVIT1NVXUFVdQXtR9q5+bPf5LY/3omiKDzvX6/lVa99EbXNhUZ7LJbgNz//I1/61K0kEylaNjfywU+9k4sedV5BX5f1xfDxHlRdy1NU6OsZpKyydFGGPTie+3hqJtZa0bUCOcxINMzAIuUwwdG8NuKTG8W4X3GsTJrUQF+uGre3vAp/lRNKlZoYJzPSBoAeKSVQ24A+e4dzHeAJ+qjcVg84N8R9D7dx73f/SDaRxl8a4rJXP43KrfXzOteWbS1s2daSe15aVkIykeJLn7qVf96xB01Tee6Ln8lLX/08PF4Pt978XX72378G4JpnP4k3vfPV1NYvPIxtPSENg0RX25RxrxNq3ITi86OE8o1OzedD882s21Y2Q6q/l+y4s2voKavEX12bJ3l9ppGeTHL0rw9y9C97kbak7rwtnP/cxxKqjC7J+RPxJD//8W+4+dPfIJPJcvb5u/joZ29kSxGjvLGlnsaW/N/D1u2b8gz4v//lbj560+cY6B+itKyE93z0rTzp6Ve6UrBLwAn/glLKDillB/Cx6f/Pblu5IZ4ZZCdGc4Y9OGXYlSnjPdXfXbRU+3Lzx9/czm1/dJK3bNvmxz/8VdGEW4AD+w7xifd/iWTCSTxqb+3iMx/5MoP9a6bkgMsy0fbPg1TtzI+t7+3uWxKlHH+xsJw5haxKS0uWxLh3K9UuL9mJsZxhD5AZGcRIxDHiMTIjg7l2Y3KM7MRokTOsHyYHRrnrG7/JqeekxuL88xu/ITm2sPln2za/+tkf+OcdjgfbNC1+9N2fs/e+/dz7jwf46Q//DyklUkp+/fM/8tc//mPJPsuZjJVJE+s4nkvWlqZBvPN4UeGLuRiT4znDHiA7OoRRJFn8TGLoaDdH/vwA0nYiMnofOk7HvYeW7PwH9x/mMx+5hUzGcdA8/OAjfOUL/0mmiEjIqTh2uJUPvOOTuWv/2OgE73/7Jzm4300mXwrmc3uUF/wnhFCBi5ZnOGcm0rbIzjLsp7HSqZyBb2VOTzJtsaQSSW77c+ECcPdd9xft3z2VcDubRx4+Sn/fYJHeLusFM2vSs/cYVTsa8tp7uvpy8nwLxasrWJZkttqc4tELtO5LykoY6l98eQvF68POZrHPYFWWtYq0rFnylzMYsQnMIkok2YmxAhWT9URyJObIDc4iPZk8bfWcaUaGRvnH7fcUtD/0wAGOHWkvaP/9r/+y7mQcF4JtZGHO30Fa1imV56SUZMcL12xjYnwph7fiDB0pXMe77j+6ZGo5XZ29BW1/u+0uRofHT/tcvT0DjI7kH5dOZ+judAsSLgUnNO6FEDcJIWLAuUKIyalHDBjEkcd0mUYoaMHCeEvV40UajiGjaCu71ef1+zjv/N0F7btPoJZTUVWYZV9TV5WXFOOy/uh96Djh6rICNZDuzl7KKxcX3uL3KWSMOWpT3sKwnGg0wujIGLa9OB10V+9+GVGKX+O0QLBoeKEWcIperVd8kUBB9K7m1fEEFxYLH4qE2XHWtoL2LdtaqK6pKGi/5LIL3NAFptVy5nwRQiBOkSgrhCg+n4u0nUlEixRVq9hSh7pEVWqL7ebuPGsbocjp/93KKkrx+fKvHYqiUFHlFtlcCk4WlvNJKWUY+KyUMjL1CEspy6WUN63gGNc8Qgi8pRV5ZapVnz9Xil2PlKIFCqXUlhNFUbju+U+ntq4q17Zz91auuPKSov13nb2d615wTe65x+vhXR98E82bGor2d1kftN75MNW7Ggvae7sHqKgsvOE7HfxelWx2jnGvq0jLQs6q0aDrOj6/l/HRiUW9H0zp3buhOUuOEAJvWRXKLJUc1R9AD0XQQ+E8JRJF1/GWVRSVxFwvhGtLOfe6x+SeC0Vw8YufsODYZr/fywtffl2eYXPO+Tu56FHncfmVl7Jt5+Zce1NLA9c8+0kLHvt6QvX5ClTtAnVN86qG7C0tz5PIVHw+9Eh0qYe4olTtbKR800wuhj8aZOuV5y3ZjeBZ5+zgqc+8Ovc8GArwzve/gXC4sNLvqdi5eytvf+/rc2MTQvC6t77SleteIk6mlnPhyQ6UUj6wLCM6BculSGKbJlY243j/vL6cLr2VzWAbBkJVwZbYpqMKofkLZSvNTBorlUQIgfB6kdksQlEdlR2tUNt+oSRGJ0lPJPCG/KdcTLpauzl2uA1d12hormNsZAx/wE+0spTB/mFKohGaWhwJxOGhUQ4dOMrY6DjNmxoJhYOkkimqqisZGRkFCXW1VZixNIqmEqqKok3p5/b1DDA0OEJpWQmNzfNLKjsDWNdqOcnRGH/46Pe57PqnoWozibPpTJZ/u/49vOXGG/LqM5wuWxoCjE0aeTH3AOP7Oym7eDPaLC/nj//rF7zgpc9m51mLk0Yz0ymyo8OUbF/3UoIrMjenr4sA0jIRioptZBFCcZS/NA0rm3ZifKWcUiLxLVosYC0ibUlsaBwjmSZQGkYP+Bhr7ycdT+GPOsaNvyREsHxmt3Ogf4iBviGipREam+sZHRmnt7ufUDhAU0sD6pyE9UMHjnLsSBter4ftu7ZQUVVOV3sPmXQW27ZIJtNs2tJI3UlUz9YAK3rdlLaNkYhhTyk26cHQvK9bVjaLlU4hhEDx+dZ8Mm18aJxMPIU/GiJQGsa2bOKDYxgZg2B5BF84QGoiwWTfKLZpEakty5uPsxnsHaS7o5dgKMCmHZvweAptFCklXe09jI9PUl1TQXVtFZPjkxw70k48Fqd5cyPNmwqdQ+CEdrYd78Tj1dm2YzOlRcI8U4kUBw8coaerj5raKnadvY1w5PTkZU+T9etxmMPJ9mo+P/WvD7gYeAjnD3MucA/wmBMcd8ZhpdPEu9uwkk7Sq7eiGl9lDXYmRbyjNbeo+apqyIwMIaUk2NiMJxydOUcmTbK3M1e90VNajr+mfskvFgOHOrn7278jE0uh+zxc8vInUXfelhPemTdubqBxcwOP7DvM21//QY4eaUPTVJ73kmfRfryTB/c8zHs//jae9oyrqags4zFXPYrxsQm++40f851bf4RlWew6extPfNqVfPmz3+Kqqy/nuisfw/A9x9h29fnsfOolPLTvEDe+6cOMjowTCgf56GffzVVPvqJg4XJZW7T/8yBV2xvyDHuA/p5+yivKFmXYC5yY+6xRGBesToXmzDbuS6JhhgaGF23cq14fViaDbZrrTsN6pbHSKeJdbejhEoz4JHowjJmMYyacuHJPaTmq10+q3ylWo0eiBGob16VhbxomnfceYu+PbscyTAKlYS568dU8+LM72PTo3ez5/p8xkhk8QR+Xvfqp1Oxu4cE9D/P2132AocERQuEgn7nlg3zyAzfT1dGDx+vhbe95Lc9+3tMJBB1HUUdbF5/58JfZc89DCCH48Gdu5PY/35mraHvlEy6nuraS/xkc4V0feKMrVQwYhoEdnyTZ24m0LISqEqhvxhudX2iH6vGgFilwtdawbZueB49z3/f+hJnO4g37ufy1z2C0tY/9v/gHtmUTri7l0f/v6UQbKvGXnNyTfmDvI9z09k/QfrwTTdd4/ZtfzvNe/ExKyqO5PoZh8uff3s6H3v05UskUFVVlfO6rH+bCS87lwktProT+0P0H+NzHv8JD9x9ACMGznvtUXvb/ns/WHZvz+vmDfi669DwuutRV5VtqThaW83gp5eOBDuBCKeXFUsqLgAuAYys1wOVGSkl6ZCBn2ANkhgechW3KsAcnaTY10IuntBxpGiS7O/ISybLjY3ll2bNjI5jxpc28T4xOcve3HMMewEhnufvbvyc2UJgYNJtkIsnXb/4uR484UnWmafHf3/lfLrnsAlKpNO9/+yc5NvUawP4HH+HbX/0B1lRC3CMPH+WRh4+w6+xt3P6Xuzg2Moge8HLktr10tXbzrjd+KJcYE48leNebP0JHa2EZbJe1g5SS1rsOUL27sAJtT1c/5YtUyvF6FAxLUmxjUExVqZ1NSTSyJIo5btz90iClTWqo30lONLJII4u0rJxhD841TtoWTIXfGJPjZGep6awnJntH2PNff8YynPUgORbjwZ/8nR1PvJADv74bI+nsbmQTaf75zd/R297DTf/2MYamirNdevmF3PK5b9PV4SQ8ZjNZPvXBf+fIIadSrW3b/O+Pfsueex4CIFIS5ujh1pxhD07iYjAU4N67HuC2P9yxYp99TZNJk+jpyCVvS8si0d2Osc5+/7H+Me759u8wpxJjM7EUI8d7eehnd2BPhTjGBsZ48Kd/P2XybGwixpc+fSvtxzsB58b13z//bQ7uP5LXr+1YB+956ydIJR17Y3hwlBvf9BEGB06uoJfNZvm///0DD91/AHDWml/85Hfs23vw9D+4y4KZj2tup5Ry//QTKeXDwPnLNqIVRlomxmRhrK9tZHOG/UxnOet1A3sqWVbaFtnJIpn3saW9wKTGE2Ti+coUtmmRHD35+4wOjnL3XYVRVIlEEkVRkFLmVUg8dqi1oO8D9+1n99k7ALjr7geI1DrG30DvIGNzYqWNrEFfr6uys5YZPtaLEIJwdWHSbE9XH2WzPDgLwYm3L66Wono0zOScpNrSEgb6Fm/cgxt3vxRI08KITaL5A5iJOKovgJksVIKxMum8uGVjYowThXqeySRGCteI2MAYSImVzV8njFSGoYERerpmVD+2bG8pKvE33ScRT/LXP84Y7Ft3bOLgvkIJw8MHj9GyuYk//+5vrloOYJuFajnYtqOis45Ijk7mjPhpjFSh/OTgoS6y8UL1qtmMDo1x790PFrR3z1HC6esZyDn4phnoG2L4FNXEhwZGuOcfhap8B/a5EpcryXyM+0eEEN8SQlwlhLhSCPFN4JHlHthKIRS1aIa8oulF1R6mk8SEqs1s+wsFPVQYJ6YFTz/J5GR4Q340b35cnBDilFtwJaUlnHVOYZJKIOjPLRCV1TPJk01Fkmh37t5Ke6tzp3/BebuJDzmLXXllWW5beRo3433t03bXAap3NRVNeuzq7F309+fzKmSN4kae4ilUzCktKzmlR2i+aH6nmJXLwhGqihYIYmXSqP5A7t+5qB5vzskBoIcj6zKR1l9SuEYESsNOBXI1f51QdY3SsmjeDXJf9wAtWwp3ySqrHCUcf8CXVzCwq72naGGgzVub6enq47IrLnLVcgCh6bmdo5lGseLqdMuNryRY8LvSvIWfsbS5Cj1w8rC4SEmYXUWUmapr8pV2iinoRUtLiJaWFLTPpqyilN3n7ixo37pj2avPusxiPleHVwIHgLcA/wYcnGpbFwhFwVdZ41wkptDDJSheL8GGlrwLh6+yxtF6FoJAXSPa1GKXU8uZFWuqBkLooaWVkQxVlnDxy56UW0yEEJz/gquKel9nE46GefM7rs/7UV71pCs4eqgVIQRvfOf1bN0+Ewt3zvm7edLTr8w9L68s4/IrL+X+e/exbfsmztuylfREgtpzNtG8pZEPf+bGXGKtoii8+8NvZvOW5qX86C5LiJk16Nl7jOqdxROhersXH5bj96pF4+0BlCJhOdHSEoYGR4qG8ZwuiteHbWSxTePUnV2KIhQFf3Udtmmi+YMgJarHO+caF3TyMqYcBIrPj75OqwOX1JWz+5pH5Z6rHo1z/+UxHP3LXnY+5RKEMuX0URQufskTaNzSyEc+9248UwbYn3/3N9749lcRDM3cIL30+ufnckw0TeNFr/wXauurARgcGGbbzs15Kjnbdm7G6/NSUVnK0571xGX/zGcCwuvHX5PvjArUNhRUkD/TidSUcf7zrswZ+IqqEG2sZMuVM7Hvut/LBS94PJ7AyT97aWUp73zf6wnPkq98zvOexq45DsAt25t5+3tfn3tPj9fDRz/3buoaTl4Z2e/38fwXP5OaWUp9F112HudesO5FDtYUJ1TLWasslyKJlc1gZdIIRUH1Ouo2UkrMZAI7m0HRPU6FQNNwFjghQNoomo6dzSKljTLlxXLifpdWIWca27KJDYySHI3hKwkSqSlD1eeXOHjsUCudHT0EgwEqqsrp6x2grDzK5m3N+Hw+0skUrYfaGB+fpKa+molYnHQqTXlFKUMDo5iWSXNLPb6Ms7hFasvwBv2Ypkl7axd9PYNUVpWxeWtzblE7w1mXajmd9x3m6F/2cs6zryh4LZVK89bXvJ+3vOv/LSqhdvemEF39KYpJ11uGyeSBbqqvPjuv/ZbPfYtP3vy+vEVnoaT6e/BV1uBZp8YmKzQ3c9dFoWCbhqMfbttTTg8BSIQQSFuien2o3vWXTGuZFvHBMbLxNKpXIxvPECiP4I8GmegdJhNL4Qn5sbIGuteDlOAN+QhURDjyyHF6uwcoq4iyY/cWhgZG6enqoyQaJpXM4PM7fy/do5GIJ1EVBdu2saVky9YWTNOk9VgHlmURCAXIpDJs3tpc1Ku6hljWueko2GURqobq9WFkU4isiWVmHQELrw99javeLAQzYzDeM0R6IkmgLEy0sZJMIsNkzzBGKkOoIkK0serUJ5riyMFjdHX0Eo6E2Lp9E2VF6pqk0xnajnUwMjxGXX01LVuaMA1nvU8kkjQ21Z1wLh46cJT21i48Hg+btzXRsrmJgf4herv6CUeCNG9uRNeX3kY6BetvW/EEnNAqFEL8j5Ty+UKI/UDBEi2lPHm69BmG6vEWqDwY8UkSHa1TSWMKwcZmtHCEzMgQ6enkWsvKlWRX/QECdU3oy1gIQ1EVSuoqKKkrLGxyMo4cOs7bXvMBOtu7URSFV772hbzihn+lpNTZXZgYmeDnP/4N//6Fb2MaJhVVZXz25g9QWlrC5z/+tVxZ9IsvO593vPf17N69I3duTdPYun0TW4tsI7usPdrvfoTK7cXrF/R291NRtTilHI8usGxZ1LCHfK17MSukoay8lIG+oSUx7lVfACM2sZ6N+xWh6HUxESfV152LwddCEVSvl/RwhmD9/DTGzxSMTJbjf9vH/l/chbRt/NEQV7z2WkKVJXTff4T7ppJs9YCXS17yRPb8158dx0skQOXTzuPGt36c8bEJPF4P7/nIW7j2uieTSqZ462veT09XH4qi8IkvvZdv3fJ9jh1pQwjBC176bF7zlpcTLXN2Wte4Ib+iGIk48Y5jSNMEIfDXN6EgiPd2OjedikKwrhmrJLqu1Npsy6bnoeO5pG494OXy11zLwMEODv/pfqQtCZSFufSVT6Fq26lr0zzy8FHe+pr30dvdj6qqvObNL+PFr3puwbXX5/Oy6+wZj/7keIzvfevHfOsrP8C2bRqa6vjirR9lx+58lbO24518+KbPceAhJ2/kuhc8nee96Jm89bXvZ6BvCE1TeeM7rucFL3123m6Wy9JxshX8LVP/Xgs8o8hjXWNlMiQ6pwx7AGmT6GrHSiZID/Q6cX26J2fYA1ipJNmxkTWX6JROpbnls9+is92RrLNtm29/9QcceHgmweXIwWN84dO3Yk6pQQwPjvLFT9/K3f+4P2fYA+y5+0H+dttdK/sBXJaMTCLN8LEeKrbWFX29p6ufiopFxtt7ThySAyAQqF5PYWjOEsbdq343qXa5MGLjecm1ZnwSoahYycS6U8sZ7xpm3//eiZy6pqfG49z/w78w0TPMPd/5Y049x0hm2POD22i4wDFyIjvr+cBNn2V8zMlNymayfPjdn+PIoeN8/uNfzSXS7ti9hT//7m85tTIpJT/63s/Zt/fASn/UNY9tGiS62hzDHkBKFKGQ6OmcSaq1bRK9Hdjp5OoNdBmI9Y9y75z5Ntrez6E/7HFqTODULdn/83+Qmkyc7FQk4kk+97Gv5EQ0LMviq1/8Tx45cPSU4zj48BG+8eX/ytk43Z293Pzpb+QUdabP95Mf/DJn2AP8/Me/5Z67HmBkaBRwFPu+9KlbOXTw1O/psjBOJoU5ner/BMAjpeyY/ViZ4a0etmnk5LVySIk9VdBF0fXc/2djJmKFx60y42OT3POPQrWcno4ZNYfZajnT2FJyz117C9rvLaK843Jm0LP3GKXN1WhFCpYA9HT2UlaxOG+3z3PiZNppFG9hUm1JNLwkcpgAiseLNM11p5qx2liWhRkvopqTTqJ4vRgT4+tKLSc5UpiYPdY5SGJkImfwT5NNpFGnflemLgrUn6SUdHf1cd8/H8y17di9LScZOJsjjxQqlm10bNMsWHOlbYMsppazvvJtkmOxgvlmFpG8HGntIzN58hub8bEJ9hRRy+mdpe50InqK9LnnrgcYH5v5nSRiSf5+2z8L+rUd6yjI5errGTjle7osjPnsvbcAtwohjgsh/kcI8SYhxPnLO6zVR9F0hFK4radMxfLZhpGXXDaNGgw51WzXEJGSMOdfck5Be11Dde7/s5NfZnNRkWIVF1yyriKyNhSd9x2mcuuJKwh3dfVRuchkWkcp5+S7V4pXxyySVNu/RBKqQgjXe78MqFMqOgXtXj92NoMeLllXajn+0sIQsUhduaOUM+dz6gEv9pRXWbcoqjhVV1/NeRfN5JocP9LGWefuKOi3ZVvLIke+/lBULU92FXDC+grUcpRlyXdbTfzRUKFajq+IWk5TFd6Qv6B9NpFohHMvLExuramvLtJ7Tp8idsL5F51NSXRGLTAQ8nPZYy4u6Ne8uTFXD2eauQo9LkvHKY17KeUHpJRXA2cDdwLvBApFTNcZqtdLsLFl1oVDEGhoRg0E8ZZXOaXWTRMtODOpFa8XX2nFmpMoCwT9/NuNN+QtNs9/ybPYfc7MorJt12ZueP1LcheQcCTEW95+PZc/5mLOOX9Xrt+us7dx9ZPXTXHiDUUmkWa0vZ+yTSdWO+jr7qd8kTG+Po+KYZ7CuPeoWMl8L1xpeZTBJdK6hym9+5gribnU6CWlqL4ZA0L1O8a+4vHiia6vHIdoYyW7n35pLg3PE/By8YufQEl9BRe9+Opcboqqa1z4gqvo3OMUAhp/uJMPfuzt+APO30lRFN71gTeybecW3vWBN+RkMvc/+AhPufbqPAWSa657EudduHvlPuQZgqLrBBta8pxulmkRqG2cWaenlOyUIrKtZzLh6tKC+VY6Ry3HG/Jz7nMeiz968pylcDjIjR98Y55U60uvfz67dhfKY85l9znbeeErnpN7Xl5Zxtvf+zoCwZm/t6Zp/OvLr2PTLOnXq5/yWC69/EICU78HIQTXv+HF7CgiyemyNJxSLUcI8T7gCiAE7MUx8O+YFbZzouN8wN8BL07i7k+llB+c00cANwNPB5LAK6SUJ435WEpFEts0sTNpJCA0DWkYCEVB8fpQVBUpJVYm7XjpNQ3V50MIBcvIYKfT2JY1tf1vIG0bxeMD20IoAsXjm9HBL4JlmMQGxsgm0gTLIwQrnOSp5GiMid4RQBIsLyETT6HqKuGaMnSfB9u2aT3URn/vIOVVZXj8XkaGxqioLCWVSDExOkHTpgYaimjV9/cO0tnRQzgcwrJMujv7KK8sZVNzPdZkBiXkpa29m4mxCeoaa9E9GrHJBKVlJXS294CUbNnWQuPUuft6Buju7CVaVoKqqgwPjlJRWUrTpga0k3z2sZFx2lu70HSNaKlTmTQQCLBpSxP+U8h4rTDrSi2n/e6DtP3jAGdde1nR1+PxBO9640d40zuvX7D3VRGwsyVER9/JC6lkx+JkJ5KUXTgj9ZdKpfnWLf/FLf/56QJn3EKwshlS/b1Ed527rrzJUyyzIkkWO5vJqYdJ28bKpEEIpGmAUJwveyqJEdtG8frRzmC1HCOdJTYwhm1aWIaJmTEIV5fiiwQZ7x7CMk1UTcXMms612LTQfB4s02I8nWRsIobf7yUVSxIpCVNZUsrAxCj9/cOUlIZJJ9MEggF2nbWN8fFJOjt6EDhF//xBP+lUmnA4xKatzUyMT3L8SDuqqlBWUUo2a9CyuRGhKLQf78QyLZo3N56w2Fwmk6X9eCeTEzHqm2qpqz+5fOESs6xz00gksI2M48n3+bGkhGzaWb91HTw+dE3DyqSRlomie9e8ilNyLEZ8aALd5yFcXYrm1YkNjpMci+EL+QnXlGIaFuNdg6QnEgTKwpQ2V5MajxPrHyObzBCqKKF8Uw2xyTjtxzsxTJOWTY2UVZSSnkwSGxxDUVXC1aV4Al4O7DtEd0cv4ZIwm7Y1UVtb6Lk3DJOOti5Gh8epqaukqaWBgb5Bjh1uIxZL0NRSz+5zdhCbiNHW2oVlWrRsbqS0PMrxo+20H+/E4/WwZdsm6hqq6enqo7uzl0hJmE1bmvD5V3y9X3cLwYmYj4bicwAT+A3wN+BuKWV6HsdlgKullHEhhA7cKYT4nZTy7ll9ngZsm3o8Cvja1L/LjpVJk+juwEzE8NfUkxkdzsXzeaJlBGoaUDweNJ8fZnmprGyG9GA/mVHHwyg0nWB9E1Y6RXqwDyvtGDV6uIRAfVOB0gQ4CgzH/voQD//yLqSUeII+HvO6Z6J6dfb+6K8MH+/lnGdfwd7/+RvxwXEAmi/bybnXPZZ/3LmH9779E6RSaXSPzvVveDG//cWfGR4a5XVvfSW33vxdfD4vX/jqhzlvTihOTV0VNXVV/PWPd/K+t3+S2GQcVVV53VtfwaPPOZt/3P8QX7/le9i2TUk0wmvf8nK+9Klbqayu4Evf+Bjbd23JnWvf3oO8+dU3gRC84oYX8LUvfic3pg9+8h087VlPRC8i0dne2sW73/JRHtl/hHe87/V875v/k4uzfvGrnssNb3oppWXRhX+xLieke+8xyjfVnvD1nq5+KqvLF2UIez0K2VN47WFK635OlVq/34cQgthknEiRokGni6J7cnky60nBZbkxU0ni7UdzccvBxk2kBvvwlJRiTI7nrnFaKIIeDJEacCpbqoEgocZNZ+TfOjWR4OFf3kU2mUb1aHTe64gN+EtDXPD8qzj0xz1UbK5l8Eg3NbubOfynB5C2Tai2FPusaj70ns+TzWTx+by85i0v5ze//BOveePL+PBNnyMeS6BpKi+9/vncfeceHveEy3nRK56DR9e58c0fyYWiPeu5T+O1b3k57a1dfOjGz3DkkeMAXPaYi3jqM65mz90P8uCeh3OCBjvP2sanv/yBPA8pODfpP/j2T/nal76DbduUlpXw79/+JOcVCcU408hOjjtJtVN5bb7aRhRFIdnb6VSQF8KZr5m0I3yBU5At1LIVPVhYaHItMNY5yJ1f/RWpcSeXZdvVF9BwwRbu+MqvMNNZhKJwycueiJHO8tBP/o5t2WhenUte9iTGugY59Ic9IMEXCXDWSx7PLbd8l9v+4FQ73r57C5/47E20/+IexrsdsYK6i3eg76ripn/7GMODowgheP5Ln8WLXv4cNm2dqU+TzWT55U9/zyc/8CVM0yIYCvCpm9/PPf94gO//x08AqKqu4BNfeh/f//ZPuP3P/wBg97k7uPGDb+KD7/oM7cedwpdXPfEK3vLuG9iyrYX6xhOvQS5Lx3zCci7ESaq9F3gSsF8Icec8jpNSyunMK33qMXeb4FnA96b63g1EhRAr8s1nYxOYiRiqz4+ZSuYl6mTHRzGTxTPOzWQiZ9gDSNMgPdTvqEWkZ7yVRmzihFUyJ7qH2f+Lf+QSz7KJNA/+9G/0H2hn+Hgv0cZKxjoHcoY9QMfdh2g/2sEH3/0ZUinn3srIGnzzy//FNc9+Eol4kv/42g+59jlPZmhwhC9+6lYmxgpLph891Mon3v8lYpPOV2NZFrd87tuM2xm++u/fyWXBT4xP8qPv/ZynXPt4ujt7+fZXf0A2k8299rH3fJ7RkXGe+S9P4Zu3fD9vTB+68TO5arZz+b+f/YGD+w7zqCsu4vY/35WXQPmD//gpB/cfKXqcy+KwDJPBQ12UbT6xB6+nq4/yRSbTej0Kxini7WF2Iav8S0JZRWlBIuJCEUKg+QNu3P1pIC2LZH9PzrBXvT6M2ARIG2kaedc4Mz7pXMOEs4xYyQTZibFVGfdiGWnrp+2uA5Q2V+cMe4DUWJxjtz/E5seew5Hb9tJw/lYO/XFPLrkxsL02Z9iDowv+jS//F69+7Yv4zEduIR5z1hHTtPjOrT/iCU99HLfe/F0O7DvMrV/+Xl6OyS9/+juOHWnjN7/4U86wB7j7zvtJJFKkU+k8pbJDB47yq5/+viCB+fDBY3zlC/+Ru5aPjU7wkZs+n1PuOVMxM2mSvV15ghWqrs0Y9uDczGcyOcMenDmd6Gpfk0XtjEyWfT+/M2fYAxz9y16GW/tyCbPStkmMTPLg//wN23K+UzNjcP8PbsM27dwl1Ehl2HPvQznDHuDIweP8/H9+i5GZ+exl5zTw5c9+i+FBR7lGSsmPv/cLjhzOT+I+frSdj733C5im8/dOxJN88MbP5KkBDg4M89Uv/gebt83cFFRWlvO/P/pNzrAHuP3P/+CBe/ct6m/lcnqc0rgXQpwNvAR4OfACoBv4y3xOLoRQhRAPAoPAn6SU98zpUg90zXrePdU29zw3CCH2CCH2DA0tzcJvxJwLnerzYxUx5M0TSGkVy8I/4Y1AEVUJcLbgijF0tAdwqiGOthdmkQ8PjOSM8tx7mBbGVBLX6PAYobAT//rQ3oOMjxbeXIwMjxZVJClmUHW0dVM9lUBzz10PMDnhjHt8bJJDB48BoHv0omMa7C+UNEynM9x5u7Nxs3XHJh5+8JGCPsVUe9YyyzE3l4PBI92EKqN4/Cfenu7u6KV8CWQwDfPUaimKqiBUBTtr5rWXlpUwuESKOTAliRk7s42ahbKQuWlbFmZi5vqk+vyYyQSq11/0Omdl0iizlJeMyYkzUi1nsncYoSgFSd4Aox0DqLoT522ZZt79aCyVyhn206SSKSQwNDiS1y6lJJN2nEj9PQPse6BQJScWS/DAvQ8VtPd1DzihkXO48/Z7SKfyc1eKJaUfPXScifG1k3+ykLkpi6nlWDZzy1rLueo5gJ3N5JKd1xLGlDTxXOYq4dimlZO8nCabzOQVsPSVhDhYRM7ynn/uxV81U53e0hX2F1l75+Y7DfQPFfyWR4fHCIbz8xn2P/hI3q7+hZeew977Cg35Q/OQ2nRZOuaT+flpIAz8O7BLSvl4KeUH5nNyKaUlpTwfaAAunbpRmE2x/f9iBbO+IaW8WEp5cWXl0mRXe8LOZLfSKdQi6g/aCRJy5mbrA456RJFPooWKhxYEpgpH5SOomiosNN49TFlLoYe1sqaioMiEpqloU+o85ZVlOU/R+RedRWlZScE5KirLi2a8Vxdpa9nSRH+Ps1A8+jEXUxJ1xl1aWsKuqUSYbCZbdEzFsuB9Pi+Pu/pywFlszrlgV0Gf+sYVjQ1dNMsxN5eDvn1tlLacXA2hu7OXyiIKH6eDI4M5vzoPilfDTBYq5vT1LZ08muoPOPK0Z6DBuVgWMjcVVc0TCTDTKbRAEGvq37moXh92dsbhoUfOTLWckvoKpG2j+Quv7+WbarAMx3upalretT7s8xdU4w4E/QickIXZCCHw+pyb65o5qjnThMJBLr7s/IL22oZqmloKVa4ed/VluSq3ub51hb/zHbu35IpirQUWMjeFphUo1BVTyxGi0KxRvCfPgVstPEFf0YKCc5VwFFVFKPmf0xP0Yc367aXG45w1q+DUNJddcSGpgfHcc9WQnHNBYcJ2dW2+DVBTW1XwW55tY0xz3oVncXjK2Qdw390PcdGl5xWcf3eRsbksH/MJy7lGSvkZKeVdUsoF7WtJKceB24GnznmpG2ic9bwB6GUF0MNRtFDEWbT8AZRZcaKe0vKiCxk4Rr+3YuZHoOg6vqpapGWhzroh0CNR9FAxIx6iDeWc9y+Pzf1YvWE/5z/vcVTvbqJyRwMTPcOUNlYSrpkJkdh0+Vk0b2viY5+5MVfRzev18Jo3v5xf//xPhCMhXvXaF/Lr//0j1bWVvO3dryVS5CZi645NvOcj/5Yz1DVd499uvIGo0Hnz216dq+pXVh7lBS95Fn/8zV9p2dzIq17/IvQpD10kGuZ9n3g7FVVl/Oqnv+eGN70sb0wf+dy7adnSWPDeANc+50mce+FZ3HvXXh73hMtzKhFCCF5+wwvYfe7Oose5LI7eh9soP4lxL4Henn4qKhenlOP1KPPy3AOoReLuS8tK6OtZGjlMmJG0tVLrq6jNciFUlUBN/YzkbyaNHokiFAWh6fnXuHCJo94x5SnVguEztiJw+aZaNj/2HEbb+2m+bFfOgA+WR9hy5bm0/n0fO550EV17j7HrqZegTFVWTh3r5yOffhe+KaPdH/Bzw5texn987b+58QNvyjk+NF3j1a9/Mbf97u+84e2v5uzzdvKaN700F38shOC5L3wG23Zs4unPemKektljHv8ofD4vgWCAJzz1cbn2EweNvQABAABJREFUs8/fxTP+5akFBtiO3Vt5843/L3ctL68s4wOfeAclJcXXozMFzesjUN+EUKeNdIGVNQnUN+VCwxAKiteLv2bGYBaqRrChZU3KY2peD+c8+zEEyqduqAXsePJFlG+pRQ84c0rRVEJVUS54wVUomvOdaj4PF734CahePff9e0M+Lrr0PJ76jKtz5991znaue97T8QRn8gYnDnbypndcn3PAKYrCi1/13DzvOzhyrB/81Dty6344EuIjn70Rj8eTe8+auipe92+voLtjxmybnIhx3Quenlex/klPv5ILihj8LsvHKdVyFnxiISoBQ0o5LoTwA38EPi2l/PWsPtcAb8RRy3kU8O9SyktPdt4lV8vJpp08HFXBymQQiorq9aEW8dDPPs5Kp7AtE9Xjc+JRpe0UtjIMxNQFRlFPopZjWvlqOeXOhTc2OE6sfxSJJFAaJjE8ierRiDZU4J9KMmw91EZf7wAVleUIBYb6R6iuqyKTSjMxNkFDUx1+Rcc2LWy/RndPP6qmUl9bDbEM3oiPnuFRerr7KSuP0lRXTXYkjr8iQv/QCBMTMWobqskaJolEkqaWBiqKaJ/39w7S09VHtLQEVVMYHhwlWlaCtCVDgyPU1lc7Cg9zFp/xsQk6cmo5JVNqOX5atjTlFsk1wrpQy4kNjvOXz/yYy65/2gm9qqOj43zoxs/w+re+asHvoyqwvTlE5ymUcqZJ9oyg+j2Et86k2Qz0D/Gn397Oxz5/04LHMZf08CBaIIi/al0lci3r3LSNrHM9VFVUr3dGLQfn+ieEQHi8qNp0MT95SoWw1SI1kSDWP4pQFSI1ZSfUATczWWID49jSJhtLgQShKRipLP5oCEUVGCkDK5tF83sxUhm8QT+WbTOZSTMRi+MP+jGyWYJ+P1F/kHg2zcj4BKqmkkwkCQYD7Ni9NSeR2dHWTfvxTnx+x3i3LIvN21qIx+JTajkqZeVRDMOkZVODo5bT2oVlmjRvakTVVFqPtpNOZ2je1JjblTWyBm2tncQm4tQ31lBTxJu/jCzr3DRTSayso5aj+vzYgMyksI0siuZB+PyoijKllmOheDxFhS3WEqnxeE4tJ1RdihSSsbYBkqMxfJEAkdpSdL+Xsa4hMpNJ/KVhyltqSE4miPWOTKnlRChrqSERT9De2oVhmDRvaqC0LEomlppSy1EIVzvnOrDvMD1dfYQjIVo2NVDbULhrbpomHW3djI2MU11XRWNTHWMj4xw5dJzYZJymTQ1s37mFeCw+NS8dFadoaQk9XX20Hm1H93jYtmsz5eVr4sb/zNtWXCDLeSWuBb4rhFBxdgj+R0r5ayHEawGklF8Hfotj2B/DkcJ85TKOpwBF01C0kKMO0XYsV81Sj0QdpRu9uIGvaBpKqHjmveqZn1KEqqlE6/O3bWOD49z7n79npK2fc5/zGPb+9+25+Pz687dwwQuuIlAaZvPOTTRtaaD17w/z0E//jpSSfl3j7Gc+msCEwbG99zJ8rIfqq87ii9/8L1qPOQWFL7rkXF72jKcx9M8jbHrM2Tz2GY+m/2AHf/vUTxwpT1Xh0lc+hd1XXTqvrfVp9Z2Z59X89If/x+c++hVs28bn8/K5r32Yx1396LzjoqUlRC+a2SJ2s+eXl4GDHZS2VJ/0O+3p7KOqquKEr88Hr0edVzLtNKpXx0rM0bovizI8OIJtSxRlaa7Dqj+AEZtcb8b9sqLonpz3HkAoKtI0ibUfy8U9a8EwwcaWE+5yrgUm+0b4x62/JtbvJPpW7Wjkkpc+MSc9PBvN68EfDbH/F3eSiafRfHouudYT9HHRi5/A3d/+HXJKreSiFz+Be//zDxipLIqm8ujrn0b9uVvzzlkJbCp4pxmaNzWQTqV506tvysXKP+Xax/PO97+Rxz6+uGTt2ec5u5tDAyN88oM387tf3QY4BYFu+c9PsWP3VnSPzvadW4oef6aj+QO5sFkpJdb4CImuDpy7MUGwoQU1WnbC0Nq1iD8aytOn79xzmPu++ycsw7mR3n3toyjfWscdN/8caUsUTeUxr38mfQ+3cfQvDwLOHH3MG55FxeZazpqzA+4N+/GGZ25q775zD+98w4dzeRjXveDpvOYtr6BuTiErTdOcgmqz5OhLy6M86oqL8vqFwiHOPi8/zLa+sdZd21eRZau2JKXcJ6W8QEp5rpTybCnlR6bavz5l2E8r6rxBSrlFSnmOlHLF3Z7StkkPDeSVqTcmxzETxZNhl5O+fa2MtPVT2lTF8PG+vMTbngePM9I6U1pgsneUB3/yt1wssWWYHLltL76SIMPHegiUR/jnvodzhj3A/ffto2N8BM2r03bnw4y09nH/9/+cU36wLZv7vvsnYrNUek6H1qPtfObDX85l06fTGd7/9k/S1+uWmF5N+g60U9pw8rjW7s4+yhZZmXa+MpjTKD5PQcy9x6Pj9/sZHV461RXN58dMJQrKt7vMHyllnlwwgJmInVARbC0gpaTtnwdzhj3A4OEuBg51nfCYsc4B2u46SFlLvmpONpHm0O/vo+4cx1Q3Mwb7f/EPGi9y4oht0+Le7/6J+NDpJW9nM1m+/dUf5CXB/uHXf2Xf3sJk27ns23swZ9iDs+v1jS9/j0ymMCl4vTItaZ1L1ZOSRHd7bpfpTGS0vZ+9P74dy3ASgKWUHPi/u7GNmaRa27QY6xrMGfYwpbr349vJJk/+2YcGhvnSp76Rl2D98x//loP7Di39h3FZNU5o3Ash/k8I8asTPVZykMuJtPPVIaaZLfm2UgwedhadSG0Z412FcccTPTMKNOmJQuUKRVOY7HPkrQJVJex96GBBn0OHWwmUObsOydFYQQa+ZZhkJhcWnzw0MFLQNjY6wdicktMuK4dt2wwf7aG0qTBhejZdHT1ULlIpx6vPP94enIRaq4g6SXllKf19Sxd3L1QV1ePFTK78Dfu6wbaLGvKr4QSZL5ZhMvBIoSTvcOuJ07oSI5O5Y+cy1jVIpGbmN5IcjeGdpRxipDJk4qd37YzHE0UlAmc7ZU5EMbnhB+7bT3xy7X4nS400jQK1nOnq8WcqmViKTKzQ/pi75s9V1AFH2cmYU/l7LmNjkzzycKHk9FJJELusDU7muf8c8PmTPNYFQtXQIkW2aFdhS692yis01jVE+ea6gtejTTNbZoGycGGYhZRE652EyETfGI9+1PkF5zjn7O0khp0FLFhRkkvQmUb3efBHF7bNXlNXhaLkT6mq6goqqhaXpOmycMY6BvGGA3iCJw8X6+7spaJ68Uo5pxOWo+gq0raxjblymNGicn6LQfU5oTkuC0OoKnokWtB+ItGAtYDm0ak/rzA0pWp78WR/gFBlFCBPYnCais11jHXNGEDh/8/eWYdHdbR9+J51jbs7wbVAKUVKW0rdlbq7y1elfetvBeql7u761qlRrDghEHf37CZZOd8fmyzZ7IYE4nDu68oFOztzzpzd2TnPmXme3xMe6LG7qjXp0e1h8jWzn9mn+82o0Sk+anuSOsrb4Wf2vBn4BQzPZE0DgVBrdgXTdqBQoFAPv+DZ3qLzN3i46IAr4NoQ6Pm9qn3Ep4WmxaDpJqbEXScsiMldElwCRMXILjT7Et0a95Ikrdjd32B2ciARQqAPDvNQgdAGh6Iy9j1D5p4SMS6B6CkpNJRU4x8ZREBsuyuFgJT5EwlJ2vXjM0cEMf3cw903Ia1ZT+ohU6gvrSFmairWuiYmJadwQCcD/4gj5xOpNuJ0OBh95HRCkiOZeeEit+yW2qBl5kWL3De4PSUpJZ77H/8/d1BsUHAADz91l5cknMzgUZFZQEDs7j9/h8NBRVklwf3iltP7lXuBQKnT4LB09bv37/d8B/uz3n1/oQ0M9pDJ1AQEo+om9mi4EDc93UNqMH7GaMJGeUsPdhAYH87oRdOpyCwkZd5ElxoQroWQ9COmUbHDtbuq8zcy/vhZlG7JBVz+zjMvWoQxaM8+D7VaxdkXn8Lo8S73HiEEZ194ik+Z4K6MnzyWcy85zb2gkj4mhfMuPR31CDZs9xSlRospLgmhcC1SCYUSU1zSiMyS3EFgXDhTzzzE7SOvVKuYdNpcFGoVKq3ru9UYdQQnRzL++IN2jdFQPyadMge1rnsxEHAtnlx7yyXExLkWEFUqJRdeuZhxk0bttp3MyKJHtRwhRCrwEDAGcP9iJElKGtiu+WagFEmcdjuO1haEQoFSq3VPFoNNeUkFWdtzkCSJuNgoqG9BrdfSrHRQWlaJv7+ZpLQETCYjkiTRVFFHa5MVlV6DtbaJ1kYrqhAThUWl2O0OwmPCKMwvQa1WERoaRE52ASaTkeTEOBQWG/pAE0qVkrbmFnT+RkztgWatTVYaSmuwt9nwCw/CGNK7FTpJksjPLaKutp6gkEBqqmppao+qj0vwvqkW5peQn1uI0WQgOTUBP/9hZSyMeLWc3578mNC0GEJTvDWyOygpLuPJB1/gwisX7/V5FApIjzeR30ulnA6acsrRRwehj9ylpJCXU8iGdZu5bck1e92frkiSRFN+NgHpE4alosteMCRj02m342hrRQiBUqNFKIdmntwT2iwtNFXUIZQKzGEBqLro0rc0WmgorUEIgcNmR3I60ZoNSAIkmwObtRVTWCBaPz31RVW0Nbeg9TPgtNmRnBJtNju11mYqyqsICA3EZrMRGBRAfFIsOzKyKcwvISQsiNFjU90SxF3J2LKDnKx8dHodo0Ynuw2vrlRX1ZK9Mw+H3UFiShyBQQHk5xbSam0lNj7aS8veYrGSsyOPmpo6YuKiSEyOG4w8BIM+Nh2trTjtNhRqVa9FLYYTjRV1NFXUotJr8I8MRqFSUJtfSXN1PTo/I36RwaiNWuryK7DUNWEK8ScwLoz62jp2ZuS67rEJ0aSM7XnHp4OMzTvIzSnAz8/EmPFp+AX4kZtdQGlxOaFhQSSmJNDW2kbG1p1UllcTExfJmPFptFhbyd6ZR3NjM/GJscQmRFNdVUPOzjzsdidJKfGER/qO8crPLaQgr9jDjhlkZLWcTrwG3AM8CczHpWizz31AHco5Q0l+biE3XbHEnRAiISmWmy47j1aFxJ13P47V4jKczjjvRK647nz8A/0whweCQrDl878pXLeD0JlpvPb512xYv5WrbrqQB5cspbjQtQqaPjaVGQdN4Y3lHzD/sNmcfvThFH6/njFHz2DUoVPc23yW2ib+ff8XSja60lFrzXoOvvp4guJ6llMTQpCQFEtNtYmlD73I5x99B7iSszz3xqNM6pS4ZfOGDC4/52Z35ttFxy3glruu6vMKsowLp8NBdW45qYdM3m294oJSQvu4u6JV71kwbQcKrRp7s2cAWHBwAOUl/ev/KYRApTNga2pAGyCPr73FNU+OrIcjjUHnMykguHzs17z5I8YQP5qr6qnILAJcc96cq08gMNllZLdZ29j+3Rq2/28NAIHxYURNSKYiq5hSo4NHH3gOp9OJUqnkkqvPZsXPKznzvBO59/8ew9aeaOiCy8/k3EtOIzAowKMP61Zt5MYr7nEHkc+YPZVb77naQyccXK5zt1/3ABvWbQFcaiRPv/JQt6o4TU3NvPb8u7z0zNuua9JqWPrSAxw0d7dq0yMSpVaLUju85S67ozq3lN+f/tztK580ZzyhKdGseeMHnA7XnDr6iAMwhfqz5u2fXKJACgVTLlrIG29/yueffA+A0WTgqRcf4IDZU3o85/q1m7nyvFvdCanOufhUxk1M5/brHsBudyCE4Pr/uxS1Ss0j9z0NuHI1LH3xfr7/+he+/vQHwKV9/+zrj/Df+55xZ72NiYvi6VceIjktweOc61Zt5Mrzb8XS7LJjTj/neK644UICfCb1lOkrvVHL0UuS9DOuVf58SZKWAIf00EZmL/jlf396ZHrLyylkQ04273zwhduwB3jv9U/ZnrGrXm1+OYXrdqBUqyhqqmPD+q3EJURTkFvkNuzBlf5ZCIHJbOTXH/+kyuY65ravV1FfUuOuV5Nb6jbswRXgs+3rVdjbeh+klLF5h9uwB2hqbOaRe5+msT3Yy9Js4ckHn3cb9gDfffEzWzdneh1LZu+oyS/HEGjqcZu2ML+E4JC+aRDrNMpeZ6btjFKnxt7k6ZZj9jfR0tJKc3P/BrXLrjkyXancWUzljiIMgWa3YQ/tc963q7C3x4PUF1e6DXuAqAlJbP16JX4TYnnsoefdCmEOh4NXn3+Xcy4+lccfeM5t2AO8+vy7bN+60+P8TU0WXnvhXQ91qFV/rmPTv95qOf/8sdZt2AMUF5byyftfu8/dlZ3bc9yGPUBraxv33PwIFeVVPuvLDD62ljY2fvyHRxCsSq1i/Qe/uQ17gIzv12Cta94lCuR0sn1bltuwB2husvDo/c9QU7HrXu6LhvpGHr5nmUemWaVCyX3/9zh2uysTsyRJPPnQizQ27apjt9nZsT3bbdh31Pvz13/chj24HkI/+/Abj6zgdbX1/Of2x92GPcD7b37O9m2evweZ/qM3xn2LcOVz3imEuEoIcQKwe+kNmb3Cl2rC+vVb8LVRUlWxS5mmpV3dRudvIDvXpaAQlxjDzsxcr3aF+cWERbhWaauqatz+ep0j8X3JuVXnlmGz7j4KvzOVFd7KOdu37HQb9w31TWzd7CNiv59XbPdnKncU4R/d84p8QX5Rn4OetRoF9j3wt+/AtXLfdVwJQkKDKCvuX797ld6IrbGBnlwRZfYf6ourUOk1tDZ5P0hW55Rib1dzamnwVCpx2p0gQX1Dk9sg6qC1tQ2n00ltjfc82lWRpK62ju1bs7zq5ecWeZX5WvhY+88GWn2opoDnPaKDivIq6uu81eFkhgabpZXaAk+paKVGRVuzt5ylo8s4q633FgjIzMj2WDDzRWNjk9eYU2lUHsY+uAx3W5vn2LJaPfsVHhFK9s48r3OsWbmBtk4Pto0NTT4VoHyNUZn+oTfG/XWAAbgGmAqcDZw7gH3ab5l76CyvsjkHz0DrY+U1plNyiI7sttbaJsamu7JNbN+6k4lTx3q1S05LpKjApZcfHR3u0v4WePjU+zIIoyYkojX13pfRl8/oQfOmExgcAEBgsD8Hz5/hVScusftgN5k9oyKzCP+ono324oLSPgc96/ZQ474DpV6Dw+rKcNqZoJAASor6Nz+CaA80dI5gDWyZ/iU4KRKbpRWdn7c6WtTEZLfKlDHY05ddKAQKlZIgfz93ttkOzH4mnE4n0bGerkAKhYLYBM/Yl9CwEA48eJrXudNGe7vaTJ/l7W5x6KK56A2+5+Xo2Egv//qUtERCZfWyYYPGrCdibIJHWWtTi1uuugOhECjVnvEt4T6ki2fMmkJw2O7dDoOCApk1x9M1q6mxmZAu7VRqlVdwttns6bpcVFDC+EljvM5x+FHz0HaKbQkKDmTq9Ile9WLkJFcDRo/GvSRJayRJagIagGskSTpRkqR/Br5r+x+z583g2JMWuifkwxbOIcEcxOKTjiYhOQ4AnU7LnQ/cwKgxuwJnghIiGHvMgSAEgW0KTj39GGqq6tBo1Bw012VACyE48vhDKSsuR5IkLr5yMfoGGyqdhhnnHYFf5K4JPygxgjFHznCv6gcnRzHqsKko9iB4bvS4NG6+60o07T/wtNHJXHvrJej1rhuRVqvl8uvOY0y7SoRao+baWy9xv5bpG06nk+rcsh5X7i0WK01NzX32e9RqFNhse7Fyr1QgFAocLZ4uX0HBgRT3s2KOEAKVXpbElNlFSHIkaYdOoTqvjKSDx7vnvJDkKNIWTEahdL32jwpm+rmHu9VKyjMKmHrmIVSt3smD/72NgECX8R8UEsil157Lm8s/4P/uu86dwdtoMnDXgzcyZnyXzKFaDaedcwITprgWYlQqJYsvOJnJ07ylCqfNnMTp5xzvVseZd+gsjjxuQbfXlpKWyH8e/z/3w0dMbCT3PXar7OM8jFCpVYw7dhYBsa5xolApMYcHMnXxAvSBLkNardMw9awFBMSGoja44gp0/kbGTBrNjbdd5r7HpqQmcP2tl2DuQZRCb9Bx/e2Xkdoeq6HRakhKjuORp+92P/iZ/Uw88vTdxCfFYjK7gl7DI0IZNzGdG26/DLXG9TtISonnwIOncepZx7rtlkMWzmbh0fM9zmk0Gbj13mtISol39V+n5Y77r2fUmFRkBobeqOVMwxVU2zFi6oELJElaN8B988lwVCTZHU6Hk4bSGpqr6tGa9fhHhaDWd+8DXVdZS0FOESARHRuFvcGK2qAmv7ySwvwi/Pz9SE1NIDohGltrG/XF1bQ2WDAEmZAk1zafLtSPyupa7HY7RpOBgrxilEolYeHBFBeVodfriI+LRtHmQGvU+ZS+dDocNFXUYbc5MIX4oelmdWh3OBwOCvKKsTRbiY6N9HlTqa9roLiwFL1BR2x8NKrhFaw3YtVyagsq+Hv51xxw9mG7rbcjM4e3X/6IM88/aa/PpRCQnrDnSjkdNGSW4JcWgSZ41/jI2pFL5tYsbrzz8r3uly9sTY3YLU34JY142bcROzaHCw1lNdQXVyE5JYwhfgilAkerDXubHZVGRZu1Fb/wQMzt+R8kSaKpso42SysqrRqH3YFSqcDpdFLXbKG2pg6lRkVZWSUhocGkpCWyc3s2xUWlhIQEkjY6hYb6Jgo65vFRiW51sMrySnKzC9HqtKSNTkKv961V3traRmFeEXaHg7j4aAzG3edjkSSJwvwSGuobiIgKJ2RwxArksdmOtb6ZhpJqHDYHflFBbjW6rtQVVVJfWoNapyEwPgytUUdtQSXWukY0Jj2BsaEIoaCuuIrWRiv6ABP+0cE4JSe5mXk0N1uJiYskNDIUa30z9SVVOO1O/CODMHZzzuwduRQVlmIyGUhKS0StULJt6w5KissIDQsmLT2Z0PAQtm/dSU11HVEx4SQkxbXf14uwNLcQHRtBQKA/ra2tFOQV43Q4iYmPwtjNuKytrqOkuAyjyUhcQrRXXpxBYJ8Tg+mO3lhSrwJXSJL0B4AQYjYuY3/CQHZsX6F0Sy5/v/iNy/0FGHX4VEYvmoHGh4HfUFbD389/SVN5HQCFwX7Mvvo41m3cxi1X30dbe1rxhUfP56rrzqdxewnbvlkFuLbtZl64yJ0O3T8kgB3bc7jg1GspL3P5eSalxjPv0IN49fl3mX/4bO584IZuNe0VSqXHav7eoFQqSWzfcegO/wC/buXhZPaeyqxi/KN6drUpyivp8za9di9dcjpQ6tTYmtvQdOpGaGgQv/azzz24ktO1VJUjOZ3uVVqZ/Y+aggpWv/a9O6O3zt/I2GNmUp1diqWmwR1cq9JpmHPNCYQkuVxczGG+A8/9HA7+/WgL9932GJIkERQSyNU3X8T9tz+Bw+HylT77olPYsT2HVX+61sWOP2UR199+GYFBAYSGhxIa7ls+sDNarYaUUb1XoRZCEJcQDXQvhSszMDRX1fPPq99TneNyg9Wa9My55gSvbOFV2SX8/tRn2FtdPuoJB44hYkw8q1773p1BfvSi6RiDzax9+2fA9b1OP28hcdNHkTZu1+p3U2UdK1/6ltoCVxJAnZ+Bg68+gcBYz7G1btVGLj/nZlpaXPFOp559PKPHpvKf2x93B2hfcPmZLL7wZNLHeq6uu+7r8R5lWq2W1F6My8DgALdrrszA0pu7W2OHYQ8gSdKfgByR0wuaa1wya1InNYPMH9bRUOJbraB4fZbbsAeXTFtJYRmP3f+c27AH+N/Xv5KZmeM27AEkp8Tat3+mucoVxCVJEp++/5XbsAfI2ZmPw+HA7Gfi1x/+ZNum7f11qTLDjModxfhF9rxKl59X2C/Jq/bGJacDhU6NvUtAo1+AGUuzxUNdoT8QSiVKjRZ7szyF7c+UZ+S7DXtwCQpU7ijCLzLIQzXH3tLGpk//wNZN0GoH+blFPHjXUnew9lHHH8bSh150G/YAb738EQfMnOR+/flH33moo8nsW1TsLHYb9uDKHZP50zqPwFibtZUNH//uNuzBlaBq3Xu/uA17gIzvVtNSb3G/liSJde/+7CV+UZFZ6DbswSW2kb1io4eiUn19Aw/ds8xt2AOYTAb++59nPOq9+vy77MjI3tvLlxliemPcrxZCvCiEmCeEmCuEeA74TQgxRQjRs6DqfozN0uoz6r1D3aYrnSeCDiwtrRQVlHiV11TXeZ/P2kqbxXW+1tY21q/Z4lWnqKCE0HDXEmlFuRypvi8iSRJV2SW9U8rJKyY8oo8a9xoltj6t3GuwN3n+ToRQEBoW0u+ZagGUeiNtDbIk5v5MXZH3AktjWS0OH3K/dUVVPSqF1dXUe8he6vRa6uu8YztaWz0fEqo7SWDK7Fs0lnrfX2tyy3B0MuRt1jbqu4xFpVrlIY3ZQVe1HHurjbYuix91hd7juiqn1GNcNzU2k9VFSU+pUvpcSKmq3L2spszwpTfG/SQgDVciqyXAaGAW8Djw2EB1bF9A72/CL8JzVVQoBKZQ3z5w0ZO9s8sFmM1MmjbOqzwmLtId7NWBMcQPfYArCEen07LoWO9gq9RRSRTmux4WEpJie3chMiOK5qoGkCSfCiCdcTqdlJWUExLWd6Uc217IYHag1Gu8tO4BgsOCfD7Y9hWVwSDr3e/nhI/ynvtCkqNQarw9VWMmJ6M1+/aB7yAiKswdVAtQWV7d7g6zC5VK6aU+Ehsvu8vsqwQneyvGxUxNcwfFgkstJ2qipztLS0Ozl5+8UChQdFHL0QcYMQR6Bs+GjfJWm4ubluaR6yQoOJA5h8z0qNNQ1+iVVVaj1XSbKVlm+NMbtZz5u/mTk1ntBq1Zz/TzF7qyyAIag5aZFx3ZrbtE+Oh4kudOQAiBEILEg8YSGR/B9bde6pZGM5oM3HrPNYwdl8aBlxy1S6ot1J+ZFx6Jzm9XOufDjprHUccf5koVr1Ry4ulHuYJrFQpuufsqxowf8UGFMj6oyi7GPyakxzTz5aWVGI1Gn1Kre4JOo9irBFYdKDRKJEnC2WXVNCQkkIL84j71zff5tEgOB47W3udtkNm3CE2LIXnOBFfchXAZ8MHJkZRty2fUYVNQql1GfmhqNOkLD0DZQ6B/VEwET7xwn9tAWr3yX/7vvuvcBr5/gB/3PXYbWze6kv0YTQb+89htPiUvZfYNQpKjGHPkDPciXNTEZJIOGusxL6vUKsYeNZOQ9gcBpVpFYFwYMy5YiCnMZeBrjDoOvOQoghMj3Q+ZhmA/Drz4KPdinvucKVGkL5zmjieKmZpK3HRPhSa9Xse1t17C+EmjXa8NekaPT+PeR291y7cGBQdw339vY9xEz7YyI4feqOWEAw8CUZIkLRJCjAEOlCTplcHoYFdGYmR9a6MFa10TaoPOrUnfGWt9E/XF1dhbbfhFBYPTiSS5ZALrS6tR67W0CCel5ZWYjAZS05PQtqvXNNc0Ymu20qqAvLxCGhuaSEiKIzktASEELdYWigpKUaoUBAUHUV5agU6vJSYuaigi1b3I3plHXnYBRpPruoJ9aPcOISNS9WH1mz+i0qiI8bET1JlVf//Lip9XcuxJC/f6XH1Vyumgfnsx/unRaIJ23awKcgtZu2ojt//nuj4d2xfWynI0Zj90IeH9fuxBYkSOzcGksaKOhpJqFCol/jEhGLoYQrZWGw0l1YBEa6MVp9OJIdCMUqsGSUJyODEG++F0OKkvrqK1uQVzWCB+UUHdzp2V5VVUV9USGBxAeEQoBbmFlBZXEBDox6ixqdTXNVBWUoHRZPBYFc3NLiAnKw+9XkfqqCRC+5h3ojuamyzs3J5DZXkVUTERpKQneeiR9xPy2GynuaaR2vxynHYHATEh3YpUVGWXUF9ag0anISAuDHNYAC2NFlrqmlAbdRiD/GhusrB98w4qyquIiYskbWyqz+/O6XDQVFmP5HRiDPFHpVH7OCM01jdSUlKOwaAnJi4KIQTZO/OoKKsiMMjfK5B2TynIKyJ7Rx5qjZrU9CTCI3oOGB8EZLWcTryOSx3njvbXO4APgCEx7kciWrMBrdm3i0RzdYMroj7b5X6g0qqZc+2JCIXg96WfIkkSY485kM2f/elOR914QBqTT52HzmzAGGSm0t7G/f/3GCt++htwbac99/qjTJ81GZ1eR8qoRPf5/AN2r4E7mKxbvYnLz77JHdhz4JwDuO+/tw6XSWDEUpVVzKjDpvZYryC3iNB+CKbti1JOByq9y+++s3EfGh5CUWEpkgQ9bELsxfkMtNXXjWTjXmY31OSXs2LZp27f5YCYUGZdepSHOphaq0Zr0vH38m+oK3QJD6gNWuZeeyJB8a5x0dJoYcOHKyhY48oOKxQKZl9xLJHjEnyeNzQ8xMMwj0uMJS5xlwuQL3Wwzeu3ccniG2lucsViTZwyloefuovofk7wY7W08MZLH/DC0tfdZfc8cjMnnHrksFjo2ddoqqzn75e+oa49wLXr2OqgZEsuK1/8GofN5VMfmhbNlDMW4B8ZhK7dbrBaWnh9+fu8uOwNd7t7H72V4045wuu7UyiVXu7AvjD7mxnVRRM/OTWB5NSEPb7WrmzbnMklZ93ozpY7akwKT7xwn+yGNoj05hcdIknSh4ATQJIkO+DYfROZ3lKdW+o27MEVJLP1q5UUb8zB1tJG7LQ0dv66wW3YAxSu2eG+GQFkbM50G/YAba1tPLLkKZ8BXcOFxsZmHn/gOY+I/ZW/r2HbJu8U6zK9p7XJSkt9s0fG4e7IzSnsc2bavirldKDQabA1eq7+6w16tFrNgKQoVxmM2K3NSA55KtvXcNjtZP64ziMosa6okoodRV51K3YUecylNksrmT+uw2G3u9t1GPYAktPJund+pqWhuV/62tLSyvNLX3cb9gAb/93Kxn+39svxO5OTledh2AM8cs9TFOT1v+ubDFTuLHIb9uAaW9t/WOseWwDWuia2fP6327AHl9JZbb5ndu7snXkehj3AQ3cvHZbfna3NxmsvvOc27AEyt2Wx5p8NQ9ep/ZDeGPfNQohg2vPDCyFm4kpkJdMPWGq8Jfnqi6twtk8AOj8jlmofqguNu24GvpRzcrPzPW4Yw43mxmZyduZ5lcvR+X2jOqcUv8ju3QY6kICi/GLCIvu2S6Lro1JOByqDBluDt2tPeEQo+XneRllfEQoFSq0eW9PwfQCW2TscbXYPg72DxjLvuaWx3Futpragwq0u0troPSYttY3YrLuXxuwtlmaXm0xXigq8ldP6Sm2N9227paXVwwiT6T98ja26wkocrbuM+zZLq896rV2kgetqR853Z7W2+JR4zc0qGILe7L/0xri/AfgSSBZC/AW8CVw9oL3ajwiI8TauYqelofN3bcfV5pcTmuq9lWXqlEwlPtFb+eGQhQf3Wb98IAkOCeSwI+d5lfeU9Epm91TsLO5V8rHamjoAd2rxvaWvwbQdKPUa7M2ttK8huAkJD6Ygt/+Ne3Ct3rfVy1KE+xoag464A7zFAkJTvZVEQlO859b46enujNymsAAvL92w9Fh0/n373XQQEOjPEcd661KMm9j/YgcxsZHo9Z6ZxsMjQ4mMkl3TBoKQFG+lmbjpo9wiGACGIDOR4xO96pnDAjxeR/v47iKjw4mMHn7fnZ+/mUXHHepVPm3GxCHozf5Lb9Ry/gXm4pK/vBQYK0nSpoHu2P5CUGIkk06dh0qrbldtSCFl3iRiJqYQNy2Nsu35RE5IIjjZ5X+pMeqYeeEiAmJ2uVOMHp/Kfx67DbOfy1/5wIOnceUNFw5EoFS/odaoufCKs5g93yXJZTIbueehm2QFnz5StbMI/6iejfv83CIiosJ6VNTpCW0fZTA7UKiUKFQCR5cV0YiI0AFb8VEZjdga6+lJVEBm5BE/czTxM9JBuBRIxh9/kE9pwuDkKMYffxBKtQohBPEz0omfOdr9fkB0CDMvXOQ2yEJSoph86jwPacG+oFAoOHXxcRx+1HyEEOgNem6++yrGTxrTL8fvTHxSLMtefpCIKFeG1OTUBJ54/j533hOZ/iU4KYoJJ8x2KS8JiJ+RTsJMz+9VrdOQfvhUwtJj3a8nnTKHoCTPeIuEpFiWvvSAW40pJS2Rx567t8/ZxQeKY09ayDEnLkShUKDTabn21kuYNNVb0ltm4OiNWs4pwPeSJDUKIe4EpgD3txv9u2sXi2uVPwKXv/5ySZKWdakzD/gC6Mio8KkkSfft7rjDLbK+pKiMzIxs7DY7KaMSSUyOQ5Ik6ouraCyrQaXVEBAb6iVZ1RlLXSON5XU47Q50fnqsdRaQJBqEndzsAnQ6LWljUjCpNKh0GoxBvoNiS4rKsFpbiIwKw2B0rfzv3JbNzu3ZqJRK0sakkJAa77MtQE11LZnbsqmtqSc+MZq09GTU3UTa9xeWZitlJeVoddp+DyDrB0aU6oO9zc4XN77ArEuPckv5dcfnH35HVWW1++Fqb1AqIC3eREEflXI6aMwqxRgfhi58l8ZzY0MTb7/yIUtferDfg2oBmosLMEbHoTb1HKMwzBhRY7O/cNjs1BdX0VRRh9ZsICAmtFsNervNjqW6AYVSgTHYH6Hw/MiaquupL6pCbdTitDmQJDAGm/EL997xbK5ppL6ugfyiEmprG4hLiCZtdBIazS4j39baRn1RJY1NzRTX1FBSXE5oeAhjxqV5aYh3pcXaQklxORqNmujYSPJzi8jKzEGpVJI2Orlf58aqimrqahsICQ0iIMh3zpU+sl+OTV9ITonm6nqcDieGYD9UahU1eeXUl1QhFIKAmFACYkJpabLQXFGHUqsmIDoUu81GfVE1zZV16PyN+MeEojXqqCyvor6u0f3dWeubqSuqxGZpxRwRhH90sE+XzNzsArIyc1GpVaSNTiYiMpSd23PIyynE7Gdk1JhUTCYDmRnZFBeWERoWzKgxyUiSROa2LKoqa4mJiyBtdAo6ndbHlXrT2tpKSVEZKpWK6NjI4RK0LavldOIuSZI+EkLMBhbiSlz1PDCjh3Z24EZJkv4VQpiBdUKIHyVJ2tal3h+SJB29xz0fBuTlFHL1Bf9Hfm4h4Fp9fundJwnVGvj96c9xtmeUC0mJYuaFi7wSTgA0V9Xz9/Jv3CmjlWol40+YTXFtDbfd+V+sFpfhlJqexNLl9xO7m1XZqJgIj9eb1m7higtuc/vlRcVEsOyF+xk13lviqra6jofvWcb3X/0KgBCCJ56/jwWL5uzpx7JHGIx6kvohOl8GavLKMIb692jYgysmIyXNezt4T9BqlP3iktOBUq/B1mjxMO7NfkYQgpqqmgFxM1MZTLTV1Y5E436/pHhTDv+8/K3beytuejqTT52L1uRt4KvUqm5VQxrKavjj6c+JnZpG0YYsmirqXG20auZdfxJBCZ5zqU04efqp1/nmsx8A1/z46DP3sPDo+YBLfjDn980Ubsym0GjnyYdfdLc95axjueKGCwgOCaQ7dHodSSmuhZeMLTu46IzraWxoAlwuGc+98Wi/uSyGhAUTMkxXfPc1XEkrA9yvK3cW89cLX7kz1xsCze0a9hHoTK4FOUmSKFyzgzVv/uhulzJ3IuOOn+WhxmStb2LNGz9Sti2//VwKDr7qWCLGJHj0YdvmTC4+8wb3eEpJS+Ta2y7h+kvuxN5uoxxz0kLGTxzNg3cvdbc7+6JTCA0L5okHX3CX3fvorRx/6qJe7fhqtVoSk7tfTJQZWHrzKNURxn0U8LwkSV8APe5JSpJU2rG6L0lSI5AB7FM6SP/8udZt2IMrrfPbL39I1h+b3YY9QFVWCTVdot87qM4tcxv2AA6bg9qSKj78/Hu3YQ+wc3sO/67Z3Ou+OewOPn73K4+Am5KiMv787R+f9Xdsz3Yb9uCaYP5z5xNUlHkHpskMTyp3FvfKJUfC9WDasT2/t/SXv30HKr0WW33XXQBBVHQ4udkD45qjNppoa6iVXXNGAJbaRta/96tHWEbB6u3UF1ft8bHKtubR0mgBgduwB5da2fb/eSqagGv+7TDswTU/PnDnk5SVuOb1xvI6Nn32F6ZJcTz35GsebT9650t2ZHgHGPrC6XTywdtfuA0xgOLCUv741fe8LTNycDqd5Py5xW3Yg2tMl2z2DKhurqpn/Qe/eZRlrdjYnpNhF7UFlW7DHlxKTv++/6uH2IbdbuedVz/xGE+jx6Xx3/884zbswSVc8PgDz3kc/62XP6K11dNN8uElT7kz3MsMb3pj3BcLIV4ETgW+FUJoe9nOjRAiAZgMrPLx9oFCiI1CiO+EEGO7aX+JEGKtEGJtZeXwMTbzcwq9ynZsz8HW5cYAvlUXwPXj7kqbw05errcxU1LYewWFtrY2duzI9SrP6cZIqvURjV9TVUtz8/BV3BkODKexWZlZ2Cvjvra6DgkJk1/3rmK9QddP/vYdKI1a7D5+J+GRYWTtyOu383RGodEgFErszU09Vx5hDKex2R/YrG1eKiIArZ2Mpd7SUFqDxqCjpcF7fqsvqXar5XRQV+utqlRXW09ze39slhYkpxNLS4uXQQRQW9M7VSabzc72LTu9yrN9zOUjmX1tbPYGh81OY7kvxaY6j9c2axv2VptXva7jvM3Hb6G5ssGjbVubjcwuD5ZhESEUF5R5lCmUCp/jtq3Nsx9Wi5Xmpv6RgZUZWHpjpJ8K/A84QpKkOiAIuLm3JxBCmIBPgOskSeo6w/0LxEuSNBF4Gvjc1zEkSVouSdI0SZKmhYYOnwRHM2dP8yo79uSF+HfahuvAL9L39nBgnHe0u8lo4PDD53qVT9yDgBS9Qc9RxyzwKp8917c3VUJiLEql0qNsxkFTCAsfPp/3cGS4jE2nw0FNfjn+0T3r1udk5RMVHdHnYFqdtn/dchRaFU6HE2eXG0pUTARZmd5ygf2Fymimra7/tfSHmuEyNvsLQ6CJkC5BsUKh8FIW6Q0R4xKx1je51HC6kDBztFstp4O4xGhUKs/5cfIBE9xSsoYQf3T+RvxUWo/Ms+Cai+MSe7dprdVqOO6UI7zK5xwyq1ftRwr72tjsDWqthmgfWcMjx3q6rhiCzK5M9Z1QqpWYQz3jI8wRgV4e5DFTU9F2UnIyGPQcd7LneFq3eiMLjjjYo6y6ooa4BE81Kb1Bj1LhOeaTUxP6vOMrMzj0Ri3HIknSp5Ik7Wx/XSpJ0g89tQMQQqhxGfbvSJL0qY9jN0iS1NT+/28BtRBiYPJuDwCTDxjPTXdegcGoR6VScsZ5J3L40fNJPngCMVNTQbjUbaafd7hPIx4gKDGcaYsPRW3QIoQgdloaSqWSKYlJHH/yESiVSkxmI3fcfz0TpuyZgsL8ww/izHNPQKVWodfruOr6C5g207ccVcqoRJYuv9+d1OjAg6dx25JrMZp8Z9aVGV7UFlSg8zf2SsUjd2d+v2QB7m+3HIFAZfR2zYmICqe4sBRbm/dqVn+gNploq69FkvrvWmT6H7Vey9SzDiEszWWE6ANNHHTFMV6GUG8ITYliwvGzqc4tZdThU1HpNAiFIHnOeOJmpHvVT0lLZNnLD7oDY6fPmsydD9yAuV1K1hBg4qDLjqF+UwF3/ed60se54ppi46P57zN3M26C9zG745CFB3P2Rae65+3rbruUqTMm7PE1ygw/oiYkkzxnAgqlAqVGxehF093juQOtSc/M848guF0xxxjix+wrjsPcJX4kICaUmRcdibY9i23UhCTGHjMTVZeYq8OOnMeZ55+ESqVEb9CzYOEcLr3mXOYfPhuAoOAADpxzAI88fTfjJ7mUouISYnjm1YeYPnuK+2F1wpSxPLTsTgKDAvr9c5Hpf3pUy9nrA7uWBd8AaiRJuq6bOhFAuSRJkhBiOvAxrpX8bjs13CLrm6rqKSkoxeF0EhkdRkCkyzi22+xYaxpRalQ+A2k7U19ag6WmAcnhROOnR+dnAAeozTrKy6pQq1V7rWdra7NRmFuEUqkkNimmx4j1qopqmposhIUHuxV39mNGjOpDxvdrqC0oJ2Vuz1rCD93zFJOmjiUxZe+DnTRqQWKUgaLyPXeJ2B2WompUBi2mFM+Axnde+4SzLzqZtPTkfj2f+7wlhegjotH4BQzI8QeAETM2+xtbSxst9c2odBr07auUklOirqiShtJqVDoNgbFhGLqoijWU1VBXVInkcKI1G7C1tGIM9kdr1iE5AUlCH2hG2WWFvjM9zY9tzS20NlppsrdRXV1LYJD/Xind2O12SovLUSqVREaH93mXbZDZb8dmV+oKK6ktrMBpd+AXFUxoSjT1ZTVYqhsQQmAM88ccEuCzbZu1ldZ6C2qjFp25+3uxpa4JR6sNfaAJVTfqdjabnbISz/HUYm2hvKwSvV5HWPtiT2N9I9XVdfj5mwkKdvWrpqqWhoYmgkOD3A+zI5gR9UPqC71Ry9lbDgLOBjYLITa0l90OxAFIkvQCcDJwuRDCDliB03dn2A83Gspq+P2pz7G0+1NmaNXMve4kghMjUKlVmMO7V0fooLaggn9e+c6dpU6hUjLr0qOJak9sEZfQtxhktUZN0qjeq6LISgojk/LtBT6TnXXF4XBQkFfEkT4S5+wJun5WyulAZdTSVuft0xkdG0HmtqwBM+5VJjOtNVUjybjfb1HrNF47VBU7Cvn9qc+RnK4xGRAXxkGXHo0x2KWCVFtYwYonP6HN0gqA1qwn9ZDJrHv7Z+ZefxKBsb1zNehpftQYdWiMOsxAZMzeJxhSqVTExu9T+hP7HTX55axc/g3N7RnmlWoVsy47hn9e/sad4Vjnb2DutSfiH+XtsKDRa9Hoe5adNOxGZrsDtdp7POn0Oq8EmGZ/M2Z/z4fioJBAgnaj9CQzPBkw4VFJkv6UJElIkjRBkqRJ7X/fSpL0QrthjyRJz0iSNFaSpImSJM2UJOnvgerPQFCeUeA27MGltLDj539xdIpC74nq3FKP9NNOu4Nt361yKTnIyPQCp8NBTW6Zz2zHXSksKMXf34y2S7bDPUWvVdA6AMa90qhrd8vxfMaPjYtm2+Yd/X6+DtRGM7amBpw+guFlhjdtllY2fvKn27AHqCuooCZvl0JZ3sptbsMeXAIHlppGlBo1uX91VWeWkek7FTsK3YY9uAJqd/z8L/7Ru+bplnoLJZv2rWBpmeHBsMgqMFJpqvRWmGkoqfaQwewJX2oNlqoG95O9jExPVOeWoQ8098rfPjszh6jYiB7r9YReq8Rm6/9NNqVGhVCAw+I5/mPjo8jLLvRSb+gvhFKJymCitXbfC6zd17G3ttFc7T0XdyjrSJJEXZG3XKalthGdn4H64kok54jZMJYZIVhqvJXwmqvq3a5kHTSUeSvoyMj0Fdm47wMRY7yTiiTOHrdHqckD47y3g2OnpWEMkZPqyPSO8oyCXq3aA2RmZO91/EZndAO0cg+gMuppq/N86NVoNUREhZG5rXd64XuD2uxHa02lrHk/wtD5G0mY6S020KEcJYQg8UDv94MTIqgvqSZx1liv7LUyMn0lNMXbrSp2WhqVO4s8yqInDYyrocz+jWzc94Hg5CimnHkIGoMWpVpJ+hEHEDPFO/vr7ghJiWLqWYegNRtQKBUkzBpD4kFjh0uqZpkRQNnWPALjejbuJWBnZg6xcX3z5VUpXYaQwzEwRrDSqKWtzlt3PiExlo3rtg7IOQGUOj04nfuk5v2+jEKhIHX+JJIOHodQKND5G5l58ZEExu9aOIkYm8C442ah0qpR6TSkHTqFhtJqxhw5g4ixCUPXeZl9lpCUaCadMgeNUYdCpSR57gSiJ6eQPGcCSrUKtV7LpFPnEZoa0/PBZGT2kIEMqB2RSE4ndqsFR4sVhUqFUm9EqfG9Eq/Ra0mZM4GoCUlITgmbpZWK7QUolEoC4sLw60VArdaoJ3xsIv5RITidTjRGPf7dpEzfG+qKq6grrNijPsmMHNosLTSU1vRK376yvAok8A/s266QXquktW3gZCPVZh3N+d5uFMmjEvj8g+8464KTGQjxECEEar8AWqrKUJt2r3C1PyFJEo4WC3arFaFQoNIbUGr7FrPR3xiCzCTOGkdgXDhqvYbg+HAPSUCdn4HRRxxA/PR0hBAIhcDpcGIIMtNUWU/FjiKcdjv+0SEExIR6qNNYahupza+grdmKOTKIgNgwL7lBmeGFw9aGw9KM025HqdOh0hsQiu5VkAYCvb+RyPFJaIx6nHY7AXFhBMaEEhgdSsKsMQghulXSszY0U5NbRnNVPVqzkaCEMMxh8r1bpvfIM1QX2hrqaC7YlTBHaTRhjktCoe7e1cYQYKI6r4zfnvjYndlQa9Yz97qTCOjB6GqsqOOPZz53p0AXCgVzrjme8HRvl589ZW/7JDNyKM8oxD86ZLfyfR1s37qTmPjoPsvq6XUK2gbA374DpUGLo6UNp82OopMRFRIahFAKcrMLSErp++/DF2qzH82FuThaW4adATtU2C1NNObsgHZ3JaFWY05MQ6XTD3HPdlGRWcgfT3/udqnyjwrmoCuOxRSyK/GPEMKtntNBQ2kNK576FGuta7dGoVIy97oT3S4V1romVr32Pyp37HKlmHnhIuIOGDXQlySzlzhtbTQX5mJv2uXzboxNQBs4uPe9hrIaVizzPbaMQd0vsDjtTnL/3MKWL1e6y6ImJDH59Hm7bScj0xnZ96MTDlsblpICz7LmJuzW3SvXOJ1Osn7d4JGyvLXRSummnrNqVueUug17cO0cbPnib2wtfQuo7UufZEYOJZtzfMZt+GLr5h3ExUf1XLEHDFolrW29DxrfU4QQqE062mq7SmIKRo1J4Z8/B04TWygUqM3+WCvLeq68HyA5HVjLS92GPYBks3kYTkNNm6WFjZ/84RErUV9STW1++W5auajYUeg2vsClVrb9+zU4bK55s66oysOwB1j/4W9YfLiNyQwP7C1Wr/FpKSnE0dbaTYuBoSKzyGtsZXy32j22uqOuqIKM71Z7lJVsyvEZFC4j0x2ycd8ZpxPJhxSe5Ni9ISM5JA85yw6aqrwVHLrS6kPysrmm0cMo3xv60ieZkYHklCjbkkdwYs/qN05JYvuWzD7nTQDQ65QDFkzbgcqsp63a24AaO34Uq/5ah902cA8Xav8AbHW1ONtkxSrJKeG0eX8OvsqGCnubHWut98NGa1PPCdYsNd5jrKmy3m2A2azeBmFrk7XP87PMwOHrfi05HB5SqYOBxceYbK5q6NG4t7facPiY32yWwX04kRnZyMZ9JxRqDRr/rn5tAqVu99vzSrWSpIPHe5X3Jgo+KMHbMEs+eLwrS20f6EufZEYGNXllqPUa9L1IYlKQV4xWp8M/0L/HurtDq1HgcEgM9H1SZdbTWu19cwwMCiAkNIh1qzcO2LkVShUqPz8sFSUDdo6RgkKlQhvk7c6gGkYxCXo/I4mzx3kWCgiI7dkNIzw91qssec4ENAbXnO8XEYRC6XmbjJmSij6w59+czNCg1OroGpSjMvuj3I1r7UAQPsrH2Dp4vHtsdYcpPNBrN1al0+AX2X+xeDL7PrJx3wmhULhS0AcGgxAotDrMiSkodT0b2lHjk5hwwmzUBi06PwPTFh9KiA8prK4EJoRx4CVHYQj2Q6VVk75wGomzxvbH5ex1n2RGBkUbsghO6l1q+y0btpGQ5H2z2VMG2iWnA5VRi6PVhtOHrv3kAybwzec/MpCKlRr/IGz1tThae1793dfRBgShC4tEKJQItRpjbCJqw/AxboVCkDJ3AmkLJqPUqDCG+nHQZcf0KutscFIEM85fiD7QjMagY+zRMz0Uz/yjQzj46uPxiwxGqVaSMGsM44+bJQfUDmOUOj3mxFS3ka8JCMYYFYtQDm5AbXBSBDMuOAJ9gAm1TuMaW1PTemxnCDAx+Yz5RIxPRKFSEhAbyqxLjiQovu8SxjL7D2KkaTpPmzZNWrt24HxuweX37rTbEAolCtWeTeKWuiaEEF6JKnqipdGC0+ZAH2DqteZySUEJW9ZnUFZaQUJSHOMnjyYwNIiG0hqq88pw2h0EJ0agMepcDy572CcZ9ijydDDGZgeSJPHtXa+Rfvg0zL1QQLrv9seZfuBkEpL7FogaE6bDbnfSaBl4A78pqwx9bDD6yK7XJ/HWKx9xwqlHMm3mpAE7f2tdDZLNhjlxz+RtB4lBHZuSJOG02RBCoFCr9/o4A4nT6aSlrhmlWonW3Pudz4ayGqpzSnG02QlKCCcwLtxrDm5taqGlsRlrTSONFXX4RQURFB+OWqf1Pl59I1s2bicvp4Co6AjGTRxNSNh+teo6LOZNp92O5HSgUKkRQyQt3VBeS3NVHZJTQh9oJiAqpNf391ZLK9a6RrRGfbf37twd+WzdmEFdbT2p6cmMnzoWg3H4BLoPQ/abhBby8oMPhEKBUuM9afcGQy9cJHyh24ObEUBVWRUP3f0UK37dFVF/1fUXcOqpR7HiiU/c2Rm7qj/I7BvUFVbidDgxhQX0WLe2pp6Kskpi+8Hf3qBTUlEzOP7GKj89rZUNPox7wbxDD+LdNz5l9PhRGAfoZqbxC6C5uIC2xno05r65M410hBDdSgIPFxQKBYagPXMXaiit5rcnP3FnClcoFcy99kRC0zy1x51OB+vf/5WKzF3BtVPOOISUuRM86tlsNt557ROef/I1d9miYxdwx/3X4+c/fFyZ9gdcC3NDZ+I0lNbw25Mfu8eWUCiYe92JhKX1Ttdea9CiNXRvhxRkF3LTVUvYmblLJOPhJ+/gyBMP71vHZfYJZLecEcrOjBwPwx5g+XNvk59d6DbswRWhn/nDOhw+AoVlRi75q7cTmhrTK1nLf1dvJDk1AWUft6XVKoFCATb74Oz2qQMMtFY14kq/5UlsfDRpo5J57olXsfUQoLa3CIUCXXAolqJ8JOfA71TIDD7l2wvdxheA0+Fk23drvIIe64uqPAx7gE2f/UlzF4GCgrxiXnr6TY+y7778mZyd+f3cc5nhTnlmgcfYkpxOMr5b1W/B2BlbdngY9gBPPPwiZUWy0peMbNyPWKzNVq+yttY2rFZvH2FLTSNOx+AqBcgMHE6nk4LVmT4Dtnyx8o+1pI3ueyC1Ua/E2jp440ipUaNQK2mr9y1FO2fBgQjgkSVPU1I4MDc0lcGIQqvDUlrUc2WZEYe1vqvcKljrGr3USuyt3rEf9pY2r4eAFmsLdrv3g6DFsns5ZZl9j86GfQeW2qZ+W2izNHsfv6amjtY+ymjL7BvIxv0IJT45FrOfpwvQxMljiYnz1jFPmTsBtXZ4b6nL9J6KjAI0Ri3GkJ4TmpSXVVJRUdVnX3sAk15Fa+vgrmCr/Q20lvmWb1UoFBx1wmEkpsTx8JKneOjup/jm85/IySrA6ey/3QVdcCht9bW0Ncoysvsa4aO9fxcpcyeg6eIO4RcRhFLj6eIRNSHJyw0oJi6K0eM8YzQCg/yJT+x7MLvMyMLX4kvK3Ik9quX0luS0RFRdkhcef+JCImN7lkaW2feRjfsRSvLoJJ55+SEOmDEJs5+Jo449lLvuv4GIxChmXnQkxhB/dH4GJp08h6iJsvzlvkTW75sJHx3fq7q//7ySMeNG9dklB8BkUGEZxJV7AE2gkZaKeny55gAIoWDq9Ilces05jJ88mvzcQpY//QY3X7mE77/+tV/08IVSiS40guaC3GGl7y7Td4ITI5l1yVGYwgLQ+RmYcOJsoid7B1D7RQYx95oTCUmOQm3QknTweCaedDCqLosm/gF+PLj0To46/jDMfiZmzZ3Oc2/8l+jY3qlayew7BHUdWyfM9lBi6itjJ43m6ZceZPTYVPwD/Djr3BM55+LT0MgLeTLIajkjnsb6RhrqGgkOC0Kn37Ui0NpkRXI60fnJCjl9YFioPnTGUtvE/+57kxnnH4FKu3vVkrY2GzdfeQ+nn3MigcEBfTqvXqsgJlxPScXgSkNKSNRvKiBoahIqc+8DZ8vLKvlrxWpaLC1cdfOFhIX3PfV8a20NjhYrfsmjhkx9oxPDbmyOZFqbrTjtzh4VxWwtbdha2tCZ9Sh288Dc1tpGXW09Zj8TesN+p14ij81O9HZs7S111XVYm6yERYehVA2u3OcIZL9RyxnyO5RM3zD7m4mOj/Iw7AG0Jr1s2O+DZP22gbBRcT0a9gB//baKyOiIPhv2AH5GFZaWwQ8qFQg0QUasJd7ZlndHeEQoJ552JOljU3normWU9kOQmSYgEKFQ0FyUx0hbFJHZPbuTG+yMWqfBEGDarWEPoNFqCIsI3R8Ne5ku9HZs7S0BwQFExkfKhr2MB7JxLyMzQrC1tJHz5xaiJ/fsZmVrs/HN5z8xfdaUfjm3n1GN1To0ijGaYDPWslq6c83pHsGU6ROYPX8Gjz3wPHW1ffOZF0KgCw3HbrVgLSvu07FkZGRkZGQGCtm4l5EZIWSt2EhAbGivcin89P3vhIQFERXT9+AqnUaBQgGttqFRXFLptQilgrbqpr1qP3ZCOuMmpvPMY6/22QfflcU6ira6GqyVsuScjIyMjMzwQzbuZWRGADZrK5k/riP+gPQe61ZX1fLtFz8zd8Gsfjm3v1lN0xCt2negCfGjubB6r9vPnD0VpVLJJ+9/1ee+KJQq9JHRtFSW01JV0efjycjIyMjI9CeycS8jMwLI+N9aguLDe5S/dDqdvPLcO0yZMaFffO0FEGhW0WQZ2iRo2mAzrdWNOFq89cZ7gxAKjjhmPv/8sY6MLTv73B+FSo0hMhprRals4MvIyMjIDCsGzLgXQsQKIX4VQmQIIbYKIa71UUcIIZ4SQmQJITYJIfrHQXgIcDqdVOeUsu3bVWT+uI7aAvmGL9M/NFXWk71iEwkHjumx7ucffYfV0sLMfvK19zepaLNJ2AcpK213KJQKtMFmmvMr9/oYeoOew4+axyvPvoPFRxK4Pe6TWuM28K2V5X0+nkz/4bA7qMouYes3/7Djp3+pK9r7cSMjs7fUFVWy4+d/2fr1P1RmFePwkeBMRmYgUPVcZa+xAzdKkvSvEMIMrBNC/ChJ0rZOdRYBqe1/M4Dn2/8dcVRll7DiyU+Q2pPnKDUq5t94CkHx4UPcM5mRjCRJrH3nZ2KnpqIzG3Zb96/f1/Dnb6s46/yT+02qMSRQQ13D3q2W9ze6CH8athVjSgpDod67qSsxJZ74pFzefe0TLrpqcZ/75DLwY7CWFSM57OjDoxBiv1FbG7ZU7SxmxVOfumOw1Xot8288mYCY0KHtmMx+Q11RJb8+/jE2aysAW7/5hzlXn0DEmN7lKJGR6QsDtnIvSVKpJEn/tv+/EcgAortUOw54U3LxDxAghBhx2T6cDic7f1rvNuwBHG12SjblDGGvZPYFcv7cgrW2scfkJ+tWb+LDtz7npNOPxmja/UNAbwkwqZAksA5y4qruUGrUqAMMNOX0bVds7qEHkbkti7WrNvZLvxRqNfrIGNrqarAUF8gymUOMvc3Gtu9We4gr2aytlG8vHLpOyex3VGwvdBv2AEiQ8e0q7G3DY7FEZt9mUHzuhRAJwGRgVZe3ooHOM24R3g8ACCEuEUKsFUKsrawcfturkiTR2uS9zd/a2Petf5nhzUCOzYbSGjZ/9hfph09Doez+p7rq739586UPOPH0owgODeqXcysVgohgLbX1w+tGpI8KxFpcjaPzTXMP0WjUHHn8obz10ofUVNX1S78UKhWGqBjs1maa8rKQnEO//T7c582BQnI4afMxH9ssg5uATaZ79oexaWvxzmbd2tyC0zE8Fktk9m0G3LgXQpiAT4DrJElq6Pq2jyZey16SJC2XJGmaJEnTQkOH37aqUqUkdf4kr/KYKSmD3xmZQWWgxmZbcwt/PPcFibPH7TaI9sdvV/D+G59x8pnHEB4Z5vGeSikw6JSYDEoMOiUqZe/cRQQQG66jyeoYMvnL7lBq1OjCA6jfWsSe697vIjI6gikzJvLck69is/VPsLBQKNFHRCMBDVnbcbTt/QNIfzDc582BQq3XknZol5gTAeGyO8SwYX8Ym2HpsV4WzqjDpqLRa4emQzIDghCi1xrNQoglQoibBur4nRlIn3uEEGpchv07kiR96qNKERDb6XUMUDKQfRoowsfEMeOChWz/31qUahVjjpxBcPKI8zCSGQbYW2388dwXBMWFEznWt0Fidzh47/VP2bpxO6efczz+gf4A6LUKAsxq/IwqhACbXcLplFAoBBqVAqck0WRx0Gix02Sx4+xiH6uUgpgwHQioHSa+9l3RRQTQkFFMc34Vxvi9NwymHziJ8pJy3nzpAy64/Cz6w1VeCIEuJAxbfR0NOzMwxiag8Qvo+4Fl9oioCUkccM5hZP64Do1Bx5gjZ8jxTzKDSlBCBHOuPoFt36yizdJC2qFTiJqQNNTdktlPGDDjXriiyl4BMiRJeqKbal8CVwkh3scVSFsvSVLpQPVpINEYdMRPH03U+CRQKFBr1UPdJZkRSJulhT+f/RK1XkvSweN81qmpruP5pa+hUCg447wT0eq0+JtUhARoUCoETRY75dWt2Hwo3KhUAr1WSYi/mpgwHS1tDqytTpxOCY1agUmvoqHZTl3j8DTswWVAm5LDacgoRmXUou1BHrT74yg44thD+fDtz/ngrc857ezj+83A1wQEotBqaS7Kx+ZXjyEyBqGU08MPFlqTnsRZY4mZnIJQKFDJ87HMIKNUKYkYE09IShROh1Nesd+PEEIcA9wJaIBq4CxJkjok1SYKIX7BtbD9qCRJL7W3uRk4FdACn0mSdE9f+jCQK/cHAWcDm4UQG9rLbgfiACRJegH4FjgSyAIswPkD2J9BQS3/gGX2krqiSv568WsCY8NInjPeS3XFKUn8+es/fPzeV0ydPomZB00iyF9LSIAGm12ivtHWY/Cr3S7RaLfT2AxCgFajQKNSoFQI2tqcFDVacQ4vTxyfKLVqTCkR1G0qwH9cLLow/706jkaj5qQzjuGTd7/C0mTh7ItOQa3pH0NQpTdgjI6jpaaKuswtGCJj0AQEyWo6g4g8H8sMNap+mk9kRhR/AjMlSZKEEBcBtwA3tr83AZgJGIH1QohvgHG4VCOn43Lm+lIIMUeSpN/3tgMDZtxLkvQnvn3qO9eRgCsHqg8yMiOBlgYLGf9bQ97KbSTPmUDE6DiP951OJxvWbuHLT75HkuCiS08hMT4EP6MaS6uDipo22vbCN16SoKXVScswUcPZU9QmHebUCBq2FdFa1Yg5NWKvJDL1eh2nnn0c//v6V+697TEWX3gK6WP7J15GKJXoQ8Oxt1hpqSzDWl6CLiQcTUAQCtWAekXKyMjIyAwNMcAH7eqPGiC303tfSJJkBaxCiF9xGfSzgcOB9e11TLiM/eFn3MvIyPjGYbPTVFFHdV4ZJZtyqMgsInxULNMWH4rWqMPucFBdWUNhbhH5uQVUlpWRmBTF5ZcfS3iYP3aHRLPVQXGFlf1deEFl1OE3JgZrcQ2Vv2egC/NHG+aH2s+AUq+mh/UFNxqNhmNOPJzMbVm88tzbmMwmZsyeyqjRyUTFRKDVavrWT50eZWQMjhYrbQ21WMqKUOkNqIxmVAYjSq0OhVrTb/kJZGRkZGSGjKeBJyRJ+lIIMQ9Y0um9rv6yEq4b1UOSJL3YXx0QI02TWQhRCeTvQZMQoGqAujNckK9xYKiSJOmI3lbe3dh87JRbRscGRfoUoC+rr2yxo9SeffNRQqnavV92Y20z1mZZ0s8XCqFA1Y1fe1lDrdPuw9/ItWsqvCZBgfCysiUcbRKOfglG0Go1irTEBH1P9eJnzV3f1Gxx4j3++21sDhIjYY6S+9g/6CRJ8h0w5INejs2RcN27Q+7/0BMCbN+TebM3CCGaJEkydSlbD1wkSdI6IcRrQKIkSfOEEEuA4+nkltP+/3HAf4AFkiQ1CSGiAZskSRW+jt8bRtzKvSRJeySPIYRYK0nStIHqz3BAvsbhwZ6Ozb0heAR8DjD8vq/uNCqGWz+70tjUDPS9n4MxNnfHcP+cQe5jfyGEWLsn9XszNkfCde8Ouf9DT/s19Kth345BCFHU6fUTuFbqPxJCFAP/AImd3l8NfIMr/vQ/kiSVACVCiNHAyvaYrCZgMbDXGRtHnHEvIyMjIyMjIyMjM9RIktSdL+UXPuou2c1xlgHLfJTv8ao9DFKGWhkZGRkZGRkZGRmZgWd/MO6XD3UHBgH5GvcfRsrnIPezfxkp/eyOkdB/uY/9w0D0cSRc9+6Q+z/07AvX0GtGXECtjIyMjIyMjIyMjIxv9oeVexkZGRkZGRkZGZn9Atm4l5GRkZGRkZGRkdlHkI17GRkZGRkZGRkZmX0E2biXkZGRkZGRkZGRGWYIIY4QQmQKIbKEELf1up0cUCsjIyMjIyMjIyMzfBBCKIEdwGFAEbAGOEOSpG09tZWTWMnIyMjIyMjIyMj0gZpNa88EHsSVfbYAuD1owrR3+3DI6UCWJEk5AEKI94HjgB6N+xHnlnPEEUdIgPwn/w3G3x4hj035bxD/9gh5bMp/g/i3R8hjU/4bxL8Bo92wfwmIB0T7vy+1l+8t0UBhp9dF7WU9MuTGvRBilBBiQ6e/BiHEdd3Vr6qqGsTeycj0HnlsygxX5LEpM1yRx6bMPsKDgKFLmaG9fG8RPsp69ZAy5G45kiRlApPA7V9UDHw2lH2SkZGRkZGRkZGR6SVxe1jeG4qA2E6vY4CS3jQc8pX7LiwAsiVJyh/qjsgMDna7nbLSCmpr6oa6KzJAc5OF0pJyrNaWoe6KjIyMjMwIRZIkyksrqa6qHequDBYFe1jeG9YAqUKIRCGEBjgd+LI3DYebcX868F7XQiHEJUKItUKItZWVlUPQLZmBoLiwlMfvf47j5p/N4uOv4Lef/sLWZhvqbu0R+9LY3LwhgyvOu5Wj557FTVfcw46M7KHukkwf2JfGpsy+hTw2920qyqp4YdkbnHDYuZx25EV8/dkPWCzWoe7WQHM7YOlSZmkv3yskSbIDVwH/AzKADyVJ2tqbtsNGCrP9qaQEGCtJUnl39aZNmyatXbt28DomMyA4HA6efOgF3nzpQ3eZEII3P32WiVPGDmHPPPDl79YtI3lsFhWWcuYxl1JXW+8uS0qJ59UPlxEUHDiEPZPphv1mbMqMOOSxuZ/z9isf8eh9z3iUvfjO4xw4e9oQ9cjNHo3NPWUA1HL2miH3ue/EIuDf3Rn2MvsOVRU1fPr+Nx5lkiSRlZkznIz7/YbCvCIPwx4gJyuf4oJS2biXkZGRkekVjQ1NfPTuV17lq/5cNxyM+wGl3ZAfEmO+K8PJLecMfLjkyOyb6Aw6wiNCvcr9/P2GoDcyRpPRq0ylUmIwdQ3+l5EBR1sb9Tu34bTbh7orMjIywwiNVkNMXJRXeURU2BD0Zv9lWKzcCyEMuDJwXTrUfZEZHPz9zdx45xV88t5XpKQlYbPZyMzIYsz4tKHu2n5Jcmo8J595DB93WnG57NrziEuI8ajX3GyhpLAMtUZFTFwUKtWwmEK8aGlppbigFKEQxMZFodaoh7pL+xT2pnocVgv25kY0/vLOjozMvkppcRn1dY2EhYcQFOL7t26z2SjML8HpcBITF8lFV57Fqr/W0dbaBkB4RCgzZk0ZzG7v9wyLO7MkSRYgeKj7ITO4BAT6U11Vy8/fv4FOp+XSa89Fp9MOdbf2S4wmI1ffdBELFh5MeVkl0bFRjBmfhlq9a4ooyCvi0fue4fefV6LWqLnoysWcce6JBAQOr92W0uJynn38Fb769AcUCgWnnn0cF12xmNBweYrpL+wtLjUlR6usqiQjsy/icDj4/ZeV3HPzo9TV1hMbH83Dy+5k/OQxHvWqKqt5/cX3eefVT3A6nSw6dgHX3noJb3/2PDsystBqNYwen+a1UCQzsAwL415m/6O52cIrz73DhrVbANdK67JHlpOUEs/8w2cPce/2TwKDAzho3gyf7zmdTj5+9yt+/3klALY2G88/+Rpjx6cxZ8Gswexmj/z6w598+cn/ANcN6r3XP2X8xNEcfeLhQ9yzfQenrRWFVoezrXWouyIjIzMA5GYVcOPl92C3uVzvCvOLufXq+3jr8+cJ7rSCv2blBg9hjG+/+InR41I595LTSR+bMuj9lnExnHzuZfYDbG021qzcwPrVm/j79zVe7xfkFQ1Br2R6oqG+kR+++c2rfOP6bR6vs3fk8vKzb/N/197PT9+t8ArSHWgcDgffffWzV/lvP/01qP3Y13HabCi1Opy2kSVdKyMj0zuKC0vdhn0HRYWlZO3I5YVlb3D79Q+w6q91/PnbKq+2337xM63tLjkyQ4Ns3MsMKutWb+TC069l88btpKQleL0fEiq7TgxHDAY94yame5UnJu9KvleYX8yli2/iqUdf4pvPf+SGy+7mi4++H8xuolQqmXLABK/y8ZPG+Kgts7dIdjsKjUYOqJWR2Ufx5V9v9jOx+u9/ee6JV/n60x+44bK7SUjyTsA6ZfoENHKcU78ghHhVCFEhhNiyJ+1k415m0LDb7e7tu1eefZsLrzgLg1Hvfn/WnAMY68OAlBl6NFoNF1xxFgGB/u6yKdMnMmX6LkM6c1s2FeVVHu2eX/oapcWDq257zEkLiYqJcL9OTk1g7qHDy3VopCM57CjUGiSHvHIvI7MvkpyWwGXXned+rVAouOnOK/jsg10S1o0NTTjsdlLTk91l4RGhnHj6UQgxoJLy+xOvA0fsaSPZ515m0JCcEm1trq26tjYbjz/wPEseuQVLs4WAQH9GjUkhOjZyiHsp0x1jxqXxzhcvkJuVj1anIWVUIsEhQe73nU6HVxuH3YHT6RzMbpKSlshrHz5F9s48FEKQPCrRp+yqzN4hSRKSw9Fu3Ht/5zIyMiMfg0HPeZecxuy506mqqiE6JpLC/GKqKmo86r3z2ie8+emzlBaX43A4SE5N8Fhc2Z/48LKlXkmsTn3huj7p3kuS9LsQImFP28nGvcygodaoWXzhqaz+ez2wK0Dn1Q+XMXX6RI+6DocDS7MVo8mAQiFvMA0XYuOjiI331jAGSBudjNnPRGNDk7vs3EtOIzI6fLC65yYyOpyAQH+EAnQ63aCff19GcjpAoUAolUgOB5Ikyat0MjL7IAajgTETRmG1tmIyGVAoFegNeqwWq7vORVcuJjE5zsNFc3+k3bB/CehIDhMPvPThZUvpq4G/N8jGvcygMv3AyTz96kO8+9on6PQ6Fl9wMhO6+ENn78zjg7c+558/1nLwIQdy8pnH7PcTx0ggISmOl997kk/e+4rt27I54dRFzDlk1qA/nDU3Wfjr99W89vx7qNVKLrxiMdMPmoJeLxv5/YHkcCAUSpdBr1AgOR0IpXwrkZHZ18jMyObd1z5m/dotHHbkXI47eRGvvP8kH779JXnZBZx85jHMnu9bYW0/5EF2GfYdGNrLZeNeZt/GYNQzd8EsDpo7HYVC4WX4VVVUc+Nl95CTlQdAXk4h/67ZxPNvPOrh7y0zPBk9Lo077r8Bh92BSj0008vqv//lpsvvcb+++sL/Y/k7TzBz9tQh6c++hsu4d/1uhcK1eo9s3MvI7FOUFJdxxTk3U1lRDcBLT79F5rYsHn36bu599JYhneOHKd2tQA7JyqT8zcj0Kw31jWRmZFNdWUNMXCSp6clotRqvet1lNs3LLXIb9h1s3bid/Nwi2bgfhpQWl7Fzey42m43ktEQSkmIRQgzZpO9wOHj/zc+8yr/94kfZuO8nPI17hex3LyMzwnA6nezMzCE/uxCzn4m0Mcke8VMAuTvz3YZ9B7//vJKiglLSRifLhr03BbhccXyVDzrytyPTbzQ1NfPC0td5+9WP3WX/eew2jj35iF775Kq7mTBkWa3hR15OIVdf8H/k5xYC4Odv5qV3n2D0uLQh65NCocA/wDtjrq8ymb1DcsrGvYzMSGb13/9yxXm3unXsZ8+fwb2P3kpo2C4parWPe65SqUSlUg5aP0cYt+Ppcw9gaS/fa4QQ7wHzgBAhRBFwjyRJr/TUTo5UlOk3snfkeRj2AA/ds4yigpJeHyMxJZ4FCw/2KDvmpIXEJ8b2Sx9l+o+/VqxyG/bg2rV5743PcAyhsSeE4PRzT0Cp3HUD0mg1HH7U/CHr076G5HAF1EK7ce9DJUlGRmZ4UlfbwEP3POWRoOrPX1eRsWWHR73ktEQmd8kZcvZFpxCbED0o/RxptAfNXgzkA1L7vxf3g1rOGZIkRUqSpJYkKaY3hj3IK/cy/YivbKSWZquHekpP+PmZuHXJNRx65Fy2btrO+EljmDp9oocevszwIHtHnldZxpYd2NrsKPVDt7ozccpY3vj4af5asRqlSsWsuQcwdvyoIevPvobkdCJE+7qQvHIvIzOisDRbKMj1zgRfW1Pn8To4JJAHn7ydNf9sYEdGFlMOmMjkaeNRq+Vd9O5oN+QHPXjWF7JxL9NvxCVEo9VpaW1pdZeljEoiMmrPpBAjosI46vjDOOr4w/q7izL9yOx5M/j43a88yo49aSE6vXaIeuRCqVQyYcpYJkwZO6T92FfpkMIEEEKBNMh5DGRkZPae4NAgDl00h/99/atHua9Ms9GxkXLumRGKbNzL9Jnamjq2bNxOVmYudz94I1s2ZvDh219yza0X4+/vx1ef/sDYCaMYOzEdnW6X4dfW2saWTZls2ZhBYKA/E6eOJS4hZgivRGZ32O12tm3aweaNGRiNetLHpXHDHZfz3OOvYrfbOfmsY5lx0FS+/eInKiuqGTMujXETR6M39K8EZW1NHVs2ZJC1I4/4xBjGTx7j4SsqM7BIDseuGBrZLUdGZkSh1Wq48oYLaG628uev/xAQ6M9t915DdEwEf/76Dzszc4mNj2bC5DGERYTs1TkcDgcZm3ewaUMGOp2WiVPHkpya4FVPnssHDtm4l+kTba1tvP7iB7z2wq6dqIVHz+edL17g/677D7lZuwLF//vsEhYevcv3+a8Vq7n24jvcr2Pionjx7ceIjZd9+oYja1dt5PKzb3b71AeFBPLK+0s5dNEcHHYnKpWS6y65k8xtWe429z9xO8eetLDf+tDa2sarz7/HG8vfd5cddfyh3P6f6zH7mfrtPDLdIzmduwJqhZDdcmRkRhgJyXE8/twSykor0et1BIcGsvypN3nxqTfddRYcMYclj9yCf4B5j4//75pNXHrWjdjtrrkhMMifV95fRsqoRHcdeS4fWOSA2n0cq8XKju3ZZO/Io621rd+Pn59XxMfvfslpZx/PxVefzeILTmbVX/+SszPPw7AHeOz+Z6muqgWgrqaeJx583uP9ooIStm3K7Pc+yvQdq6WFF5a+7hEsW1NVy9pVG4iJjSI+MYadmbkehj3A4/c/S0VZpUdZXU09GVt2UJBXjCRJWJqtZGZkk70zD1ubbbf9yM8t5K2XP/Qo++bzn8jJyu/jFcr0FjmgVkZm5NPWZqPF2kJraxsFuUW8/Ow7Hu///P3v5OzM2+PjtrS08vLTb7sNe4DamnpW/b3Oo548lw8sw2LlXggRALwMjMMVZXyBJEkrh7RT+wDFhaU88eDz/PjtChQKBaeefTwXX7W4X7e92lptXH7debz+4vtUlFcREOjPBZefgdXa4lW3rqaetjbXA0Zbm42a6jqvOs2d0lrLDB9sNhtVXTSPwfWddmBt9v7uGuqbaOtksGduy+L26x5gZ2YOer2OG++8grzsAt5+9WOUSiVnnn8SF1x+JsEhgT770WJtxenDx7vFx3iTGSCcDkRHngo5oFZGZsSxMzOHO69/kIytO9FqNTzw5B0+Vc6s1j2/H9ttdirKq7zKa9oX9jqQ5/KBZbis3C8DvpckKR2YCGQMcX/2Cb7/+hd+/HYF4Epa8f4bn7Jm5fp+PYfRbODl595x/5jraut59vFXiU+M9Upycdo5xxMW7vLhCwkL4oxzT/B4X6lUkpae3K/9k+kf/PzNnHn+SV7l02ZOdv8/KS0eTZeEZSecdiQRkWGAKw/Cg3cvIy+3kNHj0jCZjdx/xxMEBgcALj/Nt17+kHWrNnbbj9j4KEaN8RwjYeEhslTqICI5naBw+dwLoQA5oFZGZsRgtVhZ+vCLZGzdCbjcY376bgXjJ432qBcUEugzyLYnTGYjZ553EkIIUtOT3G62M2dP86jnH2AmJS3RoywsPIRAOVmlB0KIWCHEr0KIDCHEViHEtb1pN+Qr90IIP2AOcB6AJEltQP/7j+xntLS08sPXv3mV//37Go487tAe22/bnMl3X/5CRVklR51wGFOmT8BkMrrfr62uY/Xf/1JTU+/1RN7a2gZIvPDmYzz135coKSrlpNOP5sTTj3brjysUCk4+8xhUKhUfvfMl4ZGhXHPLxYwel9qn65YZOA4/ah52m4O3XvkQP38z19x8MeMnprvfT0tP5qmXH+SFpa9RWFDKEcfM5+Qzj3U/5NVU1RISGshFV5zF5o0ZjJuYTnhkKLZOesvgSrBy+FHzfPYhMCiAh5bdxWsvvMdfv61i8gETuPSac4mIChuw65bxRHI6PKUwZbccGZkRQ01NHX/+usqj7IdvfuPZ1x7mh29/Y8VPfzNhylguv/Y8omIivNpnbsvih29+Iz+3kEXHLuCAAyfj5+/plz9nwYE8aLyDn75fgclk5LZ7r2Fcl4eH2pp6jjrhMDat38bGdVtIH5vKrLnTqamt6/drHuHYgRslSfpXCGEG1gkhfpQkadvuGg25cQ8kAZXAa0KIicA64FpJkpo7KgghLgEuAYiL2/Mnyf0RrVbDtBkTvRJTjOtkjHVH5rYszj/1WqztLjLfffkzDz91l/uhQJIkPnn/a5569CUuvOIs9HqdhxuOQqHAz99M+thUXnzrMVpaWgkKDvDKUhsRFc5l153HKYuPRafTYuz08DBS2J/GZkhoMOdcfCpHn3gYarXaK+ipML+Eu25+mPQxKcxbkMjvP/9DaFgISSnxCCHw8zMTHhHK80tf33XMsCBuW+K5ENFThtuUtESWPHwz9XUNmP1NaLVDK705XBmoselaue8UUCuv3MvsIfvTvDncMJtMpI9Jca/cg2tnHyG484EbuPqmizD5mTyU7TrIycrnwtOvo6G+EXA9FNx5/w2cevZxHvW2bdnB/113v/v1d1/9whsfP83YCbvsj4BAf15c9gbJaYnMP/xgcrPyeeKB5/ngm5f6+5IHjQnxc88EHgTigALg9k35K/qaxKoUKG3/f6MQIgOIBoa9ca8CpgBXS5K0SgixDLgNuKujgiRJy4HlANOmTZOGpJcjDCEEJ5x2FD99/zulxeUAjJkwillzpiNJEvm5RZQUlRIYFEhiShw6nZYWawu52QWs/Wej27Dv4PknX+OgeTPw9zdTWlzOS0+/BcA3n//I1bdcRENdIw6nE7VKRVhEKIkp8QAYTQaMJgO7IzgkaAA+gcFhJI/N5iYLOVn5NDU2E5cQQ3Ss9yqNL4KCffvD78jIYt6CWUybMQmLxcL0g6bw4lNvcsSxC4iKDqe52con733t0aaqoobKTv6Z4yeNZsZBU3rsg1qjJkSWTNstAzU2XUms2t1yFAokh2zcy+wZI3neHO7U1daTm1WAzW4nISnW7QrbgV+AmdvuvYbLz70FS3uc1DEnLmT0uFTU6t3Pq9u37nQb9h089+SrzJp7ABVlVTgcDuISo3n52bc96rS1tvHPn+s8jPu4hGjueugm7rrxIbZu2o4QgpvvvorE5JH5sNdu2L8EdBg88cBLE+Ln0lcDvwMhRAIwGVjVQ9VhYdwXAUWSJHV09mNcxr1MH0kZlcgbHz9D9s48VColSakJhIYF8/fva7j+kjuxWlsQQnDtrZdw/CmLePeNT3njxfc58zxv32qHw4kkueZgSZLcgTAOuwOHw8krz7+Lrc2GUqnk/+67FkWXVXqZ4UVtTT3PPv4KH779BeBaRXn29Ue8/C73BP9APwBuveY+AMx+Ju77760gddy7JZ8BVEEhgTz/5n9RqVQkpyUQEjpyH/b2CzpJYaJQIEmycS8jMxwoLS5jyW3/ZeXvawGIS4hh6Uv3e/m2a7Razrv0dOx2ByqVCpPZgELRcwimr/n7hNOO5O6bHmZte6zUqYuPw2G3e9XrrJ4Drh3+I46eT9roJMqKKwgNDyYpNcErbmsE8SC7DPsODO3lfTbuhRAm4BPgOkmSGnqqP+QBtZIklQGFQoiO/PAL6GG7Qab3RESFcdDc6cw4aCqhYcGUl1Vy140Pud1oJEli6cMvsnVzJsufepOjTzqcqTMnEpfgqTV/8VVno273nY6MDue8S08H4OgTD+eFpa+7JQwdDgcP3b2M3GxPGUyZ4cW2zZluwx5cqz2P3f8czU2WvT5mfV0jH73zpft1Y0MTzzz2CqI9+DIyOpxzLznNo01AoD9jJ4wifUwKo8Yky4b9CECSXFv40OGWI/vcy8gMB1b/vd5t2AMU5BXxyXtfexjljQ1NPHj3Up574jWWP/Umzz3xKo/e+wzbO7npdEf6mFTMfiamz5rMEcccQkx8FH7+ZrdhD/Dlx99zwmlHebRTqZQcOGda18Oh1qhJSUtk0rRxpKYn+3QFGkF0t+XQ560IIYQal2H/jiRJn/amzXBYuQe4GnhHCKEBcoDzh7g/+yx1tQ1U+pA0bKxvZOny+/nkva95ZMnTHHbUXKKiI/jx2xUcdfyhbN6Ywbuvf8JFVy5m9rwZnHbO8UTHRtLQ0ORlEDocDiorqkkbLSvfDFe6as8DbN6wjYb6xh7dqLrDl1Rm9s486mrqiYwKR6FQcOTxh2H2M/Hbj38RlxjDCacdyd8r1vDh21+g02s595LTmTV3OmbzyIu/2F9wueW0rwvJajkyMsOGrT7yxKz6cx1WawtGo2teb2hoZMsGb0HCspKKHo+fnJbAo8/cw2svvEfGlh2ccMoitF1W2ltaWrFarNz/+P/x1Wc/YDYbOf7UoxjlQwkvN7uAD9/6nBU/r+SAAyex+MJTSB2V1NvLHW4U4HLF8VW+1wiXD+QrQIYkSU/0tt2Qr9wDSJK0QZKkaZIkTZAk6XhJkmp7biWzN4SEBBITG+lRJoQgLDKUO254kD9+/YfC/GJefe5d1q/ZxM13X8l/7niCj97+ksxtWdx85RLW/rOekNBgjj/1SBYsPJiALtJVao1aVi8Z5kTFRHqVzZw9lYCgvZchi/ZxzHET0wkJc/l82mx23n/jM55f+jpCoSBrew7bNu/kwbuXkrUjly0bt3PzlUv4dzdSmDLDAKe0SwpToZADamVkhglTDhjvVTb/8NkYDHr368BAf2YcNNWrXkxcVI/H374ti2suup3Vf/9Lfm4RTz/2ChVlVR5tTWYjSpWSJbc+SmtLK4X5JVx9wW1eDx71dQ3cecODvPPaJxQVlPDZB99y7YW3U+5j4WmEcDvQdevb0l7eFw4CzgYOEUJsaP87sqdGw2XlXqaPVFZUk7ltJ40NzSQmx5E2OhmFQsGWjdvZmZGNWqsmKiaC3OwCrrjxAtra7Cy55RF0Oi233389hXnFXivw3335C4uOO9Qra+iH73zF3EMPAiA6NpJHn7mbm6+8l/q6BgxGPff99zYSkmTd8eHMmPFpXHXjhbyw7HXsdgcJyXFce8slbN24nYqyKqJiIxg1OgW9QefRbuO/W8nKzEGr1ZI+LhW9XseOjGzsdjtJqQlccf35LH/mLew2O1ExEdxyz9UU5BWy+u91BAUHkL0jF0uzlbX/bODiq8/hy4+/9+rbX7+vRqPV0FDfSEpaIslpCYP0qcj0hMu/XgLaY2qEAElCkiQvNSwZGZn+o6G+kcxtWVSWVxMd55qfdXrP+XnqjImccPpRfPb+N67X0ydy7MlHePw2DUYDN9x+GTddsYSCvCJUKiWXX3c+6b2Qod6Zkc3RJxxGZHQEdrsdtVrFD9/8yq1LrmbbpkwkSSI5NZE3X/4Qu93BhrVb3G1zswtwOJzk5uTj7+9HYJA/m7vsIBQVlpKfW0R4RGhfPqohYVP+incnxM+F/lfL+RP3hNt7ZON+H6C8rJI7b3iQVX/9C7j82559/VHUGhXXXnQHjQ1NgMv//vhTFvHCsjcYNzGdtz9/Dj9/M3EJMfzv61+9jqvTa91+9p3pmj105uxpvP/NS1SWVxEUHEhsfJR8ox/mmP1MnH/5GRyy8GAszVbCo0J597VPee2FXfPQbUuu4bRzjnfnJvjnz7Vce9Ed7niNhOQ4rrzhfG6+8l73Md/89BlmzTmAhoZG4uKj+f7r33jmsZfdxzzrgpNpaGgic1sWjQ2NmP283W8UCgW3XXMftTX16A16Xn73CcZPHjOQH4dMb3FKIBS71HKEaDfwnSCUQ9w5GZl9E0uzhZeefos3XvrAXXb7f67j1MXHeQTChoaHcNs913DmuSdit9uJjY/20qAHV56a6QdO4ohjDwGgqLAEa7PVI5eNL0JCg8jKzOWzD74FQKVW8cTz9/HQ3UspKXKp8pn9TNx4x+Vs3rArdDI0PASdXsslZ93gzoR7+3+uc8XsSJ5iSRqNek8+mmFFuyHfL8o4faXf3HKEENOEENcLIf4rhLhPCHGqEEKOjhsEtm/Z6TbswRWV/u7rn/DZB9+6DXtwSU4mJMdx9kWnUJBXTG52AQEB/igUCkLDgklK9XQXO3Xx8QQGB3hEr6vUKk483TNYBiA6JoJJU8cRlxAtG/YjBLVaTcqoRCZMGUNlebWHYQ/wxEMvUJBXBLiyy776wnse+QzysgsoK6nA1O4f39jQxCfvfU1AUACh4SE0Nlp47olXPY75/hufMf8w167Px+98xSlned6cDEY9IaFB1NbUA65siq88/057YjSZoUZyOt0B0h3IrjkyMgNLzs58D8Me4PH7n6Mgt8irrt6gY9SYFMZOSPdt2NfU8eDdS3FKEmnpSYRHhPH372u8cuL4orGx2WO13WQy8u/qjW7DHlz3gQ1rt3go9Fx5wwUse2S527AH+O6LnznhNE/vkvmHzyZphEphDjf6vHIvhDgPuAbIxZWAKhPQAbOBW4UQW4C7JEmS5VMGiLraeq8yyekke0ee+/X5l51BUUEJd1z/IIHB/px3yenYbXYuOP0abltyLTXVdcw55EAOOfxgqqtqiImLYt2qjfj5m1jyyM2UlVQgFIIZs6Z4aNXK7Bt01S4GlzZxY73r4bCxsYnCPO8bSXlZJeGRoTQ1NnPAgZMZMy6Ni8+8nrKSCm6952ov6TSHw8GosalcfNViomOjGDMujedef4TVK9ej0+uIT4zh/js8Y4ayMnNpaWnxCtySGXwkp9MVRNsZIRv3MjIDSV2dt/Jha2sbjY3NPmrvHqulhatvvpjvvvqZW666j9CwYK648QKkXqzJNTd5ni8oJICiwlKvejszc3lo6R389vPfGI0GUkYlUl7q6Uu/fu1mzr7oFGbPm8nWTRmkpacwZfp4/AL89viaZLzpD7ccI3CQJElWX28KISYBqfQxYlimexJ8POlGx0Ux46CpbNucSWp6EuVllfz47QrAlTjoqf++xNLl95OVmccV593K8nce5/+uvR+VSomfv5mqyhomTR3H+rWb+eOXf7ju/y7l/EvPkFfl91Fi4qIwmY00dbpZRMVEuNOPR0aGc+iR83jjxfc92qWPSeXtVz4G4LSzj+eWq+51G/R+AWaCggOoqa5z1w8KCSQhMYYFCw/ede74KGbNnQ7AXytW09jQhFarQa1R09TYzLEnL8LfX57whwOS1Enjvh2hELJijozMABIbH43BqHcnneoo65if9wSTn5Efvv2Nn7/7HXAt0Cy55VGeff2RHtt2+MKrNWp0Oi0FuUWcctZx/NR+rA6OO+UIRo1NZdRYlx9/Q30js+ZO56/fduVeEkJg9jMx46CpHLpozh5fh8zu6bNbjiRJz3Zn2Le/v0GSpJ/7eh6Z7hk9NpX/PruEoJBATGYjSx65hbiEGNpsdh548nYOO3IeK37626td9s58FAoFba1tWJotLHvpAQIC/amsqGbK9AnMPXQWWzdu55qbL6ahrpG3X/mIbZszvXzkZEY+cQnRPP3qw+4HxbET03nihfs8shUee+JCjj7hcJRKJWY/E9f/32WY/EwYjHpUahXVldUeK/XFRWXcdNeV7u3Z1PQkbrrzChrqm+iOiVPGsOzlB1l80Skcf8oiHnjido458bABumqZPca5S+PejbxyLyMzoMQnxvDMqw+7hSrGTxrNY88t8Yp/6w3lpZX88r2nMS5JEoX5xT22tVisPPbcEi647AyOPvFwbrv3WkLDg7nmlovRG/SoNWrOveR0DjnsYDat38Ybyz/gw7e/oKK8iqtvuohZ7Vr3IWFB3P/E/zFhkhxLNVD0W0CtECIRl159QufjSpJ0bH+dQ8Y3Gq2GhUfPZ/K0cZSWVHDFube4fe2VSiXPvPYw0bGR7MjI9mjncDjcxphOp2PazEm89/VyMrdl8fYrH7HskeXccPtlPPv4q7S0tLrP9eoHy5ggBzjuc0ydPoE3Pn6a+rpGgoMDMHfx10xNT+Luh27k7ItORaNRkZyWiCRJfPrD6zgdTjZt8Mw9FxoSxIqf/yY1PYn5C2dTlF/C77/8w8VXLe62D2Ulldxz8yNuVzOFQsELbz9GZPSer1DJ9D8eGvftCNm4l5EZcKbNnMQbHz9DQ0MjQUHe83NvMRj1hEeGUdzFncbsZ+qxrZ+fmSW3PUpxYZm77IbbL+fUxcdy5HGH4nQ4iYgO49/Vm7l08Y1uH3v/AD9e/WAZjzx9D8WFpRiMBllRb4DpT7Wcz3EJ7X8FyDP9EBAWEco3n//kEUTrcDh499WPufvBGznvlKvdKaDTRidTU+1KJ7DouAWkpLsSR4SEBmFNjKG8rJKYuCh2ZOS4DXtw+WF/+sE3snG/jxIYFEBgUID7dVVFNWWlFZj9TMQlxKDT6xjdSTJNCOHeGrY7HEyZPoF/V28CXKs8//vKW4XpzHNPYOum7RhNRuISoj0CatesXO8RQ+J0Oln+1JtMmjLWS/ZNZvCRfK3cK4Rs3MvIDAKBwQEEBgf06RjRMZFcd9ul3Hr1fe7FvQmTxzBm/CjKSyuprKgiINDfp+59VVWNh2EP8N4bn3LsyUe47wMtLa0sf+ZNj+DZ+roGVv21jsUXnoK/7FM/KPSncd8iSdJT/Xg8mb2gw2DvTGVlDXqDjhvvuIK62gaMJj0po5KorKjmhbf+S/qYVAI6/eBi46J45rWHKS4o5d3XvTMd+8puKrPvsWXjdm664h5KisrQG/Tcft+1LDp2gYd6UmcSkmJZ8vDNbNuyg4b6RsIiQnzWW7d6E8seWY5Wq+Gmu6/iuJMWug13X4Fj1VW12Gx2dHqvt2QGG8mHWo5QuKQwZWRkRgTzDpvFi28/Rl5OASaziTHj0qipruPiM66nsqIas5+Jex+9hfmHz3ZLIQPYbQ6vY9XXNWBra+tUx05Npbcd0jn2Smbg6U/jfpkQ4h7gB8C91CtJ0r/dN5Hpbw6efyBvLPeUzDrj3BNY/vRbHlr2BqOep199mANmTvJ5nKjoCKKiI7BaW/i5i3/eSWcc0+/9lhle1NXWc/dND1NS5FqlsVqs3HXTw6SmJzFm/Khu2yUkx7n99qsqqolPjCG/k1xbfGIMRfklgEvt4YE7niB9TDITp4wDYPqsKbyw9HWPuI7F55/cqy1jmYHHl1qOEALJ6X3Tl5GRGZ5otVpmHDTVnam2vLSSC8+4jqqKGsAlZ3nL1ffx0beveCQRTE1PRKVWYbfZ3WVnnncSoeG7FnKMJgNHn3g4Sx9+0eOcYyd0f9+Q6X/607gfT3uKXHa55Ujtr2UGiQntAYnPPfEqlmYr5192BmMnpvPwkqfddY4/9UiCQwJ5+Zm3WLdqI4cfOY+k1HiyMnP5/utf2Lopk0XHHMKsOQcwdfpEHnnmbpYvexOH08klV5/DjFmTh/AKZQaDqooasnbkepUXF5Tu1rhfv2YT//v6V/JyCjlk4cE88vTdvPPaJ6z6cx0zDppCUmoCzz7+ikebooJSt3E/fmI6z7z6EM8+8Rr1dQ2ce/FpHHLEwb5OJTMEuHzuu7rlyD73MjIjmYryKrdh34HT4aS6qoZffviDdas3sWDhwcyeN4MX336MZx9/jZKiUk4561iOPekID9fKxoYmnE4H1952CZ+8+zUms5HFF55MRXnVYF/Wfk1/GvcnAEmSJMnZZoYQnU7L/MMO4oCZk3A4HPgH+FFbXUva6CQ2rtvK2AnptLW28cpz7wCw8o+1fPXJ/1i6/H4uP+dm9w/wr99WceGVi7nqxgtYdMwCZs+dgSRJPpNiyOx7+Af4ER4RSnkXF6yQ8OBuWsDWzZlcf+ld7u3Xv39fw4VXnMU9D91EU7s+8nkn74r76CA0bNeqj0ar4eBDDmTK9AnY7HYCAvz76Ypk+gXJl1qO7HMvIzOSCQzy95JCPuWsY3ngrqXkZuUD8PeK1Rx3yiLuuP96nnvjEVqtrT79//UGPWY/M88+/ioHzZuO1dLCQ3cv46Gldw7W5cjQv8b9RiAAqOjHY8q0s/HfrRTkFRMaHoTJZKSupp7g0CBCzH7YG1swBJvxCw9y+8N2ZA0tL6skN6uA8y89g79WrCYgyJ9Xnn3H49iF+cXszMzxerJ+86UPOPHUIzEY9WRn5SM5JZJS4jy24GT2TULDg3lg6e2sWbkBp9OJRqMmMDgAo9HA/77+FZ1OS9roZCKjw91tdmzLJjktkdMPnIzdbsfpcPL1pz9w6BFzqKmpIzwilPseu5VLF9+M1eJSzz3zvBMZNSbZ6/zGHtKgywwNvgJqhZB17mVkhoKmpmZyduTR2NhMbHw0cQnRtDRaaCitwelw4hcRiCHQ94JcYV4xBfnFmM1GklITeGjpnWRs2YHNbketVhMbF8UHb33u0ebLj7/n3ItPJWVUEgaD7yAom83GFx99R11tPd989qO7PDMji5RRieTlFOIf4EdSSjxGk6HfPgsZT/rTuA8Htgsh1uDpcy9LYfaRFT//zW3X/Aej0cDp55zAc0tfw26zo1AouOba8wivA2tVA7MuPpKoibsMpewduVx3yV3k5xYCMHHqOK668QIv4x5AcvrWrm9sbOamK5e4U1Onpifx+PP3kpAkp4je12lqaOaNF993qyWdf9kZrPx9DT9//wfg8o+/7d5r3Dr2fgEmQsODee6JVwGX7+XVN19EYUEJt1x1L0qlktv/cx1X3HA+DfWNqNVqTCaDnBhtJCFJ3t+XvHIvIzPo1NXW88xjr/Dh218ALinLp19+kIaVWVRsd93zjcF+zL7yWPyjPBfkNq7byhXn7ZLMPvnMY5l76EyWP/MWdpsdIQT3PnKLz/P2mOZGknzmwnHYHVx85g1uCc4zzz+Jy689D/9AWT1nIOhzEqtO3IPLNedB4PFOfzJ9ICc7n8fvf47mJgtHn3g4Lz/3tjuYxel08tSy1wmYnow+yMzqN3+kudqlNiJJEp9/9B011bUsPHo+C444mMytO6muquWIYz3DIKJiIohLiCY0zNPl4uwLT2H7tp1uwx5g5/Yc/vf1bwN70TJ7hcPhoLa6jtbW3nvG1dU1UFpU7lWeuzOfh+5Z5iGD+toL7zF6XJr79eq//2XDmi3u10qFkm8//8n9urnJwodvfUFudoG7f4/c+zSNDU289PRbPPfEqzx63zNs35q1R9cpM3Q4nQ7vgFrZ515GZtDJ2LLDbdiDy9f9kXufRtLsUrdprm4ge8VmnE4nbZYWbNZWGusbeWjJMg/J7I/f/ZKd23OJT4jh2JMWMn7SaLZuySQhKcbjnAsWHozRuHvZMrVGw/GnLvIoU6ldeVEqK6rdZe++9gnbM+S5f6Doz5X7AqBUkqQWACGEHtdqfo8IIfKARsAB2CVJmtaP/RqR1FTV8sM3vxEaHkxejuspXKlSeqSfBpeBvyUrm4qWSuYeMInWJivGYD9aW9tosbRy1vkn8f3Xv6LRqLnsuvPI2pFLRGQYF1x+Jls2ZhCfGEtoeAjVVTU8tfwBvv/yZzIzczj08IOZPX8mD93rrW666q91XHrNOYPyOcj0jvzcQj586wt+/G4F4yeN5qIrF3sY4l2x2+2s/GMtLz/zNhXllRx53GEcedyhbmWE2po6yku9JU+7PjjkZOW5/9/hV+/5fj52m839uq21zWtVp7JCDrQaMTglLylMhEByyGo5MjKDia8A1YytO1Gd7enSWLGziNLNeWz69A+UGhUJR08jY/MOr7ZqtZpRY1NYvXI9aenJxMZHM+eQA/nnj7VkZmQxbeZkYuKiqKtrICo2stt+WS1W1qzcwHW3XcrafzZgNBkYP3kMG9ZuJjDI3+O+UikH2Q4Y/bly/xGeyasc7WW9Zb4kSZNkw97FD9/+xoN3LyVrRy7jJqYDYLW0EBjkGWCo0Wqw2xx89MHXvPHZ1wid63lNp9OSnJbAC8veIC+7gB0Z2Sx9+EXSRiWx4qe/+eCtz2lrs/H7zyt5/snXCA4MJPP1XxjVque0STNQrS+h5I8tzFlwoFffFsjqJcOKpqZmHrx7GW+98hFlJRX8+O0KLl18E0UFJd22Wb9mM9defAfr126muLCMl555i4/e/RK73bUrFBYeQmJKvFc7nU7r8Tq90wNEeJh3LMb4SaPZmblLdcdoMnjIqAHE7OZGITO8kJwOHz73CtnnXkZmkAkODvQqmzZzEqLFc36NHBvP+g9/o7G8lrrCSgp+3sTMdgnMzqjUKr79/CfKSir4/ZeVvP7ie7RYW/j+q19oa7Px1ssf8vG7X3okOfSFyWwkKiaCp//7MnW19WRl5vLYf54lPDLMS5EnWp77B4z+NO5VnZVy2v/vO9uNTLcU5BXx/Ve/0NjQxMVXn83br3zEJdecQ2x8NF989B0XX3U2Qe0R6mY/E1dcfz5ffPwdJ55+FAfMmsJvv/3Dti07aGlp5dsvfvQ6/uqV63lw2Z2YTEY2rN1CQ0MT9z9xO4EaLfZWG5aaRqpzSrG32sj9axvTp0/kyOMWuNsftmgu8w+bPVgfh0wvKC4oY+XvazzK6mrr3e4wvsjaketlZH/2wbcU5Lk06WMSorn9vmvdAbN6vY47/nM9OTvzAFAoFJx+7glMnjbO3T7UYOL6Wy5xJ7mKS4jmiuvOZ9O/WwGXAs/9T9zO2n82AKDVavi//1xH2uiUvb94mcHFKbmM+c7IGWplZAYdm83BORefilqjBlxJBA85fDbmhDBof/4OHx2Hzs+IpXpXcsCancVcevli9+KNWqPm6psv5qfvVngcv6qihuqqWk49+zgOOHAy5116Om2tbdTXN+62XwqFgpPOOJop0yewZeN2crMLOOv8k5g+azIxcS5jXqPVcNuSaxglz/0DRn+65VQKIY6VJOlLACHEcUBv91wk4AchhAS8KEnS8s5vCiEuAS4BiIvbdwM5d27P5uKzbqSmypXdLSDQn/MvO5Pbr3uA6267lJDQIELCgnjnyxfI2ZnHmpUbeOuVj5h36EFkbtvJp+9/A4BSqeTVD5cR6OPJPiDQn9FjU3n3yxcpKy3HP8CP2PhoyrbkedVVatWYNToWjprAYQ9Od5XVt6CXlF5191eGw9jUaFVeiUUAdLrun621PrLM+vmb0Gh2ldfU1jN73gwCgvxxOpzszMwhLT2ZmGuiAcjemecRiO1QuB4azr34VIRCQVV5Nc21DTz15D2U5pWgEyoilAaWLn+A8rIKTCYjcYkxHhrJMv3HQIxNyYcUphCyz73MnjEc5s2Rjq2tjd9/+YfzLjkNoVBQXlrJ68s/4J3Pnyf+zsU4HU6MQWZWv/4/j3Zak4GqujomTh7DYUfORZIkwiKC2bB2i9c5hBA8+/ir7tcXX7UYfXs28d0RnxjL0pceoDCvGLVGRVxCDFqthjc+eYaSojKMJiNxCdEe2W9l+pf+vKteBtwuhCgQQhQAt9L+4+0FB0mSNAVYBFwphJjT+U1JkpZLkjRNkqRpoaGh/djl4cX/vvnNbdiDa/U1JyufgEB/nnnsFeISY5gweSyhQUGkJMaTm1XAQXOnM2vOAYSEBrmNJIfDwT03P8yJpx+FSrXrx2Mw6hk9NhVwSR2OnzSGuIQYhBD4x4YSEOv52Y47ZiYtDc04Gq1U/7Gd6j+2U7Epj/xVGYPwaYwMhsPYjImL5qIrF3uUTZ81heS0pG7bpKYmEhUT4VF22dXnEtr+QFhaXM4Dtz/BR+98yUtPv8Urz73Dh29/gdHPiMPhoLnZwqZ/t7Ju9UZ3++LKKn77ZSV1tQ1IkkRRYQn/feRFGouqqF+ZRfnf29n0yZ9oHBLxkZGEhwTLhv0AMhBj02cSKyFcRr+MTC8ZDvPmSKS1yUpjRR1t1lbiIsJx2B289MzbLH/qTdfO/sWnY9RoCYgOISguDK1Jz6jDp3nEycQsmMDSR5ZTWFCCJEk01DXyxUffc/q5J3ica/a8Gaz+e71H2duvfNzr37rZbGTM+DRSRyW5F5OCggMZN3E0iclxsmE/wPTbyr0kSdnATCGECRCSJO1+78azbUn7vxVCiM+A6cDv/dW3kcLO7TleZWUl5dx05xXEJ8aQnJZITUE5/773K81V9Zx4yiIef/gFvvz4eyZMHsMNd1zO0odfxG6zU1RYRnZmLkseuYX8vCJsbTb8/Mys+msdhx01z+s8hgATsy49mqqsEpqr6jGFBVC4bgcbP/mD6EkphKREs+OnfwGoK/QOtJQZOtRqFWeedxLjJ6azZeN2EpPjmDh1nNt9yxcmG9x77w3syM2jqqqW8ePT0ZQ3Y2+1oTXqsTRbaeiy/XrGeSeyZUMGX3/6A3qDntPPOR5b267dApvDwUVXLuadVz+moryKAw+eximLj8XRyRYce+yBbPrsL0o356IPMDH1jPlEjEtAIU/0IwPJCQpvtRzZ515GZmCp3FnM2nd+orGsluCkSEYvOoBbLjuPwtpqqmtqSUtOQOTXYbe2erQLSYnikJtPpXJnMUqNCmeIkWNPWsimDdt4+Zm3CQ4N5MzzTiJlVBIzD5rK1s2ZJKcmEBjkz0VnXO9xLKu1BaulZTAvW2Yv6fOymRBisejkhClJUlNnw14IkSyE6NZJWwhhFEKYO/4PHA547w/tByzqIlEJcOzJizhk4cEkpyVirW9m5fJvqMktw39yIrdedz8FecUAbFq/jU/f/5ojjnYdY+6CA/nxu9+588aHcDolfvzmN57670scMGNSt+c3hfiTMHM0YWPjWfXq95RszEFyShT9uxObpRVTqCuYN+HA0f1/8TJ9IiDQj4MPOZDLrz+fI45d4JFcyhfmsEDyP16JcWs1aRYtNV9vQK/RoPNzKS2ER4UybcZEd/2IqDCcDieff/gddrvDJWf5zNsEBO3SKDabjSx7ZLlbxWHlH2vZsHYLakmg8zMQnh5HRWYhpZtdAbbWuib+euFr6opkxYSRQrcr97JxLyMzYDRW1PLHs1/QWOba2a/OKWXDhyswOATGrFpS7QYaf9+BOcgPY6inbrxCoSA4MZL0w6eROm8SoVGh7NiezZ+/rkKSJKoqanj6vy+jUAjmHjqLK64/n4VHzyc0PMTLBadr4kKZ4Ut/7IkHA+uFEK8KIa4UQpwqhDhHCHGfEGIF8CjgLaS9i3DgTyHERmA18I0kSd/3Q79GHDNmTeXaWy9Bb9Cj1+u48oYLOGjuAe73LdUNNFe5AmNqLU0eGuQAOTvziY6NYN6hs0hJS2Lrpu0A/P7T30ycOo4bbr2UqTMndXv+psp68lZuo2jtTsYfN4vw0bt8IUu35BI+Jp7RR7p873f+toH6YtkoG6kExoZx4CVHodKqsVQ1ED8jnfSFB6Bsd+MymYzccf/1HHzITAAWHDGHP39b5XWcjM07yPsng4zv11BWXI6zi5H314rVmBLCiByfSMzUFPT+njJtkiRRV1RJxvdr2PHLeuqK5F2hYU13PveyW46MzF5hb7VRkVnIlq9Xkv3HJhrKar3qNFXWY2/xlCFurm4kdmoaKfMnEZYWy5QzD2HMouk0Vzaw45f1ZHy/hqqcUpwOz99mZWkVv/7wl0eZJEkUFZR6lCUmx/HsG4+4A2+nz5rMg0vvICDQU7FPZnjSZ7ccSZKWCSGeAQ4BDgImAFYgAzhbkqTuJTtc7XOAiburs78QGBzABZefyaLjDgVJIjI63GOVTK3XolApcdodGHTeQS16g56p0yfyz1/rePGpN9zlSanxnLf4JEr/2oaii0xWB5baRv5+8WsP42rU4VNprKjDUt2AOTyQhAPHsOqV72iqrAdAY9Qx/4aT8Y/2lkCUGd4o1Spip6QSkhyFo82GPtCEUuU5HSSnJfLYs0uorKhBr9eSuzPfnV2wg8iIMP59/1fsLW3oD/T28Q+PDKU6s5CK1Vnk/rWV6MnJhI2KpSKz0F3HWtfE1q/+AUCl0zD/hpMJjAsbgKuW6SuSU/Iy7lEI2S1HRmYvKdmcyz8vf+t+rQ8yMe+6kzGHBbjLlGpvUy3t0Mn8+94v7vsxwNSzFrD9+zXuZJZCIZhz7YmEj4p11zGa9ETFRFCYX+xxPD8/k9c5ps2YxBsfPU1DQxMhoYEYjIa9vk6ZwaVfotkkSXJIkvSjJElLJEm6VJKk6yRJerEnw17GGyEEUdHhRMVEeG1/m8ICmHCCy8NJlDdx3AmHe7x//c0XY1ZrqK7cpSVrNBk46pCD2fTqD1RmFlGyyeXXb6ltpCqnlKbKOpoq66jKKfVaNc1esYnYKako1UrGHnMg6z9c4TGRtDW3UJnlOUHIjCz0/kZMoQFehr37fYOeuIRoAgL8Of/i0zy2aROT4xg3Js2dj9xolZh18K40FQqFgquvOo/aTbumgeL12YSmRrtfh6XH0lhe535tb2mjbGteP12dTH/jcsvp4nMvq+XIyOwVLY0WNn36h0eZtaaJ2oJyLDWue3RjeS2S5CRl/kTSD5/G6EXTSVswGXNYoMf9GGDLlyuJHJ/ofi05JTJ/WIvDvivJXEx8NNfeeolHQOukqeNIbxfb6EpAkD9xCdGyYT/C6E8pTJkBRqFUkDR7LEEJ4TRV1ZPuN52jTlpIWWEZoUGBNKzLZdva37jz2kupFzacSJjaBDV/7cpG19popaagnL+e+xKAtAVT2PbtalLnT/I6n6PNTvjoOOJnjsYQaKKtyepVx2Zp9SqT2feQHA5aNxbx/IsPUlhcilarITIwiJa8ChQqJbTakBpauOrCszjq8Hk0WSxEhYYQHR7K+r88U4wbQ/wYvWg6Wj891tomMn9Y5/F+a7McsDVs8eGWgxAgSUiS5O2PLyMj0y1OhxObtc2rvK25lZ8efo+WBgsqrZoDzjkMU2gAW7742yV6YNYz+bR5qPVabJ0CaG3WVlTtuvcdtDZZkRxO6KScN/fQA3nxrcfIzSnAbDaRPiaFpPbs5DL7BrJxP8JQaTWEJEcRkhwFQBwJlG7J5Y9nvnDXKfppI2HpsUw48WB+fvg9Dy3yqAlJrHzpG6x1zYxedABbvlyJo10fXaVVY2+1uevGzxxNaFq0e1V31IIprHvvl12dERCaFjOQlyszCPTGKFPpNISkRrHlPdcqUyvQIGDC8bMxBJoxhQYQNSGRzR+4RK6UQDml2BLCiRyfRMnGbADMEYFU55RSX1JNm6WVmCneq0VRnVaeZIYXkiR5yOqBa7exw8D3MvxlZGS6Re9vJG3BZLZ+/Y+7TKFU4Gj7f/bOO0yuqvzjn3Onz2zvvSabnpBOCiH03puiYEHsKMUKYkFEREGwIlYsPxVEEBBEUToEUgjpbXvvbXo7vz/uZrKzs5tsktlsO5/n2Sc7Z+4999zNufe+9z3v+30DePvcgB6THw6F2fbEa5H4eV+/h3f/+gqla+ZFVOwAyk6ZT9P2KpLzMzCYjXTXtlJx+mKMlmiD32KxsGLNElasWXICzlIxHijj/jgIhUJs27KLx//vaZx9Tq78wMUsW3kSdoftiPv2NHZQ+/ZuumpaKV45m9x5JZgdVjqrmjnw6jZkKEzxyjm07KpBhiSla+eTXhodqtNZ3UL95n2Y7ZaY/tv3NdBV3cKKD59D03tVODt6qDh9MV6XB1f7wWp1ImLYH3h5K/MvXk3zjmqc7T0Ur5xDyaq5UeEa+UtmgCbY9+IWLAlW5l5wMqnFKnN+IuDq6qN5ezX1m/eRObOAomWzSMpNO+w+u7bv4x+PP091ZR2XXn0eq05ZNmJpcX2FRrDw8rVUv7ETk93CrDOXIDSBIyOZkD+A0Ro7D7tqWln+oUX0NLSTM7eYktVz6axqpq+lm4yyXLJnF+FIT2LvvzdhtJiYd/FqhEHjnUf/ja/fTdkpC8iqKMBki+1bMQ6EwzC0Qi2HQnOEqlugUIwaIQSla+djtJiofHUbjvRkKs5awqY/vBi1XV9zV0xirK/fTWZFAT0N7bg6+ihaPoucucXkzCmmZsMugt4Ayz90NkllObz20gYe/+M/cCQ4uOqDF7NoyTylMz/FiZtxL4SwAFcAJYP7lVLeFa9jTDR2btvLDe/7PMGBeLaXX3yTB3/5HU4/e0TlT0DPfH/1ob9H3szb9zUw++yl5C2ewcsPPqHX6wUat1ay6IpTeO/vr1H7zh5O/+LVpA0Y033NnWz49fO4OnqZf/GqmGOkFGTSuruWxq2VrP7EBUghePtXz1O2Zh7WJDvePjdCEwhNfyj73T62Pv4KWbMKWfuZS0jKSYvx5loT7ZSfsoDCpTMRBgOmId4AxfgQ9AfZ+fQGajbsAqB9XyN17+xh/a1XYk9NHHafyn3VfOz9N+PsdwGw4fVNfPHrn+W6G64adnuj1YzRbGTXP98me04x4VAIGZZs+PXzkZWhwmUVMfsl5aaRPbeYvAWlGC1mdj//Druee3tgnA00bq3k9C9fTf6iaxAGQV9zFy/94HHCA9dU844aVt14PoVLY/tWnFiklCN/qSk5TIXiWLCnJDDrrKWUrp6HZjLg6XVF7n8H0YwaQoioa9BkNdNV3QJSkl6aQ81bO0nOT+ft37wQuRbb9jWQcu58bv3MNyP7/euZ//G7x3/MoqXzTsj5KcaHeHru/wH0ApvRV+2nPK+9tCFi2B/kdw//mdXrlmEdRs3mIL1NHRHDHqBgyUyMVjPOlm5mn7WMA6+8FwmPadtbT2pRNt21rbTva4gY9z2Nnbg69GSa7ro2CpdWUL9Zj6032y0UnzyH7U++zszTT8LZ0YfRbKR4xWxqN+1l7nkr2fGPN6nbuJdFV5xC0OcnFAhhS3FgT0/C1d6LQJCYkzpsuIbZfuTy04oTh6u9h5q3d0W1efvcONt76W3sxGgxkpSbjiXh0IrSnl0HIob9QR750e85dd1KjN4Q9tQEknLTIsWlwoEg1W/sxO/2Ub95H/bURKzJjqiQr3BYX206WMHYZDVTvm4Bnp5+fL1uzA4rTdsqo47pc3rore+IhOe07amPebDt/tdGcuaVYLKaj/MvpTguwnq8/XD3BCE0CIeG2UmhUByJ/rYe+tu6MVnNmO0W5l+8Cq/TQzgQwmAyYEmys/CKtWx74nWklGhGA4uuOpUd/3gjYktYkx207a2PeslOLc/hD7/7e9SxQqEQr/7vTWXcT3HiadwXSCnPjWN/Ex5tmIecZtCA0cedlq6eh6uzlx1PvwWAJcHG/ItXsfXxgQK9B2NZD/5OzK80bq0ka3Yh8y46mcSsVLrr29j59FvMOX8lVa/vwD0gi5VSkEnZ6vns/c9mZp21hOSCTDw9TnY88xZIfYlw7gUrqdmwC2+vi7WfviRK614xQYlJcIT5F6/mzV88i38gOTV/URlL3n86tpSEgV2GmbuaoObNnbS8tRehCVZ+5BwKl806tO2gWGspZYwR7u1x4e7qY95FJxMOhpHhMHv+vZlFl5/Chl8/jxCCOeevIOgP4mzrGXb8Q+O5Rxqr4sQj5WHCbjTt8J59hUIxLB1Vzbz246ciibGFyyrIX1TGu399ORKKM+vspSTlpzP3gpWEQyGEwYDQRJSTULcThtwrR0iDUffUqU88AyTfFEIsiGN/E561p52McYj+7Ec+8X6sw8QeDyY5PwNbigMhBPa0RNr2NkS+8zk9NG2v1hNVBWRVFNBd34bBZCBrkIRgcn4Gidmpkc9te+rpa+kmKS+dqle3U7RyNkaLidCgBNmehnaMFhOZM/M58Mo2rEl23vvbq5EwICklu/+1kaLlswgFQmz8w3/w9kV7dxUTD0dmMmVr5kc+Z80qpPG9yohhD9D4XhVdNS2Rz7PnziApOTpk5/rrr6Bnp64/L8OSTX/8b0RqzWSzMPe8FZFtPT1OknLSMFrNFCydSfHK2QhN0NfSzc5nNrD7+XfY88ImCpfMpK9Vl2aVUrLnhU0UDQrfsSbZo+okZM0q1NV3BjHnvBXKaz8BkOFhlHIGEEIgledeoTgqAh4f7z3xWpTiTf2mfbg69NoypWvmkVlRwN5/b8bT0c/OZzew+/mN7Hp2AwazEbPj0Cq6t89N9qyCAQejTndlM9d9NDrU0mgysu6M1WN/copx5bg990KI7ejmoRH4iBCiCj0sRwBSSrnweI8xUZm3cBa/fexHPPv3f9Pf7+TiK89lybIjv98kZCSz7nOX07StCr87Vvavt7GTeReupOKMxbTtaWDmaSdRtGJ2VPJqUk4aKz6iJ8t21baSO6+Y7LnFOFKTWPKBM9j9/Du07KyhdM08+lu7adyqh0P0NLYjNAMrPnQ2oUAoKqwCiPLGurv68bu8WJOiq4oqJhZGk5G5F6wkvTSXxq0HKD55Dpv/738x2zk7+iK/l80s4Vd/+SEvPPMS1ZV1nHP+egzV3fT0HaqOGPQF8Dk9kWIqOfNLOOWzl1Dz1m6syXYy5xSyJNHGnhc2EQoESSnMYvE162nbW4+7q5/00hx6GjtIyjn0EhoOhkjKSydvURkpBZkULpkZVawltSiL0267irp39uDtc1Oyak6ULr5iHJEyRuM+gtBUISuF4igJeHz01LVGNwq9pk1SXgbN26tJykvnpKvWERhSoXbLn//HqhvPp+m9SpztfeSfVEZCbjrrb7uK2rd3E3D7KFk1l8TCDH7xx/v5x9+eJyHBwYWXn838RbNP4FkqxoN4hOVcGIc+JiWaprFoyTwWLTn62LXkvHSS89Jp3lETo/Odv6iMsrXz0QwG8heVj9hHekkO6SU5UW2te+t5+9fPRz7veWETc89fQeueeoJeP8m56ez592Ya393PabddFSN/abJbIgZ+anEW1mRl2E8G7KmJlK6ZR+maeYSCIZp31lLz5s6obZLz0qM+z547k9lz9Vj3vuYu/v3in6K+tyTasaUc+v83Wczkzi8ld74uVdnw7gHe+d2/I9+/97dXmXv+Str21WOymNn9r42kFmZFvTCarGbSirMpWjZr2PMQQpBemkN6ac6w3yvGj8N67lVCrUJx1JgT7eTML6Hx3UO5SHkLy9j/ynt07NMLRHr73PTUt7P02tOj9tU0DWuyg8XXnBbTb0ZZbtTnVacsY9WgAoOKqc9xG/dSyloAIcQfpJTXDf5OCPEH4Lphd1QAkFaaw7wLT2b38+8gDBoLLl2D2W6leVcNJrOZvpYuDCYjqUVZpBRkEvD46K5vx93ZhzUlgdTCzKhEyZbt1THHaNpeTVZFAUaLCVdnf8TYcrb3surGC3jndy/gc3qwJtmZfc5ydj33NglZKSz9wJkqeXYSYjAamH3WUvpbuuisakYzaMw9f2UkGXs4ErNTWf3xC3jn0X/rqzXJDlZ9/AI83U7a9zZgSbSRUpiFbdDLXvMwc615Zw1zz1uBs02XU00tzubNR54F9JeFlR85h4TMlLifs+IEcBjjHlWlVqE4aowmIwsuXk3WrEJ8fW6EwUBqYSavDxSZPIjf5SUUCGK2W/C7fdhSHCz7wJmYrGYat1URcPtIzEkltTAzIoKgmN7EM6E2yn0thDAAS+PY/5TE4rAy57zlFC6dic/p5Y2HnyHg8bPqxvN59RdPRQxxR0YSJ3/sfNr3NrDtydcj+89Yv4gFl66JxCRbkmJLRFuT7BQsmUnlK9vorG6OtGtGjdz5JZx5+7X4+t1YEm2EQ2EyZuRhT0vEmqjKTU9WknLTOOWzl+Dq6MNgNpKQmRIVizkUoQnyFpZx1u3X4uv3YE1x0LanLsozn794BkuvPT0yL4Zb1bEm2al8dTudVc0gYMWHz+HMr74PX5/+8jiSNKdi4nO4hFo95l4Z9wrF0eLu7mfrY69EQmSXvP80NKMhRrDAZLNw6q1X4uv3YE9NwGgxseHXz9NxoAnQr8E1n7qIvIVlJ/wcFBOP406oFUJ8VQjRDywUQvQN/PQDbejymIojoBkMJOWm07KzBr/Ly4zTF7H/pa2kFGQy57zlVJy5BBmSdBxowuv0RCXRHHj5PfpauiKfc+YVRxW1EprGnHOXY7Saogx7R3pSxJPrSEskrTgbR1oSiZkppBVnK8N+CmC2W0ktyiIpJ+2whv1gHOlJpJVkI0Nh3n3slajvGt89gHNAss3V2Ud6WW5UcSnNoFGweMahh5KE7U++TigQIq04Wxn2kxwZPkwFWk2AVMa9QjEUV2cv/W3dhILBmO98Ti9bH381Kvct6AtSdsoC8hfPYM55KyhdM4/sOUUYLWZSCzLJmVNEUk4a3fXtEcMedMGCLX99GW+/O+Y4iulHPMJyvgt8VwjxXSnlV+MwpmlLb3MnoMdPmyxm+pq72PMvvXJn+akLEULQWdXErLOWUrNhF/0tevKjXj1UJyU/k9O+cBUdlc2E/EHSy3NJK8omFApx2heuorO6BWuCjfSyXBUeoRiRoC8QNa8AZp6+mMrXtlP3zh4MZhOzzl7KoivW4mzvQ4bDmB1W6jbtjfLoe3pdUYpNikmMDI8ooSdUWI5CEYXf7aXmrd3sePpNQoEgpWvmMefcFTjSkyLbhAIB3F39UfuF/H5Si7Poqm6m8d0D2NOTmHfhyficnqjtht6fATzd/YT86n6riK8U5uNCiCVDfsqFEPEM/ZnS5C3Ql9Nad9cR8Ppp2LIfKSUBr589L2zCmmSnp76d7f94g+IVera7NdlO4iA1EoDkvAzKT1lAxRmLSS/JQWgCo8lI5ox8Zp+1VM+gz06NOb5CcRCzw0rGjLzIZ3t6EqFAkNoNu5FhSdDrZ+fTb+Hr97Dvv1s48Mp7bH/qDVIKMumoPORNyl1QhnVAW18xudETakdSyxHIkJLCVCgO0lnVzNbHXyHoCyDDkqrXdkQK/B3EmuSg5OQ5UW0mm4U9/9pIV42uouPu7GPzn/6LNTl6NX24IpPFK2YrEQwFEN+Y+58BS4Bt6DKYC4D3gHQhxCellP8eaceB+PxNQKOUctqp73RUNtG2rwGj2ci8C0/G3d1P09bKmO266tqYfc5yQv4g4VCI+ZeswuKwUfnye2TPKaKvpRtPj5Os2UWkl+Vgsiht8OmCt99NZ2UTHZVNJOWlk1GWh6fHSeueOixJdrJnFcWo5fS1dEVkK7NnF2HPSKSrupWe+jZSCjMpWzsfg9lE6+5aCk4qj8ipDsbn9uJIT8Ld3c/ss5eSUpSF2W4h6PGTu6CU1KIsQl4/qDCvSc/hde6V516hGEz7/saYtpoNu5mxflFEqEIzaMw4/SSC/iC1b+/BmmzHkZEcWZU/SDgYwtPljGpLLcxkzacuYstfX8bT3U/R8lnMOX8lBqPypyria9zXADdIKXcCCCHmAl8Evg38HRjRuAc+D+wGkg6zzZSko6qJ13/2dKTgkC01geXXn427ux9XZ1/Utgajxu7n38GWksCyD57Bzmc30HGgidlnL+Od3/8HT7d+8e95YRMrPnw2JSfPPeHnozjxhIIh9v33Xfb8a2OkLb0sl4SsFGo36J4iS6KN0269iqTcNEAvd/7KQ3+PzBlnew8BT4DW3bWRPgqXzyIhI4m0c5ejmYwk5qTFzMnErFQqblmCDIdxdvTyxk+fpnDpTKxJDtr2NlD95k7K103ZUhfTi8OE5aAJZEgZ9wrFQYbLMUrKTcNgjja7umvb6G3sYNZZS/G7PPQ2dcRIVAOYHdHFMTWDgbyFZaSV5hDyB7AmO5Rhr4gQz7Cc2QcNewAp5S5gsZSy6nA7CSEKgAuAX8VxLBMKd3c/7ZVN9LV0ER7i3eqsaomqJOrpdrL18VcoXqFXmD1IUm4a4WCIcDCEq6MXb587kkxjMBsjRtpBtv39dTy9qrrsdMDV3hNTK6GzqpmEjOTIZ1+/h85BFWq769qi5kxyXkaUYQ9Qv2kv6WW5gMCSYKNoeUXMnLQm2rCnJOBISyI5J42s2YVUv7mL3f/aSFdtC0uuPR3rMApOisnHkTz3qAq1CkUEa7I9KvzVaDWTt7AMv8tHZ00L3XVtuLr62f7kG3TXtbHnhY1Uvb6Dqld3MP/i6AqyhctmgRD0t3bTfqAJV2fvoeMk2nGkJyvDXhFFPGfDXiHEz4G/DHy+BtgnhLAAh8vweBD4EjCilIYQ4uPAxwGKioriMtgTRceBJt74xbP4+t0YTAYWX3MaRStnYzTpf/rhkl+CXj8Gs5GVHz2XgMeHq7MPX5+bvS9uiWwzWCZLShnbhy+glslPABNhboZD4WH/r4dWHx4814bOu+HmEBLc3U52P/8OmtHAvAtPZt7Fqwi4fAiDwNfvoa+5i/yT9M2tSbr2cs/6dvxOL4k5qSTnZxz3+SmOjbjPzcNVqFVFrBRHwUS4b441vY2dZM8pomj5rMj9NeDx8fZvnqdtbwOgy14GfNGVZ93deoLtgktWE/QHMZgMdFY14+t38+YvniXkD2J2WFn1sfPJnjM1/3aK4yeenvsPAweAm4FbgKqBtgAQW0INEEJcCLRJKTcP9/1BpJSPSCmXSSmXZWZmxnHIY4u3z8WG3/4L34A0VSgQYtOfXqSvqTOyTVpJLkKL9oYVLqtgy59f4o2fP4M5wYazo48Dr2yDAfvLaDFhT0+KeEQ1g4bBFF24Yubpi7Elq0TGsWYizE1HRjK5C0qj2iyJdkKBQ9JrQtNIK85BhiUyLLGlJqIZD80Zv8uLPT06Ki6tJIeehnZAf5nc/tQbhPxBdj33Njuf2UDlK9vIrCiI2seaZCdnTjFFy2eRWpiFNoIuumLsiffcDIdDejbVMKiYe8XRMBHum2NN1uxCDrzyHjuf3cCuf75N9Rs78Dm9tO9v1FXsSnJo399Iyaro8FnNaMBgNrD9H2+y+/l32PH0W3TXtSE0jZBfv6f7XV42/Pp5XF19wx1aoYif515K6QHuH/gZinOYNoA1wMVCiPMBK5AkhPijlPKD8RrXeOLtc+MeEqOMBHdXf0RjPmNmLqs/eRH7XtyCr99NyclzCQYC+Pp12Stney9Gs5GZp59Ey85aHBnJ5Mwtxu/0sO6my9j3v3dp2lHD8g+dQ+3bu3G291C2dgGFyypiXhoUUxOT1cxJV51KSkEG9Zv3k1GWS/mpi+htaCcpNw1bSiLzLlxJwOvjjV88gwyHKV09j8XXrKd+8z48PU6MZr1SYtu+etr3N5I7vwST1cKu59+OOpbZbiU5Lx1zgo25568grWTkqreKKUb4MJ57VcRKoYgirSSHdZ+7jN3Pb8Tv8rLgstXUb9zHgkvX0LKrFs1moGjZLJq2VzLrrKU076jGmuQgb2EZttREZp52Es07a0gpyKR83ULefOSZqP59Tg/eXheOtGmXqqgYBXEz7oUQa4BvAsWD+5VSjlgubUAX/6sD+68HvjBVDHsAS4INa7ID75DYd9sgacC+5i7e+uVzZJTlkpiTxp4XNjJj/SJMdgsBtw9rgpWq/Y34XV4yZugKKFsff4X1t15BSmEmyz54BkFfAJPNQt6iMsKBUFQRK8X0IDErhfkXr2bWWUsxWkxoBgPppTkULqtAMxrorG7mlYf+Hln9ad5ew8LL1yJDYZLzMqh+axdJOams+fQlICV+l5eXf/hEZPuDJGQkcfoXr0YzGGISwxRTGxkOIUYobS80DaSKuVcoDmIwGsiZU0xGeR4yFMZks+DtdbPpDy9GbRfyBehrriazIl8vavW3VzjlM5ey8MpTmHnGYiyJVlztfQQ90aGUJpsFi1IhU4xAPNfMfw08AKwFlg/6mbbYUhJY+eFzIkmIQggWXr42SpKws6qFgpPKyazIJzk3nbJTFtL4XhV5C0pJLc4mtSibZdeeQTgQpGHzfjorm5l9znJSCvSlTM1gwGy3IoSuZa8M++mLEAKz3Yo2yAAz2SwYTEZq3t5N+bqFzLvwZOZesJKZp59E+4FGQsEQDVv2A7DoinWYbRbMdisJmSksft96jNYBOVUBs89ZRkpRlt6nMuynH1KOrJajwnIUihi8fW46q5rpONCEs72HhncPRH3furOW8lMXghA0bDlA+74Gyk9ZSGpxFgaDgYSMZEwWC4nZqSx+/2mR1XiDycCKD58dJZqgUAwmnk/oXinl88e6s5TyZeDluI1mgpA1u5Cz7rgWV0cflkQbiTlpkWRaAFuKA3d3P3Ub9wJgtltYcOlaUooycaTpcfWJ2amcefv7cbX3YXJYSMpOi1ItUSiORNaMAnb/ayP9rbp+sj09aSCsJgdfv5uEzJSoyokA+QvLWX/LFTjbe7Am2kkuysBis43H8BUTgMMVsRIqoVahiMLV2cvbv30hompnSbSz8LI1tOyoiWwjpaSnvp0zv/I+PQTXaiIpJw2TNbpGjcFkpHT1PDLK8/D2urCnJZKYpQpRKkYmnsb9S0KI76Nr2kfqIkspt4y8y9RHCEFiVuqIF2LQF4hc/AB+t4+GrQfIW1QaJSGYkJFCQkbKWA9XMUVxdfdHDHvQqx72t3RRtmb+YfdLK86O5IeMhM/lRYbDWNUS8ZRGhkfWudelMIdRXFIopilt+xqjnu2+fjctu2pJLc6mu1avPis0jbxF5TjSk2KcK6FgCL/Tg8lmxmgxYzAaSMnPAKVAphgF8TTuVw78u2xQmwROj+Mxphzenlgt+p76dva+uIWknDQKFs+IVLNTKI6V7rq2mLbOqhZkWB5z4nXQ56dpRw07/vEmoUCQ2ecso3BphTLypypyZJ17JYWpUETT39wZ09Zd28qKj55L9Rs7MZqMFC6vIL0kJ2a7vpYu9v5nM41bK0ktzmLBxatJG2Y7hWIk4qmWM6zcpeLwDKcDnjWrgNadtez7zxZMNguFS2aOw8gUU4n8hWU0ba2MajteRaWOymY2/PK5yOd3//IyRrOZ0tWqMvJURIbDMKK0qQAkUoZHVtRRKKYRaWV5QLTKd8ES3ZjPKM0dcT+/x8fmP/2X9v2NALTuqqOrppUzv/J+ErNSxnDEiqlE3O7CQohsIcSvhRDPD3yeK4S4IV79TwZ6GjuofXs3dZv2RoVAHI700hwWXLI6ojmeMSOPpJw0/G4v8y9ZjbOth/rN+3B29IzhyBUTHWdnLw1b9lPz1i66altjKh0fiew5xZSvW6iHVQgoOXkO+YvKo7bx9Xto2VVL9Rs7ad1bj9/jG6E3naZtscWnD7yyNUpfXzF1OHxYjgBNJdUqFAfJLM9j9jnL0Ay6mZU7v4SS1XNHTkofwN3RFzHsDxJw+0ZtUygUEN+wnN8BvwXuGPi8D/gruorOlKezpoVXfvgEQZ8uV2VJtLP+lstJzjt8fJzZYWXWOcsoWDKDzupWGt7dz67n3mbRFevY9uTrkUq0jvQkTvncZSRlqySa6YazvZfXfvoP+lu6AD1Oc91Nlx5VdUJ7agInXb2OGesXARJHRgrGQYo3fo+fHc+8ReWr2yJt8y9Zzeyzl0ap7wzGluyIPU5akqqvMFWRcsSEWhiIuw+FYfjpolBMK5wdvXTVtjLr7GUIIeiub8PV0XvEZ7jBZEAzGqKq0ANKRENxVMRz/TRDSvkYEAaQUgaBaSF8HA6HOfDS1ohhD3ryzHCezeHQNI3E7DSSctNo21NP1qxCGt7dH3Vxuzr76BjyNq+YHnTVtEQMe9A9qNuefOOInvWhGIxGkvPSSc7LiDLsAfpbOqMMe4Cdz2ygv7VnxP5yF5RGSa9qRgOzzlgy4suAYnJzOM896C+dynOvUOi076unbU89u59/h13PvU3z9mr2/mfzEe/bjqwU5l14clRb7sLSKAltheJIxNNz7xJCpDNQ9kYIcTLQG8f+JywyJIddMnO2H93ppxVnc/oXr8Hd1cu7j70S872nZ6RCv4qpjK/fHdPm7u7TS5Hb4lPXIODxx7TJcJigL7b9ICkFmZz2havpqmkhHAiRVpJNSlFWXMajmIDIMBxuVUbTkOFp4c9RKI6IexixDE+3k6AvgPkw921N0yhft4DUoix6mzpxpCeRVpKDJUHJECtGTzyN+1uBp4FyIcQbQCZwZRz7n7AYTAbK1i6gq6YVW4qDcEji63fHxDSPhpSCDFIKMuht6mL7U29EfZc5Mz9eQ1ZMIoYzmMvWzI+SSj1eErJSMDus+F3eSFtiTiqOIxRJ0VcClEdpOqB77g8XlqMUcxSKg2TNzOfAS1uxJNjQTAY83U6Kls/CPqhC/UiY7VZy5haTM7f4BIxUMRWJp1rOFiHEqcAsdOmEvVLKwBF2m/R017XSvKMGR0YSJ99wHq176zAYjWTPKSLjOIzx4pWzCXj9HHhpKyabhYWXr1VSWNOU1OJsVn38At7726v4+j2Ur1tI2SkLDhsiEfQF6KxupnlHDdZkBzlziwkFQrTsqEaGw+TMLyWtJBttQP0kISOZUz57KVv/9ipd1S1kzylk4WVrlaylAtCL7egx98pzr1CMhsyKfFZ/8iLa9tYT9PrJmlVIarFa2VScGI7buBdCXD7CVxVCCKSUfz/eY0xUuuva+N8PHicUCOoJsE+8pj8Egeo3drD+tquG1bAdDfbURBZcvJoZ6xaiGTWsSbHJi4rpgdFkpHDJTDJn5hMOBLGmJESM8pFo3lnNW48ckqnc86+NzDztJHY+uwGA3f/ayPpbryRzxqEX0PTSHNZ99hL8bh+WBCtGizmmX8U0ZcCwP2zMvdBAee4VCgB6m7t453cvEPTqoY01b+1i1Y3nk5yrVjoVY088PPcXHeY7iV6xdkrSsrOGkD9IenkuLTtrIoY9QCgQoum9ymM27kEv6W5PS4zHUBVTgNF60X1OLzuefiuqze/yEg6FI0mPMiypfOW9KOMewGSzYIpTHL9i6iDDhylgNYAKy1EoDtG2pz5i2B9k73+2kDW7CItDFaZUjC3HbdxLKT8Sj4FMRgIDF67BZNSTG4d+P0ySokIx1kgZjlJuirSHwwhNIAfsL7/Hj5TyiLrLCgVSfzE8LEotR6GIMJxNEPIHYiQuFYqxQJUSPA5y55eCgI4DTeTML4n5vmDxjBM/KMW0x5poZ9ZZS6PaNIOGyWaJerDMOHWRMuwVo+JIybQACKFi7hWKAbJmF8bcX8vWLRy2PohCEW/iqZYz7UgrzWHd5y5jz7824eroZdl1Z1H52naMZiNzzllOetnIJaYVirGkaFkFRrOJAy+/hz0tgYozlxIOhciYkYcMh5l11jIyK5T6kmJ0jCosR9OQIWXcKxQAmTPzWP3JC9n333cJev2Urp2vOwQVihOAMu6PA4PRQM6cYjJnFCDDYYwWE0XLKxBCYDCpP61i/LAmOShbO5/C5RVoBg2DUZ+PmeX5SCRGs6p2qBg9ekjX4T33QqiwHIXiIEazmfxF5WRVFBIOh1WcveKEMpZqOQBHVMsRQliBVwHLwHj+JqX8xvGO60RiMBk4WHP9oNHU19JFf2s3RouZ5Px0JSmoGBdMQxRvDIMq0/r6PfQ2dRLw+kjMSiUpN+1ED08xWRiF5x5NKM+9QjEEky36Huzq7KW3qQtNEyTlpWNPVaIZivgzEdRyfMDpUkqnEMIEvC6EeF5KuSEOYxsXOiqbePVHT0aSGnMXlrLsA2dgSz5y8QqF4kTg6XWx5S8v0fjuAUA3+tfddJkqlKYYltHE3AuhEQ5P+dImCsUx09PYwas/fhLvQPXapNw01nzyIhKzU8d5ZIqpxrir5UhdP9I58NE08CNH3mNiE/D4eO+J16LUSpq3VdO1to38hcq4V0wMuutaI4Y96MoO7z72CutvuRyzXS0fK6KRMgzakTz3GijPvUIxLFJKqt/YGTHsAfqau2jeUa2Me0XciWtguBDiAmAeELEOpJR3jWI/A7AZmAH8VEr59pDvPw58HKCoqCieQ447Aa+f3saOmHZvj3OYrRWTnck0Nwfj7XPHtPU1dxLw+pVxP0WI69wMh+BInntN018CFIojMFnvm8dDOBSmo7Ippr27rm0cRqOY6sRNClMI8TBwDXATIICrgOLR7CulDEkpTwIKgBVCiPlDvn9ESrlMSrksMzMzXkMeEyyJNvJPKo9pV2/mU5PJNDcHk5CVEtOWv6gMi8oNmTLEc27qYTmjKGIVUsa94shM1vvm8WAwGihePiumXSnoKMaCeOrcr5ZSXg90Sym/BawCCo+mAyllD/AycG4cx3VCMRiNzDlvBVkVBfpns5HF16wntThrnEemUBwirSiLpdeejtGiJ4BnzMxn3oWrMCqVJ8UwjErnXtOUzr1CcRjyF8+gZNVcEPpKV8WZS8gcsBUUingSzye5Z+BftxAiD+gEjvhKKoTIBAJSyh4hhA04E/heHMd1wknKSWPNpy7C1dWP0WzEkZGsigUpJhRGi5myUxaQPaeIoC+IIz0Rk80y3sNSTFBkKHTEmHuhKtQqFIfFkZ7EkmtPZ9ZZSxGaRkJmEprBMN7DUkxB4mncPyuESAG+D2xBT4r91Sj2ywUeHYi714DHpJTPxnFc44LJZiElXxlLiomLEIKEzJTxHoZiEjC6sBzluVcojoTRZCQ5L328h6GY4sTTuL9PSukDnhBCPIueVOs90k5Sym3A4jiOQ6FQKBRxRIbDCMORw3IIh5FSTtmVSp/Tg7fPTVJOGuJI6kEKhUIxTsTTuH8LWAIwYOT7hBBbDrYpFAqFYpISDiGMh39cCCH0QldSHrng1SRDhiXbn36TAy+/h8lqxpbi4JTPXoolwTbeQ1MoFIoY4lGhNgfIB2xCiMXoSjkASYCS3lAoFIpJjgyHdc/8ERADSbViFNtOFmRY8s6j/6a3sYMV15+FyW6h8tXtbPjNv1h306VTdpVCoVBMXuLhuT8H+DC6jOUDg9r7gNvj0L9CoVAoxhEZDo3OiBWaLoc5hUSXtj31Oj0N7Sy8bA2GATWpsrXz2fx//6N5ezV5C8vGeYQKhUIRTTwq1D6KnhB7hZTyiTiMSaFQKBQTCBkOj8obL6aYHGbNht3UbdzL4mvWRwx7AM2gUbxyNruee1sZ9wqFYsIRz7XTN4QQvxZCPA8ghJgrhLghjv0rFAqFYhw42rCcqUBXbStbH3uZeReejHkYmdiMGXm4u/rprlcVRhUKxcQinsb9b4EXgLyBz/uAm+PYv0KhUCjGAT0sZxSPC02bElVqfS4vbz78LDNOO4mEjORht9E0jZy5xVS/uesEj06hUCgOTzyN+wwp5WNAGEBKGQSmhgtHoVAopjPh8BGLWMHU0LqXUrLx0X+TVpYTqTQ+EpmzCmjYvA8ZlidodAqFQnFk4mncu4QQ6ejFqxBCnAz0xrF/hUKhUIwDehGrUYblhCa3cV/79m76WrooWz3viNs60pIwWEx01jSfgJEpFArF6IincX8r8DRQLoR4A/g9cFMc+1coFArFCUaGw6PXrtc0mMSee5/Ly9a/vcqsM5egGQ2j2iejLJfGrZVjPDKFQqEYPXEz7qWUW4BTgdXAJ4B5A9VnFQqFQjFJOZhMOxopTD0sZ/LG3O98dgOZ5fkkZqeOep+0khyat1cf0/GCwSCd7V00N7bi8/qOqQ+FQqEYStzUiIUQVuDTwFr00JzXhBAPSym98TqGQqFQKE4selGq0XmxhSYIh4JjPKKxwd3tpHbDLpZfd9ZR7ZeYk4qnx4mnx4ktJWHYbcLhMC/9+3X+89wr1FbX09PdR3+fE5fTjSPBjslkxNnvYvGKhdzylU8wZ35FPE5JoVBMU+JZauT3QD/w44HP7wf+AFwVx2MoFAqF4gQiQ0dRcXYSx9zvfXEz2XOLMTusR7WfpmmkFmXRuruOklVzY77v7enj8zfeQU93L2tOXcHCJXNJTHRgd9hJSHSgDfxtfT4/G17bxMc/cBu3f/tmzrv4jLicl0KhmH7E07ifJaVcNOjzS0KI9+LYv0KhUChOMLrnfnTGvdA0wn7/GI8o/gS8fmre3MXSa08/pv1TCjJp2VUbY9wH/AE+/eEvk5OXxadu/nDEkB8Oi8XMqWeupnxWKd/9+kOkpaeycs2SYxqPQqGY3sQzofbdAYUcAIQQK4E34ti/QqFQKE4wR+O5n6xFrOre2UNKYQbWJPsx7Z9SlEXb3nqkjJbEfPhHj2IwaFzzwUsOa9gPpqAwlxs+/QG+8vlv093Vc0zjUSgU05t4GvcrgTeFEDVCiBrgLeBUIcR2IYRKrFUoFIpJiAyFRlWdFgDNMCnDcipf207OvJJj3t+W7ACgv7U70tbU0MJfHn2SD370ylElIw9m7oIKlqxYyP13/+yYx6RQKKYv8QzLOTeOfSkUCoViAnB0CbWTL+a+t6kTT4+LtKLsY+5DCEFKYSZt+xpIykkD4Jc/+QPrzlhFalrKMfV5yZXncucX7mXHe7uZv2jOMY9NoVBMP+IphVl7uJ+R9hNCFAohXhJC7BZC7BRCfD5eY1IoFArF8SFDoVEVsILJGZZTs2EX2bMLEaOowHs4kvMyaNtTD0B3Vw8vPPMSZ5677pj7s9msXHTZ2Txwz8PHNS6FQjH9iGdYzrESBG6TUs4BTgY+I4SIlRxQKBQKxQknHAyCYbTG/eQKy5FhSd3GvWTNKjzuvlIKMmjf34iUkif/+hyLly8gKTnxuPpcs34l9bWNbHpbaVMoFIrRM+7GvZSyeaAAFlLKfmA3kD++ozo8QY8bT2szzrpq/L09MbrO4VAIf18PzvpqPK1NBD3ucRqpQjH5CLpduJsbcDbU4O/vO2pPsAyHCTj7cTXW4mqqJ+ByxiQ6KkaPDAVHL4UpBEiJlJOjkFVndTOawYAjI+m4+7IejLtv6+aJPz/D2vUrj7tPo9HAeRedwS8e+t1x9zVVCfl9eDvbcdZV4e1sJ+QfvhhY9H2ld1K9hCoUR8u4G/eDEUKUAIuBt4e0f1wIsUkIsam9vX1cxnaQoNdLf9U+PK2N+Hs6cdYewN/TFbWNv7cbZ80B/N2deFqb6K/aS9DrGacRK8aSiTQ3pwJBj5u+yr1421vwd3XgrN5HoL//6PpwO+mv2ouvsx1fRyv9lXsJul1jNOKJS7zmpq6WM8qYeyEQhsnjva/buJfMmflHnfA6HEIIUgoy2PrfTQSDIcorSo5/gMCqdcs4sK+GXdv3xaW/iUC85mY4GMTdWIe7sRZ/TxfuxlrcjfUxDregx01f1eD7yn78/X3HexoKxYRlwhj3QogE4AngZill1FUnpXxESrlMSrksMzNzfAY4QMjrRg65cXhamggFdG3ncCCAp7Ux6nsZChHyTD/jYjowkebmVCDg7IMhXl9PWxPhURqLUkq8HW1DW2NewKcD8ZqbMhhEGEZn3MPkCc2RYUnDlv1kzozfQnFyXjr739nFitVL4vLCAGA0GjnjnFP4zc//FJf+JgLxmpthv5dAf29UW6C/h7Av2nsfcPVDOPq+4m1rmrTVlBWKIzEhjHshhAndsP+TlPLv4z2ewzLc8r6UEGmWEI7dRkUFKBSjYKTr62i6CMeGhEyWMJGJSPhownJgoErtxDeaOiqbMFrMONKPPyTnIEn5GYg+H8tWLjryxkfButNX8dZrm2hqaIlrv5OdkcLtYtqH2U7K8KDntkIxtRh3417o7o1fA7ullA+M93iOhMFmj9F8tmZmo5lMAGgmM9as3OidhIbRFlscJRwORTz+IxEOhYY1VhSKqYQMhZDhEEZHIhDt8bRm5qCN0nMshMCakRXTbklJR4bDo14BUBxCho7Sc28wEA5O/L9z3ca9ZMTRaw/Q1N6BUdPITE6Oa782u5XVpy7nT7/9W1z7newYLFb9mTy4ze7AYLEi5aHr3eRI1PNBBmHNzEUzGvV7j7ovKKYY8dS5P1bWANcB24UQWwfabpdSPjd+QxoZo9VGYtksfJ1thHxeLGkZmBNTopZgzUlJIAoJ9HQhTGYsaRkYrLaofgLOPrwdbYR9XkzJqfrPoJtUOBjA39eLr6MVYTRiy8rF6EiM21KvQjERCIeCBPp68Xa0IjQDlqwcEkrK8XW2I0MhzKnpGB0JR9WnwWbHUViKr6sDhMCSngEC+msqkUE/lvQsTEkpGAZeyBUjI6VEBkcfcw8Hw3Imtuc+HArTsGU/i648Ja79bn57KwlmDW9rL6ZE25F3OApOP/sU7r7jAT59y0dxJBxbJd2phmY0Yc8vwt/TRdDlxOhIwJySTtjvw9vRSsjjxpyajikplYTiGfg62wbuK2kY7Q58vd1421p0p0BWDqaExKOa6wrFRGXcPfdSytellEJKuVBKedLAz4Q07A9isjtwFJSQVDYLa1pmxGt/EH9vD56WRtAMhH1enDUHCA1SzAm4XThrKwn09RDyefG2NeNrb9Ul5wb14W6oIeT1EHT201+1b1omBSqmNoG+Xlz11YQ8boKuflzV+wn5vPq1oAncTXUEnEeXUBtyu3HV16CHyIVx1VYRdLsIOnsJeT168l1v95G6UaAXsEITRxWWIyZBWE7b3nosiTbsqccnVTkYCWzZuJ2k3DQ8zfGfXxmZacyZX8GTf/1n3PuerIQDAdz1tQR6e9AMRgK93bgbavF2tuPv6SLk8+JpacTb3oyntZFwMDBwX2kg6Hbhqq0k5HERdDtx1hwg4HKO9ykpFHFhInjuJwXhUJCQx004GEQzmQkH/MhQSF8WtDvQNI2Ay0nI60EYTSQUzyDo6kcIQcjvI+j1YLTrUml6Um70MqC/pxNLRhaa0Ug4GMTb0RozhqCrH9NRejEVihNJOBgg5PEQDgUxWKxoJjMhn4dwwI9msmCwWAkH/IR8XoTBMPwLq9AwJ6cgw2GM9gRCHhf+fpN+vZktGGy2EYsqSSnxdrVjzcwGIRBCYLQ7CLpdGCxWQj4vAL72FiwpqWhG5b0/HDIQRDMc3WNCGAyEA4ExGlF8qNmwi8yKgrj22VDXRDgcJq0km553a5BSxn2l9czz1vHbh//M+z98OYajCJWaqoR8XszpGWgmMzLgx2zK1KUwhz5fuzuxF5Yi/T6klJgSU/D39cT0F+jtwWAyE/R6EAYDRqs9xnmnUEwGlHE/CsKhEJ6WJnydbZhT9SW/4ME3fCFIKC4DzYCrtgoZDmHPLcBZsz+SxGO0O9CSUyP9DWuYCO3Qg0CM4Ck7mqQ2heIEEw4GcDXUEhh4aBqsNszJqXhamyLb2LLz8Pd2ExqQhjUlJGNOTo140q0Z2fgHQt4ATEmpIATO6v2RPhzF5VgGXU9DMSen4mlpQA6shGkmM7bsPDyDFas0jaGx/YpYwsHAUcXbw8GY+4nruQ94/TRvq2bZ9WfFtd93N26nvKIUo8OKDEmCTm/cQ3PKZ5aQkJjAf//1GmdfsD6ufU9KhEAGgria6iNN1qxchM0RtZklIxtfe0vkvoOm4cgvIjjEwDc6Eujdvzui2GVwJJBQWIbBbB7T01Ao4o2yFo9AOBQi5Hbh69Tl9QxmyyHDHj2+NOjz4e/uRIaCmBKT9VjfQdn5QbdLl8P0+wmHQmhWK6bUdMwpaVgzczDaHXpSrsUKgGYwYMvOixqH0Ax6UpBCMUEJetwRwx6IGPamxGSsmTmYEpP1z0kpkW0Czt5D+ShC6EorMow9vxhHYSnGhAQCvdEylu7GWkL+6ET0UCBAwO0i5PMR8rgjhj0wsFLgi0pMt+XkoxmjfRv6Neo7KsM0HAwQ8vumrBpPOOBHGI/ecy+DE9dzX795P8kFGVgc1rj2u+WdbcyYWYIQAnN6At7mnrj2f5CzLziVX//sT9O2MFs4GCTocese+nAYb3tz1D3G29aCQRNRz9eDq+2WtIwBAQwzvu6ugQR+HVNisi6jO+haDrmchFQ4rGISojz3hyHoceNuboiE00C0xJbRkYjRkUDI7SI8UBVPM5t1re4hhPy6ceHr6iDkcWF0JGBKScPd1IApMRlTYjLaIM+8ZrHhKCgl4OrTDfvEJAxmyxierUJxfAw16CRgzy3E39uFt70Fo92BPbcwRrFGGE1YM3MQJhMIDWtGNp7WJmQohC0n+iVXP04wqmptwOXE19mGv7cbzWTCmpGDZrFEaV2H/F5sOQWEfR6MCcmYHNGevaDHjbulkWB/LwabHXte4WFfpmU4TKC/D3dTHeFgAHNqBrbMbAyW+BqM4004EEAcZViOZjASmMDGfeUr75G/eEZc++zq6qGjvYuCIl0pzZzqwN3URWJF7hH2PHpOWjqfJ//6HG+/sYWT1y6Ne/8TmaDLiae9hUBfL5rFgi07d5h7TAEyFCLocRPu6caUmgboq4Leg4n6KWkIowFzciqBvl49fC8xKWqF8CCh4OEV7RSKiYjy3I9AOBDAWVtJ0NmnL+EPhMwMDpcxJSbhbWseiIXXDYGg24UpMVYGzWhz4GltjBSzCrqceNtasKSmE+jr1pN9BsWpBnq7cDVUE3T26ZVwaw6ohFrFhMZgGRSCIDQMZjOe9pbIvA26XXg7WvQl7kGhaUabHXtuAbaMbDSDAXdTvf6iIMMxhWcADDZHJFQkFAjohn1PF0hJ2O/H3VSHJTUjah9TQhLWtAzsuYWYE5OiFDHCwSCu+hqCA8VwQh43/QOJvSMR9Lhx1h4gHPCDlPi72vF2tE45b2rY74tZ4TgSwmCcsDH3nVXNePvcpJfkxLXfrZt2UD6zOCLZaklPxNvSMybzQdM0zr3odH7xo0fj3vdEJhQI4G5p1FcHhSDs8yKMpkP3GE2L3GM0k5mwzwtCEOjuRDOZdIfBwH3F392BQH8u23PysWXnYbQ5MCWnxRzXaI1vaJVCcSJQnnt0b3zQ4yLodiE0A0a7Y+DtPhXNbCHs9+PILyboceHv7cZRVEbI50WGwzgKS/VlfIMRe0GJfsMxGDElJOJubkAgsGRkEQ4GokIF4NCS90FdfF93J0ZHAprZgq+rfWCbQQa/24kpMX4FVxSK4yXo9RB0OyEsMdgdOIpnEI4kjAs9oXaQF1eYzCAE1vRMhMGAZnMgGagqqwk9H0XTIka9r7sTW24h3vZmZDCIwebAmp5J0OXE5/VgdCQcRvlGgABLavph1VvCfh8hrzuqTTOZCXm9+Pt60YwGjPaEKK98JHZ3EL7uTqyZOVNqhS3k9x11Er8wGvXVlTFIKD1edv1rI/mLZyC0+I5r09vvMWtOeeSzwWZGMxnxdzmxpMc/nHLlmqX886n/sGnDVpadfFLc+5+I6KvjEltOfqRqsgwGMTkSMFhthEN68nfQ6yEcDGDLzkOGQgiTadiXTX9PN+bUjIjxLoTAlpmNDAYI9PUgNAO23IIYHX2FYjKgjHt0FZr+qn2Rz8JoxFE8AxkK4W6ojbSbklKw5xXiqq+JhOGAHr8rQkHcLQ2RWHuhGXAUlBB0u/B1dWDPHV6ZwWC14W6uRw66+SSUzEAz2QgPiStWWfuKiUTQ46a/am9E+cmeX4yvozXK423LzsPr9+mFkIxGzInJuOqrI9/b84vpr607dN0YDNgycyJJuGG/j4CzD2t2ATLgQ4ZCBFz9+Ls7ATCnpqOZTDHXijAYdcUcwN/Xg9l0mIQ4g0FfmTvoZRUalrQMnLUHIptoJjOJZRURA384BRnNZJ5yGtlhvw+RMnLy8nAIIRBGA+GAf0K96HTXtdFV1cyMdQvi2q/L5aH6QB3nXXRaVLs5PQF3Y9eYGPdGo4ELLzuLB+/9BX948mcT7iVqLBAG/SXb09IYaUsonQkQlbRvTkkDGd1myylAmExRz9nhrleDxUpCYSmhgB+haRNq/ioUR8O0D8uRoRCe1iasWTk4CktxFJViyciGUBBfZ3vUtoG+HsKBQJRhDxBw9hNw9Ucl0cpwiKCrH39PJ5rBQCjgx5ySHrWfJS1Dj2nVDFizcrFm5WJKSsHT0oQtNzeqop5mMkcl/ygURyIc0hPPgl7PmIQHBPp7YyRdh4ayeDva9IctYE5Oi5J4NdoHvO6Dr5tQiHBwUEVUIbCkZ6IZDGgWC8bEJD0EZwB/bzeW9OiKtAcTdL3tLXjbW5DBIOakFH2VweMmPMSLbzBbsOUcevk2Jw0kxQ8iHPBHhcUZ7PaYwnT2vMKjDmGZyMhweEDC9OidCroE6shhTScaKSXvPvYKRStmYzDF9/9o6+btlJQVYBqiqGJJT8TT0DXCXsfPyWuX0dPdy3//9dqYHWNCEQ7jHRC2GNw2dOXO39OFENH3O29bc3SonhBYs7KHVcHRJTBtyrBXTGqmzpPoGJFS6jJZHW1421p0YyItg9AIspNymBhg0FUzYrYNhbFl5yE0IyGfHkJgdDiQUqIZTXpSoJSYEpLwtreAlBjtCXo4kMlC0ozZum6+0DDY7FMuWU8xdoS8HlyNtbqykxDYsvKwZGQetWb54QgHor3lwynGyFAQU1IymtmMwWqLqE7BQcnEYWKzZTiSeKtZLEi/D3dLI4TDaBYL9pyCQ6tk4TC+rnYSimcQCvjQNA3NakfTNByFpYBu7Af6evG0NenXmCMBR34JBqt+PQkhsKSlY7TZCfm9GMxWArWVwwzr0IuMwWwhoWSGXvsiFMJotWIYIr832Qn5vGgm04g1BQ6HZrYQ8nhgmPyj8aB2w258/W5yF5TEve+Nb73LzFllMe3mtAR6ttUS8gUwWOK/6qppGld94BLuu+vHrFm/Apttaj8f5MD1PpihyfmH2qO3k+EQpoQk/bkrpW7Um6b230sxvZn2nns0jUB/L0HXQBVMKfF1tqMZDDGeOWE0DbzpRy+BamYz5uEScRIS8ff24KqvwtvWjLuxFk9zI0abHVddlR7yIzTd4BnwXgbdTv2hajRitDmwpGZgTklThr1i1MhwWE8yOyjZKiWe1sa4J2QPlrQE3eBlSHiAOTkNzWrFlpmDZrFFy2C6+odNPtfMFlwNNXia6yEcxt1UH3moh30+fN0dmAf1I0NhNIsZW0Y2lrRMTHYHBqsNS2o6ltR0wsEAntbGQ9eYy4mnozXqZUQbyJOxpmVidCRgyYheDQAwWKNjbw1mC+bkVKxpGRjtCVMuNCLkcaOZj+2+Y7BYh1UNGw+c7T1s/durVJy5JEqRLB64XB727a6ivKIk5jth0Mbcez93QQWl5UU89L1HxuwYEwWD2RJzv9DMFrQhIXea2RK1Ggi6zGUoqCfbe5rr9QrxXe1TLgFeoTjItDfuZTBAsD/2IRR0OTGnpGNKSkEYjBgTEnHkF+FuacJRVIrBZkcYjVgysjDY7IT9XqyZOWgmM5rZgi07j5DXgzklFXNqut6HI5HEspkRb6XQDDGJfDAQ7jAo+TYUCODr6aK/thJPaxPBYZL5FIqDyFCQQF9vTPtwSaDHg8megKOoDM2iP2BDAT/23IIBNRtjJB5ehPUHqAwGMFgskevBYLFhsFix5uSjmUxoFguOolK9P4sVYTTFJKEfPA9jQuLAdZlEQlEZRuvISW8hT+x5B3q78ff20F9zAF93R1TMvhACS2o61uw8/YXeaiOhdCZG+/RKrAs4+zFYji00wWh3EPK4CDj74zyqoyPg8fH6z56maMVsErNS4t7/lnfeo6SsEIt1+L+TOTMJV137sN/Fi/ddfxkvPPM/Xntpw5geZ7zRTCZs2XmHnqd2BzLox55XhCkxSReySEzGnls4EJ8/cB9KScNgtTEkUgd/X/dhE+0VisnMtA/LEZruoR8aYiCMJjytjfqDvbgMX28PzoGleleDWy+YkZSCwWIlHAzi83jwdXVgSkrWPaXtLdiycjElJmNJzUAG9dh6YTAgBzxaMhwaNkzCYLMjDPp7l5QSf1eH7nlEN0q8ne0klc9S3nzFsAjNgMFm12VcBxHvGFJhMGBJScOUkATIAQnJA5gSkzDabBHDzpqVE9ne39sDAszJKYQDAVz11SQUz8A6Yy4IEYlZN9oSkDJMeJgXEmEyYbAnkFQ+C2E0ohkPH/Iw3HnrIULtBF39BPp6sKRn6kbBgGfXYLZgz87DmpYJmohrONNkQEpJwNk3bJ2B0SA0DWtmDs7aAyRXzIvxrp4IQoEgbzz8DIlZqeQvig2biQdvvPIOc+ZXjPi9NTOJ9j1NhAMhNNPYJFsnJDq48bPXcfst3+HXf36QikGqPVMNo92B3VqMzPSBwUjI68FZvR9zajq2nFSCbifOukq9bobBiDnZRsDlBJczch+K9GVzTLkEeIXiINPacx8OBgj5PFgzs6MKtRjsDv2NXkoMNjua2YJhcKJcOIzBYsNk02N7DUajbpBrAn93J/6eLgwmM5rJjMFkRghdEvBgkqDBZo8kAYYDfoyDpOaEwYA9Oz9y0wkH/HjamqPGLYOBuHthFVMHYTBgz8k/lJSKvixtsI9NTLg2YGAbrHbMqekE+nvxdXUQDgRwFBRHjG8hBNb0LMJ+P76uDgL9vZiSU5FC98oNTkY1mM0YLXocu3lIIpw9txCTTU9oPZJhD3ryqynh0HK+MBj0BFvXIa+yr7Ndr3g59NxMpmln2MPAKo/guIxyo92BMSFRlzk9wYRDId765XNICTPWLxqTkKn2ti4a61sorygdcRvNbMScYsfd2Bn34w9m5uwy3n/9ZXz8A7fy3padY3qs8UYG/IQCfmTAD5rAlpOHv7sDd2Mt/u5OvVhdOHzoPuT3YcstxN9/6HoXBiO2rNyoujUKxVRi+j21Bgj5vDjrqvWiUkYjjvwiZFgiDHrxnXAgEFnO0wxGrBnZmBKTCAeDutE+JB7f39ONKTkNoWkIIXR1DY8LS2p6zLE1gxFbTj7mlDRkKIjFZEaGgshwGIPFOoxHPjYuUMUKKg6H0e4gacYcQj5vZHVqzJVcNIHRZsdgztPnpxC6Zv0gPO0tWDMHPPlC6HkBIySpg27k27LzdE9/KIjRbEU7St1pg9mCo6iEkNejJ8QLLUrmUhGLv6crLnkEJkci3s72EaWAx4JwKMyGX/8Ln9PDvAtPjrum/UFe/e+bzF1QgdF4eO+vJScFZ2UrCSWxeRzxZPmqxZgtZj77ka9w7Ucu5yOfvBbrCOFCk5WAs4/+mgORe4ajqIxgwE9Ccbn+bDaa8PX1YElNx5yQiAyFdOeczY4pIYGQN3PgOWs75pAzhWIyMG2Ne39fT6RaLMEgrroqbDn5WNMGyoUP2O5SygFpPg2jffhiLvoSdBbOmmiDIbF81ojH1wwGtFEUh9FMZqyZOXgHee+FwRCT3KdQDGX4F8WxI+Rx426qi2oL9HSTWD5L9+6bzFhS02Pmss1WdNh+DWZzjGSdlFIvUGMwjMoA1YwmtATdyx/y+9AMRsLhQ6F45pT0YWXxpiNSSvy9XZGXsONBs1gJB/yEg4FRrbIcLzIseefRf+Pu7GPexavQDGPjmQ34A7z6vw1c/cGLj7itNTuZ/r1NhDx+DLaxnWOLlszjjrtv4bE//oPH//g013/8Gq58/0UkJE5+JSc9jK8myhkQDvgJu104B8lWG2yOgXvGEONd0yL3AIViqjPuxr0Q4jfAhUCblHL+iTpucJhEr0B/L7aBarGgV9/0dXUQ6OvB6EjAmpGNcQSvocmRSELJDLydbbqxn56NMQ5hEGKgmqdmNuPv6tRDetIyMFpVvL1iYjE0bwUg5PPoIW5Goz6XM7LQLJbouXyULyAhnxdvZxuBvl6MCYlYM7IOm1A7FIPZQkLpTPzdnQOJ86l64ryKvwX0kBwppa46cpwIITBYbfrfOfnoimEdLVJKNv/ff+lr6mTBpasxHMGjfjy89fpmsnMySM+MVUkbimY0YM1Kov9ACykLDv8iGw/SM1L51M0fpra6nhf++TK/+skfed/1l/LhT7x/Uhv54VAw5h7jaW4goayCYH8vQZcToyNBz4VTGvWKac64G/fA74CfAL8/kQc1JSUT6O8d0pYS+T0cDOJqqCE0IB/o9/sIOvtJLJ89YuELc1JKRKornjGemsmMNS0TS2rGlJPbU0wdNNMwiat2B2JQONDxzuVwMHgonA7wd/kI9veNeF2OhNFqw5hbgJRSXVND8Pd2x1Xa02C2EnS7xtS4l1Ly7l9fpqOqmYWXrYl7oarBhEIh/vnUvznjnHWj3sdWkE7vjnqS5xWOWZjQUIpLC/n4Z6+jvbWDZ578Dxet/wBfvetmzr5g/Qk5frzRjEZ9JWhQcTRLWgbuxjpkKITBYsXX3UWgr4/E8ooTslKkUExUxj2bREr5KjB2QsAjYEpMjjLmjYlJmJMOPXxCfl/EsD9IOOA/YtVFIcSYGQvKCFFMZAw2m17pdWCeaiYzjryiYRNSj3Uuh3zeQ+F0A4zmuhwJdU3FEujricuq40EMFkvcaywMRkrJ1sdfoXVPPQsuWY3RPLZG3Wv/24AjwUFR6ejzCEzJdjSTEXddx5E3jjOZ2Rl89JPv5+M3Xc/93/kZd37hXnze2OTxiY5mNJFQWII4aLQLgdGRSNjn1SWtXf262ITPM6GqIysU48G4G/ejQQjxcSHEJiHEpvb2+GgGG8wWHIWlJM2YQ+KMOSQUlUcl2Iz00D9RXhfF5GAs5uZkRTMYsWZmkTRzLonls0maMTuuRiIworqFUr2I5VjmZjjgJ+z3xwgGHA+axUrI4x4TEYBwOMzmP/2X1t11LLxsDSbr2Ma0u5xunnr8edadvuqo9hNC4CjNpPu92nETQ5gxq5Q77r6F5sYWPnzVTXS2n3CfWoRjvW8a7Qn6M7t8Nkkz56KNkBR7LFWVFYqpxKS4AqSUj0gpl0kpl2VmZsatX22g0IXJ7kAzRMdnGiwWzOnRxzIlJitteUUUYzU3JytCaBitNkyOhDHRNjeYLZjThlyXSclK+WIYjmVuBvp7Mdjt8Q0rNBpB0wj74ustDvoDvPnws3TXtbHwsrVjbthL4I+/+RsVc8rJyTt65RtLpl4PwlV14qVBD2KzWfn4TddTXlHKtZd8kuoDteMyjuO5bxrMZkyOBIxWGwaLLaY6vDklDU09pxXTnIkQcz8hEZoBe1Yu5oQkgm4nBqsdoyNRxfEpFOOIXgdi4Lr0qOsy3vh7ezDa4p90abBaB+6j8TG6nO29vPHwM9hSHCy4ZDXaGCbPHuTlf79OdWUtH/jIlce0vxCCxFl5dG2uxFaQhsEyPnNWCMElV55LRmYaH7ryJu7/+bdYvmrxuIzleNEMBux5BZiSUwh5XBhsDt2xYFDJ8YrpjTLuD4NmMmNONo+5yoNCoRg9msmMOcWMOUVdl/FEhkIEXP1Y0jKOvPFRYrDaCPT3HXffUkrq3tnLu4+9TNHyWeSfVH5C8iY2vLGZpx5/nvd96DJMxxHTb05xYMlKpv2NvWSfNm9ccz7WnLqC1LQUbvvU1/nMrTdw9XWXTMocFM1kxpKSBilHVi5SKKYL4x6WI4T4M/AWMEsI0SCEuGG8x6RQKBTTDX9vN0arLaqycbww2hwEnL3HFW/e39bDaz95ih3PvsWCS1ZTsHjGmBujwVCIpx57jr/+4SmuvPYiUtNSjrvPxIpcQk4vne9UjnsxwrkLKvjS12/iD795nJs//rVxjcNXKBTxY9w991LK94/3GBQKhWI6I6XE094ybEXteKCZTGgmM4G+nqNeCe1r7mLvi5tp2HKAwqUzqThjyZgVpzpIMBTi3Y3beeqx57A7bHzgI1eQkHjkooOjQWgaKYtL6N5SQ+tLO8k4eSZG+/jljGTnZnL7tz7P00+8wCVnXM8HPnoF11x3GWnpKeM2JoVCcXyMu3GvUCgUivEjHAzibmlAaBqGEYr0xQNzSirupnq9cvIQNR4pJaFAiIDHh6/fTX9rD921rTTvqsHb4yJnfgnLP3QWZlv8jOCwlAQCAXweH85+F11dvTQ3tlC5r4ad2/aSkZXG6lOWU1ZREvcVAs1kJG15Gc4DLTQ8tRF7YTr2/DRMKQ6MdjOayQja2MkqD8VkNnHF+y9k7fqV/OuZ/3H+I+9j/qLZrFyzlJmzy8gryCEtLQVHogOLxYym1KkUigmNGO9lwaNFCNEOHE2KfwZw4sWFTyzqHMeGDinluaPd+Bjm5rEwWf6v1Tjjy9BxxmVuJiUmaNWvvxTJpvT5/WPyQDhYLMxiNguAzMUrNofD+qEuXLg+47pVlxSPtG8oHJLhuD+nJk5wuWmEMKi6rg5+t+GVcXlAa0fQfA7LcHhn/evvjvC19WiqzY/yvjlZrtORUOMffzKAPUdz35zMTDrj/mgRQmySUi4b73GMJeocpw+T5e+gxhlfJss4R2IyjF+NMT6MxRgnw3kfDjX+8WcqnMPRoNbWFAqFQqFQKBSKKYIy7hUKhUKhUCgUiinCdDDuHxnvAZwA1DlOHybL30GNM75MlnGOxGQYvxpjfBiLMU6G8z4cavzjz1Q4h1Ez5WPuFQqFQqFQKBSK6cJ08NwrFAqFQqFQKBTTAmXcKxQKhUKhUCgUUwRl3CsUCoVCoVAoFFMEZdwrFAqFQqFQKBRTBGXcKxQKhUKhUCgUU4RJZ9yfe+65ElA/6udE/BwVam6qnxP4c1Soual+TuDPUaHmpvo5gT/Thkln3Hd0dIz3EBSKYVFzUzFRUXNTMVFRc1OhiD+TzrhXKBQKhUKhUCgUw6OMe4VCoVAoFAqFYopgHKuOhRCFwO+BHCAMPCKlfGjINuuBfwDVA01/l1LeNVZjmo709fRTW9OAwaBRXFaIw2EfcdtAIEhddQN9vf3k5meTk5c16uM01DXR1tJBWkYqRSX5aJp6b1SMjpamNqr212A0GZlRUUpaRuoR9zk439Iz0ygqyUcIcQJGqlCMLT3dvdTVNGIyGSkpK8RmtwHgdLqorWpA0wSBQBABFJUWkJySNL4DVigUE5IxM+6BIHCblHKLECIR2CyE+I+UcteQ7V6TUl44huOYttTVNPCNL97H5nfeA+Dci07n1ts/NazR7nF7eeIvz/LAPT8nGAiSkZXGg498h4WL5x7xOG++8g5f/Oy36O9zYrNZ+dZ9X+LM80/FaBzL6aWYCuzctoe77/ghO7ftAeCs807lM1+4gbIZxSPu8/rLb/Plm+6KzLe7vv9lzjz/VAwGw4katkIRd6or67jj1nvYsXU3AJdefT43feFjBAIB7rvrx6SkJtPZ3s0r/30TgMXLF3DX979CcWnBeA5boVBMQMbMvSqlbJZSbhn4vR/YDeSP1fEUsfzzyf9EDHuAfz3zP95+Y/Ow2+7bU8l93/oxwUAQgI62Lr715e/T09172GM01Tfz5c99m/4+JwAej5fbb72H2qr6OJ2FYqoSDod55okXIoY9wH+ef4WNb7074j4N9U0Rwx4OzbcaNd8Uk5hwOMwTf34mYtgDPPXYc2zZuI03X9vIGy+/Q0ZWesSwB3h343ae+fsL4zFchUIxwTkhsRNCiBJgMfD2MF+vEkK8J4R4Xggx70SMZzrg9fp4+cU3Yto3btg67PZNDS0xbfv3VtHV2XPY47S3d9Lb0xfVFgwEaWluH/VYFdOTnu4+3nkz1pDf/u7Qxb1DdLR1RQz7gwT8AVpb1HxTTF6c/S5eefHNmPZt7+5ix9bd5OZnU32gLub7V158E4/beyKGOOGRUiLD4fEehkIxIRhz414IkQA8Adwspewb8vUWoFhKuQj4MfDUCH18XAixSQixqb1dPcRHg9VqYc2pK2LaFy9bMOz2w4XqlJQVkpKafNjjpKenkZDoiGozGAxkZqcfxWgnL2puHjtJyQksXh47H+cunDXiPukZqTgSovNGjEYDmVnTY74dDWpuTh4cCXZOXrsspn3ewlnMmVdBa3P7sOE3q9ctx2qznIghxpWxmJvO2kr6KvcceUOFYhowpsa9EMKEbtj/SUr596HfSyn7pJTOgd+fA0xCiIxhtntESrlMSrksMzNzLIc8pbjoinOpmFse+bx63XJOPiX2AQJQMbucz9z20UhiYmJSAt/43pdIS0857DEKivP4zgO3Y7GYAd3QuvO7t1FaVhSfk5jgqLl57BiNRi696nxKyg/NlZVrl7J81eIR9ykszufuwfPNZOQb936Rkmky344GNTcnDwaDgWuuv5TSQdfC6eecwtIVC1m9fgVzF87C6XSxdOWiyPczZ5Vy6VXnTcpk8rGYmwFnHyGPOy59KRSTHSHl2BTtEvod51GgS0p58wjb5ACtUkophFgB/A3dkz/ioJYtWyY3bdo0FkOe0DQ3ttJQ10RiciKl5UUR4+ZINNQ3UbmvBqPRyIxZJWTnjKyA4+x3smfnAbq7eiksyWP23JmjOkY4HKauuoGW5jYyMtMoLivCZJoSybRH9dScDnOzo72L2up6LBYLpeWFOBIch90+HA5TW11Pe2snWdkZFJUWxCgp1dU0ULm/BpPRyIxZZSQkOqiprMPn91NcWkhGZtowfTbQ2txORlYaxaWFU2W+HQ1qbk4C6msbaW5sIzU9mZLSQkxm07Db1VY3UF1ZS3JKEl6PF7vDTml5EUnJiYCuolNdWYfRaMDn9SOEoLgs9tqYIIzL3Oze8S4yHCJ1wdJJ+cKjOCFMm4kxlk/ENcB1wHYhxNaBttuBIgAp5cPAlcCnhBBBwAO873CG/XRl27u7+NwNX6WrswdN0/jE5z/EdTdcSUJiwmH3q6mq5yuf/za7tu0F4NQzVnP7tz9Pbn5OzLZul5u//uEf/Pj7vyIcDpOcksSPfn3PiGE8g9E0jZLyoigPrGLqcWBvNbd9+htUH6gF4MLLz+aWr3yCzOyYxTZAN8L/89wrfO3We/D5/FgsZu558A7OOHddlIFfVFJAUYkectDW0sF3vvYA/3zqRQDKZpRw/8+/RXlFSWR7TdMoLS+K8nIqFBONDW9s5tZP3Imz34XRaOBL37iJS68+H6s1Ooxm6+Yd3HHLPdTXNgK6qtlnbv1oxLAHSElNHtW9eLqix9uHQAhkKIRQSm2Kac5YquW8LqUUUsqFUsqTBn6ek1I+PGDYI6X8iZRynpRykZTyZCllbEbRNKe3p4+7b78/ktgaDof5+Q9/y55dlUfc95knXogY9gCv/PdN3np9JLWcKh763iOEBxKSenv6+MaX7qP7CAm1iulBIBDkj7/5W8SwB3j27/9m6+YdI+5TW90QMewBfD4/d9xyD3U1DSPu8+6m7RHDHqDqQA1//t0TBIPBOJyFQnFiaG1p546bv4Oz3wVAMBjiu19/iKr9NVHbeVwe/vCrxyKGPeiqZu9t2XkihzvpkaEQaBqa0YQMBsZ7OArFuKMqDU1werr72LPrQEx7a3PbYffzen28/vKGmPYt72wbdvvmxtaYtprKOrqPIIWpmB64+l289drGmPbh5uZB2ls7Iob9QbxeHx1tXSPus3vHvpi2N1/bhMupYmkVk4euzm7a2zqj2qSUtDRF37c7O7rZuin2BblyyEuA4vDIUBDNYEQYDIRDofEejkIx7ijjfoKTmprMnHmxse9Hqh5rtVpYd/rqmPbBCVmDySvIjmkrm1FMatrh1XIU04OEJAer1y2PaZ89zNw8SFZOZkwIgs1mJeMwyjZzF8Qq5axZvyJGIUehmMikZ6SRNSRcTQhBTn70fTY9K5XFKxbG7F9eUTqm45tqyFAQNA2hafrvCsU0Rxn3E5yklES+ds9tZGTpiVMGg4HPfvFjzJo744j7XnDZWSxccqh0wBnnnMLJa5YOu+3MWeXcevunIlU+09JT+OZ9XyI1LeX4T0Ix6TEajXzwo1cxY5DRcenV53PS0vkj7lNUks93fngHNpsV0A37e354x2Erai5etoCLrzo38nnm7DLef/1lqtqxYlKRlZ3BPQ/eQWKSnhdlNBm54+5bKJ9ZErWdzWbjuo9eRUlZYaTtwsvO4qSlR64MrjiEDIUQmgE0gx6io1BMc8ZMLWesmK6qDy1NbTTWN5OYnEBJaSHmw6jlHFRWCAaC5ORl0dXRjcFoIDkliaaGFmx2G+Uzi2OUTpz9Lnbv2Ed3Vy8FRbmEwxKX00VaehrNjS2EQiFmzCqlsDh+hYb376mipqoeR4KNWXNmkD6x1B+mlSJJwB+guqqOjvYucnIyKS4rjLzsHaSro5vamgYsFjMlZUXYHbao77u7e9i7q5K+7j6KSgsoryhh1/Z9tDa1kZOfxZz5FezZuZ/62iZSUpOomF0e48lva+1g/54qfF4f5RUlFJcWoohhWs3NyYiUkl079tHW0k5ychJutwe7w4YQAqPBSF9fP8kpSZSWF9HV0U1VZS0Wi4XEJAd+f4CyGSUEgwGqD9QhNEFpeTGaJqg+UEcwGKSkrHDEZPaRCPgDVFfW0dHRRW5uFsVlhTHqVXHghM9Nf08X3s52hMGAKSEJa8bhV7YV0xallqOYWOTkZR0xFAf02Pm7vvoD3njlHUAvRPXAL76N3+fnuss/Q1dHNwBXvO9CPvvFj5GekQqA0+ni0V/+lV889CigF1X57G038KP7fkliUgLX3Xg199/9M2bOLuOu73+ZeQtnH/c5bdqwlS985puRMZ1/yZl85raPxvXlQTE6/H4/T//tBb7ztR8SCoUwW8x876E7OeO8dVHbpWWkkjYwZ4bS2tzOr372R/76+6cAvVbC3fd/la98/tt43F7sDhv3/PAO7vzCvZEqs9dcfynX33gNhUV5A320cc/XH+Klf78OQEFhLg/9+h5mziobozNXKMaGN199h9tv/g43fvY6vnr/3bhdHoxGI/f88Hbu+fpD9AzkM73vQ5fx6Vs+Qn5BDp+/8WuR5No7v3Mrf/u/Z9i9cz8AC06aw/mXnsX3vvkjAEpnFPPAw3fFrAaMRMAf4KnHn+eeOx88dI3/+Ouccc4p8T/5E4wMhxGahhCarpqjUExzVFjOFGPjhncjhj3ocpiP/+lp/vy7v0eMaIAn/vIsu3ccUtLZv7sqYtgDuJxu/vTbJzjnotNpa+1gw2ubWLxsAfv3VPHiv1497nF2dfXw0wd+HTWm5/7xIjsHqfsoThw1lfURwx7A7/Nz5xfvjVLxOBK7tu+NGPYA/X1Ofvz9X3HaWWsBOO3stTz4vUcihj3AX3//FHt3HkrKfXfj9ohhD9BQ38wff/04gYCKo1VMHlqa2vjabfdy+tmn8Mff/A23ywPAKaefzKO/fCxi2AP85dEn2bV9H3959MnI9ZaZlc6+vVURwx5g+9bdNNY3R6qGVx+o5anHnmO0q+9VB2pjr/Hbvkt9XVNcznk8keEQaAI0ocJyFAqUcT/l2PFebPntd97YEqNaAtDccEi5obUltgR4Q10Tmdl6yMTunfspm1EMwNaN2497nN2dPezavj+mfaiahOLE0N7WGXnoH8TZ74p6+ToSw82hA/uqyS/U6yrkFeRQU1k3zLE7Ir/v3R0r8brxra24XUotRzF56OnupbO9i7SMFJoaWiLtZTOK2bNzmPteYyvvvPVu5HNRaQEH9lTFbFe1v4b8wtzI5w2vb8br8Y1qTO1tnRGp44M4+11TQu5YhkIIMZBQqzz3CoUy7qcaS5bHKi+sP2s1CYmxaiMFxXmR3/MKYgtblc8sobG+GYCTls5n14BM4clrlx33OLOyM1gyjErE4AeX4sSRk5sVUz0zJTX5qGJ6h5tD8xbOpnK/ro1fU1k3rLpO7iAFkfmLYsO9Tj1zNQmJh6+Eq1BMJDIy08jJy6KlqT2quN/uHfs4aem8mO0LivM49cxD6maV+2qYM78iZrtZc2ZQW10f+XzaWWuw2a2jGlNuXhbGIZWcU1KTyTyMetVkIRwOgRgIy1Gee4VCGfdTjaUrFnLZ+y6IfF6yfCGXXHU+7//QFZQOeN4NBgOf+Nz1zFt4SHawYnYZX/32zREDLzsnkys/cBH/ee4VZs4uY/6i2ezesY+T1y5j/VlrjnuciUkJfOJz10dUIgwGA9d97CoWLp5z3H0rjp6S8kK+++AdkQTZ5JQkvvfjO4c12EdiwaLZfPqWj0QMiLyCHD77xRvY/PZWADZu2Mrnv/zxiDFvNBn59K0fjZJ6PWnpfK657tJI+fgFJ83h6g9eEpPYq1BMZDKy0rn3R3eyccO7XPPBSyKymJvf2cYHbrgqkldkNBr47G03MHdBBVe8/0IWDahP9fb0MXN2GaecfnKkzzPOXUd+UW6kMNbyVYu58PKzRz2m4rJCvvvg17DZD13j9/3k61Ev15OWUBihCdA05JDVCYViOqLUcqYgHreX2up6gsEQRSX5kTLmB/ZVU7W/loQEO9m5WTQ2NJOekUrZjBJsdivBYJC6mkb6evvJzsnE6XThdXtJz0yloa6ZsJTMnFVKekb8FG0O7K2moa4Ju8NG+axS0tOHT9YcJ6aVIomUkvraRro6e8jKzhjWsG9qbKH6QB1Wq4XymSWkDKmD0NPdy/69VfT3ucgvzGHWnBnU1zbS2dFNRmYaBUV57N9TRUN9M0nJCcyZPwv7EM+j1+ujtqoev99PUUkBySlJR30urS3tVB+oRdM0ymaWkDGxVJjiwbSam5OVlqY22lo7sNksuFxuLBYLSDCaDLhdHhwJDorLCmhr6aCmqh6jyUhCooNgIEgoFMZo1IsyWawWiksLEEJQW91AMBiiuCSfxIF7+0i43R6q9tXQ1dVDQVEeJWWFNNQ1HfYajwMnfG4666rQjCaE0UDA2U9SWWy9DIUCpZajmMzY7NaY8IftW3fzqeu/SF9vPwDrTl+FI8HO80//l0/d/GGuv/EaHAn2SFz9UPIK4h8uM3RM5196Jl/82mcmmhzmtEEIQVFJAUUlw+vQ79m5n09/+EuRCrNrTl3B17/7hYjnr6e7j5/98Lf85dEnAbDZbfzsd99j6cpFUQpIM2eXMXP2yOo3VqtlVHUcRqJqfy03f/wOaqr08IW5C2dx34++TtFh9PUVirFgNCpnu3fs41Mf+lIkv2XtaSspn1nKo4/8BYCFi+fy3YfuxO7QQysPVzhuME6ni9/+/P/45U/+CIDFYuahX36H1aeuGPEan6zIcBg0DYSGDCnPvUKhwnKmAW6Xmx/e8/OIEQ3w6v/eoryiBICfP/g7KvdVj/uYnnvqRXZuV2o5E5GAP8Bvf/HniGEP8MYr77B106Hk6r279kcMewCP28O3b78/ShnkRPDPp/4dMewBdm3by6svbTihY1AoRoPP5+eXP/ljVOL66y+9jd1ujYSibXt3F2+9tvGo+96/pypi2B881je+dB9trR2H2WtyIsNhhBAITQOpjHuFQhn304C+Xic7t++Lafd6fJECJu1tnRNiTK3NsYorivHH5fLw3uadMe0H9tdEfh9uDlUdqKWv1xnTPlaEQqEo1ZGDDH4JUSgmCi6ni21bYq+rrs4eHAmHRBC2b9111H13DHM9tra009vTP8zWk5zBnnsVc69QKON+OpCanswpp62MabfbbYQHPB4nWqVmpDFNteXiqUJikoPTz1kb075g0aEE6IKivJjvl65YRFpGylgOLQqDwcBZ56+PaT/ltJNjN1Yoxpmk5EROOzv2usrISouqB7Fq7fKj7ju/MDeSmH6QGRWlU0IdZyiHPPdCGfcKBcq4nxZYLBY+dfOHmbtAl1YzmU188IarePvNLTgS7Nzz4B2jrnI4lmP63JdvjHxWTCwMBgPXfPBSlq9aHPn8kU9ey6Ilh2T9Zs2ZwR1334LFYgb0Cppf+dbnSEg4sTKWZ5xzCmedfyqg5xFcds35nHzK8cu3KhTxxmg0cu1HrmDJikUDnw189NPXEgqGkFIihODqD1zM8lUnHXXfMypK+fb9X42o4xQU5nLXD75MSurRJ6hPdKTUPfdCaLoXX6GY5ii1nGlE1YFaXZnGbiM3L4vu7l6SU5IiyY79fU4O7K2mp7uXrNxMfB4v/U4XeXnZtLV2IqVkRkUJOXnZSCmp2l9LfW0jicmJzJxVGlHlORJNDS1U7q/BaDRQWJxPX28/NruVwuJ8jMYJleOtFEmGUFvdQH1NA2aLmdKZxWRmRnsB62oa2L+nmr6+fopK8pkzv4LqA3W0trSRk5tFeUVpxPg/SGN9M1UHajEajcyoKDkqbf2RcLs81Nc2omkahSX5WK2W4+5zgqHm5iSm6kAtdTUNmIxGzFYzVpuV7s4ezGYTNocVZ5+btPQUgsEQPp8Pv9dPeUUp2bmZo+q/r7efA3ur8Xp9A/dlSU5e9olSjTrhc7Nn9zZsOXkIgxFnbSVpC5YeV3+KKYtSy1FMLbZu3sEnr/tCpAz6aWev5Wt33xqpQNvX289PfvAr/vL7p4ABT/qXbsTr8XLfN38SKYteUJjLj397L+2tnXz2o1/BP1D59tKrz+eWr36C1LSUw45j/54qPv2hL0WqmVbMLeeBn9+lwnEmAbt27OOTH/xCJEF28fKFfPehO8jL1+X0qg/U8tMf/pZ/P/sSABVzyrno8rO5/zs/j/Txte/cymXXXIBpQAt/7+5KPnX9FyKJunMXzuL7P/kmhcWxIT5Hg91hOy7FHYVirNj8zjY+ff0X8Xi8AJx+zlqSk5N48rHnAFi4ZB6z585g9459rDl1BQ8/9CgApeWFPPjLeygdVBRrOHq6e3noe4/wxJ+fBcBsMfOT33x3KsrBRpDhMAgNhAApI6seCsV0RYXlTAOcThcP3PPziGEP8NK/X2fX9j2Rz/t2V0YMe9DVUf755H8iHtCDNNQ389w/XuThB38XMewBnnrsOfbuOnDYcUgpeeIvz0QMe4B9uyp5/eV3juf0FCcAv8/Pb372pyjlm3c3bmPLO9sin/fuqYwY9gCnn72Wh773SFQ/937zR9QOKNmEQiH++vsnoxR4dm3by9uvKw+zYmrS19vPfd/8UcSwB/jfC6+TX3Qo52nblp2kpaewe8c+gsFQZNWpurKe//37tSMeY++uAxHDHvRr966v/ICuzu7D7DW5kXIg5l4I3chXoTmKaY4y7qcBzj4Xe3dVxrS3tR5SU+ho74r53mAwsH9PVUz7uxuHVx7p7Dj8w8Pn8/Puxh0x7buU/OWEx+32sOO9PTHt1ZV1kd+7OnqivguFQgSD0aXgg4Fg5AXB5/UPq8Cz5wgviQrFZMXZ72LfMPdU3yBHCUB3Vy92h522lvaoQnHvbYq9fw6lsz32PtxQ3xyVoDvlCEvQdE+9SqpVKJRxPy1IS0/h9GEUGUrKCiO/FxbnxyxjmswmFi9fGLPf2ResJyEpIaZ9cKGi4bBaLZx38Rkx7WtPXXHY/RTjT1JyImdfsD6mfdHiuZHfC4qiFZeCwRCJQ+ZJYlICOQNFr+wOG+dcdHpMnyvXLInDiBWKiUdaegqnnrkqpt1mja7SnJmdTl9vP4Ul+bQPcsKcfs4pRzxGYcnwqlVTtTignjcoiYRTC01PsFUopjHKuJ8GmC1mbrzpuogig9Vq4Utf/yxzFxwq0V0xu4x7HrwjYozNqCjl7AvW01DXyEVXnIOmaWiaxmXvu4D1Z67hc1/6GHPm65USHQl27vrBV6iYU37EsZx1wXouuPQshBAYDAauv/Fqlh2DEoTixKJpGldeexGnnrka0F/8PnXLR1i4ZH5kmwWLZvOlb9wU0efe9u4uvvPA7WQNJMhm52Tyw1/cTcEg2dXzLzmTsy84DdCVQj7yyWtZOjBPFYqphtVm5aYvfIyFAypTNruNz3/pRpqbWgH9Xv3+D1/O9q27ueHTH8BqsxIOh9E0jWuuu5TV647sCKmYM4O77/9q5DqcM28mX/3250+4atUJYyDe/qBzSmhCheUopj1jppYjhCgEfg/kAGHgESnlQ0O2EcBDwPmAG/iwlHLL4fqd6qoPTQ0t7N9bhZSS7NwsWhpbMVvMzJxdFjGSjpX+fhdNDS1YLGY62jqpq24gLTOVOfMqIioMDXVNOPtdZOVk0tfbj9/nJzsvSy+IIqGgOC+idtLb20dLYxv2BDuFw2icj4TX46WhrhmT2UjAH6C2ugFHgp2Zs8tIz0jD7fKwf28Vrc3t5OZnM3N2KdYhnq0TxJRWJOns6Gb/nkqc/S5Kyoson1lyxCS0vbsO0NzUhslkpLA4LyYRururl62bttPX209JeRELTppDe1sn3Z09pGWkkJ6RRuW+GmqrG0hOSWTmnHKsVguNdU0YjEYKivIiybbHQ0NdEwf2VqNpGjNnl5I7kPQ7hZjSc3My4vV62b+3msb6FhKTHISDITSDhtFoRAI9Xb2kZ6ZRMbsMTQiaGlsxmoyAxGg04vP6MRgMEb32wuI8QqEQDbXNCKHXkTAPUZo6SGdHF/t2V+FyuiktL6K8oiRyL+/p6aO/R18FKK8ojcv1dQRO6NwMBwP07t1BQrHuXHI11pFQWIrRPkVfZhTHw7TJsh7LqzwI3Cal3CKESAQ2CyH+I6UcXGrvPGDmwM9K4OcD/05LKvfX8NmPfIXG+mYAsrIzuOb6S/nx93/F/EWz+f5Pv3lcxaYSEx3MmlPOU489xze//H3CA96NS646j8996WNkZmVEFSJKS0+J/J48jMxlcnISyclHr5lstVmZMauULe9s45PXfQGv1wfAqnXL+db3vsRz/3iRB+/9RWT7r971ea76wMUTTSZzUtPe2sG3vvIDXv3fWwBYLGZ+/vvvs+zkk0bc5503t3DLJ+6MxO7Omqt7CA+q0nR1dHPvNx/iX8/oSbVGk5Gf/OZeVq9bTnaO/vL4+stv87kbvhqJxT/vkjP48jduYsassrid2/49VXziutsiibqFxfn85Lf3HlFlRKE4VoLBIE8+9jzfvfPBSNsHPnIFe3dXct7FZ3DPnQ8SCulz/or3XcgtX/3EqNScjEYj5RUlh92mtaWdr3/hXt56TTeQrVYLD//xB8yoKOU3P/8zf/u/pwF99e3+h+/ijFGE9kwmIko5AwghVFiOYtozZmE5Usrmg154KWU/sBsYGpR9CfB7qbMBSBFCnNhSqROIF59/NWLYA7S1dtBY30xeQQ473tszYiLr0bB/bzU/uPtnEcMe4B+PP8/uHfuPu++job/fxQ++87OIYQ/w1qsbqdxfw4/u+2XUtt//9k+prW44oeOb6uzasS9i2IOe0Hfft35MX+/wpemdTje//cVfopLy9u46wJaNh9Ry9uw6EDHsQU+evfuOByIqHZ0dXXz79vujkmyf/8d/h032Ph7+8bfnoxR46msbefk/b8T1GArFYGqrG/j+XT+Javvzo09y9Qcv4Wc//G3EsAd44i/PsneYpNpjZee2vRHDHsDr9fHAPQ9TW90QMewBwuEw3/7qD2hpaovbsScEA9VpIwhNJdQqpj0nJOZeCFECLAbeHvJVPlA/6HMDsS8ACCE+LoTYJITY1N7ePvTrKcPO93bHtNVWN5CTm6X/XnP8Bm5fT9+wBlzXEZRu4o2r30XV/prYcXR2R714gG4k9nb3naCRHR2TdW4O9/9deaAWl9M97Pb9vX3UVNbGtNfXNh3qcxipPT00QO/T5XTT3NgaO5Y4SvSFQiG2vbsrpn06KjJN1rk5Gent7iMYCEa1hcNhwlLSOYwSWXcc77cdbZ0xbZX7qnG7Yq/lrs4e+vtdcTv2sRLPuSmlBG2Q517F3CsUY2/cCyESgCeAm6WUQy204eKfYpIApJSPSCmXSSmXZWaOrkLfZOTM806NaTtp6Xz27talARctmRvz/dGSV5hD+cySqDaj0XDCi0ilZ6Ry1vnrY9rzC3JjFFbS0lPIK5iYMdOTdW4Wl8b+f5953mq1b04AAHr+SURBVDrSM1KH3T47N4tTz1wT077wpDmH+hxmDq1dv5LMLL1QWnpmGqtOWRb1vRBi2LEcKwaDgQsuOSum/bRh1KKmOpN1bk5G8gpySBty7SQkOvC43FHCBUCkanK8GC7c7OwL1pOekYbBYIhqn7doNtk5x18B+niJ59yUMZ57JYWpUIypcS+EMKEb9n+SUv59mE0agMJBnwuApmG2mxasWrecD3/ifRhNRoxGA5ddcz6dHd2EgiFuu+PTLFw877iPkZuXzZ333MbMOXqMc3pmGt/54e3MP2n2cfd9NJjMJm749AdYu15PsXAk2Pn6d7/A7HkzeeiX34nkFhSXFvDDR+4mJy/rhI5vqjN3wSy+dd+XIy9Sq9Yt55Of//CICXuapnHp1edz+jmnIITAarXwyc9/KEoqddbcGdz7ozsHyt3r8nu33fFpbHY9GdrhsPOlr98U2Sc5JYnv/ehOKmYfWWXpaFh/1mred/2lGAwGjCYjN3z6A6xcreQ1FWNHTl4WD/7i7siLal5BDp++5SP85dGn+OTNH44oi6Wlp3D/z74V1xyTeQtnc+c9t0XUcU45/WQ+8slrKSkv5P6ffyuSOzVv0Wy++b0vRq7PKYMM65VpDyI0vU2hmMaMSi1HCJEK5AEeoEaOIltlQAnnUaBLSnnzCNtcAHwWXS1nJfAjKeVhtb6muupDIBCkqaEZKSEzK53WlnZMJiNtrR1U7ashOTWZOfMrKCwenTpNTVU9B/ZWYTAaycrOoLGuCUeinYLCPLq7ekhKSaJsRvGYnEtHWyd7d1fS3+ektLyImbPL0LTo90m3y0NLUysWqyUqWbizvYvurl7SMlJISx/em3wCmNKKJO1tnezYupv+PiczZpcye+7MqP+f3t4+dmzdQ31tIympycyeNwOfz8/enQewWC0sXDKX3LzsmH6bG1twu7xk52UOK7/n7HfS2tyBPcE27P7xIBgI0lDfhKZp5BXkTMVk7Ck9NycrXZ09dHX00NXZTVNDM0kpSchwiMTkJGw2K5pBo7mxFbvdxqy5M0ZcKRuJxoYW9u06QCgUYsassqhaJY31zfi8PnLysrE7bJH2luY2nH0usnMySDwxhv0JnZv+vh48bc3Yc/TVEG9HG6aEJKwZyiGkiEGp5QghkoHPAO8HzEA7YAWyhRAbgJ9JKV8aaX9gDXAdsF0IsXWg7XagCEBK+TDwHLphfwBdCvMjx3MyUwGTyUhx6aEbdtmMYp5/+kVuv/meSFLW6nXLuf3bNx8xlGb3jn3ceO2tkRj73PxsLr7iXH7xo0dZvHwh3/vxnZF4/njT1tLBnV/4biTRy2g08LNH7+PktdFhGXaHjbIhYUKgryhM1aIrE4HWlnbuuOUe3nlTV541moz87Hf3cfLapZFt/vv8q3zrKz/goAPgnAtPAwkv/FO/7GfOLuPBR+6OKV52JNnJhMQEEhJji6DFE6PJSEmZUsdRnFhSUpN48flXuPuOByJtF19xDo31zeQX5dHV0c3rL+upZ6edvZav33PbqO9z1ZV1fObDX6ahTl/cTkxK4Jf/90PmLqgAGFFJLSc3C6ayTIWUiEFqOSosR6E4fFjO39CTXU+RUs6SUq4diJErBO4FLhFC3DDSzlLK16WUQkq5UEp50sDPc1LKhwcMewZUcj4jpSyXUi6QUirX0hBqqxt44J6Ho9QW3nx1I7u27zvsfuFwmMf++I+o5NnmxlZcThfJKUm8u3Ebu7aNXZLhrh37ohQcgsEQ3/3Gj+jp6R2zYypGz67teyOGPeie7u/f9RN6e/W0mN079/PgvY8weGXvhWdfYsbs0sjn/Xuq2PLOIbUchWK6U1cTq5rz9BMvsHLtMp7+279YtPRQaOVL/36dPbsOjLrvN155J2LYA/T3OfnL75+MejZMR3QpzEMOWaHCchSKkT33UsrYrLRD320GNo/JiBRRuF1uWptj1QRGkiw8SCAQHFbesrWlnfTMVHp7+ujq7InXMGPo7Y414utrGvA4PaSkJI/ZcRWjo2cY9aHamgbcLg/JyUm4+l30DPN/GBiiCNIwSLpVoZjuOPtd+Hz+mPZgUL9u/P5AVPtw1+FIDKcutnfXfgL+AAabIXaHaUJsQi3Kc6+Y9owqoVYIsVAIcbEQ4vKDP2M9MIVObn72MSmMWCxmLrnq3Jj2mbPLqRvQjC+bOTax9gAlwyg4nHvRGSrUZoIwnMLGuReeRkaG/v+TV5jLgkFKOKCHVg2tbrl42fyxG6RCMcnIzc+JKgQIYLPbkOEwZosZ4yD1GiEEJWWjV4o65bSTY9ouvvJcrLZxqd49cZAyxnOvjHvFdOeIxr0Q4jfAb4ArgIsGfi4c43EpBkhJTeamL36MFQNqHxlZadz9wFdZuOTIRtXp55zC9TdejdFkxGaz8tFPXcuu7XtJSEzgOw/cHonVHAtmz5vJfT/+OmnpKQghOOOcU/jE564fUY1FcWKZM7+Ce390J6lpyQghOOv8U7nxpusxmU0A5OVnc9vXPs3i5QsAyM7N5N4f3Ynb6cZgMJCQ6OD2b9/MwsXHL8+qUEwV0jNS+cHPvsW8Rbr6WGFxPjd94QZef/kd7vvxNyK1SjKy0njg4buOSilq8fKF3Hr7J7HZbRhNRj54w5Wcee66MTmPyYQcqpajqZh7heKIajlCiF1SygnzBJ+uqg89PX001jVhtVlpb2qnqb6ZjOx07Al2mppayc7JQoYlHe2d5BZk4+p343K5KSjKpbe7H4NRw263U11Zh91hIzs3k9rqetIz0pgzbyZpGal0tHWxZ+c+urp6KCkrYvbcGaMyxl1ON3t27qexoZn0jFQsVgtNDS2UlhWRlpFKMBgkOydzMnqYprQiSVtrB7XVDfi9PjJzMiifWRKli+3z+dm76wDdXT3YbFZmziqlq7OX1uZ2DEYDxaX5dHf3sXfnfoKBEDNnl2IymziwrwZnn5PCknxmzSmjpqqBlqY2cvOzmTGzhOr9ddRW15GUnMTcBRXkFk3lbL8xY0rPzclEU30zu3bso6Oti/SsNELBEGnpKSSnJNLd3UdDbRMZmWksXDIXm81Ga0s7doeNtPQU3t24naoDNVitVvILc+nt7Wfu/Arcbg/7d1diMBqYPa+CcDjM3l0HMFtMZOdmkZBgJycvm462Dnbv2I/H42VGRSkVc8qjQ1TGhxM6Nz2tTYR8Xixpun5/oL+XsD9AQnH85EYVU4ZxvzhOFKPRh3tLCDFXShlb9lFxwkhJScJut/H7X/yFH/3gV5H2Cy47i9bmdjZt2MrHPvNBnn/6v7Q0tXHzVz/Bz+7/DQjB5770McKhMD/87sMEg3ryVcWccpasWMhfHn2S8y45g8998Ubu/eaPeOXFNyN93/eTb3DuRacfdlzBYJC//d8z3P+dnw07pju+cytXf+DiifDAUQyipamNL332W2zdvAPQiz/95Lf3subUQ0q0//nny9x+y3cAPYTg7vu/yl1f/UEkpriopICLLj+bnz7wGwAe+b8H+OF3f8GWjdsi+3z7/q/w0/t/E6lM+5FPvp8Nr29m9w49Ifzk1Uv41ve+pAx8xaSku6OHR3/5V/786JORtmuuv5T62iZWrF7Cg999ONJ+0RXn8OWvfzYiX/nyf97g1k/eGbknz5xdxvUfu5rXXtrAD7/7cKRa9Be+9ml+8/P/i+RIJSYl8Ku/PEhLUxufv/F2DuytBvTaIY/86QGWrjhUe2I6MDShFqExCrVuhWJKM5qY+0fRDfy9QohtQojtQgglkTEOVO+t5mcP/S6q7Z9P/icSsvPHXz/OOReeRigU4vE//oOzzj8Vj9uDq9/Nk399LvIQAdi3uzKiH//8P/7L3l0Hogx7gO9+/UFam9sOO6a66gYeuu+REcd0/7d/Sn1t4zGdr2Ls2LVjX8SwBwiFQtx3108iakZNja3c+80fRb5fvuoknnzsuahkwbqaBnw+P5aB1Z321o6IYQ96Wfgf3/crPn7TdZG2Rx/5K+vPXB35vOHNLezZOXrFEIViIrFvTyV/+f1TUW1/+9MzXHr1efzioUej2p954gX276sBoL21k58+8Juoe/L+PVX4/X42vL4pYthnZWdQW90QJX7Q3+fkyb8+x4F91RHDHiDgD/CTH/wKt9sT35Oc4EgZnVArlBSmQjEq4/436Hr153Io3v6isRyUYnj6+5wEh6iVwCElBq/Xh3Eg4bGpsZWMrHQAJNDc1BqzX8DvjxQtGk59p7urF7fbe9gxOfvdRxzTwQeVYuLQ1xOr0tFY34x34P/b4/JEzYmMrPSI930wPd29kcqYzn5XzPdtrR1RmvbhcJjQkAdvX+/oFUMUiolEX08/Q0NbQ6EQoWAYzzBGdn+ffk05nc5hr6fenn46BxnyaRmpw6ql7dt9YNj+66ob8HoOf8+ecoTDelXagwihpDAV057RGPd1UsqnpZTVUsragz9jPjJFDIXF+RQOUWJITEqIGNczZ5VFdJBPO2sNG17X1UotFhPrz1wT05/NbiMcDmOxmCkpL8JojJZTW3PqSrJzMg87pvyi3JgiRoPHNGvuDHLzx6YKqeLYKZtREhMqddHlZ5Oeqb8QZudlsnzV4sh3mze8xymnx6p15BfmRryKRSUFMRWI152xis0btkY+Z2al4+w79BJgMBgoLR871SaFYiwpLs0nLT0lqi07NxOX08XseTOj2q1WC8UDhQfzC3P1onBDKCjKY/HSQ2IJB/ZVM3+IahXAZddcMOy9+bJrzic1LSWmfSojw3JIQq1Sy1EoRmPc7xFC/J8Q4v1KCnN8yS7I5t6H7ozc/CvmlHPLVz/B4396mpVrlnDVBy7ixede4ZyLTmPm7DIO7Kvm/R++nPqaRvKLcrng0jMxGAxkZqXzpW98ln898z9Kyov46e++x4KT5vCT39xLQVEeQghOP2ctX/z6Z6LKmA9HekYq9//8WyxdsQiAWXMPjWnVKcu454d3kJKqdO0nGnPmz+T+n3+LrOwMDAYDF195Lh/55LURqcuEBF0N52AIjdVm4ZwLTuO6j12FyWwiJTWZb9z7RdIyUklMSsBiMdPX1889D95Bbn42QgjWn7maj37qWnZu14ulLVg8l+/9+Ot0d3QhhCC/IIcHfvYtZi+cNW5/B4XieKiYN5N7H7qTOfN1Q37+otl86MZrePbJ//Clr3+WNaeuBKB0RjE//d33KJ2hv8iazWau/uDFkXtyRlYaX/vOrbz16iYWL1/Ix2+6HovFjM1mpaSskFtv/ySOBDs2m5XP3PZR1q5fydwFs7jnh3eQlp6C0WTkfddfxuXvu3Da5TepsByFIpbRqOX8dphmKaX86NgM6fBMNNWH2uoGdu/YRyAQpGJ2GbPmzhjzY/Z299LV3k1yShKayYCz30Vaeioejxevx0tmVjrd3b2EgiEystKorW7AaDBQUJRHW2sHFqsFh8NGZ0c3CYkJpKQmAeDucdLW0IrH6yU9PZW0/EyMA9KIR8LldNPd1UNSUiJhGY6M6UgvBxOcKa1I0tLURl1tIwF/gPTMFMpnlsXo2Hs8Xjrbu3Ak2ElNSyEYDNLW3IHRbCQrW1enqDpQSygUorS8CH+/h4bmNnw+L+npaWTnZuL2eOnt6SM5NZnERAdul5u2Jl0xJCsvazxOfSowpefmRKS9tYNd2/fR1dlNcWkhcxdURBTAWhpb9RC1RAcupxu72Uywox9LWhJBIySnJQ/r5PB4PNTXNmGxmLFYLBiMGplZGYTDYVqa2zBoGtm5+jXS0tyGDEty8rKijNn21g78gQBZ2Zkx1+84cULnZn/1fgx2OyZHIgAhvx9vWzMpsxccc5+KKcu0efM9onE/0ZhID6nK/TV8/NpbaW/rBPTCUb/6y4MsWjLvCHtOPDx9Lt7+7Qu07a6LtK348NmUnDxhVFDHgylrQDU3tnLzJ77G7u26ao2maTz0y+9w6qBk16PF3eNkw6+eo+NAU6Rt1Y3nU7h07OopTGOm7NyciHR2dPP1L97La//bEGn71n1f5rJrzo/aLhwKs/c/m9n+1BuRtpJVcznp6lMx2ywnbLzjzAmdm31V+zAlJGC067k94UAAd3MDqXMXHXOfiinLtDHuR1PE6lEhRMqgz6kDha2mPW+9ujFi2IOuC/67X/yZwJAS45OB3oaOKMMeYOvjr+Lqik20VUx+dm3fGzHsQU90ve+un9DT1XvMffbUt0cZ9gDv/vVlPD3OY+5ToZgI7N9TGWXYA/zg7p/S1NAS1eZs62bnM29FtdW8tYu+pk4UY4QcklCrqYRahWI0MfcLpZQ9Bz9IKbuBxSNvPn0YTu2grqaRwDDqMROdgMcX0+Z3eQlNwhcVxZHpH07ZpqUdr/fYlTaGm0O+fg+hSXg9KBSDGU4Jqr/PiWeIMk3QFyQcijUsA15/TJsiPsjw0Jh7TU+yVSimMaMx7jUhROrBD0KINEZX/GrKs3pQwZ+DXP3BSyZlnHliThraELWcvIVl2NMSx2lEirGkfGZJjLLNZddcEJFPPRaSctIQQ/osXD4La0rCCHsoFJODkvKiSD2Hg6w+dQW5Q3JGHOlJJOdHX0Mmu4XErJSxHuL0RQ4tYqV77idbyLFCEU9GY9zfD7wphPi2EOIu4E3gvrEd1uTgpKXzufv+r5KZlU5iUgI3feFjnH7OKeM9rGMiOS+ddTddSnJ+BprRQPHK2Sy64pRRJ9QqJhez583kR7+6h+LSAqxWC+//0OVcf+PVGI3H/t6eXJDBKTddQlJuGiabidI185h34cmR2gsKxWSlfGYJP//995kzbyZmi5nzLzmTL3/jJuwOe9R2lkQbJ3/0PPIWlqEZDaSX57HupktJyEwZn4FPA4ZKYUa8+Mq4V0xjjvjUlVL+XgixCTgdPRnhcinlrjEf2STAkWDn4ivPZfWpKwgFQ2TlZJxQGbK+li66alpxd/eTmJ1KemkO9tRDnnYpJT317XTXtSIMBtKKs0nOG94zK4Qga1Yhp912JQGvH2uSHcMoDb3e7j52bNtDbXU9+QW5zFs0i4zMY/cAK8Yek8nIujNWsXDxXDxeXWFpqGEf8Proqm2jr6kTW0oCaSXZUfNrKJqmEU60IJYU4OnoRszMxJRkPew4pJR017fTU9uKZjSQVpINQqOrpoWQP0BKURZpRdkIbdrkQSkmIEII5s4q5777bsftcpOWkUJCShKN2ypxd/SRmJNGanE2FoeV5PwMTv7YeXh6nbjaeumqbsHT6yatOBt76pFXsaSU7Nm5n13b92E0GZi/cA7lFSVjf5KTFSkRYoifUtN0icxR+S8ViqnHiNabECJBSukEGDDmYwz6wdtMZzIy0074MV2dfbz72Cu07jpUT2zu+SuYc/6KiFHeWd3MKz98glBAL3FutltYf+uVpBSMXJjKbLdith/eIBtMwB/gD79+jEd+/IdI20VXnMNXvvU5EhNVOMZEJyUtmRSGr0NQ+/Zetvz5f5HPWbMKWHnDediSHMNu39rcxm2f/gY739sTafvuQ1/jgkvPGvH4HVX6HA0H9Tm64JLV7H9pK94+vaqx0DROvflysioKjvrcFIp44elz8c7vXqBtb0Okbf7Fq6h6bQfubl10YN6FJzP73OUYjAYMRiNN71Xx3t9ei2yfu6CE5R86G2uCPab/wWx7dxc3vO9m/D49Tj8pOZHf/PUhKuaUj8GZTX5keEhYDnrcPeHw/7f33mGSXNX9/nuqOk9OO3FzzqvVKmcBQkgCgcggkjEYm2gb+4fx1wmcMEYGEyyTLYxJAhEkkSQkFFZahZW0Oc9Oznmmc9X9/VE9PdMzPWlnemZ65r7PM7vd1VW3TnefvnXq3nM+F8wJDtJoljiT3db+TEQ+JyLXikjyai4i60TkvSLya+DmzJuoSUdvY0dKYA9w4jfP09vQCTjqJ6cfeSkZ2ANEgxGaD52bUzvqahv4xlf+L2XbL378a2pP60WMs5nBzj4O3fdEyrb2k430NU2s+nHi6JmUwB7gs5/+Mu1tnWn3t+IWp37zfDKwd3ndREORZGAPzoX7+IMHiOvCbs0C0tfYmRLYg9Pfrtw3sgrtsQefYbC9F4DBjl6O/Gx/yv4th8/T39w96Xksy+K737w3GdgD9PcN8OhD+yc5ankzdhErAER0Ua1mWTPhyL1S6mUicgvwR8BViULaGHASeAB4l1KqdaLjNZklHhkf7NhxK6luoyzFUOd4WcPhUaa5IhQKY1nWuO1DwdCcnkczv9ixOPE0Ch/ptg0THAqO29bX008kPF5FB0BZNkPd/cnnpsdNLDS+/WDPoHMDoOs/NAtEuv42Ho5ijqonUbad7H+tWDxlYGWYqVRzLMsaJ68JzgJWmglQavzIfSItR6NZrkyakKaUelAp9Xal1BqlVL5SqkQpdaVS6p90YL+w5JUX4Q6kLopSvKacvHJH2Mh0m6y/dte446r3zO0KujWrqsZNFxeXFrF6rU6jyGYCxXlU7VqXss30uMivmDgFbd3GNbjHBOCvfv0rqahMvwqty+tmw3UjC81EBoLklo1PEdpw3a4ZpYppNHNNfkUxpid1LKx86yq6akcug4Ury8gpdfw3pyR/XCqZ2+chv7yIyfB4PLzpHa8dt/1lWSrUkGmUUmmDe0SctByNZpmiq02ylOLV5Vz5/tso21hDoDiPmr0buejNN+AfJTtYuWMNF73pevKrSyioLuWy99xM6frKObWjqLiQf/3C3/DK224gLz+Xq667jK98+zNUVVfM6Xk084vL62H3669h3TU7cAe8lK6v4rqP3EF+5cTB/aat67n7ns+yY89W8gvyePsfvIH3f/gd4wL+0VTtWseeN16LLz9ATmkBeeVFXPG+W8ktL8SbF2Dn666iRq9wq1lg8iuLue4jd1C6vgp3wMu6a3aw/dVXIKYQKM5j1SWbuew9N+PNdWSQ3X4ve9/+MtZcuY1AUR4rNq/k2o++Ljn4MhnXXH8Zn/j7j1C2ooTqlZX8yxf+H3su3pHpt5idJAL7sWk5jta9Du41y5eMadQlVrG9DWhXSo3rmUTkeuBnQG1i00+UUp/KlD2LjaHOPjrPtRDsHqBodTklaypw+z30NHTQebYZlKJ0fRVFq1JHPSMDIbrOt9DX2ImnuojQugKaXEPkri5ABZyvs6+pk86zzRhuFwN+aC114XG7GDDj1D1zEl9+ABGhv7mLnLJCStdVEijOu2CbNmxeyz/e9Un6evrIK8jD79ejrPNNZ1sXh184xsmjp6lZXc3uvdtYuW7lpMcMtPfSdbaZcP8QJWsrKVpbjss9EojnlRex9y03sO3Wy3H7PCiB5/a/wEsHj5KbE2DPvp2UlxTRdaYZK2ZRsr6SdZWVfPr/fZRwKExhUSEBw835p4/T39JFfmUJxWtWEO4L0lXbSqAol9L1VWx62V5WXbIZMYxkcLRiSw123MZfkL54V6PJFP1tPXSdbSYyGKJkXSVFq8txuV2IARtfdhFWLI474EXZNqv2bWGoq5/ClWUoFOcPHGdgcIi24CCDwSDeAg9NFS5Wrysi5p1edWdRSSFve8/reeWrb8Q0DQqL0he8a9IX0wJOzr1Oy9EsYzIpQP1t4EvAPZPs87hS6rYM2rAoCfUM8tTXH6T7/MgKt3vfegOl66r43Wd/gBV1VvQ03SbX/9kbKFnrjLbHY3FO/OY5Tv72eTbcegmf/9f/4qknn0+28f4/uZM73/U6Hvncj4gFI6x84+V88I/+mnhihdDcvBy++JVPM3CqidO/eyF5XNmmGi5++408861fj7dp/eQ2DeP1elhRMbEKjyZzxKIxfnDPT/nvL4381C674iL+6a5PsqIqfUrMYEcvj3/xPgY7RuoyLn/fLawaM0pumCaBxGzQ4w89xYff90nsxIhYcUkhn/qrj9D68GEANt64h7YT9cmiwRWbV+IrzKH+wEiR7apLt+AOeDn76EsAFNaUcfWfvGbcYmneLFwITpP9DLT38tgX7iM4qhbkqj9+Nf6iXA7+4FF66pzc9+o967Eti5bD55P7rb9uF+HBEE/Wn+HJ/c9zxdX7+L9v/zj5+mVX7eUz//l3FJcWTsuWktKpR/mXPcoeL4MJjnSuHrnXLGOmlZYjIqaIVInIquG/qY5RSj0GTC4NsEzpbepMCaIBDt/3JL3NnckgGsCKWZx78mjy+WB7L6ceOgjAgGGlBPYA3/za92msbyUWjLDq8q388Pu/SAb24Cyh/uT+5+k615RyXMepRnobOtLb1DS5TZqFp/bUeb751e+lbDvw1AucOTGxMlJPfXtKYA9w6N7HCQ+ML4oFGOwf5Gtf/k4ysAfo7urlTFNjMhfZk+NLUQMp21idEtgD1D9zIiU1rLexg97GjineoUYzP/TUtaUE9gAv/eRxBlp7koE9ODelowN7gHOPH8a3oZzvffdnvOyV13Dv936R8vqBJw9y5tTcqpUtd1S6fHsAnZajWeZMGdyLyIeBNuC3OCo5DwD3z9H5rxCRl0TklyKyfRIb3i8iz4nIcx0d2R8IpJP1i0WiKUH0MKHuEXUbKxZPLqkdiaRRMonFiUad7Z5cHx0d4++tuju78QTGj4paadQgpmPTcmcx+GY0EiWWxqdCwfCEx6T7XqPBMHYahQ9wfKG7u3fc9oHBYFIxRFmp0nMTSdGNPYeWucwMi8E3s410ajbRwXBSBWeYdL6tbEUsHsOyLEzTTJGzHCYUmvg3uZyYM9+07bQL3ImIDu41y5rpjNx/FNislNqulNqZ+BsvwzJzDgKrlVK7gS8CP51oR6XUV5VS+5RS+8rKsj/1I79yvPLCqku2kLuicNy+667dmXycW1ZA0WonzWJFcdG4XMx9l+6isqocgPr9x3n9G28Z1951N16JPUa60u33kl9VckE2LXcWg2+uXFPDJZftSdlWUJjPuo1rJjwmv6oEw0z9+W+4fldKQfZoisqKedPbXpOyTUTYun4t0SEnYBFTMN0jecWRgWBSPWSY3BWFWPER/zPdJgWVejXjTLAYfDPbKFpZNi5Y3HjDHvIqinF5R+pR4hFnFe/RFK4swxeFHTu3cPzIKS6+bHfK6/kFeaxbvzpzxmcRc+WbTs59mjBGp+VoljkyPBI84Q4ijwCvUEqNH+qbqnGRNcD96Qpq0+x7HtinlEq/4k2Cffv2qeeee26mpiw6Os+1cPT+p+hv7mLVpVtYf81OvLl+Wo6c5+gDT4OCra+6lKrd6/D4RyQv+1q6OfXQ83Sdb2PFy7bzra/9gGNHTnH9jVfwtne/ntXrV9J2rJ4jv3iKsovWcqarnf/5xo/wety870/upCRiUFhezEBbD80vnaVw5Qq233oZxWsqLtimJUya+d6JWUjfPH3sLN+/5z4efXg/W7dv5H0fvJPdl0x8E6ZsRceZJo78fD9DXf2sv3onq6/YRs6Y3PfRtDW08av7f8f3v/tT8vPz+MBH3sXG6iqO/vQprGiMrbdchi/Pz8mHXiA6FGbF5mqqd2/g1O9eoOtcC6Xrq9h44x5aj9Vzfv9R8iqK2HHbFZRuqMrER7LUyRrfzCZs26bjVCNHfrafUO8Q66/bxerLthAoyqPlaB0nf/McA23d1OzdxMq9Gzjx2+fpPt9G1c61rLlyG6cffQm7yM9vnnialetqqD/fxJOPHmD7rs28/6PvYseuLQv9FueDefPN2NAAwaZ6AlWp4gGR7k5Mnx//irlVh9NkPTPyzWxmwuBeRP4s8XA7sBknHSe5Go1S6q4pG58kuBeRCqBNKaVE5FLgXpyR/EnvNrLtIhUZDNF1roXOs83kVRRTtrGa3MRoZjwaIx6J4c3xp4wWRYNhUE4OczpsyyIyFMHt9xCNRunvGaCvp4/nD7xEW2sHF1+ym517thDICeDN9dPZ1olpmhSVFhEecNIoTI+LyGAYOxqj63wrvfXtFNSU4SvIIdQ7SE5JPj317YkgbWVC31wx2NFH2/F63AEvKzavpLC6dD4+xoUiqwKoWDRGV3s3+UV5BHImX+I+eUzYSb3y5QdobW7nhWcPcerEWbbv2srOXVuwuofoPNNMXnkhpZtqiPQHaW9qx+NxUVpTjgIGWrtRlp2Y5RG6zjYz1NNP6bpKCqrLGOzoIdwfwpfvJ6+8mGDPAMHuATx+L/mVJeSlmR3STElW+eZipKe+nfaTDVixOCu2rKR4TQWG4YwCx8JRrFgcX16A7ro2Ok43MdTV56g6iUF/Sxd9zV0U1pTiLcglNhSi+3wbxWsqyK8sxluYQzAUIpATIDgUJCc3B58v/YBINBLl8IvHeWb/QQoK87n0yr1s2Lx2Pj+KuWb+gvuBfoKtjQQqU9cUiPR0Ybjc47Zrlj3LJrifTC1neAivPvHnSfwBTLmus4h8D7geKBWRRuDvADeAUupu4A3AH4tIHAgBb5kqsM82bNvm7O8PceQXTyW3Fa8t56oPvBp/QS4ujxtXGg3wqRbsMUwTf2JK2OV20Xy+mY9+4G+SKxt+62s/4O//+ePc8fZXA1BaPhKA+/JGgj7TZfDCD56g8fnTyW01ezdQtmkl++++n8igs8rssQcOcNWfvBrD5eLxL96X/PY9AS83/PkbKVjaAX7W4Pa4qagpn9kxPg9un4e+3n7+6W/+g9+PWub+zW9/DfvyK+k7345hGux543Uc/MEjKd//5ldczOGfOcdc+u6bOPbAgWSh7mleYNcdV1P3zEn6EkWzK/dtIjoUpu14PeDIbV77kdeRU5I/27ev0Uybnvp2Hvncj5Irz8r9T3Pdx16fXHhq+HfR29TJ09/4JYPtvQDEQlEG2nroHrV41Ybrd9NxqpG+5i4A1l65nYvefB0lpc6aEFNJAz/95PN86D2fSD4vLCrgWz/8Aus3ZXWAPy8oZY/TuIdEzr2WwtQsYybMuVdK/YNS6h+AY8OPR207PlXDSqm3KqUqlVJupVSNUuobSqm7E4E9SqkvJfL4dyulLldK7Z+qzWxjqKOPY798JmVbd20bfU1dc3qeE8fOjFuy/Euf/yZNtU0THOEw0NqTEtgDNB+qxYrGkoH9MEd+9hTtJ+pTbuuiwQjtpyc/hyY7OHemLiWwB/jh//0C9yonH75822pqnzo27vuPBiPJXGQrGh+nwHPiV8+y6eV7k88bnjtF6fqRNJyBth6tlqOZd5oPnUsG9uCkqZ16+OC4eqTeho5kYA+QW1qQEtiDo5JTtXtkle7a/UcZaOtlOgwNDvHlz30z9Zw9fRx89vA038kyZ8KcewNl6eBes3yZTkHtX01zm2YMtmVjx8erj6TbNhuiadRGhgaCxOOTl0lYaewQQ7Bi44+LBSPjtgHE06hLaLKPdMoeSiniiWDH5XWn/a6tWBzD5RTR2mkupvFIDNNMXbxn7ASdNYFCj0aTKSJD41VrIgOhcSo49pi+MJ1Kjm2NHz22puh7h4nFLfr7xquPBYdCafbWjEUpNcHIvaELajXLmgmDexF5lYh8EagWkf8c9fdtYMbFtcuRnNJ8qi9an7LNk+Mjv7J4Ts+zcdNaPF5Pyra33Hk71aurJz0ur7yIvBWpC6XklhUSKMobpxix6RV7x6maiAhlGyc/hyY7WLNuJVU1FSnbdl+0HdeAE9C3HaujZu/GlNdFhEBxXlItx5cfGKe4tPryrTQcPJV8nl9ZTKhnJJhxed0UVGm1HM38UrNn/bhtG2/ck5R1HaagujRFJceKx/HmpUoJr9i6ku66kTVCilaWjetXJ6KwMJ93ve/NKdsMw+CifVNqUGiYaoVaPWigWb5MlnPfDDwPvCbx/zADwJ9m0qilgsvjZvcd15BfUUzDc6coWl3Olpv2kVtWOKfn2bZ3K1/5xr/wzf/+Hk2NrbzmdTfxyltvwOWZfAFif0EOV37gNk7/7gXaTjRQsW0VRavLOf/0cS57z82cffww4b4hNt64h5qLNoLAvjtfxqmHX8Cb62frLZdSvGZmOd6axUl55Qr+8xv/zHe/eS/PPvUi17/iSu544y2Ez7ZjhOP4i3Kp3r2OnJI86p87helxsfH63YhhsOkVF2O6DMQ0uOoDr+bkQwcZ6uyjZu9Gqvesp3b/UXJKC6jYtpq1V22j9Xg9uSsKya8sYevN+3Rwr5l3itdVcPUHb+fYgwewIjF23H4lZZvGD1SUrKvk2o+8lpMPHSQWjGK4TK78o9s4+9ghus61UrF9NRVbV9P4wmlySguo3L6GDdfvwps7/RWWb7r1ekzT5H+/dS+lZcW878PvYNuuzXP5dpcuynZkL8cghl7ESrO8mY4UplsptWhWmclG1QelFNGhCC6fC9M1PuDuONNE69E6LMtixcZq2k82kFtWgC8/l9aj5/Hk+CjfupryLSvTtO7Q39JNb0cPsXicvNwAHaeaiEdjlG2soa+lCzsap2RdJe2nGvHm+KjYvpqCqlKGugfoqWsj1DdEoDCXotVluDwePDk+4tEYdtwaV+AbDUYwXEbaYuAlRtYqkoQHQ3SebqL12Hm8eQEqtq2mbENq8NLX3EXrsTqGuvqp3LGG0nVV4DIIDgXJzcshHorScbqJtuN15FeXsmJjDQPtvbQfr8MV8FGxbRXKtmk9Ukc8GqNy22oCZfn0NXURDUbIKyukeHU5Lp+HWCiK2+9JautHh8IYHhcu9+Q3oJoJyVrfnE9sy6Krto2Ww+cw3S4qd6xNGZCIRWJ017bQcbqJvPIiBtp7iA6GKF5bicvjor+1h2DPICVrKwj3DeEvysXldRMLx7DCUfKqivAX5BEoysOKxnEHPEnFnZky0D+I2+3CN0UBbhYwb74Zam8hHgriK0nVyo+HgkR7eyjYuPWC2tUsWZaNWs5kUpiHmUQVZ44WspoxS+0i1Xm2mSe+/DOiwQi7X38Nh3/6JIbbxUVvvp5n/+c3yf3cPg9X/fGrWbF5fIA/0N7LI3f9iHDvEDtfe5UzGjW8AqnA7tdfy6GfPI5hGmx/9RUc+skTePP8XPex13PkZ0/SfKg22dbqS7ew92034vZ5xp1nGZK1AVTt/qM8e89vk889OT6u+eDtlKxzdJ8H2np45HM/ItwfTO5zybtewdornIWibdvm+C+f4egvngbAcJnsvuNqXvjh75P7u30eNr9yH0cSajkIXP7eV3Hgm79Ojppd9Obr2XjDnky+1eVK1vrmfNJ2ooHHvvCTZJ2H6Ta54eNvonh1eeL1ep78r1+w+aaLOfXwCym1Rbtefw1Hf/5UsgZp66su5dwTR1h75Tbqnz1JMLFS9+abLmbHa67EdJlogHn0zWBrE3Y0grc4VbHNioSJdHVQsGnChe81y5NlE9xPNsRwG/Bq4FeJv7cn/h7E0aTXzAFdtS3OKGd5ET317diWzeaX7+X0715I2S8WjtJxtjltG7317YR7h/Dm+gn1Do4E9gAKml48S9nGGqyYxWB7L/7CXCIDji7z6MAeoO6ZEynqEJrsY6hngBO/Tr1YRofCdNeNqHz0NLSnBPYAh+97klDfkNNGZz/Hf/ls8rWKbas5/3SqSFYsHCUWDI/kJCs498Rh1o9awfjIz59iqHt8waBGk2msuMWphw6mFHBbMYvml84mn3ecakTZNlY0Pk404PxTx6jcOSJHee7xw6y8eCNnfn8opf7k1EMvMNTRm7k3opkQZduQZqZERKflaJY3E86JK6XqAETkKqXUVaNe+oSIPAl8KtPGLQeGlUIMl0k8EZSbHldqgJ7ATrMNSMq3GS4z7XFWNIY7oYsfj8Yw3Ql1k3jcuY8dMz+TTkVHkz2ouE08jYLSaFWadIpNVjSevCAq206RkjPc5oRtDqfaAMQjcczRBYixuL7IahaMWHi8yldslOpTPBpHDCOt0pM1qq909nWe27E4xigFKGXb2GlUdDTzwAQ69xii+x3NsmY6yYE5InL18BMRuRLIyZxJy4uSNRWIYdDX3Enpeidl4swjL7H26lS1BDGEkg1V6ZqgoLoU0+Mi1DtIXkXRuImn6t3raT/ZCEBhTRmDHX0YLpOilSvIH6OAU7ymQq8YmuXklhWw4drUrDnDNChaNZJrXFhTNk4ZZPNNF+MvzAUgUJLP6itG8lXbjtWz8uJNKfuLIQSK8oiOGvFce8U2zv7+UPL5xht2EyjOQ6OZb0yXyaYbL0rdKFC9Z0Py6YpNNVjRON5cPzJmBHjlvs20HDmffL7m8m00vXiWlZduoeXIyIxnzUUbyC3Vi7AtBBOp5Tgj93qQSrN8mU5B7cXAN4GCxKZe4A+UUgcza1p6llruqB23aTtRT90zx/Hm+SlaVc7Zxw6zct8mDBFq9x/FHfCx8YbdlG9dicuTPhe+q7aF2iePIoZB2aZqap88SjQUZf01O+ipa2egrYd1V++g4eBpBNj08r2UrKtkoK2Hc08cofVYHVU717Lmyu3kl09Pxm0ZkLV5zQMdvbQcruX8U8fw5QfYeONFlG9dlVLs13WuhZMPH2SwrZf11+6kavd6/AUj9+1DXf00PHeSugMnKFpTzvprdtJT107t/qN4cnxsvPEiUIqTDz2PFY2z7pqdFFSXUPvkMSIDQco211CzZwOBIh3cZ4Cs9c35JBqK0na8jpO/eR6Xz82Wm/ZRtrE6eWMbDYfpONlM6/HzFK+uoOH5U4T7hlh5yWZyywqoP3CCwY4+avZucGZGYxaF1aU0v3SWnvp2Vl++lVWXbNY+nsq8+eZg3VkMjxd3XurNlVKKwdrTFO28OP3Ivma5smycYcrgPrmjSH5i/74pd84gS/Ei1VPfTuMLZwj1DbJy3yYKqstAwWBrN+GBIMoU3C4XjS+cxl+QR9WutcnCyGH6mjppfOksg+291Fy0gdL1VZgeFy6Pm3g0hoiB6TaJRWIYppFS/KVsRTwaw+V1644wlawPoCJDYUyXmaLVPRorbmFbNm6vm56GDlqPnqe7ro2yjdWUbaxhqKuPgbYevHkBStY4iiG9jR0YHhclaysoXlVOeDCIHbcJFObS19xF80tn6Wvtpmb3eso21cxIFlAzbbLeN+eT0X0gOMFf9/lWWo+cJ7e8kJ76DmKhCGuv3o7pdtNT30Z0MEzx2kq8uT7ajtXRXddG9Z4NlKytwFeQw2B7L20nGug620z5NkfNTAf5wDz65sD505i+AO7c8Z/7QO1pirZfNG5GRrOsWTYBzoQ59yJyp1Lqf0Xkz8ZsB0ApdVeGbVsW9DZ18shd9yZX/zy//xhXvO8WxDTYf/f9yf1cXjdbb76Ewz/bz/mnj3L1n9xO0aoVgKN88ujnf0xkwFnVsO7p4+x9641suM5JzRgtWelOE+SJIVodZ4nizZlcVs90mZguk8HOPp777sP0nHeKbpteOEPN3o34C3I4/ciLAOSUFVK1cw2nf+c8Nz0ubvz4m5J+ONjRy2P/+RNCvU5Rbv2BE+x+/TVsfsXFmXlzGs00GSvb232+jUc+dy/bb7uc577zcFIRJ1CUx+nfvZCSarbjNVdw6qGDRIMR6p85ya7XXc2aK7bx7D2/petcCwD1z55kzRXb2PuWGya8kdbMPcq2xy24OIyjdW/p4F6zLJnM64fn5/Mm+NPMAV3nmpOB/TDtpxo49sCBlG3xSIzIUBiXz0Oo1xk9HaanoT0Z2A9z5Of7CfUOZs5wzZKir6krGdgP03jwNMXrRlatHeroTVnzwIrGaT/VmHze29iZDOyHOfrAAYa6+jNktUZzYTS/dBaXx0W4bygZ2CPOLGZ0jGrOuSeOUD1qRdtjDx5goKM3GdgPc/6pYwxq1Zx5xcm5nyCM0Yo5mmXMZGo5/514+BmlVHie7Fl22Fb6tKh0aibKtkfPnIzaPr4NZdlMN+VKo5nwIjjGhcb6lLJG/DRdG8qyJlktQ6NZGKy4M6Jrj/JZSScdhtMXyyh1HNuyYQJ1nHR9sSaD2BOo5ZAYubd0Ua1meTKd+aojIvKkiPyriNwiIgVTH6KZLiVrKzDGLH5SvKaCLTdfkrLNMA38BbnEQhHcAS8F1SOLdhTWlI6bCt5y8yU6/1MzbfKrSsgbU0i9YrOzIu0w3rwA9ig5Tad4e2RRtYLqUtwBb0obm15+sVbL0Sw6qvesJzoUJqc4P5nWoZTCcJnjVKTWXLEtRRt/08v2kFtWMO73UrlzLblaaWxeUUql1bmH4bQcPXKvWZ5Mq6BWRFYB1wBXAbcAvUqpPZk1LT1LrTBMKUVXbQtnHnmJYPcAG67fTfm21QjO6olnHn0Jb16Alfs2UfvUMbwBH+uu2k7ZppqUdrrPt3H2sUP0t3Sz9urtVO1chy+hba+5YJZV0WJXbSt1z5ygu7aFFVtWUb17Hd3nW6k7cJLiNRWsuWIrwa5+Tj/yIr68ABtu3EPpuqqUnNee+nbOPn6Y3sYO1l65jaqd65Lympo5ZVn55lxjWxadZ5o5/8xxStdW0XKklmgwzOZX7MMT8HL2sUMMdvax/pqdFFSVcO6JI/Q0dLD2im1U7XJ8ur+lm/MHjtF+ooHqPRtYefEmcsv02Bfz6Ju9xw/hr6jCcI+vGQu2NOGvqMKTp78TTZJlU1A7HSnMGpzA/jpgN9ANPKGU+pfMmzeebLhIRYNh2k82UnfgOLllhay6ZHOy6DAd3XVttJ2sJx6KU1hdQn9bD4PtPay9ajvFq8sx3W7EEGIRZxEVY4KRCqUUtmXrZdDnjiUTQNmWRde5Vs4/dQzbslh39Q5AaHjuJENd/VTv3Uj5lpXkFOcTi0Rxe0cullbcWahqePrbsixERPvhwrJkfHMmhPqGaDtWR8PB0xSvLqdm70YKqkqmPjCBbVl01bZSu/8odtxm5b5NBLv6KFpVTkFNadLvla2w7REfnsynrbilfT2VefPNnqMvEqheheEan2EcamvBV1KGp7D4gtrWLEmWTXA/Yc79KOqBZ4F/Vkp9IMP2LAkanj/N8999OPn83OOHufEv35z2ItTT0MGjd91LPDKy+uf22y6n+aVz1D1zgus/9npWbHZSH9Ip3YxGRPRFRpOWrtpWHr3r3mTOfE5pAacfeZFYoniw5ch5dr72KrbefElKYA+M8ynTnNzHtB9qMoFtWZx++CAnfvM8AC2Ha6ndf4wb/vwN5JRMbxGprtpWHv3cyO+g/tkT7L7jGn737z/kmg+9lsrtawBHQcw0Rnx4Mp/Wvr5wKDW1Wo5GsxyZTs79RcA9wNtE5CkRuUdE3pthu7KWcP8QR+9/OmVbLBylp7497f5dtS0pgT1A3TMnqNy1FhSceexQ2uM0mplQd+B4SjGsiCQD+2FOPXSQgbae+TZNo5kWQ139nHr4hZRtwe5++po6p93G+adTfwcoaD/ZQPHqck49dBArjZCBZnGilILJ1HJ0Qa1mGTPlyL1S6iUROQucxUnPuRO4FvhGhm3LSpQa/mfcKxMcMFEjidEIrb6gmQPUmLqydOl4SimUlrbRLFbUBF3rjNpI5/cAoosvs43EdXJCtRwthalZxkw5ci8izwFPAa8DTgDXKqXWZNiurMVfkMPWWy5L2ebyuilcmT7nvmRtxTh1hlWXbqHlcC0A6xMLUWk0s2H1ZVtSsg1Fxi9ctvHGi8gv1/mpmsVJTmk+G2/YnbLNX5gzo5z71ZdtHZd1W75lJd11rWx6+V6dYpNFKNuGCVJywEnLsePxebRIo1k8TCfn/lVKqY6pd1veKKUQEWzbZtW+TXhzfdQ+eZS8FYWsuXI7haOkK0dTtGoF1//5G2g9ep5oMELR6nIG23oo37qS9dfsomR91cg5bJU2v3Ci7Zqlx7CfTfj6GF8Y3r9kXSXXf+z1tB6rx1Y2pRurKdtUTd2BEwx19rFy32Yqtq5K34b2L80iwDBNNr/iYvKrSqg/cILidZWsvnQzOaUjaii2bacUeo99Xryugpd/4q2c/M3z2JZF5c619Da0c82HXktZoq+d6jemWSTYNjJRSg44aTk6uNcsU6aTlnNBgb2IfBO4DWhXSu1I87oAX8CR1gwC71ZKHbyQcy0Utm3Tda6Fs78/RH5VCbllBdTuP4bpdrHumh1c9SevxuWexlLkCoJdAwx1D1C6vopNN14EhtB+soH9//VzvPk51OzZQO3Tx8gpzmfNFdsoWllGf0s3dc+coONUIyv3baJq17ppF5Zpsouu2lbOPXGYoa5+1l+9kxVbV+HNGVktNtg9QNOhszQ8d4qyjdWs2reZ/tZuzj5+mJySfNZeuR0rFqevpQtsm5K1FazYUsMlm16RbKO/rYejDxyg7Vgd1RdtoHzrKrrONVN34AQl6ypZc9nWlPUVNJr5xl+Yy7qrdrDuqtRLymBXP23H66h/5iSBojzWXLmN6GCIs08cxu33suG63ai4zZnHXsIwDNZfv5vSdZUYpknf6nLOPHGIcN8Q7ScbCPUFWX/tTsq3rExZkVmzuFC2jUyg2AUgpoEd0cG9ZnkynZH7C+XbwJdwinHT8SpgY+LvMuC/Ev9nDd3n23j0rnsRw+Tirat4+uu/TL7WcugcV33wNVTtWDtpGz31bTx614+wEosDtZ+o55J3vgKX181TX3swuV/Dc6fYftvlHP7pk9QdOM51H72Dp772AIMdfQB0nm2mq7aVfXe+DJdnGjcUmqyhp6GdR++6FyvmXKjaTzSw786XJ+QsIR6JcfhnT1J34AQA/S3diGlw7P4DyTbqnznJ1lsupeXQOcBRx7nij25l5UUbAacQ/OmvPUBvo1Oc2Hm2mYptqxFD6DzTTOeZZuqeOcGNH38TuaVaN1qzuGh87hSH7nti5PkLp9n6yktoP97gzFytqeDQT0a9/uIZrv/TN2C6TX732R+x4zVX8Pz//S65Mnj7iXoueddNrL1i27y/F830ULY14QJWAGKYuqBWs2yZjlrOBaGUegxHE38ibgfuUQ5PA4UiUpkpezJB65FalK1Yd+0Ozj91LOU1pVTKqoYT0XmuNRnYD3PswWfoqmtN2WbHLcL9Qdx+L9GhML2NHcnAfpj6Z0+M26bJfnrOtyUD+2GOPXiA8EAQgKHOPuqeOZF8rWrXOs4/dTxlfysWJx6OpayGXPvEUexEwVl/S3cysB+m9VgdRavLk8/DvUP0N3fNzZvSaOaIgfZeTj+SqqJjRePYifUYilaX036yMfUgBeefOkZvQweGyyA6FE4G9sMc/+UzRIfCmTZfc4EoZU+aPuVIYeqRe83yZMKRexG5Y7IDlVI/meW5q4GGUc8bE9ta0tjyfuD9AKtWrZrlaeeO4SlBZdmIOb6TmWzKcGSfdMdJWhUdkRGVkwm1fXWu6LwyL76Z5jsVY5RKhAiCJJVulJ0+Z1gMUtRCUnx2un6j/StrWKz95lwjIhP4pbPNSd9I83swjUSnyrgiW0j0sdrdM8Jc+KaaTAYTZ+R+7A2bRrNcmCz6fPUkf7fNwbnTdZtphc6UUl9VSu1TSu0rKyubg1PPDZU71mC4TGqfPMLaK1JzQMUwqNq9bso2StdW4hqzONX22y6ndH11yjbT7cKbFyAejuIrCFBYUzZOJWLdVTvI0cufzyvz4ZvFaytwjVG22X7bFXhz/QDklBWw9uoR/2s+dI61V21P2d/l82C6XdhWQhpOHH8ZLjbMryimZG1FyjHVe9bTdW7kXjunJH9GyiSahWWx9ptzTW5ZAVtecXHKNrffixiCUoqehnZnIcAxalFrLt9K0aoVKKVw+73j++FbL9c59xliTnxzGjn3Oi1Hs1yRdHrXc9a4yBrg/gkKav8beFQp9b3E85PA9UqpcSP3o1lMy6grpeiubaXumZP4i3PJW1FIw3OnMN0uVl2yiRWbVmG4ph69765ro+G5UwS7B1h9+VbKNlQjBnScbqbuwHG8eQHKt66i8eBpckryqdm7gYKqUgbaemg6dI7OM01U715P+dZVBIry5uGdLxvmbRn1qeiub6fhuZMEuwZYfdkWSjdW4/F7k68HewZpO15H00tnKd1QTeWONQx19FF34ASBkjxW7t1ENBim7sAJbNtm9SWbKd1Yg8c/ctMw2NFL86FztJ9qpGrnWkrWV9Fb307jC2coXl1O9Z4N5FdqqcxFwqLxzcVAsHeQjpMNNBw8Q6Aol5q9G4kFI5x/5jgev5fVl28Dpah7+jhiGqy5bAvFaysRQ+g+30bTS2fIryimp66d8EAw0Q9X4fZ5pz65Zizz4puR7k6ivd34VlSkfV0pxWDtGYp2XDStWXTNsmDZzMVNK7gXkVuB7UByGEMp9alpHLeGiYP7W4EP4ajlXAb8p1Lq0qnaXOoXKc2iQgdQmsWK9k3NYmVefDPc2U5ssB9fafo1ZAAG685RsGkbhtsz4T6aZcWyCe6nVMsRkbuBAHAD8HXgDcAz0zjue8D1QKmINAJ/B7gBlFJ3Aw/iBPZncKQw33NB70Cj0Wg0Gs2yQtnWlDVAYprY8bgO7jXLjulIYV6plNolIoeUUv8gIp8DpiymVUq9dYrXFfDBadqp0Wg0Go1GA4CyrCnTbcQ0s34hq7YT9Rx74ADevAA7b7+SvPKihTZJkwVMJxEtlPg/KCJVQAyYXLxdo9FoNBqNJkOoqVaoZXjkPjZPFs093XVtPPW1BynbVIMnx8fDn/0BPfXtC22WJguYTnB/v4gUAp8FDgLnge9n0CaNRqPRaDSaCVGWBRNIQg8jpitrg3ulFM9/92HWXb2DFZtqWLVvExuv38PjX/4Zob6hhTZPs8iZTnD/b0qpXqXUj4HVwBbgHzNrlkaj0Wg0Gk16lD29tBw7lp3BffvJBqLBCOVbR9YBKNtYTcW21Tz99QdRduaUDjXZz3SC+6eGHyilIkqpvtHbNBqNRqPRaOaT6QT3hunCjkXmyaK55cyjh6jatXbcgoSrL91CNBTh9CMvLoxhmqxgwl+GiFSIyMWAX0QuEpG9ib/rcdRzNBqNRqPRaOYdZU2+Qi2AuFzY0ewbuY+FIrQdr3MWXxuDGMLml+/l6ANPE+weWADrNNnAZGo5rwTeDdQAd43a3g98MoM2aTQajUaj0UyIM3JvTrqP4XJjx6LzZNHc0Xy4lsKaMty+9BKegaI8qnet48V7H+PK9986z9ZpsoEJg3ul1P8A/yMir0/k22s0Go1Go9EsONOSwnS5UFbcUdbJolVqG184Q8m6ykn3WblvE8/8z2/oqW+naNXEC3lplifT8fYnReQbIvJLABHZJiLvzbBdGo1Go9FoNOmZRsAuIhguV1aN3tuWRfvxeorXVky6n+l2sfLiTRy5/+l5skyTTUwnuP8W8GugKvH8FPCxTBmk0Wg0Go1GMxFKKWeF2mmMxovbgxUJz4NVc0PXuVZ8hbl4c3xT7lu5Yw1dZ5sZaO/NvGGarGI6wX2pUuqHgA2glIoDVkat0mg0Go1Go0mH7RTTjlWSSYfh9mCFQ1Put1hoPVZH0aqyae1rul1UbFvNmd+/lGGrNNnGdIL7IREpARSAiFwO9GXUKo1Go9FoNJo02JaFmNPLoTc9XuLB7Fn0qfVYHUUrp59DX7F9NXUHTmBbesxVM8J0fh1/BvwcWC8iTwL3AB/OqFUajUaj0Wg0aVBWfEqlnGFMn494cBClFv+iT9FQhP6WLvKrSqZ9TKAoD39BgLZj9Rm0TJNtTCaFCYBS6qCIXAdsBgQ4qZTKPuFYjUaj0Wg0Wc90FrAaRlxuQLDCIVz+xb1ET8fJRgqqSjFd07txGaZsQzX1z56kcufaDFmmyTam/HWIiA/4CPBp4B+ADya2aTQajUaj0cwrKj79kXsRwZ2XT6itGbXIU1faTtRTUFM64+NKN1bTfKQW27IzYJUmG5nOre89wHbgi8CXgG3AdzJpVDZjx2PY8fhCm6HRLCmUZWHHYlkxtb7csONx3edp5pXpaNyPxlNQhLLi9Bx/iUhPVwYtmx1tx+spWjm9YtrR+PIC+PJz6DzbnAGrNNnIlGk5wGal1O5Rzx8REV2aPQY7HiPa10u4vQUMA395FZ68AsSc2fSaRqNJJTY0SKi1CSsSwlNYjK9kBaZXTx4uNLZlEevvJdTmBBS+FZV4CgoxzOlcVjSaC0dZcZjBtVUS12QrEibY3ICnoGjRLWoV6h0k3B8kb0XRBR1fvKac5sO1rNhUM8eWabKR6Xj3CwmFHABE5DLgycyZlJ3EBvoINtVhx6LYkTBD9eeIDQ0utFkaTVYTD4cYqD1FfGgAFY8T6Wwn2NK06KfXlwPxoQGGGmqxoxHsaIRg43liA/0LbZZmGWDH4xcUnJteH4bbTXxoIANWzY624/UUrSpDjKnlPdNRvLqc1qPn59YoTdYynSGWy4B3ishwKfYq4LiIHAaUUmpXxqzLEpRtE+7qGLc92t+LJ79gASzSaJYGViTsaFqPItbfgxWrwmX6F8gqDZA2vSHS1emMik5Df1yjuVBmopYzFtPnJzY4gDtvcV2bW47UUjgDCcyx5FUUEeweINw/hC8/54LaOHXiLMcPnyKQE2DvpbsoKb2wWQTNwjOd4P7mjFuR7YhguDxYpGrpmm73Ahmk0SwN0o7OGdNbvEaTWUy3h7GyaYbHo78bTcax43FM34Wl5pleH7HBxTVyb1s2rcfrufhtN15wG4ZhUFhTRvvJBlZdsmVGx/b19vPXf/rPHDt8ks3bNhAKhvjbv/hXrrz2Ej708T9k7fpVF2yXZmGYjhRm3XwYks2ICL6ycmIDvZAo+BPDxJ1fuKB2aTTZjsvnx/TnYIVGbpwDFTU6534R4CksJtzdMTKzIoK3ZOZKHxrNTJnNyL3h9WJ1ts+xRbOj61yLUxSbNzupzsLqElqPzyy4HxoM8gdv/ihr1q3kn/7jk7hcTlgYCoV59LdP8o7X/Qm3v/FVfPDP3kMgZ3FLiWpG0JVPc4QrkEP++i3EgoOIGLgCOYjpwo7HMVz6Y9ZoJsOORRMzYKmzXYbbQ+7qdcSDQ9jRCC5/DmbgwqacNXPLcJ8XDw6CAjMQwHR7FtoszTLAjscvWKxCTBdK2Yvq2tz4wmlK1lXMup3ClSs4/stnZnTM3/9//0ZldTlvfsdrU2bd/H4fr3rNy7jy2kv58fd+we03vpNP/uOfcsMrrpq1nZrMk9FycRG5WUROisgZEflEmtevF5E+EXkx8fe3mbQnk4gIrkAO/tJy3Hn5RHu66D99lP6zJ4j296KU1p/VaMZix2KE2lvpO3WM/tPHifR0YVupsoqmx4u3sBj/ikrcefkYWoFq0eDyB/AUFCOmwVDdOfpOHyPU0YoV0+scajKHsmYR3ItguD1OPc8iQNmKhudPU7qhetZt5ZTmEw1GCPZMT8zj0Yee5NALx3jru143YTpdQWEef/DHb+Mdf/hGPvN3X+CP3/WX1J7RCR2LnYwF9yJiAl8GXoWjjf9WEdmWZtfHlVJ7En+fypQ984VSikhnO+HONkebOxJm8PwZ4qHgQpum0Sw6ov09hFobUVYcOxZlqKGWeHBo6gM1i4Z4cIihhvPYsSgqHifU0uikKGo0GUAphYpbs5KZNtwe7OjiCO7bTzXi9nnILZ19ga+IUFhTSueZxin3jcXifObvv8hb3vlaPJ6pZ9y27tjE333mL6iuqeAdd3yQv/rYP3Lq+NlZ26zJDJkcub8UOKOUOqeUigLfB27P4PkWBXYsRqS7c9x2KxRaAGs0msWLbVlE0qhMxfr7FsAazYUS7e8dty3S1YmytVypZu5RlgWGIHLh4YvhcmNFInNo1YVz5tEXKd+2es7ay68qof1U05T7/fzeX1FYXMCO3Vun3bbL5eKVt93AP931V3i8Hv7ozj/nja96L1/94j289PwRopHobEzXzCGZTDirBhpGPW/EkdUcyxWJRbGagY8rpY6O3UFE3g+8H2DVqsVdtS2GgbhdqEjqhU0vZrU0ySbfXGyICIbHixVOvfE1pjGKpJma+fJNM833ZXo9MIvgS7O0mY1vqnh81gulGW4X9iJIyxlo66H9VCOXveeVc9ZmQVUpp3/3wqT7WJbF1770Hd7x3jde0DkCOQFue+0reNWrb+TksTMcevE499/3W1qa2tiwaQ2XXXUxN916A9t2brqg9jWzJ5PBfboErrFrxx8EViulBkXkFuCnwMZxByn1VeCrAPv27VvU688bLheBypUMnj8zss3jw+XXVeZLkWzyzcWGGAa+sgpiA30jKlOma9HpT2cr8+Wb7rwCwh1tzqqhACL4Ssq1JKZmQmbjm3Y8NuvBMnG5sQYXdpFJpRQHf/AoKy/ehMszd7LZuSsKCPUOEhkM4c1NvxbIw796nJzcHDZtXT+rc5mmybadm9m2czMAkXCE2rP1HDt8ig//wSdYuaaaT37qY7M+j2bmZDK4bwRWjnpegzM6n0Qp1T/q8YMi8hURKVVKjc9ryQKUUtixKKbPT96Grah4DEQwPd600n3xcBhlWxhuT1pN/OH2RAwMrZmvWYIkFVdCQcQwMP0BXD4/VjiMUjaG14cxjZUolW07F33DSCruWFFninh4ZDmeWBBrum1OBzseQ9k2hts9qzSBxc5IX+QUIwLEQ0OAIKaLvHUbiUciYMVx+XNwBXKwYzHnO3Rr7XvN3KHiMWTWI/du7NjCpeUopTh6/9MEuwfY/PK9c9q2YRgUVJXQeaaJ6j0b0u7zna//kJfdfM2cnhfA6/OyZftGtmzfyO1vvJknHjnAe9/yMf78r/+Y177pljk/n2ZiMhncPwtsFJG1QBPwFuBto3cQkQqgTSmlRORSnBqA8cseZgF2LEqku5NQRyu+knLseJRobzeGy42/ogoxXUnZLcuyiA/2E2ptwo5EcOcX4CurwJ2Tm2zPikaJdLUT7mxHTJNAZQ2e/EKd3qNZUgyrTLkS8pZ2LEa4s51QewvKsvAWl+ItKcPlm3g1WisSJtTRSrSnC8PtJlC9Bis0RLi9FQT8K6oQt4dQSz12PI6nqARvyQrcs5hNU7ZNbKCPYHMDdjyGp6gUf1n5ktTft2JRIl0dhDvaENMgsHIt1tAgkc52EPAWl2FFwpgeL1YsilIKKxIm2NKIsix8JWV4S8vTpu9oNDNlTkbuTRfKslC2nX6hvAzS19zFoZ88wUB7DztvvxLDnPvz51eV0H46fXB/8tgZGhta2HvJzjk/72hM0+S6l1/Jpq3r+c9/+xrhcIS3vPN1GT2nZoSMebVSKg58CPg1cBz4oVLqqIh8QEQ+kNjtDcCRRM79fwJvUUplZWpDtL+PUFszptuDHYsS7emCxGjXUMP5FAUQOzjEUP25RM6fItbfS6itKTnSCBDt7SLc0QrKRsVjWkVEsyyIBQcJNtc7s17KJtLVTrS3e8L9lW07gX13p/N7i8eJDw0Qam1C2RbKsgi2NGBHQtixOChFtLuTaE8ntn3h8rTxUJDBurOOPr9SRLs7HIWs7Oy+JiXa2024vcXpi2yww2HC7S3Jzzfc0YrLHyDc2e7c3Ng2Qw21ye8w3NlGpCcrJ2M1ixA7NgfBvTgzTnZs/gpArVic5//vYR753I/wF+Vy0ZuvnzBtZrYUVJXSfjK9Ys7377mPa264HHOeBgorq8v5s7/+Y+7+/Ld59KEn5+Wcmgzr3CulHlRKbVJKrVdK/VNi291KqbsTj7+klNqulNqtlLpcKbU/k/ZkCmXbSYUcV24+sTTqEVZkpGjQioaTOcbDxAcHsKPONKEdjxPpTqMiElzYHEGNJtPEh8YvCx/t7U658R2NHY85N9IJXP4c4mmWlo+HginL1Ud7e7AnaHM6jC0CBhyN/nkMFuYDpy8aCcw9hUXE+nvG7RcPDmH6/cRDQex4fNzr0e4O7LjWvtfMHie4n33SgeF2z6oPmAm2bbP/v++nr7mbS975Clbt24TpylxwnV9RxGB7D7FQaurR0GCQX9//CFdfn07bJHOUrSjhjz76Lv7m4/9KU0PLvJ57ubJ0k0TnE5HkdLyy4kia/PjRC++kWzZbTBeSmJ5z8lrHT+/rvHvNUsdwjU/dMNye5G9jLGKk1qOoeCzt78RwuVOCTsPtnp1OdprgwnB70v62sxkxDAyPN/ncjkWSOfejMdxu57M3zbRpDobHq9VzNHOCHY9izEFgbLhc85Z3f+qhFwj1DbHtlktx+zKfnma4TPIriuk4k1LmyIM/e4gt2zdSVDz/ogUbNq3lpltv4JMf+8dZzZpqpofubecAEcFXWgaGQbSvB19xacrrpteH6c8Zee7z4wrkpuzjL6/CldhHTBN/RSWMKkIz3B5cOXkZfBcazcLjyslNDR5F8JVVTCh9Z7jcBKpGpPSsSBhXbh6MCjDFdGF4fU6aSKJNf3ll2iL26WIGAphj6gACVSsXzXL2c4UYBv4VFcm+KD7Qj6egKOUmRkwTw+NFWTamLwBKpdwQOJ93lV5ZWDMnzNXIvZjuCWcE55LwQJDjv3yGTS/fm5H8+okoqC6l/eSIGrlSih/c81OuuWF+R+1Hc9Mt1zE4GORH//vzBbNhubC0rkRzhLItpwMxTDAEFY+nFMSCU0DrqGR4EMPAFch1FHJiURQGuWs3YUVCCQWQnBQpTJc/gL96FXYoiG1ZjppOILW4b6S9GAiYXi+mZ+kV62kyh7Jt7FgMDMFMM9qaKexYLKEC5Z7xSLY7J5fc1euJh4IoZePy+TEDuY7SjeUoS40dmXfn5ZO/YQvxcBjDNDH9OeQHcomHhhAEM5ADysaoWYOyLcxEm7PB9HjJXbMBK/Ebdvn8mEtU7na4L8KyUGIgArlrNybTCw2XGxWPk7N6PaAQlxtvcSlWKIRSFqZ36X42mvlHxWPIHNxEO1r3mR+5P/nQQVZsqiFQOLs+Z6YU1pRR+9TIskFHD52gt7cvKVu5EBiGwZ3vfSN3/dNXePmrrqWkrHjBbFnq6OB+DFY4RLC1iVh/L4bbg6+s3FGsESFQsxqXP4foQB/BJqfoz1NQhK+iGsMwiPV0Ee5sc0YbS8uxQkHioSH85dWYbk/KzYHbH4BJLnh2LEq0u4NId6czelZZgxS4Zr14h2Z5kFSQ6e5ETBeBqpUZV1tSyibW30+wuQ47FsOdX0Sgojol130qbMsiHgoSam1E2Tbe8kpc8TihlkbsWBRXbh7+8uoUZSkR5+Z6eDYsHg4R6elyVr8V8JWW4y0qxTtmRm22mB4v5ugR6iWKFQ4T6WoHpRARIj1diBh4S0qdmZJALuL2MFR3BpTCV1qOr3QFnsKihTZds8RQtp1QuJl9PyYuN9ZQZuvY4tE4tU8cYc+brsvoedKRX1nMUEdfUu/+B/f8lGuuv3zOZIAvlJqVlVx+zT4+/5mv8ul//8SC2rKU0Wk5o1CWlQzswQmwg80NeItKsCJhBmvPEA8OMlR3NjnFH+3rIdzWQnRwIKFuo8C2Cbe34ArkoOJxgk11xGdYDBsdDk6UcuxqrNNqOZppoZQi0tXhKMjg1IEMNdQSDwUzel4rFGKw7owzWwDE+nsIJlRrpks8OEiwqc5ZYl4pXB4fQ/W1yULV+OAAoZZGrNjExZmxgX4inW040i7ObzE+1D/h/prJifZ1EevrwXC5neJapVC2RbijDZc/x1Emikacvk8pwh2tRPt6F9pszRLEjkWd+rQ5WDdhPgpqm144Te6KwnkftQcwTCOZmtPX28/Dv36cqxcwJWc0t73uJn7/0H5OHD290KYsWXRwPwo7HkurdDMsb6dsCys8fsnqaF+3kz4zhng4hJEotLVmsNT1WIWKZHsZHmXQLA1UPEakZ/xyERkP7tP4eKy/JxnsT4exSjfOsWOUpYKDSWWpsdi2TaxvvJpLNM3vWjM1VjRKtK8HVyCX2OD4GyQrHMLweB21nFE1CJGezhnd1Gk008GOReesrsXRuo+jMljcWbv/KBVbV029Y4YoWrWCliPn+cn3H2DXRdvIL1gcdXuBgJ9X33ET//apLy1J+eDFgA7uRyGGgbjGF9mNHiVIl9ZguD1gjB9JGM5FhfTqGhPbIcmbgpT2lkEKgGYOMEwM73hfybTaUvrfxszy7sfana4Ic7Sy1LjjDSPte9f1KheGo0bkdYKqNHUb4vagrDiG25NyE2d6/VodRzPn2LFY2mv0hSAijorWBAMFsyXUN0R3XTsl66sy0v50KF5TTsvR8/zft37Mja+c+xVpZ8PVN1xOc2ML+x97dqFNWZLo3ncUhttDTnXqXbYrJxcrUXTjLV2BGcjBzEmdYgtUr8IdyE1VkHC7MVzOyIA5w2I7MUz85VUpF0fD40vJM9ZoJsIwTQIV1SlqS6bPn1RjyhQufwB3bn7KtkDV6hndVLhz8lJuYq1YDFdeapv+impcvol/T96ikpQbDXG5cRfo/O8LwXC58JdVYEUjuHJS+zjnxs0AEQyvN5mqKIaJr3TFnKROaDSjsaOROa07M9zuGc2qz4TGg6cpWVeZUT37qQgU5RGNxlhXWcHa9Qs3g5AOl8vktW+6hc/901e0NGYG0NWZCaxYDDsaQdwe8jduwwqHENNEXC6UZeMtKUNMw1GFqF6FFQ6jLMvRtzdNlFLkrN8MsSgg4HKBZZG7bhNiuhMpPSHE5cKOxxO62zGUZTkycvEYSilMjxfD5cKdk0v+hi3OMYaB4fU7y7pHo3oZd82UuHLyyN+wNeE/JqY/kBG/UYlVmFHKuTleuYbY0GDyt+HKySEeDjmKU24XLq8fKxx2FjQyDNyBnISqT9QJEj1e/Gs3YcSjKOUEl56CIqyiICoex/D6cPkDWNFIYhTPhcvrw47FsKIRxDRw5+aTu3ZTUmlKXG7cgfE3NnYshm3FMdzutAGDsi2saNRRvFoms2bKsrBiUcdnPB5nbQDTJG/tRlTcImftRlA2gqAQEIUrrxBRNnkbtjlKJh4PLp8fKxJJ9GmetNr3Gs1MsaKROVHKGUbcnuTg3VzT8NwpKravzkjb08VWinPtrVyza9eC2jERey/ZxW8eeJQHf/oQt91x00Kbs6TQwT3Oyq/hjjYnV9cw8JVV4CkodgpqG+uSeaW+0nKifd248wqcYrJADpbPT6SznUBlDfFQ0FktUwRvSRl2NEJ8aAB/eRWxUAi3P0C4s80ZffD68JWsIB4JYbo9hNtbUbaFO78Q/4pKXAFHPtPlDxAPhwg21RMf6kdcLgJVq/HkF+gLpmZCRCTpP5nCjseIdHUSam8BpfBWVGO6TEItTSgrjisnF195FcGmOuyI4/OB6lWE25qJDw0iLhc51auJDvQ5xb/iaKqLy81ASwPYNu6CIrzFJQSbG1DxGK5ADr6KakJN9ViRMIbHS07NakLtLcQHBxDThb+iGmXFCbU5C7j4yiow3J6krr1SithgP8HG89ixGKY/h5ya1SmflRUJE2xpItbf46w7UVmDt6A4o2pDC40VDjHU0kh8oA8xXeSsXEOkuxNPUSmxvm5cgVzi/T1Ee7qdPq64NJED7UZZcXC58OQVEO/vxRroJ9jWBLaNp7AEf0WlTo3SzBo7GsWdN3d544bbnXa16dkS7h+it6mDrbdcOudtz4RnnjxIZyTIxpCNSqhdLSZEhDvechv/+dmvcdOt1+Px6oHLuWLZR4eWZRHt7R4pwrNtwm3N2LEIwcbzyR++HY0QbG3EW7LCUYew4rgCuUQ6Wh29XCtOtKcTUKBsIp1tuPwBlGU7ijuFRYTampL5fXYkTKi9GU9eodNeovgs1t9LuLsjOU2lLItgS0NS7UPF4wzVn81Ih6TRzIT40CChtiZHlQaFy+Mh2FjnBHqJ18PtLclcbW9xGeG2lpTC8NjQYFLVB2UTamt20jsS/h/r6yHW35e8KMWDQ4RampJpNobLRbizLVmIqyxHncp5klBvaW8hPjRSqGtHwgyeH1H1sUJDDNWfS65gq5Rybvb7exJtJtSqQktXrUrZzmcfH+gDnPqJaF8PStlYwQHiwSHseMwZvBju47racfkDRLo7Mbw+ot2dToqD6SKYuDkDiPZ2Eenq1IVzmlljx6JzlnMPTh2bFZn7a2nTS+coWbOwKTnRaIx7v/cLdl+5G2Upot2LU5Bj89b1VFSV8/17frrQpiwpln1wr+JRYmlk2+xYNCm/N7LRdiT6cPLzhzsFT0FxWpWdeCiYLO6zo9HksSPnjjvpCWOI9fcmJbrseIz4QBqVigzlCWo00yU6xi/TqeLEBweS+vOmz5cSZLsCucTTKbAkRuSHiQ304xpVb2KFRpRZXDl5xPrHtzFWAWO0go4VScg2jjnn8O/djseI9nWPfy9L+Ibaec8jn5ErJ4/YQD/ewhKifb1OH5cI/EdjhUMYXg9WKIjp8zvrg6QZoY/0dCXFBTSaC2E4BdCYw+De9HiwIuE5v/FseO4UJesr57TNmXL/T37NiooyVq1bib+ykIHTrQtqz2S87s238PUvf4f+voGpd9ZMi2Uf3IvhSquuIaYrpSBxZH/nI7MTChHgBPFmWnUbT7LILL18l6RVEjE9vqRKiBhmepWKJbbMvSb7GLs4VTpfNtwjvwFnReeRC7Mdi6ZVgBqtMgXOYlGj9ajFdCVnuuxYNP3vd8xvd3RBu6QZTRPDTP62xTDTqlWZcxhULDbEMFO+CzsWxfR4iUfCmF4v8Ugw/Xfl9ji1EB5HLcfw+sAeH8SbPr9OI9TMCjtRCzKXfiSGiWGa2HM4WBYZCtN9vpXiNRVz1uZMOXv6PL9/eD833nQVAP7qYoZq27Fji1OetmZlJbsv3sHdX/j2QpuyZFj2va3pduMrrYBRHYbp9SEuN77yVAkrb3Ep8cSKjMNTzobHS3ywH09BUUo+ruH2IIbpFBb6c7AtC29JWUp7vtIVTsHZKH1oxMBXXpkMggy3m8AYBR93fmFGc6k1mungzs3HGFWkq+w4rjFqOb7yKiK9zih4sKURf0VN8jUrFMSdX5D6u/F4nSL2YY10w8BTWJyyCJy/sppwuzMKFe3rwbeiMuVG3JWTm7LIleF248kvTD43fX68xam/xUD1yuQNuqM2VJOqNhTIxQwsXbUqw+VylMKG058G+/EUlxLpaMNbUo41OIi3sHhcH4dhgGEkRlMVngLnu0pRBxMDf3nVkq5X0GQeOxJJ6W/mCsPrn9MFIptfOkvR6nJcnoUZgOvp6eMrd32LV9xyPbl5iVlTvwdPcS4Dp1sWxKbpcPsbXsXP7/0V5881LLQpSwLJtjzIffv2qeeee25O2lK2jTWcAx+PY0fCCY35AO6Ao8hhhUIJjWc3iIEdizjKNbEoyrYwfAGw4igcLXsrHAIRzEQunzPy7sW2Ys5sgLJRVjzx2JlmNH0B7GgEZdu4fP6UFARwpiOtcMhJVzAd5ZO5nJrUTMiMqo/m0jezBSsawQqHRm5Sbdt5bluOwozbi0qkvBhuD8rrQ2IRR5nKMJ2A2jATqj6C6fNjx2PYYWeq3PB6MUw3ViSUGCH2Ij4/RCPO7JnhAo8HYlGsSBgxTUy/H0GIh0MITpvmmNF9Ox7HCgex4zFMjw/T50fZlqPAY7owPR7i4VBSbcjl96edQVtA5tw3R/czjr69B9uKJ9S9XNiRGIbXhR1xFIQwTbAsxHQlZlB8SelfEQMrHEz2aSkDGJqlTkb6zXBnO7GBPnxl5RdsWDqi/b2oeJzcVevmpL3ff/4nFK+toHzLyjlpbyb09fbzb5/6Epu2rOeyqy9OeS3WF6T3pfPU3HEZxgLWAkzGr+9/hIb6Zu6+57OZKv5dXBXFGWTZ5nbY0SihzjYine2Awltchq+8EnPUBdz0eMdJ4CnLItLXTai5EVduHkY4lFyS3V1QiH9FVXJU3Z2bRzw0xFB9bSLwcJFTsxpPQfF4x51Ew34+lE80mgth9G/EjseJDnQTamtKzlgFKmsINtcng/uclWtx5xWMa8c1KsXH9HhhzCi5yz8SHMaGBhlqPO+oTrnd5NSswZWbjzs3VUUjXarcMIbLhTFqliEeHGKwoda5wXe5yalZjTuvANcyCkqH+xkxDIaa6p16CMMgUFmDKy8fy4wSbm9x6hdE8BaVYFsWYpr4SsvHfVZaslczl1iRUEZusF3+AMHmxjlRkwn3B+k638rGl100R9ZNn7raRr70719n267NXHrV3nGvuwsCuAty6DvaQNHuNfNu33R42c3X8OlP3sVvH/w9N916/UKbk9Us27Sc2GA/kc42hpe2j3R3EOsfXzA2lng46CiC2JajFNHVkSzOi/X1Eu0dKcSz43EGE4E9OEoeg3Va6UazNImHhgg21ycLx63QEKG25qSyjR2LMlh3Zla60lY0ymDd2RHVqViMgVHPLwQ7FmOw/mwy71bFY87vdBkWrTuqOS0jhc62TbCpHisccpSLhotulSLS3YnL5yfa05VUK9JoMoUjSZ2BtBy3B3G5iKUp7p8p9c+eoGRdxbym5MQti/vv+y3//o9f4crrLuWKay6Z8CYlb1Ml/ceaiPYuTuUvl8vFne99A//yt5+nt2fqeEwzMcs2uB+tDJHc1ts15XHDF3xHLWf8xT/W35vM97Vj0bSFOlaGlrvWaBaSdL4eHxrANWoBKWVZ41WoZnKOWDRZoDuy0Z7Vb8qORVMKdgEnZW4Z/k7teJxo//i+0Y7F0yqCDQdc6ZR0NJq5YjhlLF1R91zgyS8g3NYyK9UcpRTnnjhCxdb5W7jqxLEz/N1ffIaXDh7lzj94PVt3bJp0f9PvIXdjBW2PHMWOLk71qo2b17H3st18+pN3afncWbBsg3tXmhUrXdMomBvOdR+tlpPyus+fLBwT00xbRJZeOUejyW7S6U8bHu8YuVeZVWGlmGZaFavZ1KCIaaYU1I+0ufx+p2KaafPjxTAwfePTAg23BxWL65x6TUaxEyu/Z+o36crNd9azaK53ZKsvIKjsPNNMPBKjcGXZ1DvPku7uXr7yH9/iq1+8h0uv3Msdb7mVgqLx6Y7pCNSU4CnMofXhw4tWPeeON9/CiaOn+Mn3719oU7KWZRvcewqKUoJzcbvxFJVMeZzLH8CdX5hUyxmd1yumC1/JCoxEoGB6vARq1qQc7y1ZoS+EmiWJOfzbGEYEf0U1odYRhQZ/Vc2kufBTnsPrI1CVqh7lr6geVzA70zZzqlNH23xlFWnlMJc6hmkSqKwBGbk0uHPzMf1+vMWlKRK8htcLIojLTP3eNZo5Jh4cGie9O5eICP6KKqxIhL7TR+k5ctBJ90uzDs1EHP/Vs1RftCGjq8DGLYtf3f87/u4v/g2v18N7/uitbN4283PmbanC8Lho+dWLxEMXPpOaKTweD+//yDv5j3/5b156/shCm5OVLL+hqQSmz0/e+s3J/HfTO15RIx2G20NOzWqs8Apsy8KdX+ikCtg2Lr8flz91RsCTX4C5cRtWNIJhujD9fgxz2X7smiWMy+sjULkSK1FoaXp9GB4v+es2YMVimG73rPXOJVHI6fIHsBIL2rh8/rQa+zPBU1CE6fUl2nRh+gLJtSaWG+6cPPI3bnXUuQxHfchwuTHdHvLWbCIeDiKGgZgGKm6RW7RxWRUea+af2GD/rAYFpoOYJv4Vjja9si0iPd30nz1J/oYtU16zu8610NvQzsYb92TMvrOnavmfr/0Qj8fN2959B0UlhRfcloiQv62GoXNtNP/ieVZctxVf+YW3lwmqqit4zwfeykf+8K/5+vf/g42b50bNaLmQ0ShTRG4GvgCYwNeVUv865nVJvH4LEATerZQ6mEmbRpNODWc6GC43Ru700gBEDK10o1k2mF7v+Jtkt3tOOxoxDFyBHFyMT61bTG1mMy6fP23A7goEcAV0X6aZP5RSxPr78FdUTb3zHCGGia+kjHBnO0P1teSumXh03LYsnvu/h1lzxTbMDEhM9vb08+Pv/YLDL57g2pddztYdm+ZkdkBEyF1fgTs/QNsjx8jbWEHRnjWIuXgSOnZdtI033vka3vfWP+ULX/9ndu/dvtAmZQ0Z+xZFxAS+DLwK2Aa8VUS2jdntVcDGxN/7gf/KlD0ajUaj0Wiyi/jQQHLdhfnGW1KGFY0Q7mhL+7pSihd+8HvcXg/lW1el3edC6evt50f/+3P+35//C3HL4j0feCvbdm6e87Qfb1k+JVdsJNzRT+PPnyPUPL6gfiG57Mq93PneN/LBd/9/fOvu7xGPL85C4MVGJkfuLwXOKKXOAYjI94HbgWOj9rkduEc51StPi0ihiFQqpRbvMmoajUaj0WgyjlKKUGuTs5J1BnPZJ0JE8K+oJNjcgOF24x1VlxcNRXjxB4/SVdvKrjuunhP7QqEwxw6f4sCTz3Ps0Em27tjEO9/3JvIL8qY+eBaYXjeFu1cTae+n48mTuPJ8FG6vwV9dPKs0yrli997tfPJTH+U737yXH3/vF7znA2/jpluvJy9/6a4aPlsyGdxXA6PXEW4ELpvGPtVASnAvIu/HGdln1aq5vTvWaGaD9k3NYkX7pmaxMh3ftONx+s8cR8VjeAqLF3TdCW9xCUMNtYRamxjqj3H26bO0Hm8md0Uh66/dRbhviHDf5NrxXZ09nD5Zi2VZxOMxYpE4wVCIwYEhejp76ep0Rsy9Pg8r11TzmltvxOP1EuzsJ9g5ew3+aVOZi9Ubou2Ro84yQB4Tcjzgc4PbANOAQj+SmxlZ0sm44023cOzIKb742a/zD5/4LG63i03bNrBydRWlZSXk5uVw063Xs2HT2nm3bbEhmdIRFZE3Aq9USv1h4vk7gEuVUh8etc8DwL8opZ5IPH8Y+Eul1POTtNsB1M3AlFKg8wLeQjah32Nm6FRK3TzdnS/ANy+EbPmutZ1zy1g7F6NvTkY2fM7axrnBp5TaMd2dJ/LNS3bt9N//ra9ta2xtCYcjUdM0zQXNx/B7vUZNZYUXoOFwMwcfOhrvCw1MS07Htm2XabrFkMm1PJWyFfM/QTEhuR4fuT7/OIuONNdZP3juiQWV2RExDI/LN+4Oo2ugubW550xTmkNKgRMz6TezmUyO3DcCK0c9rwGaL2CfFJRSMxKRFZHnlFL7ZnJMtqHf4+Jgpr55IWTD5wDazrlmtnbOh29ORjZ8ztrGuUFEnpvJ/lP55goW3/su3gW73/6aae+/2OyfKWPtfxPwqQW050JIvIdlEdhDZnXunwU2ishaEfEAbwF+PmafnwPvFIfLgT6db6/RaDQajUaj0VwYGRu5V0rFReRDwK9xpDC/qZQ6KiIfSLx+N/AgjgzmGRwpzPdkyh6NRqPRaDQajWapk1Gde6XUgzgB/Ohtd496rIAPZtIG4KsZbn8xoN/j8iFbPgdt59ySLXZORDbYr22cGzJhYza878nQ9i88S+E9TJuMFdRqNBqNRqPRaDSa+WXhBUw1Go1Go9FoNBrNnKCDe41Go9FoNBqNZomw5IN7ETFF5AURuX+hbckEiVV97xWREyJyXESuWGib5hoR+VMROSoiR0TkeyLiW2ib5hsRWSkijyS+46Mi8tGFtikdIuITkWdE5KWEnf+w0DZNRjb0DyJyXkQOi8iLM5UZXGiyyG+zwQ8WdV+fiX5aRG4WkZMickZEPjEXds4nIvJNEWkXkSMLbcuFkC2/34nItuvRXLLkg3vgo8DxhTYig3wB+JVSaguwmyX2XkWkGvgIsC+xMIqJI6u63IgDf66U2gpcDnxQRLYtsE3piAA3KqV2A3uAmxMyt4uVbOkfblBK7clCrexs8dts8INF29dnop8WERP4MvAqYBvw1kXqO5PxbSCbtdWz5fc7Edl2PZozlnRwLyI1wK3A1xfalkwgIvnAtcA3AJRSUaVU74IalRlcgF9EXECAKRY6W4oopVqUUgcTjwdwLuzVC2vVeJTDYOKpO/G3KKv2l3r/sBjIBr/NBj/Ikr5+rvvpS4EzSqlzSqko8H3g9lm2Oa8opR4DuhfajgslG36/k5FN16O5ZkkH98Dngb8E7AW2I1OsAzqAbyWmlL8uIjkLbdRcopRqAv4dqAdacBY6+83CWrWwiMga4CLgwAKbkpZEisOLQDvwW6XUorST7OkfFPAbEXleRN6/0MZcKIvYbz/P4veDRd3XZ6ifrgYaRj1vJIsCy6XGIv79TkoWXY/mlCUb3IvIbUC7Uur5hbYlg7iAvcB/KaUuAoaArMtLnAwRKcIZrVkLVAE5InLnwlq1cIhILvBj4GNKqf6FticdSilLKbUHqAEuFZEdC2zSOLKsf7hKKbUXJz3hgyJy7UIbNFMWq99mkR8s6r4+Q/20pNm2LEZdFxuL9fc7HbLhepQJlmxwD1wFvEZEzuNM590oIv+7sCbNOY1A46g70XtxLgBLiZcDtUqpDqVUDPgJcOUC27QgiIgbp4P9rlLqJwttz1Qk0gYeZXHmnGZN/6CUak783w7ch5OukDUscr/NFj9Y7H19JvrpRmDlqOc1LMOUzIVmkf9+p80ivx7NOUs2uFdK/ZVSqkYptQansOd3SqklNeKrlGoFGkRkc2LTy4BjC2hSJqgHLheRgIgIzntcNIVk80XivX8DOK6Uumuh7ZkIESkTkcLEYz/ORf/EghqVhmzpH0QkR0Tyhh8DNwFZo7yx2P02W/wgC/r6TPTTzwIbRWStiHhwvp+fz7JNzQxY7L/fqciW61EmcC20AZpZ82Hgu4nO7xzwngW2Z05RSh0QkXuBgziV+y+wzJaRTnAV8A7gcCJ/EOCTSqkHF86ktFQC/5NQujCAHyqlFq28YBZQDtznXGNxAf+nlPrVwpo0I7LFb7OBRdvXZ6KfVkrFReRDwK9x1He+qZQ6Omtj5xER+R5wPVAqIo3A3ymlvrGwVs2IbP/9LtvrkSilU9g0Go1Go9FoNJqlwJJNy9FoNBqNRqPRaJYbOrjXaDQajUaj0WiWCDq412g0Go1Go9Folgg6uNdoNBqNRqPRaJYIOrjXaDQajUaj0WiWCDq4X6SIyPUiMk6yaaLtc3C+14rItlHPHxWRfdM4rnIu7Eno0WaTxN+y50J9UUSqErJ56V5L+p2IfHLU9jUiMi19dxH5mIi8c6Z2pWnnQyKyaOQGlysi8m4RqZrGft8WkTdMd/sc2KX9UwPM3kencdwH0vnMaL8TkT0icsuo1/5eRD4+jbZFRH4nIvkztStNWw8lVivWLDA6uNcM81pg21Q7peHPgK/N9uRKqQ6gRUSumm1bmsWNUqpZKTWdC9wnp94lFRFxAX8A/N+MDRvPN4GPzEE7mtnxbmDKwGkB0P6pGebdZNBHlVJ3K6XumWK3PcAtU+yTjluAl5RS/Rdw7Fi+A/zJHLSjmSU6uL9AEitHPiAiL4nIERF5c2L7xSLyexF5XkR+LSKVie2PisjnRWR/Yv9LE9svTWx7IfH/5snOm8aGb4rIs4njb09sf7eI/EREfiUip0Xk30Yd814ROZWw52si8iURuRJ4DfBZEXlRRNYndn+jiDyT2P+aCcx4PfCrRNumiPy7iBwWkUMi8uHE9vMi8s8i8pSIPCciexOfzVkR+cCotn4KvH26718zOQvloyLyoIjsSjx+QUT+NvH40yLyh2NGm/wi8v2Ev/wA8Ce2/yvgT/jjdxNNmwmfPSoivxFnxcGx3AgcVErFE+1sSIwmvSQiB0VkvTgzDr8XkR8mfPtfReTtCV8/POz/SqkgcH74c9DMnsR3f0JE/ifxnd8rIoHEa+P8UpxRzn04ize9mPCXv030eUdE5Ksizgpf0zz/ZL7/mbH9nTgrrv5w2D9F5ICI7NP+uXSZbx8VkRUi8nzi8W4RUSKyKvH8bMIHk6PwCRteEpGngA8mtnmATwFvTtjw5kTz2xK+fU5EJroRfDvws1H2vDPxvl8Ske8ktn1bRP5LRB5JtHWdOLHHcRH59qi2fg68dYYfuSYTKKX03wX84QS1Xxv1vABwA/uBssS2N+Osqgfw6PD+wLXAkcTjfMCVePxy4MeJx9cD96c5b3I78M/AnYnHhcApIAdnFOFcwiYfUAesxBlZOA8UJ2x9HPhS4vhvA28YdZ5Hgc8lHt8CPJTGlrXA86Oe/zHw41Hvpzjx/3ngjxOP/wM4BOQBZUD7qOOrgcML/d0ulb8F9NFP4Fx08nGWkP91YvsjwGZgzai2/2zU+XfhrG65L/F8cFSbaxKv7Uk8/+Gw74859z8AHx71/ADwusRjHxBI2N2Ls3qhF2gC/iGxz0eBz486/q+BP1/o73Kp/CW+RwVclXj+TeDj0/DLfaPaKB71+DvAqxOPv82oPmzUPt8G3jCNc4zr7xK2/Xfi8Q7tn0v/b4F89ChOf/khnD7z7cBq4KnE638PfDzx+BBwXeLxZxnpS99N4no+6pj9CR8qBboAd5pz1wF5icfbgZNA6ej3kbD7+4AAtwP9wE6cAeLnh/0+se9poGShv8fl/udCc6EcBv5dRD6DE+A8LiI7cC4Av03cqJtAy6hjvgeglHpMRPJFpBAnyP0fEdmI06G4Z2DDTcBrZCSvzgesSjx+WCnVByAix3A6ilLg90qp7sT2HwGbJmn/J4n/n8fp8MZSCXSMev5y4G6VGJUaPk+Cnyf+PwzkKqUGgAERCYtIoVKqF2hncU6/ZysL5aOP46QL1AIPAK9IjHytUUqdFJE1o/a9FvjPxDkPicihSdqtVUq9mHg8mU8eBxCRPKBaKXVfov1wYjvAs0qplsTzs8BvEscfBm4Y1V47sGWK96uZGQ1KqScTj/8Xx1d+xeR+OZobROQvcQLhYpzA6BfTOO/mKc6Rrr+7GvgCgFLqiPbPZcN8++h+4Cqc/vCfgZtxAunHR+8kIgVAoVLq94lN3wFeNUm7DyilIkBERNqBcqBxzD7FiesxODNL9yqlOmHcNfwXSiklIoeBNqXU4YRNR3F8/cXEfsPX8a5J7NJkGB3cXyBKqVMicjHOKM+/iMhvgPuAo0qpKyY6LM3zTwOPKKVelwh6Hp2BGQK8Xil1MmWjyGVAZNQmC+e7nvb0dYLhNoaPH0sI54ZitD1j3+PYtuwxttmj2vYl2tTMAQvoo8/iTFOfA36Lc1P5PpyAZzrnnIixPp0u7WG0T07m72N9cLR/jvZ17ZNzTzofEyb3SwBExAd8BWeUtEFE/p7UPmjSw6c4R7r+biZ9pvbPpcN8++jjwDU4g3A/A/6/xDnHChZMdo1NR7o4YCxxETGUUvYU7U/nGg7aJxcFOuf+AhGnMj6olPpf4N+BvTjTWWUickViH7eIbB912HDO89VAX2JkvQBn2hWcabWZ8Gvgw8P5fCJy0RT7PwNcJyJF4hR2vX7UawM4I7Qz4RSpo1O/AT6QaBsRKZ5he5uAaSlOaKZmoXxUKRUFGoA3AU/jXLg+zphRqASPkaizSMwq7Br1WkxEZjKTBc6o6IaEHf1Ao4i8NtG+dzh3dgZon5x7Vg37H05+7hNM7pej+6bhIKlTRHJx0m2my1S+n44ncPwYcdTEdo56Tfvn0mW+ffQx4E7gdCLI7sYZlHly9E6JGe6+RP8MqTVqF3INB+d9rUs8fhh4k4iUwMyv4YlYpAInFVezgOjg/sLZCTwjIi/i5D3+YyKoeQPwGRF5CWea6spRx/SIyH7gbuC9iW3/hjOq+iTONN9M+DROisQhcQoUPz3ZzkqpJpwpvwPAQ8AxoC/x8veBvxCnAHL9BE2MbW8IOCsiGxKbvg7UJ+x5CXjbDN/PDThpHJq5YSF99HGcqdtg4nEN6YP7/wJyE+kOf4lzAzrMV3F86btpjpuIX+JMbQ/zDuAjifb341x4ZsJVOL8VzdxxHHhX4jspBv5rCr/8NnB3wo8jOOpch3EK8J+d7kmn4fvp+ApOQHcIZzT1ECN9pvbPpcu8+qhS6nzi4WOJ/58AepVSPWl2fw/wZXEKakePkD+CU0A7uqB2OjyAU+eBUuoo8E/A7xPv8a4ZtANwMfD0cGquZuEQpWYyw6O5UETkUZyCmOcW2I5cpdRgYnT9PpyCoPtm0d7rgIuVUv9vDmx7DLh9gg5Nk2EWi4/OFhG5D/hLpdTpWbZzEfBnSql3zI1lmkRa1/1KqR0Lbct0EBETpwgxnBj0eBjYlAj0LrRN7Z+LmGzz0dkijmLUPUqpV8xBW18Afq6Uenj2lmlmg865X378vYi8HGfq8Dc4IwsXjFLqvuEpvNkgImXAXTqw18wBn8ApXJxV8IRTK/A3szdHk8UEgEcS6TeCo/p1wYF9Au2fmkWDUqpFHAnXfDV7rfsjOrBfHOiRe41Go9FoNBqNZomgc+41Go1Go9FoNJolgg7uNRqNRqPRaDSaJYIO7jUajUaj0Wg0miWCDu41Go1Go9FoNJolgg7uNRqNRqPRaDSaJcL/D3TgO8dja6T/AAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "sns.pairplot(df,hue='Label')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### សមមូល និង កូដរៀបចំទិន្នន័យ\n", + "\n", + "ដើម្បីរៀបចំបំពេញទិន្នន័យសម្រាប់បណ្តុះបណ្តាលបណ្ដាញប្រសិទ្ធភាព (neural network) យើងត្រូវតែសមមូល (normalize) ថ្នាក់បញ្ចូលក្នុងចន្លោះ [0..1] ។ វាអាចធ្វើបានដោយប្រើប្រតិបត្តិការ `numpy` ឬ [វិធីសាស្ត្រ Scikit Learn](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.normalize.html)។\n", + "\n", + "ផងដែរ អ្នកត្រូវជ្រើសរើសថាតើអ្នកចង់ឲ្យស្លាកគោលដៅ (target label) ត្រូវបានកូដរៀបចំជា one-hot encoded រឺអត់។ PyTorch និង TensorFlow អនុញ្ញាតឲ្យអ្នកផ្ដល់លេខថ្នាក់ថ្នាក់ជា ឬជាលេខគត់ (integer) (ចាប់ពី 0 ដល់ N-1) ឬជាវ៉ិចទ័រមួយ-hot encoded។ នៅពេលបង្កើតរចនាសម្ព័ន្ធបណ្ដាញប្រសិទ្ធភាព អ្នកត្រូវបញ្ជាក់មុខងារបាត់បង់ (loss function) អោយត្រូវគ្នា (ឧ. *sparse categorical crossentropy* សម្រាប់តំណាងជាលេខ និង *crossentropy loss* សម្រាប់ការតំណាងជា one-hot)។ ការគូដរៀបចំយ៉ាង one-hot encoding ក៏អាចធ្វើបាន [ដោយប្រើ Sklearn](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html) ឬដោយប្រើកូដនេះ៖\n", + "\n", + "```python\n", + "n_values = np.max(labels) + 1\n", + "labels_onehot = np.eye(n_values)[labels]\n", + "``` \n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "# Code to normalize and encode the data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### បំបែកទិន្នន័យទៅជា បណ្តុំឯកសារបង្រៀន និង បណ្តុំឯកសារធ្វើតេស្ត\n", + "\n", + "ដោយសារ​មិនមានឯកសារបណ្តុំបង្រៀន និងធ្វើតេស្តផ្សេងពីគ្នាទេ យើងត្រូវបំបែកវាចេញជាបណ្តុំបង្រៀន និងធ្វើតេស្ត [ប្រើប្រាស់ Sklearn](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "# Split the data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### កំណត់និងបណ្តុះបណ្តាល បណ្តាញប្រសាទ\n", + "\n", + "ឥឡូវនេះអ្នកបានរួចរាល់ចូលទៅកាន់កិច្ចការលើកនេះ ដំណើរការនាំចូលបណ្ណាល័យដែលអ្នកចូលចិត្ត កំណត់បណ្តាញប្រសាទ ហើយចាប់ផ្តើមបណ្តុះបណ្តាល ដោយយកចិត្តទុកដាក់លទ្ធភាពនៃភាពត្រឹមត្រូវក្នុងការបណ្តុះបណ្តាល និងការផ្ទៀងផ្ទាត់។\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Define the network" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Train the network" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "# Visualize train/validation accuracy graph" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### សាកល្បង\n", + "\n", + "ឥឡូវនេះ អ្នកអាចសាកល្បងជាមួយសំណង់បណ្ដាញផ្សេងៗ ដើម្បីមើលថាវាប៉ះពាល់ដល់លទ្ធផលយ៉ាងដូចម្តេច។ សូមសាកល្បង៖\n", + "1. បណ្ដាញមួយស្រទាប់មានណេយឺរ ៣ (ស្មើនឹងចំនួនថ្នាក់)\n", + "1. បណ្ដាញពីរស្រទាប់មានស្រទាប់លាក់តូច/មធ្យម/ធំ\n", + "1. ការប្រើប្រាស់ស្រទាប់ច្រើនជាងនេះ\n", + "\n", + "សូមប្រាកដថាអ្នកត្រូវតែសង្កេតឃើញការជ្រុះក្រោមពេលដែលអ្នកប្រើម៉ូឌែលមានណេយឺរច្រើន (ប៉ារ៉ាម៉ែត្រ)។\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Experiment" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ផ្នែក 2: ការបណ្តុះបណ្តាល MNIST\n", + "\n", + "ទាំង Keras និង PyTorch មាន MNIST ជាសំណុំទិន្នន័យដែលបានបញ្ចូលរួចហើយ ដូច្នេះអ្នកអាចទទួលបានវា​បានយ៉ាងងាយស្រួលជាមួយបន្ទាត់កូដពីរបន្ទាត់ ([Keras](https://keras.io/api/datasets/mnist/), [PyTorch](https://pytorch.org/vision/stable/datasets.html))។ អ្នកនឹងអាចបញ្ចូលទាំងសំណុំទិន្នន័យបណ្តុះបណ្តាល និងសំណុំទិន្នន័យសាកល្បងដោយមិនចាំបាច់បំបែកដោយដៃផងដែរ។\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Load the dataset" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ឥឡូវនេះអ្នកត្រូវតែអនុវត្តជំហានខាងលើដើម្បីធ្វើឱ្យ dataset ទាន់សម័យ (វាអាចជាករណីដែលមានរួចហើយ), ការបញ្ជាក់និងបណ្តុះបណ្តាលបណ្តាញប្រសិត្យ។\n", + "\n", + "## Takeaway\n", + "\n", + "1. បណ្តាញប្រសិត្យអាចត្រូវបានប្រើសម្រាប់ភារកិច្ចរៀនម៉ាស៊ីនបែបប្រពៃណី។ ទើបប៉ុន្តែវាក្នុងករណីជាច្រើនមានអំណាចខ្លាំងពេក ហើយអាចបណ្តាលឱ្យមានការប៉ាន់ប្រមាណលើស។\n", + "1. វាដ៏សំខាន់ក្នុងការងារនេះដែលអ្នកត្រូវតែតាំងចិត្តសង្កេតឃើញឥរិយាបថនៃការប៉ាន់ប្រមាណលើស ហើយព្យាយាមរួចពីវា។\n", + "1. ជាមួយនឹងស៊ុមដូចជា Keras ពេលខ្លះការបណ្តុះបណ្តាលបណ្តាញប្រសិត្យគឺងាយស្រួលយ៉ាងខ្លាំង។ ប៉ុន្តែអ្នកត្រូវតែយល់ពីអ្វីដែលកំពុងកើតឡើង។\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**ការបដិសេធ**: \nឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលដែលយើងខិតខំក្នុងការធានាថាព័ត៌មានត្រឹមត្រូវ សូមប្រយ័ត្នថាការបកប្រែដោយយន្តការអាចមានកំហុស ឬការខុសឆ្គង។ ឯកសារដើមដែលមានភាសាទម្រង់គួរត្រូវបានចាត់ទុកជារៀបចំផ្លូវការ។ សម្រាប់ព័ត៌មានសំខាន់ៗ សូមណែនាំឱ្យប្រើការបកប្រែដោយមនុស្សដែលមានវិជ្ជាជីវៈ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការវាយតម្លៃខុសណាមួយដែលកើតឡើងពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។\n\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.8.12" + }, + "orig_nbformat": 2 + }, + "nbformat": 4, + "nbformat_minor": 2 +} \ No newline at end of file diff --git a/translations/km/lessons/3-NeuralNetworks/05-Frameworks/lab/README.md b/translations/km/lessons/3-NeuralNetworks/05-Frameworks/lab/README.md new file mode 100644 index 00000000..a66de3e8 --- /dev/null +++ b/translations/km/lessons/3-NeuralNetworks/05-Frameworks/lab/README.md @@ -0,0 +1,23 @@ +# ការបែងចែកចំណាត់ថ្នាក់ជាមួយ PyTorch/TensorFlow + +ភារកិច្ចមន្ទីរ​បច្ចេកវិទ្យា​ពី [កម្មវិធីសិក្សា AI សម្រាប់អ្នកចុងក្រោយ](https://github.com/microsoft/ai-for-beginners)។ + +## ភារកិច្ច + +ដោះស្រាយបញ្ហាបែងចែកចំណាត់ថ្នាក់ពីរដោយប្រើបណ្តាញបណ្តុះបណ្តាលគ្រប់ជាន់តែមួយ និងច្រើនជាន់ ដោយប្រើ PyTorch ឬ TensorFlow៖ + +1. បញ្ហា **[ការបែងចែកចំណាត់ថ្នាក់ដើមឡូត្រូវ](https://en.wikipedia.org/wiki/Iris_flower_data_set)** - ជាឧទាហរណ៍នៃបញ្ហាជាមួយទិន្នន័យបែបតារាង ដែលអាចដោះស្រាយដោយមធ្យោបាយ ការបង្រៀនម៉ាស៊ីនបែបបុរាណ។ គោលបំណងរបស់អ្នកគឺត្រូវបែងចែកដើមឡូត្រូវជា 3 ថ្នាក់ ដោយផ្អែកលើប៉ារ៉ាម៉ែត្រជាលេខ 4។ +1. បញ្ហាការបែងចែកចំណាត់ថ្នាក់លេខសរសេរដៃ **MNIST** ដែលយើងបានឃើញមុនរួច។ + +សាកល្បងស្ថាបត្យកម្មបណ្តាញផ្សេងៗ ដើម្បីទទួលបានភាពត្រឹមត្រូវល្អបំផុតដែលអ្នកអាចទទួលបាន។ + +## សៀវភៅកំណត់ត្រាចាប់ផ្តើម + +ចាប់ផ្តើមមន្ទីរដោយ​បើក [LabFrameworks.ipynb](LabFrameworks.ipynb) + +--- + + +**ការព្រមាន**៖ +ឯកសារនេះត្រូវបានបម្លែងភាសាតាមរយៈសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលដែលយើងខិតខំប្រឹងប្រែងដើម្បីភាពត្រឹមត្រូវ សូមចំណាំថាការបកប្រែដautomatចអាចមានកំហុសឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមនៅក្នុងភាសាបុរាណគួរត្រូវបានយកជាចំណុចកំណត់សិទ្ធិ។ សម្រាប់ពត៌មានសំខាន់ គួរប្រើការបកប្រែដោយមនុស្សជំនាញជ מקצועי។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំនៅឬការបកប្រែខុសណាមួយដែលកើតឡើងពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។ + \ No newline at end of file diff --git a/translations/km/lessons/3-NeuralNetworks/README.md b/translations/km/lessons/3-NeuralNetworks/README.md new file mode 100644 index 00000000..469cd9e8 --- /dev/null +++ b/translations/km/lessons/3-NeuralNetworks/README.md @@ -0,0 +1,55 @@ +# ការណែនាំអំពីបណ្ដាញប្រសាទៈ + +![សង្ខេបមាតិកាការណែនាំបណ្ដាញប្រសាទក្នុងការគូររូប](../../../../translated_images/km/ai-neuralnetworks.1c687ae40bc86e83.webp) + +ដូចដែលយើងបានពិភាក្សានៅក្នុងការណែនាំ មធ្យោបាយមួយក្នុងការសម្រេចបានប្រសិទ្ធភាពគឺការបណ្តុះបណ្តាល **ម៉ូដែលកុំព្យូទ័រ** ឬ **ខួរក្បាលខ្លោងប្រព័ន្ធ**។ ចាប់ពីកណ្ដាលជួរឆ្នាំ២០ ពិភពរូបមន្ត គណិតវិទ្យានានាអ្នកស្រាវជ្រាវបានព្យាយាមម៉ូដែលគណិតវិទ្យាផ្សេងៗ រហូតដល់ក្នុងរយៈពេលថ្មីៗនេះទិសដៅនេះបានបង្ហាញពីភាពជោគជ័យយ៉ាងខ្លាំង។ ម៉ូដែលគណិតវិទ្យាបែបនេះគឺត្រូវបានហៅថា **បណ្ដាញប្រសាទ**។ + +> ម្តងម្ដងបណ្ដាញប្រសាទត្រូវបានហៅថា *បណ្ដាញប្រសាទខ្លោងប្រព័ន្ធ* សញ្ញា ANNs ដើម្បីបញ្ជាក់ថាយើងកំពុងនិយាយអំពីម៉ូដែល មិនមែនបណ្ដាញប្រសាទពិតទេ។ + +## ការសិក្សាម៉ាស៊ីន + +បណ្ដាញប្រសាទជាផ្នែកមួយនៃវិស័យធំមួយហៅថា **ការសិក្សាម៉ាស៊ីន** ដែលមានគោលបំណងប្រើទិន្នន័យក្នុងការបណ្តុះបណ្តាលម៉ូដែលកុំព្យូទ័រដែលអាចដោះស្រាយបញ្ហា។ ការសិក្សាម៉ាស៊ីនគឺជាផ្នែកមួយដ៏ធំនៃបញ្ញាសិប្បនិម្មិត ប៉ុន្តែយើងមិនដាក់បញ្ចូលការសិក្សាម៉ាស៊ីនបែបចាស់នោះក្នុងកម្មវិធីនេះ។ + +> សូមចូលទៅកាន់កម្មវិធីដាច់ខាត **[ការសិក្សាម៉ាស៊ីនសម្រាប់អ្នកចាប់ផ្តើម](http://github.com/microsoft/ml-for-beginners)** ដើម្បីរៀនបន្ថែមអំពីការសិក្សាម៉ាស៊ីនបែបចាស់។ + +ក្នុងការសិក្សាម៉ាស៊ីន យើងគិតថាយើងមានសំណុំទិន្នន័យជាគំរូ **X** និងតម្លៃចេញផ្សេងៗគ្នា **Y**។ គំរូជាច្រើនជាអ្វីដែលជាវិចទ័រពហុវដ្ត (N-dimensional vectors) ដែលមាន **លក្ខណៈ** ហើយតម្លៃចេញហៅថា **ស្លាក**។ + +យើងនឹងពិចារណាពីបញ្ហាសិក្សាម៉ាស៊ីនទាំងពីរដែលធម្មតាបំផុត៖ + +* **ការបែងចែកចំណាត់ថ្នាក់**, ដែលយើងត្រូវបែងចែកវត្ថុចូលទៅក្នុងពីរឬច្រើនថ្នាក់។ +* **ការវិលតម្លៃ**, ដែលយើងត្រូវទាយរកលេខគណនាលេខសម្រាប់គំរូចូលនីមួយៗ។ + +> នៅពេលបង្ហាញទិន្នន័យចូល និងចេញជាទិន្នន័យប្រភេទ tensor សំណុំទិន្នន័យចូលគឺជាម៉ាទ្រីសដែលមានទំហំ M×N ដែល M ជាចំនួនគំរូ និង N ជាចំនួនលក្ខណៈ។ ស្លាកចេញ Y ជាវិចទ័រទំហំ M។ + +ក្នុងកម្មវិធីនេះ យើងផ្ដោតសំខាន់លើម៉ូដែលបណ្ដាញប្រសាទតែប៉ុណ្ណោះ។ + +## ម៉ូដែលនៃអណឺរ៉ូន + +ចេញពីជីវវិទ្យា យើងដឹងថា ខួរក្បាលរបស់យើងមានពីសសរបស់ប្រសាទ (neurons) រៀងរាល់អណឺរ៉ូនមាន "ចូល" ច្រើន (dendrites) និង "ចេញ" មួយ (axon)។ ការចូល និងចេញទាំងពីរអាចបញ្ជូនសញ្ញាអគ្គិសនី ហើយការតភ្ជាប់រវាងពួកវា — ដែលគេហៅថា synapses — អាចបង្ហាញកំរិតនៃការបញ្ជូនភ្លើងខុសៗគ្នា ដែលត្រូវបានគ្រប់គ្រងដោយ neurotransmitters​។ + +![ម៉ូដែលនៃអណឺរ៉ូន](../../../../translated_images/km/synapse-wikipedia.ed20a9e4726ea1c6.webp) | ![ម៉ូដែលនៃអណឺរ៉ូន](../../../../translated_images/km/artneuron.1a5daa88d20ebe6f.webp) +----|---- +អណឺរ៉ូនពិត *([រូបភាព](https://en.wikipedia.org/wiki/Synapse#/media/File:SynapseSchematic_lines.svg) ពីវិគីភីឌា)* | អណឺរ៉ូនសិប្បនិម្មិត *(រូបភាពដោយអ្នកនិពន្ធ)* + +ដូចនេះ ម៉ូដែលគណិតវិទ្យា​ធម្មតា​បំផុត​នៃអណឺរ៉ូនមានចូលច្រើន X1, ..., XN និងចេញ Y រួមជាមួយស៊េរីនៃប៉ារ៉ាម៉ែត្រ W1, ..., WN។ ចេញ Y ត្រូវបានគណនាដូចជា៖ + +Y = f\left(\sum_{i=1}^N X_iW_i\right) + +ដែល f ជា **អនុគមន៍សកម្មភាព** មួយដែលមិនមែនជាលីនេអាល់។ + +> ម៉ូដែលដើមនៃអណឺរ៉ូនត្រូវបានពិពណ៌នានៅក្នុងឯកសារចាស់ [A logical calculus of the ideas immanent in nervous activity](https://www.cs.cmu.edu/~./epxing/Class/10715/reading/McCulloch.and.Pitts.pdf) ដោយ Warren McCullock និង Walter Pitts ឆ្នាំ 1943. Donald Hebb ក្នុងសៀវភៅរបស់គាត់ "[The Organization of Behavior: A Neuropsychological Theory](https://books.google.com/books?id=VNetYrB8EBoC)" បានណែនាំពីវិធីដែលបណ្ដាញទាំងនោះអាចត្រូវបានបណ្តុះបណ្តាល។ + +## នៅផ្នែកនេះ + +នៅផ្នែកនេះ យើងនឹងរៀនអំពី៖ +* [Perceptron](03-Perceptron/README.md), មួយក្នុងចំណោមម៉ូដែលបណ្ដាញប្រសាទដំបូងសម្រាប់ការបែងចែកចំណាត់ថ្នាក់ពីរថ្នាក់ +* [បណ្ដាញជាច្រើនស្រទាប់](04-OwnFramework/README.md) ជាមួយកំណត់ចំណាំគូសynchronized [របៀបកសាងស៊ុមផ្ទាល់ខ្លួន](04-OwnFramework/OwnFramework.ipynb) +* [ស៊ុមបណ្ដាញប្រសាទ](05-Frameworks/README.md), ជាមួយកំណត់ចំណាំទាំងនេះ៖ [PyTorch](05-Frameworks/IntroPyTorch.ipynb) និង [Keras/Tensorflow](05-Frameworks/IntroKerasTF.ipynb) +* [ការទទួលផ្លូវពេក](../../../../lessons/3-NeuralNetworks/05-Frameworks) + +--- + + +**ការបដិសេធ**៖ +ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលយើងព្យាយាមរក្សាការត្រឹមត្រូវ សូមជ្រាបថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុស ឬការមិនត្រឹមត្រូវមួយចំនួន។ ឯកសារដើមនៅភាសាប្រភពគួរត្រូវបានចាត់ទុកថាជា ប្រភពដែលមានអំណាចបំផុត។ សម្រាប់ព័ត៌មានសំខាន់ៗ គួរតែប្រើការបកប្រែដោយមនុស្សដែលជាមនុស្សជំនាញ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំណាមួយ ឬការប្រែប្រួលមិនត្រឹមត្រូវណាមួយដែលកើតឡើងពីការប្រើប្រាស់ការបកប្រែនេះទេ។ + \ No newline at end of file diff --git a/translations/kn/.co-op-translator.json b/translations/kn/.co-op-translator.json index 47b057d0..5a518530 100644 --- a/translations/kn/.co-op-translator.json +++ b/translations/kn/.co-op-translator.json @@ -6,8 +6,8 @@ "language_code": "kn" }, "README.md": { - "original_hash": "9eaca839b0b3f6d7f0a195fd33cebd30", - "translation_date": "2026-02-28T09:01:36+00:00", + "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", + "translation_date": "2026-04-06T16:56:31+00:00", "source_file": "README.md", "language_code": "kn" }, diff --git a/translations/kn/README.md b/translations/kn/README.md index a51d2cca..9b97ca40 100644 --- a/translations/kn/README.md +++ b/translations/kn/README.md @@ -12,177 +12,177 @@ [![Microsoft Foundry Discord](https://dcbadge.limes.pink/api/server/nTYy5BXMWG)](https://discord.gg/nTYy5BXMWG) -# ಪ್ರಾರಂಭಿಕರಿಗಾಗಿ ಕೃತಕ ಬುದ್ಧಿಮತ್ತೆ - ಪಾಠಕ್ರಮ +# ಆರಂಭಿಕರಿಗಾಗಿ ಕೃತಕ ಬುದ್ಧಿಮತ್ತೆ - ಒಂದು ಪಾಠಕ್ರಮ |![Sketchnote by @girlie_mac https://twitter.com/girlie_mac](https://github.com/microsoft/AI-For-Beginners/raw/main/lessons/sketchnotes/ai-overview.png)| |:---:| -| ಪ್ರಾರಂಭಿಕರಿಗಾಗಿ ಏಐ - _ಸ್ಕೆಚ್ನೋಟ್ [@girlie_mac](https://twitter.com/girlie_mac) ಅವರಿಂದ_ | +| ಆರಂಭಿಕರಿಗಾಗಿ ಎಐ - _ಸ್ಕೆಚ್ನೋಟ್ [@girlie_mac](https://twitter.com/girlie_mac) ಅವರಿಂದ_ | -ನಮ್ಮ 12-ವಾರ, 24-ಪಾಠಗಳ ಪಠ್ಯಕ್ರಮದೊಂದಿಗೆ **ಕೃತಕ ಬುದ್ಧಿಮತ್ತೆ** (AI) ಲೋಕವನ್ನು ಅನ್ವೇಷಿಸಿ! ಇದರಲ್ಲಿ ಪ್ರಾಯೋಗಿಕ ಪಾಠಗಳು, ಪ್ರಶ್ನೋತ್ತರಗಳು ಮತ್ತು ಪ್ರಯೋಗಾಗಾರಗಳು ಸೇರಿವೆ. ಪಠ್ಯಕ್ರಮವು ಪ್ರಾರಂಭಿಕರುಗಳಿಗೆ ವಿನ್ಯಾಸಗೊಳಿಸಲಾಗಿದೆ ಮತ್ತು TensorFlow ಮತ್ತು PyTorch ಸೇರಿದಂತೆ ಉಪಕರಣಗಳನ್ನು ಹಾಗೂ ಏಐನಲ್ಲಿ ಇರೋ ನೀತಿಶಾಸ್ತ್ರಗಳನ್ನು ಒಳಗೊಂಡಿದೆ. +ನಮ್ಮ 12-ವಾರಗಳ, 24 ಪಾಠಗಳ ಪಾಠಕ್ರಮದೊಂದಿಗೆ **ಕೃತಕ ಬುದ್ಧಿಮತ್ತೆ** (AI) ಜಗತ್ತನ್ನು ಅನ್ವೇಷಿಸಿರಿ! ಇದು ಪ್ರಾಯೋಗಿಕ ಪಾಠಗಳು, ಕ್ವಿಜ್‌ಗಳು ಮತ್ತು ಪ್ರಯೋಗಶಾಲೆಗಳನ್ನೊಳಗೊಂಡಿದೆ. ಪಾಠಕ್ರಮವು ಆರಂಭಿಕರಿಗೂ ಅನುಗುಣವಾಗಿದ್ದು, TensorFlow ಮತ್ತು PyTorch ಸೇರಿದಂತೆ ಉಪಕರಣಗಳನ್ನು ಹಾಗೂ AI ನ ನೈತಿಕತೆಯನ್ನು ಒಳಗೊಂಡಿದೆ. -### 🌐 ಬಹುಭಾಷಾ ಬೆಂಬಲ -#### GitHub ಕ್ರಿಯೆಯಿಂದ ಬೆಂಬಲಿಸಲಾಗಿದೆ (ಸ್ವಯಂಚಾಲಿತ ಮತ್ತು ಎಂದಿಗೂ ನವೀಕೃತ) +### 🌐 ಬಹು-ಭಾಷಾ ಬೆಂಬಲ + +#### GitHub ಕ್ರಿಯೆಯ ಮೂಲಕ ಬೆಂಬಲಿತ (ಸ್ವಯಂಚಾಲಿತ ಮತ್ತು ಸದಾ ನವೀಕೃತ) -[Arabic](../ar/README.md) | [Bengali](../bn/README.md) | [Bulgarian](../bg/README.md) | [Burmese (Myanmar)](../my/README.md) | [Chinese (Simplified)](../zh-CN/README.md) | [Chinese (Traditional, Hong Kong)](../zh-HK/README.md) | [Chinese (Traditional, Macau)](../zh-MO/README.md) | [Chinese (Traditional, Taiwan)](../zh-TW/README.md) | [Croatian](../hr/README.md) | [Czech](../cs/README.md) | [Danish](../da/README.md) | [Dutch](../nl/README.md) | [Estonian](../et/README.md) | [Finnish](../fi/README.md) | [French](../fr/README.md) | [German](../de/README.md) | [Greek](../el/README.md) | [Hebrew](../he/README.md) | [Hindi](../hi/README.md) | [Hungarian](../hu/README.md) | [Indonesian](../id/README.md) | [Italian](../it/README.md) | [Japanese](../ja/README.md) | [Kannada](./README.md) | [Korean](../ko/README.md) | [Lithuanian](../lt/README.md) | [Malay](../ms/README.md) | [Malayalam](../ml/README.md) | [Marathi](../mr/README.md) | [Nepali](../ne/README.md) | [Nigerian Pidgin](../pcm/README.md) | [Norwegian](../no/README.md) | [Persian (Farsi)](../fa/README.md) | [Polish](../pl/README.md) | [Portuguese (Brazil)](../pt-BR/README.md) | [Portuguese (Portugal)](../pt-PT/README.md) | [Punjabi (Gurmukhi)](../pa/README.md) | [Romanian](../ro/README.md) | [Russian](../ru/README.md) | [Serbian (Cyrillic)](../sr/README.md) | [Slovak](../sk/README.md) | [Slovenian](../sl/README.md) | [Spanish](../es/README.md) | [Swahili](../sw/README.md) | [Swedish](../sv/README.md) | [Tagalog (Filipino)](../tl/README.md) | [Tamil](../ta/README.md) | [Telugu](../te/README.md) | [Thai](../th/README.md) | [Turkish](../tr/README.md) | [Ukrainian](../uk/README.md) | [Urdu](../ur/README.md) | [Vietnamese](../vi/README.md) +[ಅರೆಬಿಕ್](../ar/README.md) | [ಬೆಂಗಳಿ](../bn/README.md) | [ಬಲ್ಗೇರಿಯನ್](../bg/README.md) | [ಬರ್ಮಿ (ಮ್ಯಾನ್ಮಾರ್)](../my/README.md) | [ಚೀनी (ಸರಳೀಕೃತ)](../zh-CN/README.md) | [ಚೀनी (ಪಾರಂಪರಿಕ, ಹಾಂಗ್ ಕಾಂಗ್)](../zh-HK/README.md) | [ಚೀनी (ಪಾರಂಪರಿಕ, मकाऊ)](../zh-MO/README.md) | [ಚೀनी (ಪಾರಂಪರಿಕ, ತೈವಾನ್)](../zh-TW/README.md) | [ಕ್ರೊಯೇಷಿಯನ್](../hr/README.md) | [ಚೆಕ್](../cs/README.md) | [ಡ್ಯಾನಿಶ್](../da/README.md) | [ಡಚ್](../nl/README.md) | [ಎಸ್ಟೋನಿಯನ್](../et/README.md) | [ಫಿನ್ನಿಷ್](../fi/README.md) | [ಫ್ರೆಂಚ್](../fr/README.md) | [ಜರ್ಮನ್](../de/README.md) | [ಗ್ರೀಕ್](../el/README.md) | [ಹೆಬ್ರ್ಯೂ](../he/README.md) | [ಹಿಂದಿ](../hi/README.md) | [ಹಂಗೇರಿಯನ್](../hu/README.md) | [ಇಂಡೋನೇಶಿಯನ್](../id/README.md) | [ಇಟಾಲಿಯನ್](../it/README.md) | [ಜಪಾನೀಸ್](../ja/README.md) | [ಕನ್ನಡ](./README.md) | [ಖ್ಮೇರ್](../km/README.md) | [ಕೋರಿಯನ್](../ko/README.md) | [ಲಿಥುವೇನಿಯನ್](../lt/README.md) | [ಮಲಯ್](../ms/README.md) | [ಮಲಯಾಳಂ](../ml/README.md) | [ಮರಾಠಿ](../mr/README.md) | [ನೇಪಾಳಿ](../ne/README.md) | [ನೈಜೀರಿಯನ್ ಪಿಡ್ಜಿನ್](../pcm/README.md) | [ನಾರ್ವೇಜಿಯನ್](../no/README.md) | [ಪರ್ಷಿಯನ್ (ಫಾರ್ಸಿ)](../fa/README.md) | [ಪೋಲಿಶ್](../pl/README.md) | [ಪೋರ್ಟುಗೀಸ್ (ಬ್ರೆಜಿಲ್)](../pt-BR/README.md) | [ಪೋರ್ಟುಗೀಸ್ (ಪೋರ್ಟುಗ್ಗಲ್)](../pt-PT/README.md) | [ಪಂಜಾಬಿ (ಗುರ್ಮುಖಿ)](../pa/README.md) | [ರೊಮಾನಿಯನ್](../ro/README.md) | [ರಷಿಯನ್](../ru/README.md) | [ಸರ್ಬಿಯನ್ (ಸಿರಿಲಿಕ್)](../sr/README.md) | [ಸ್ಲೋವಕ್](../sk/README.md) | [ಸ್ಲೋವೇನಿಯನ್](../sl/README.md) | [ಸ್ಪಾನಿಷ್](../es/README.md) | [ಸ್ವಾಹಿಲಿ](../sw/README.md) | [ಸ್ವೀಡಿಷ್](../sv/README.md) | [ಟಾಗಾಲೋಗ್ (ಫಿಲಿಫಿನೋ)](../tl/README.md) | [ತಮಿಳು](../ta/README.md) | [ತೆಲುಗು](../te/README.md) | [ಥಾಯ್](../th/README.md) | [ಟರ್ಕಿಶ್](../tr/README.md) | [ಉಕ್ರೇನಿಯನ್](../uk/README.md) | [ಉರ್ದು](../ur/README.md) | [ವಿಯೆಟ್ನಾಮಿ](../vi/README.md) -> **ಸ್ಥಳೀಯವಾಗಿ ಕ್ಲೋನ್ ಮಾಡಿಕೊಳ್ಳಬೇಕೇ?** +> **ಸ್ಥಳೀಯವಾಗಿ ಕ್ಲೋನ್ ಮಾಡಬೇಕು?** > -> ಈ ಸಂಗ್ರಹ 50 ಕ್ಕೆ ಹೆಚ್ಚು ಭಾಷಾ ಅನುವಾದಗಳನ್ನು ಒಳಗೊಂಡಿದ್ದು ಡೌನ್‌ಲೋಡ್ ಗಾತ್ರವನ್ನು ಸಾಕಷ್ಟು ಹೆಚ್ಹು ಮಾಡುತ್ತದೆ. ಅನುವಾದಗಳಿಲ್ಲದೆ ಕ್ಲೋನ್ ಮಾಡಲು ಸ್ಪಾರ್ಸ್ ಚೆಕೌಟ್ ಬಳಸಿ: +> ಈ ರೆಪೊಸಿಟರಿಯಲ್ಲಿ 50+ ಭಾಷಾಂತರಗಳು ಸೇರಿವೆ, ಅವು ಡೌನ್ಲೋಡ್ ಗಾತ್ರವನ್ನು ಬಹಳ ಹೆಚ್ಚಿಸುತ್ತವೆ. ಭಾಷಾಂತರಗಳಿಲ್ಲದೆ ಕ್ಲೋನ್ ಮಾಡಲು, ಸ್ಪಾರ್ಸ್ ಚೆ ಕ್ಯುಟ್ ಬಳಸಿ: > -> **ಬ್ಯಾಷ್ / ಮ್ಯಾಕ್‌ಒಎಸ್ / ಲಿನಕ್ಸ್ಗೆ:** +> **Bash / macOS / Linux:** > ```bash > git clone --filter=blob:none --sparse https://github.com/microsoft/AI-For-Beginners.git > cd AI-For-Beginners > git sparse-checkout set --no-cone '/*' '!translations' '!translated_images' > ``` > -> **CMD (ವಿಂಡೋಸ್):** +> **CMD (Windows):** > ```cmd > git clone --filter=blob:none --sparse https://github.com/microsoft/AI-For-Beginners.git > cd AI-For-Beginners > git sparse-checkout set --no-cone "/*" "!translations" "!translated_images" > ``` > -> ಇದರಿಂದ ನೀವು ಕೋರ್ಸನ್ನು ಸಂಪೂರ್ಣವಾಗಿ ಮುಗಿಸುವುದಕ್ಕೆ ತುಂಬಾ ವೇಗವಾಗಿ ಡೌನ್‌ಲೋಡ್ ಮಾಡಬಹುದು. +> ಇದರಿಂದ ನೀವು ಕೋರ್ಸ್ ಸಂಪೂರ್ಣ ಮಾಡಲು ಬೇಕಾಗುವ ಅನೇಕ ವಸ್ತುಗಳನ್ನು ತ್ವರಿತ ಡೌನ್ಲೋಡ್ ಸಹಿತ ಪಡೆದುಕೊಳ್ಳಬಹುದು. -**ನಿಮಗೆ ಹೆಚ್ಚುವರಿ ಅನುವಾದ ಭಾಷೆಗಳನ್ನು ಬೆಂಬಲಿಸುವುದು ಆಸಕ್ತಿಯಾಗಿದ್ದರೆ, ಅವುಗಳನ್ನು ಇಲ್ಲಿ [ಕಾಣಬಹುದು](https://github.com/Azure/co-op-translator/blob/main/getting_started/supported-languages.md)** +**ನೀವು ಹೆಚ್ಚುವರಿ ಭಾಷಾಂತರಗಳನ್ನು ಬೆಂಬಲಿಸಲು ಇಚ್ಛಿಸುವಿದ್ದರೆ ಅವುಗಳನ್ನು [ಇಲ್ಲಿ](https://github.com/Azure/co-op-translator/blob/main/getting_started/supported-languages.md) ಪಟ್ಟಿ ಮಾಡಲಾಗಿದೆ** -## ಸಮುದಾಯದಲ್ಲಿಗೆ ಸೇರಿ +## ಸಮುದಾಯಕ್ಕೆ ಸೇರ್ಪಡೆ [![Microsoft Foundry Discord](https://dcbadge.limes.pink/api/server/nTYy5BXMWG)](https://discord.gg/nTYy5BXMWG) -## ನೀವು ಕಲಿಯುವುದು ಏನು +## ನೀವು ಕಲಿಯುವುವು -**[ಪಾಠಕ್ರಮದ ಮೈಂಡ್‌ಮ್ಯಾಪ್](http://soshnikov.com/courses/ai-for-beginners/mindmap.html)** +**[ಪಾಠಕ್ರಮದ ಮನಃಮಾಪನ](http://soshnikov.com/courses/ai-for-beginners/mindmap.html)** -ಈ ಪಠ್ಯક્રમದಲ್ಲಿ, ನೀವು ಕಲಿಯುವುದು: +ಈ ಪಾಠಕ್ರಮದಲ್ಲಿ, ನೀವು ಕಲಿಯುವಿರಿ: -* **ಕೃತಕ ಬುದ್ಧಿಮತ್ತೆಗೆ ವಿಭಿನ್ನ ಪ್ರವರ್ತನೆಗಳು**, "ಹಳೆಯ" ಸಂಕೇತಾತ್ಮಕ ವಿಧಾನ ಜೊತೆಗೆ **ಜ್ಞಾನ ಪ್ರತಿನಿಧಾನ** ಮತ್ತು ತರ್ಕಶಾಸ್ತ್ರವನ್ನು ಒಳಗೊಂಡಂತೆ ([GOFAI](https://en.wikipedia.org/wiki/Symbolic_artificial_intelligence)). -* **ನ್ಯೂರಲ್ ನೆಟ್ವರ್ಕ್‌ಗಳು** ಮತ್ತು **ಡೀಪ್ ಲರ್ನಿಂಗ್**, ಇವುಗಳು ಆಧುನಿಕ ಏಐಯ ಮೂಲಭೂತ ಅಂಶಗಳು. ನಾವು ಈ ಮುಖ್ಯ ವಿಷಯಗಳ ಹಿಂದಿನ ಪರಿಕಲ್ಪನೆಗಳನ್ನು ಕೋಡ್ ಮೂಲಕ [TensorFlow](http://Tensorflow.org) ಮತ್ತು [PyTorch](http://pytorch.org) ಎಂಬ ಎರಡು ಜನಪ್ರಿಯ ಫ್ರೇಮ್ವರ್ಕ್‌ಗಳ ಮೂಲಕ ವಿವರಿಸುತ್ತೇವೆ. -* ಚಿತ್ರಗಳ ಮತ್ತು ಪಠ್ಯದೊಂದಿಗೆ ಕೆಲಸ ಮಾಡುವ **ನ್ಯೂರಲ್ ವಾಸ್ತುಶಿಲ್ಪಗಳು**. ನಾವು ಇತ್ತೀಚಿನ ಮಾದರಿಗಳನ್ನು ವಿವರಿಸುವೆವು, ಆದರೆ ಅತ್ಯಾಧುನಿಕ ಸ್ಥಿತಿಗೆ ಸ್ವಲ್ಪ ಕೊರತೆ ಇರಬಹುದು. -* ಕಡಿಮೆ ಜನಪ್ರಿಯ ಏಐ ವಿಧಾನಗಳು, ಉದಾ: **ಜನಿತಿಕ ಅಲ್ಗಾರಿಥಮ್‌ಗಳು** ಮತ್ತು **ಬಹು-ಏಜೆಂಟ್ ವ್ಯವಸ್ಥೆಗಳು**. +* ವಿಭಿನ್ನ ಕೃತಕ ಬುದ್ಧಿಮತ್ತೆ ಪ್ರವರ್ತನೆಗಳು, "ಹಳೆಯ" ಸಂಕೇತಾತ್ಮಕ ವಿಧಾನ ಸೇರಿದಂತೆ **ಜ್ಞಾನ ಪ್ರತಿನಿಧಾನ** ಮತ್ತು ತರ್ಕ ಪದ್ಧತಿ ([GOFAI](https://en.wikipedia.org/wiki/Symbolic_artificial_intelligence)). +* **ನ್ಯೂರಲ್ ನೆಟ್‌ವರ್ಕ್‌ಗಳು** ಮತ್ತು **ಗಾಢ ಶಿಕ್ಷಣ**, ಇದು ಆಧುನಿಕ ಎಐಯ ಹೃದಯವಾಗಿದೆ. ನಾವು ಈ ಪ್ರಮುಖ ವಿಷಯಗಳನ್ನು ಎರಡು ಜನಪ್ರಿಯ ಫ್ರೆಮ್ವರ್ಕ್‌ಗಳು - [TensorFlow](http://Tensorflow.org) ಮತ್ತು [PyTorch](http://pytorch.org) ಬಳಸಿ ಕೋಡ್ ಮೂಲಕ ವಿವರಿಸಲಾಗುವುದು. +* ಚಿತ್ರ ಮತ್ತು ಪಠ್ಯಕ್ಕಾಗಿ **ನ್ಯೂರಲ್ ವಾಸ್ತುಶಿಲ್ಪಗಳು**. ನಾವು ಇತ್ತೀಚಿನ ಮಾದರಿಗಳನ್ನು ಒಳಗೊಂಡಿದ್ದೇವೆ ಆದರೆ ಆಧುನಿಕ ತಾಂತ್ರಿಕ ದಿಕ್ಕಿನಲ್ಲಿ ಸ್ವಲ್ಪ ಕೊರತೆ ಇರಬಹುದು. +* ಕಡಿಮೆ ಜನಪ್ರಿಯ ಎಐ ವಿಧಾನಗಳು, ಉದಾ: **ಜನೆಟಿಕ್ ಅಲ್ಗಾರಿದಮ್‌ಗಳು** ಮತ್ತು **ಮಲ್ಟಿ- ಏಜೆಂಟ್ ವ್ಯವಸ್ಥೆಗಳು**. -ಈ ಪಠ್ಯಕ್ರಮದಲ್ಲಿ ನಾವು ಒಳಗೊಂಡಿರಲಾರದವು: +ಈ ಪಾಠಕ್ರಮದಲ್ಲಿ ನಾವು ಸೇರಿಸದಿರುವವು: -> [ಈ ಕೋರ್ಸ್‌ಗೆ ಸಂಬಂಧಿಸಿದ ಎಲ್ಲಾ ಹೆಚ್ಚುವರಿ ಸಂಪನ್ಮೂಲಗಳನ್ನು ನಮ್ಮ 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) -* **ವ್ಯಾಪಾರದಲ್ಲಿ ಏಐ** ಬಳಕೆಯ ವ್ಯಾಪಾರ ಪ್ರಕರಣಗಳು. ಇದಕ್ಕಾಗಿ ನೀವು [Introduction to AI for business users](https://docs.microsoft.com/learn/paths/introduction-ai-for-business-users/?WT.mc_id=academic-77998-bethanycheum) ಹುಡುಕಬಹುದು ಅಥವಾ [AI Business School](https://www.microsoft.com/ai/ai-business-school/?WT.mc_id=academic-77998-bethanycheum) ಬಯಸಬಹುದು, ಇದು [INSEAD](https://www.insead.edu/) ಸಹಯೋಗದಲ್ಲಿ ಅಭಿವೃದ್ಧಿಪಡಿಸಲಾಗಿದೆ. -* ನಮ್ಮ [Machine Learning for Beginners Curriculum](http://github.com/Microsoft/ML-for-Beginners) ನಲ್ಲಿ ಚೆನ್ನಾಗಿ ವಿವರಿಸಿರುವ **ಪ್ರಾಚೀನ ಯಂತ್ರ ಅಧ್ಯಯನ**. -* **ಕಾಗ್ನಿಟಿವ್ ಸರ್ವೀಸಸ್** ಬಳಸಿ ನಿರ್ಮಿಸಲಾದ ಪ್ರಾಯೋಗಿಕ ಏಐ ಅನ್ವಯಿಕೆಗಳು. ಇದಕ್ಕಾಗಿ, ನಾವು 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 ಸೇವೆಯೊಂದಿಗೆ ಜನನಾತ್ಮಕ ಏಐ](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). ನೀವು [Build and operate machine learning solutions with Azure Machine Learning](https://docs.microsoft.com/learn/paths/build-ai-solutions-with-azure-ml-service/?WT.mc_id=academic-77998-bethanycheum) ಮತ್ತು [Build and Operate Machine Learning Solutions with Azure Databricks](https://docs.microsoft.com/learn/paths/build-operate-machine-learning-solutions-azure-databricks/?WT.mc_id=academic-77998-bethanycheum) ಎಂಬ ಪಾಠಕ್ರಮಗಳನ್ನು ಬಳಕೆ ಮಾಡಬಹುದು. -* **ವಾರ್ತಾ ಏಐ** ಮತ್ತು **ಚಾಟ್‌ಬಾಟ್‌ಗಳು**. ಇದಕ್ಕೆ ವಿಭಿನ್ನ [Create conversational AI solutions](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/) ಅನ್ನು ನೋಡಬಹುದು. -* ಆಳವಾದ ಲರ್ನಿಂಗ್ ಹಿಂದೆ ಇರುವ **ಗಭೀರ ಗಣಿತಶಾಸ್ತ್ರ**. ಇದಕ್ಕಾಗಿ ನಾವು ಇಯಾನ್ ಗೂಡ್ಫೆಲ್ಲೋ, Yoshua Bengio ಮತ್ತು ಆರೋನ್ ಕೌರ್ವಿಲ್ ರವರು ಬರೆಯಲಾದ [Deep Learning](https://www.amazon.com/Deep-Learning-Adaptive-Computation-Machine/dp/0262035618) ಅನ್ನು ಶಿಫಾರಸು ಮಾಡುತ್ತೇವೆ, ಇದು [https://www.deeplearningbook.org/](https://www.deeplearningbook.org/) ನಲ್ಲಿ ऑनलाइन ಲಭ್ಯವಿದೆ. +* **ವ್ಯಾಪಾರದಲ್ಲಿ 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), [INSEAD](https://www.insead.edu/) ಜೊತೆ ಸಹಯೋಗದಲ್ಲಿ ಅಭಿವೃದ್ಧಿಪಡಿಸಲಾಗಿದೆ, ಎಂಬ ಅಧ್ಯಯನ ಮಾರ್ಗಗಳನ್ನು ಪರಿಗಣಿಸಿ. +* **ಸರಳ ಯಂತ್ರ ಅಧ್ಯಯನ**, ಇದು ನಮ್ಮ [ಆರಂಭಿಕರಿಗಾಗಿ ಯಂತ್ರ ಅಧ್ಯಯನ ಪಾಠಕ್ರಮ](http://github.com/Microsoft/ML-for-Beginners) ನಲ್ಲಿ ಚೆನ್ನಾಗಿ ವಿವರಿಸಲಾಗಿದೆ. +* **[ಜ್ಞಾನ ಸೇವೆಗಳು](https://azure.microsoft.com/services/cognitive-services/?WT.mc_id=academic-77998-bethanycheum)** ಬಳಸಿ ನಿರ್ಮಿಸಿದ್ದ ಪ್ರಾಯೋಗಿಕ ಎಐ ಅನ್ವಯಿಕೆಗಳು. ಇದಕ್ಕಾಗಿ ನಾವು 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 ಸೇವೆ ಜೊತೆಗೆ ಜನರೇಟಿವ್ AI](https://learn.microsoft.com/en-us/training/paths/develop-ai-solutions-azure-openai/?WT.mc_id=academic-77998-bethanycheum)** ಮತ್ತು ಇತ್ಯಾದಿ ಮಾಯಾಜಾಲಗಳಿಗೆ ಆರಂಭಿಸಲು ಶಿಫಾರಸು ಮಾಡುತ್ತೇವೆ. +* ವಿಶೇಷ ML **ಕ್ಲೌಡ್ ಫ್ರೇಮ್ವರ್ಕ್‌ಗಳು**, ಉದಾ: [ಅಜೂರ್ ಯಂತ್ರ ಅಧ್ಯಯನ](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), ಅಥವಾ [ಅಜೂರ್ ಡೇಟಾಬ್ರಿಕ್ಸ್](https://docs.microsoft.com/learn/paths/data-engineer-azure-databricks?WT.mc_id=academic-77998-bethanycheum). [ಅಜೂರ್ ಯಂತ್ರ ಅಧ್ಯಯನದೊಂದಿಗೆ ಯಂತ್ರ ಅಧ್ಯಯನ ಪರಿಹಾರಗಳನ್ನು ನಿರ್ಮಿಸಿ ಮತ್ತು ಚಾಲನೆ ಮಾಡಿ](https://docs.microsoft.com/learn/paths/build-ai-solutions-with-azure-ml-service/?WT.mc_id=academic-77998-bethanycheum) ಮತ್ತು [ಅಜೂರ್ ಡೇಟಾಬ್ರಿಕ್ಸ್ ಜೊತೆಗೆ ಯಂತ್ರ ಅಧ್ಯಯನ ಪರಿಹಾರಗಳನ್ನು ನಿರ್ಮಿಸಿ ಮತ್ತು ಚಾಲನೆ ಮಾಡಿ](https://docs.microsoft.com/learn/paths/build-operate-machine-learning-solutions-azure-databricks/?WT.mc_id=academic-77998-bethanycheum) ಎಂಬ ಅಧ್ಯಯನ ಮಾರ್ಗಗಳನ್ನು ಬಳಸಿ. +* **ಸಂವಾದಾತ್ಮಕ ಎಐ** ಮತ್ತು **ಚಾಟ್ ಬಾಟ್‌ಗಳು**. ಒಂದು ವಿಶಿಷ್ಟ [ಸಂವಾದಾತ್ಮಕ ಎಐ ಪರಿಹಾರಗಳನ್ನು ರಚಿಸುವುದು](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/) ನೋಡಬಹುದು. +* ಗಾಢ ಶಿಕ್ಷಣದ ಹಿಂದೆ ಇರುವ **ಗಾಢ ಗಣಿತ**. ಇದಕ್ಕಾಗಿ ನಾವು ಇಯಾನ್ ಗೂಡ್ಫೆಲ್ಲೋ, Yoshua Bengio ಮತ್ತು ಅ್ಯಾರೊನ್ ಕೌರ್ವಿಲ್ ರವರ [ಗಾಢ ಶಿಕ್ಷಣ](https://www.amazon.com/Deep-Learning-Adaptive-Computation-Machine/dp/0262035618) ಪುಸ್ತಕವನ್ನು ಶಿಫಾರಸು ಮಾಡುತ್ತೇವೆ, ಇದು ಆನ್‌ಲೈನ್‌ ನಲ್ಲಿ [https://www.deeplearningbook.org/](https://www.deeplearningbook.org/) ಲಭ್ಯವಿದೆ. -_ಮೇಘದಲ್ಲಿ ಏಐ_ ವಿಷಯಗಳಿಗೆ ಸಾಫ್ಟ್ ಪರಿಚಯಕ್ಕಾಗಿ ನೀವು [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) ಪಾಠಕ್ರಮವನ್ನು ಆಯ್ಕೆಮಾಡಬಹುದು. +_ಎಐ ಇನ್ ದ ಕ್ಲೌಡ್_ ವಿಷಯಗಳಿಗೆ ಸೌಮ್ಯ ಪರಿಚಯಕ್ಕಾಗಿ ನೀವು [ಅಜೂರ್‌ನಲ್ಲಿ ಕೃತಕ ಬುದ್ಧಿಮತ್ತೆ ಆರಂಭಿಸೋಣ](https://docs.microsoft.com/learn/paths/get-started-with-artificial-intelligence-on-azure/?WT.mc_id=academic-77998-bethanycheum) ಎಂಬ ಅಧ್ಯಯನ ಮಾರ್ಗವನ್ನು ಪರಿಗಣಿಸಬಹುದು. -# ವಿಷಯ +# ವಿಷಯवಸ್ತು -| | ಪಾಠ ಲಿಂಕ್ | PyTorch/Keras/TensorFlow | ಪ್ರಯೋಗಾಗಾರ | +| | ಪಾಠ ಲಿಂಕ್ | PyTorch/Keras/TensorFlow | ಪ್ರಯೋಗಶಾಲೆ | | :-: | :------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------: | ------------------------------------------------------------------------------ | -| 0 | [ಪಾಠಕ್ರಮ ಸಿದ್ಧತೆ](./lessons/0-course-setup/setup.md) | [ನಿಮ್ಮ ಅಭಿವೃದ್ಧಿ ವಾತಾವರಣವನ್ನು ಸಿದ್ಧಪಡಿಸಿ](./lessons/0-course-setup/how-to-run.md) | | -| I | [**ಏಐಗೆ ಪರಿಚಯ**](./lessons/1-Intro/README.md) | | | -| 01 | [ಏಐ ಪರಿಚಯ ಮತ್ತು ಇತಿಹಾಸ](./lessons/1-Intro/README.md) | - | - | -| II | **ಸಂಕೇತಾತ್ಮಕ ಏಐ** | -| 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) ||| +| 0 | [ಕೋರ್ಸ್ ಸೆಟಪ್](./lessons/0-course-setup/setup.md) | [ನಿಮ್ಮ ಅಭಿವೃದ್ಧಿ ಪರಿಸರವನ್ನು ಸೆಟಪ್ ಮಾಡಿ](./lessons/0-course-setup/how-to-run.md) | | +| I | [**ಎಐ ಗೆ ಪರಿಚಯ**](./lessons/1-Intro/README.md) | | | +| 01 | [ಎಐ ಪರಿಚಯ ಮತ್ತು ಇತಿಹಾಸ](./lessons/1-Intro/README.md) | - | - | +| II | **ಸಂಕೇತಾತ್ಮಕ ಎಐ** | +| 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 | [ಫ್ರೇಮ್ವರ್ಕ್ಸ್ಗೆ ಪರಿಚಯ (ಪೈಟಾರ್ಚ್/ಟೆನ್ಸರ್‌ಫ್ಲೋ) ಮತ್ತು ಓವರ್‌ಫಿಟಿಂಗ್](./lessons/3-NeuralNetworks/05-Frameworks/README.md) | [ಪೈಟಾರ್ಚ್](./lessons/3-NeuralNetworks/05-Frameworks/IntroPyTorch.ipynb) / [ಕೇರಾಸ್](./lessons/3-NeuralNetworks/05-Frameworks/IntroKeras.ipynb) / [ಟೆನ್ಸರ್‌ಫ್ಲೋ](./lessons/3-NeuralNetworks/05-Frameworks/IntroKerasTF.ipynb) | [ಪ್ರಯೋಗಶಾಲೆ](./lessons/3-NeuralNetworks/05-Frameworks/lab/README.md) | -| IV | [**ಕಂಪ್ಯೂಟರ್ ದೃಷ್ಟಿ**](./lessons/4-ComputerVision/README.md) | [ಪೈಟಾರ್ಚ್](https://docs.microsoft.com/learn/modules/intro-computer-vision-pytorch/?WT.mc_id=academic-77998-cacaste) / [ಟೆನ್ಸರ್‌ಫ್ಲೋ](https://docs.microsoft.com/learn/modules/intro-computer-vision-TensorFlow/?WT.mc_id=academic-77998-cacaste)| [ಮೈಕ್ರೋಸಾಫ್ಟ್ ಅಜ್ಯೂರ್‌ನಲ್ಲಿ ಕಂಪ್ಯೂಟರ್ ದೃಷ್ಟಿ ಅನ್ವೇಷಿಸಿ](https://learn.microsoft.com/en-us/collections/7w28iy2xrqzdj0?WT.mc_id=academic-77998-bethanycheum) | +| 04 | [ಬಹು-ಪಟ್ಟಿನ ಪರ್ಸೆಪ್ಟ್ರಾನ್ ಮತ್ತು ನಮಗೆ ಸ್ವಂತ ಫ್ರೆಮುರ್ಕ್ ರಚನೆ](./lessons/3-NeuralNetworks/04-OwnFramework/README.md) | [ನೋಟ್‌ಬುಕ್](./lessons/3-NeuralNetworks/04-OwnFramework/OwnFramework.ipynb) | [ಪ್ರಯೋಗಶಾಲೆ](./lessons/3-NeuralNetworks/04-OwnFramework/lab/README.md) | +| 05 | [ಫ್ರೆಮುರ್ಕ್ಗಳಿಗೆ ಪರಿಚಯ (ಪೈಟಾರ್ಚ್/ಟೆನ್ಸರ್ಫ್ಲೋ) ಮತ್ತು ಓವರ್‌ಫಿಟ್ಟಿಂಗ್](./lessons/3-NeuralNetworks/05-Frameworks/README.md) | [ಪೈಟಾರ್ಚ್](./lessons/3-NeuralNetworks/05-Frameworks/IntroPyTorch.ipynb) / [ಕೆರಾಸ್](./lessons/3-NeuralNetworks/05-Frameworks/IntroKeras.ipynb) / [ಟೆನ್ಸರ್ಫ್ಲೋ](./lessons/3-NeuralNetworks/05-Frameworks/IntroKerasTF.ipynb) | [ಪ್ರಯೋಗಶಾಲೆ](./lessons/3-NeuralNetworks/05-Frameworks/lab/README.md) | +| IV | [**ಕಂಪ್ಯೂಟರ್ ದೃಷ್ಟಿ**](./lessons/4-ComputerVision/README.md) | [ಪೈಟಾರ್ಚ್](https://docs.microsoft.com/learn/modules/intro-computer-vision-pytorch/?WT.mc_id=academic-77998-cacaste) / [ಟೆನ್ಸರ್ಫ್ಲೋ](https://docs.microsoft.com/learn/modules/intro-computer-vision-TensorFlow/?WT.mc_id=academic-77998-cacaste)| [ಮೈಕ್ರೋಸಾಫ್ಟ್ ಅಜೂರ್‌ನಲ್ಲಿ ಕಂಪ್ಯೂಟರ್ ದೃಷ್ಟಿಯನ್ನು ಅನ್ವೇಷಿಸಿ](https://learn.microsoft.com/en-us/collections/7w28iy2xrqzdj0?WT.mc_id=academic-77998-bethanycheum) | | 06 | [ಕಂಪ್ಯೂಟರ್ ದೃಷ್ಟಿಗೆ ಪರಿಚಯ. ಓಪನ್‌ಸಿವಿ](./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) | [ಪೈಟಾರ್ಚ್](./lessons/4-ComputerVision/07-ConvNets/ConvNetsPyTorch.ipynb) /[ಟೆನ್ಸರ್‌ಫ್ಲೋ](./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) | [ಪೈಟಾರ್ಚ್](./lessons/4-ComputerVision/08-TransferLearning/TransferLearningPyTorch.ipynb) / [ಟೆನ್ಸರ್‌ಫ್ಲೋ](./lessons/3-NeuralNetworks/05-Frameworks/IntroKerasTF.ipynb) | [ಪ್ರಯೋಗಶಾಲೆ](./lessons/4-ComputerVision/08-TransferLearning/lab/README.md) | -| 09 | [ಆಟೋಂಕೋಡರ್‌ಗಳು ಮತ್ತು ವಿ.ಎ.ಇಗಳು](./lessons/4-ComputerVision/09-Autoencoders/README.md) | [ಪೈಟಾರ್ಚ್](./lessons/4-ComputerVision/09-Autoencoders/AutoEncodersPyTorch.ipynb) / [ಟೆನ್ಸರ್‌ಫ್ಲೋ](./lessons/4-ComputerVision/09-Autoencoders/AutoencodersTF.ipynb) | | -| 10 | [ಸೃಜನಾತ್ಮಕ ಎದುರಾಳಿಯಾದನೆಟ್‌ವರ್ಕ್‌ಗಳು ಮತ್ತು ಕಲಾತ್ಮಕ ಶೈಲಿ ವರ್ಗಾವಣೆ](./lessons/4-ComputerVision/10-GANs/README.md) | [ಪೈಟಾರ್ಚ್](./lessons/4-ComputerVision/10-GANs/GANPyTorch.ipynb) / [ಟೆನ್ಸರ್‌ಫ್ಲೋ](./lessons/4-ComputerVision/10-GANs/GANTF.ipynb) | | -| 11 | [ವಸ್ತು ಪತ್ತೆ](./lessons/4-ComputerVision/11-ObjectDetection/README.md) | [ಟೆನ್ಸರ್‌ಫ್ಲೋ](./lessons/4-ComputerVision/11-ObjectDetection/ObjectDetection.ipynb) | [ಪ್ರಯೋಗಶಾಲೆ](./lessons/4-ComputerVision/11-ObjectDetection/lab/README.md) | -| 12 | [ಅರ್ಥಾತ್ಮಕ ವಿಭಾಗ. ಯು-ನೆಟ್](./lessons/4-ComputerVision/12-Segmentation/README.md) | [ಪೈಟಾರ್ಚ್](./lessons/4-ComputerVision/12-Segmentation/SemanticSegmentationPytorch.ipynb) / [ಟೆನ್ಸರ್‌ಫ್ಲೋ](./lessons/4-ComputerVision/12-Segmentation/SemanticSegmentationTF.ipynb) | | -| V | [**ಸ್ವಾಭಾವಿಕ ಭಾಷಾ ಪ್ರಕ್ರಿಯೆ**](./lessons/5-NLP/README.md) | [ಪೈಟಾರ್ಚ್](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-pytorch/?WT.mc_id=academic-77998-cacaste) /[ಟೆನ್ಸರ್‌ಫ್ಲೋ](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-TensorFlow/?WT.mc_id=academic-77998-cacaste) | [ಮೈಕ್ರೋಸಾಫ್ಟ್ ಅಜ್ಯೂರ್‌ನಲ್ಲಿ ಸ್ವಾಭಾವಿಕ ಭಾಷಾ ಪ್ರಕ್ರಿಯೆಯನ್ನು ಅನ್ವೇಷಿಸಿ](https://learn.microsoft.com/en-us/collections/7w28iy2xrqzdj0?WT.mc_id=academic-77998-bethanycheum)| -| 13 | [ಪಠ್ಯ ಪ್ರದರ್ಶನ. ಬೋ/ಟಿಎಫ್-ಐಡಿಎಫ್](./lessons/5-NLP/13-TextRep/README.md) | [ಪೈಟಾರ್ಚ್](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/13-TextRep/TextRepresentationPyTorch.ipynb) / [ಟೆನ್ಸರ್‌ಫ್ಲೋ](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/13-TextRep/TextRepresentationTF.ipynb) | | -| 14 | [ಅರ್ಥಾತ್ಮಕ ಶಬ್ದ ಎಂಬೆಡ್ಡಿಂಗ್‌ಗಳು. ವರ್ಡ್2ವೇಕ್ ಮತ್ತು ಗ್ಲೋವ್](./lessons/5-NLP/14-Embeddings/README.md) | [ಪೈಟಾರ್ಚ್](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/14-Embeddings/EmbeddingsPyTorch.ipynb) / [ಟೆನ್ಸರ್‌ಫ್ಲೋ](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/14-Embeddings/EmbeddingsTF.ipynb) | | -| 15 | [ಭಾಷಾ ಮಾದರಿಯ ನಿರ್ಮಾಣ. ನಿಮ್ಮದೇ ಎಂಬೆಡ್ಡಿಂಗ್‌ಗಳನ್ನು ತರಬೇತು ಮಾಡುವುದು](./lessons/5-NLP/15-LanguageModeling/README.md) | [ಪೈಟಾರ್ಚ್](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/15-LanguageModeling/CBoW-PyTorch.ipynb) / [ಟೆನ್ಸರ್‌ಫ್ಲೋ](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) | [ಪೈಟಾರ್ಚ್](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/16-RNN/RNNPyTorch.ipynb) / [ಟೆನ್ಸರ್‌ಫ್ಲೋ](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/16-RNN/RNNTF.ipynb) | | -| 17 | [ಸೃಜನಾತ್ಮಕ ಪುನಃಪ್ರವಾಹ ನೆಟ್‌ವರ್ಕ್‌ಗಳು](./lessons/5-NLP/17-GenerativeNetworks/README.md) | [ಪೈಟಾರ್ಚ್](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/17-GenerativeNetworks/GenerativePyTorch.ipynb) / [ಟೆನ್ಸರ್‌ಫ್ಲೋ](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/17-GenerativeNetworks/GenerativeTF.ipynb) | [ಪ್ರಯೋಗಶಾಲೆ](./lessons/5-NLP/17-GenerativeNetworks/lab/README.md) | -| 18 | [ಟ್ರಾನ್ಸ್‌ಫಾರ್ಮರ್‌ಗಳು. ಬೆರ್ಟ್.](./lessons/5-NLP/18-Transformers/README.md) | [ಪೈಟಾರ್ಚ್](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/18-Transformers/TransformersPyTorch.ipynb) /[ಟೆನ್ಸರ್‌ಫ್ಲೋ](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/18-Transformers/TransformersTF.ipynb) | | -| 19 | [ನಾಮಿತ ಅಂಶ ಗುರುತಿಸುವಿಕೆ](./lessons/5-NLP/19-NER/README.md) | [ಟೆನ್ಸರ್‌ಫ್ಲೋ](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/README.md) | [ಪೈಟಾರ್ಚ್](https://microsoft.github.io/AI-For-Beginners/lessons/5-NLP/20-LangModels/GPT-PyTorch.ipynb) | | -| VI | **ಇತರೆ ಎಐ ತಂತ್ರಗಳು** || | -| 21 | [ಜಾವಾಂತ್ರಿಕ ಆಲ್ಗೆಾರಿದಮ್ಗಳು](./lessons/6-Other/21-GeneticAlgorithms/README.md) | [ನೋಟ್‌ಬುಕ್](./lessons/6-Other/21-GeneticAlgorithms/Genetic.ipynb) | | -| 22 | [ಡೀಪ್ ರಇನ್‌ಫೋರ್ಸ್ಮೆಂಟ್ ಲರ್ನಿಂಗ್](./lessons/6-Other/22-DeepRL/README.md) | [ಪೈಟಾರ್ಚ್](./lessons/6-Other/22-DeepRL/CartPole-RL-PyTorch.ipynb) /[ಟೆನ್ಸರ್‌ಫ್ಲೋ](./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 | **ಎಐ ನೈತಿಕತೆ** | | | -| 24 | [ಎಐ ನೈತಿಕತೆ ಮತ್ತು ಹೊಣೆಗಾರ ಎಐ](./lessons/7-Ethics/README.md) | [ಮೈಕ್ರೋಸಾಫ್ಟ್ ಲರ್ನ್: ಹೊಣೆಗಾರ ಎಐ ತತ್ವಗಳು](https://docs.microsoft.com/learn/paths/responsible-ai-business-principles/?WT.mc_id=academic-77998-cacaste) | | -| IX | **ಅತಿರಿಕ್ತಗಳು** | | | -| 25 | [ಬಹು-ಮಾದರಿ ನೆಟ್‌ವರ್ಕ್‌ಗಳು, ಕ್ಲಿಪ್ ಮತ್ತು ವಿಕ್ಯೂಜಿಎನ್](./lessons/X-Extras/X1-MultiModal/README.md) | [ನೋಟ್‌ಬುಕ್](./lessons/X-Extras/X1-MultiModal/Clip.ipynb) | | +| 07 | [ಸಂವೇದನಾಶೀಲ ನ್ಯೂರಲ್ ನೆಟ್ವರ್ಕ್‌ಗಳು](./lessons/4-ComputerVision/07-ConvNets/README.md) & [CNN معماريಗಳು](./lessons/4-ComputerVision/07-ConvNets/CNN_Architectures.md) | [ಪೈಟಾರ್ಚ್](./lessons/4-ComputerVision/07-ConvNets/ConvNetsPyTorch.ipynb) /[ಟೆನ್ಸರ್ಫ್ಲೋ](./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) | [ಪೈಟಾರ್ಚ್](./lessons/4-ComputerVision/08-TransferLearning/TransferLearningPyTorch.ipynb) / [ಟೆನ್ಸರ್ಫ್ಲೋ](./lessons/3-NeuralNetworks/05-Frameworks/IntroKerasTF.ipynb) | [ಪ್ರಯೋಗಶಾಲೆ](./lessons/4-ComputerVision/08-TransferLearning/lab/README.md) | +| 09 | [ಆಟೋಎಂಕೋಡರ್‌ಗಳು ಮತ್ತು ವಿ.ಎ.ಇಗಳು](./lessons/4-ComputerVision/09-Autoencoders/README.md) | [ಪೈಟಾರ್ಚ್](./lessons/4-ComputerVision/09-Autoencoders/AutoEncodersPyTorch.ipynb) / [ಟೆನ್ಸರ್ಫ್ಲೋ](./lessons/4-ComputerVision/09-Autoencoders/AutoencodersTF.ipynb) | | +| 10 | [ಜನರೇಟಿವ್ ವೈವಿಧ್ಯಶೀಲ ನ್ಯೂರಲ್ ನೆಟ್ವರ್ಕ್ಸ್ ಮತ್ತು ಕಲಾತ್ಮಕ ಶೈಲಿ ವರ್ಗಾವಣೆ](./lessons/4-ComputerVision/10-GANs/README.md) | [ಪೈಟಾರ್ಚ್](./lessons/4-ComputerVision/10-GANs/GANPyTorch.ipynb) / [ಟೆನ್ಸರ್ಫ್ಲೋ](./lessons/4-ComputerVision/10-GANs/GANTF.ipynb) | | +| 11 | [ವಸ್ತು ಗುರುತಿಸುವಿಕೆ](./lessons/4-ComputerVision/11-ObjectDetection/README.md) | [ಟೆನ್ಸರ್ಫ್ಲೋ](./lessons/4-ComputerVision/11-ObjectDetection/ObjectDetection.ipynb) | [ಪ್ರಯೋಗಶಾಲೆ](./lessons/4-ComputerVision/11-ObjectDetection/lab/README.md) | +| 12 | [ಅರ್ಥವಾಹಿ ವಿಭಾಗಣ. ಯು-ನೆಟ್](./lessons/4-ComputerVision/12-Segmentation/README.md) | [ಪೈಟಾರ್ಚ್](./lessons/4-ComputerVision/12-Segmentation/SemanticSegmentationPytorch.ipynb) / [ಟೆನ್ಸರ್ಫ್ಲೋ](./lessons/4-ComputerVision/12-Segmentation/SemanticSegmentationTF.ipynb) | | +| V | [**ನೈಜ ಭಾಷಾ ಪ್ರಕ್ರಿಯೆ**](./lessons/5-NLP/README.md) | [ಪೈಟಾರ್ಚ್](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-pytorch/?WT.mc_id=academic-77998-cacaste) /[ಟೆನ್ಸರ್ಫ್ಲೋ](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-TensorFlow/?WT.mc_id=academic-77998-cacaste) | [ಮೈಕ್ರೋಸಾಫ್ಟ್ ಅಜೂರ್‌ನಲ್ಲಿ ನೈಜ ಭಾಷಾ ಪ್ರಕ್ರಿಯೆಯನ್ನು ಅನ್ವೇಷಿಸಿ](https://learn.microsoft.com/en-us/collections/7w28iy2xrqzdj0?WT.mc_id=academic-77998-bethanycheum)| +| 13 | [ಪಠ್ಯ ಪ್ರತಿನಿಧಾನ. ಬೋ/ಟಿ ಎಫ್-ಐ ಡಿಎಫ್](./lessons/5-NLP/13-TextRep/README.md) | [ಪೈಟಾರ್ಚ್](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/13-TextRep/TextRepresentationPyTorch.ipynb) / [ಟೆನ್ಸರ್ಫ್ಲೋ](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/13-TextRep/TextRepresentationTF.ipynb) | | +| 14 | [ಅರ್ಥವಾಹಿ ಶಬ್ದ ಗುಚ್ಛಗಳು. ವರ್ಡ್2ವೆಕ್ ಮತ್ತು ಗ್ಲೋವ್](./lessons/5-NLP/14-Embeddings/README.md) | [ಪೈಟಾರ್ಚ್](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/14-Embeddings/EmbeddingsPyTorch.ipynb) / [ಟೆನ್ಸರ್ಫ್ಲೋ](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/14-Embeddings/EmbeddingsTF.ipynb) | | +| 15 | [ಭಾಷಾ ಮಾದರೀಕರಣ. ನಿಮ್ಮ ಸ್ವಂತ ಗುಚ್ಛಗಳನ್ನು ತರಬೇತಿಸುವಿಕೆ](./lessons/5-NLP/15-LanguageModeling/README.md) | [ಪೈಟಾರ್ಚ್](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/15-LanguageModeling/CBoW-PyTorch.ipynb) / [ಟೆನ್ಸರ್ಫ್ಲೋ](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) | [ಪೈಟಾರ್ಚ್](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/16-RNN/RNNPyTorch.ipynb) / [ಟೆನ್ಸರ್ಫ್ಲೋ](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/16-RNN/RNNTF.ipynb) | | +| 17 | [ಜನರೇಟಿವ್ ಪುನರಾವರ್ತಿತ ನೆಟ್ವರ್ಕ್ಸ್](./lessons/5-NLP/17-GenerativeNetworks/README.md) | [ಪೈಟಾರ್ಚ್](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/17-GenerativeNetworks/GenerativePyTorch.ipynb) / [ಟೆನ್ಸರ್ಫ್ಲೋ](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/17-GenerativeNetworks/GenerativeTF.ipynb) | [ಪ್ರಯೋಗಶಾಲೆ](./lessons/5-NLP/17-GenerativeNetworks/lab/README.md) | +| 18 | [ಟ್ರಾನ್ಸ್‌ಫಾರ್ಮರ್ಸ್. ಬರ್ಟ್.](./lessons/5-NLP/18-Transformers/README.md) | [ಪೈಟಾರ್ಚ್](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/18-Transformers/TransformersPyTorch.ipynb) /[ಟೆನ್ಸರ್ಫ್ಲೋ](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/18-Transformers/TransformersTF.ipynb) | | +| 19 | [ನಾಮಿತ ಘಟಕ ಗುರುತುಹಿಡಿತ](./lessons/5-NLP/19-NER/README.md) | [ಟೆನ್ಸರ್ಫ್ಲೋ](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/README.md) | [ಪೈಟಾರ್ಚ್](https://microsoft.github.io/AI-For-Beginners/lessons/5-NLP/20-LangModels/GPT-PyTorch.ipynb) | | +| VI | **ಇತರ AI ತಂತ್ರಗಳು** || | +| 21 | [ಜನಕ الگورಿತಮ್ಗಳು](./lessons/6-Other/21-GeneticAlgorithms/README.md) | [ನೋಟ್‌ಬುಕ್](./lessons/6-Other/21-GeneticAlgorithms/Genetic.ipynb) | | +| 22 | [ದೃಢೀಕರಣ ಕಲಿಕೆ](./lessons/6-Other/22-DeepRL/README.md) | [ಪೈಟಾರ್ಚ್](./lessons/6-Other/22-DeepRL/CartPole-RL-PyTorch.ipynb) /[ಟೆನ್ಸರ್ಫ್ಲೋ](./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) | [ಮೈಕ್ರೋಸಾಫ್ಟ್ ಲರ್ನ್: ಹೊಣೆಗಾರಿಕೆಯ AI اصول](https://docs.microsoft.com/learn/paths/responsible-ai-business-principles/?WT.mc_id=academic-77998-cacaste) | | +| IX | **ಅधिकಾರಿ** | | | +| 25 | [ಬಹು-ಮಾದರಿ ನೆಟ್ವರ್ಕ್ಗಳು, ಕ್ಲಿಪ್ ಮತ್ತು ವಿ.ಕ್ವಿ.ಜಿಎಎನ್](./lessons/X-Extras/X1-MultiModal/README.md) | [ನೋಟ್‌ಬುಕ್](./lessons/X-Extras/X1-MultiModal/Clip.ipynb) | | -## ಪ್ರತೀ ಪಾಠದಲ್ಲಿ ಇದೆ -* ಪೂರ್ವ ಓದಿನ ಸಾಮಗ್ರಿ -* ನಿರ್ವಹಣೀಯ ಜ್ಯೂಪೈಟರ್ ನೋಟ್‌ಬುಕ್‌ಗಳು, ಸಾಮಾನ್ಯವಾಗಿ **PyTorch** ಅಥವಾ **TensorFlow** ಫ್ರೇಮ್‌ವರ್ಕ್‌ಗೆ ವಿಶೇಷವಾಗಿವೆ. ನಿರ್ವಹಣೀಯ ನೋಟ್‌ಬುಕ್‌ನಲ್ಲಿ ಸಿದ್ಧಾಂತಾತ್ಮಕ ವಿಷಯಗಳು ಹೆಚ್ಚಿನ ಪ್ರಮಾಣದಲ್ಲಿ ಇರುತ್ತವೆ, ಆದ್ದರಿಂದ ವಿಷಯವನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳಲು ನೀವು ನೋಟ್‌ಬುಕ್‌ನ ಕನಿಷ್ಠ ಒಂದು ಆವೃತ್ತಿಯನ್ನು (PyTorch ಅಥವಾ TensorFlow ಇಲ್ವೆಯೆ) ಓದಬೇಕಾಗುತ್ತದೆ. -* ಕೆಲವು ವಿಷಯಗಳಿಗೆ ಲಭ್ಯವಿರುವ **ಲ್ಯಾಬ್‌ಗಳು**, ನೀವು ಕಲಿತ ವಿಷಯವನ್ನು ಒಂದು ನಿರ್ದಿಷ್ಟ ಸಮಸ್ಯೆಗೆ ಅನ್ವಯಿಸಲು ಪ್ರಯತ್ನಿಸುವ ಅವಕಾಶವನ್ನು ನೀಡುತ್ತವೆ. -* ಕೆಲವು ವಿಭಾಗಗಳಲ್ಲಿ ಸಂಬಂಧಿಸಿದ ವಿಷಯಗಳನ್ನು ಒಳಗೊಂಡಿರುವ [**MS Learn**](https://learn.microsoft.com/en-us/collections/7w28iy2xrqzdj0?WT.mc_id=academic-77998-bethanycheum) ಮೋಡುಲ್‌ಗಳಿಗೆ ಲಿಂಕ್‌ಗಳಿವೆ. +## ಪ್ರತಿ ಪಾಠದಲ್ಲಿ ಇದೆ +* ಮುಂಚಿತ ಅಧ್ಯಯನ ಸಾಮಗ್ರಿಗಳನ್ನು +* Frameworkಗೆ ವಿಶೇಷವಾದ ನಿರ್ವಹಣಾಶೀಲ ಜೂಪಿಟರ್ ನೋಟ್‌ಬುಕ್‌ಗಳು (**PyTorch** ಅಥವಾ **TensorFlow**). ನಿರ್ವಹಣಾಶೀಲ ನೋಟ್‌ಬುಕ್‌ನಲ್ಲಿ ಸಿದ್ಧಾಂತ ಸಂಬಂಧಿ ಬಹಳ ವಿಷಯವಿದೆ, ಆದ್ದರಿಂದ ವಿಷಯವನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳಲು ಕನಿಷ್ಠ ಒಂದು ಆವೃತ್ತಿಯ ನೋಟ್‌ಬುಕ್ (ಯಾವುದು ಆದರೂ PyTorch ಅಥವಾ TensorFlow) ಓದಬೇಕು. +* ಕೆಲವು ವಿಷಯಗಳಿಗೆ ಲ್ಯಾಬ್‌ಗಳು ಲಭ್ಯವಿವೆ, ಅವು ನಿಮಗೆ ಕಲಿತ ವಿಷಯವನ್ನು ನಿರ್ದಿಷ್ಟ ಸಮಸ್ಯೆಗೆ ಅನ್ವಯಿಸಲು ಅವಕಾಶ ನೀಡುತ್ತವೆ. +* ಕೆಲವು ವಿಭಾಗಗಳಲ್ಲಿ ಸಂಬಂಧಿತ ವಿಷಯಗಳನ್ನು ಒಳಗೊಂಡ [**MS Learn**](https://learn.microsoft.com/en-us/collections/7w28iy2xrqzdj0?WT.mc_id=academic-77998-bethanycheum) ಮಾದರಿಗಳು ಲಿಂಕ್‌ಗಳಾಗಿವೆ. ## ಪ್ರಾರಂಭಿಸುವುದು -### 🎯 AIಗೆ ಹೊಸವೀರಾ? ಇಲ್ಲಿ ಪ್ರಾರಂಭಿಸಿ! +### 🎯 AI ಹೊಸದಾದವರೇ? ಇಲ್ಲಿ ಪ್ರಾರಂಭಿಸಿ! -ನೀವು ಸಂಪೂರ್ಣ ಹೊಸ AI ಬಳಕೆದಾರನಾಗಿದ್ದರೆ ಮತ್ತು ತ್ವರಿತ, ಕೈಯಲ್ಲಿ ಅನುಭವಿಸುವ ಉದಾಹರಣೆಗಳನ್ನು ಹೋದಂತೆ ನೋಡಲು ಬಯಸುವಿರಾ, ನಮ್ಮ [**ನಾಡಿದ Anfänger Beispiele**](./examples/README.md) ನೋಡಿ! ಇದರಲ್ಲಿ ಇವೆ: +ನೀವು AIಗೆ ಸಂಪೂರ್ಣ ಹೊಸವನಾಗಿದ್ದರೆ ಮತ್ತು ತ್ವರಿತ, ಕೈಗೆಟಕುವ ಉದಾಹರಣೆಗಳನ್ನ ಕಾಣಲು ಬಯಸಿದರೆ, ನಮ್ಮ [**ಶುರುತಿಯಾಗಿದ್ದವರಿಗೆ ಉಪಯುಕ್ತ ಉದಾಹರಣೆಗಳು**](./examples/README.md) ನೋಡಿ! ಇವುಗಳಲ್ಲಿ ಒಳಗೊಂಡಿವೆ: -- 🌟 **ಹಲೋ AI ವರ್ಲ್ಡ್** - ನಿಮ್ಮ ಮೊದಲ AI ಪ್ರೋಗ್ರಾಂ (ಪ್ಯಾಟರ್ನ್ ಪತ್ತೆ) -- 🧠 **ಸರಳ ನ್ಯೂರಲ್ ನೆಟ್‌ವರ್ಕ್** - ನ್ಯೂರಲ್ ನೆಟ್‌ವರ್ಕ್ ಅನ್ನು ಮೊದಲಿನಿಂದ ನಿರ್ಮಿಸಿ -- 🖼️ **ಚಿತ್ರ ವರ್ಗೀಕರಣಕಾರ** - ವಿವರವಾದ ಕಾಮೆಂಟುಗಳೊಂದಿಗೆ ಚಿತ್ರಗಳನ್ನು ವರ್ಗೀಕರಿಸಿ -- 💬 **ಪಠ್ಯದ ಭಾವನೆ ವಿಶ್ಲೇಷಣೆ** - ಧನಾತ್ಮಕ/ನಕಾರಾತ್ಮಕ ಪಠ್ಯವನ್ನು ವಿಶ್ಲೇಷಿಸಿ +- 🌟 **ಹೆಲೋ AI ವರ್ಲ್ಡ್** - ನಿಮ್ಮ ಮೊದಲ AI ಪ್ರೋಗ್ರಾಂ (ಆದರ್ಶ ಗುರುತಿಸುವಿಕೆ) +- 🧠 **ಸಂಪೂರ್ಣ ನೀರಲ್ ನೆಟ್‌ವರ್ಕ್** - ಆರಂಭದಿಂದ ನೀರಲ್ ನೆಟ್‌ವರ್ಕ್ ರಚನೆ +- 🖼️ **ಚಿತ್ರ ವರ್ಗೀಕರಣ** - ವಿಸ್ತೃತ ಟಿಪ್ಪಣಿಗಳೊಂದಿಗೆ ಚಿತ್ರಗಳನ್ನು ವರ್ಗೀಕರಿಸಿ +- 💬 **ಪಠ್ಯ ಸಂವೇದನೆ** - ಧನಾತ್ಮಕ/ನಕಾರಾತ್ಮಕ ಪಠ್ಯ ವಿಶ್ಲೇಷಣೆ -ಈ ಉದಾಹರಣೆಗಳು ಸಂಪೂರ್ಣ ಪಾಠ್ಯಕ್ರಮಕ್ಕೆ ಮುನ್ನ AI ಸಂಜ್ಞಾನಗಳನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳಲು ವಿನ್ಯಾಸಗೊಳಿಸಲ್ಪಟ್ಟಿವೆ. +ಈ ಉದಾಹರಣೆಗಳು ನಿಮ್ಮನ್ನು ಸಂಪೂರ್ಣ ಪಠ್ಯಕ್ರಮಕ್ಕೆ ಮುನ್ನ AI ತತ್ವಗಳನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳಲು ಸಹಾಯ ಮಾಡುವ ಉದ್ದೇಶವಿದೆ. -### 📚 ಸಂಪೂರ್ಣ ಪಾಠ್ಯಕ್ರಮವೇ ರೂಢಿಸುವುದು +### 📚 ಸಂಪೂರ್ಣ ಪಠ್ಯಕ್ರಮವನ್ನು ಹೊಂದಿಸುವುದು -- ನಮ್ಮು [ಸೆಟಪ್ ಪಾಠ](./lessons/0-course-setup/setup.md) ನಿಮ್ಮ ಅಭಿವೃದ್ಧಿ ಪರಿಸರವನ್ನು ಸ್ಥಾಪಿಸುವುದರಲ್ಲಿ ಸಹಾಯ ಮಾಡುತ್ತದೆ. -- ಶಿಕ್ಷಕರಿಗಾಗಿ, ನಿಮ್ಮ ಸಹಾಯಕ್ಕೆ [ಪಾಠ್ಯಕ್ರಮ ಸ್ಥಾಪನೆ ಪಾಠ](./lessons/0-course-setup/for-teachers.md) ಸೃಷ್ಟಿಸಲಾಗಿದೆ! -- VSCode ಅಥವಾ Codespace ನಲ್ಲಿ [ಕೋಡ್ ಅನ್ನು ಹೇಗೆ ರನ್ ಮಾಡುವುದು](./lessons/0-course-setup/how-to-run.md) ನೀವು ತಿಳಿಯಿರಿ. +- ನಿಮ್ಮ ಅಭಿವೃದ್ಧಿ ಪರಿಸರವನ್ನು ಹೊಂದಿಸಲು ಸಹಾಯ ಮಾಡುವ [ಹೊಂದಿಕೆ ಪಾಠ](./lessons/0-course-setup/setup.md)ವನ್ನು ನಾವು ಸೃಷ್ಟಿಸಿದ್ದೇವೆ. - ಶಿಕ್ಷಕರಿಗೆ ಸಹ (ಪ್ರಮಾಣಿತ) [ಪಠ್ಯಕ್ರಮ ಹೊಂದಿಕೆ ಪಾಠ](./lessons/0-course-setup/for-teachers.md) ಇರುವುದನ್ನು ಗಮನಿಸಿ! +- [VSCode ಅಥವಾ Codespace ನಲ್ಲಿ ಕೋಡ್ ಚಲಿಸುವ ವಿಧಾನ](./lessons/0-course-setup/how-to-run.md) -ಈ ಹಂತಗಳನ್ನು ಅನುಸರಿಸಿ: +ಈ ಕ್ರಮಗಳನ್ನು ಅನುಸರಿಸಿ: -**ರೆಪೊಸಿಟರಿ Fork ಮಾಡಿ**: ಈ ಪುಟದ ಮೇಲ್ಭಾಗದ ಬಲಭಾಗದಲ್ಲಿರುವ "Fork" ಬಟನ್ ಕ್ಲಿಕ್ ಮಾಡಿ. +ರಿಪೊಸಿಟರಿ Fork ಮಾಡಿ: ಈ ಪುಟದ ಮೇಲ್ದೈಯ ಭಾಗದಲ್ಲಿ "Fork" ಬಟನ್ ಕ್ಲಿಕ್ ಮಾಡಿ. -**ರೆಪೊಸಿಟರಿ ಕ್ಲೋನ್ ಮಾಡಿ**: `git clone https://github.com/microsoft/AI-For-Beginners.git` +ರಿಪೊಸಿಟರಿ Clone ಮಾಡಿಕೊಳ್ಳಿ: `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)ಗೆ ಭೇಟಿ ನೀಡಿ. -## ಕುಇಜ್ ಗಳು +## ಪ್ರಶ್ನೋತ್ತರಗಳು -> **ಕುಇಜ್ ಗಳ ಬಗ್ಗೆ ಟಿಪ್ಪಣಿ**: ಎಲ್ಲಾ ಕುಇಜ್ ಗಳು etc\quiz-app ಫೋಲ್ಡರ್‌ನ Quiz-app ಅಡಿಯಲ್ಲಿ ಇವೆ, ಅಥವಾ [ಇಲ್ಲಿ ಆನ್‌ಲೈನ್](https://ff-quizzes.netlify.app/) ಲಭ್ಯವಿವೆ. ಪಾಠ್ಯಕ್ರಮಗಳಲ್ಲಿ ಲಿಂಕ್ ಮಾಡಲಾಗಿದೆ, ಕುಇಜ್ ಅಪ್ಲಿಕೇಶನ್ ಸ್ಥಳೀಯವಾಗಿ ಚಾಲನೆ ಮಾಡಬಹುದು ಅಥವಾ Azure ಗೆ ನಿಯೋಜಿಸಬಹುದು; `quiz-app` ಫೋಲ್ಡರ್‌ನಲ್ಲಿ ಸೂಚನೆಗಳನ್ನು ಅನುಸರಿಸಿ. ಅವು ಕ್ರಮವಾಗಿ ಸ್ಥಳೀಯಗೊಳ್ಳುತ್ತಿವೆ. +> **ಪ್ರಶ್ನೋತ್ತರಗಳ ಬಗ್ಗೆ ಒಂದು ಟಿಪ್ಪಣಿ**: ಎಲ್ಲಾ ಪ್ರಶ್ನೋತ್ತರಗಳು Quiz-app ಫೋಲ್ಡರ್ etc\quiz-appನಲ್ಲಿ ಇವೆ, ಅಥವಾ [ಆನ್‌ಲೈನ್ ಇಲ್ಲಿ](https://ff-quizzes.netlify.app/). ಅವು ಪಾಠಗಳಿಂದ ಲಿಂಕ್ ಮಾಡಲ್ಪಟ್ಟಿವೆ, ಪ್ರಶ್ನೋತ್ತರ ಅಪ್ಲಿಕೇಶನ್ ಸ್ಥಳೀಯವಾಗಿ ಅಥವಾ Azureಗೆ ನಿಯೋಜಿಸಬಹುದು; `quiz-app` ಫೋಲ್ಡರ್‌ನಲ್ಲಿ ಸೂಚನೆಗಳನ್ನು ಅನುಸರಿಸಿ. ಅವು ಹ渐ವಾಗಿ ಸ್ಥಳೀಯೀಕರಿಸಲಾಗುತ್ತಿವೆ. ## ಸಹಾಯ ಬೇಕು -ನಿಮ್ಮ ಬಳಿ ಸಲಹೆಗಳು ಇದೆಯೆ ಅಥವಾ ವ್ಯಾಕರಣ ಅಥವಾ ಕೋಡ್ ದೋಷಗಳನ್ನು ಕಂಡುಕೊಂಡಿದ್ದೀರಾ? ಸಮಸ್ಯೆಯನ್ನು ದಾಖಲಿಸಿ ಅಥವಾ ಒಂದು ಪುಲ್ ರಿಕ್ವೆಸ್ಟ್ ರಚಿಸಿ. +ನೀವು ಸಲಹೆಗಳನ್ನು ಹೊಂದಿದ್ದೀರಾ ಅಥವಾ ವಾಕ್ಯರಚನೆ ಅಥವಾ ಕೋಡ್ ದೋಷಗಳನ್ನು ಕಂಡಿರುತ್ತದೆಯೇ? ಅನುಷ್ಠಾನವನ್ನು ಮಟ್ಟಿಗೊಳಿಸುವ ಅಥವಾ ಪುಲ್ ವಿನಂತಿ ಮಾಡಿ. -## ವಿಶೇಷ ಧನ್ಯವಾದಗಳು +## ವಿಶೇಷ ಕೃತಜ್ಞತೆಗಳು -* **✍️ ಮುಖ್ಯ ಲೇಖಕ:** [Dmitry Soshnikov](http://soshnikov.com), PhD +* **✍️ ಪ್ರಾಥಮಿಕ ಬರಹಗಾರ:** [Dmitry Soshnikov](http://soshnikov.com), PhD * **🔥 ಸಂಪಾದಕ:** [Jen Looper](https://twitter.com/jenlooper), PhD -* **🎨 ಸ್ಕೆಚ್ನೋಟ್ ಚಿತ್ರಕರ್:** [Tomomi Imura](https://twitter.com/girlie_mac) -* **✅ ಕುಇಜ್ ರಚನೆಗಾರ:** [Lateefah Bello](https://github.com/CinnamonXI), [MLSA](https://studentambassadors.microsoft.com/) -* **🙏 ಮುಖ್ಯ ಕೊಡುಗೆದಾರರು:** [Evgenii Pishchik](https://github.com/Pe4enIks) +* **🎨 ಚಿತ್ರರೂಪಣ ಕಲಾವಿದೆ:** [Tomomi Imura](https://twitter.com/girlie_mac) +* **✅ ಪ್ರಶ್ನೋತ್ತರ ಸೃಷ್ಟಿಕರ್ತ:** [Lateefah Bello](https://github.com/CinnamonXI), [MLSA](https://studentambassadors.microsoft.com/) +* **🙏 ಮುಖ್ಯ ಕೊಡುಗೆ ದಾರರು:** [Evgenii Pishchik](https://github.com/Pe4enIks) -## ಇತರ ಪಾಠ್ಯಕ್ರಮಗಳು +## ಇತರ ಪಠ್ಯಕ್ರಮಗಳು -ನಮ್ಮ ತಂಡ ಇತರ ಪಾಠ್ಯಕ್ರಮಗಳನ್ನು ರಚಿಸುತ್ತದೆ! ನೋಡಿ: +ನಮ್ಮ ತಂಡ ಇತರ ಪಠ್ಯಕ್ರಮಗಳನ್ನು ಉತ್ಪಾದಿಸುತ್ತದೆ! ಪರಿಶೀಲಿಸಿ: -### LangChain +### ಲಾಂಚ್‌ಚೈನ್ [![LangChain4j for Beginners](https://img.shields.io/badge/LangChain4j%20for%20Beginners-22C55E?style=for-the-badge&&labelColor=E5E7EB&color=0553D6)](https://aka.ms/langchain4j-for-beginners) [![LangChain.js for Beginners](https://img.shields.io/badge/LangChain.js%20for%20Beginners-22C55E?style=for-the-badge&labelColor=E5E7EB&color=0553D6)](https://aka.ms/langchainjs-for-beginners?WT.mc_id=m365-94501-dwahlin) [![LangChain for Beginners](https://img.shields.io/badge/LangChain%20for%20Beginners-22C55E?style=for-the-badge&labelColor=E5E7EB&color=0553D6)](https://github.com/microsoft/langchain-for-beginners?WT.mc_id=m365-94501-dwahlin) --- -### Azure / Edge / MCP / Agents +### ಅಜ್ಯೂರ್ / ಎಡ್ಜ್ / MCP / ಏಜೆಂಟ್‌ಗಳು [![AZD for Beginners](https://img.shields.io/badge/AZD%20for%20Beginners-0078D4?style=for-the-badge&labelColor=E5E7EB&color=0078D4)](https://github.com/microsoft/AZD-for-beginners?WT.mc_id=academic-105485-koreyst) [![Edge AI for Beginners](https://img.shields.io/badge/Edge%20AI%20for%20Beginners-00B8E4?style=for-the-badge&labelColor=E5E7EB&color=00B8E4)](https://github.com/microsoft/edgeai-for-beginners?WT.mc_id=academic-105485-koreyst) [![MCP for Beginners](https://img.shields.io/badge/MCP%20for%20Beginners-009688?style=for-the-badge&labelColor=E5E7EB&color=009688)](https://github.com/microsoft/mcp-for-beginners?WT.mc_id=academic-105485-koreyst) @@ -190,7 +190,7 @@ _ಮೇಘದಲ್ಲಿ ಏಐ_ ವಿಷಯಗಳಿಗೆ ಸಾಫ್ಟ್ --- -### Generative AI Series +### ಜನರೇಟಿವ್ AI ಸರಣಿ [![Generative AI for Beginners](https://img.shields.io/badge/Generative%20AI%20for%20Beginners-8B5CF6?style=for-the-badge&labelColor=E5E7EB&color=8B5CF6)](https://github.com/microsoft/generative-ai-for-beginners?WT.mc_id=academic-105485-koreyst) [![Generative AI (.NET)](https://img.shields.io/badge/Generative%20AI%20(.NET)-9333EA?style=for-the-badge&labelColor=E5E7EB&color=9333EA)](https://github.com/microsoft/Generative-AI-for-beginners-dotnet?WT.mc_id=academic-105485-koreyst) [![Generative AI (Java)](https://img.shields.io/badge/Generative%20AI%20(Java)-C084FC?style=for-the-badge&labelColor=E5E7EB&color=C084FC)](https://github.com/microsoft/generative-ai-for-beginners-java?WT.mc_id=academic-105485-koreyst) @@ -198,36 +198,36 @@ _ಮೇಘದಲ್ಲಿ ಏಐ_ ವಿಷಯಗಳಿಗೆ ಸಾಫ್ಟ್ --- -### Core Learning +### ಮುಖ್ಯ ಕಲಿಕೆ [![ML for Beginners](https://img.shields.io/badge/ML%20for%20Beginners-22C55E?style=for-the-badge&labelColor=E5E7EB&color=22C55E)](https://aka.ms/ml-beginners?WT.mc_id=academic-105485-koreyst) -[![Data Science for Beginners](https://img.shields.io/badge/Data%20Science%20for%20Beginners-84CC16?style=for-the-badge&labelColor=E5E7EB&color=84CC16)](https://aka.ms/datascience-beginners?WT.mc_id=academic-105485-koreyst) +[![ಡೇಟಾ ಸೈನ್ಸ್ for Beginners](https://img.shields.io/badge/Data%20Science%20for%20Beginners-84CC16?style=for-the-badge&labelColor=E5E7EB&color=84CC16)](https://aka.ms/datascience-beginners?WT.mc_id=academic-105485-koreyst) [![AI for Beginners](https://img.shields.io/badge/AI%20for%20Beginners-A3E635?style=for-the-badge&labelColor=E5E7EB&color=A3E635)](https://aka.ms/ai-beginners?WT.mc_id=academic-105485-koreyst) -[![Cybersecurity for Beginners](https://img.shields.io/badge/Cybersecurity%20for%20Beginners-F97316?style=for-the-badge&labelColor=E5E7EB&color=F97316)](https://github.com/microsoft/Security-101?WT.mc_id=academic-96948-sayoung) -[![Web Dev for Beginners](https://img.shields.io/badge/Web%20Dev%20for%20Beginners-EC4899?style=for-the-badge&labelColor=E5E7EB&color=EC4899)](https://aka.ms/webdev-beginners?WT.mc_id=academic-105485-koreyst) -[![IoT for Beginners](https://img.shields.io/badge/IoT%20for%20Beginners-14B8A6?style=for-the-badge&labelColor=E5E7EB&color=14B8A6)](https://aka.ms/iot-beginners?WT.mc_id=academic-105485-koreyst) -[![XR Development for Beginners](https://img.shields.io/badge/XR%20Development%20for%20Beginners-38BDF8?style=for-the-badge&labelColor=E5E7EB&color=38BDF8)](https://github.com/microsoft/xr-development-for-beginners?WT.mc_id=academic-105485-koreyst) +[![ಸೈಬರ್‌ಸೆಕ್ಯುರಿಟಿ for Beginners](https://img.shields.io/badge/Cybersecurity%20for%20Beginners-F97316?style=for-the-badge&labelColor=E5E7EB&color=F97316)](https://github.com/microsoft/Security-101?WT.mc_id=academic-96948-sayoung) +[![ವೆಬ್ ಡೆವ್ for Beginners](https://img.shields.io/badge/Web%20Dev%20for%20Beginners-EC4899?style=for-the-badge&labelColor=E5E7EB&color=EC4899)](https://aka.ms/webdev-beginners?WT.mc_id=academic-105485-koreyst) +[![ಐಒಟಿ for Beginners](https://img.shields.io/badge/IoT%20for%20Beginners-14B8A6?style=for-the-badge&labelColor=E5E7EB&color=14B8A6)](https://aka.ms/iot-beginners?WT.mc_id=academic-105485-koreyst) +[![XR ಅಭಿವೃದ್ಧಿ for Beginners](https://img.shields.io/badge/XR%20Development%20for%20Beginners-38BDF8?style=for-the-badge&labelColor=E5E7EB&color=38BDF8)](https://github.com/microsoft/xr-development-for-beginners?WT.mc_id=academic-105485-koreyst) --- -### Copilot Series -[![Copilot for AI Paired Programming](https://img.shields.io/badge/Copilot%20for%20AI%20Paired%20Programming-FACC15?style=for-the-badge&labelColor=E5E7EB&color=FACC15)](https://aka.ms/GitHubCopilotAI?WT.mc_id=academic-105485-koreyst) -[![Copilot for C#/.NET](https://img.shields.io/badge/Copilot%20for%20C%23/.NET-FBBF24?style=for-the-badge&labelColor=E5E7EB&color=FBBF24)](https://github.com/microsoft/mastering-github-copilot-for-dotnet-csharp-developers?WT.mc_id=academic-105485-koreyst) -[![Copilot Adventure](https://img.shields.io/badge/Copilot%20Adventure-FDE68A?style=for-the-badge&labelColor=E5E7EB&color=FDE68A)](https://github.com/microsoft/CopilotAdventures?WT.mc_id=academic-105485-koreyst) +### ಪಾಲುದಾರ ಸರಣಿ +[![AI ಜೊತೆಗೆ ಜೋಡಣೆಯಾಗಿ Copilot](https://img.shields.io/badge/Copilot%20for%20AI%20Paired%20Programming-FACC15?style=for-the-badge&labelColor=E5E7EB&color=FACC15)](https://aka.ms/GitHubCopilotAI?WT.mc_id=academic-105485-koreyst) +[![C#/.NET Copilot](https://img.shields.io/badge/Copilot%20for%20C%23/.NET-FBBF24?style=for-the-badge&labelColor=E5E7EB&color=FBBF24)](https://github.com/microsoft/mastering-github-copilot-for-dotnet-csharp-developers?WT.mc_id=academic-105485-koreyst) +[![Copilot ಸಾಹಸ](https://img.shields.io/badge/Copilot%20Adventure-FDE68A?style=for-the-badge&labelColor=E5E7EB&color=FDE68A)](https://github.com/microsoft/CopilotAdventures?WT.mc_id=academic-105485-koreyst) ## ಸಹಾಯ ಪಡೆಯುವುದು -AI ಅಪ್ಲಿಕೇಶನ್ ನಿರ್ಮಿಸುವಾಗ ನೀವು ಸಮಸ್ಯೆ ಎದುರಿಸಿದರೆ ಅಥವಾ ಯಾವುದೇ ಪ್ರಶ್ನೆಗಳಿದ್ದರೆ, MCP ಬಗ್ಗೆ ಚರ್ಚೆಗಳಲ್ಲಿರುವ ಇತರ ಕಲಿಯುವರು ಮತ್ತು ಅನುಭವಿಸಿದ ಡೆವಲಪರ್‌ಗಳ ಜೊತೆ ಸೇರಿರಿ. ಇದು ಬೆಂಬಲಕಾರಿಯಿರುವ ಸಮುದಾಯವಾಗಿದ್ದು, ಪ್ರಶ್ನೆಗಳನ್ನು ಸ್ವಾಗತಿಸುತ್ತವೆ ಮತ್ತು ಜ್ಞಾನವನ್ನು ಮುಕ್ತವಾಗಿ ಹಂಚಿಕೊಳ್ಳುತ್ತವೆ. +ನೀವು ಅಡೆ serviçosಗೆಯಾಗಿದ್ದೀರಾ ಅಥವಾ AI ಆಪ್‌ಗಳ ನಿರ್ಮಾಣ ಸಂಬಂಧಿ ಪ್ರಶ್ನೆಗಳಿದ್ದರೆ. MCP ಬಗ್ಗೆ ಚರ್ಚೆಗಳಲ್ಲಿ ಇತರ ಕಲಿತುಕೊಳ್ಳುವವರು ಮತ್ತು ಅನುಭವಶಾಲಿ ಡೆವಲಪರ್‌ಗಳನ್ನು ಸೇರಿರಿ. ಇದು ಪ್ರಶ್ನೆಗಳಿಗೆ ಎದ್ದು ನಿಲ್ಲುವ ಮತ್ತು ಜ್ಞಾನವನ್ನು ಮುಕ್ತವಾಗಿ ಹಂಚಿಕೊಳ್ಳುವ ಸಹಾಯಕ ಸಮುದಾಯವಾಗಿದೆ. [![Microsoft Foundry Discord](https://dcbadge.limes.pink/api/server/nTYy5BXMWG)](https://discord.gg/nTYy5BXMWG) -ನೀವು ನಿರ್ಮಿಸುವಾಗ ಉತ್ಪನ್ನ ಪ್ರತಿಕ್ರಿಯೆ ಅಥವಾ ದೋಷಗಳನ್ನು ಕಂಡುಹಿಡಿದರೆ: +ನೀವು ಉತ್ಪನ್ನ ಪ್ರತಿಕ್ರಿಯೆಯುಳ್ಳವರಾಗಿದ್ದರೆ ಅಥವಾ ನಿರ್ಮಾಣದ ಸಂದರ್ಭದಲ್ಲಿ ದೋಶ ಕಂಡುಕೊಂಡಿದ್ದರೆ, ದಯವಿಟ್ಟು ಭೇಟಿ ನೀಡಿ: [![Microsoft Foundry Developer Forum](https://img.shields.io/badge/GitHub-Microsoft_Foundry_Developer_Forum-blue?style=for-the-badge&logo=github&color=000000&logoColor=fff)](https://aka.ms/foundry/forum) --- -**ವಿಚ್ಛೇದನೆ**: -ಈ ದಾಖಲೆ AI ಭಾಷಾಂತರ ಸೇವೆ [Co-op Translator](https://github.com/Azure/co-op-translator) ಬಳಸಿ ಭಾಷಾಂತರಿಸಲಾಗಿದೆ. ನಾವು ಸತ್ಯಾಸತ್ಯತೆಯತ್ತ ಪ್ರಯತ್ನಿಸುತ್ತಿದ್ದರೂ, ಸ್ವಯಂಚಾಲಿತ ಭಾಷಾಂತರಗಳಲ್ಲಿ ದೋಷಗಳು ಅಥವಾ ಅಸತ್ಯತೆಗಳು ಇರಬಹುದೆಂದು ಗಮನಿಸಿ. ಮೂಲ ಭಾಷೆಯಲ್ಲಿರುವ ಮೂಲ ದಾಖಲೆ ಅನ್ನು ಅಧಿಕೃತ ಮೂಲವೆಂದು ಪರಿಗಣಿಸಬೇಕು. ಪ್ರಮುಖ ಮಾಹಿತಿಗಾಗಿ ವೃತ್ತಿಪರ ಮಾನವ ಭಾಷಾಂತರವನ್ನು ಶಿಫಾರಸು ಮಾಡಲಾಗುತ್ತದೆ. ಈ ಭಾಷಾಂತರ ಬಳಕೆಯಿಂದ ಉಂಟಾಗುವ ಯಾವುದೇ ತಪ್ಪು ಅರ್ಥಗೌತಮತೆ ಅಥವಾ ದೋಷಗಳಿಗೆ ನಾವು ಹೊಣೆಗಾರರಲ್ಲ. +**ಅನಿವಾರ್ಯ ಸೂಚನೆ**: +ಈ ಡಾಕ್ಯುಮೆಂಟ್ ಅನ್ನು AI ಅನುವಾದ ಸೇವೆ [Co-op Translator](https://github.com/Azure/co-op-translator) ಬಳಸಿ ಅನುವದಿಸಲಾಗಿದೆ. ನಾವು ನಿಖರತೆಗೆ ಪ್ರಯತ್ನಿಸುತ್ತಿದ್ದರೂ, ಸ್ವಯಂಚಾಲಿತ ಅನುವಾದಗಳಲ್ಲಿ ತಪ್ಪುಗಳು ಅಥವಾ ಅಸತ್ಯತೆಗಳು ಇರಬಹುದು ಎಂದು ದಯವಿಟ್ಟು ಜ್ಞಾಪಕದಲ್ಲಿಡಿ. ಮೂಲ ಡಾಕ್ಯುಮೆಂಟ್ ತನ್ನ ಮೂಲ ಭಾಷೆಯಲ್ಲಿ ಆಡಳಿತಾತ್ಮಕ ಮೂಲವೆಂದು ಪರಿಗಣಿಸಬೇಕು. ಅತ್ಯಾವಶ್ಯಕ ಮಾಹಿತಿಗಾಗಿ, ವೃತ್ತಿಪರ ಮಾನವ ಅನುವಾದ ಶಿಫಾರಸು ಮಾಡಲಾಗುತ್ತದೆ. ಈ ಅನುವಾದ ಬಳಕೆಯಿಂದ ಉಂಟಾಗುವ ಯಾವುದೇ ತಪ್ಪು ಗ್ರಹಿಕೆಗಳಿಗಾಗಿ ಅಥವಾ ತಪ್ಪುತಪಾಸುಗಳಿಗೆ ನಾವು ಹೊಣೆಗಾರರಾಗುವುದಿಲ್ಲ. \ No newline at end of file diff --git a/translations/ml/.co-op-translator.json b/translations/ml/.co-op-translator.json index 233556b6..1c38996b 100644 --- a/translations/ml/.co-op-translator.json +++ b/translations/ml/.co-op-translator.json @@ -6,8 +6,8 @@ "language_code": "ml" }, "README.md": { - "original_hash": "9eaca839b0b3f6d7f0a195fd33cebd30", - "translation_date": "2026-02-28T08:59:28+00:00", + "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", + "translation_date": "2026-04-06T16:54:02+00:00", "source_file": "README.md", "language_code": "ml" }, diff --git a/translations/ml/README.md b/translations/ml/README.md index b6079923..3b6d048d 100644 --- a/translations/ml/README.md +++ b/translations/ml/README.md @@ -1,36 +1,36 @@ -[![GitHub ലൈസൻസ്](https://img.shields.io/github/license/microsoft/AI-For-Beginners.svg)](https://github.com/microsoft/AI-For-Beginners/blob/main/LICENSE) -[![GitHub സംഭാവനകർ](https://img.shields.io/github/contributors/microsoft/AI-For-Beginners.svg)](https://GitHub.com/microsoft/AI-For-Beginners/graphs/contributors/) -[![GitHub പ്രശ്നങ്ങൾ](https://img.shields.io/github/issues/microsoft/AI-For-Beginners.svg)](https://GitHub.com/microsoft/AI-For-Beginners/issues/) -[![GitHub പുൾ-റിക്ക്വസ്റ്റുകൾ](https://img.shields.io/github/issues-pr/microsoft/AI-For-Beginners.svg)](https://GitHub.com/microsoft/AI-For-Beginners/pulls/) -[![PRs സ്വാഗതം](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) +[![GitHub license](https://img.shields.io/github/license/microsoft/AI-For-Beginners.svg)](https://github.com/microsoft/AI-For-Beginners/blob/main/LICENSE) +[![GitHub contributors](https://img.shields.io/github/contributors/microsoft/AI-For-Beginners.svg)](https://GitHub.com/microsoft/AI-For-Beginners/graphs/contributors/) +[![GitHub issues](https://img.shields.io/github/issues/microsoft/AI-For-Beginners.svg)](https://GitHub.com/microsoft/AI-For-Beginners/issues/) +[![GitHub pull-requests](https://img.shields.io/github/issues-pr/microsoft/AI-For-Beginners.svg)](https://GitHub.com/microsoft/AI-For-Beginners/pulls/) +[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) -[![GitHub വാച്ചേഴ്സ്](https://img.shields.io/github/watchers/microsoft/AI-For-Beginners.svg?style=social&label=Watch)](https://GitHub.com/microsoft/AI-For-Beginners/watchers/) -[![GitHub ഫ്രോക്കുകൾ](https://img.shields.io/github/forks/microsoft/AI-For-Beginners.svg?style=social&label=Fork)](https://GitHub.com/microsoft/AI-For-Beginners/network/) -[![GitHub താരങ്ങൾ](https://img.shields.io/github/stars/microsoft/AI-For-Beginners.svg?style=social&label=Star)](https://GitHub.com/microsoft/AI-For-Beginners/stargazers/) -[![ബൈൻഡർ](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD) -[![ഗിറ്റർ](https://badges.gitter.im/Microsoft/ai-for-beginners.svg)](https://gitter.im/Microsoft/ai-for-beginners?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) +[![GitHub watchers](https://img.shields.io/github/watchers/microsoft/AI-For-Beginners.svg?style=social&label=Watch)](https://GitHub.com/microsoft/AI-For-Beginners/watchers/) +[![GitHub forks](https://img.shields.io/github/forks/microsoft/AI-For-Beginners.svg?style=social&label=Fork)](https://GitHub.com/microsoft/AI-For-Beginners/network/) +[![GitHub stars](https://img.shields.io/github/stars/microsoft/AI-For-Beginners.svg?style=social&label=Star)](https://GitHub.com/microsoft/AI-For-Beginners/stargazers/) +[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD) +[![Gitter](https://badges.gitter.im/Microsoft/ai-for-beginners.svg)](https://gitter.im/Microsoft/ai-for-beginners?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Microsoft Foundry Discord](https://dcbadge.limes.pink/api/server/nTYy5BXMWG)](https://discord.gg/nTYy5BXMWG) -# പുതിയ മുതിർന്നവർക്കുള്ള ആർട്ടിഫിഷ്യൽ ഇന്റലിജൻസ് - ഒരു പാഠ്യപദ്ധതി +# കൃത്രിമ ബുദ്ധിമുട്ടിനായുള്ള തുടക്കക്കാർ - ഒരു പാഠ്യക്രമം -|![സ്കെച്ച്നോട്ട് @girlie_mac https://twitter.com/girlie_mac](https://github.com/microsoft/AI-For-Beginners/raw/main/lessons/sketchnotes/ai-overview.png)| +|![Sketchnote by @girlie_mac https://twitter.com/girlie_mac](https://github.com/microsoft/AI-For-Beginners/raw/main/lessons/sketchnotes/ai-overview.png)| |:---:| -| AI For Beginners - _സ്കെച്ച്നോട്ട് [@girlie_mac](https://twitter.com/girlie_mac) നിർമ്മിച്ചത്_ | +| AI For Beginners - _Sketchnote by [@girlie_mac](https://twitter.com/girlie_mac)_ | -നമ്മുടെയ 12 ആഴ്ചകളുള്ള, 24 പാഠങ്ങളുള്ള പാഠ്യപദ്ധതിയുമായി **ആർട്ടിഫിഷ്യൽ ഇന്റലിജൻസ്** (AI) ലോകം അനുഭവിച്ച് നോക്കൂ! ഇതിൽ പ്രായോഗിക പാഠങ്ങൾ, ക്വിസുകൾ, ലാബുകൾ എന്നിവ ഉൾപ്പെടുത്തിയിട്ടുണ്ട്. ഈ പാഠ്യപദ്ധതി തുടങ്ങി പഠിക്കാർക്ക് സൗമ്യമാണ് കൂടാതെ TensorFlow, PyTorch പോലുള്ള ഉപകരണങ്ങൾക്കും AI-യിലെ തമ്മിലുള്ള നൈതികതകൾക്കും ഉൾപ്പെടുത്തിയിട്ടുണ്ട് +**കൃത്രിമ ബുദ്ധിമുട്ടിന്റെ** (AI) ലോകം 12 ആഴ്ചകളായി 24 പാഠങ്ങളുള്ള ഈ പാഠ്യക്രമത്തിൽ ആഴത്തിൽ സന്ദർശിക്കൂ! ഇതിൽ പ്രായോഗിക പാഠങ്ങൾ, ക്വിസ്, ലാബുകൾ ഉൾപ്പെടുന്നു. ഈ പാഠ്യക്രമം തുടക്കക്കാർക്ക് അനുയോജ്യമാണ് കൂടാതെ TensorFlow, PyTorch പോലുള്ള ഉപകരണങ്ങളെയും AI ലെ നൈതികതകളെയും ഉൾക്കൊള്ളുന്നു. -### 🌐 ബഹുഭാഷാ പിന്തുണ +### 🌐 ബഹুভാഷാ സഹായം -#### GitHub അക്ഷനിലൂടെ പിന്തുണ (സ്വയം സജീവവും എല്ലായ്പ്പോഴും പുതുക്കപ്പെടുന്നതുമാണ്) +#### GitHub ആക്ഷനിലൂടെ പിന്തുണ (സ്വയഞരമയമായും എപ്പോഴും അപ്ഡേറ്റ് ആയും) -[Arabic](../ar/README.md) | [Bengali](../bn/README.md) | [Bulgarian](../bg/README.md) | [Burmese (Myanmar)](../my/README.md) | [Chinese (Simplified)](../zh-CN/README.md) | [Chinese (Traditional, Hong Kong)](../zh-HK/README.md) | [Chinese (Traditional, Macau)](../zh-MO/README.md) | [Chinese (Traditional, Taiwan)](../zh-TW/README.md) | [Croatian](../hr/README.md) | [Czech](../cs/README.md) | [Danish](../da/README.md) | [Dutch](../nl/README.md) | [Estonian](../et/README.md) | [Finnish](../fi/README.md) | [French](../fr/README.md) | [German](../de/README.md) | [Greek](../el/README.md) | [Hebrew](../he/README.md) | [Hindi](../hi/README.md) | [Hungarian](../hu/README.md) | [Indonesian](../id/README.md) | [Italian](../it/README.md) | [Japanese](../ja/README.md) | [Kannada](../kn/README.md) | [Korean](../ko/README.md) | [Lithuanian](../lt/README.md) | [Malay](../ms/README.md) | [Malayalam](./README.md) | [Marathi](../mr/README.md) | [Nepali](../ne/README.md) | [Nigerian Pidgin](../pcm/README.md) | [Norwegian](../no/README.md) | [Persian (Farsi)](../fa/README.md) | [Polish](../pl/README.md) | [Portuguese (Brazil)](../pt-BR/README.md) | [Portuguese (Portugal)](../pt-PT/README.md) | [Punjabi (Gurmukhi)](../pa/README.md) | [Romanian](../ro/README.md) | [Russian](../ru/README.md) | [Serbian (Cyrillic)](../sr/README.md) | [Slovak](../sk/README.md) | [Slovenian](../sl/README.md) | [Spanish](../es/README.md) | [Swahili](../sw/README.md) | [Swedish](../sv/README.md) | [Tagalog (Filipino)](../tl/README.md) | [Tamil](../ta/README.md) | [Telugu](../te/README.md) | [Thai](../th/README.md) | [Turkish](../tr/README.md) | [Ukrainian](../uk/README.md) | [Urdu](../ur/README.md) | [Vietnamese](../vi/README.md) +[Arabic](../ar/README.md) | [Bengali](../bn/README.md) | [Bulgarian](../bg/README.md) | [Burmese (Myanmar)](../my/README.md) | [Chinese (Simplified)](../zh-CN/README.md) | [Chinese (Traditional, Hong Kong)](../zh-HK/README.md) | [Chinese (Traditional, Macau)](../zh-MO/README.md) | [Chinese (Traditional, Taiwan)](../zh-TW/README.md) | [Croatian](../hr/README.md) | [Czech](../cs/README.md) | [Danish](../da/README.md) | [Dutch](../nl/README.md) | [Estonian](../et/README.md) | [Finnish](../fi/README.md) | [French](../fr/README.md) | [German](../de/README.md) | [Greek](../el/README.md) | [Hebrew](../he/README.md) | [Hindi](../hi/README.md) | [Hungarian](../hu/README.md) | [Indonesian](../id/README.md) | [Italian](../it/README.md) | [Japanese](../ja/README.md) | [Kannada](../kn/README.md) | [Khmer](../km/README.md) | [Korean](../ko/README.md) | [Lithuanian](../lt/README.md) | [Malay](../ms/README.md) | [Malayalam](./README.md) | [Marathi](../mr/README.md) | [Nepali](../ne/README.md) | [Nigerian Pidgin](../pcm/README.md) | [Norwegian](../no/README.md) | [Persian (Farsi)](../fa/README.md) | [Polish](../pl/README.md) | [Portuguese (Brazil)](../pt-BR/README.md) | [Portuguese (Portugal)](../pt-PT/README.md) | [Punjabi (Gurmukhi)](../pa/README.md) | [Romanian](../ro/README.md) | [Russian](../ru/README.md) | [Serbian (Cyrillic)](../sr/README.md) | [Slovak](../sk/README.md) | [Slovenian](../sl/README.md) | [Spanish](../es/README.md) | [Swahili](../sw/README.md) | [Swedish](../sv/README.md) | [Tagalog (Filipino)](../tl/README.md) | [Tamil](../ta/README.md) | [Telugu](../te/README.md) | [Thai](../th/README.md) | [Turkish](../tr/README.md) | [Ukrainian](../uk/README.md) | [Urdu](../ur/README.md) | [Vietnamese](../vi/README.md) -> **സ്വന്തമായി ക്ലോൺ ചെയ്യാൻ ഇഷ്ടമുള്ളവർക്ക്?** +> **പ്രിയമുള്ളവർ നഗരം തന്നെ ക്ലോൺ ചെയ്യണോ?** > -> ഈ റീപോസിറ്ററിയിൽ 50+ ഭാഷാ തർജ്ജമകൾ ഉൾപ്പെടുത്തിയിട്ടുണ്ട്, ഇത് ഡൗൺലോഡ് വലുതാക്കും. തർജ്ജമകൾ ഓർത്ത് കളയാതെ ക്ലോൺ ചെയ്യാൻ sparse checkout ഉപയോഗിക്കാം: +> ഈ റെപ്പോസിറ്ററിയിൽ 50+ ഭാഷാ പരിഭാഷകൾ ഉൾപ്പെട്ടിട്ടുള്ളതിനാൽ ഡൗൺലോഡ് വലുതാകും. പരിഭാഷകൾ ഇല്ലാതെ ക്ലോൺ ചെയ്യാൻ sparse checkout ഉപയോഗിക്കുക: > > **Bash / macOS / Linux:** > ```bash @@ -46,189 +46,188 @@ > git sparse-checkout set --no-cone "/*" "!translations" "!translated_images" > ``` > -> ഇത് നിങ്ങൾക്ക് പാഠ്യപദ്ധതി പൂർത്തിയാക്കാൻ ആവശ്യമായ എല്ലാ ഫയലുകളും വേഗതയോടെ ഡൗൺലോഡ് ചെയ്യാൻ സഹായിക്കും. +> നിങ്ങൾക്ക് കോഴ്‌സ് പൂര്‍ത്തിയാക്കാൻ ആവശ്യമായ എല്ലാ കാര്യങ്ങളും വളരെ വേഗത്തിലുള്ള ഡൗൺലോഡോടെ ലഭിക്കും. -**കൂടുതൽ തർജ്ജമാ ഭാഷകൾക്ക് പിന്തുണ ആഗ്രഹിക്കുന്നുവെങ്കിൽ ഇവിടെ പട്ടികയുണ്ട് [here](https://github.com/Azure/co-op-translator/blob/main/getting_started/supported-languages.md)** +**കൂടുതൽ നിർദ്ദേശിച്ച പരിഭാഷാ ഭാഷകൾ [ഇവിടെ](https://github.com/Azure/co-op-translator/blob/main/getting_started/supported-languages.md) പട്ടികപ്പെടുത്തിയിരിക്കുന്നു** -## സമൂഹത്തിൽ ചേരുക +## കമ്യൂണിറ്റിയിലൊരൊപ്പം ചേരുക [![Microsoft Foundry Discord](https://dcbadge.limes.pink/api/server/nTYy5BXMWG)](https://discord.gg/nTYy5BXMWG) -## നിങ്ങൾ പഠിക്കാനുള്ളത് +## നിങ്ങൾ എന്ത് പഠിക്കും -**[പാഠ്യപദ്ധതിയുടെ മൈൻഡ്മാപ്പ്](http://soshnikov.com/courses/ai-for-beginners/mindmap.html)** +**[കോഴ്‌സിന്റെ മൈൻഡ് മാപ്പ്](http://soshnikov.com/courses/ai-for-beginners/mindmap.html)** -ഈ പാഠ്യപദ്ധതിയിൽ നിങ്ങൾ പഠിക്കുന്നത്: +ഈ പാഠ്യക്രമത്തിൽ, നിങ്ങൾ പഠിക്കുക: -* കല്പിത ബുദ്ധി (Artificial Intelligence) -ന് വിവിധ സമീപനങ്ങൾ, അതിൽ "നല്ല പഴയ" ചിഹ്നാത്മക സമീപനം **Knowledge Representation** ഉം മുന്നറിയിപ്പും ഉൾപ്പെടെ ([GOFAI](https://en.wikipedia.org/wiki/Symbolic_artificial_intelligence)). -* **ന്യൂറൽ നെറ്റ്‌വർക്ക്‌‌സ്** ഉം **ഡീപ്പ് ലേണിംഗ്** ഉം, ഇവ ആധുനിക AI-യുടെ ഹൃദയഭാഗം ആണ്. ഈ പ്രാധാന്യമുള്ള വിഷയങ്ങളുടെ ആശയങ്ങളെ രണ്ട് ഏറ്റവും ജനപ്രിയ ഫ്രെയിംവർക്കുകളിൽ [TensorFlow](http://Tensorflow.org) ഉം [PyTorch](http://pytorch.org) ഉം ഉപയോഗിച്ച് കോഡ് മുഖേന വിവരിക്കും. -* ചിത്രങ്ങളും വാചകവുമൊത്ത് പ്രവർത്തിക്കാൻ **ന്യൂറൽ ആർക്കിടെക്ചറുകൾ**. പുതുമുഖ മാതൃകകൾ ഉൾപ്പെടയിട്ടും ചിലപ് പുതു തലത്തിലുള്ള കെട്ടുകഥകളിൽ കുറവ് ഉണ്ടായിരിക്കാം. -* കുറച്ച് പ്രചാരത്തിലുള്ള AI സമീപനങ്ങൾ, ഉദാഹരണത്തിന് **ജെനറ്റിക് ആൽഗോരിതങ്ങളും** **മൾട്ടി-എജന്റ് സിസ്റ്റങ്ങളുമൊക്കെ**. +* കൃത്രിമ ബുദ്ധിമുട്ടിന് വിവിധ സമീപനങ്ങൾ, "പഴയ നല്ല" പ്രതീകാത്മക സമീപനമുള്ള **ജ്ഞാന പ്രതിനിധാനം**യും വിവേകശക്തിയും ഉൾപ്പെടെ ([GOFAI](https://en.wikipedia.org/wiki/Symbolic_artificial_intelligence)). +* ആധുനിക AI യുടെ മദ്ധ്യസ്ഥാനം ആയ **ന്യൂറൽ നെറ്റ്‌വർക്കുകൾ**യും **ഗഹന പഠനവും**. ഈ പ്രധാന വിഷങ്ങൾ പിന്നിലുള്ള ആശയങ്ങൾ രണ്ട് പ്രചാരത്തിലുള്ള ഫ്രെയിംവർക്ക് - [TensorFlow](http://Tensorflow.org) and [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-ന്റെ [Introduction to AI for business users](https://docs.microsoft.com/learn/paths/introduction-ai-for-business-users/?WT.mc_id=academic-77998-bethanycheum) ലേണിംഗ് പാതയോ അല്ലെങ്കിൽ [AI Business School](https://www.microsoft.com/ai/ai-business-school/?WT.mc_id=academic-77998-bethanycheum), [INSEAD](https://www.insead.edu/) യുമായി ചേർന്ന് വികസിപ്പിച്ചതായൊരു സ്കൂൾ, അവ അന്വേഷിക്കുക. -* **പരമ്പരാഗത മെഷീൻ ലേണിംഗ്**, ഇത് ഞങ്ങളുടെ [Machine Learning for Beginners Curriculum](http://github.com/Microsoft/ML-for-Beginners) ൽ വിശദീകരിച്ചിരിക്കുന്നു. -* **[Cognitive Services](https://azure.microsoft.com/services/cognitive-services/?WT.mc_id=academic-77998-bethanycheum)** ഉപയോഗിച്ച് നിർമ്മിച്ച പ്രായോഗിക AI ആപ്ലിക്കേഷനുകൾ. ഇതിനു വേണ്ടി Microsoft Learn-ലുള്ള [vision](https://docs.microsoft.com/learn/paths/create-computer-vision-solutions-azure-cognitive-services/?WT.mc_id=academic-77998-bethanycheum), [natural language processing](https://docs.microsoft.com/learn/paths/explore-natural-language-processing/?WT.mc_id=academic-77998-bethanycheum), **[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)** തുടങ്ങിയ മോഡ്യൂളുകൾ നിങ്ങളെ സഹായിക്കും. -* പ്രത്യേക 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). [Build and operate machine learning solutions with Azure Machine Learning](https://docs.microsoft.com/learn/paths/build-ai-solutions-with-azure-ml-service/?WT.mc_id=academic-77998-bethanycheum) എന്നും [Build and Operate Machine Learning Solutions with Azure Databricks](https://docs.microsoft.com/learn/paths/build-operate-machine-learning-solutions-azure-databricks/?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) ലേണിംഗ് പാതയുണ്ട്, കൂടാതെ കൂടുതൽ വിശദീകരണം [ഈ ബ്ലോഗ് പോസ്റ്റ്](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/) ശുപാർശ ചെയ്യും. +* **വ്യാപാരത്തിൽ AI பயன்படுத்தൽ** ബിസിനസ്സ് കാര്യങ്ങൾ. Microsoft Learn ലെ [business users-ക്കുള്ള AI പരിചയപ്പെടുത്തൽ](https://docs.microsoft.com/learn/paths/introduction-ai-for-business-users/?WT.mc_id=academic-77998-bethanycheum) പാഠഭാഗം അല്ലെങ്കിൽ [AI Business School](https://www.microsoft.com/ai/ai-business-school/?WT.mc_id=academic-77998-bethanycheum), [INSEAD](https://www.insead.edu/) സഹകരിച്ചാണ് വികസിപ്പിച്ചിരിക്കുന്നത്, പരിഗണിക്കുക. +* സാധാരണ **ക്ലാസിക് മെഷീൻ ലേണിംഗ്**, ഞങ്ങളുടെ [Machine Learning for Beginners Curriculum](http://github.com/Microsoft/ML-for-Beginners) ഒഴുകുന്നു. +* **[Cognitive Services](https://azure.microsoft.com/services/cognitive-services/?WT.mc_id=academic-77998-bethanycheum)** ഉപയോഗിച്ച് നിർമ്മിച്ച പ്രായോഗിക AI ആപ്ലിക്കേഷൻസ്. ഇതിന്, Microsoft Learn ലെ [vision](https://docs.microsoft.com/learn/paths/create-computer-vision-solutions-azure-cognitive-services/?WT.mc_id=academic-77998-bethanycheum), [natural language processing](https://docs.microsoft.com/learn/paths/explore-natural-language-processing/?WT.mc_id=academic-77998-bethanycheum), **[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)** തുടങ്ങിയ മൊഡ്യൂളുകൾ ആരംഭിക്കാൻ ശുപാർശ ചെയ്യുന്നു. +* പ്രത്യേക **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). [Build and operate machine learning solutions with Azure Machine Learning](https://docs.microsoft.com/learn/paths/build-ai-solutions-with-azure-ml-service/?WT.mc_id=academic-77998-bethanycheum) & [Build and Operate Machine Learning Solutions with Azure Databricks](https://docs.microsoft.com/learn/paths/build-operate-machine-learning-solutions-azure-databricks/?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) പാഠഭാഗം ഉണ്ട്, കൂടാതെ [ഈ ബ്ലോഗ് പോസ്റ്റ്](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/) ൽ ഓൺലൈനിൽ ലഭ്യമാണ്. -_ക്ലൗഡിൽ 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) പാത ഉപയോഗിക്കാം. +_ക്ലൗഡിലുള്ള 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) ലേണിംഗ് പാത പരിഗണിക്കാൻ കഴിയും. # ഉള്ളടക്കം -| | പാഠം ലിങ്ക് | PyTorch/Keras/TensorFlow | ലാബ് | +| | പാഠ ലിങ്ക് | PyTorch/Keras/TensorFlow | ലാബ് | | :-: | :------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------: | ------------------------------------------------------------------------------ | -| 0 | [കോർസ് സജ്ജീകരണം](./lessons/0-course-setup/setup.md) | [വികസന പരിസ്ഥിതി സജ്ജീകരിക്കൽ](./lessons/0-course-setup/how-to-run.md) | | -| I | [**AI-യിലേക്ക് പരിചയം**](./lessons/1-Intro/README.md) | | | -| 01 | [AI-യുടെ പരിചയം,ചരിത്രം](./lessons/1-Intro/README.md) | - | - | -| II | **ചിഹ്നാത്മക AI** | -| 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) and [ട്രെയിനിംഗ് ട്രിക്കുകൾ](./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 | [ഓട്ടോ എൻകോഡറുകളും VAE-കളും](./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](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 and 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://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/17-GenerativeNetworks/GenerativePyTorch.ipynb) / [TensorFlow](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/17-GenerativeNetworks/GenerativeTF.ipynb) | [ലാബ്](./lessons/5-NLP/17-GenerativeNetworks/lab/README.md) | -| 18 | [ട്രാൻസ്ഫോർമേഴ്സ്. BERT.](./lessons/5-NLP/18-Transformers/README.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 | [വലിയ ഭാഷാ മോഡലുകൾ, പ്രോമ്പ്റ്റ് പ്രോഗ്രാമിങ്, കുറച്ച്-shot പ്രവർത്തനങ്ങൾ](./lessons/5-NLP/20-LangModels/README.md) | [PyTorch](https://microsoft.github.io/AI-For-Beginners/lessons/5-NLP/20-LangModels/GPT-PyTorch.ipynb) | | -| VI | **മറ്റു AI സാങ്കേതിക വിദ്യകൾ** || | -| 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) | +| 0 | [Course Setup](./lessons/0-course-setup/setup.md) | [Setup Your Development Environment](./lessons/0-course-setup/how-to-run.md) | | +| I | [**Introduction to AI**](./lessons/1-Intro/README.md) | | | +| 01 | [Introduction and History of AI](./lessons/1-Intro/README.md) | - | - | +| II | **Symbolic AI** | +| 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 | [ഓട്ടോഎൻകോഡറുകളും VAE കളും](./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-നെറ്റ്](./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 | [ടെക്സ്റ്റ് പ്രതിനിധാനം. ബോവ്/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 | [സെമാന്റിക് വേഡ് എംബെഡ്ഡിംഗ്സ്. വേഡ്2Vec, 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://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/17-GenerativeNetworks/GenerativePyTorch.ipynb) / [TensorFlow](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/17-GenerativeNetworks/GenerativeTF.ipynb) | [ലാബ്](./lessons/5-NLP/17-GenerativeNetworks/lab/README.md) | +| 18 | [ട്രാൻസ്ഫോമേഴ്‌സ്. BERT.](./lessons/5-NLP/18-Transformers/README.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/README.md) | [PyTorch](https://microsoft.github.io/AI-For-Beginners/lessons/5-NLP/20-LangModels/GPT-PyTorch.ipynb) | | +| VI | **മറ്റു AI സാങ്കേതികതകൾ** || | +| 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) | [നോട്ട്‌ബുക്ക്](./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) | | -## ഓരോ പാഠവും ഉൾപ്പെടുന്നു -* മുൻകൈ വായനാ സാമഗ്രികൾ -* പ്രകൃതമായും ഫ്രെയിമ്വർക്കുകളുമായി (**PyTorch** അല്ലെങ്കിൽ **TensorFlow**) പ്രത്യേകിച്ചുള്ള പ്രവർത്തനക്ഷമമായ Jupyter നോട്ട്‌ബുക്കുകൾ. പ്രവർത്തനക്ഷമമായ നോട്ട്‌ബുക്ക് ഒരു വലിയ സ 이ാങ്കേതിക വീക്ഷണവും ഉൾക്കൊള്ളുന്നു, അതിനാൽ വിഷയം മനസ്സിലാക്കാൻ നിങ്ങൾക്ക് കുറയും ഒരോ പതിപ്പിലും നോട്ട്‌ബുക്ക് (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) മോഡ്യൂളുകളിലേക്ക് ലിങ്കുകൾ കാണാം. -## തുടങ്ങുക +## തുടങ്ങി കാണാം -### 🎯 എഐയിൽ പുതുതായി എത്തിച്ചേർന്നു? ഇവിടെ നിന്ന് ആരംഭിക്കുക! +### 🎯 എ.ഐ.യിൽ പുതിയത്? ഇവിടെതുടങ്ങി കാണൂ! -നിങ്ങൾ എഐയിൽ പൂർണ്ണമായും പുതുതായി എത്തിച്ചേർന്നിട്ടുണ്ടെങ്കിൽ, വേഗത്തിൽ കൈകാര്യം ചെയ്യാവുന്ന ഉദാഹരണങ്ങൾ കാണാൻ, ഞങ്ങളുടെ [**പുതുമുഖത്തിന് അനുയോജ്യമായ ഉദാഹരണങ്ങൾ**](./examples/README.md) പരിശോധിക്കുക! ഇവയിൽ ഉൾപ്പെട്ടിരിക്കുന്നു: +നിങ്ങൾ എ.ഐ.യിൽ പൂർണമായി പുതിയത് ആണെങ്കിൽ, നിബന്ധനാപൂർവമായ, കൈകൊടുക്കുന്ന ഉദാഹരണങ്ങൾക്കായി, ഞങ്ങളുടെ [**ആരംഭക സുഹൃത്തായ ഉദാഹരണങ്ങൾ**](./examples/README.md) നോക്കൂ! ഇവയിൽ ഉൾപ്പെടുന്നു: -- 🌟 **Hello AI World** - നിങ്ങളുടെ ആദ്യ എഐ പ്രോഗ്രാം (പാറ്റേൺ തിരിച്ചറിവ്) -- 🧠 **Simple Neural Network** - നൂൽവലയം പൂർത്തിയാക്കുന്നത് -- 🖼️ **Image Classifier** - വിശദീകരണങ്ങളോടുകൂടിയ ചിത്രവർഗ്ഗീകരണം -- 💬 **Text Sentiment** - പോസിറ്റീവ്/നെഗറ്റീവ് വാചക വിശകലനം +- 🌟 **ഹലോ എ.ഐ. ലോകം** - നിങ്ങളുടെ ആദ്യത്തെ എ.ഐ. പ്രോഗ്രാം (ട്രെന്റ് തിരിച്ചറിവ്) +- 🧠 **സാധാരണ ന്യുറൽ നെറ്റ്‌വർക്ക്** - അതിന്റെ അടിസ്ഥാനത്തിൽ ന്യുറൽ നെറ്റ്‌വർക്ക് നിർമ്മിക്കുക +- 🖼️ **ചിത്രം തരുന്ന വേഗം** - ചിത്രങ്ങളെ വിശദമായ കമന്റുകളോടുകൂടെ വർഗ്ഗീകരിക്കുക +- 💬 **വാചകഭാവം** - പോസിറ്റീവ്/നെഗറ്റീവ് വാചകങ്ങളെ വിശകലനം ചെയ്യുക -ഈ ഉദാഹരണങ്ങൾ പൂർണ്ണ പാഠ്യപദ്ധതിയിൽ ചേർന്നതിന് മുമ്പായി എഐ ആശയങ്ങൾ മനസ്സിലാക്കാൻ സഹായിക്കുന്നു. +ഈ ഉദാഹരണങ്ങൾ മുഴുവൻ പാഠ്യক্রমത്തിൽ ഡൈവ് ചെയ്യുന്നതിന് മുൻപായി എ.ഐ. ആശയങ്ങൾ മനസ്സിലാക്കാൻ സഹായിക്കാൻ രൂപകൽപ്പന ചെയ്‌തതാണ്. -### 📚 പൂർണ്ണ പാഠ്യപദ്ധതി സജ്ജീകരണം +### 📚 പൂർണ പാഠ്യക്രമ ക്രമീകരണം -- sizin-വികസന പരിതസ്ഥിതി സജ്ജീകരിക്കാൻ ഞങ്ങൾ ഒരു [സജ്ജീകരണ പാഠം](./lessons/0-course-setup/setup.md) ഒരുക്കിയിട്ടുണ്ട്. -- അധ്യാപകർക്ക് വേണ്ടി, ഞങ്ങൾ ഒരു [പാഠ്യപദ്ധതി സജ്ജീകരണ പാഠം](./lessons/0-course-setup/for-teachers.md) ഒരുക്കിയിട്ടുണ്ട്! -- [VSCode അല്ലെങ്കിൽ Codespace-ൽ കോഡ് എങ്ങനെ നടത്താം](./lessons/0-course-setup/how-to-run.md) +- നിങ്ങളുടെ ഡെവലപ്പ്മെന്റ് പരിസരം ക്രമീകരിക്കാൻ സഹായിക്കുന്ന [സെറ്റ് അപ് പാഠം](./lessons/0-course-setup/setup.md) ഞങ്ങൾ ഒരുക്കി. - അധ്യാപകർക്ക് വേണ്ടിയും [പാഠ്യക്രമ ക്രമീകരണ പാഠം](./lessons/0-course-setup/for-teachers.md) ഒരുക്കിയിട്ടുണ്ട്! +- VSCode അല്ലെങ്കിൽ Codespace ൽ [കോഡിലേക്ക് പ്രവർത്തിപ്പിക്കുന്നത്](./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) ചേർന്നു കൂടെ ചർച്ച ചെയ്യുക. +ഈ പാഠ്യം പഠിക്കുന്ന മറ്റു വിദ്യാർത്ഥികളും പരിചയസമ്പന്നരായ ഡെവലപ്പർമാരുമാണ് ചേർന്ന് സംവദിക്കാൻ ഞങ്ങളുടെ [ഔദ്യോഗിക എ.ഐ. 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 Developer Forum](https://aka.ms/foundry/forum) സന്ദർശിക്കൂ. -## ക്വിസുകൾ +## Quiz-കൾ -> **ക്വിസുകളെ സംബന്ധിച്ച ഒരു കുറിപ്പ്**: എല്ലാ ക്വിസുകളും etc\quiz-app എന്ന ഫോൾഡറിലുള്ള Quiz-app ഫോൾഡറിൽ അടങ്ങിയിരിക്കുന്നു, അല്ലെങ്കിൽ [ഓൺലൈനിൽ ഇവിടെ](https://ff-quizzes.netlify.app/) ലഭ്യമാണ്. പാഠങ്ങളിൽ നിന്നുമുള്ള ലിങ്കുകൾ ഇവ സെർവറുകളിൽ പ്രവർത്തിപ്പിക്കാവുന്നതാണ്, അഥവാ ലോക്കലായി അല്ലെങ്കിൽ Azure-ലേക്ക് വിന്യസിച്ചുകൊള്ളാം; `quiz-app` ഫോൾഡറിലെ നിർദ്ദേശങ്ങൾ പിന്തുടരുക. ഇവ ക്രമംപ്രകാരം പ്രാദേശികമാക്കപ്പെട്ടുകൊണ്ടിരിക്കുന്നു. +> **Quiz-കൾക്കുറിച്ച് ഒരു കുറിപ്പ്**: എല്ലാ Quiz-കളും etc\quiz-app ഫോൾഡറിൽ Quiz-app-ൽ ഉൾപ്പെട്ടിരിക്കുന്നു, അല്ലെങ്കിൽ [ഓൺലൈൻ ഇവിടെ](https://ff-quizzes.netlify.app/) ലഭ്യമാണ്. അവ പാഠ്യങ്ങളിലുള്ള ലിങ്കുകളിലൂടെ കണക്ട് ചെയ്തിരിക്കുന്നു. Quiz അപ്ലിക്കേഷൻ ലൊക്കൽ ആയി അല്ലെങ്കിൽ Azure-ലേക്ക് ഡിപ്ലോയ് ചെയ്ത് ഓടിക്കാം; നിർദ്ദേശങ്ങൾ `quiz-app` ഫോൾഡറിൽ കാണാം. ഇവ ജൂറേഴ്സ് പ്രാദേശികവത്കരിക്കാൻ പ്രക്രിയയിലാണ്. -## സഹായം ആവശ്യമുണ്ട് +## സഹായം വേണം -നിങ്ങളുടെ സജ്ജീകരണത്തിൽ നിർദ്ദേശങ്ങൾ ഉണ്ടോ, അക്ഷരങ്ങളോ കോഡ് പിശകുകളോ കണ്ടെത്തിച്ചുണ്ടോ? ഒരു ഇഷ്യൂ ഉയർത്തുക അല്ലെങ്കിൽ ഒരു പുൾ റിക്വസ്റ്റ് സൃഷ്ടിക്കുക. +സൂചനകൾ ഉണ്ടോ അല്ലെങ്കിൽ വാക്യവിന്യാസം/കോഡ് പിശകുകൾ കണ്ടിട്ടുണ്ടോ? ഒരു വിഷയമുണ്ടാക്കാമോ അല്ലെങ്കിൽ പുൾ റിക്വസ്റ്റ് സൃഷ്ടിക്കാമോ. -## പ്രത്യേക നന്ദി +## പ്രത്യേക നന്ദി -* **✍️ പ്രധാന എഴുത്തുകാരൻ:** [Dmitry Soshnikov](http://soshnikov.com), PhD +* **✍️ പ്രധാന രചയിതാവ്:** [Dmitry Soshnikov](http://soshnikov.com), PhD * **🔥 എഡിറ്റർ:** [Jen Looper](https://twitter.com/jenlooper), PhD -* **🎨 സ്‌കെച്ച്നോട്ട് ചിത്രകാരി:** [Tomomi Imura](https://twitter.com/girlie_mac) -* **✅ ക്വിസ് സൃഷ്ടിക്കുന്നവർ:** [Lateefah Bello](https://github.com/CinnamonXI), [MLSA](https://studentambassadors.microsoft.com/) -* **🙏 മുഖ്യ സംഭാവകർ:** [Evgenii Pishchik](https://github.com/Pe4enIks) +* **🎨 സ്കെച്ച്നോട്ട് ചിത്രകാരി:** [Tomomi Imura](https://twitter.com/girlie_mac) +* **✅ Quiz സ്രഷ്ടാവ്:** [Lateefah Bello](https://github.com/CinnamonXI), [MLSA](https://studentambassadors.microsoft.com/) +* **🙏 മുഖ്യ സംഭാവകർ:** [Evgenii Pishchik](https://github.com/Pe4enIks) -## മറ്റ് പാഠ്യപദ്ധതികൾ +## മറ്റു പാഠ്യക്രമങ്ങൾ -ഞങ്ങളുടെ ടീം മറ്റു പാഠ്യപദ്ധതികളും നിർമ്മിക്കുന്നു! പരിശോധിക്കുക: +ഞങ്ങളുടെ ടീം മറ്റു പാഠ്യക്രമങ്ങൾ സൃഷ്ടിക്കുന്നു! പരിശോധിക്കൂ: -### LangChain -[![LangChain4j for Beginners](https://img.shields.io/badge/LangChain4j%20for%20Beginners-22C55E?style=for-the-badge&&labelColor=E5E7EB&color=0553D6)](https://aka.ms/langchain4j-for-beginners) -[![LangChain.js for Beginners](https://img.shields.io/badge/LangChain.js%20for%20Beginners-22C55E?style=for-the-badge&labelColor=E5E7EB&color=0553D6)](https://aka.ms/langchainjs-for-beginners?WT.mc_id=m365-94501-dwahlin) -[![LangChain for Beginners](https://img.shields.io/badge/LangChain%20for%20Beginners-22C55E?style=for-the-badge&labelColor=E5E7EB&color=0553D6)](https://github.com/microsoft/langchain-for-beginners?WT.mc_id=m365-94501-dwahlin) ---- +### LangChain +[![LangChain4j for Beginners](https://img.shields.io/badge/LangChain4j%20for%20Beginners-22C55E?style=for-the-badge&&labelColor=E5E7EB&color=0553D6)](https://aka.ms/langchain4j-for-beginners) +[![LangChain.js for Beginners](https://img.shields.io/badge/LangChain.js%20for%20Beginners-22C55E?style=for-the-badge&labelColor=E5E7EB&color=0553D6)](https://aka.ms/langchainjs-for-beginners?WT.mc_id=m365-94501-dwahlin) +[![LangChain for Beginners](https://img.shields.io/badge/LangChain%20for%20Beginners-22C55E?style=for-the-badge&labelColor=E5E7EB&color=0553D6)](https://github.com/microsoft/langchain-for-beginners?WT.mc_id=m365-94501-dwahlin) +--- -### Azure / Edge / MCP / Agents -[![AZD for Beginners](https://img.shields.io/badge/AZD%20for%20Beginners-0078D4?style=for-the-badge&labelColor=E5E7EB&color=0078D4)](https://github.com/microsoft/AZD-for-beginners?WT.mc_id=academic-105485-koreyst) -[![Edge AI for Beginners](https://img.shields.io/badge/Edge%20AI%20for%20Beginners-00B8E4?style=for-the-badge&labelColor=E5E7EB&color=00B8E4)](https://github.com/microsoft/edgeai-for-beginners?WT.mc_id=academic-105485-koreyst) -[![MCP for Beginners](https://img.shields.io/badge/MCP%20for%20Beginners-009688?style=for-the-badge&labelColor=E5E7EB&color=009688)](https://github.com/microsoft/mcp-for-beginners?WT.mc_id=academic-105485-koreyst) -[![AI Agents for Beginners](https://img.shields.io/badge/AI%20Agents%20for%20Beginners-00C49A?style=for-the-badge&labelColor=E5E7EB&color=00C49A)](https://github.com/microsoft/ai-agents-for-beginners?WT.mc_id=academic-105485-koreyst) +### Azure / Edge / MCP / Agents +[![AZD for Beginners](https://img.shields.io/badge/AZD%20for%20Beginners-0078D4?style=for-the-badge&labelColor=E5E7EB&color=0078D4)](https://github.com/microsoft/AZD-for-beginners?WT.mc_id=academic-105485-koreyst) +[![Edge AI for Beginners](https://img.shields.io/badge/Edge%20AI%20for%20Beginners-00B8E4?style=for-the-badge&labelColor=E5E7EB&color=00B8E4)](https://github.com/microsoft/edgeai-for-beginners?WT.mc_id=academic-105485-koreyst) +[![MCP for Beginners](https://img.shields.io/badge/MCP%20for%20Beginners-009688?style=for-the-badge&labelColor=E5E7EB&color=009688)](https://github.com/microsoft/mcp-for-beginners?WT.mc_id=academic-105485-koreyst) +[![AI Agents for Beginners](https://img.shields.io/badge/AI%20Agents%20for%20Beginners-00C49A?style=for-the-badge&labelColor=E5E7EB&color=00C49A)](https://github.com/microsoft/ai-agents-for-beginners?WT.mc_id=academic-105485-koreyst) ---- +--- -### Generative AI Series -[![Generative AI for Beginners](https://img.shields.io/badge/Generative%20AI%20for%20Beginners-8B5CF6?style=for-the-badge&labelColor=E5E7EB&color=8B5CF6)](https://github.com/microsoft/generative-ai-for-beginners?WT.mc_id=academic-105485-koreyst) -[![Generative AI (.NET)](https://img.shields.io/badge/Generative%20AI%20(.NET)-9333EA?style=for-the-badge&labelColor=E5E7EB&color=9333EA)](https://github.com/microsoft/Generative-AI-for-beginners-dotnet?WT.mc_id=academic-105485-koreyst) -[![Generative AI (Java)](https://img.shields.io/badge/Generative%20AI%20(Java)-C084FC?style=for-the-badge&labelColor=E5E7EB&color=C084FC)](https://github.com/microsoft/generative-ai-for-beginners-java?WT.mc_id=academic-105485-koreyst) -[![Generative AI (JavaScript)](https://img.shields.io/badge/Generative%20AI%20(JavaScript)-E879F9?style=for-the-badge&labelColor=E5E7EB&color=E879F9)](https://github.com/microsoft/generative-ai-with-javascript?WT.mc_id=academic-105485-koreyst) +### റെനറേറ്റീവ് എ.ഐ. സീരീസ് +[![Generative AI for Beginners](https://img.shields.io/badge/Generative%20AI%20for%20Beginners-8B5CF6?style=for-the-badge&labelColor=E5E7EB&color=8B5CF6)](https://github.com/microsoft/generative-ai-for-beginners?WT.mc_id=academic-105485-koreyst) +[![Generative AI (.NET)](https://img.shields.io/badge/Generative%20AI%20(.NET)-9333EA?style=for-the-badge&labelColor=E5E7EB&color=9333EA)](https://github.com/microsoft/Generative-AI-for-beginners-dotnet?WT.mc_id=academic-105485-koreyst) +[![Generative AI (Java)](https://img.shields.io/badge/Generative%20AI%20(Java)-C084FC?style=for-the-badge&labelColor=E5E7EB&color=C084FC)](https://github.com/microsoft/generative-ai-for-beginners-java?WT.mc_id=academic-105485-koreyst) +[![Generative AI (JavaScript)](https://img.shields.io/badge/Generative%20AI%20(JavaScript)-E879F9?style=for-the-badge&labelColor=E5E7EB&color=E879F9)](https://github.com/microsoft/generative-ai-with-javascript?WT.mc_id=academic-105485-koreyst) ---- +--- -### Core Learning -[![ML for Beginners](https://img.shields.io/badge/ML%20for%20Beginners-22C55E?style=for-the-badge&labelColor=E5E7EB&color=22C55E)](https://aka.ms/ml-beginners?WT.mc_id=academic-105485-koreyst) -[![Data Science for Beginners](https://img.shields.io/badge/Data%20Science%20for%20Beginners-84CC16?style=for-the-badge&labelColor=E5E7EB&color=84CC16)](https://aka.ms/datascience-beginners?WT.mc_id=academic-105485-koreyst) -[![AI for Beginners](https://img.shields.io/badge/AI%20for%20Beginners-A3E635?style=for-the-badge&labelColor=E5E7EB&color=A3E635)](https://aka.ms/ai-beginners?WT.mc_id=academic-105485-koreyst) -[![Cybersecurity for Beginners](https://img.shields.io/badge/Cybersecurity%20for%20Beginners-F97316?style=for-the-badge&labelColor=E5E7EB&color=F97316)](https://github.com/microsoft/Security-101?WT.mc_id=academic-96948-sayoung) -[![Web Dev for Beginners](https://img.shields.io/badge/Web%20Dev%20for%20Beginners-EC4899?style=for-the-badge&labelColor=E5E7EB&color=EC4899)](https://aka.ms/webdev-beginners?WT.mc_id=academic-105485-koreyst) -[![IoT for Beginners](https://img.shields.io/badge/IoT%20for%20Beginners-14B8A6?style=for-the-badge&labelColor=E5E7EB&color=14B8A6)](https://aka.ms/iot-beginners?WT.mc_id=academic-105485-koreyst) -[![XR Development for Beginners](https://img.shields.io/badge/XR%20Development%20for%20Beginners-38BDF8?style=for-the-badge&labelColor=E5E7EB&color=38BDF8)](https://github.com/microsoft/xr-development-for-beginners?WT.mc_id=academic-105485-koreyst) +### കോർ പഠനം +[![ML for Beginners](https://img.shields.io/badge/ML%20for%20Beginners-22C55E?style=for-the-badge&labelColor=E5E7EB&color=22C55E)](https://aka.ms/ml-beginners?WT.mc_id=academic-105485-koreyst) +[![Data Science for Beginners](https://img.shields.io/badge/Data%20Science%20for%20Beginners-84CC16?style=for-the-badge&labelColor=E5E7EB&color=84CC16)](https://aka.ms/datascience-beginners?WT.mc_id=academic-105485-koreyst) +[![AI for Beginners](https://img.shields.io/badge/AI%20for%20Beginners-A3E635?style=for-the-badge&labelColor=E5E7EB&color=A3E635)](https://aka.ms/ai-beginners?WT.mc_id=academic-105485-koreyst) +[![Cybersecurity for Beginners](https://img.shields.io/badge/Cybersecurity%20for%20Beginners-F97316?style=for-the-badge&labelColor=E5E7EB&color=F97316)](https://github.com/microsoft/Security-101?WT.mc_id=academic-96948-sayoung) +[![Web Dev for Beginners](https://img.shields.io/badge/Web%20Dev%20for%20Beginners-EC4899?style=for-the-badge&labelColor=E5E7EB&color=EC4899)](https://aka.ms/webdev-beginners?WT.mc_id=academic-105485-koreyst) +[![IoT for Beginners](https://img.shields.io/badge/IoT%20for%20Beginners-14B8A6?style=for-the-badge&labelColor=E5E7EB&color=14B8A6)](https://aka.ms/iot-beginners?WT.mc_id=academic-105485-koreyst) +[![XR Development for Beginners](https://img.shields.io/badge/XR%20Development%20for%20Beginners-38BDF8?style=for-the-badge&labelColor=E5E7EB&color=38BDF8)](https://github.com/microsoft/xr-development-for-beginners?WT.mc_id=academic-105485-koreyst) ---- +--- -### Copilot Series -[![Copilot for AI Paired Programming](https://img.shields.io/badge/Copilot%20for%20AI%20Paired%20Programming-FACC15?style=for-the-badge&labelColor=E5E7EB&color=FACC15)](https://aka.ms/GitHubCopilotAI?WT.mc_id=academic-105485-koreyst) -[![Copilot for C#/.NET](https://img.shields.io/badge/Copilot%20for%20C%23/.NET-FBBF24?style=for-the-badge&labelColor=E5E7EB&color=FBBF24)](https://github.com/microsoft/mastering-github-copilot-for-dotnet-csharp-developers?WT.mc_id=academic-105485-koreyst) -[![Copilot Adventure](https://img.shields.io/badge/Copilot%20Adventure-FDE68A?style=for-the-badge&labelColor=E5E7EB&color=FDE68A)](https://github.com/microsoft/CopilotAdventures?WT.mc_id=academic-105485-koreyst) - +### കോപിലോട്ട് സീരീസ് +[![Copilot for AI Paired Programming](https://img.shields.io/badge/Copilot%20for%20AI%20Paired%20Programming-FACC15?style=for-the-badge&labelColor=E5E7EB&color=FACC15)](https://aka.ms/GitHubCopilotAI?WT.mc_id=academic-105485-koreyst) +[![Copilot for C#/.NET](https://img.shields.io/badge/Copilot%20for%20C%23/.NET-FBBF24?style=for-the-badge&labelColor=E5E7EB&color=FBBF24)](https://github.com/microsoft/mastering-github-copilot-for-dotnet-csharp-developers?WT.mc_id=academic-105485-koreyst) +[![Copilot Adventure](https://img.shields.io/badge/Copilot%20Adventure-FDE68A?style=for-the-badge&labelColor=E5E7EB&color=FDE68A)](https://github.com/microsoft/CopilotAdventures?WT.mc_id=academic-105485-koreyst) + -## സഹായം ലഭിക്കുക +## സഹായം കിട്ടാൻ -എഐ ആപ്പുകൾ നിർമ്മിക്കുന്നതിനിടെ നിങ്ങൾക്ക് തടസ്സപ്പെടുകയോ ചോദ്യങ്ങളുണ്ടാകുകയോ ചെയ്താല്ലോ, MCP-ബিষയത്തിൽ അനുഭവം ഉള്ള മറ്റ് പഠിതാക്കളും ഡെവലപ്പർമാരുമായുള്ള ചർച്ചകളിൽ ചേർന്ന് സഹായം തേടാം. ചോദ്യങ്ങൾ സ്വാഗതാർഹമാണ്, അറിവ് സ്വതന്ത്രമായി പങ്കുവെക്കപ്പെടുന്ന ഒരു പിന്തുണാ സമൂഹമാണ് ഇത്. +നിങ്ങൾ തടസ്സപ്പെട്ടാൽ അല്ലെങ്കിൽ AI ആപ്പുകൾ നിർമ്മിക്കുന്നതുമായി ബന്ധപ്പെട്ട ചോദ്യങ്ങൾ ഉള്ളപ്പോൾ. MCP-ക്കുറിച്ചുള്ള ചർച്ചകളിൽ മറ്റ് പഠനക്കാരും പരിചയസമ്പന്നരായ ഡെവലപ്പർമാരും ചേർന്ന് ചർച്ച ചെയ്യൂ. ചോദ്യങ്ങൾ സ്വാഗതമാണ്, അറിവ് സ്വതന്ത്രമായി പങ്കിട്ടു കൂടും. -[![Microsoft Foundry Discord](https://dcbadge.limes.pink/api/server/nTYy5BXMWG)](https://discord.gg/nTYy5BXMWG) +[![Microsoft Foundry Discord](https://dcbadge.limes.pink/api/server/nTYy5BXMWG)](https://discord.gg/nTYy5BXMWG) -ബില്ഡിങ്ങിൽ ഉൽപ്പന്ന ഫീഡ്ബാക്ക് അല്ലെങ്കിൽ പിശകുകൾ ഉണ്ടെങ്കിൽ സന്ദർശിക്കുക: +നിങ്ങൾക്ക് ഉൽപ്പന്ന പ്രതികരണങ്ങൾ അല്ലെങ്കിൽ പ്രശ്നങ്ങൾ ഉണ്ടെങ്കിൽ സന്ദർശിക്കൂ: [![Microsoft Foundry Developer Forum](https://img.shields.io/badge/GitHub-Microsoft_Foundry_Developer_Forum-blue?style=for-the-badge&logo=github&color=000000&logoColor=fff)](https://aka.ms/foundry/forum) --- -**അസ്വീകാരം**: -ഈ രേഖ [Co-op Translator](https://github.com/Azure/co-op-translator) എന്ന AI വിവർത്തനസേവനം ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. കൃത്യതയ്ക്കായി努ചെയ്യുമ്പോഴും, സ്വയമേൽക്കപ്പെട്ട വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്നത് മനസിലാക്കുക. സാദ്ധ്യമായ ഏറ്റവും വിശ്വാസപ്രദമായ ഉറവിടം അതിന്റെ മാതൃഭാഷയിലുള്ള പ്രാഥമികരേഖ തന്നെയാണ്. നിർണ്ണായക വിവരങ്ങൾക്ക് പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനത്തിന്റെ ഉപയോഗത്തിലുണ്ടാകുന്ന ധാരാളം തെറ്റു വുമറകളും തെറ്റിദ്ധാരണകളും സംബന്ധിച്ച് ഞങ്ങളുടെ പക്ഷം ഉത്തരവാദിത്വം ഏറ്റെടുക്കുന്നില്ല. +**പരാമർശം**: +ഈ രേഖ AI പരിഭാഷ സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. ഞങ്ങൾ കൃത്യമായ നിപുണതയ്ക്ക് ശ്രമിക്കുന്നുവെങ്കിലും, ഓട്ടോമേറ്റഡ് പരിഭാഷകളിൽ പിശകുകളോ അപൂർണമതങ്ങളോ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ സ്വന്തം ഭാഷയിലുള്ള യഥാർത്ഥ രേഖ ഔദ്യോഗിക സ്രോതസ്സായി പരിഗണിക്കപ്പെടണം. നിർണ്ണായക വിവരങ്ങൾക്കായി പ്രൊഫഷണൽ മനുഷ്യ പരിഭാഷ ശിപാർശ ചെയ്‌തിരിക്കുന്നു. ഈ പരിഭാഷ ഉപയോഗിക്കുന്നതിൽ നിന്നു ഉണ്ടാകുന്നയാതൊരു തെറ്റിദ്ധാരണകൾക്കോ തെറ്റുപ്രത്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല. \ No newline at end of file