{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Image Recognition with a CNN"},{"metadata":{},"cell_type":"markdown","source":"## 1. prepping the Data"},{"metadata":{},"cell_type":"markdown","source":"### 1.0 unzipping train and test into output folder"},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"!unzip ../input/cassava-disease/train.zip -d ../working\n!unzip ../input/cassava-disease/test.zip -d ../working","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 1.1 importing folder directly into dataset"},{"metadata":{"trusted":true},"cell_type":"code","source":"data_dir = '../working/train/'\nbatch_size = 32\nimg_height = 256\nimg_width = 256\n\n\nimport tensorflow as tf\n\ntrain_ds = tf.keras.preprocessing.image_dataset_from_directory(\n  data_dir,\n  validation_split=0.2,\n  subset=\"training\",\n  seed=123,\n  image_size=(img_height, img_width),\n  batch_size=batch_size)\n\ntrain_size = len(train_ds.file_paths)\n\n\nval_ds = tf.keras.preprocessing.image_dataset_from_directory(\n  data_dir,\n  validation_split=0.2,\n  subset=\"validation\",\n  seed=123,\n  image_size=(img_height, img_width),\n  batch_size=batch_size)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### 1.3 Augmenting the data"},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow.keras.models import Sequential\n\ndata_augmentation = Sequential(\n  [\n    layers.experimental.preprocessing.RandomFlip(\"horizontal\",input_shape=(img_height, img_width, 3)),\n    layers.experimental.preprocessing.RandomRotation(0.1),\n    layers.experimental.preprocessing.RandomZoom(0.1),\n  ]\n)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 2 visualizing data"},{"metadata":{"trusted":true},"cell_type":"code","source":"class_names = train_ds.class_names\nprint(class_names)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import matplotlib.pyplot as plt\n\nplt.figure(figsize=(10, 10))\nfor images, labels in train_ds.take(1):\n  for i in range(9):\n    ax = plt.subplot(3, 3, i + 1)\n    plt.imshow(images[i].numpy().astype(\"uint8\"))\n    plt.title(class_names[labels[i]])\n    plt.axis(\"off\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for image_batch, labels_batch in train_ds:\n  print(image_batch.shape)\n  print(labels_batch.shape)\n  break","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"AUTOTUNE = tf.data.AUTOTUNE\n\ntrain_ds = train_ds.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE)\nval_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 3. creating the model"},{"metadata":{"trusted":true},"cell_type":"code","source":"num_classes = 5\n\nfrom tensorflow.keras import layers\n\n\nmodel = Sequential([\n  data_augmentation,\n  layers.experimental.preprocessing.Rescaling(1./255),\n  layers.Conv2D(16, 3, padding='same', activation='relu'),\n  layers.MaxPooling2D(),\n  layers.Conv2D(32, 3, padding='same', activation='relu'),\n  layers.MaxPooling2D(),\n  layers.Conv2D(64, 3, padding='same', activation='relu'),\n  layers.MaxPooling2D(),\n  layers.Dropout(0.2),\n  layers.Flatten(),\n  layers.Dense(128, activation='relu'),\n  layers.Dense(num_classes)\n])\n\n\n\nsteps = 2*int( train_size / 32)\n\nmodel.compile(optimizer='adam',\n              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n              metrics=['accuracy'])\n\nmodel.summary()\n\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 3. (again) create the model - yarden's version"},{"metadata":{"trusted":true},"cell_type":"code","source":"# input_size = X_train.shape[1:]\ninput_size = 32\n# class_num = y_test.shape[1]\nclass_num = 5\n\nfrom keras.models import Sequential\nfrom keras.layers import Dense, Dropout, Flatten, BatchNormalization, Activation\nfrom keras.layers.convolutional import Conv2D, MaxPooling2D, \n\nmodel = Sequential()\n\nmodel.add()\n\nmodel.add(Conv2D(32, (3, 3), input_shape=input_size, padding='same'))\nmodel.add(Activation('relu'))\n\nmodel.add(Conv2D(32, (3, 3), input_shape=(3, 32, 32), activation='relu', padding='same'))\nmodel.add(Dropout(0.2))\nmodel.add(BatchNormalization())\n\nmodel.add(Conv2D(64, (3, 3), padding='same'))\nmodel.add(Activation('relu'))\n\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Dropout(0.2))\nmodel.add(BatchNormalization())\n\nmodel.add(Conv2D(64, (3, 3), padding='same'))\nmodel.add(Activation('relu'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Dropout(0.2))\nmodel.add(BatchNormalization())\n    \nmodel.add(Conv2D(128, (3, 3), padding='same'))\nmodel.add(Activation('relu'))\nmodel.add(Dropout(0.2))\nmodel.add(BatchNormalization())\n\nmodel.add(Flatten())\nmodel.add(Dropout(0.2))\n\nmodel.add(Dense(256, kernel_constraint=maxnorm(3)))\nmodel.add(Activation('relu'))\nmodel.add(Dropout(0.2))\nmodel.add(BatchNormalization())\n    \nmodel.add(Dense(128, kernel_constraint=maxnorm(3)))\nmodel.add(Activation('relu'))\nmodel.add(Dropout(0.2))\nmodel.add(BatchNormalization())\n\nmodel.add(Dense(class_num))\nmodel.add(Activation('softmax'))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 4. training model"},{"metadata":{"_kg_hide-output":false,"trusted":true},"cell_type":"code","source":"epochs=200\nhistory = model.fit(\n  train_ds,\n  validation_data=val_ds,\n  epochs=epochs\n)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 5. evaluating the model"},{"metadata":{"trusted":true},"cell_type":"code","source":"acc = history.history['accuracy']\nval_acc = history.history['val_accuracy']\n\nloss = history.history['loss']\nval_loss = history.history['val_loss']\n\nepochs_range = range(epochs)\n\nplt.figure(figsize=(8, 8))\nplt.subplot(1, 2, 1)\nplt.plot(epochs_range, acc, label='Training Accuracy')\nplt.plot(epochs_range, val_acc, label='Validation Accuracy')\nplt.legend(loc='lower right')\nplt.title('Training and Validation Accuracy')\n\nplt.subplot(1, 2, 2)\nplt.plot(epochs_range, loss, label='Training Loss')\nplt.plot(epochs_range, val_loss, label='Validation Loss')\nplt.legend(loc='upper right')\nplt.title('Training and Validation Loss')\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 6. improving hparams\nlet's now generate random hparams and test each one\nWe'll start by first declaring functions for each purpose"},{"metadata":{},"cell_type":"markdown","source":"### 5.1 function declerations"},{"metadata":{"trusted":true},"cell_type":"code","source":"def generate_number():\n\ndef generate_layer_type():\n\ndef generate_layer_params(layer_type):\n\ndef generate_layer(layer_type,layer_params):\n\ndef create_model(layers):\n\ndef train_and_eval_model(model):\n\ndef log_score(score):\n\ndef print_score(score):","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## start random hparams generation"},{"metadata":{"trusted":true},"cell_type":"code","source":"\n\nbest_score = 0\nwhile True:\n    N_layers = generate_number()\n    layers = []\n    for i in range(N):\n        layer_type = generate_layer_type()\n        layer_params = generate_layer_params(layer_type)\n        layer = generate_layer(layer_type,layer_params)\n        layers.append(layer)\n        \n    model = create_model(layers)\n    score = train_and_eval_model(model)\n    log_score(score)\n    if score>best_score:\n        print_score(score)\n        best_score = score\n    \n    ","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}