Skip to content
Permalink
main
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"provenance": []
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
}
},
"cells": [
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"id": "LSTZegzVZY2P"
},
"outputs": [],
"source": [
"import tensorflow as tf\n",
"from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint\n",
"import numpy as np\n",
"from tensorflow.keras.preprocessing.image import ImageDataGenerator\n",
"import cv2\n",
"from tqdm import tqdm\n",
"import os\n",
"from sklearn.model_selection import train_test_split\n",
"for dirname, _, filenames in os.walk('/MRI/'):\n",
" for filename in filenames:\n",
" print(os.path.join(dirname, filename))\n",
"\n",
"import seaborn as sns\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"source": [
"from google.colab import drive\n",
"drive.mount('/content/drive')"
],
"metadata": {
"id": "G2_dBUZeeK4O",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "e215e338-3abb-4b69-beaa-9d88e98e6b0a"
},
"execution_count": 6,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Mounted at /content/drive\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"labels = ['glioma', 'meningioma', 'notumor', 'pituitary']"
],
"metadata": {
"id": "RzvkSAR1ZenF"
},
"execution_count": 5,
"outputs": []
},
{
"cell_type": "code",
"source": [
"X_train = []\n",
"y_train = []\n",
"image_width = 100\n",
"image_height = 100\n",
"for i in labels:\n",
" \n",
" folderPath = os.path.join('/content/drive/MyDrive/colab/MRI/','Training/',i)\n",
" for j in tqdm(os.listdir(folderPath)):\n",
" img = cv2.imread(os.path.join(folderPath,j))\n",
" img = cv2.resize(img,(image_width, image_height))\n",
" X_train.append(img)\n",
" y_train.append(i)\n",
" \n",
"\n",
"for i in labels:\n",
" \n",
" folderPath = os.path.join('/content/drive/MyDrive/colab/MRI/','Testing/',i)\n",
" for j in tqdm(os.listdir(folderPath)):\n",
" img = cv2.imread(os.path.join(folderPath,j))\n",
" img = cv2.resize(img,(image_width, image_height))\n",
" X_train.append(img)\n",
" y_train.append(i)\n",
" \n",
" \n",
"X_train = np.array(X_train)\n",
"y_train = np.array(y_train)"
],
"metadata": {
"id": "gPUQL93xZe1V",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "7a9c3dd3-dd0b-4b34-c388-82324723e8b0"
},
"execution_count": 6,
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"100%|██████████| 116/116 [00:01<00:00, 98.57it/s] \n",
"100%|██████████| 100/100 [00:00<00:00, 123.26it/s]\n",
"100%|██████████| 101/101 [00:00<00:00, 150.15it/s]\n",
"100%|██████████| 104/104 [00:00<00:00, 105.92it/s]\n",
"100%|██████████| 100/100 [00:00<00:00, 128.30it/s]\n",
"100%|██████████| 100/100 [00:00<00:00, 165.71it/s]\n",
"100%|██████████| 100/100 [00:00<00:00, 208.82it/s]\n",
"100%|██████████| 100/100 [00:00<00:00, 128.74it/s]\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"from sklearn.utils import shuffle\n",
"X_train = shuffle(X_train)\n",
"y_train = shuffle(y_train)"
],
"metadata": {
"id": "WBhy8rSMFZPa"
},
"execution_count": 7,
"outputs": []
},
{
"cell_type": "code",
"source": [
"X_train.shape, y_train.shape"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "pTFz4DcHFkqg",
"outputId": "1c7d606b-b5b4-4112-961e-efac137a73e5"
},
"execution_count": 8,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"((821, 100, 100, 3), (821,))"
]
},
"metadata": {},
"execution_count": 8
}
]
},
{
"cell_type": "code",
"source": [
"X_train, X_test, y_train, y_test = train_test_split(X_train, y_train)"
],
"metadata": {
"id": "tB3rlW6LFoq1"
},
"execution_count": 9,
"outputs": []
},
{
"cell_type": "code",
"source": [
"ytrain = []\n",
"for i in y_train:\n",
" ytrain.append(labels.index(i))\n",
"y_train = ytrain\n",
"y_train = tf.keras.utils.to_categorical(y_train)\n",
"\n",
"ytest = []\n",
"for i in y_test:\n",
" ytest.append(labels.index(i))\n",
"y_test = ytest\n",
"y_test = tf.keras.utils.to_categorical(y_test)"
],
"metadata": {
"id": "5q7ayJPuFylN"
},
"execution_count": 10,
"outputs": []
},
{
"cell_type": "code",
"source": [
"train_gen = ImageDataGenerator( \n",
" fill_mode=\"nearest\",\n",
" shear_range=0.2,\n",
" zoom_range=0.2,\n",
" horizontal_flip=True,\n",
" validation_split=0.1\n",
")\n",
"test_gen = ImageDataGenerator()\n",
"\n",
"\n",
"train_ds = train_gen.flow(\n",
" X_train, y_train,\n",
" subset=\"training\",\n",
" shuffle=True,\n",
" batch_size=32)"
],
"metadata": {
"id": "7M2SJ-4tUdHh"
},
"execution_count": 11,
"outputs": []
},
{
"cell_type": "code",
"source": [
"val_ds = train_gen.flow(\n",
" X_train, y_train,\n",
" subset=\"validation\",\n",
" shuffle=True,\n",
" batch_size=32)\n",
"test_ds = test_gen.flow(\n",
" X_test, y_test,\n",
" shuffle=False,\n",
" batch_size=32)"
],
"metadata": {
"id": "hp1S_4rVTVje"
},
"execution_count": 12,
"outputs": []
},
{
"cell_type": "code",
"source": [],
"metadata": {
"id": "Q7Z1PdMoVf30"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"model = tf.keras.models.Sequential([\n",
" tf.keras.layers.Dense(64, activation='relu', input_shape=(100,100,3)),\n",
" tf.keras.layers.Flatten(),\n",
" tf.keras.layers.Dense(512,activation=\"relu\"),\n",
" tf.keras.layers.Dropout(0.2),\n",
" tf.keras.layers.Dense(4,activation=\"softmax\")])"
],
"metadata": {
"id": "U8nHf-i6I0l2"
},
"execution_count": 13,
"outputs": []
},
{
"cell_type": "code",
"source": [],
"metadata": {
"id": "qXFjJcdMI9Tq"
},
"execution_count": 40,
"outputs": []
},
{
"cell_type": "code",
"source": [
"model.compile(\n",
" \n",
" optimizer = tf.keras.optimizers.Adam(),\n",
" loss='mse',\n",
" metrics = ['accuracy'])"
],
"metadata": {
"id": "M5lnq93eJIFj"
},
"execution_count": 14,
"outputs": []
},
{
"cell_type": "code",
"source": [
"model.summary()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "PmYc3GIsETUQ",
"outputId": "b507c21e-876d-474f-e3cf-f10d8239d3f0"
},
"execution_count": 15,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Model: \"sequential\"\n",
"_________________________________________________________________\n",
" Layer (type) Output Shape Param # \n",
"=================================================================\n",
" dense (Dense) (None, 100, 100, 64) 256 \n",
" \n",
" flatten (Flatten) (None, 640000) 0 \n",
" \n",
" dense_1 (Dense) (None, 512) 327680512 \n",
" \n",
" dropout (Dropout) (None, 512) 0 \n",
" \n",
" dense_2 (Dense) (None, 4) 2052 \n",
" \n",
"=================================================================\n",
"Total params: 327,682,820\n",
"Trainable params: 327,682,820\n",
"Non-trainable params: 0\n",
"_________________________________________________________________\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"history = model.fit(train_ds,\n",
" epochs=2, \n",
" verbose=1, \n",
" validation_data = val_ds)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "uNZIOKZjGuIn",
"outputId": "bbcdb3d2-5e8a-4765-f203-6003339431b6"
},
"execution_count": 18,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Epoch 1/2\n",
"18/18 [==============================] - 145s 8s/step - loss: 0.3899 - accuracy: 0.2202 - val_loss: 0.3689 - val_accuracy: 0.2623\n",
"Epoch 2/2\n",
"18/18 [==============================] - 137s 8s/step - loss: 0.3745 - accuracy: 0.2509 - val_loss: 0.3770 - val_accuracy: 0.2459\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"plt.plot(history.history['accuracy'])\n",
"plt.plot(history.history['val_accuracy'])\n",
"plt.title('Model accuracy')\n",
"plt.ylabel('accuracy')\n",
"plt.xlabel('epoch')\n",
"plt.legend(['train', 'val'], loc='upper left')\n",
"plt.show()\n",
"\n",
"plt.plot(history.history['loss'])\n",
"plt.plot(history.history['val_loss'])\n",
"plt.title('Model loss')\n",
"plt.ylabel('loss')\n",
"plt.xlabel('epoch')\n",
"plt.legend(['train', 'val'], loc='upper left')\n",
"plt.show()\n",
"\n"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 573
},
"id": "3i-RpgRIdvm5",
"outputId": "a520d31c-6f92-4fcb-84bd-38c1e2c637cd"
},
"execution_count": 19,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
],
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAY4AAAEWCAYAAABxMXBSAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAAsTAAALEwEAmpwYAAAuXklEQVR4nO3deXyV9Z33/9cnOwlhSQhrgLBV2RQkIMoiaLWMtujcbd2qtbXqIFi7Taf2vp3fdPrrTO10OtPlButSt7bqOLb259yjtb9WVgVZFBVxgUACYU1YkwBZP/cf1xVyiAFyyDk5Wd7Px4MH51zXda7zvdjefK/v9fl+zd0RERFpraREN0BERDoXBYeIiERFwSEiIlFRcIiISFQUHCIiEhUFh4iIREXBIRInZlZgZm5mKa049ktmtqqt5xFpDwoOEcDMis2sxsz6Ndv+VviPdkGCmibS4Sg4RJpsB25qfGNmE4HMxDVHpGNScIg0+TXwxYj3twFPRR5gZr3N7CkzKzOzEjO738ySwn3JZvavZlZuZtuAa1r47K/MbI+Z7TKzH5hZcrSNNLPBZvaimR00s61mdmfEvmlmtt7MjprZPjP7t3B7hpn9xswOmNlhM1tnZgOi/W4RUHCIRFoD9DKzseE/6DcCv2l2zC+A3sBI4DKCoPlyuO9O4NPAZKAQ+Fyzzz4B1AGjw2OuAu44h3Y+C5QCg8Pv+Gczuzzc9zPgZ+7eCxgFPBduvy1s91AgF1gAHD+H7xZRcIg009jruBJ4H9jVuCMiTL7r7hXuXgz8BLg1POR64KfuvtPdDwI/jPjsAOBq4OvuXuXu+4F/D8/XamY2FJgBfMfdT7j7RuBRmnpKtcBoM+vn7pXuviZiey4w2t3r3X2Dux+N5rtFGik4RE71a+Bm4Es0u00F9ANSgZKIbSXAkPD1YGBns32Nhoef3RPeKjoMPAT0j7J9g4GD7l5xmjZ8BfgE8EF4O+rTEdf1CvCsme02s38xs9Qov1sEUHCInMLdSwgGya8Gft9sdznB/9yHR2wbRlOvZA/BraDIfY12AtVAP3fvE/7o5e7jo2zibiDHzLJbaoO7b3H3mwgC6UfA82aW5e617v6P7j4OuJTgltoXETkHCg6Rj/sKcLm7V0VudPd6gjGDfzKzbDMbDnyTpnGQ54B7zSzfzPoC90V8dg/wJ+AnZtbLzJLMbJSZXRZNw9x9J/A68MNwwPuCsL2/ATCzW8wsz90bgMPhxxrMbK6ZTQxvtx0lCMCGaL5bpJGCQ6QZdy9y9/Wn2f1VoArYBqwCngYeC/c9QnA76G3gTT7eY/kikAZsBg4BzwODzqGJNwEFBL2PF4B/cPc/h/vmAe+ZWSXBQPmN7n4cGBh+31GCsZvlBLevRKJmWshJRESioR6HiIhERcEhIiJRUXCIiEhUFBwiIhKVbjFNc79+/bygoCDRzRAR6VQ2bNhQ7u55zbd3i+AoKChg/frTPV0pIiItMbOSlrbrVpWIiERFwSEiIlFRcIiISFS6xRhHS2prayktLeXEiROJbkpcZWRkkJ+fT2qqJkIVkdiIa3CY2TyC+XKSgUfd/YFm+xcAi4B6oBK4y903m1kawZTThQQTsX3N3ZeFn5lCsCBOD+ClcF/U86aUlpaSnZ1NQUEBZnaOV9ixuTsHDhygtLSUESNGJLo5ItJFxO1WVTgL52Lgr4BxwE1mNq7ZYU+7+0R3nwT8C/Bv4fY7Adx9IsGCOj9pXJ4TeDDcPyb8Me9c2nfixAlyc3O7bGgAmBm5ubldvlclIu0rnmMc04Ct7r7N3WsIlru8NvKAZiuQZQGNPYdxwKvhMfsJpocuNLNBQC93XxP2Mp4CrjvXBnbl0GjUHa5RRNpXPINjCKeuhlZK0yplJ5nZIjMrIuhx3BtufhuYb2YpZjYCmEKwQM6Q8DxnPGd43rvMbL2ZrS8rKzunCyivrObI8Vo0g7CISJOEP1Xl7ovdfRTwHeD+cPNjBKGwHvgpwcI19VGe92F3L3T3wry8jxU+tubzHKyqoeRAFVv2VXKoqoaGGAbI4cOHWbJkSdSfu/rqqzl8+HDM2iEiEq14BscuTl1GM5+mJTZb8izhbSd3r3P3b7j7JHe/FugDfBR+Pj+Kc54zM2NM/54My8kEg52HjvHR3grKK6tpaGh7gJwuOOrq6s74uZdeeok+ffq0+ftFRM5VPINjHTDGzEaET0ndCLwYeYCZjYl4ew2wJdyeaWZZ4esrgTp33xwuv3nUzKZbcPP+i8D/F68LMDP6ZKYxpn9PCnKzSElOYvfh43ywt4L9R09Q33DuK2/ed999FBUVMWnSJKZOncqsWbOYP38+48YFzw9cd911TJkyhfHjx/Pwww+f/FxBQQHl5eUUFxczduxY7rzzTsaPH89VV13F8ePH23zNIiJnE7fHcd29zszuIVhKMxl4zN3fM7PvA+vd/UXgHjP7JMH6x4eA28KP9wdeMbMGgh7FrRGnXkjT47gvhz/a5B//6z027z569gOBendq6xqob3DMICU5idTkJJoPQY8b3It/+Mz4057ngQceYNOmTWzcuJFly5ZxzTXXsGnTppOPzT722GPk5ORw/Phxpk6dymc/+1lyc3NPOceWLVt45plneOSRR7j++uv53e9+xy233BLVtYuIRCuudRzu/hJBrUXktv8n4vXXTvO5YuC80+xbD0yIXSujk2xGcmoyDe7U1jdQW9dAbX0DqUlJpCbbOT/FNG3atFNqLX7+85/zwgsvALBz5062bNnyseAYMWIEkyZNAmDKlCkUFxef03eLiESj21aORzpTz+BsTtTWU15RzaFjtQD0yUwlLzudjNTkqM6TlZV18vWyZcv485//zOrVq8nMzGTOnDkt1mKkp6effJ2cnKxbVSLSLhQcbZSRmkx+Tib9ezVQXlnNwaoaDh2roVdGKv17pZOZ1vIvcXZ2NhUVFS3uO3LkCH379iUzM5MPPviANWvWxPMSRESiouCIkbSUJAb36UH/7HTKK2s4UFXN1v219ExPoX92OlnpKafcxsrNzWXGjBlMmDCBHj16MGDAgJP75s2bxy9/+UvGjh3Leeedx/Tp0xNxSSIiLbLuUNxWWFjozRdyev/99xk7dmzcvrO+wTlYVU1ZZQ119Q1kpqWQl51Or4yUdq/mjve1ikjXZGYb3L2w+Xb1OOIkOcnIy84gNyudQ8dqKKuspuRAFRkpyeRlp9M7M5UkTQciIp2QgiPOkpKM3J7p5GSlceR4Lfsrqtl56Bj7jibRLzudnMw0kpIUICLSeSg42kljMWHvHqlUnKhjf0U1uw8fZ//Ravr1TCO3ZxrJSQmfAUZE5KwUHO3MzOjVI5XsjBSqauopq6hm79ETlFVUk9szjdye6aQmK0BEpONScCSImdEzPYWe6Skcrwl6IPsrqimvrKFvVhp5PdNIS4muFkREpD0oODqAHmkpDM9NOVlMeLCqhoOVNedcTCgiEk8Kjg7kZDFh3ceLCScUDKCysjLRTRQRSfx6HPJxjcWE5w/Mpn92BlU1dTQ4bCurpPKEFpYSkcRSjyNB7rvvPoYOHcqiRYsA+N73vkdKSgpLly7l0KFD1NbW8oMf/IBrr72WvOx0zKC6roFt5VVkpiWTl52RkGJCEREFB8DL98Hed2N7zoET4a8eOO3uG264ga9//esng+O5557jlVde4d5776VXr16Ul5czffp05s+fT3KSYcB5A7JVTCgiCafgSJDJkyezf/9+du/eTVlZGX379mXgwIF84xvfYMWKFSQlJbFr1y727dvHwIEDARUTikjHoOCAM/YM4unzn/88zz//PHv37uWGG27gt7/9LWVlZWzYsIHU1FQKCgpanE5dxYQikkgKjgS64YYbuPPOOykvL2f58uU899xz9O/fn9TUVJYuXUpJSckZP3+mYsKcnmn0UzGhiMSBgiOBxo8fT0VFBUOGDGHQoEF84Qtf4DOf+QwTJ06ksLCQ888/v1XnaamYsKyimgNhMWFdG9ZGFxFpTsGRYO++2zQo369fP1avXt3ica2t4WipmHDfkWoe/4+N3D1nFGMGZMek3SLSfSk4uqjIYsLKvSm8vGk3v39rF1eNG8DCuaOZNLRPopsoIp2UboB3cWkpSfTJTOW1+y7n3stHs2bbAa5b/Bo3P7KGVVvKVUwoIlHr1sHRHf7RbLzGnKw0vnnVebz+3Sv4n1efz9b9ldzyqze4bvFr/HHTXhoauv6vhYjERrcNjoyMDA4cONClw8PdOXDgABkZGSe39UxP4a7Zo1jxd3P5p7+ewKFjtSz4zQau+ukKnt9QSm29BtJF5My67ZrjtbW1lJaWtlgn0ZVkZGSQn59Pampqi/vr6hv473f38OCyIj7YW8GQPj24a/ZIbpg6VLPyinRzp1tzvNsGh5zK3Vn64X4WLy1iQ8khcrPSuH3mCG6ZPpzePVoOHRHp2hQcCo5WcXfWbj/IkmVFLP+ojOz0FG65ZDi3zxhBXnZ6opsnIu1IwaHgiNqmXUd4cFkRL23aQ1pyEtcXDuWu2SMZmpOZ6KaJSDtQcCg4ztm2skoeWr6N379VSoPDtRcOVjGhSDeg4FBwtNmeI8d5ZMV2nlm7g+O19Vw5bgAL54xi8rC+iW6aiMSBgkPBETMHq2p44vVinny9mCPHa7l0VC4L54xmxuhcLSwl0oUoOBQcMVdZXcczb+zgkZXb2F9RzYX5vbl7zmiuGjdA64KIdAEKDgVH3Jyoref3b+7ioRVFlBw4xuj+PVlw2SiunTRY07qLdGIKDgVH3NXVN/DSpr0sWbr1lGLC6wuH0iNNxYQinY2CQ8HRbhqLCZcsLWK9iglFOi0Fh4IjIdZuP8jipVtVTCjSCSk4FBwJtWnXER5cXsRL76qYUKSzUHAoODqElooJF8wZxSdUTCjS4Sg4FBwdyp4jx3l05XaefkPFhCId1emCI67PSprZPDP70My2mtl9LexfYGbvmtlGM1tlZuPC7alm9mS4730z+27EZ4ojPqM06KQG9e7B3396XLAy4RVjWLv9IH+95HWtTCjSCcStx2FmycBHwJVAKbAOuMndN0cc08vdj4av5wML3X2emd0MzHf3G80sE9gMzHH3YjMrBgrdvby1bVGPo+NrXkx4QX5vFs4ZxVXjBqqYUCRBEtHjmAZsdfdt7l4DPAtcG3lAY2iEsoDGFHMgy8xSgB5ADRB5rHQxPdNTuHP2SFZ+Zy7//NcTOXK8lgW/eZMr/325ViYU6WDiGRxDgJ0R70vDbacws0VmVgT8C3BvuPl5oArYA+wA/tXdD4b7HPiTmW0ws7tO9+VmdpeZrTez9WVlZW2/GmkX6SnJ3HzxMP7yzcv4+U2TSU1O4m//823m/HgZT7y2neM19Yluoki3l/D5INx9sbuPAr4D3B9ungbUA4OBEcC3zGxkuG+mu18E/BWwyMxmn+a8D7t7obsX5uXlxfciJOZSkpOYf+FgXv7aLB77UiGDemfwvf/azMwfvcripVs5crw20U0U6bbiGRy7gKER7/PDbafzLHBd+Ppm4I/uXuvu+4HXgEIAd98V/rwfeIEgZKSLMjMuP38Az999Kc/9zSVMGNKbH7/yITMfeJUHXv6AsorqRDdRpNuJZ3CsA8aY2QgzSwNuBF6MPMDMxkS8vQbYEr7eAVweHpMFTAc+MLMsM8uO2H4VsCmO1yAdyLQROTx5+zT+z1dnMvu8PB5aUcSMH73K3/9hEzsPHkt080S6jZR4ndjd68zsHuAVIBl4zN3fM7PvA+vd/UXgHjP7JFALHAJuCz++GHjczN4DDHjc3d8Jb1e9EK75kAI87e5/jNc1SMc0YUhvFt98EdvLq3hoeRHPrtvB02t3MD9cmVDFhCLxpQJA6fRUTCgSH6ocV3B0eYfClQmfCFcmvGRkLgvnjmLm6H5amVDkHCg4FBzdhooJRWJDwaHg6Haq64KVCX+5PFiZcFReFgsuG8V1k4doZUKRVlBwKDi6rZZWJrxz1ghumDpMKxOKnIGCQ8HR7bk7yz4sY/HSrSdXJvzyjAJuvaRAKxOKtEDBoeCQCGu3H2TJsq0s+7CMnukp3DJ9OF+ZqZUJRSIpOBQc0oLIlQlTk5O4vjCfv5k9SisTiqDgUHDIGTUWE/7uzWBlQhUTiig4FBzSKiomFGmi4FBwSBRUTCii4FBwyDlRMaF0ZwoOBYe0gYoJpTtScCg4JAaaFxMO7p3BXbNHqphQuiQFh4JDYqixmHDJsq2sK1YxoXRNCg4Fh8RJS8WEt88soH92RqKbJtImCg4Fh8TZe7uP8OCyoJgwRcWE0gUoOBQc0k5UTChdhYJDwSHtbO+REzy6chtPr93BsZp6Pjl2AAvnjuIiFRNKJ6HgUHBIgqiYUDorBYeCQxKsqrqOZ9YGxYT7jlYzcUhQTPip8SomlI5JwaHgkA6isZjwoeVFFKuYUDowBYeCQzqY+gbnpXf3sGRZEe/vOcrg3hncOXskN6qYUDoIBYeCQzqo5sWEOVlp3K5iQukAFBwKDukE1hUfZMnSrSwNiwm/MH0YX5k5QsWEkhAKDgWHdCIqJpSOQMGh4JBOqLi8iodWFPH8hqCY8DMXDOLuOaM5b6CKCSX+FBwKDunEVEwoiaDgUHBIF3CoqoYnVxfz+GtBMeH0kTksnDOaWWNUTCixp+BQcEgXomJCaQ8KDgWHdEHVdfW8EK5MWHzgGCMbiwknDSEtRcWE0jYKDgWHdGEqJpR4UHAoOKQbcHeWfVTGkqUqJpS2U3AoOKSbUTGhtJWCQ8Eh3VTzYsLPTwmKCYflqphQzkzBoeCQbq6xmPB3G3ZR765iQjkrBYeCQwRoqZiwPwvnjlYxoXyMgkPBIXKKxmLCJ14v5vAxFRPKxyk4FBwiLVIxoZzO6YIjrhVCZjbPzD40s61mdl8L+xeY2btmttHMVpnZuHB7qpk9Ge5738y+29pzikh0stJTuGPWSFb83Vwe+B8TqThRy92/fZNP/vtynlu/k5q6hkQ3UTqYuPU4zCwZ+Ai4EigF1gE3ufvmiGN6ufvR8PV8YKG7zzOzm4H57n6jmWUCm4E5wM6znbMl6nGItJ6KCaVRInoc04Ct7r7N3WuAZ4FrIw9oDI1QFtCYYg5kmVkK0AOoAY625pwi0jbJScZnLhzMS/fO5PEvTyW/byb/+F+bmfGjV/nFX7Zw5FhtopsoCdaq4DCzr5lZLwv8yszeNLOrzvKxIQQ9hEal4bbm515kZkXAvwD3hpufB6qAPcAO4F/d/WBrzxme9y4zW29m68vKylpxlSISycyYe15/nltwCf+54BIuzO/NT/7/j5jxo1f54cvvs7/iRKKbKAnS2h7H7WHv4CqgL3Ar8EAsGuDui919FPAd4P5w8zSgHhgMjAC+ZWYjozzvw+5e6O6FeXl5sWiqSLc1tSCHx788jZfuncXc8/vzyIptzPzRUv7XC++y48CxRDdP2llrg6Px0YqrgV+7+3sR205nFzA04n1+uO10ngWuC1/fDPzR3WvdfT/wGlB4DucUkRgaN7gXv7hpMq9+aw6fvWgI/7m+lLk/WcbXn32LD/dWJLp50k5aGxwbzOxPBMHxipllA2d71GIdMMbMRphZGnAj8GLkAWY2JuLtNcCW8PUO4PLwmCxgOvBBa84pIvFX0C+LH/6PC1j5nbncPqOAP23ex6d+uoI7nlzHhpJDiW6exFmrnqoysyRgErDN3Q+bWQ6Q7+7vnOVzVwM/BZKBx9z9n8zs+8B6d3/RzH4GfBKoBQ4B97j7e2bWE3gcGEfQs3nc3X98unOerf16qkokvlRM2DW1qQDQzGYAG929ysxuAS4CfubuJbFvauwpOETaR2Mx4aMrt7P36AkmDunN3WExYbKKCTudtgbHO8CFwAXAE8CjwPXuflmM2xkXCg6R9qWVCbuGttZx1HmQMNcC/9vdFwOaUlNEWpSeksyN04bxl2/N4X/fPJmMlGT+7vl3mPPjpTy2ajvHauoS3URpg9b2OJYDfwRuB2YB+4G33X1ifJsXG+pxiCRW48qEDy4tYm3xQXKy0vjypQV88ZICemdqZcKOqq23qgYSPCK7zt1XmtkwYI67PxX7psaegkOk41hffJAly4p49YP9wcqEF4crE/bSyoQdTZtnxzWzAcDU8O3asL6iU1BwiHQ8m3cf5cHlRfz3O7u1MmEH1dYex/XAj4FlBI/HzgK+7e7Px7idcaHgEOm4gpUJt/G7DaXUu/PpCwZx95xRnD+wV6Kb1u21NTjeBq5s7GWYWR7wZ3e/MOYtjQMFh0jHt+9osDLhb99oWpnw7jmjmTJcKxMmSluD493IgfCwIFCD4yISc4eP1fDk6yU8/vp2Dh+r5eIROSyaq2LCRGhrcPyYoIbjmXDTDcA77v6dmLYyThQcIp1P82LCCUN6sXDOaBUTtqNYDI5/FpgRvl3p7i/EsH1xpeAQ6byq6+r5w1u7eHBZWEzYLywmnKxiwnjTmuMKDpFOrb7BeXnTHpYsLWLznqMM6p3BnbNGcuO0oWSmpSS6eV3SOQWHmVXQtCrfKbsAd/dO8diDgkOk63B3ln9UxpKwmLBvZipfnjGC21RMGHPqcSg4RLqcyGLCrLRkbpk+XMWEMaTgUHCIdFnNiwk/NyWfBSombDMFh4JDpMuLLCasa2jgMxcOVjFhGyg4FBwi3UbzYsIrzu/PwrkqJoyWgkPBIdLttFRMuHDuaGarmLBVFBwKDpFuS8WE50bBoeAQ6fYaiwl/uXwb28urVEx4FgoOBYeIhFRM2DoKDgWHiDRzsphwWRFrt3fBYkJ3aMNYjoJDwSEiZ9AligndYf/7ULwKilfA3nfhng2QfG69qNMFh/pkIiJAYUEOj30ph/f3HOXBZUU8snIbj79e3LGLCd2h/CMoXgnbVwaBcaw82Nd7KBTMgpoK6BHbx5DV4xARaUGHLCZ0hwNFQVAUh0FRuS/Ylz0YRswKwmLELOhb0Oav060qBYeInIN9R0/wq1Xb+c2akohiwlFMGZ4T/y93h0PFp/YoKnYH+3oOaAqJglmQM7JN4xktUXAoOESkDRqLCZ94fTuH4llMeHhHGBJhUBzZGWzPyoOCmWFYzIbc0TEPiuYUHAoOEYmBYzV1PLN2J4+s2HaymPDuy0Yzb8I5FhMe2RXRo1gJh0uC7T1ygqAYMTsIi7zz4h4UzSk4FBwiEkPnXExYsTcMiRVBj+LgtmB7Rp+IHsUsyBsLSYktSlRwKDhEJA7qG5w/btrL4qVbTxYT3jFrJDc1FhNW7m+67bR9JRzYEnwwvTcMvzQco5gJAyYmPCiaU3AoOEQkjhqLCX/96puk7Xydy9I+4MrMLeQeC3sUadkw/JKgR1EwEwZdCEnJiW30WaiOQ0QkHo4dhJLXsOJVzNm+kjn734M0OGEZvFHxCd60m+g74Qquvuqv6N+nZ6JbGxMKDhGRaBw/DDtWN41T7N0EOKT0gGEXw4T7oWA2GUMuov/+42xfVsQv3trNP7+9ks8V5vM3s0cyPDcr0VfRJrpVJSJyJtUVULI6CIntK2HvO+ANkJwOQ6c1DWYPmQIp6S2eouRAUEz4/PqgmPDTFwTFhGMHdeyVCTXGoeAQkdaoroSda5oej929EbweklIhf2pTwV3+VEiNbh6rxmLC364poaq9iwnPgYJDwSEiLak5BjvfaKql2P0mNNRBUkrQi2jsUeRPg7TYzFd1+FgNT60u4fHXgmLCaSNyWNQBVyZUcCg4RASg9gSUrm2awqN0HTTUgiXD4MlNPYph0yEtvmMRzYsJxw8OViY852LCGFNwKDhEuqe6aihd31RLsXMt1FeDJQWPxDZO4TFsOqRnJ6SJNXUNYTFhEds60MqECg4Fh0j3UFcT3G5qvPW0cy3UHQcMBk4Mp/CYCcMugR59Et3aUzQWEy5ZtpX3drdQTNjOEhIcZjYP+BmQDDzq7g80278AWATUA5XAXe6+2cy+AHw74tALgIvcfaOZLQMGAcfDfVe5+/4ztUPBIdKF1dfB7reaphrfsQZqjwX7BkxoKrgbfilkdsxB6ObcnRVbylm8dGtCVyZs9+Aws2TgI+BKoBRYB9zk7psjjunl7kfD1/OBhe4+r9l5JgJ/cPdR4ftlwN+6e6uTQMEh0oU01MOet5t6FDtWQ01lsC9vbNMUHsNnQlZuYtsaAxtKDrJkaRF/CVcm/ML04dzRTisTJqJyfBqw1d23hQ14FrgWOBkcjaERygJaSrGbgGfj2E4R6cga6mHfpqbHY0teh+rwn45+n4ALrg97FbOgZ15i2xoHU4bn8KuIlQkfXbmNJ14r5rNT8llwWWKKCePZ4/gcMM/d7wjf3wpc7O73NDtuEfBNIA243N23NNtfBFzr7pvC98uAXILbW78DfuAtXISZ3QXcBTBs2LApJSUlsb1AEYmPhgbYv7mpR1HyGpw4HOzLGRUx1fhMyB6Y0KYmQnsWEybiVlWrgiPi+JuBT7n7bRHbLiYYG5kYsW2Iu+8ys2yC4PiNuz91prboVpVIB+YOZR9ETDX+Ghw/GOzrWxBONR4GRe8hCW1qR9K8mPDy8/uzKMbFhIm4VbULGBrxPj/cdjrPAg8223Yj8EzkBnffFf5cYWZPE9wSO2NwiEgH4g7lW5qm8CheBcfKg329h8In5jWNU/QZlti2dmADemXwP68ey6I5o3lydTGPv7adzz64mmkjclg4ZxSXfSIvbsWE8QyOdcAYMxtBEBg3AjdHHmBmYyJuTV0DbInYlwRcD8yK2JYC9HH3cjNLBT4N/DmO1yAibeUeLFa0fUVTLUXlvmBf9mAYfUVTdXaf4e2+yl1n1zszlXuvGMMds0bwzNqdPLpyG196fF1ciwnjFhzuXmdm9wCvEDyO+5i7v2dm3wfWu/uLwD1m9kmgFjgE3BZxitnAzsbB9VA68EoYGskEofFIvK5BRM6BOxwqPnXxoordwb6eA5pComAW5IxUUMRIZloKX5k5glunDz9ZTPiN5zYydcRc+mfH9gksFQCKSNsd3tEUEsUr4cjOYHtWXtNyqAWzoN8YBUU7qW9w3t9zlAlDep/zObSQk4jEzpFdQVA0jlMcDp9a7JETBMWMrwU/552voEiQ5CRrU2iciYJDRM6uYm/YowjHKQ6Gd5Az+gQBMX1h8HP/cR1u3WyJPQWHiHxcZVnTFB7bV8KB8LmV9F4wfAYUfiUYpxgwocOvmy2xp+AQEag6ACURYxRlHwTb03oGkwFedGswRjHoQgWFKDhEuqXjh4JCu8Yexf73gu2pmcH04hfcEFRnD5oEyfpnQk6lPxEi3cGJI8EcT409ir3vAg4pGTD0Yrj8/qA6e8hFkNx+s69K56TgEOmKqiugZHXTOMWet8EbIDkdhk6DOd8NxiiGTIGU9ES3VjoZBYdIV1BTFUwv3lhLsfst8HpISoX8qTD728EYRf5USI3/dNzStSk4RDqjmmOw842wlmIl7NoADXWQlBL0ImZ+I+hR5E+DtMxEt1a6GAWHSGdQewJK1zUNZu9aD/U1YMkweDJc+tWgRzH0YkjvmejWShen4BDpiOqqg15E42D2zrVQXw2WFDwSe/GCICiGTYeM2K/DIHImCg6RjqC+Fna92TSFx861UHccMBg4EabeEdx6GnYJ9OiT6NZKN6fgEEmE+jrYs7FpCo8db0BtVbBvwASYclvQoxh+KWTGbmEekVhQcIi0h4b64JHYxqnGS1ZDTUWwL28sTLo56FEMnwlZuYltq8hZKDhE4qGhAfa927TCXcnrUH0k2Jc7Bi74fNNU4z3zEttWkSgpOERioaEB9m9u6lEUr4ITh4N9OSNh/HXBFB4FMyF7YCJbKtJmCg6Rc+EeTATYONV4yWtw7ECwr89wGPvpYAqPgpnQe0hi2yoSYwoOkdZwh/ItTVN4FK+CqrJgX++hMOZT4XKoM6HPsMS2VSTOFBwiLXEPFitqLLgrXgWVe4N92YNh1OXhGMVM6FugVe6kW1FwiDQ6VNxUcFe8Co7uCrb3HBCExIhwMDtnpIJCujUFh3Rfh3ee2qM4siPYntmv6bZTwWzoN0ZBIRJBwSHdx9HdYUisCILiUHGwvUdOEBKXfjUIjLzzFRQiZ6DgkK6rYl/YowiD4mBRsD2jTxAUjfM99R8HSUkJbapIZ6LgkK6jsiyijmIllH8UbE/vFUzdUXh70KMYMEHrZou0gYJDOq+qA1CyqmnxorL3g+1pPYPJACffEvQoBl2ooBCJIQWHdB7HD526bva+TcH21MxgevELrg+qswddqHWzReJIwSEd14kjTetmb18Be98FHFIyggWLLr8/eOpp8GRISUt0a0W6DQWHdBzVFbBjTdNU43veBm+A5HQYOg3mfDcYoxgyBVLSE91akW5LwSGJU1MVBEVjLcXut8DrISkV8qfC7G8HTz/lT4PUjES3VkRCCg5pP7XHYecbTQV3uzZAQy0kpQS9iJnfCIJi6MWQlpno1orIaSg4JH5qT0DpuqZHZEvXQX0NWHIwLnHpPWFQTIf0nolurYi0koJDYqeuBnatb3rqaedaqK8GSwqedLr4b4LB7GHTIaNXolsrIudIwSHnrr4Wdr3ZNNX4jjeg7jhgMHACTL0jGMwedgn06JPo1opIjCg4pPXq62DPxqbB7B1roLYq2Nd/PEy5LSi4G34pZOYktKkiEj8KDjm9hnrY+07TraeS1VBTEezLOx8m3Rz0KIbPhKzcxLZVRNqNgkOaNDQE1diNPYqS16H6SLAvdwxc8PmmxYt69k9sW0UkYRQc3VlDQzC/U+TiRScOB/tyRsL464IpPIbPgF6DEtlSEelAFBzdiTuUfdg0hUfJa3DsQLCvz3AY++ngqaeCmdB7SGLbKiIdVlyDw8zmAT8DkoFH3f2BZvsXAIuAeqASuMvdN5vZF4BvRxx6AXCRu280synAE0AP4CXga+7u8byOTssdDmxtmsKjeBVUlQX7eg+FMZ8KQmLELOgzLLFtFZFOw+L1b66ZJQMfAVcCpcA64CZ33xxxTC93Pxq+ng8sdPd5zc4zEfiDu48K368F7gXeIAiOn7v7y2dqS2Fhoa9fvz5m19ZhucPBbacuh1q5N9iXPThiOdRZ0LdAq9yJyBmZ2QZ3L2y+PZ49jmnAVnffFjbgWeBa4GRwNIZGKAtoKcVuAp4NzzEI6OXua8L3TwHXAWcMji7tUHFTSBSvhKO7gu09BzSFxIjZwZiFgkJEYiCewTEE2BnxvhS4uPlBZrYI+CaQBlzewnluIAicxnOWNjtnizfjzewu4C6AYcO60G2YwzubQmL7SjiyI9ie2S+87fTNYJyi3xgFhYjERcIHx919MbDYzG4G7gdua9xnZhcDx9x90zmc92HgYQhuVcWoue3v6J6IdbNXBj0MgB45UDADLv1qcAsq73wFhYi0i3gGxy5gaMT7/HDb6TwLPNhs243AM83OmR/FOTufin1NU3hsXwkHi4LtGb2DQruLFwS3n/qPg6SkxLZVRLqleAbHOmCMmY0g+Mf9RuDmyAPMbIy7bwnfXgNsidiXBFwPzGrc5u57zOyomU0nGBz/IvCLOF5D/FWVRwxmr4Tyj4Lt6b2CqTsKbw96FAMmaN1sEekQ4hYc7l5nZvcArxA8jvuYu79nZt8H1rv7i8A9ZvZJoBY4RMRtKmA2sLNxcD3CQpoex32ZzjYwfuzgqWMUZe8H29N6BpMBTr4l6FEMvACSE34nUUTkY+L2OG5HktDHcY8fCqbuaOxR7AuHa1Izg+nFC2YFPwZPguTUxLRRRKQFiXgct3s6cSSYDLBxnGLPO4BDSkawst3l94dBcRGkpCW6tSIiUVNwtFV1xanrZu/ZCN4AyekwdBrMuS8IivxCSElPdGtFRNpMwRGtmqowKMJxil1vgtdDUirkT4VZfxsMZudPhdQeiW6tiEjMKTjOpvZ4sARqY49i1wZoqIWkFBgyBWZ+PehRDL0Y0jIT3VoRkbhTcJzJ0zdA0atQXwOWDIMnwyWLgh7F0OmQ3jPRLRQRaXcKjjPJGRlM3VEwO3gCKqNXolskIpJwCo4zmffDRLdARKTD0ZwVIiISFQWHiIhERcEhIiJRUXCIiEhUFBwiIhIVBYeIiERFwSEiIlFRcIiISFS6xXocZlYGlJzjx/sB5TFsTmega+4euts1d7frhbZf83B3z2u+sVsER1uY2fqWFjLpynTN3UN3u+budr0Qv2vWrSoREYmKgkNERKKi4Di7hxPdgATQNXcP3e2au9v1QpyuWWMcIiISFfU4REQkKgoOERGJioIjZGbzzOxDM9tqZve1sD/dzP4j3P+GmRUkoJkx04rr/aaZbTazd8zsL2Y2PBHtjKWzXXPEcZ81MzezTv/oZmuu2cyuD3+v3zOzp9u7jbHWij/bw8xsqZm9Ff75vjoR7YwVM3vMzPab2abT7Dcz+3n46/GOmV3U5i91927/A0gGioCRQBrwNjCu2TELgV+Gr28E/iPR7Y7z9c4FMsPXd3fm623tNYfHZQMrgDVAYaLb3Q6/z2OAt4C+4fv+iW53O1zzw8Dd4etxQHGi293Ga54NXARsOs3+q4GXAQOmA2+09TvV4whMA7a6+zZ3rwGeBa5tdsy1wJPh6+eBK8zM2rGNsXTW63X3pe5+LHy7Bshv5zbGWmt+jwH+X+BHwIn2bFyctOaa7wQWu/shAHff385tjLXWXLMDvcLXvYHd7di+mHP3FcDBMxxyLfCUB9YAfcxsUFu+U8ERGALsjHhfGm5r8Rh3rwOOALnt0rrYa831RvoKwf9YOrOzXnPYhR/q7v/dng2Lo9b8Pn8C+ISZvWZma8xsXru1Lj5ac83fA24xs1LgJeCr7dO0hIn27/tZpbSpOdLlmdktQCFwWaLbEk9mlgT8G/ClBDelvaUQ3K6aQ9CrXGFmE939cCIbFWc3AU+4+0/M7BLg12Y2wd0bEt2wzkI9jsAuYGjE+/xwW4vHmFkKQRf3QLu0LvZac72Y2SeB/wXMd/fqdmpbvJztmrOBCcAyMysmuBf8YicfIG/N73Mp8KK717r7duAjgiDprFpzzV8BngNw99VABsFkgF1Vq/6+R0PBEVgHjDGzEWaWRjD4/WKzY14Ebgtffw541cORp07orNdrZpOBhwhCo7Pf94azXLO7H3H3fu5e4O4FBOM68919fWKaGxOt+XP9B4LeBmbWj+DW1bZ2bGOsteaadwBXAJjZWILgKGvXVravF4Evhk9XTQeOuPuetpxQt6oIxizM7B7gFYKnMh5z9/fM7PvAend/EfgVQZd2K8FA1I2Ja3HbtPJ6fwz0BP4zfAZgh7vPT1ij26iV19yltPKaXwGuMrPNQD3wbXfvrD3p1l7zt4BHzOwbBAPlX+rE/wnEzJ4hCP9+4bjNPwCpAO7+S4JxnKuBrcAx4Mtt/s5O/OslIiIJoFtVIiISFQWHiIhERcEhIiJRUXCIiEhUFBwiIhIVBYdIB2Zmc8zs/yS6HSKRFBwiIhIVBYdIDJjZLWa21sw2mtlDZpZsZpVm9u/hOhd/MbO88NhJ4YSC75jZC2bWN9w+2sz+bGZvm9mbZjYqPH1PM3vezD4ws9924lmZpYtQcIi0UThtxQ3ADHefRFCB/QUgi6BaeTywnKCiF+Ap4DvufgHwbsT23xJMcX4hcCnQOC3EZODrBGtHjARmxPmSRM5IU46ItN0VwBRgXdgZ6AHsBxqA/wiP+Q3wezPrDfRx9+Xh9icJpnXJBoa4+wsA7n4CIDzfWncvDd9vBAqAVXG/KpHTUHCItJ0BT7r7d0/ZaPb3zY471/l9Imcmrkd/byXBdKtKpO3+AnzOzPoDmFmOBWu0JxHMpAxwM7DK3Y8Ah8xsVrj9VmC5u1cApWZ2XXiOdDPLbM+LEGkt/c9FpI3cfbOZ3Q/8KVwQqhZYBFQB08J9+wnGQSCYnv+XYTBso2m20luBh8KZXGuBz7fjZYi0mmbHFYkTM6t0956JbodIrOlWlYiIREU9DhERiYp6HCIiEhUFh4iIREXBISIiUVFwiIhIVBQcIiISlf8LPCoYUhBHB7gAAAAASUVORK5CYII=\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"source": [
"from sklearn import metrics\n",
"y_pred = model.predict(test_ds)\n",
"cf_matrix = metrics.confusion_matrix(y_test.argmax(axis=1), y_pred.argmax(axis=1))"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "EmocaMGweYW8",
"outputId": "609dc773-5ac9-4872-a40f-2153830e7781"
},
"execution_count": 20,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"7/7 [==============================] - 8s 960ms/step\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"cf_matrix"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "Pl-MrfgThVc0",
"outputId": "f2533002-cbc5-4c71-a399-2b89bfd956b7"
},
"execution_count": 21,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([[ 0, 67, 0, 0],\n",
" [ 0, 44, 0, 0],\n",
" [ 0, 47, 0, 0],\n",
" [ 0, 48, 0, 0]])"
]
},
"metadata": {},
"execution_count": 21
}
]
},
{
"cell_type": "code",
"source": [
"modelC = tf.keras.models.Sequential([\n",
" tf.keras.layers.Conv2D(32,(3,3),activation=\"relu\",input_shape=(100,100,3)),\n",
" tf.keras.layers.Conv2D(128,(3,3),activation=\"relu\"),\n",
" tf.keras.layers.MaxPooling2D((2,2)),\n",
" tf.keras.layers.Flatten(),\n",
" tf.keras.layers.Dense(512,activation=\"relu\"),\n",
" tf.keras.layers.Dropout(0.2),\n",
" tf.keras.layers.Dense(4,activation=\"sigmoid\")])"
],
"metadata": {
"id": "IoDofUJkXXDj"
},
"execution_count": 28,
"outputs": []
},
{
"cell_type": "code",
"source": [
"modelC.compile(\n",
" \n",
" optimizer = tf.keras.optimizers.Adam(),\n",
" loss='binary_crossentropy',\n",
" metrics = ['accuracy'])"
],
"metadata": {
"id": "C3wO1YkpEN1a"
},
"execution_count": 29,
"outputs": []
},
{
"cell_type": "code",
"source": [
"modelC.summary()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "pzrhOkZsMopw",
"outputId": "8d4471b8-d3f2-440d-8829-a4896758bd48"
},
"execution_count": 30,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Model: \"sequential_2\"\n",
"_________________________________________________________________\n",
" Layer (type) Output Shape Param # \n",
"=================================================================\n",
" conv2d_2 (Conv2D) (None, 98, 98, 32) 896 \n",
" \n",
" conv2d_3 (Conv2D) (None, 96, 96, 128) 36992 \n",
" \n",
" max_pooling2d_1 (MaxPooling (None, 48, 48, 128) 0 \n",
" 2D) \n",
" \n",
" flatten_2 (Flatten) (None, 294912) 0 \n",
" \n",
" dense_5 (Dense) (None, 512) 150995456 \n",
" \n",
" dropout_2 (Dropout) (None, 512) 0 \n",
" \n",
" dense_6 (Dense) (None, 4) 2052 \n",
" \n",
"=================================================================\n",
"Total params: 151,035,396\n",
"Trainable params: 151,035,396\n",
"Non-trainable params: 0\n",
"_________________________________________________________________\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"historyC = modelC.fit(train_ds,verbose=1,epochs=1,validation_data=val_ds)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "ri2pdrv8M6kS",
"outputId": "1b46759a-3665-49f6-e36b-6739fbe12375"
},
"execution_count": 31,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"18/18 [==============================] - 106s 6s/step - loss: 330.9503 - accuracy: 0.2455 - val_loss: 0.6976 - val_accuracy: 0.2131\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"plt.plot(historyC.history['accuracy'])\n",
"plt.plot(historyC.history['val_accuracy'])\n",
"plt.title('Model accuracy')\n",
"plt.ylabel('accuracy')\n",
"plt.xlabel('epoch')\n",
"plt.legend(['train', 'val'], loc='upper left')\n",
"plt.show()\n",
"\n",
"plt.plot(historyC.history['loss'])\n",
"plt.plot(historyC.history['val_loss'])\n",
"plt.title('Model loss')\n",
"plt.ylabel('loss')\n",
"plt.xlabel('epoch')\n",
"plt.legend(['train', 'val'], loc='upper left')\n",
"plt.show()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 573
},
"id": "QY2ATc-JiHES",
"outputId": "a9ad1842-8a64-4884-808a-b91fe6870f4b"
},
"execution_count": 35,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
],
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
],
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"source": [
"from sklearn import metrics\n",
"y_pred = modelC.predict(test_ds)\n",
"cf_matrixC = metrics.confusion_matrix(y_test.argmax(axis=1), y_pred.argmax(axis=1))"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "b4jUDvlLi8wG",
"outputId": "4be60f43-af29-478b-b4dc-fbf799c93688"
},
"execution_count": 38,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"7/7 [==============================] - 6s 720ms/step\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"cf_matrixC"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "ERjdCWaFjFLh",
"outputId": "7d9da120-d84c-4434-9469-bc2adbf32e39"
},
"execution_count": 39,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([[14, 6, 41, 6],\n",
" [10, 5, 25, 4],\n",
" [ 6, 1, 31, 9],\n",
" [ 8, 5, 30, 5]])"
]
},
"metadata": {},
"execution_count": 39
}
]
},
{
"cell_type": "code",
"source": [
"modelR = tf.keras.applications.resnet50.ResNet50(\n",
" include_top=True,\n",
" weights='imagenet',\n",
" input_tensor=None,\n",
" input_shape=(224,224,3),\n",
" pooling=None,\n",
" classes=1000,\n",
")"
],
"metadata": {
"id": "GHwB_WpELBKd"
},
"execution_count": 117,
"outputs": []
},
{
"cell_type": "code",
"source": [
"modelR.compile(\n",
" \n",
" optimizer = tf.keras.optimizers.Adam(),\n",
" loss='binary_crossentropy',\n",
" metrics = ['accuracy'])"
],
"metadata": {
"id": "CKaqkjzNa8yq"
},
"execution_count": 122,
"outputs": []
},
{
"cell_type": "code",
"source": [
"modelR.summary()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "oJGkTbbmba5v",
"outputId": "f59b6ebd-e26e-4d1a-e3e8-e89986215147"
},
"execution_count": 124,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Model: \"resnet50\"\n",
"__________________________________________________________________________________________________\n",
" Layer (type) Output Shape Param # Connected to \n",
"==================================================================================================\n",
" input_2 (InputLayer) [(None, 224, 224, 3 0 [] \n",
" )] \n",
" \n",
" conv1_pad (ZeroPadding2D) (None, 230, 230, 3) 0 ['input_2[0][0]'] \n",
" \n",
" conv1_conv (Conv2D) (None, 112, 112, 64 9472 ['conv1_pad[0][0]'] \n",
" ) \n",
" \n",
" conv1_bn (BatchNormalization) (None, 112, 112, 64 256 ['conv1_conv[0][0]'] \n",
" ) \n",
" \n",
" conv1_relu (Activation) (None, 112, 112, 64 0 ['conv1_bn[0][0]'] \n",
" ) \n",
" \n",
" pool1_pad (ZeroPadding2D) (None, 114, 114, 64 0 ['conv1_relu[0][0]'] \n",
" ) \n",
" \n",
" pool1_pool (MaxPooling2D) (None, 56, 56, 64) 0 ['pool1_pad[0][0]'] \n",
" \n",
" conv2_block1_1_conv (Conv2D) (None, 56, 56, 64) 4160 ['pool1_pool[0][0]'] \n",
" \n",
" conv2_block1_1_bn (BatchNormal (None, 56, 56, 64) 256 ['conv2_block1_1_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv2_block1_1_relu (Activatio (None, 56, 56, 64) 0 ['conv2_block1_1_bn[0][0]'] \n",
" n) \n",
" \n",
" conv2_block1_2_conv (Conv2D) (None, 56, 56, 64) 36928 ['conv2_block1_1_relu[0][0]'] \n",
" \n",
" conv2_block1_2_bn (BatchNormal (None, 56, 56, 64) 256 ['conv2_block1_2_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv2_block1_2_relu (Activatio (None, 56, 56, 64) 0 ['conv2_block1_2_bn[0][0]'] \n",
" n) \n",
" \n",
" conv2_block1_0_conv (Conv2D) (None, 56, 56, 256) 16640 ['pool1_pool[0][0]'] \n",
" \n",
" conv2_block1_3_conv (Conv2D) (None, 56, 56, 256) 16640 ['conv2_block1_2_relu[0][0]'] \n",
" \n",
" conv2_block1_0_bn (BatchNormal (None, 56, 56, 256) 1024 ['conv2_block1_0_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv2_block1_3_bn (BatchNormal (None, 56, 56, 256) 1024 ['conv2_block1_3_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv2_block1_add (Add) (None, 56, 56, 256) 0 ['conv2_block1_0_bn[0][0]', \n",
" 'conv2_block1_3_bn[0][0]'] \n",
" \n",
" conv2_block1_out (Activation) (None, 56, 56, 256) 0 ['conv2_block1_add[0][0]'] \n",
" \n",
" conv2_block2_1_conv (Conv2D) (None, 56, 56, 64) 16448 ['conv2_block1_out[0][0]'] \n",
" \n",
" conv2_block2_1_bn (BatchNormal (None, 56, 56, 64) 256 ['conv2_block2_1_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv2_block2_1_relu (Activatio (None, 56, 56, 64) 0 ['conv2_block2_1_bn[0][0]'] \n",
" n) \n",
" \n",
" conv2_block2_2_conv (Conv2D) (None, 56, 56, 64) 36928 ['conv2_block2_1_relu[0][0]'] \n",
" \n",
" conv2_block2_2_bn (BatchNormal (None, 56, 56, 64) 256 ['conv2_block2_2_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv2_block2_2_relu (Activatio (None, 56, 56, 64) 0 ['conv2_block2_2_bn[0][0]'] \n",
" n) \n",
" \n",
" conv2_block2_3_conv (Conv2D) (None, 56, 56, 256) 16640 ['conv2_block2_2_relu[0][0]'] \n",
" \n",
" conv2_block2_3_bn (BatchNormal (None, 56, 56, 256) 1024 ['conv2_block2_3_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv2_block2_add (Add) (None, 56, 56, 256) 0 ['conv2_block1_out[0][0]', \n",
" 'conv2_block2_3_bn[0][0]'] \n",
" \n",
" conv2_block2_out (Activation) (None, 56, 56, 256) 0 ['conv2_block2_add[0][0]'] \n",
" \n",
" conv2_block3_1_conv (Conv2D) (None, 56, 56, 64) 16448 ['conv2_block2_out[0][0]'] \n",
" \n",
" conv2_block3_1_bn (BatchNormal (None, 56, 56, 64) 256 ['conv2_block3_1_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv2_block3_1_relu (Activatio (None, 56, 56, 64) 0 ['conv2_block3_1_bn[0][0]'] \n",
" n) \n",
" \n",
" conv2_block3_2_conv (Conv2D) (None, 56, 56, 64) 36928 ['conv2_block3_1_relu[0][0]'] \n",
" \n",
" conv2_block3_2_bn (BatchNormal (None, 56, 56, 64) 256 ['conv2_block3_2_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv2_block3_2_relu (Activatio (None, 56, 56, 64) 0 ['conv2_block3_2_bn[0][0]'] \n",
" n) \n",
" \n",
" conv2_block3_3_conv (Conv2D) (None, 56, 56, 256) 16640 ['conv2_block3_2_relu[0][0]'] \n",
" \n",
" conv2_block3_3_bn (BatchNormal (None, 56, 56, 256) 1024 ['conv2_block3_3_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv2_block3_add (Add) (None, 56, 56, 256) 0 ['conv2_block2_out[0][0]', \n",
" 'conv2_block3_3_bn[0][0]'] \n",
" \n",
" conv2_block3_out (Activation) (None, 56, 56, 256) 0 ['conv2_block3_add[0][0]'] \n",
" \n",
" conv3_block1_1_conv (Conv2D) (None, 28, 28, 128) 32896 ['conv2_block3_out[0][0]'] \n",
" \n",
" conv3_block1_1_bn (BatchNormal (None, 28, 28, 128) 512 ['conv3_block1_1_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv3_block1_1_relu (Activatio (None, 28, 28, 128) 0 ['conv3_block1_1_bn[0][0]'] \n",
" n) \n",
" \n",
" conv3_block1_2_conv (Conv2D) (None, 28, 28, 128) 147584 ['conv3_block1_1_relu[0][0]'] \n",
" \n",
" conv3_block1_2_bn (BatchNormal (None, 28, 28, 128) 512 ['conv3_block1_2_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv3_block1_2_relu (Activatio (None, 28, 28, 128) 0 ['conv3_block1_2_bn[0][0]'] \n",
" n) \n",
" \n",
" conv3_block1_0_conv (Conv2D) (None, 28, 28, 512) 131584 ['conv2_block3_out[0][0]'] \n",
" \n",
" conv3_block1_3_conv (Conv2D) (None, 28, 28, 512) 66048 ['conv3_block1_2_relu[0][0]'] \n",
" \n",
" conv3_block1_0_bn (BatchNormal (None, 28, 28, 512) 2048 ['conv3_block1_0_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv3_block1_3_bn (BatchNormal (None, 28, 28, 512) 2048 ['conv3_block1_3_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv3_block1_add (Add) (None, 28, 28, 512) 0 ['conv3_block1_0_bn[0][0]', \n",
" 'conv3_block1_3_bn[0][0]'] \n",
" \n",
" conv3_block1_out (Activation) (None, 28, 28, 512) 0 ['conv3_block1_add[0][0]'] \n",
" \n",
" conv3_block2_1_conv (Conv2D) (None, 28, 28, 128) 65664 ['conv3_block1_out[0][0]'] \n",
" \n",
" conv3_block2_1_bn (BatchNormal (None, 28, 28, 128) 512 ['conv3_block2_1_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv3_block2_1_relu (Activatio (None, 28, 28, 128) 0 ['conv3_block2_1_bn[0][0]'] \n",
" n) \n",
" \n",
" conv3_block2_2_conv (Conv2D) (None, 28, 28, 128) 147584 ['conv3_block2_1_relu[0][0]'] \n",
" \n",
" conv3_block2_2_bn (BatchNormal (None, 28, 28, 128) 512 ['conv3_block2_2_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv3_block2_2_relu (Activatio (None, 28, 28, 128) 0 ['conv3_block2_2_bn[0][0]'] \n",
" n) \n",
" \n",
" conv3_block2_3_conv (Conv2D) (None, 28, 28, 512) 66048 ['conv3_block2_2_relu[0][0]'] \n",
" \n",
" conv3_block2_3_bn (BatchNormal (None, 28, 28, 512) 2048 ['conv3_block2_3_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv3_block2_add (Add) (None, 28, 28, 512) 0 ['conv3_block1_out[0][0]', \n",
" 'conv3_block2_3_bn[0][0]'] \n",
" \n",
" conv3_block2_out (Activation) (None, 28, 28, 512) 0 ['conv3_block2_add[0][0]'] \n",
" \n",
" conv3_block3_1_conv (Conv2D) (None, 28, 28, 128) 65664 ['conv3_block2_out[0][0]'] \n",
" \n",
" conv3_block3_1_bn (BatchNormal (None, 28, 28, 128) 512 ['conv3_block3_1_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv3_block3_1_relu (Activatio (None, 28, 28, 128) 0 ['conv3_block3_1_bn[0][0]'] \n",
" n) \n",
" \n",
" conv3_block3_2_conv (Conv2D) (None, 28, 28, 128) 147584 ['conv3_block3_1_relu[0][0]'] \n",
" \n",
" conv3_block3_2_bn (BatchNormal (None, 28, 28, 128) 512 ['conv3_block3_2_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv3_block3_2_relu (Activatio (None, 28, 28, 128) 0 ['conv3_block3_2_bn[0][0]'] \n",
" n) \n",
" \n",
" conv3_block3_3_conv (Conv2D) (None, 28, 28, 512) 66048 ['conv3_block3_2_relu[0][0]'] \n",
" \n",
" conv3_block3_3_bn (BatchNormal (None, 28, 28, 512) 2048 ['conv3_block3_3_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv3_block3_add (Add) (None, 28, 28, 512) 0 ['conv3_block2_out[0][0]', \n",
" 'conv3_block3_3_bn[0][0]'] \n",
" \n",
" conv3_block3_out (Activation) (None, 28, 28, 512) 0 ['conv3_block3_add[0][0]'] \n",
" \n",
" conv3_block4_1_conv (Conv2D) (None, 28, 28, 128) 65664 ['conv3_block3_out[0][0]'] \n",
" \n",
" conv3_block4_1_bn (BatchNormal (None, 28, 28, 128) 512 ['conv3_block4_1_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv3_block4_1_relu (Activatio (None, 28, 28, 128) 0 ['conv3_block4_1_bn[0][0]'] \n",
" n) \n",
" \n",
" conv3_block4_2_conv (Conv2D) (None, 28, 28, 128) 147584 ['conv3_block4_1_relu[0][0]'] \n",
" \n",
" conv3_block4_2_bn (BatchNormal (None, 28, 28, 128) 512 ['conv3_block4_2_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv3_block4_2_relu (Activatio (None, 28, 28, 128) 0 ['conv3_block4_2_bn[0][0]'] \n",
" n) \n",
" \n",
" conv3_block4_3_conv (Conv2D) (None, 28, 28, 512) 66048 ['conv3_block4_2_relu[0][0]'] \n",
" \n",
" conv3_block4_3_bn (BatchNormal (None, 28, 28, 512) 2048 ['conv3_block4_3_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv3_block4_add (Add) (None, 28, 28, 512) 0 ['conv3_block3_out[0][0]', \n",
" 'conv3_block4_3_bn[0][0]'] \n",
" \n",
" conv3_block4_out (Activation) (None, 28, 28, 512) 0 ['conv3_block4_add[0][0]'] \n",
" \n",
" conv4_block1_1_conv (Conv2D) (None, 14, 14, 256) 131328 ['conv3_block4_out[0][0]'] \n",
" \n",
" conv4_block1_1_bn (BatchNormal (None, 14, 14, 256) 1024 ['conv4_block1_1_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv4_block1_1_relu (Activatio (None, 14, 14, 256) 0 ['conv4_block1_1_bn[0][0]'] \n",
" n) \n",
" \n",
" conv4_block1_2_conv (Conv2D) (None, 14, 14, 256) 590080 ['conv4_block1_1_relu[0][0]'] \n",
" \n",
" conv4_block1_2_bn (BatchNormal (None, 14, 14, 256) 1024 ['conv4_block1_2_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv4_block1_2_relu (Activatio (None, 14, 14, 256) 0 ['conv4_block1_2_bn[0][0]'] \n",
" n) \n",
" \n",
" conv4_block1_0_conv (Conv2D) (None, 14, 14, 1024 525312 ['conv3_block4_out[0][0]'] \n",
" ) \n",
" \n",
" conv4_block1_3_conv (Conv2D) (None, 14, 14, 1024 263168 ['conv4_block1_2_relu[0][0]'] \n",
" ) \n",
" \n",
" conv4_block1_0_bn (BatchNormal (None, 14, 14, 1024 4096 ['conv4_block1_0_conv[0][0]'] \n",
" ization) ) \n",
" \n",
" conv4_block1_3_bn (BatchNormal (None, 14, 14, 1024 4096 ['conv4_block1_3_conv[0][0]'] \n",
" ization) ) \n",
" \n",
" conv4_block1_add (Add) (None, 14, 14, 1024 0 ['conv4_block1_0_bn[0][0]', \n",
" ) 'conv4_block1_3_bn[0][0]'] \n",
" \n",
" conv4_block1_out (Activation) (None, 14, 14, 1024 0 ['conv4_block1_add[0][0]'] \n",
" ) \n",
" \n",
" conv4_block2_1_conv (Conv2D) (None, 14, 14, 256) 262400 ['conv4_block1_out[0][0]'] \n",
" \n",
" conv4_block2_1_bn (BatchNormal (None, 14, 14, 256) 1024 ['conv4_block2_1_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv4_block2_1_relu (Activatio (None, 14, 14, 256) 0 ['conv4_block2_1_bn[0][0]'] \n",
" n) \n",
" \n",
" conv4_block2_2_conv (Conv2D) (None, 14, 14, 256) 590080 ['conv4_block2_1_relu[0][0]'] \n",
" \n",
" conv4_block2_2_bn (BatchNormal (None, 14, 14, 256) 1024 ['conv4_block2_2_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv4_block2_2_relu (Activatio (None, 14, 14, 256) 0 ['conv4_block2_2_bn[0][0]'] \n",
" n) \n",
" \n",
" conv4_block2_3_conv (Conv2D) (None, 14, 14, 1024 263168 ['conv4_block2_2_relu[0][0]'] \n",
" ) \n",
" \n",
" conv4_block2_3_bn (BatchNormal (None, 14, 14, 1024 4096 ['conv4_block2_3_conv[0][0]'] \n",
" ization) ) \n",
" \n",
" conv4_block2_add (Add) (None, 14, 14, 1024 0 ['conv4_block1_out[0][0]', \n",
" ) 'conv4_block2_3_bn[0][0]'] \n",
" \n",
" conv4_block2_out (Activation) (None, 14, 14, 1024 0 ['conv4_block2_add[0][0]'] \n",
" ) \n",
" \n",
" conv4_block3_1_conv (Conv2D) (None, 14, 14, 256) 262400 ['conv4_block2_out[0][0]'] \n",
" \n",
" conv4_block3_1_bn (BatchNormal (None, 14, 14, 256) 1024 ['conv4_block3_1_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv4_block3_1_relu (Activatio (None, 14, 14, 256) 0 ['conv4_block3_1_bn[0][0]'] \n",
" n) \n",
" \n",
" conv4_block3_2_conv (Conv2D) (None, 14, 14, 256) 590080 ['conv4_block3_1_relu[0][0]'] \n",
" \n",
" conv4_block3_2_bn (BatchNormal (None, 14, 14, 256) 1024 ['conv4_block3_2_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv4_block3_2_relu (Activatio (None, 14, 14, 256) 0 ['conv4_block3_2_bn[0][0]'] \n",
" n) \n",
" \n",
" conv4_block3_3_conv (Conv2D) (None, 14, 14, 1024 263168 ['conv4_block3_2_relu[0][0]'] \n",
" ) \n",
" \n",
" conv4_block3_3_bn (BatchNormal (None, 14, 14, 1024 4096 ['conv4_block3_3_conv[0][0]'] \n",
" ization) ) \n",
" \n",
" conv4_block3_add (Add) (None, 14, 14, 1024 0 ['conv4_block2_out[0][0]', \n",
" ) 'conv4_block3_3_bn[0][0]'] \n",
" \n",
" conv4_block3_out (Activation) (None, 14, 14, 1024 0 ['conv4_block3_add[0][0]'] \n",
" ) \n",
" \n",
" conv4_block4_1_conv (Conv2D) (None, 14, 14, 256) 262400 ['conv4_block3_out[0][0]'] \n",
" \n",
" conv4_block4_1_bn (BatchNormal (None, 14, 14, 256) 1024 ['conv4_block4_1_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv4_block4_1_relu (Activatio (None, 14, 14, 256) 0 ['conv4_block4_1_bn[0][0]'] \n",
" n) \n",
" \n",
" conv4_block4_2_conv (Conv2D) (None, 14, 14, 256) 590080 ['conv4_block4_1_relu[0][0]'] \n",
" \n",
" conv4_block4_2_bn (BatchNormal (None, 14, 14, 256) 1024 ['conv4_block4_2_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv4_block4_2_relu (Activatio (None, 14, 14, 256) 0 ['conv4_block4_2_bn[0][0]'] \n",
" n) \n",
" \n",
" conv4_block4_3_conv (Conv2D) (None, 14, 14, 1024 263168 ['conv4_block4_2_relu[0][0]'] \n",
" ) \n",
" \n",
" conv4_block4_3_bn (BatchNormal (None, 14, 14, 1024 4096 ['conv4_block4_3_conv[0][0]'] \n",
" ization) ) \n",
" \n",
" conv4_block4_add (Add) (None, 14, 14, 1024 0 ['conv4_block3_out[0][0]', \n",
" ) 'conv4_block4_3_bn[0][0]'] \n",
" \n",
" conv4_block4_out (Activation) (None, 14, 14, 1024 0 ['conv4_block4_add[0][0]'] \n",
" ) \n",
" \n",
" conv4_block5_1_conv (Conv2D) (None, 14, 14, 256) 262400 ['conv4_block4_out[0][0]'] \n",
" \n",
" conv4_block5_1_bn (BatchNormal (None, 14, 14, 256) 1024 ['conv4_block5_1_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv4_block5_1_relu (Activatio (None, 14, 14, 256) 0 ['conv4_block5_1_bn[0][0]'] \n",
" n) \n",
" \n",
" conv4_block5_2_conv (Conv2D) (None, 14, 14, 256) 590080 ['conv4_block5_1_relu[0][0]'] \n",
" \n",
" conv4_block5_2_bn (BatchNormal (None, 14, 14, 256) 1024 ['conv4_block5_2_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv4_block5_2_relu (Activatio (None, 14, 14, 256) 0 ['conv4_block5_2_bn[0][0]'] \n",
" n) \n",
" \n",
" conv4_block5_3_conv (Conv2D) (None, 14, 14, 1024 263168 ['conv4_block5_2_relu[0][0]'] \n",
" ) \n",
" \n",
" conv4_block5_3_bn (BatchNormal (None, 14, 14, 1024 4096 ['conv4_block5_3_conv[0][0]'] \n",
" ization) ) \n",
" \n",
" conv4_block5_add (Add) (None, 14, 14, 1024 0 ['conv4_block4_out[0][0]', \n",
" ) 'conv4_block5_3_bn[0][0]'] \n",
" \n",
" conv4_block5_out (Activation) (None, 14, 14, 1024 0 ['conv4_block5_add[0][0]'] \n",
" ) \n",
" \n",
" conv4_block6_1_conv (Conv2D) (None, 14, 14, 256) 262400 ['conv4_block5_out[0][0]'] \n",
" \n",
" conv4_block6_1_bn (BatchNormal (None, 14, 14, 256) 1024 ['conv4_block6_1_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv4_block6_1_relu (Activatio (None, 14, 14, 256) 0 ['conv4_block6_1_bn[0][0]'] \n",
" n) \n",
" \n",
" conv4_block6_2_conv (Conv2D) (None, 14, 14, 256) 590080 ['conv4_block6_1_relu[0][0]'] \n",
" \n",
" conv4_block6_2_bn (BatchNormal (None, 14, 14, 256) 1024 ['conv4_block6_2_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv4_block6_2_relu (Activatio (None, 14, 14, 256) 0 ['conv4_block6_2_bn[0][0]'] \n",
" n) \n",
" \n",
" conv4_block6_3_conv (Conv2D) (None, 14, 14, 1024 263168 ['conv4_block6_2_relu[0][0]'] \n",
" ) \n",
" \n",
" conv4_block6_3_bn (BatchNormal (None, 14, 14, 1024 4096 ['conv4_block6_3_conv[0][0]'] \n",
" ization) ) \n",
" \n",
" conv4_block6_add (Add) (None, 14, 14, 1024 0 ['conv4_block5_out[0][0]', \n",
" ) 'conv4_block6_3_bn[0][0]'] \n",
" \n",
" conv4_block6_out (Activation) (None, 14, 14, 1024 0 ['conv4_block6_add[0][0]'] \n",
" ) \n",
" \n",
" conv5_block1_1_conv (Conv2D) (None, 7, 7, 512) 524800 ['conv4_block6_out[0][0]'] \n",
" \n",
" conv5_block1_1_bn (BatchNormal (None, 7, 7, 512) 2048 ['conv5_block1_1_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv5_block1_1_relu (Activatio (None, 7, 7, 512) 0 ['conv5_block1_1_bn[0][0]'] \n",
" n) \n",
" \n",
" conv5_block1_2_conv (Conv2D) (None, 7, 7, 512) 2359808 ['conv5_block1_1_relu[0][0]'] \n",
" \n",
" conv5_block1_2_bn (BatchNormal (None, 7, 7, 512) 2048 ['conv5_block1_2_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv5_block1_2_relu (Activatio (None, 7, 7, 512) 0 ['conv5_block1_2_bn[0][0]'] \n",
" n) \n",
" \n",
" conv5_block1_0_conv (Conv2D) (None, 7, 7, 2048) 2099200 ['conv4_block6_out[0][0]'] \n",
" \n",
" conv5_block1_3_conv (Conv2D) (None, 7, 7, 2048) 1050624 ['conv5_block1_2_relu[0][0]'] \n",
" \n",
" conv5_block1_0_bn (BatchNormal (None, 7, 7, 2048) 8192 ['conv5_block1_0_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv5_block1_3_bn (BatchNormal (None, 7, 7, 2048) 8192 ['conv5_block1_3_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv5_block1_add (Add) (None, 7, 7, 2048) 0 ['conv5_block1_0_bn[0][0]', \n",
" 'conv5_block1_3_bn[0][0]'] \n",
" \n",
" conv5_block1_out (Activation) (None, 7, 7, 2048) 0 ['conv5_block1_add[0][0]'] \n",
" \n",
" conv5_block2_1_conv (Conv2D) (None, 7, 7, 512) 1049088 ['conv5_block1_out[0][0]'] \n",
" \n",
" conv5_block2_1_bn (BatchNormal (None, 7, 7, 512) 2048 ['conv5_block2_1_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv5_block2_1_relu (Activatio (None, 7, 7, 512) 0 ['conv5_block2_1_bn[0][0]'] \n",
" n) \n",
" \n",
" conv5_block2_2_conv (Conv2D) (None, 7, 7, 512) 2359808 ['conv5_block2_1_relu[0][0]'] \n",
" \n",
" conv5_block2_2_bn (BatchNormal (None, 7, 7, 512) 2048 ['conv5_block2_2_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv5_block2_2_relu (Activatio (None, 7, 7, 512) 0 ['conv5_block2_2_bn[0][0]'] \n",
" n) \n",
" \n",
" conv5_block2_3_conv (Conv2D) (None, 7, 7, 2048) 1050624 ['conv5_block2_2_relu[0][0]'] \n",
" \n",
" conv5_block2_3_bn (BatchNormal (None, 7, 7, 2048) 8192 ['conv5_block2_3_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv5_block2_add (Add) (None, 7, 7, 2048) 0 ['conv5_block1_out[0][0]', \n",
" 'conv5_block2_3_bn[0][0]'] \n",
" \n",
" conv5_block2_out (Activation) (None, 7, 7, 2048) 0 ['conv5_block2_add[0][0]'] \n",
" \n",
" conv5_block3_1_conv (Conv2D) (None, 7, 7, 512) 1049088 ['conv5_block2_out[0][0]'] \n",
" \n",
" conv5_block3_1_bn (BatchNormal (None, 7, 7, 512) 2048 ['conv5_block3_1_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv5_block3_1_relu (Activatio (None, 7, 7, 512) 0 ['conv5_block3_1_bn[0][0]'] \n",
" n) \n",
" \n",
" conv5_block3_2_conv (Conv2D) (None, 7, 7, 512) 2359808 ['conv5_block3_1_relu[0][0]'] \n",
" \n",
" conv5_block3_2_bn (BatchNormal (None, 7, 7, 512) 2048 ['conv5_block3_2_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv5_block3_2_relu (Activatio (None, 7, 7, 512) 0 ['conv5_block3_2_bn[0][0]'] \n",
" n) \n",
" \n",
" conv5_block3_3_conv (Conv2D) (None, 7, 7, 2048) 1050624 ['conv5_block3_2_relu[0][0]'] \n",
" \n",
" conv5_block3_3_bn (BatchNormal (None, 7, 7, 2048) 8192 ['conv5_block3_3_conv[0][0]'] \n",
" ization) \n",
" \n",
" conv5_block3_add (Add) (None, 7, 7, 2048) 0 ['conv5_block2_out[0][0]', \n",
" 'conv5_block3_3_bn[0][0]'] \n",
" \n",
" conv5_block3_out (Activation) (None, 7, 7, 2048) 0 ['conv5_block3_add[0][0]'] \n",
" \n",
" avg_pool (GlobalAveragePooling (None, 2048) 0 ['conv5_block3_out[0][0]'] \n",
" 2D) \n",
" \n",
" predictions (Dense) (None, 1000) 2049000 ['avg_pool[0][0]'] \n",
" \n",
"==================================================================================================\n",
"Total params: 25,636,712\n",
"Trainable params: 25,583,592\n",
"Non-trainable params: 53,120\n",
"__________________________________________________________________________________________________\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"historyR = modelR.fit(train_ds,verbose=1,epochs=3,validation_data=val_ds)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000
},
"id": "5i87UAp3aqIi",
"outputId": "821248ee-a103-4a3e-b929-215ed1560746"
},
"execution_count": 123,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Epoch 1/3\n"
]
},
{
"output_type": "error",
"ename": "InvalidArgumentError",
"evalue": "ignored",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mInvalidArgumentError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-123-3f2abf7a41bc>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mhistoryR\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodelR\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtrain_ds\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mverbose\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mepochs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mvalidation_data\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mval_ds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m/usr/local/lib/python3.9/dist-packages/keras/utils/traceback_utils.py\u001b[0m in \u001b[0;36merror_handler\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 68\u001b[0m \u001b[0;31m# To get the full stack trace, call:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 69\u001b[0m \u001b[0;31m# `tf.debugging.disable_traceback_filtering()`\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 70\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwith_traceback\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfiltered_tb\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 71\u001b[0m \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 72\u001b[0m \u001b[0;32mdel\u001b[0m \u001b[0mfiltered_tb\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.9/dist-packages/tensorflow/python/eager/execute.py\u001b[0m in \u001b[0;36mquick_execute\u001b[0;34m(op_name, num_outputs, inputs, attrs, ctx, name)\u001b[0m\n\u001b[1;32m 50\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 51\u001b[0m \u001b[0mctx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mensure_initialized\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 52\u001b[0;31m tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,\n\u001b[0m\u001b[1;32m 53\u001b[0m inputs, attrs, num_outputs)\n\u001b[1;32m 54\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_NotOkStatusException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mInvalidArgumentError\u001b[0m: Graph execution error:\n\nDetected at node 'gradient_tape/binary_crossentropy/logistic_loss/mul/BroadcastGradientArgs' defined at (most recent call last):\n File \"/usr/lib/python3.9/runpy.py\", line 197, in _run_module_as_main\n return _run_code(code, main_globals, None,\n File \"/usr/lib/python3.9/runpy.py\", line 87, in _run_code\n exec(code, run_globals)\n File \"/usr/local/lib/python3.9/dist-packages/ipykernel_launcher.py\", line 16, in <module>\n app.launch_new_instance()\n File \"/usr/local/lib/python3.9/dist-packages/traitlets/config/application.py\", line 992, in launch_instance\n app.start()\n File \"/usr/local/lib/python3.9/dist-packages/ipykernel/kernelapp.py\", line 612, in start\n self.io_loop.start()\n File \"/usr/local/lib/python3.9/dist-packages/tornado/platform/asyncio.py\", line 215, in start\n self.asyncio_loop.run_forever()\n File \"/usr/lib/python3.9/asyncio/base_events.py\", line 601, in run_forever\n self._run_once()\n File \"/usr/lib/python3.9/asyncio/base_events.py\", line 1905, in _run_once\n handle._run()\n File \"/usr/lib/python3.9/asyncio/events.py\", line 80, in _run\n self._context.run(self._callback, *self._args)\n File \"/usr/local/lib/python3.9/dist-packages/tornado/ioloop.py\", line 687, in <lambda>\n lambda f: self._run_callback(functools.partial(callback, future))\n File \"/usr/local/lib/python3.9/dist-packages/tornado/ioloop.py\", line 740, in _run_callback\n ret = callback()\n File \"/usr/local/lib/python3.9/dist-packages/tornado/gen.py\", line 821, in inner\n self.ctx_run(self.run)\n File \"/usr/local/lib/python3.9/dist-packages/tornado/gen.py\", line 782, in run\n yielded = self.gen.send(value)\n File \"/usr/local/lib/python3.9/dist-packages/ipykernel/kernelbase.py\", line 365, in process_one\n yield gen.maybe_future(dispatch(*args))\n File \"/usr/local/lib/python3.9/dist-packages/tornado/gen.py\", line 234, in wrapper\n yielded = ctx_run(next, result)\n File \"/usr/local/lib/python3.9/dist-packages/ipykernel/kernelbase.py\", line 268, in dispatch_shell\n yield gen.maybe_future(handler(stream, idents, msg))\n File \"/usr/local/lib/python3.9/dist-packages/tornado/gen.py\", line 234, in wrapper\n yielded = ctx_run(next, result)\n File \"/usr/local/lib/python3.9/dist-packages/ipykernel/kernelbase.py\", line 543, in execute_request\n self.do_execute(\n File \"/usr/local/lib/python3.9/dist-packages/tornado/gen.py\", line 234, in wrapper\n yielded = ctx_run(next, result)\n File \"/usr/local/lib/python3.9/dist-packages/ipykernel/ipkernel.py\", line 306, in do_execute\n res = shell.run_cell(code, store_history=store_history, silent=silent)\n File \"/usr/local/lib/python3.9/dist-packages/ipykernel/zmqshell.py\", line 536, in run_cell\n return super(ZMQInteractiveShell, self).run_cell(*args, **kwargs)\n File \"/usr/local/lib/python3.9/dist-packages/IPython/core/interactiveshell.py\", line 2854, in run_cell\n result = self._run_cell(\n File \"/usr/local/lib/python3.9/dist-packages/IPython/core/interactiveshell.py\", line 2881, in _run_cell\n return runner(coro)\n File \"/usr/local/lib/python3.9/dist-packages/IPython/core/async_helpers.py\", line 68, in _pseudo_sync_runner\n coro.send(None)\n File \"/usr/local/lib/python3.9/dist-packages/IPython/core/interactiveshell.py\", line 3057, in run_cell_async\n has_raised = await self.run_ast_nodes(code_ast.body, cell_name,\n File \"/usr/local/lib/python3.9/dist-packages/IPython/core/interactiveshell.py\", line 3249, in run_ast_nodes\n if (await self.run_code(code, result, async_=asy)):\n File \"/usr/local/lib/python3.9/dist-packages/IPython/core/interactiveshell.py\", line 3326, in run_code\n exec(code_obj, self.user_global_ns, self.user_ns)\n File \"<ipython-input-123-3f2abf7a41bc>\", line 1, in <module>\n historyR = modelR.fit(train_ds,verbose=1,epochs=3,validation_data=val_ds)\n File \"/usr/local/lib/python3.9/dist-packages/keras/utils/traceback_utils.py\", line 65, in error_handler\n return fn(*args, **kwargs)\n File \"/usr/local/lib/python3.9/dist-packages/keras/engine/training.py\", line 1650, in fit\n tmp_logs = self.train_function(iterator)\n File \"/usr/local/lib/python3.9/dist-packages/keras/engine/training.py\", line 1249, in train_function\n return step_function(self, iterator)\n File \"/usr/local/lib/python3.9/dist-packages/keras/engine/training.py\", line 1233, in step_function\n outputs = model.distribute_strategy.run(run_step, args=(data,))\n File \"/usr/local/lib/python3.9/dist-packages/keras/engine/training.py\", line 1222, in run_step\n outputs = model.train_step(data)\n File \"/usr/local/lib/python3.9/dist-packages/keras/engine/training.py\", line 1027, in train_step\n self.optimizer.minimize(loss, self.trainable_variables, tape=tape)\n File \"/usr/local/lib/python3.9/dist-packages/keras/optimizers/optimizer_experimental/optimizer.py\", line 526, in minimize\n grads_and_vars = self.compute_gradients(loss, var_list, tape)\n File \"/usr/local/lib/python3.9/dist-packages/keras/optimizers/optimizer_experimental/optimizer.py\", line 259, in compute_gradients\n grads = tape.gradient(loss, var_list)\nNode: 'gradient_tape/binary_crossentropy/logistic_loss/mul/BroadcastGradientArgs'\nIncompatible shapes: [32,1000] vs. [32,4]\n\t [[{{node gradient_tape/binary_crossentropy/logistic_loss/mul/BroadcastGradientArgs}}]] [Op:__inference_train_function_61105]"
]
}
]
},
{
"cell_type": "code",
"source": [],
"metadata": {
"id": "hKg0YXbZMmtG"
},
"execution_count": null,
"outputs": []
}
]
}