{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"<img src=\"https://i.imgur.com/gb6B4ig.png\" width=\"400\" alt=\"Weights & Biases\" />\n\n# Что такое W&B?\n\nWeights & Biases (W&B) - это набор инструментов машинного обучения, который поможет вам быстрее создавать лучшие модели.\n\nЯ буду использовать этот конкурс, основанный на знаниях ([Патология растений 2021 - FGVC8](https://www.kaggle.com/c/plant-pathology-2021-fgvc8)), чтобы продемонстрировать некоторые из его функций: **панель инструментов** (отслеживание экспериментов) и **артефакты** (управление версиями наборов данных и моделей).\n\n\n## Чем полезен W&B?\n\n**Соревнования Kaggle требуют быстрой разработки и оценки моделей**. Компонентов много: изучение данных обучения, обучение различных моделей, объединение обученных моделей в различных комбинациях (ансамбль) и т. Д.\n\n> ⏳  Множество компонентов = много мест, где можно пойти не так = много времени, потраченного на отладку.\n\nВы можете упустить важные детали и вам придется переобучать свою модель, или вы можете тренироваться на неправильных данных (утечка информации). Или вы можете использовать неправильную модель для создания представления.\n\nВот где появляется W&B:\n* **Панель управления (отслеживание экспериментов)**: регистрируйте и визуализируйте эксперименты в режиме реального времени = храните данные и результаты в одном удобном месте. Считайте это хранилищем экспериментов.\n* **Артефакты** (набор данных + управление версиями моделей): хранить и обновлять наборы данных, модели и результаты = точно знать, на каких данных обучается модель.","metadata":{}},{"cell_type":"markdown","source":"# 🖥 Панель управления (отслеживание экспериментов)\n\nИспользуйте панель мониторинга как центральное место для систематизации и визуализации результатов моделей машинного обучения.\n\n* Отслеживайте показатели\n* Визуализируйте результаты\n* Тренируйтесь где угодно\n* Оставайтесь организованными\n\n> 🙌 **Сохраните все в одном месте и никогда больше не потеряйте свой прогресс** 🙌\n\n## Отслеживайте показатели\n\nОтслеживайте работу модели в режиме реального времени и сразу же выявляйте проблемные области.\n\n## Визуализируйте результаты\n\nW&B поддерживает большое количество типов мультимедиа - визуализируйте графики, изображения, видео, аудио, 3D-объекты и многое [другое](https://docs.wandb.ai/guides/track/log#logging-objects).\n\nКроме того, панель управления **интерактивна** - наведите указатель мыши на дополнительные параметры и информацию.\n\n![Imgur](https://i.imgur.com/xW4cOSx.gif)\n\n## Тренируйтесь где угодно\n\nПанель управления W&B является **централизованной** - независимо от того, тренируетесь ли вы на локальном компьютере, в лабораторном кластере или на спотовых экземплярах в облаке, все ваши результаты регистрируются в одном месте.\n\n![centralized dashboard](https://i.imgur.com/BGgfZj3.png)\n\n## Оставайтесь организованными\n\nW&B записывает данные в мощные таблицы с возможностью очереди, в которых вы можете искать, фильтровать, сортировать и группировать. Это позволяет легко сравнивать тысячи различных моделей и находить наиболее эффективную модель для различных задач.\n\n![image.png](https://i.imgur.com/qPlykIn.png)\n\n# 🗂 Артефакты (управление версиями набора данных)\n\nИспользуйте артефакты W&B для отслеживания и создания версий ваших наборов данных, моделей, зависимостей и результатов в конвейерах машинного обучения.\n\nДумайте об артефакте как о папке данных с версией. После того, как вы сохранили что-то как артефакт, все изменения автоматически регистрируются, что дает вам полную историю изменений.\n\n> 🙌 **Следите, какая модель была обучена на каких данных** 🙌\n\n\n### Управляйте своим конвейером / Отслеживайте происхождение данных\n\nВы сможете увидеть весь рабочий процесс машинного обучения с высоты птичьего полета. Сотрудничать с товарищами по команде проще с таким целостным взглядом на ваш конвейер.\n\n![img](https://i.imgur.com/dhntZxK.png)\n\n# ⚡️ TL;DR\n\nWeights & Biase помогает **быстрее создавать лучшие модели**.\n\n* Визуализируйте результаты в реальном времени на интерактивной централизованной панели инструментов\n* Определите, как изменение данных влияет на результирующую модель\n\nКроме того, W&B работает быстро ([начните с 6 строк кода](https://docs.wandb.ai/quickstart)) и гибко ([интегрировано со всеми основными фреймворками машинного обучения](https://docs.wandb.ai/guides/integrations)).\n\nВот краткое (1:42) вступление:\n\n[![thumbnail](https://i.imgur.com/oriwd9L.png)](https://www.youtube.com/watch?v=EIgoKitLUqM&t=92s)\n","metadata":{}},{"cell_type":"markdown","source":"# 🧰 1. Настроить W&B\n\nW&B очень легко настроить и интегрировать.","metadata":{}},{"cell_type":"markdown","source":"## 🔵 1a. Установить `wandb`\n\n`wandb` (библиотека W&B), встроена в ваши Kaggle kernels \n\nОднако, поскольку `wandb` быстро улучшается, я рекомендую установить последнюю версию `pip install`-ing с помощью флагов `--upgrade` и `-q`.","metadata":{}},{"cell_type":"code","source":"!pip install --upgrade -q wandb","metadata":{"execution":{"iopub.status.busy":"2021-06-09T19:06:47.556781Z","iopub.execute_input":"2021-06-09T19:06:47.557164Z","iopub.status.idle":"2021-06-09T19:06:58.356826Z","shell.execute_reply.started":"2021-06-09T19:06:47.557085Z","shell.execute_reply":"2021-06-09T19:06:58.355761Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 🔵 1b. Импортируйте wandb и войдите в систему\n\nВам понадобится уникальный ключ API для входа в Weights & Biases.\n\n1. Если у вас нет учетной записи Weights & Biases, вы можете перейти на https://wandb.ai/site и создать БЕСПЛАТНУЮ учетную запись.\n2. Получите доступ к своему ключу API: https://wandb.ai/authorize.\n\nВы можете войти в систему с помощью ядра Kaggle двумя способами:\n\n1. Запустите cell с помощью `wandb.login ()`. Он запросит ключ API, который вы можете скопировать + вставить.\n2. Вы также можете использовать секреты Kaggle для хранения ключа API и использовать приведенный ниже фрагмент кода для входа в систему. Прочтите это [обсуждение](https://www.kaggle.com/product-feedback/114053), чтобы узнать больше о секретах Kaggle.\n\n```\nfrom kaggle_secrets import UserSecretsClient\n\nuser_secrets = UserSecretsClient()\n\n# I have saved my API token with \"wandb_api\" as Label. \n# If you use some other Label make sure to change the same below. \nwandb_api = user_secrets.get_secret(\"wandb_api\") \n\nwandb.login(key=wandb_api)\n```\nПодробнее о входе в W&B [здесь](https://docs.wandb.ai/ref/cli/wandb-login).","metadata":{}},{"cell_type":"code","source":"import wandb\nfrom wandb.keras import WandbCallback\n\nwandb.login()","metadata":{"execution":{"iopub.status.busy":"2021-06-09T19:07:01.546407Z","iopub.execute_input":"2021-06-09T19:07:01.546741Z","iopub.status.idle":"2021-06-09T19:07:17.486597Z","shell.execute_reply.started":"2021-06-09T19:07:01.546709Z","shell.execute_reply":"2021-06-09T19:07:17.485724Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"> 📌 `WandbCallback` - это легкий обратный вызов (callback) Keras, который я буду использовать позже.","metadata":{}},{"cell_type":"code","source":"# 1. Import other dependencies\n\nimport tensorflow as tf\nprint(tf.__version__)\nfrom tensorflow.keras import layers\nfrom tensorflow.keras import models\nimport tensorflow_addons as tfa\n\nimport os\nimport json\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\n%matplotlib inline\n\nfrom sklearn.model_selection import train_test_split","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-06-09T19:07:19.448915Z","iopub.execute_input":"2021-06-09T19:07:19.449261Z","iopub.status.idle":"2021-06-09T19:07:20.223923Z","shell.execute_reply.started":"2021-06-09T19:07:19.449213Z","shell.execute_reply":"2021-06-09T19:07:20.223094Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 2. Set the random seeds\n\ndef seed_everything():\n    os.environ['TF_CUDNN_DETERMINISTIC'] = '1' \n    np.random.seed(hash(\"improves reproducibility\") % 2**32 - 1)\n    tf.random.set_seed(hash(\"by removing stochasticity\") % 2**32 - 1)\n    \nseed_everything()","metadata":{"execution":{"iopub.status.busy":"2021-06-09T19:07:21.385474Z","iopub.execute_input":"2021-06-09T19:07:21.385805Z","iopub.status.idle":"2021-06-09T19:07:21.390664Z","shell.execute_reply.started":"2021-06-09T19:07:21.385775Z","shell.execute_reply":"2021-06-09T19:07:21.389725Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 3. Set hyperparameters\n\nTRAIN_PATH = '../input/resized-plant2021/img_sz_256/'\nAUTOTUNE = tf.data.experimental.AUTOTUNE\n\nCONFIG = dict (\n    num_labels = 6,\n    train_val_split = 0.2,\n    img_width = 224,\n    img_height = 224,\n    batch_size = 64,\n    epochs = 10,\n    learning_rate = 0.001,\n    architecture = \"CNN\",\n    infra = \"Kaggle\",\n    competition = 'plant-pathology',\n    _wandb_kernel = 'ayut'\n)","metadata":{"execution":{"iopub.status.busy":"2021-06-09T19:07:22.884931Z","iopub.execute_input":"2021-06-09T19:07:22.885278Z","iopub.status.idle":"2021-06-09T19:07:22.891468Z","shell.execute_reply.started":"2021-06-09T19:07:22.885223Z","shell.execute_reply":"2021-06-09T19:07:22.890360Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"> 📌: Сохраните свои гиперпараметры в виде словаря, потому что позже вы можете напрямую зарегистрировать этот конфигурационный файл в W&B.","metadata":{}},{"cell_type":"markdown","source":"# 🔨 2. Построить входной конвейер\n\nПосле импорта `wandb` и других зависимостей вы можете настроить конвейер ввода как обычно. Конкурс «Патология растений-2021» посвящен многоблочной классификации.\n\n> The main objective of the competition is to develop machine learning-based models to accurately classify a given leaf image from the test dataset to a particular disease category, and to identify an individual disease from multiple disease symptoms on a single leaf image. Основная цель конкурса - разработать модели на основе машинного обучения для точной классификации данного изображения листа из тестового набора данных в конкретную категорию заболевания и для идентификации отдельного заболевания по множественным симптомам заболевания на одном изображении листа.\n.\n\nTo build the input pipeline I have used `tf.data` API. ","metadata":{}},{"cell_type":"code","source":"# 4. Build input pipeline\n\n# Encode competition-provided labels \nlabel_to_id = {\n    'healthy': 0,\n    'scab': 1,\n    'frog_eye_leaf_spot': 2,\n    'rust': 3,\n    'complex': 4,\n    'powdery_mildew': 5\n}\n\nid_to_label = {value:key for key, value in label_to_id.items()} \n\n# Helper fu\ndef make_path(row):\n    return TRAIN_PATH+row.image\n\ndef parse_labels(row):\n    label_list = row.labels.split()\n    labels = []\n    for label in label_list:\n        labels.append(str(label_to_id[label]))\n    \n    return ' '.join(labels)\n\n# Read train.csv file\ndf = pd.read_csv('../input/plant-pathology-2021-fgvc8/train.csv')\n# Get absolute path\ndf['image'] = df.apply(lambda row: make_path(row), axis=1)\n# Parse labels\ndf['labels'] = df.apply(lambda row: parse_labels(row), axis=1)\n\n# Look at the dataframe\ndf.head()","metadata":{"execution":{"iopub.status.busy":"2021-06-09T19:07:25.569057Z","iopub.execute_input":"2021-06-09T19:07:25.569425Z","iopub.status.idle":"2021-06-09T19:07:26.145164Z","shell.execute_reply.started":"2021-06-09T19:07:25.569393Z","shell.execute_reply":"2021-06-09T19:07:26.144224Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 5. Training and validation split\n\ntrain_df, valid_df = train_test_split(df, test_size=CONFIG['train_val_split'])\nprint(f'Number of train images: {len(train_df)} and validation images: {len(valid_df)}')","metadata":{"execution":{"iopub.status.busy":"2021-06-09T19:07:28.071873Z","iopub.execute_input":"2021-06-09T19:07:28.072206Z","iopub.status.idle":"2021-06-09T19:07:28.082358Z","shell.execute_reply.started":"2021-06-09T19:07:28.072174Z","shell.execute_reply":"2021-06-09T19:07:28.081032Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 6. Helper functions for input pipeline\n\n@tf.function\ndef decode_image(image):\n    # Convert the compressed string to a 3D uint8 tensor\n    image = tf.image.decode_jpeg(image, channels=3)\n    \n    # Normalize image\n    image = tf.image.convert_image_dtype(image, dtype=tf.float32)\n    \n    # Resize the image to the desired size\n    return image\n\n@tf.function\ndef load_image(df_dict):\n    # Load image\n    image = tf.io.read_file(df_dict['image'])\n    image = decode_image(image)\n    \n    # Resize image\n    image = tf.image.resize(image, (CONFIG['img_height'], CONFIG['img_width']))\n    \n    # Parse label\n    label = tf.strings.split(df_dict['labels'], sep='')\n    label = tf.strings.to_number(label, out_type=tf.int32)\n    label = tf.reduce_sum(tf.one_hot(indices=label, depth=CONFIG['num_labels']), axis=0)\n    \n    return image, label","metadata":{"execution":{"iopub.status.busy":"2021-06-09T19:07:29.831779Z","iopub.execute_input":"2021-06-09T19:07:29.832123Z","iopub.status.idle":"2021-06-09T19:07:29.840544Z","shell.execute_reply.started":"2021-06-09T19:07:29.832091Z","shell.execute_reply":"2021-06-09T19:07:29.839607Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 7. Build data loaders\n\nAUTOTUNE = tf.data.AUTOTUNE\n\ntrainloader = tf.data.Dataset.from_tensor_slices(dict(train_df))\nvalidloader = tf.data.Dataset.from_tensor_slices(dict(valid_df))\n\ntrainloader = (\n    trainloader\n    .shuffle(1024)\n    .map(load_image, num_parallel_calls=AUTOTUNE)\n    .batch(CONFIG['batch_size'])\n    .prefetch(AUTOTUNE)\n)\n\nvalidloader = (\n    validloader\n    .map(load_image, num_parallel_calls=AUTOTUNE)\n    .batch(CONFIG['batch_size'])\n    .prefetch(AUTOTUNE)\n)","metadata":{"execution":{"iopub.status.busy":"2021-06-09T19:07:32.644674Z","iopub.execute_input":"2021-06-09T19:07:32.645009Z","iopub.status.idle":"2021-06-09T19:07:34.771491Z","shell.execute_reply.started":"2021-06-09T19:07:32.644979Z","shell.execute_reply":"2021-06-09T19:07:34.770614Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Data loader sanity check\n\ndef show_batch(image_batch, label_batch):\n    plt.figure(figsize=(20,20))\n    for n in range(25):\n        ax = plt.subplot(5,5,n+1)\n        plt.imshow(image_batch[n])\n        plt.title(' '.join([id_to_label[i] for i, label in enumerate(label_batch[n].numpy()) if label==1.]))\n        plt.axis('off')\n\nimage_batch, label_batch = next(iter(trainloader))\nshow_batch(image_batch, label_batch)","metadata":{"execution":{"iopub.status.busy":"2021-06-09T19:07:34.774787Z","iopub.execute_input":"2021-06-09T19:07:34.775078Z","iopub.status.idle":"2021-06-09T19:07:37.767795Z","shell.execute_reply.started":"2021-06-09T19:07:34.775051Z","shell.execute_reply":"2021-06-09T19:07:37.766806Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 🔨 3. Настройте вашу модель\n\nЗатем создайте определение вашей модели. Поскольку это задача классификации с несколькими метками, активация вывода является`sigmoid`.","metadata":{}},{"cell_type":"code","source":"# 8. Define model: EfficientNetB0 trained on ImageNet as backbone\n\ndef get_model():\n    base_model = tf.keras.applications.EfficientNetB0(include_top=False, weights='imagenet')\n    base_model.trainabe = True\n\n    inputs = layers.Input((CONFIG['img_height'], CONFIG['img_width'], 3))\n    x = base_model(inputs, training=True)\n    x = layers.GlobalAveragePooling2D()(x)\n    x = layers.Dropout(0.5)(x)\n    outputs = layers.Dense(len(label_to_id), activation='sigmoid')(x)\n    \n    return models.Model(inputs, outputs)\n\n# Model sanity check\ntf.keras.backend.clear_session()\nmodel = get_model()\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2021-06-09T19:07:41.075175Z","iopub.execute_input":"2021-06-09T19:07:41.075565Z","iopub.status.idle":"2021-06-09T19:07:43.887891Z","shell.execute_reply.started":"2021-06-09T19:07:41.075533Z","shell.execute_reply":"2021-06-09T19:07:43.886806Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":" ","metadata":{}},{"cell_type":"markdown","source":"# 🚄 3. Тренируйтесь и оценивайте с W&B\n\nВ этом разделе я буду использовать:\n* [`wandb.init()`](https://docs.wandb.ai/guides/track/launch): инициализировать новый запуск.\n\n* [`wandb.finish()`](https://docs.wandb.ai/ref/python/finish):  завершить и закрыть пробег.\n\n* [`wandb.config`](https://docs.wandb.ai/guides/track/config): объект, в котором хранятся гиперпараметры и настройки, связанные с запуском.\n\n\nRun (или [объект wandb.Run](https://docs.wandb.ai/ref/python/run)) - это единица вычисления W&B, обычно это эксперимент машинного обучения.","metadata":{}},{"cell_type":"code","source":"# Initialize model\ntf.keras.backend.clear_session()\nmodel = get_model()\n\n# Compile model\noptimizer = tf.keras.optimizers.Adam(learning_rate=CONFIG['learning_rate'])\nmodel.compile(optimizer, \n              loss=tfa.losses.SigmoidFocalCrossEntropy(), \n              metrics=[tf.keras.metrics.AUC(multi_label=True), tfa.metrics.F1Score(num_classes=6, average='micro')])","metadata":{"execution":{"iopub.status.busy":"2021-06-09T19:07:49.234571Z","iopub.execute_input":"2021-06-09T19:07:49.234919Z","iopub.status.idle":"2021-06-09T19:07:51.770179Z","shell.execute_reply.started":"2021-06-09T19:07:49.234888Z","shell.execute_reply":"2021-06-09T19:07:51.768950Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 🔵 3. Используйте `wandb.init ()` для инициализации нового прогона W&B.\n\nВ pipline машинного обучения вы можете добавить `wandb.init ()` в начало вашего обучающего сценария, а также сценарий оценки, и каждая часть будет отслеживаться как запуск в W&B.\n\nОбратите внимание на эти аргументы.\n\n* `entity`: Сущность - это имя пользователя или название команды, в которую вы отправляете запуски.\n* `project`: Имя проекта, в который вы отправляете новый запуск. Если проект не указан, запуск помещается в проект «Без категории».\n* `config`: Устанавливает wandb.config, объект, подобный словарю, для сохранения входных данных для вашего задания, таких как гиперпараметры для модели или настройки для задания предварительной обработки данных.\n* `group`: Укажите группу для организации отдельных запусков более крупного эксперимента. Это очень удобная функция. Например, вы можете создать группу для разных имен архитектуры модели.\n* `job_type`: Укажите тип прогона, который полезен, когда вы группируете прогоны вместе в более крупные эксперименты с помощью группы. Типичные виды работ: «traib», «evaluate» и.т.д","metadata":{}},{"cell_type":"code","source":"# Update CONFIG dict with the name of the model.\nCONFIG['model_name'] = 'efficientnetb0'\nprint('Training configuration: ', CONFIG)\n\n# Initialize W&B run\nrun = wandb.init(project='plant-pathology', \n                 config=CONFIG,\n                 group='EfficientNet', \n                 job_type='train')","metadata":{"execution":{"iopub.status.busy":"2021-06-09T19:07:55.812095Z","iopub.execute_input":"2021-06-09T19:07:55.812466Z","iopub.status.idle":"2021-06-09T19:08:02.048692Z","shell.execute_reply.started":"2021-06-09T19:07:55.812432Z","shell.execute_reply":"2021-06-09T19:08:02.047680Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Я использовал эти аргументы `wandb.init ()`:\n\n* `project`: этот аргумент указывает имя проекта W&B, в который отправляется запуск. Здесь я создаю новый проект под названием «`plant-pathology`» и одновременно отправляю туда run.\n\n* `config`: этот аргумент устанавливает `wandb.config`, объект, подобный словарю, в котором хранятся гиперпараметры, параметры ввода и другие независимые переменные.\n\n\n    Напоминаем, что в настоящее время в `CONFIG` находится следующее:\n\n```python\nCONFIG = dict (\n    num_labels = 6,\n    train_val_split = 0.2,\n    img_width = 224,\n    img_height = 224,\n    batch_size = 64,\n    epochs = 10,\n    learning_rate = 0.001,\n    architecture = \"CNN\",\n    infra = \"Kaggle\",\n    model_name = \"efficientnetb0\"\n)\n```\n\n* `group`: этот аргумент указывает значение для группировки отдельных прогонов. Позже у меня будет прогон, который группируется по «`EfficientNet`», чтобы мне было легче сравнивать прогоны из разных архитектур.\n* `job_type`: этот аргумент указывает тип выполнения, например, «`train`» или «`evaluate`». Установка типа run упрощает последующую фильтрацию и группирование run, например, если вы хотите сравнить несколько «`train`» run-ов.","metadata":{}},{"cell_type":"markdown","source":"## 🔵 3b.Обновите wandb.config` \n\nСохранение конфигурации тренировки полезно для анализа ваших экспериментов и воспроизведения вашей работы позже. С помощью W&B вы также можете группировать по значениям конфигурации, что означает, что вы можете сравнивать настройки разных run-ов и видеть, как они влияют на результат.\n\nЕсть несколько способов настроить `wandb.config`:\n\n* Задайте `wandb.config` с аргументом `wandb.init (config)`, как указано выше в (3a).\nУстановите wandb.config напрямую.\n\n* Установите `wandb.config` напрямую.\n* См. Дополнительные параметры настройки в этом [Colab](https://colab.research.google.com/github/wandb/examples/blob/master/colabs/wandb-log/Configs_in_W%26B.ipynb#scrollTo=xFf3zjBSixC1).","metadata":{}},{"cell_type":"code","source":"# Add \"type\" and \"kaggle_competition\" to `wandb.config` directly\nwandb.config.type = 'baseline'\nwandb.config.kaggle_competition = 'Plant Pathology 2021 - FGVC8'","metadata":{"execution":{"iopub.status.busy":"2021-06-09T19:08:06.304092Z","iopub.execute_input":"2021-06-09T19:08:06.304440Z","iopub.status.idle":"2021-06-09T19:08:06.315059Z","shell.execute_reply.started":"2021-06-09T19:08:06.304404Z","shell.execute_reply":"2021-06-09T19:08:06.313792Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Вот гифка, показывающая, как W&B регистрирует и отображает конфигурацию тренировки бега:\n\n\n![img](https://i.imgur.com/WxLjIBx.gif)\n\nТеперь я буду использовать `WandbCallback ()`, облегченную интеграцию с Keras, о которой я упоминал ранее.\n\nЭтот обратный вызов автоматически сохраняет все метрики и значения потерь, отслеживаемые в `model.fit ()`. Ознакомьтесь с нашей [документацией по интеграции Keras](https://docs.wandb.ai/guides/integrations/keras), чтобы узнать больше.\n`","metadata":{}},{"cell_type":"markdown","source":" Weights and Biases поставляется с облегченной интеграцией для Keras. Мы будем использовать интеграцию W&B Keras (`WandbCallback ()`) для автоматического сохранения всех показателей и значений потерь, отслеживаемых в `model.fit ()`. Ознакомьтесь с [документацией](https://docs.wandb.ai/guides/integrations/keras), чтобы узнать больше об этой интеграции.","metadata":{}},{"cell_type":"code","source":"earlystopper = tf.keras.callbacks.EarlyStopping(\n    monitor='val_loss', patience=3, verbose=0, mode='min',\n    restore_best_weights=True\n)\n\n# Train\nmodel.fit(trainloader, \n          epochs=CONFIG['epochs'],\n          validation_data=validloader,\n          callbacks=[WandbCallback(),\n                     earlystopper])\n\n# Close W&B run\nrun.finish()","metadata":{"execution":{"iopub.status.busy":"2021-06-09T19:08:13.155788Z","iopub.execute_input":"2021-06-09T19:08:13.156124Z","iopub.status.idle":"2021-06-09T19:17:28.183052Z","shell.execute_reply.started":"2021-06-09T19:08:13.156093Z","shell.execute_reply":"2021-06-09T19:17:28.181985Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"> 📌 Pro tip: перейдите на панель управления W&B, нажав на ссылку, созданную выше.\n\n> 📌 Pro tip: если вы хотите отключить журналы, связанные с W&B, используйте этот фрагмент кода os.environ [WANDB_SILENT] = \"true\" после импорта os. Ознакомьтесь с этим ответом [Stackoverflow](https://stackoverflow.com/a/65997094/8663152) для получения более подробной информации.\n\n> 📌 Pro tip: используйте `run.finish ()`, чтобы закрыть инициализированный run W&B после завершения `job_type`.","metadata":{}},{"cell_type":"markdown","source":"Каждый запуск получает свою собственную страницу запуска, на вкладках которой содержится дополнительная информация о запуске.\n\nВот гифка, показывающая [вкладки Charts](https://docs.wandb.ai/ref/app/pages/run-page#charts-tab), [System tab](https://docs.wandb.ai/ref/app/pages/run-page#system-tab) и [Model tab](https://docs.wandb.ai/ref/app/pages/run-page#model-tab) из приведенного выше прогона:\n\n![img](https://i.imgur.com/Eq8X9RN.gif)\n\nВы можете щелкнуть эту страницу запуска [здесь](https://wandb.ai/ayush-thakur/plant-pathology/runs/5yq0kz7t).\n\n### Фильтрация и группировка\n\nВы можете использовать фильтр и функцию группировки на панели инструментов W&B, чтобы либо скрыть сбойный прогон, либо сгруппировать несколько run-ов в рамках одного эксперимента, сгруппировать в соответствии с типом задания, выбрать run, удовлетворяющие условию, и.т.д. Вы можете узнать больше о функции группирования [здесь](https://docs.wandb.ai/guides/track/advanced/grouping).\n\n\n![img](https://i.imgur.com/BeYKbfS.gif)","metadata":{}},{"cell_type":"markdown","source":"## 🔵 3c. Регистрировать evaluation с помощью `wandb.log ()`\n\n `WandbCallback ()` можно использовать для `model.fit ()`, но не для `model.evaluate ()`. Если вы хотите регистрировать показатели evaluation, вы должны вызвать `wandb.log ()`.\n\n* [`wandb.log()`](https://docs.wandb.ai/guides/track/log): регистрирует скалярные данные (такие показатели, как accuracy и loss) и любой другой тип [`wandb` object](https://docs.wandb.ai/ref/python/data-types) .\n","metadata":{}},{"cell_type":"code","source":"# Initialize a run\nrun = wandb.init(project='plant-pathology', \n                 config=CONFIG,\n                 group='EfficientNet', \n                 job_type='evaluate') # Note the job_type\n\n# Update `wandb.config`\nwandb.config.type = 'baseline'\nwandb.config.kaggle_competition = 'Plant Pathology 2021 - FGVC8'\n\n# Evaluate model\nloss, auc, f1_score = model.evaluate(validloader)\n\n# Log scores using wandb.log()\nwandb.log({'val_AUC': auc, \n           'val_F1_score': f1_score})\n\n# Finish the run\nrun.finish()","metadata":{"execution":{"iopub.status.busy":"2021-06-09T19:17:55.519020Z","iopub.execute_input":"2021-06-09T19:17:55.519394Z","iopub.status.idle":"2021-06-09T19:18:10.125571Z","shell.execute_reply.started":"2021-06-09T19:17:55.519354Z","shell.execute_reply":"2021-06-09T19:18:10.124514Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"![img](https://i.imgur.com/OBL9F1i.gif)\n\n> 📌 Pro tip: Обратите внимание, что столбчатая диаграмма появляется, если для ключа более одного значения.","metadata":{}},{"cell_type":"markdown","source":"# 💾 4. Создайте артефакт W&B.\n\nПанель инструментов W&B позволяет вам регистрировать процесс обучения модели, такие вещи, как журналы вывода, версии кода, конфигурацию, гиперпараметры и метрики. W&B Artifacts позволяет вам регистрировать данные, которые входят (например, набор данных) и выходят (например, веса обученной модели) этих процессов.\n\nДругими словами, артефакты - это способ сохранить ваши наборы данных и модели. Вы можете использовать [этот Colab](https://colab.research.google.com/github/wandb/examples/blob/master/colabs/wandb-artifacts/Pipeline_Versioning_with_W%26B_Artifacts.ipynb), чтобы узнать больше об артефактах.\n\nВ этом разделе я покажу вам, как создать модель Артефакта. Я также создал несколько артефактов набора данных для этого конкурса, и вы можете проверить их все [здесь](https://wandb.ai/ayush-thakur/plant-pathology/artifacts).\n\n## 🔵 4a. Сохраните свою тяжелую работу с помощью `wandb.log_artifact ()` \n\nВ run есть три шага для создания и сохранения артефакта модели.\n\n1. Создайте пустой артефакт с помощью `wandb.Artifact ()`.\n2. Добавьте файл модели в Артефакт с помощью `wandb.add_file ()`.\n3. Вызовите `wandb.log_artifact ()`, чтобы сохранить Артефакт.","metadata":{}},{"cell_type":"code","source":"# Save model\nmodel.save('efficientnetb0-baseline.h5')\n\n# Initialize a new W&B run\nrun = wandb.init(project='plant-pathology', \n                 config=CONFIG,\n                 group='EfficientNet', \n                 job_type='save') # Note the job_type\n\n# Update `wandb.config`\nwandb.config.type = 'baseline'\nwandb.config.kaggle_competition = 'Plant Pathology 2021 - FGVC8'\n\n# Save model as Model Artifact\nartifact = wandb.Artifact(name='efficientnet-b0', type='model')\nartifact.add_file('efficientnetb0-baseline.h5')\nrun.log_artifact(artifact)\n\n# Finish W&B run\nrun.finish()","metadata":{"execution":{"iopub.status.busy":"2021-06-09T19:23:04.629806Z","iopub.execute_input":"2021-06-09T19:23:04.632472Z","iopub.status.idle":"2021-06-09T19:23:17.310009Z","shell.execute_reply.started":"2021-06-09T19:23:04.632415Z","shell.execute_reply":"2021-06-09T19:23:17.309071Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Вот гифка, которая показывает, как артефакт появляется на странице запуска.\n\n![img](https://i.imgur.com/HjHDoSx.gif)\n\nВ конце гифки есть график, показывающий происхождение: прогон «save» `deep-thunder-8` привел к созданию модели `effectivenetb0-v0`.\n![img](https://i.imgur.com/59IFYoT.png)","metadata":{}},{"cell_type":"markdown","source":"# ❄️ Ресурсы\n\nЯ надеюсь, что вы найдете этот kernel полезным, и рекомендую вам попробовать Weights & Biases. Вот несколько релевантных ссылок, которые вы, возможно, захотите проверить:\n\n\n* Ознакомьтесь с [официальной документацией](https://docs.wandb.ai/), чтобы узнать больше о передовых методах работы и дополнительных функциях.\n\n* Ознакомьтесь с [репозиторием GitHub с примерами](https://github.com/wandb/examples), где вы найдете тщательно отобранные и минимальные примеры. Это может быть хорошей отправной точкой.\n\n* [Fully Connected](https://wandb.ai/fully-connected) - это дом для кураторских руководств, дискуссий в произвольной форме, бумажных резюме, советов отраслевых экспертов и многого другого.\n\nВот некоторые другие ядра Kaggle с инструментами Weights & Biases, которые могут быть вам полезны.\n\n* [EfficientNet+Mixup+K-Fold using TF and wandb](https://www.kaggle.com/ayuraj/efficientnet-mixup-k-fold-using-tf-and-wandb)\n\n* [HPA: Segmentation Mask Visualization with W&B](https://www.kaggle.com/ayuraj/hpa-segmentation-mask-visualization-with-w-b)\n\n* [HPA: Multi-Label Classification with TF and W&B](https://www.kaggle.com/ayuraj/hpa-multi-label-classification-with-tf-and-w-b)\n\n* [🐦BirdCLEF: Quick EDA with W&B](https://www.kaggle.com/ayuraj/birdclef-quick-eda-with-w-b)","metadata":{}}]}