import%20marimo%0A%0A__generated_with%20%3D%20%220.16.0%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20pandas%20as%20pd%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20import%20seaborn%20as%20sns%0A%20%20%20%20import%20torch%0A%20%20%20%20from%20torchvision%20import%20models%2C%20transforms%0A%20%20%20%20from%20PIL%20import%20Image%0A%20%20%20%20return%20Image%2C%20mo%2C%20models%2C%20pd%2C%20torch%2C%20transforms%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%23%20Machine%20Learning%20Zoomcamp%0A%0A%20%20%20%20%23%23%20Module%208%3A%20**Deep%20Learning**%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(pd)%3A%0A%20%20%20%20repository_root%20%3D%20(%0A%20%20%20%20%20%20%20%20%22https%3A%2F%2Fgithub.com%2FDataTalksClub%2Fmachine-learning-zoomcamp%2Fblob%2Fmaster%2F%22%0A%20%20%20%20)%0A%0A%20%20%20%20chapters%20%3D%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22title%22%3A%20%22Fashion%20Classification%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22youtube_id%22%3A%20%22it1Lu7NmMpw%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22contents%22%3A%20repository_root%20%2B%20%2208-deep-learning%2F01-fashion-classification.md%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22title%22%3A%20%22TensorFlow%20and%20Keras%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22youtube_id%22%3A%20%22R6o_CUmoN9Q%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22contents%22%3A%20repository_root%20%2B%20%2208-deep-learning%2F02-tensorflow-keras.md%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22title%22%3A%20%22Pre-trained%20Convolutional%20Neural%20Networks%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22youtube_id%22%3A%20%22qGDXEz-cr6M%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22contents%22%3A%20repository_root%20%2B%20%2208-deep-learning%2F03-pretrained-models.md%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22title%22%3A%20%22Convolutional%20Neural%20Networks%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22youtube_id%22%3A%20%22BN-fnYzbdc8%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22contents%22%3A%20repository_root%20%2B%20%2208-deep-learning%2F04-conv-neural-nets.md%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22title%22%3A%20%22Transfer%20Learning%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22youtube_id%22%3A%20%22WKHylqfNmq4%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22contents%22%3A%20repository_root%20%2B%20%2208-deep-learning%2F05-transfer-learning.md%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22title%22%3A%20%22Adjusing%20the%20Learning%20Rate%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22youtube_id%22%3A%20%222gPmRRGz0Hc%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22contents%22%3A%20repository_root%20%2B%20%2208-deep-learning%2F06-learning-rate.md%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22title%22%3A%20%22Checkpointing%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22youtube_id%22%3A%20%22NRpGUx0o3Ps%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22contents%22%3A%20repository_root%20%2B%20%2208-deep-learning%2F07-checkpointing.md%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22title%22%3A%20%22Adding%20More%20Layers%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22youtube_id%22%3A%20%22bSRRrorvAZs%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22contents%22%3A%20repository_root%20%2B%20%2208-deep-learning%2F08-more-layers.md%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22title%22%3A%20%22Regularization%20and%20Dropout%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22youtube_id%22%3A%20%2274YmhVM6FTM%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22contents%22%3A%20repository_root%20%2B%20%2208-deep-learning%2F09-dropout.md%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22title%22%3A%20%22Data%20Augmentation%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22youtube_id%22%3A%20%22aoPfVsS3BDE%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22contents%22%3A%20repository_root%20%2B%20%2208-deep-learning%2F10-augmentation.md%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22title%22%3A%20%22Training%20a%20Larger%20Model%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22youtube_id%22%3A%20%22_QpDGJwFjYA%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22contents%22%3A%20repository_root%20%2B%20%2208-deep-learning%2F11-large-model.md%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22title%22%3A%20%22Using%20the%20Model%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22youtube_id%22%3A%20%22cM1WHKae1wo%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22contents%22%3A%20repository_root%20%2B%20%2208-deep-learning%2F12-using-model.md%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22title%22%3A%20%22Pytorch%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22youtube_id%22%3A%20%22Ne25VujHRLA%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22contents%22%3A%20repository_root%20%2B%20%2208-deep-learning%2Fpytorch%2FREADME.md%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22title%22%3A%20%22Summary%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22youtube_id%22%3A%20%22mn0BcXJlRFM%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22contents%22%3A%20repository_root%20%2B%20%2208-deep-learning%2F13-summary.md%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22title%22%3A%20%22Explore%20More%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22contents%22%3A%20repository_root%20%2B%20%2208-deep-learning%2F14-explore-more.md%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%0A%20%20%20%20chapters.insert(%0A%20%20%20%20%20%20%20%20loc%3D0%2C%0A%20%20%20%20%20%20%20%20column%3D%22snapshot%22%2C%0A%20%20%20%20%20%20%20%20value%3D%22https%3A%2F%2Fimg.youtube.com%2Fvi%2F%22%0A%20%20%20%20%20%20%20%20%2B%20chapters.youtube_id.astype(str)%0A%20%20%20%20%20%20%20%20%2B%20%22%2Fhqdefault.jpg%22%2C%0A%20%20%20%20)%0A%20%20%20%20chapters.insert(%0A%20%20%20%20%20%20%20%20loc%3D2%2C%0A%20%20%20%20%20%20%20%20column%3D%22youtube%22%2C%0A%20%20%20%20%20%20%20%20value%3D%22https%3A%2F%2Fyoutube.com%2Fwatch%3Fv%3D%22%20%2B%20chapters.youtube_id.astype(str)%2C%0A%20%20%20%20)%0A%0A%20%20%20%20videos%20%3D%20chapters%5Bchapters%5B%22youtube_id%22%5D.notnull()%5D%0A%20%20%20%20videos%5B%5B%22snapshot%22%2C%20%22title%22%2C%20%22youtube%22%5D%5D%0A%20%20%20%20return%20(chapters%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(chapters)%3A%0A%20%20%20%20contents%20%3D%20chapters%5Bchapters%5B%22contents%22%5D.notnull()%5D%0A%20%20%20%20contents%5B%5B%22title%22%2C%20%22contents%22%5D%5D%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%23%23%20Fashion%20Classification%0A%0A%20%20%20%20During%20this%20module%20we'll%20be%20working%20with%20a%20dataset%20that%20consists%20on%20a%20set%20of%20photos%20of%20clothes%2C%20and%20our%20goal%20will%20be%20to%20train%20a%20model%20that's%20capable%20of%20reading%20new%20images%20and%20determine%20based%20on%20the%20parameters%20that%20it%20learnt%20from%20those%20images%2C%20what%20type%20of%20clothing%20the%20new%20images%20are.%0A%0A%20%20%20%20%23%23%23%20Dataset%0A%0A%20%20%20%20%3E%20In%20this%20session%2C%20we'll%20be%20working%20on%20multiclass%20image%20classification%20with%20deep%20learning.%20Some%20deep%20learning%20frameworks%20like%20TensorFlow%20and%20Keras%20will%20be%20implemented%20on%20clothing%20dataset%20to%20classify%20images%20of%20clothes%20as%20t-shirts%2C%20hats%2C%20pants%2C%20etc.%0A%20%20%20%20%3E%20%0A%20%20%20%20%3E%20The%20dataset%20has%205000%20images%20of%2020%20different%20classes.%20However%2C%20we'll%20be%20using%20the%20subset%20which%20contains%2010%20of%20the%20most%20popular%20classes.%20The%20dataset%20can%20be%20downloaded%20from%20the%20above%20link.%0A%20%20%20%20%3E%20%0A%20%20%20%20%3E%20Source%3A%20%5B01-fashion-classification.md%5D(https%3A%2F%2Fgithub.com%2FDataTalksClub%2Fmachine-learning-zoomcamp%2Fblob%2Fmaster%2F08-deep-learning%2F01-fashion-classification.md).%0A%0A%20%20%20%20*%20The%20dataset%20is%20available%20in%20Github%3A%20%5Balexeygrigorev%2Fclothing-dataset-small%5D(https%3A%2F%2Fgithub.com%2Falexeygrigorev%2Fclothing-dataset-small.git).%0A%20%20%20%20*%20For%20convenience%2C%20the%20dataset%20has%20been%20cloned%20to%20the%20sibling%20%5Bdata%5D(modules-8%2Fdata%2F)%20folder.%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%23%23%20Pytorch%0A%0A%20%20%20%20*%20This%20module%20was%20initially%20recorded%20using%20Tensorflow%20but%20later%20rewriten%20using%20Pytorch.%20We'll%20follow%20here%20the%20updated%20%5BPytorch%5D(https%3A%2F%2Fgithub.com%2FDataTalksClub%2Fmachine-learning-zoomcamp%2Ftree%2Fmaster%2F08-deep-learning%2Fpytorch)%20version.%0A%20%20%20%20*%20The%20module%20is%20pretty%20practique.%20For%20a%20deep%20dive%20into%20the%20theory%20of%20convolutional%20networks%2C%20check%20the%20%5BCS231n%3A%20Deep%20Learning%20for%20Computer%20Vision%5D(https%3A%2F%2Fcs231n.stanford.edu)%20Standford%20course.%0A%0A%20%20%20%20%23%23%23%20First%20Look%20at%20the%20Dataset%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(Image%2C%20mo)%3A%0A%20%20%20%20mo.hstack(%5B%0A%20%20%20%20%20%20%20%20Image.open(%22.%2Fmodule-8%2Fdata%2Ftrain%2Fdress%2Fc968cba6-b6f6-4b59-820c-20535812609e.jpg%22)%2C%0A%20%20%20%20%20%20%20%20Image.open(%22.%2Fmodule-8%2Fdata%2Ftrain%2Fshirt%2Fbdaf259c-a7e1-4c45-a6ea-472ffe4116ad.jpg%22)%2C%0A%20%20%20%20%20%20%20%20Image.open(%22.%2Fmodule-8%2Fdata%2Ftrain%2Fshoes%2F530c78c5-4fda-4abe-9f01-8d329524ab4f.jpg%22)%2C%0A%20%20%20%20%20%20%20%20Image.open(%22.%2Fmodule-8%2Fdata%2Ftrain%2Flongsleeve%2Fc73492a1-b5cd-40f0-9ca1-ae72635c544f.jpg%22)%2C%0A%20%20%20%20%5D)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%23%23%23%20Pretrained%20Models%0A%0A%20%20%20%20A%20quick%20way%20to%20get%20a%20image%20classifier%20working%20model%20is%20to%20start%20with%20a%20pretrained%20one.%20Here%20we%20use%20%5BMobileNetV2%5D(https%3A%2F%2Fdocs.pytorch.org%2Fvision%2Fmain%2Fmodels%2Fmobilenetv2.html)%20from%20**torchvision**.%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(models)%3A%0A%20%20%20%20model%20%3D%20models.mobilenet_v2(weights%3D%22IMAGENET1K_V1%22)%0A%20%20%20%20model.eval()%0A%20%20%20%20return%20(model%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%23%23%23%23%20Image%20Preprocess%0A%0A%20%20%20%20The%20%5Bdocumentation%20of%20the%20model%5D(https%3A%2F%2Fdocs.pytorch.org%2Fvision%2Fmain%2Fmodels%2Fgenerated%2Ftorchvision.models.mobilenet_v2.html%23torchvision.models.mobilenet_v2)%20describes%20the%20preprocessing%20steps%20that%20are%20required%20for%20images%20to%20be%20understood%20by%20the%20model%3A%0A%0A%20%20%20%20The%20inference%20transforms%20are%20available%20at%20%60MobileNet_V2_Weights.IMAGENET1K_V2.transforms%60%20and%20perform%20the%20following%20preprocessing%20operations%3A%20Accepts%20%60PIL.Image%60%2C%20batched%20**(B%2C%20C%2C%20H%2C%20W)**%20and%20single%20**(C%2C%20H%2C%20W)**%20image%20%60torch.Tensor%60%20objects.%20The%20images%20are%20resized%20to%20%60resize_size%3D%5B232%5D%60%20using%20%60interpolation%3DInterpolationMode.BILINEAR%60%2C%20followed%20by%20a%20central%20crop%20of%20%60crop_size%3D%5B224%5D%60.%20Finally%20the%20values%20are%20first%20rescaled%20to%20%60%5B0.0%2C%201.0%5D%60%20and%20then%20normalized%20using%20%60mean%3D%5B0.485%2C%200.456%2C%200.406%5D%60%20and%20%60std%3D%5B0.229%2C%200.224%2C%200.225%5D%60.%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(Image%2C%20transforms)%3A%0A%20%20%20%20preprocess%20%3D%20transforms.Compose(%5B%0A%20%20%20%20%20%20%20%20transforms.Resize(256)%2C%0A%20%20%20%20%20%20%20%20transforms.CenterCrop(224)%2C%0A%20%20%20%20%20%20%20%20transforms.ToTensor()%2C%0A%20%20%20%20%20%20%20%20transforms.Normalize(mean%3D%5B0.485%2C%200.456%2C%200.406%5D%2C%20std%3D%5B0.229%2C%200.224%2C%200.225%5D)%0A%20%20%20%20%5D)%0A%0A%20%20%20%20single_image%20%3D%20Image.open(%22.%2Fmodule-8%2Fdata%2Ftrain%2Fshoes%2F530c78c5-4fda-4abe-9f01-8d329524ab4f.jpg%22)%0A%0A%20%20%20%20x%20%3D%20preprocess(single_image)%0A%20%20%20%20x%0A%20%20%20%20return%20single_image%2C%20x%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%23%23%23%20Predictions%0A%0A%20%20%20%20After%20preprocessing%2C%20we%20can%20use%20the%20model%20to%20make%20predictions.%20The%20output%20vector%20will%20contain%20logits%20corresponding%20to%20each%20of%20the%201%2C000%20categories%20that%20the%20model%20can%20recognize.%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(model%2C%20torch%2C%20x)%3A%0A%20%20%20%20def%20single_predict(x%3A%20torch.tensor)%20-%3E%20torch.tensor%3A%0A%20%20%20%20%20%20%20%20batch_t%20%3D%20torch.unsqueeze(x%2C%200)%0A%0A%20%20%20%20%20%20%20%20with%20torch.no_grad()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20output%20%3D%20model(batch_t)%0A%0A%20%20%20%20%20%20%20%20return%20output%0A%0A%20%20%20%20single_prediction%20%3D%20single_predict(x)%0A%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%22prediction%22%3A%20single_prediction%2C%0A%20%20%20%20%20%20%20%20%22shape%22%3A%20single_prediction.shape%2C%0A%20%20%20%20%7D%0A%20%20%20%20return%20(single_prediction%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22We%20can%20now%20get%20the%20list%20of%20identifiers%20of%20each%20of%20the%20classes%20ordering%20them%20so%20that%20the%20most%20likely%20classes%20are%20shown%20first%3A%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo%2C%20single_image%2C%20single_prediction%2C%20torch)%3A%0A%20%20%20%20_%2C%20indices%20%3D%20torch.sort(single_prediction%2C%20descending%3DTrue)%0A%0A%20%20%20%20with%20open(%22module-8%2Fdata%2Fimagenet_classes.txt%22%2C%20%22r%22)%20as%20f%3A%0A%20%20%20%20%20%20%20%20imagenet_classes%20%3D%20f.read().split(%22%5Cn%22)%0A%0A%20%20%20%20mo.hstack(%5B%0A%20%20%20%20%20%20%20%20%5Bimagenet_classes%5Bindex%5D%20for%20index%20in%20indices%5B0%5D%5D%5B%3A%205%5D%2C%0A%20%20%20%20%20%20%20%20single_image%2C%0A%20%20%20%20%5D)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%23%23%20Transfer%20Learning%0A%0A%20%20%20%20With%20transfer%20learning%20we%20can%20take%20a%20pretrained%20model%20and%20adapt%20it%20to%20our%20specific%20needs.%0A%0A%20%20%20%20%23%23%23%20Create%20a%20Dataset%20Handler%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(Image)%3A%0A%20%20%20%20import%20os%0A%20%20%20%20from%20torch.utils.data%20import%20Dataset%0A%0A%20%20%20%20class%20ClothingDataset(Dataset)%3A%0A%20%20%20%20%20%20%20%20def%20__init__(self%2C%20data_dir%2C%20transform%3DNone)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.data_dir%20%3D%20data_dir%0A%20%20%20%20%20%20%20%20%20%20%20%20self.transform%20%3D%20transform%0A%20%20%20%20%20%20%20%20%20%20%20%20self.image_paths%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20self.labels%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20self.classes%20%3D%20sorted(os.listdir(data_dir))%0A%20%20%20%20%20%20%20%20%20%20%20%20self.class_to_idx%20%3D%20%7Bcls%3A%20i%20for%20i%2C%20cls%20in%20enumerate(self.classes)%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20label_name%20in%20self.classes%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20label_dir%20%3D%20os.path.join(data_dir%2C%20label_name)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20img_name%20in%20os.listdir(label_dir)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.image_paths.append(os.path.join(label_dir%2C%20img_name))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.labels.append(self.class_to_idx%5Blabel_name%5D)%0A%0A%20%20%20%20%20%20%20%20def%20__len__(self)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20len(self.image_paths)%0A%0A%20%20%20%20%20%20%20%20def%20__getitem__(self%2C%20idx)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20img_path%20%3D%20self.image_paths%5Bidx%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20image%20%3D%20Image.open(img_path).convert('RGB')%0A%20%20%20%20%20%20%20%20%20%20%20%20label%20%3D%20self.labels%5Bidx%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20self.transform%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20image%20%3D%20self.transform(image)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20image%2C%20label%0A%20%20%20%20return%20ClothingDataset%2C%20os%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%23%23%23%20Define%20our%20Transformations%0A%0A%20%20%20%20We%20already%20showed%20the%20transformations%20that%20the%20model%20expects.%20We'll%20now%20create%20a%20function%20that%20prepares%20those%20transformations%20so%20that%20we%20can%20reuse%20them.%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(transforms)%3A%0A%20%20%20%20def%20get_transforms()%3A%0A%20%20%20%20%20%20%20%20input_size%20%3D%20224%0A%20%20%20%20%20%20%20%20mean%20%3D%20%5B0.485%2C%200.456%2C%200.406%5D%0A%20%20%20%20%20%20%20%20std%20%3D%20%5B0.229%2C%200.224%2C%200.225%5D%0A%0A%20%20%20%20%20%20%20%20return%20transforms.Compose(%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20transforms.Resize((input_size%2C%20input_size))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20transforms.ToTensor()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20transforms.Normalize(mean%3Dmean%2C%20std%3Dstd)%0A%20%20%20%20%20%20%20%20%5D)%0A%20%20%20%20return%20(get_transforms%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%23%20Define%20the%20Dataloaders%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(ClothingDataset%2C%20get_transforms)%3A%0A%20%20%20%20from%20torch.utils.data%20import%20DataLoader%0A%0A%20%20%20%20def%20get_dataloader(split%3A%20str%2C%20batch_size%3A%20int%20%3D%2032%2C%20shuffle%3A%20bool%20%3D%20True)%20-%3E%20DataLoader%3A%0A%20%20%20%20%20%20%20%20dataset%20%3D%20ClothingDataset(%0A%20%20%20%20%20%20%20%20%20%20%20%20data_dir%3Df%22.%2Fmodule-8%2Fdata%2F%7Bsplit%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20transform%3Dget_transforms()%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20return%20DataLoader(dataset%2C%20batch_size%20%3D%20batch_size%2C%20shuffle%20%3D%20shuffle)%0A%0A%20%20%20%20train_loader%20%3D%20get_dataloader(%22train%22%2C%20batch_size%3D32%2C%20shuffle%3DTrue)%0A%20%20%20%20val_loader%20%3D%20get_dataloader(%22validation%22%2C%20batch_size%3D32%2C%20shuffle%3DFalse)%0A%20%20%20%20return%20train_loader%2C%20val_loader%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%20Create%20our%20First%20Model%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(models%2C%20torch)%3A%0A%20%20%20%20import%20torch.nn%20as%20nn%0A%0A%20%20%20%20class%20ClothingClassifierMobileNet(nn.Module)%3A%0A%20%20%20%20%20%20%20%20def%20__init__(self%2C%20num_classes%3D10)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20super().__init__()%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Add%20the%20original%20model%20(frozen)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.base_model%20%3D%20models.mobilenet_v2(weights%3D'IMAGENET1K_V1')%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20param%20in%20self.base_model.parameters()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20param.requires_grad%20%3D%20False%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Remove%20original%20classifier%0A%20%20%20%20%20%20%20%20%20%20%20%20self.base_model.classifier%20%3D%20nn.Identity()%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Add%20custom%20layers%0A%20%20%20%20%20%20%20%20%20%20%20%20self.global_avg_pooling%20%3D%20nn.AdaptiveAvgPool2d((1%2C%201))%0A%20%20%20%20%20%20%20%20%20%20%20%20self.output_layer%20%3D%20nn.Linear(1280%2C%20num_classes)%0A%0A%20%20%20%20%20%20%20%20def%20forward(self%2C%20x)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20x%20%3D%20self.base_model.features(x)%0A%20%20%20%20%20%20%20%20%20%20%20%20x%20%3D%20self.global_avg_pooling(x)%0A%20%20%20%20%20%20%20%20%20%20%20%20x%20%3D%20torch.flatten(x%2C%201)%0A%20%20%20%20%20%20%20%20%20%20%20%20x%20%3D%20self.output_layer(x)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20x%0A%20%20%20%20return%20ClothingClassifierMobileNet%2C%20nn%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%23%20Train%20the%20model%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(nn%2C%20torch%2C%20train_loader%2C%20val_loader)%3A%0A%20%20%20%20import%20torch.optim%20as%20optim%0A%0A%20%20%20%20def%20get_device()%20-%3E%20str%3A%0A%20%20%20%20%20%20%20%20return%20torch.device(%22cuda%22%20if%20torch.cuda.is_available()%20else%20%22cpu%22)%0A%0A%20%20%20%20def%20train(%0A%20%20%20%20%20%20%20%20model%3A%20nn.Module%2C%0A%20%20%20%20%20%20%20%20optimizer%3A%20optim.Adam%2C%0A%20%20%20%20%20%20%20%20criterion%3A%20nn.CrossEntropyLoss%2C%0A%20%20%20%20%20%20%20%20checkpoint_filename%3A%20str%2C%0A%20%20%20%20%20%20%20%20num_epochs%3A%20int%20%3D%2010%2C%0A%20%20%20%20)%3A%0A%20%20%20%20%20%20%20%20best_val_accuracy%20%3D%200.0%0A%0A%20%20%20%20%20%20%20%20for%20epoch%20in%20range(num_epochs)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22Epoch%20%7Bepoch%2B1%7D%20%2F%20%7Bnum_epochs%7D%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20model.train()%0A%20%20%20%20%20%20%20%20%20%20%20%20running_loss%20%3D%200.0%0A%20%20%20%20%20%20%20%20%20%20%20%20correct%20%3D%200%0A%20%20%20%20%20%20%20%20%20%20%20%20total%20%3D%200%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20inputs%2C%20labels%20in%20train_loader%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inputs%2C%20labels%20%3D%20inputs.to(get_device())%2C%20labels.to(get_device())%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20optimizer.zero_grad()%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20outputs%20%3D%20model(inputs)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20loss%20%3D%20criterion(outputs%2C%20labels)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20loss.backward()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20optimizer.step()%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20running_loss%20%2B%3D%20loss.item()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20_%2C%20predicted%20%3D%20torch.max(outputs.data%2C%201)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20total%20%2B%3D%20labels.size(0)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20correct%20%2B%3D%20(predicted%20%3D%3D%20labels).sum().item()%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20train_loss%20%3D%20running_loss%20%2F%20len(train_loader)%0A%20%20%20%20%20%20%20%20%20%20%20%20train_acc%20%3D%20correct%20%2F%20total%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%20%20Train%20Loss%3A%20%7Btrain_loss%3A.4f%7D%2C%20Train%20Acc%3A%20%7Btrain_acc%3A.4f%7D%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20val_acc%20%3D%20evaluate(model%2C%20criterion)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20val_acc%20%3E%20best_val_accuracy%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20best_val_accuracy%20%3D%20val_acc%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20torch.save(model.state_dict()%2C%20checkpoint_filename)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%20%20Checkpoint%20saved%3A%20%7Bcheckpoint_filename%7D%22)%0A%0A%20%20%20%20def%20evaluate(%0A%20%20%20%20%20%20%20%20model%3A%20nn.Module%2C%0A%20%20%20%20%20%20%20%20criterion%3A%20nn.CrossEntropyLoss%0A%20%20%20%20)%20-%3E%20float%3A%0A%20%20%20%20%20%20%20%20model.eval()%0A%20%20%20%20%20%20%20%20val_loss%20%3D%200.0%0A%20%20%20%20%20%20%20%20val_correct%20%3D%200%0A%20%20%20%20%20%20%20%20val_total%20%3D%200%0A%0A%20%20%20%20%20%20%20%20with%20torch.no_grad()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20inputs%2C%20labels%20in%20val_loader%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inputs%2C%20labels%20%3D%20inputs.to(get_device())%2C%20labels.to(get_device())%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20outputs%20%3D%20model(inputs)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20loss%20%3D%20criterion(outputs%2C%20labels)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20val_loss%20%2B%3D%20loss.item()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20_%2C%20predicted%20%3D%20torch.max(outputs.data%2C%201)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20val_total%20%2B%3D%20labels.size(0)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20val_correct%20%2B%3D%20(predicted%20%3D%3D%20labels).sum().item()%0A%0A%20%20%20%20%20%20%20%20val_loss%20%2F%3D%20len(val_loader)%0A%20%20%20%20%20%20%20%20val_acc%20%3D%20val_correct%20%2F%20val_total%0A%20%20%20%20%20%20%20%20print(f%22%20%20Val%20Loss%3A%20%7Bval_loss%3A.4f%7D%2C%20Val%20Acc%3A%20%7Bval_acc%3A.4f%7D%22)%0A%0A%20%20%20%20%20%20%20%20return%20val_acc%0A%20%20%20%20return%20evaluate%2C%20get_device%2C%20optim%2C%20train%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20ClothingClassifierMobileNet%2C%0A%20%20%20%20evaluate%2C%0A%20%20%20%20get_device%2C%0A%20%20%20%20nn%2C%0A%20%20%20%20optim%2C%0A%20%20%20%20torch%2C%0A%20%20%20%20train%2C%0A)%3A%0A%20%20%20%20from%20pathlib%20import%20Path%0A%0A%20%20%20%20mobilenet_weights_filename%20%3D%20%22.%2Fmodule-8%2Fdata%2Fmobilenet-model.torch%22%0A%0A%20%20%20%20def%20get_mobilenet_classifier(learning_rate%3A%20float%20%3D%200.01)%20-%3E%20tuple%5Bnn.Module%2C%20optim.Adam%2C%20nn.CrossEntropyLoss%5D%3A%0A%20%20%20%20%20%20%20%20device%20%3D%20get_device()%0A%0A%20%20%20%20%20%20%20%20model%20%3D%20ClothingClassifierMobileNet(num_classes%3D10)%0A%20%20%20%20%20%20%20%20model.to(device)%0A%0A%20%20%20%20%20%20%20%20optimizer%20%3D%20optim.Adam(model.parameters()%2C%20lr%3Dlearning_rate)%0A%20%20%20%20%20%20%20%20criterion%20%3D%20nn.CrossEntropyLoss()%0A%0A%20%20%20%20%20%20%20%20return%20model%2C%20optimizer%2C%20criterion%0A%0A%20%20%20%20def%20train_mobilenet_model()%3A%0A%20%20%20%20%20%20%20%20print(%22The%20model%20weights%20were%20not%20found%2C%20so%20the%20model%20will%20be%20trained%22)%0A%20%20%20%20%20%20%20%20model%2C%20optimizer%2C%20criterion%20%3D%20get_mobilenet_classifier()%0A%20%20%20%20%20%20%20%20model%20%3D%20train(model%2C%20optimizer%2C%20criterion%2C%20checkpoint_filename%20%3D%20mobilenet_weights_filename%2C%20num_epochs%20%3D%2010)%0A%0A%20%20%20%20def%20evaluate_mobilenet_model()%3A%0A%20%20%20%20%20%20%20%20print(%22The%20model%20weights%20were%20found%2C%20so%20the%20model%20weights%20will%20be%20loaded%20and%20the%20model%20will%20be%20evaluated%22)%0A%20%20%20%20%20%20%20%20model%2C%20optimizer%2C%20criterion%20%3D%20get_mobilenet_classifier()%0A%20%20%20%20%20%20%20%20model.load_state_dict(torch.load(mobilenet_weights_filename%2C%20weights_only%3DTrue))%0A%20%20%20%20%20%20%20%20evaluate(model%2C%20criterion)%0A%0A%20%20%20%20if%20not%20Path(mobilenet_weights_filename).exists()%3A%0A%20%20%20%20%20%20%20%20train_mobilenet_model()%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20evaluate_mobilenet_model()%0A%20%20%20%20return%20Path%2C%20mobilenet_weights_filename%2C%20train_mobilenet_model%0A%0A%0A%40app.cell%0Adef%20_(Path%2C%20mo%2C%20mobilenet_weights_filename%2C%20os%2C%20train_mobilenet_model)%3A%0A%20%20%20%20def%20delete_file(filename%3A%20str)%3A%0A%20%20%20%20%20%20%20%20if%20Path(filename).exists()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20os.remove(filename)%0A%0A%20%20%20%20def%20delete_mobilenet_weights()%3A%0A%20%20%20%20%20%20%20%20delete_file(mobilenet_weights_filename)%0A%20%20%20%20%20%20%20%20train_mobilenet_model()%0A%0A%20%20%20%20mo.ui.button(%0A%20%20%20%20%20%20%20%20label%3D%22Remove%20MobileNet%20weights%20and%20retrain%22%2C%0A%20%20%20%20%20%20%20%20kind%3D%22danger%22%2C%0A%20%20%20%20%20%20%20%20on_click%3Dlambda%20v%3A%20delete_mobilenet_weights()%2C%0A%20%20%20%20)%0A%20%20%20%20return%20delete_file%2C%20delete_mobilenet_weights%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%23%23%20Add%20an%20Inner%20Layer%0A%0A%20%20%20%20We'll%20not%20improve%20the%20model%20by%20adding%20an%20inner%20layer.%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(models%2C%20nn%2C%20torch)%3A%0A%20%20%20%20class%20UpgradedClothingClassifierMobileNet(nn.Module)%3A%0A%20%20%20%20%20%20%20%20def%20__init__(self%2C%20size_inner%3A%20int%20%3D%20100%2C%20num_classes%3A%20int%20%3D%2010)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20super().__init__()%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Add%20the%20original%20model%20(frozen)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.base_model%20%3D%20models.mobilenet_v2(weights%3D'IMAGENET1K_V1')%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20param%20in%20self.base_model.parameters()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20param.requires_grad%20%3D%20False%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Remove%20original%20classifier%0A%20%20%20%20%20%20%20%20%20%20%20%20self.base_model.classifier%20%3D%20nn.Identity()%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Add%20custom%20layers%0A%20%20%20%20%20%20%20%20%20%20%20%20self.global_avg_pooling%20%3D%20nn.AdaptiveAvgPool2d((1%2C%201))%0A%20%20%20%20%20%20%20%20%20%20%20%20self.inner%20%3D%20nn.Linear(1280%2C%20size_inner)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.relu%20%3D%20nn.ReLU()%0A%20%20%20%20%20%20%20%20%20%20%20%20self.output_layer%20%3D%20nn.Linear(size_inner%2C%20num_classes)%0A%0A%20%20%20%20%20%20%20%20def%20forward(self%2C%20x)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20x%20%3D%20self.base_model.features(x)%0A%20%20%20%20%20%20%20%20%20%20%20%20x%20%3D%20self.global_avg_pooling(x)%0A%20%20%20%20%20%20%20%20%20%20%20%20x%20%3D%20torch.flatten(x%2C%201)%0A%20%20%20%20%20%20%20%20%20%20%20%20x%20%3D%20self.inner(x)%0A%20%20%20%20%20%20%20%20%20%20%20%20x%20%3D%20self.relu(x)%0A%20%20%20%20%20%20%20%20%20%20%20%20x%20%3D%20self.output_layer(x)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20x%0A%20%20%20%20return%20(UpgradedClothingClassifierMobileNet%2C)%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20Path%2C%0A%20%20%20%20UpgradedClothingClassifierMobileNet%2C%0A%20%20%20%20evaluate%2C%0A%20%20%20%20get_device%2C%0A%20%20%20%20nn%2C%0A%20%20%20%20optim%2C%0A%20%20%20%20torch%2C%0A%20%20%20%20train%2C%0A)%3A%0A%20%20%20%20improved_mobilenet_weights_filename%20%3D%20%22.%2Fmodule-8%2Fdata%2Fimproved_mobilenet-model.torch%22%0A%0A%20%20%20%20def%20get_improved_mobilenet_classifier(learning_rate%3A%20float%20%3D%200.01)%20-%3E%20tuple%5Bnn.Module%2C%20optim.Adam%2C%20nn.CrossEntropyLoss%5D%3A%0A%20%20%20%20%20%20%20%20device%20%3D%20get_device()%0A%0A%20%20%20%20%20%20%20%20model%20%3D%20UpgradedClothingClassifierMobileNet(num_classes%3D10)%0A%20%20%20%20%20%20%20%20model.to(device)%0A%0A%20%20%20%20%20%20%20%20optimizer%20%3D%20optim.Adam(model.parameters()%2C%20lr%3Dlearning_rate)%0A%20%20%20%20%20%20%20%20criterion%20%3D%20nn.CrossEntropyLoss()%0A%0A%20%20%20%20%20%20%20%20return%20model%2C%20optimizer%2C%20criterion%0A%0A%20%20%20%20def%20train_improved_mobilenet_model()%3A%0A%20%20%20%20%20%20%20%20print(%22The%20model%20weights%20were%20not%20found%2C%20so%20the%20model%20will%20be%20trained%22)%0A%20%20%20%20%20%20%20%20model%2C%20optimizer%2C%20criterion%20%3D%20get_improved_mobilenet_classifier()%0A%20%20%20%20%20%20%20%20model%20%3D%20train(model%2C%20optimizer%2C%20criterion%2C%20checkpoint_filename%20%3D%20improved_mobilenet_weights_filename%2C%20num_epochs%20%3D%2010)%0A%0A%20%20%20%20def%20evaluate_improved_mobilenet_model()%3A%0A%20%20%20%20%20%20%20%20print(%22The%20model%20weights%20were%20found%2C%20so%20the%20model%20weights%20will%20be%20loaded%20and%20the%20model%20will%20be%20evaluated%22)%0A%20%20%20%20%20%20%20%20model%2C%20optimizer%2C%20criterion%20%3D%20get_improved_mobilenet_classifier()%0A%20%20%20%20%20%20%20%20model.load_state_dict(torch.load(improved_mobilenet_weights_filename%2C%20weights_only%3DTrue))%0A%20%20%20%20%20%20%20%20evaluate(model%2C%20criterion)%0A%0A%20%20%20%20if%20not%20Path(improved_mobilenet_weights_filename).exists()%3A%0A%20%20%20%20%20%20%20%20train_improved_mobilenet_model()%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20evaluate_improved_mobilenet_model()%0A%20%20%20%20return%20improved_mobilenet_weights_filename%2C%20train_improved_mobilenet_model%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20delete_file%2C%0A%20%20%20%20delete_mobilenet_weights%2C%0A%20%20%20%20improved_mobilenet_weights_filename%2C%0A%20%20%20%20mo%2C%0A%20%20%20%20train_improved_mobilenet_model%2C%0A)%3A%0A%20%20%20%20def%20delete_improved_mobilenet_weights()%3A%0A%20%20%20%20%20%20%20%20delete_file(improved_mobilenet_weights_filename)%0A%20%20%20%20%20%20%20%20train_improved_mobilenet_model()%0A%0A%20%20%20%20mo.ui.button(%0A%20%20%20%20%20%20%20%20label%3D%22Remove%20the%20improved%20MobileNet%20weights%20and%20retrain%22%2C%0A%20%20%20%20%20%20%20%20kind%3D%22danger%22%2C%0A%20%20%20%20%20%20%20%20on_click%3Dlambda%20v%3A%20delete_mobilenet_weights()%2C%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%23%23%20Add%20a%20Dropout%20Layer%0A%0A%20%20%20%20We'll%20now%20add%20a%20dropout%20layer.%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(models%2C%20nn%2C%20torch)%3A%0A%20%20%20%20class%20ClothingClassifierDropoutMobileNet(nn.Module)%3A%0A%20%20%20%20%20%20%20%20def%20__init__(self%2C%20size_inner%3D100%2C%20droprate%3D0.2%2C%20num_classes%3D10)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20super().__init__()%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.base_model%20%3D%20models.mobilenet_v2(weights%3D'IMAGENET1K_V1')%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20param%20in%20self.base_model.parameters()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20param.requires_grad%20%3D%20False%0A%20%20%20%20%20%20%20%20%20%20%20%20self.base_model.classifier%20%3D%20nn.Identity()%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.global_avg_pooling%20%3D%20nn.AdaptiveAvgPool2d((1%2C%201))%0A%20%20%20%20%20%20%20%20%20%20%20%20self.inner%20%3D%20nn.Linear(1280%2C%20size_inner)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.relu%20%3D%20nn.ReLU()%0A%20%20%20%20%20%20%20%20%20%20%20%20self.dropout%20%3D%20nn.Dropout(droprate)%20%20%23%20Add%20dropout%0A%20%20%20%20%20%20%20%20%20%20%20%20self.output_layer%20%3D%20nn.Linear(size_inner%2C%20num_classes)%0A%0A%20%20%20%20%20%20%20%20def%20forward(self%2C%20x)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20x%20%3D%20self.base_model.features(x)%0A%20%20%20%20%20%20%20%20%20%20%20%20x%20%3D%20self.global_avg_pooling(x)%0A%20%20%20%20%20%20%20%20%20%20%20%20x%20%3D%20torch.flatten(x%2C%201)%0A%20%20%20%20%20%20%20%20%20%20%20%20x%20%3D%20self.inner(x)%0A%20%20%20%20%20%20%20%20%20%20%20%20x%20%3D%20self.relu(x)%0A%20%20%20%20%20%20%20%20%20%20%20%20x%20%3D%20self.dropout(x)%0A%20%20%20%20%20%20%20%20%20%20%20%20x%20%3D%20self.output_layer(x)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20x%0A%20%20%20%20return%20(ClothingClassifierDropoutMobileNet%2C)%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20ClothingClassifierDropoutMobileNet%2C%0A%20%20%20%20Path%2C%0A%20%20%20%20evaluate%2C%0A%20%20%20%20get_device%2C%0A%20%20%20%20nn%2C%0A%20%20%20%20optim%2C%0A%20%20%20%20torch%2C%0A%20%20%20%20train%2C%0A)%3A%0A%20%20%20%20dropout_mobilenet_weights_filename%20%3D%20%22.%2Fmodule-8%2Fdata%2Fdropout_mobilenet-model.torch%22%0A%0A%20%20%20%20def%20get_dropout_mobilenet_classifier(learning_rate%3A%20float%20%3D%200.01)%20-%3E%20tuple%5Bnn.Module%2C%20optim.Adam%2C%20nn.CrossEntropyLoss%5D%3A%0A%20%20%20%20%20%20%20%20device%20%3D%20get_device()%0A%0A%20%20%20%20%20%20%20%20model%20%3D%20ClothingClassifierDropoutMobileNet(num_classes%3D10)%0A%20%20%20%20%20%20%20%20model.to(device)%0A%0A%20%20%20%20%20%20%20%20optimizer%20%3D%20optim.Adam(model.parameters()%2C%20lr%3Dlearning_rate)%0A%20%20%20%20%20%20%20%20criterion%20%3D%20nn.CrossEntropyLoss()%0A%0A%20%20%20%20%20%20%20%20return%20model%2C%20optimizer%2C%20criterion%0A%0A%20%20%20%20def%20train_dropout_mobilenet_model()%3A%0A%20%20%20%20%20%20%20%20print(%22The%20model%20weights%20were%20not%20found%2C%20so%20the%20model%20will%20be%20trained%22)%0A%20%20%20%20%20%20%20%20model%2C%20optimizer%2C%20criterion%20%3D%20get_dropout_mobilenet_classifier()%0A%20%20%20%20%20%20%20%20model%20%3D%20train(model%2C%20optimizer%2C%20criterion%2C%20checkpoint_filename%20%3D%20dropout_mobilenet_weights_filename%2C%20num_epochs%20%3D%2025)%0A%0A%20%20%20%20def%20evaluate_dropout_mobilenet_model()%3A%0A%20%20%20%20%20%20%20%20print(%22The%20model%20weights%20were%20found%2C%20so%20the%20model%20weights%20will%20be%20loaded%20and%20the%20model%20will%20be%20evaluated%22)%0A%20%20%20%20%20%20%20%20model%2C%20optimizer%2C%20criterion%20%3D%20get_dropout_mobilenet_classifier()%0A%20%20%20%20%20%20%20%20model.load_state_dict(torch.load(dropout_mobilenet_weights_filename%2C%20weights_only%3DTrue))%0A%20%20%20%20%20%20%20%20evaluate(model%2C%20criterion)%0A%0A%20%20%20%20if%20not%20Path(dropout_mobilenet_weights_filename).exists()%3A%0A%20%20%20%20%20%20%20%20train_dropout_mobilenet_model()%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20evaluate_dropout_mobilenet_model()%0A%20%20%20%20return%20dropout_mobilenet_weights_filename%2C%20train_dropout_mobilenet_model%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20delete_file%2C%0A%20%20%20%20dropout_mobilenet_weights_filename%2C%0A%20%20%20%20mo%2C%0A%20%20%20%20train_dropout_mobilenet_model%2C%0A)%3A%0A%20%20%20%20def%20delete_dropout_mobilenet_weights()%3A%0A%20%20%20%20%20%20%20%20delete_file(dropout_mobilenet_weights_filename)%0A%20%20%20%20%20%20%20%20train_dropout_mobilenet_model()%0A%0A%20%20%20%20mo.ui.button(%0A%20%20%20%20%20%20%20%20label%3D%22Remove%20the%20dropout%20MobileNet%20weights%20and%20retrain%22%2C%0A%20%20%20%20%20%20%20%20kind%3D%22danger%22%2C%0A%20%20%20%20%20%20%20%20on_click%3Dlambda%20v%3A%20delete_dropout_mobilenet_weights()%2C%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
88600ed1661fe2929b0a0ba58d182e68112cf942953dd10ba62bbb8938b165cc