{"metadata":{"kernelspec":{"display_name":"Python ML","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.9"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":21154,"databundleVersionId":1243559,"sourceType":"competition"}],"dockerImageVersionId":30747,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"try: import fastkaggle\nexcept ModuleNotFoundError:\n    !pip install -Uq fastkaggle\n\ntry: import timm\nexcept ModuleNotFoundError:\n    !pip install -Uq \"timm>=0.6.2.dev0\"\n\ntry: import tensorflow\nexcept ModuleNotFoundError:\n    !pip install -Uq tensorflow\n\ntry: import torcheval\nexcept ModuleNotFoundError:\n    !pip install -Uq torcheval","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from fastkaggle import *","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# for working with paths in Python, I recommend using `pathlib.Path`\nfrom pathlib import Path\n\ncred_path = Path('~/.kaggle/kaggle.json').expanduser()\nif not iskaggle and not cred_path.exists():\n    raise Exception('Need to download kaggle credentials')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"comp = 'tpu-getting-started'\n\npath = setup_comp(comp, install='fastai tensorflow \"timm>=0.6.2.dev0\"')\nclasses = [\"pink primrose\",\"hard-leaved pocket orchid\",\"canterbury bells\",\"sweet pea\",\"wild geranium\",\"tiger lily\",\"moon orchid\",\"bird of paradise\",\"monkshood\",\"globe thistle\",\"snapdragon\",\"colt's foot\",\"king protea\",\"spear thistle\",\"yellow iris\",\"globe-flower\",\"purple coneflower\",\"peruvian lily\",\"balloon flower\",\"giant white arum lily\",\"fire lily\",\"pincushion flower\",\"fritillary\",\"red ginger\",\"grape hyacinth\",\"corn poppy\",\"prince of wales feathers\",\"stemless gentian\",\"artichoke\",\"sweet william\",\"carnation\",\"garden phlox\",\"love in the mist\",\"cosmos\",\"alpine sea holly\",\"ruby-lipped cattleya\",\"cape flower\",\"great masterwort\",\"siam tulip\",\"lenten rose\",\"barberton daisy\",\"daffodil\",\"sword lily\",\"poinsettia\",\"bolero deep blue\",\"wallflower\",\"marigold\",\"buttercup\",\"daisy\",\"common dandelion\",\"petunia\",\"wild pansy\",\"primula\",\"sunflower\",\"lilac hibiscus\",\"bishop of llandaff\",\"gaura\",\"geranium\",\"orange dahlia\",\"pink-yellow dahlia\",\"cautleya spicata\",\"japanese anemone\",\"black-eyed susan\",\"silverbush\",\"californian poppy\",\"osteospermum\",\"spring crocus\",\"iris\",\"windflower\",\"tree poppy\",\"gazania\",\"azalea\",\"water lily\",\"rose\",\"thorn apple\",\"morning glory\",\"passion flower\",\"lotus\",\"toad lily\",\"anthurium\",\"frangipani\",\"clematis\",\"hibiscus\",\"columbine\",\"desert-rose\",\"tree mallow\",\"magnolia\",\"cyclamen \",\"watercress\",\"canna lily\",\"hippeastrum \",\"bee balm\",\"pink quill\",\"foxglove\",\"bougainvillea\",\"camellia\",\"mallow\",\"mexican petunia\",\"bromelia\",\"blanket flower\",\"trumpet creeper\",\"blackberry lily\",\"common tulip\",\"wild rose\"]","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"path","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import timm\nimport functools\nimport itertools\nfrom fastai.vision.all import *\n\npath.ls()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_paths = list(filter(lambda x: str(x) != \"tpu-getting-started/sample_submission.csv\", path.ls()))\ndata_paths = [path/'tfrecords-jpeg-224x224']\ndata_paths = functools.reduce(lambda acc, path: list(itertools.chain(acc, (path/'train').ls(), (path/'val').ls())), data_paths, [])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf\n\n# https://www.tensorflow.org/tutorials/load_data/tfrecord#reading_a_tfrecord_file_in_python\ndef load_tfrecs(data_paths, is_test=False):\n    data = []\n    raw_dataset = tf.data.TFRecordDataset(data_paths)\n    \n    for record in raw_dataset:\n        example = tf.train.Example()\n        example.ParseFromString(record.numpy())\n        datum = [\n            None if is_test else example.features.feature['class'].int64_list.value[0],\n            example.features.feature['image'].bytes_list.value[0],\n            example.features.feature['id'].bytes_list.value[0],\n        ]\n        data.append(datum)\n        \n    return data\n\ndata = load_tfrecs(data_paths)\n    \nlen(data)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img = PILImage.create(data[0][1])\nprint(img.size)\nimg.to_thumb(128)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from fastcore.parallel import *\n\ndef f(o): return PILImage.create(o[1]).size\nsizes = parallel(f, data, n_workers=8)\npd.Series(sizes).value_counts()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_items(data, *args, **kwargs): return data\n\nget_x = lambda entry: PILImage.create(io.BytesIO(entry[1]))\nget_y = lambda entry: entry[0]\n\nblock = DataBlock(blocks=(ImageBlock, CategoryBlock), \n                  get_items=get_items,\n                  get_x=get_x,\n                  get_y=get_y,\n                  splitter=IndexSplitter(range(12753, len(data))),\n                  item_tfms=[Resize(192, method='squish')],\n                  batch_tfms=[*aug_transforms(size=128, min_scale=0.75)])\n\ndls = block.dataloaders(data, bs=64)\ndls.show_batch(max_n=6)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from torcheval.metrics.functional import multiclass_f1_score\n\nlearn = vision_learner(dls, 'convnext_small_in22k', metrics=multiclass_f1_score, path='.').to_fp16()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"learn.lr_find(suggest_funcs=(valley, slide))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"learn.fine_tune(5, 0.001)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_submission = pd.read_csv(path/'sample_submission.csv')\nsample_submission","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# torch.save(learn.model.state_dict(), '01.pth')\n# from google.colab import files\n# files.download('model_state_dict.pth')\n# learn = vision_learner(dls, 'convnext_small_in22k', metrics=multiclass_f1_score, path='.').to_fp16()\n# learn.model.load_state_dict(torch.load('01.pth'))\n\n# learn = vision_learner(dls, 'convnext_small_in22k', metrics=multiclass_f1_score, path='.').to_fp16()\n# learn.model.load_state_dict(torch.load('01.pth', map_location=torch.device('cpu')))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_paths = [(path/'tfrecords-jpeg-224x224/test').ls()]\ntest_data = load_tfrecs(test_paths, is_test=True)\nlen(test_data)\ntest_dataloader = dls.test_dl(test_data)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_dataloader.show_batch(max_n=6)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"output = learn.get_preds(dl=test_dataloader, with_decoded=True)\nprobs,_,idxs = output","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"idxs","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"learn.dls.vocab","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"vocab = np.array(learn.dls.vocab)\nresults = pd.Series(vocab[idxs], name=\"label\")\nresults","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ids = pd.Series([datum[2].decode('utf-8') for datum in test_data], name=\"id\")\nids","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission = pd.DataFrame({'id': ids, 'label': results})\nsubmission.to_csv('submission.csv', header=True, index=False)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!head submission.csv","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# if not iskaggle:\n#    from kaggle import api\n#    api.competition_submit_cli('submission.csv', 'petals-to-the-metal-01', comp)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if not iskaggle:\n    push_notebook('alexchalk', 'petals-to-the-metal-submission-01',\n                  title='Petals to the Metal Submission 01',\n                  file='01.ipynb',\n                  competition=comp, private=True, gpu=False)","metadata":{},"execution_count":null,"outputs":[]}]}