{"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":"# Cassava Leaf Disease Classification","metadata":{}},{"cell_type":"markdown","source":"## Импорты","metadata":{}},{"cell_type":"code","source":"from sklearn.preprocessing import MultiLabelBinarizer\nfrom collections import defaultdict\nfrom tensorflow import keras\nfrom keras.models import Sequential, Model\nfrom keras.layers import Dense, Flatten, Dropout, MaxPooling2D, Conv2D, BatchNormalization, GlobalAveragePooling2D\nfrom tensorflow.keras.applications import DenseNet121, EfficientNetB5, Xception\nfrom tensorflow.keras import layers\nfrom tensorflow.keras.utils import to_categorical\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping\nimport tensorflow as tf\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport json\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-05-11T12:46:40.513102Z","iopub.execute_input":"2022-05-11T12:46:40.513781Z","iopub.status.idle":"2022-05-11T12:46:42.593582Z","shell.execute_reply.started":"2022-05-11T12:46:40.513653Z","shell.execute_reply":"2022-05-11T12:46:42.592775Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Загрузка данных","metadata":{}},{"cell_type":"code","source":"train_df = pd.read_csv('../input/cassava-leaf-disease-classification/train.csv')\ntrain_path = \"../input/cassava-leaf-disease-classification/train_images\"\ntest_path = \"../input/cassava-leaf-disease-classification/test_images\"\ntrain_df.head()","metadata":{"execution":{"iopub.status.busy":"2022-05-11T12:46:42.596106Z","iopub.execute_input":"2022-05-11T12:46:42.596336Z","iopub.status.idle":"2022-05-11T12:46:42.627811Z","shell.execute_reply.started":"2022-05-11T12:46:42.596309Z","shell.execute_reply":"2022-05-11T12:46:42.626992Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.info()","metadata":{"execution":{"iopub.status.busy":"2022-05-11T12:46:42.629367Z","iopub.execute_input":"2022-05-11T12:46:42.629662Z","iopub.status.idle":"2022-05-11T12:46:42.645823Z","shell.execute_reply.started":"2022-05-11T12:46:42.629625Z","shell.execute_reply":"2022-05-11T12:46:42.644526Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Пример фотографии","metadata":{}},{"cell_type":"code","source":"img = plt.imread(train_path+\"/\"+train_df[\"image_id\"][0])\nprint(img.shape)\nplt.imshow(img)","metadata":{"execution":{"iopub.status.busy":"2022-05-11T12:46:42.648128Z","iopub.execute_input":"2022-05-11T12:46:42.648512Z","iopub.status.idle":"2022-05-11T12:46:42.97762Z","shell.execute_reply.started":"2022-05-11T12:46:42.648472Z","shell.execute_reply":"2022-05-11T12:46:42.976851Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Первичный анализ данных","metadata":{}},{"cell_type":"code","source":"file = open(\"../input/cassava-leaf-disease-classification/label_num_to_disease_map.json\")\nmapping = json.load(file)\nmapping","metadata":{"execution":{"iopub.status.busy":"2022-05-11T12:46:42.978638Z","iopub.execute_input":"2022-05-11T12:46:42.978898Z","iopub.status.idle":"2022-05-11T12:46:42.986366Z","shell.execute_reply.started":"2022-05-11T12:46:42.978864Z","shell.execute_reply":"2022-05-11T12:46:42.985656Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.groupby('label').count().plot(kind='bar', title='Target class distribution', figsize=(20,10), grid=1)","metadata":{"execution":{"iopub.status.busy":"2022-05-11T12:46:42.987908Z","iopub.execute_input":"2022-05-11T12:46:42.988456Z","iopub.status.idle":"2022-05-11T12:46:43.236721Z","shell.execute_reply.started":"2022-05-11T12:46:42.988413Z","shell.execute_reply":"2022-05-11T12:46:43.236019Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, ax = plt.subplots(1, 5, figsize=(20, 10))\nfor i, img in enumerate(train_df.groupby('label').first().reset_index().values):\n    ax[i].imshow(plt.imread(train_path + f\"/{img[1]}\"))\n    ax[i].set_title(img[0])\n    ax[i].axis('off')\nfig.suptitle('Image Samples', fontsize=18); ","metadata":{"execution":{"iopub.status.busy":"2022-05-11T12:46:43.237866Z","iopub.execute_input":"2022-05-11T12:46:43.238447Z","iopub.status.idle":"2022-05-11T12:46:43.952582Z","shell.execute_reply.started":"2022-05-11T12:46:43.238407Z","shell.execute_reply":"2022-05-11T12:46:43.951263Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Подготовка данных","metadata":{}},{"cell_type":"code","source":"IMAGE_SIZE = (224, 224)\nBATCH_SIZE = 64\nINPUT_SHAPE = (IMAGE_SIZE[0], IMAGE_SIZE[0], 3)\nCLASSES = 5\n\nimage_datagen = ImageDataGenerator(\n    rescale=1/255.0,\n    validation_split = 0.3 \n)\n\ntrain_df.label = train_df.label.astype('str')","metadata":{"execution":{"iopub.status.busy":"2022-05-11T12:46:43.953883Z","iopub.execute_input":"2022-05-11T12:46:43.954647Z","iopub.status.idle":"2022-05-11T12:46:43.986652Z","shell.execute_reply.started":"2022-05-11T12:46:43.954607Z","shell.execute_reply":"2022-05-11T12:46:43.98569Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_generator = image_datagen.flow_from_dataframe(\n    train_df,\n    directory=train_path,\n    x_col=\"image_id\",\n    y_col=\"label\",\n    target_size=IMAGE_SIZE,\n    color_mode=\"rgb\",\n    batch_size=BATCH_SIZE,\n    subset=\"training\",\n    shuffle=True,\n    seed=42,\n    class_mode=\"sparse\"\n)","metadata":{"execution":{"iopub.status.busy":"2022-05-11T12:46:43.987853Z","iopub.execute_input":"2022-05-11T12:46:43.988199Z","iopub.status.idle":"2022-05-11T12:46:52.329959Z","shell.execute_reply.started":"2022-05-11T12:46:43.98816Z","shell.execute_reply":"2022-05-11T12:46:52.328305Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_generator = image_datagen.flow_from_dataframe(\n    train_df,\n    directory=train_path,\n    x_col=\"image_id\",\n    y_col=\"label\",\n    target_size=IMAGE_SIZE,\n    color_mode=\"rgb\",\n    batch_size=BATCH_SIZE,\n    subset=\"validation\",\n    shuffle=True,\n    seed=42,\n    class_mode=\"sparse\"\n)","metadata":{"execution":{"iopub.status.busy":"2022-05-11T12:46:52.332772Z","iopub.execute_input":"2022-05-11T12:46:52.333219Z","iopub.status.idle":"2022-05-11T12:46:52.536009Z","shell.execute_reply.started":"2022-05-11T12:46:52.333177Z","shell.execute_reply":"2022-05-11T12:46:52.535291Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"example = next(train_generator)\nprint(example[0].shape)\nplt.imshow(example[0][0,:,:,:])\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-05-11T12:46:52.537239Z","iopub.execute_input":"2022-05-11T12:46:52.537787Z","iopub.status.idle":"2022-05-11T12:46:53.296844Z","shell.execute_reply.started":"2022-05-11T12:46:52.537749Z","shell.execute_reply":"2022-05-11T12:46:53.296121Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Создать свою модель CNN (с или без Dropout и Batch Normalization)\n","metadata":{}},{"cell_type":"code","source":"def myCNNmodel():\n    model = Sequential()\n\n    model.add(Conv2D(16, (5,5), input_shape=INPUT_SHAPE, activation=\"relu\"))\n    model.add(BatchNormalization())\n    model.add(MaxPooling2D(pool_size = (2,2)))\n    \n    model.add(Conv2D(32, (5,5), activation=\"relu\"))\n    model.add(BatchNormalization())\n    model.add(MaxPooling2D(pool_size = (2,2)))\n\n    model.add(Conv2D(64, (5,5), activation=\"relu\"))\n    model.add(BatchNormalization())\n    model.add(MaxPooling2D(pool_size = (2,2)))\n    \n    model.add(Conv2D(128, (3,3), activation=\"relu\"))\n    model.add(BatchNormalization())\n    model.add(MaxPooling2D(pool_size = (2,2)))\n\n    model.add(Conv2D(256, (3,3), activation=\"relu\"))\n    model.add(BatchNormalization())\n    model.add(MaxPooling2D(pool_size = (2,2)))\n\n\n    model.add(Flatten())\n\n    model.add(Dense(256, activation=\"relu\"))\n    model.add(Dropout(0.3))\n\n    model.add(Dense(128, activation=\"relu\"))\n    model.add(Dropout(0.3))\n\n    model.add(Dense(64, activation=\"relu\"))\n    model.add(Dropout(0.3))\n\n    model.add(Dense(CLASSES, activation=\"softmax\"))\n    \n    return model","metadata":{"execution":{"iopub.status.busy":"2022-05-11T12:46:53.298181Z","iopub.execute_input":"2022-05-11T12:46:53.298926Z","iopub.status.idle":"2022-05-11T12:46:53.309894Z","shell.execute_reply.started":"2022-05-11T12:46:53.298882Z","shell.execute_reply":"2022-05-11T12:46:53.309145Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"example = myCNNmodel().summary()","metadata":{"execution":{"iopub.status.busy":"2022-05-11T12:46:53.311047Z","iopub.execute_input":"2022-05-11T12:46:53.31143Z","iopub.status.idle":"2022-05-11T12:46:54.432751Z","shell.execute_reply.started":"2022-05-11T12:46:53.311387Z","shell.execute_reply":"2022-05-11T12:46:54.431486Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Обучить с использованием разных оптимизаторов (SGD Momentum, RMSProp, Adam) с и без learning rate scheduler\n","metadata":{}},{"cell_type":"markdown","source":"Checkpoints","metadata":{}},{"cell_type":"code","source":"model_checkpoint = ModelCheckpoint(\n    filepath=\"./leafs.h5\", \n    monitor='val_loss', \n    save_best_only=True, \n    verbose=1,\n    mode='min')\n\nearly_stopping = EarlyStopping(\n    monitor='val_loss', \n    min_delta=0,\n    patience=10, \n    verbose=1, \n    restore_best_weights=True)","metadata":{"execution":{"iopub.status.busy":"2022-05-11T12:46:54.434055Z","iopub.execute_input":"2022-05-11T12:46:54.434324Z","iopub.status.idle":"2022-05-11T12:46:54.440279Z","shell.execute_reply.started":"2022-05-11T12:46:54.434282Z","shell.execute_reply":"2022-05-11T12:46:54.439486Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"SGD","metadata":{}},{"cell_type":"code","source":"SGD_model = myCNNmodel()\nSGD_model.compile(loss=\"sparse_categorical_crossentropy\", optimizer=tf.keras.optimizers.SGD(), metrics=[\"accuracy\"])","metadata":{"execution":{"iopub.status.busy":"2022-05-11T12:46:54.441609Z","iopub.execute_input":"2022-05-11T12:46:54.441876Z","iopub.status.idle":"2022-05-11T12:46:54.606122Z","shell.execute_reply.started":"2022-05-11T12:46:54.441838Z","shell.execute_reply":"2022-05-11T12:46:54.605357Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nSGD_history = SGD_model.fit(train_generator,\n                validation_data = test_generator,\n                steps_per_epoch = train_generator.n // BATCH_SIZE,\n                validation_steps = test_generator.n // BATCH_SIZE,\n                epochs=10,\n                callbacks=[model_checkpoint, early_stopping])","metadata":{"execution":{"iopub.status.busy":"2022-05-11T12:46:54.607437Z","iopub.execute_input":"2022-05-11T12:46:54.607696Z","iopub.status.idle":"2022-05-11T12:51:18.006409Z","shell.execute_reply.started":"2022-05-11T12:46:54.607664Z","shell.execute_reply":"2022-05-11T12:51:18.005446Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"RMSPropp","metadata":{}},{"cell_type":"code","source":"RMS_model = myCNNmodel()\nRMS_model.compile(loss=\"sparse_categorical_crossentropy\", optimizer=tf.keras.optimizers.RMSprop(), metrics=[\"accuracy\"])","metadata":{"execution":{"iopub.status.busy":"2022-05-11T12:51:18.008425Z","iopub.execute_input":"2022-05-11T12:51:18.008733Z","iopub.status.idle":"2022-05-11T12:51:18.174458Z","shell.execute_reply.started":"2022-05-11T12:51:18.008688Z","shell.execute_reply":"2022-05-11T12:51:18.173528Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nRMS_history = RMS_model.fit(train_generator,\n                validation_data = test_generator,\n                steps_per_epoch = train_generator.n // BATCH_SIZE,\n                validation_steps = test_generator.n // BATCH_SIZE,\n                epochs=10,\n                callbacks=[model_checkpoint, early_stopping])","metadata":{"execution":{"iopub.status.busy":"2022-05-11T12:51:18.175741Z","iopub.execute_input":"2022-05-11T12:51:18.176032Z","iopub.status.idle":"2022-05-11T12:54:55.305114Z","shell.execute_reply.started":"2022-05-11T12:51:18.175994Z","shell.execute_reply":"2022-05-11T12:54:55.304381Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Adam","metadata":{}},{"cell_type":"code","source":"Adam_model = myCNNmodel()\nAdam_model.compile(loss=\"sparse_categorical_crossentropy\", optimizer=tf.keras.optimizers.Adam(), metrics=[\"accuracy\"])","metadata":{"execution":{"iopub.status.busy":"2022-05-11T12:54:55.307927Z","iopub.execute_input":"2022-05-11T12:54:55.308181Z","iopub.status.idle":"2022-05-11T12:54:55.450551Z","shell.execute_reply.started":"2022-05-11T12:54:55.308146Z","shell.execute_reply":"2022-05-11T12:54:55.449767Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nAdam_history = Adam_model.fit(train_generator,\n                validation_data = test_generator,\n                steps_per_epoch = train_generator.n // BATCH_SIZE,\n                validation_steps = test_generator.n // BATCH_SIZE,\n                epochs=10,\n                callbacks=[model_checkpoint, early_stopping])","metadata":{"execution":{"iopub.status.busy":"2022-05-11T12:54:55.45185Z","iopub.execute_input":"2022-05-11T12:54:55.452118Z","iopub.status.idle":"2022-05-11T12:59:18.71219Z","shell.execute_reply.started":"2022-05-11T12:54:55.452085Z","shell.execute_reply":"2022-05-11T12:59:18.711418Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Adam лучше всех","metadata":{}},{"cell_type":"markdown","source":"Подберем оптимальный learning rate с помощью меньшего набора данных","metadata":{}},{"cell_type":"code","source":"train_generator_tiny = image_datagen.flow_from_dataframe(\n    train_df[:1000],\n    directory=train_path,\n    x_col=\"image_id\",\n    y_col=\"label\",\n    target_size=IMAGE_SIZE,\n    color_mode=\"rgb\",\n    batch_size=BATCH_SIZE,\n    subset=\"training\",\n    shuffle=True,\n    seed=42,\n    class_mode=\"sparse\"\n)\ntest_generator_tiny = image_datagen.flow_from_dataframe(\n    train_df[:1000],\n    directory=train_path,\n    x_col=\"image_id\",\n    y_col=\"label\",\n    target_size=IMAGE_SIZE,\n    color_mode=\"rgb\",\n    batch_size=BATCH_SIZE,\n    subset=\"validation\",\n    shuffle=True,\n    seed=42,\n    class_mode=\"sparse\"\n)","metadata":{"execution":{"iopub.status.busy":"2022-05-11T13:00:47.624368Z","iopub.execute_input":"2022-05-11T13:00:47.624651Z","iopub.status.idle":"2022-05-11T13:00:48.09376Z","shell.execute_reply.started":"2022-05-11T13:00:47.62462Z","shell.execute_reply":"2022-05-11T13:00:48.092958Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"lr_rate = tf.keras.callbacks.LearningRateScheduler(\n    lambda epoch: 1e-8 * 10**(epoch / 20))","metadata":{"execution":{"iopub.status.busy":"2022-05-11T13:15:58.723528Z","iopub.execute_input":"2022-05-11T13:15:58.723996Z","iopub.status.idle":"2022-05-11T13:15:58.728273Z","shell.execute_reply.started":"2022-05-11T13:15:58.723956Z","shell.execute_reply":"2022-05-11T13:15:58.72745Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"LRS_model = myCNNmodel()\nLRS_model.compile(loss=\"sparse_categorical_crossentropy\", optimizer=tf.keras.optimizers.Adam(learning_rate=1e-8), metrics=[\"accuracy\"])","metadata":{"execution":{"iopub.status.busy":"2022-05-11T13:16:00.919916Z","iopub.execute_input":"2022-05-11T13:16:00.920189Z","iopub.status.idle":"2022-05-11T13:16:01.066824Z","shell.execute_reply.started":"2022-05-11T13:16:00.920156Z","shell.execute_reply":"2022-05-11T13:16:01.06612Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nLRS_history = LRS_model.fit(train_generator_tiny,\n                validation_data = test_generator_tiny,\n                steps_per_epoch = train_generator_tiny.n // BATCH_SIZE,\n                validation_steps = test_generator_tiny.n // BATCH_SIZE,\n                epochs=100,\n                callbacks=[lr_rate])","metadata":{"execution":{"iopub.status.busy":"2022-05-11T13:16:12.311755Z","iopub.execute_input":"2022-05-11T13:16:12.312014Z","iopub.status.idle":"2022-05-11T13:32:52.755928Z","shell.execute_reply.started":"2022-05-11T13:16:12.311984Z","shell.execute_reply":"2022-05-11T13:32:52.754536Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.semilogx(LRS_history.history[\"lr\"], LRS_history.history[\"loss\"])","metadata":{"execution":{"iopub.status.busy":"2022-05-11T13:32:52.757976Z","iopub.execute_input":"2022-05-11T13:32:52.758407Z","iopub.status.idle":"2022-05-11T13:32:53.368106Z","shell.execute_reply.started":"2022-05-11T13:32:52.758353Z","shell.execute_reply":"2022-05-11T13:32:53.367152Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Лучший learning_rate - 1e-4 ","metadata":{}},{"cell_type":"code","source":"LR_model = myCNNmodel()\nLR_model.compile(loss=\"sparse_categorical_crossentropy\", optimizer=tf.keras.optimizers.Adam(learning_rate=1e-4), metrics=[\"accuracy\"])","metadata":{"execution":{"iopub.status.busy":"2022-05-11T13:33:35.597115Z","iopub.execute_input":"2022-05-11T13:33:35.597685Z","iopub.status.idle":"2022-05-11T13:33:35.74192Z","shell.execute_reply.started":"2022-05-11T13:33:35.597646Z","shell.execute_reply":"2022-05-11T13:33:35.741096Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nLR_history = LR_model.fit(train_generator,\n                validation_data = test_generator,\n                steps_per_epoch = train_generator.n // BATCH_SIZE,\n                validation_steps = test_generator.n // BATCH_SIZE,\n                epochs=10)","metadata":{"execution":{"iopub.status.busy":"2022-05-11T13:33:38.197249Z","iopub.execute_input":"2022-05-11T13:33:38.197922Z","iopub.status.idle":"2022-05-11T13:38:01.467766Z","shell.execute_reply.started":"2022-05-11T13:33:38.197877Z","shell.execute_reply":"2022-05-11T13:38:01.466217Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## С и без использованием аугментации изображений","metadata":{}},{"cell_type":"code","source":"image_datagen = ImageDataGenerator(\n    rescale=1/255.0,\n    rotation_range=5,\n    zoom_range=0.1,\n    shear_range=0.05,\n    horizontal_flip=True,\n    validation_split=0.2\n)\n\ntrain_generator = image_datagen.flow_from_dataframe(\n    train_df,\n    directory=train_path,\n    x_col=\"image_id\",\n    y_col=\"label\",\n    target_size=IMAGE_SIZE,\n    color_mode=\"rgb\",\n    batch_size=BATCH_SIZE,\n    subset=\"training\",\n    shuffle=True,\n    seed=42,\n    class_mode=\"sparse\"\n)\n\ntest_generator = image_datagen.flow_from_dataframe(\n    train_df,\n    directory=train_path,\n    x_col=\"image_id\",\n    y_col=\"label\",\n    target_size=IMAGE_SIZE,\n    color_mode=\"rgb\",\n    batch_size=BATCH_SIZE,\n    subset=\"validation\",\n    shuffle=True,\n    seed=42,\n    class_mode=\"sparse\"\n)","metadata":{"execution":{"iopub.status.busy":"2022-05-11T13:38:01.469147Z","iopub.execute_input":"2022-05-11T13:38:01.469465Z","iopub.status.idle":"2022-05-11T13:38:11.014364Z","shell.execute_reply.started":"2022-05-11T13:38:01.469423Z","shell.execute_reply":"2022-05-11T13:38:11.013592Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"example = next(train_generator)\nprint(example[0].shape)\nplt.imshow(example[0][0,:,:,:])\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-05-11T13:38:11.015504Z","iopub.execute_input":"2022-05-11T13:38:11.016128Z","iopub.status.idle":"2022-05-11T13:38:12.284753Z","shell.execute_reply.started":"2022-05-11T13:38:11.016086Z","shell.execute_reply":"2022-05-11T13:38:12.284092Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"example = next(train_generator)\nprint(example[0].shape)\nplt.imshow(example[0][0,:,:,:])\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-05-11T13:38:12.286679Z","iopub.execute_input":"2022-05-11T13:38:12.287056Z","iopub.status.idle":"2022-05-11T13:38:13.595828Z","shell.execute_reply.started":"2022-05-11T13:38:12.287021Z","shell.execute_reply":"2022-05-11T13:38:13.59514Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"example = next(train_generator)\nprint(example[0].shape)\nplt.imshow(example[0][0,:,:,:])\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-05-11T13:38:13.597357Z","iopub.execute_input":"2022-05-11T13:38:13.597806Z","iopub.status.idle":"2022-05-11T13:38:14.854599Z","shell.execute_reply.started":"2022-05-11T13:38:13.597767Z","shell.execute_reply":"2022-05-11T13:38:14.853921Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"AUG_model = myCNNmodel()\nAUG_model.compile(loss=\"sparse_categorical_crossentropy\", optimizer=tf.keras.optimizers.Adam(learning_rate=1e-4), metrics=[\"accuracy\"])","metadata":{"execution":{"iopub.status.busy":"2022-05-11T13:38:14.855901Z","iopub.execute_input":"2022-05-11T13:38:14.856602Z","iopub.status.idle":"2022-05-11T13:38:15.001882Z","shell.execute_reply.started":"2022-05-11T13:38:14.856567Z","shell.execute_reply":"2022-05-11T13:38:15.001149Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nAUG_history = AUG_model.fit(train_generator,\n                validation_data = test_generator,\n                steps_per_epoch = train_generator.n // BATCH_SIZE,\n                validation_steps = test_generator.n // BATCH_SIZE,\n                epochs=10)","metadata":{"execution":{"iopub.status.busy":"2022-05-11T13:38:15.00314Z","iopub.execute_input":"2022-05-11T13:38:15.003456Z","iopub.status.idle":"2022-05-11T13:45:38.847023Z","shell.execute_reply.started":"2022-05-11T13:38:15.00342Z","shell.execute_reply":"2022-05-11T13:45:38.846184Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Отобразить активации внутренних слоев сети или сделать визуализацию фильтров ","metadata":{}},{"cell_type":"markdown","source":"Визуализация фильтров","metadata":{}},{"cell_type":"code","source":"for layer in Adam_model.layers:\n    if 'conv' not in layer.name:\n        continue\n    filters, biases = layer.get_weights()\n    print(layer.name, filters.shape)","metadata":{"execution":{"iopub.status.busy":"2022-05-11T14:27:06.303427Z","iopub.execute_input":"2022-05-11T14:27:06.303684Z","iopub.status.idle":"2022-05-11T14:27:06.317333Z","shell.execute_reply.started":"2022-05-11T14:27:06.303655Z","shell.execute_reply":"2022-05-11T14:27:06.316481Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from matplotlib import pyplot\n# load the model\nmodel = Adam_model\n\nfor layer in Adam_model.layers:\n    if 'conv' not in layer.name:\n        continue\n    filters, biases = layer.get_weights()\n    f_min, f_max = filters.min(), filters.max()\n    filters = (filters - f_min) / (f_max - f_min)\n    # plot first few filters\n    n_filters, ix = 6, 1\n    for i in range(n_filters):\n        # get the filter\n        f = filters[:, :, :, i]\n        # plot each channel separately\n        for j in range(3):\n            # specify subplot and turn of axis\n            ax = pyplot.subplot(n_filters, 3, ix)\n            ax.set_xticks([])\n            ax.set_yticks([])\n            # plot filter channel in grayscale\n            pyplot.imshow(f[:, :, j])\n            ix += 1\n    # show the figure\n    pyplot.show()","metadata":{"execution":{"iopub.status.busy":"2022-05-11T14:30:53.5492Z","iopub.execute_input":"2022-05-11T14:30:53.550033Z","iopub.status.idle":"2022-05-11T14:30:56.75721Z","shell.execute_reply.started":"2022-05-11T14:30:53.549996Z","shell.execute_reply":"2022-05-11T14:30:56.756416Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Transfer Learning: Использовать предобученную модель на ImageNet (ResNet, VGG, GoogLeNet и т д) с заменой слоя классификации на слой с нужным количеством классов и обучить модель на данном датасете\n","metadata":{}},{"cell_type":"code","source":"base_model = DenseNet121(include_top=True, input_shape=(224,224,3))\n\nnewLayer = Dense(CLASSES, activation='softmax')\noutLayer = newLayer(base_model.layers[-2].output)\n\nDense_model = Model(inputs=base_model.input, outputs=outLayer)\n\nfor layer in base_model.layers[:-1]:\n    layer.trainable = False\n    \nDense_model.summary()","metadata":{"execution":{"iopub.status.busy":"2022-05-11T14:42:59.189348Z","iopub.execute_input":"2022-05-11T14:42:59.190145Z","iopub.status.idle":"2022-05-11T14:43:02.263429Z","shell.execute_reply.started":"2022-05-11T14:42:59.190106Z","shell.execute_reply":"2022-05-11T14:43:02.262687Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Dense_model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2022-05-11T14:59:42.483753Z","iopub.execute_input":"2022-05-11T14:59:42.484264Z","iopub.status.idle":"2022-05-11T14:59:42.503651Z","shell.execute_reply.started":"2022-05-11T14:59:42.484205Z","shell.execute_reply":"2022-05-11T14:59:42.502804Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nDense_history = Dense_model.fit(\n    train_generator,\n    validation_data = test_generator,\n    epochs = 10\n)","metadata":{"execution":{"iopub.status.busy":"2022-05-11T14:59:44.886421Z","iopub.execute_input":"2022-05-11T14:59:44.886942Z","iopub.status.idle":"2022-05-11T15:20:12.432643Z","shell.execute_reply.started":"2022-05-11T14:59:44.886903Z","shell.execute_reply":"2022-05-11T15:20:12.431903Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Отобразить результаты всех экспериментов в одной таблице(пример дальше) и графики обучения","metadata":{}},{"cell_type":"code","source":"ALL_accuracy = [SGD_history.history['accuracy'][-1],\n                RMS_history.history['accuracy'][-1],\n                Adam_history.history['accuracy'][-1],\n                LR_history.history['accuracy'][-1],\n                AUG_history.history['accuracy'][-1], \n                Dense_history.history['accuracy'][-1]]\n\nALL_val_accuracy = [SGD_history.history['val_accuracy'][-1],\n                RMS_history.history['val_accuracy'][-1],\n                Adam_history.history['val_accuracy'][-1],\n                LR_history.history['val_accuracy'][-1],\n                AUG_history.history['val_accuracy'][-1],\n                Dense_history.history['val_accuracy'][-1]]\n\nALL_loss = [SGD_history.history['loss'][-1],\n                RMS_history.history['loss'][-1],\n                Adam_history.history['loss'][-1],\n                LR_history.history['loss'][-1],\n                AUG_history.history['loss'][-1],\n                Dense_history.history['loss'][-1]]\n\nALL_val_loss = [SGD_history.history['val_loss'][-1],\n                RMS_history.history['val_loss'][-1],\n                Adam_history.history['val_loss'][-1],\n                LR_history.history['val_loss'][-1],\n                AUG_history.history['val_loss'][-1],\n                Dense_history.history['val_loss'][-1]]","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"experiments = {\"experiment\": [\"Custom model + SGD\", \"Custom model + RMS\", \"Custom model + Adam\", \"Custom model + Adam + LearningRate\", \"Custom model + Adam + LR + Image augment\", \"DenseNet + Adam\"],\n              \"train_accuracy\": ALL_accuracy,\n              \"test_accuracy\": ALL_val_accuracy}","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"table = pd.DataFrame(experiments)\ntable","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def plot_results(model_hist):\n    plt.figure(figsize=(20,10))\n\n    x = model_hist.epoch\n\n    plt.title('accuracy')\n    plt.subplot(221)\n    plt.plot(x, model_hist.history['accuracy'])\n\n    plt.title('val_accuracy')\n    plt.subplot(222)\n    plt.plot(x, model_hist.history['val_accuracy'])\n\n    plt.title('loss')\n    plt.subplot(223)\n    plt.plot(x, model_hist.history['loss'])\n\n    plt.title('val_loss')\n    plt.subplot(224)\n    plt.plot(x, model_hist.history['val_loss'])\n\n    plt.plot()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_results(Dense_history)","metadata":{},"execution_count":null,"outputs":[]}]}