diff --git a/sw_lab9-10_1.ipynb b/sw_lab9-10_1.ipynb index aed12e3..5d3a4bb 100644 --- a/sw_lab9-10_1.ipynb +++ b/sw_lab9-10_1.ipynb @@ -362,55 +362,55 @@ "name": "stdout", "output_type": "stream", "text": [ - "Model: \"sequential\"\n", + "Model: \"sequential_1\"\n", "_________________________________________________________________\n", " Layer (type) Output Shape Param # \n", "=================================================================\n", - " conv2d (Conv2D) (None, 224, 224, 64) 1792 \n", + " conv2d_13 (Conv2D) (None, 224, 224, 64) 1792 \n", " \n", - " conv2d_1 (Conv2D) (None, 224, 224, 64) 36928 \n", + " conv2d_14 (Conv2D) (None, 224, 224, 64) 36928 \n", " \n", - " max_pooling2d (MaxPooling2D (None, 112, 112, 64) 0 \n", - " ) \n", - " \n", - " conv2d_2 (Conv2D) (None, 112, 112, 128) 73856 \n", - " \n", - " conv2d_3 (Conv2D) (None, 112, 112, 128) 147584 \n", - " \n", - " max_pooling2d_1 (MaxPooling (None, 56, 56, 128) 0 \n", + " max_pooling2d_4 (MaxPooling (None, 112, 112, 64) 0 \n", " 2D) \n", " \n", - " conv2d_4 (Conv2D) (None, 56, 56, 256) 295168 \n", + " conv2d_15 (Conv2D) (None, 112, 112, 128) 73856 \n", " \n", - " conv2d_5 (Conv2D) (None, 56, 56, 256) 590080 \n", + " conv2d_16 (Conv2D) (None, 112, 112, 128) 147584 \n", " \n", - " conv2d_6 (Conv2D) (None, 56, 56, 256) 590080 \n", - " \n", - " max_pooling2d_2 (MaxPooling (None, 28, 28, 256) 0 \n", + " max_pooling2d_5 (MaxPooling (None, 56, 56, 128) 0 \n", " 2D) \n", " \n", - " conv2d_7 (Conv2D) (None, 28, 28, 512) 1180160 \n", + " conv2d_17 (Conv2D) (None, 56, 56, 256) 295168 \n", " \n", - " conv2d_8 (Conv2D) (None, 28, 28, 512) 2359808 \n", + " conv2d_18 (Conv2D) (None, 56, 56, 256) 590080 \n", " \n", - " conv2d_9 (Conv2D) (None, 28, 28, 512) 2359808 \n", + " conv2d_19 (Conv2D) (None, 56, 56, 256) 590080 \n", " \n", - " max_pooling2d_3 (MaxPooling (None, 14, 14, 512) 0 \n", + " max_pooling2d_6 (MaxPooling (None, 28, 28, 256) 0 \n", " 2D) \n", " \n", - " conv2d_10 (Conv2D) (None, 14, 14, 512) 2359808 \n", + " conv2d_20 (Conv2D) (None, 28, 28, 512) 1180160 \n", " \n", - " conv2d_11 (Conv2D) (None, 14, 14, 512) 2359808 \n", + " conv2d_21 (Conv2D) (None, 28, 28, 512) 2359808 \n", " \n", - " conv2d_12 (Conv2D) (None, 14, 14, 512) 2359808 \n", + " conv2d_22 (Conv2D) (None, 28, 28, 512) 2359808 \n", " \n", - " flatten (Flatten) (None, 100352) 0 \n", + " max_pooling2d_7 (MaxPooling (None, 14, 14, 512) 0 \n", + " 2D) \n", " \n", - " dense (Dense) (None, 4096) 411045888 \n", + " conv2d_23 (Conv2D) (None, 14, 14, 512) 2359808 \n", " \n", - " dense_1 (Dense) (None, 4096) 16781312 \n", + " conv2d_24 (Conv2D) (None, 14, 14, 512) 2359808 \n", " \n", - " dense_2 (Dense) (None, 5) 20485 \n", + " conv2d_25 (Conv2D) (None, 14, 14, 512) 2359808 \n", + " \n", + " flatten_1 (Flatten) (None, 100352) 0 \n", + " \n", + " dense_3 (Dense) (None, 4096) 411045888 \n", + " \n", + " dense_4 (Dense) (None, 4096) 16781312 \n", + " \n", + " dense_5 (Dense) (None, 5) 20485 \n", " \n", "=================================================================\n", "Total params: 442,562,373\n", @@ -426,52 +426,31 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "WARNING:tensorflow:`period` argument is deprecated. Please use `save_freq` to specify the frequency in number of batches seen.\n", - "Epoch 1/2\n" + "WARNING:tensorflow:`period` argument is deprecated. Please use `save_freq` to specify the frequency in number of batches seen.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "/var/folders/6b/j4d60ym516x2s6wymzj707rh0000gn/T/ipykernel_8661/3543889534.py:4: UserWarning: `Model.fit_generator` is deprecated and will be removed in a future version. Please use `Model.fit`, which supports generators.\n", - " hist_vgg = model.fit_generator(steps_per_epoch=len(train_ds), generator=train_ds, validation_data= validation_ds, validation_steps=len(validation_ds), epochs=2, callbacks=[checkpoint,early])\n", - "2023-01-06 03:00:40.894219: W tensorflow/tsl/platform/profile_utils/cpu_utils.cc:128] Failed to get CPU frequency: 0 Hz\n" + "/var/folders/6b/j4d60ym516x2s6wymzj707rh0000gn/T/ipykernel_9339/4100383455.py:4: UserWarning: `Model.fit_generator` is deprecated and will be removed in a future version. Please use `Model.fit`, which supports generators.\n", + " hist_vgg = model.fit_generator(steps_per_epoch=len(train_ds), generator=train_ds, validation_data= validation_ds, validation_steps=len(validation_ds), epochs=1, callbacks=[checkpoint,early])\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - " 2/25 [=>............................] - ETA: 9:29 - loss: 1.5960 - accuracy: 0.2031" - ] - }, - { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[28], line 4\u001b[0m\n\u001b[1;32m 2\u001b[0m checkpoint \u001b[39m=\u001b[39m ModelCheckpoint(\u001b[39m\"\u001b[39m\u001b[39mvgg16_1.h5\u001b[39m\u001b[39m\"\u001b[39m, monitor\u001b[39m=\u001b[39m\u001b[39m'\u001b[39m\u001b[39mval_accuracy\u001b[39m\u001b[39m'\u001b[39m, verbose\u001b[39m=\u001b[39m\u001b[39m1\u001b[39m, save_best_only\u001b[39m=\u001b[39m\u001b[39mTrue\u001b[39;00m, save_weights_only\u001b[39m=\u001b[39m\u001b[39mFalse\u001b[39;00m, mode\u001b[39m=\u001b[39m\u001b[39m'\u001b[39m\u001b[39mauto\u001b[39m\u001b[39m'\u001b[39m, period\u001b[39m=\u001b[39m\u001b[39m1\u001b[39m)\n\u001b[1;32m 3\u001b[0m early \u001b[39m=\u001b[39m EarlyStopping(monitor\u001b[39m=\u001b[39m\u001b[39m'\u001b[39m\u001b[39mval_accuracy\u001b[39m\u001b[39m'\u001b[39m, min_delta\u001b[39m=\u001b[39m\u001b[39m0\u001b[39m, patience\u001b[39m=\u001b[39m\u001b[39m20\u001b[39m, verbose\u001b[39m=\u001b[39m\u001b[39m1\u001b[39m, mode\u001b[39m=\u001b[39m\u001b[39m'\u001b[39m\u001b[39mauto\u001b[39m\u001b[39m'\u001b[39m)\n\u001b[0;32m----> 4\u001b[0m hist_vgg \u001b[39m=\u001b[39m model\u001b[39m.\u001b[39;49mfit_generator(steps_per_epoch\u001b[39m=\u001b[39;49m\u001b[39mlen\u001b[39;49m(train_ds), generator\u001b[39m=\u001b[39;49mtrain_ds, validation_data\u001b[39m=\u001b[39;49m validation_ds, validation_steps\u001b[39m=\u001b[39;49m\u001b[39mlen\u001b[39;49m(validation_ds), epochs\u001b[39m=\u001b[39;49m\u001b[39m2\u001b[39;49m, callbacks\u001b[39m=\u001b[39;49m[checkpoint,early])\n", - "File \u001b[0;32m~/Library/Python/3.9/lib/python/site-packages/keras/engine/training.py:2604\u001b[0m, in \u001b[0;36mModel.fit_generator\u001b[0;34m(self, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, validation_freq, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)\u001b[0m\n\u001b[1;32m 2592\u001b[0m \u001b[39m\u001b[39m\u001b[39m\"\"\"Fits the model on data yielded batch-by-batch by a Python generator.\u001b[39;00m\n\u001b[1;32m 2593\u001b[0m \n\u001b[1;32m 2594\u001b[0m \u001b[39mDEPRECATED:\u001b[39;00m\n\u001b[1;32m 2595\u001b[0m \u001b[39m `Model.fit` now supports generators, so there is no longer any need to\u001b[39;00m\n\u001b[1;32m 2596\u001b[0m \u001b[39m use this endpoint.\u001b[39;00m\n\u001b[1;32m 2597\u001b[0m \u001b[39m\"\"\"\u001b[39;00m\n\u001b[1;32m 2598\u001b[0m warnings\u001b[39m.\u001b[39mwarn(\n\u001b[1;32m 2599\u001b[0m \u001b[39m\"\u001b[39m\u001b[39m`Model.fit_generator` is deprecated and \u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m 2600\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mwill be removed in a future version. \u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m 2601\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mPlease use `Model.fit`, which supports generators.\u001b[39m\u001b[39m\"\u001b[39m,\n\u001b[1;32m 2602\u001b[0m stacklevel\u001b[39m=\u001b[39m\u001b[39m2\u001b[39m,\n\u001b[1;32m 2603\u001b[0m )\n\u001b[0;32m-> 2604\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mfit(\n\u001b[1;32m 2605\u001b[0m generator,\n\u001b[1;32m 2606\u001b[0m steps_per_epoch\u001b[39m=\u001b[39;49msteps_per_epoch,\n\u001b[1;32m 2607\u001b[0m epochs\u001b[39m=\u001b[39;49mepochs,\n\u001b[1;32m 2608\u001b[0m verbose\u001b[39m=\u001b[39;49mverbose,\n\u001b[1;32m 2609\u001b[0m callbacks\u001b[39m=\u001b[39;49mcallbacks,\n\u001b[1;32m 2610\u001b[0m validation_data\u001b[39m=\u001b[39;49mvalidation_data,\n\u001b[1;32m 2611\u001b[0m validation_steps\u001b[39m=\u001b[39;49mvalidation_steps,\n\u001b[1;32m 2612\u001b[0m validation_freq\u001b[39m=\u001b[39;49mvalidation_freq,\n\u001b[1;32m 2613\u001b[0m class_weight\u001b[39m=\u001b[39;49mclass_weight,\n\u001b[1;32m 2614\u001b[0m max_queue_size\u001b[39m=\u001b[39;49mmax_queue_size,\n\u001b[1;32m 2615\u001b[0m workers\u001b[39m=\u001b[39;49mworkers,\n\u001b[1;32m 2616\u001b[0m use_multiprocessing\u001b[39m=\u001b[39;49muse_multiprocessing,\n\u001b[1;32m 2617\u001b[0m shuffle\u001b[39m=\u001b[39;49mshuffle,\n\u001b[1;32m 2618\u001b[0m initial_epoch\u001b[39m=\u001b[39;49minitial_epoch,\n\u001b[1;32m 2619\u001b[0m )\n", - "File \u001b[0;32m~/Library/Python/3.9/lib/python/site-packages/keras/utils/traceback_utils.py:65\u001b[0m, in \u001b[0;36mfilter_traceback..error_handler\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 63\u001b[0m filtered_tb \u001b[39m=\u001b[39m \u001b[39mNone\u001b[39;00m\n\u001b[1;32m 64\u001b[0m \u001b[39mtry\u001b[39;00m:\n\u001b[0;32m---> 65\u001b[0m \u001b[39mreturn\u001b[39;00m fn(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[1;32m 66\u001b[0m \u001b[39mexcept\u001b[39;00m \u001b[39mException\u001b[39;00m \u001b[39mas\u001b[39;00m e:\n\u001b[1;32m 67\u001b[0m filtered_tb \u001b[39m=\u001b[39m _process_traceback_frames(e\u001b[39m.\u001b[39m__traceback__)\n", - "File \u001b[0;32m~/Library/Python/3.9/lib/python/site-packages/keras/engine/training.py:1650\u001b[0m, in \u001b[0;36mModel.fit\u001b[0;34m(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_batch_size, validation_freq, max_queue_size, workers, use_multiprocessing)\u001b[0m\n\u001b[1;32m 1642\u001b[0m \u001b[39mwith\u001b[39;00m tf\u001b[39m.\u001b[39mprofiler\u001b[39m.\u001b[39mexperimental\u001b[39m.\u001b[39mTrace(\n\u001b[1;32m 1643\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mtrain\u001b[39m\u001b[39m\"\u001b[39m,\n\u001b[1;32m 1644\u001b[0m epoch_num\u001b[39m=\u001b[39mepoch,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 1647\u001b[0m _r\u001b[39m=\u001b[39m\u001b[39m1\u001b[39m,\n\u001b[1;32m 1648\u001b[0m ):\n\u001b[1;32m 1649\u001b[0m callbacks\u001b[39m.\u001b[39mon_train_batch_begin(step)\n\u001b[0;32m-> 1650\u001b[0m tmp_logs \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mtrain_function(iterator)\n\u001b[1;32m 1651\u001b[0m \u001b[39mif\u001b[39;00m data_handler\u001b[39m.\u001b[39mshould_sync:\n\u001b[1;32m 1652\u001b[0m context\u001b[39m.\u001b[39masync_wait()\n", - "File \u001b[0;32m~/Library/Python/3.9/lib/python/site-packages/tensorflow/python/util/traceback_utils.py:150\u001b[0m, in \u001b[0;36mfilter_traceback..error_handler\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 148\u001b[0m filtered_tb \u001b[39m=\u001b[39m \u001b[39mNone\u001b[39;00m\n\u001b[1;32m 149\u001b[0m \u001b[39mtry\u001b[39;00m:\n\u001b[0;32m--> 150\u001b[0m \u001b[39mreturn\u001b[39;00m fn(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[1;32m 151\u001b[0m \u001b[39mexcept\u001b[39;00m \u001b[39mException\u001b[39;00m \u001b[39mas\u001b[39;00m e:\n\u001b[1;32m 152\u001b[0m filtered_tb \u001b[39m=\u001b[39m _process_traceback_frames(e\u001b[39m.\u001b[39m__traceback__)\n", - "File \u001b[0;32m~/Library/Python/3.9/lib/python/site-packages/tensorflow/python/eager/polymorphic_function/polymorphic_function.py:880\u001b[0m, in \u001b[0;36mFunction.__call__\u001b[0;34m(self, *args, **kwds)\u001b[0m\n\u001b[1;32m 877\u001b[0m compiler \u001b[39m=\u001b[39m \u001b[39m\"\u001b[39m\u001b[39mxla\u001b[39m\u001b[39m\"\u001b[39m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_jit_compile \u001b[39melse\u001b[39;00m \u001b[39m\"\u001b[39m\u001b[39mnonXla\u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m 879\u001b[0m \u001b[39mwith\u001b[39;00m OptionalXlaContext(\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_jit_compile):\n\u001b[0;32m--> 880\u001b[0m result \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_call(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwds)\n\u001b[1;32m 882\u001b[0m new_tracing_count \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mexperimental_get_tracing_count()\n\u001b[1;32m 883\u001b[0m without_tracing \u001b[39m=\u001b[39m (tracing_count \u001b[39m==\u001b[39m new_tracing_count)\n", - "File \u001b[0;32m~/Library/Python/3.9/lib/python/site-packages/tensorflow/python/eager/polymorphic_function/polymorphic_function.py:912\u001b[0m, in \u001b[0;36mFunction._call\u001b[0;34m(self, *args, **kwds)\u001b[0m\n\u001b[1;32m 909\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_lock\u001b[39m.\u001b[39mrelease()\n\u001b[1;32m 910\u001b[0m \u001b[39m# In this case we have created variables on the first call, so we run the\u001b[39;00m\n\u001b[1;32m 911\u001b[0m \u001b[39m# defunned version which is guaranteed to never create variables.\u001b[39;00m\n\u001b[0;32m--> 912\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_no_variable_creation_fn(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwds) \u001b[39m# pylint: disable=not-callable\u001b[39;00m\n\u001b[1;32m 913\u001b[0m \u001b[39melif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_variable_creation_fn \u001b[39mis\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n\u001b[1;32m 914\u001b[0m \u001b[39m# Release the lock early so that multiple threads can perform the call\u001b[39;00m\n\u001b[1;32m 915\u001b[0m \u001b[39m# in parallel.\u001b[39;00m\n\u001b[1;32m 916\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_lock\u001b[39m.\u001b[39mrelease()\n", - "File \u001b[0;32m~/Library/Python/3.9/lib/python/site-packages/tensorflow/python/eager/polymorphic_function/tracing_compiler.py:134\u001b[0m, in \u001b[0;36mTracingCompiler.__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 131\u001b[0m \u001b[39mwith\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_lock:\n\u001b[1;32m 132\u001b[0m (concrete_function,\n\u001b[1;32m 133\u001b[0m filtered_flat_args) \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_maybe_define_function(args, kwargs)\n\u001b[0;32m--> 134\u001b[0m \u001b[39mreturn\u001b[39;00m concrete_function\u001b[39m.\u001b[39;49m_call_flat(\n\u001b[1;32m 135\u001b[0m filtered_flat_args, captured_inputs\u001b[39m=\u001b[39;49mconcrete_function\u001b[39m.\u001b[39;49mcaptured_inputs)\n", - "File \u001b[0;32m~/Library/Python/3.9/lib/python/site-packages/tensorflow/python/eager/polymorphic_function/monomorphic_function.py:1745\u001b[0m, in \u001b[0;36mConcreteFunction._call_flat\u001b[0;34m(self, args, captured_inputs, cancellation_manager)\u001b[0m\n\u001b[1;32m 1741\u001b[0m possible_gradient_type \u001b[39m=\u001b[39m gradients_util\u001b[39m.\u001b[39mPossibleTapeGradientTypes(args)\n\u001b[1;32m 1742\u001b[0m \u001b[39mif\u001b[39;00m (possible_gradient_type \u001b[39m==\u001b[39m gradients_util\u001b[39m.\u001b[39mPOSSIBLE_GRADIENT_TYPES_NONE\n\u001b[1;32m 1743\u001b[0m \u001b[39mand\u001b[39;00m executing_eagerly):\n\u001b[1;32m 1744\u001b[0m \u001b[39m# No tape is watching; skip to running the function.\u001b[39;00m\n\u001b[0;32m-> 1745\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_build_call_outputs(\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_inference_function\u001b[39m.\u001b[39;49mcall(\n\u001b[1;32m 1746\u001b[0m ctx, args, cancellation_manager\u001b[39m=\u001b[39;49mcancellation_manager))\n\u001b[1;32m 1747\u001b[0m forward_backward \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_select_forward_and_backward_functions(\n\u001b[1;32m 1748\u001b[0m args,\n\u001b[1;32m 1749\u001b[0m possible_gradient_type,\n\u001b[1;32m 1750\u001b[0m executing_eagerly)\n\u001b[1;32m 1751\u001b[0m forward_function, args_with_tangents \u001b[39m=\u001b[39m forward_backward\u001b[39m.\u001b[39mforward()\n", - "File \u001b[0;32m~/Library/Python/3.9/lib/python/site-packages/tensorflow/python/eager/polymorphic_function/monomorphic_function.py:378\u001b[0m, in \u001b[0;36m_EagerDefinedFunction.call\u001b[0;34m(self, ctx, args, cancellation_manager)\u001b[0m\n\u001b[1;32m 376\u001b[0m \u001b[39mwith\u001b[39;00m _InterpolateFunctionError(\u001b[39mself\u001b[39m):\n\u001b[1;32m 377\u001b[0m \u001b[39mif\u001b[39;00m cancellation_manager \u001b[39mis\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n\u001b[0;32m--> 378\u001b[0m outputs \u001b[39m=\u001b[39m execute\u001b[39m.\u001b[39;49mexecute(\n\u001b[1;32m 379\u001b[0m \u001b[39mstr\u001b[39;49m(\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49msignature\u001b[39m.\u001b[39;49mname),\n\u001b[1;32m 380\u001b[0m num_outputs\u001b[39m=\u001b[39;49m\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_num_outputs,\n\u001b[1;32m 381\u001b[0m inputs\u001b[39m=\u001b[39;49margs,\n\u001b[1;32m 382\u001b[0m attrs\u001b[39m=\u001b[39;49mattrs,\n\u001b[1;32m 383\u001b[0m ctx\u001b[39m=\u001b[39;49mctx)\n\u001b[1;32m 384\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m 385\u001b[0m outputs \u001b[39m=\u001b[39m execute\u001b[39m.\u001b[39mexecute_with_cancellation(\n\u001b[1;32m 386\u001b[0m \u001b[39mstr\u001b[39m(\u001b[39mself\u001b[39m\u001b[39m.\u001b[39msignature\u001b[39m.\u001b[39mname),\n\u001b[1;32m 387\u001b[0m num_outputs\u001b[39m=\u001b[39m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_num_outputs,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 390\u001b[0m ctx\u001b[39m=\u001b[39mctx,\n\u001b[1;32m 391\u001b[0m cancellation_manager\u001b[39m=\u001b[39mcancellation_manager)\n", - "File \u001b[0;32m~/Library/Python/3.9/lib/python/site-packages/tensorflow/python/eager/execute.py:52\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[39mtry\u001b[39;00m:\n\u001b[1;32m 51\u001b[0m ctx\u001b[39m.\u001b[39mensure_initialized()\n\u001b[0;32m---> 52\u001b[0m tensors \u001b[39m=\u001b[39m pywrap_tfe\u001b[39m.\u001b[39;49mTFE_Py_Execute(ctx\u001b[39m.\u001b[39;49m_handle, device_name, op_name,\n\u001b[1;32m 53\u001b[0m inputs, attrs, num_outputs)\n\u001b[1;32m 54\u001b[0m \u001b[39mexcept\u001b[39;00m core\u001b[39m.\u001b[39m_NotOkStatusException \u001b[39mas\u001b[39;00m e:\n\u001b[1;32m 55\u001b[0m \u001b[39mif\u001b[39;00m name \u001b[39mis\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + "25/25 [==============================] - ETA: 0s - loss: 1.6126 - accuracy: 0.1663 \n", + "Epoch 1: val_accuracy improved from -inf to 0.18750, saving model to vgg16_1.h5\n", + "25/25 [==============================] - 515s 21s/step - loss: 1.6126 - accuracy: 0.1663 - val_loss: 1.6102 - val_accuracy: 0.1875\n" ] } ], @@ -479,17 +458,17 @@ "from keras.callbacks import ModelCheckpoint, EarlyStopping\n", "checkpoint = ModelCheckpoint(\"vgg16_1.h5\", monitor='val_accuracy', verbose=1, save_best_only=True, save_weights_only=False, mode='auto', period=1)\n", "early = EarlyStopping(monitor='val_accuracy', min_delta=0, patience=20, verbose=1, mode='auto')\n", - "hist_vgg = model.fit_generator(steps_per_epoch=len(train_ds), generator=train_ds, validation_data= validation_ds, validation_steps=len(validation_ds), epochs=2, callbacks=[checkpoint,early])" + "hist_vgg = model.fit_generator(steps_per_epoch=len(train_ds), generator=train_ds, validation_data= validation_ds, validation_steps=len(validation_ds), epochs=1, callbacks=[checkpoint,early])" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 30, "metadata": {}, "outputs": [ { "data": { - "image/png": "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lISsrKxC/SMjI5GSkiI/rl+/XrYbQURERBWKWcONlZUV/P39ERsbK7fpdDrExsaiTZs2Bse0a9cOly5dgk6nk9suXLgADw8PWFlZFeqv0Wjg6Oio9yAiIiLlMvtpqYiICHz77bf47rvvcPbsWbz33ntIT0/H0KFDAQChoaGIjIyU+7/33nt48OABxo8fjwsXLmDHjh2YM2cOxowZY65NICIiogrE7Pe5CQkJwb179zBjxgwkJSWhefPm2LVrlzzJODExESrVswzm5eWF3bt3Y+LEiWjWrBlq1KiB8ePHY/LkyebaBCIiIqpAzH6fG1PjfW6IiIgqn0pznxsiIiKissZwQ0RERIrCcENERESKwnBDREREisJwQ0RERIrCcENERESKwnBDREREisJwQ0RERIrCcENERESKwnBDREREisJwQ0RERIrCcENERESKwnBDREREisJwQ0RERIrCcENERESKwnBDREREisJwQ0RERIrCcENERESKwnBDREREisJwQ0RERIrCcENERESKwnBDREREisJwQ0RERIrCcENERESKwnBDREREisJwQ0RERIrCcENERESKwnBDREREisJwQ0RERIrCcENERESKwnBDREREisJwQ0RERIrCcENERESKwnBDREREisJwQ0RERIpSIcLNsmXL4O3tDWtra7Ru3RpHjhwp0bgNGzZAkiT06tWrfAskIiKiSsPs4Wbjxo2IiIjAzJkzcezYMfj5+SEoKAh3794tdtzVq1cxadIktG/f3kSVEhERUWVg9nCzaNEijBw5EkOHDkWjRo2wYsUK2NraYtWqVUWO0Wq1GDRoEGbPng0fHx8TVktEREQVnVnDTVZWFo4ePYrAwEC5TaVSITAwEHFxcUWO+/jjj1GtWjUMHz7cFGUSERFRJWJhzpUnJydDq9WievXqeu3Vq1fHuXPnDI755ZdfsHLlSsTHx5doHZmZmcjMzJSfp6amlrpeIiIiqvjMflrKGI8ePcKQIUPw7bffwtXVtURj5s6dCycnJ/nh5eVVzlUSERGROZn1yI2rqyvUajXu3Lmj137nzh24u7sX6n/58mVcvXoVwcHBcptOpwMAWFhY4Pz586hTp47emMjISERERMjPU1NTGXCIiIgUzKzhxsrKCv7+/oiNjZUv59bpdIiNjcXYsWML9W/YsCFOnTql1zZt2jQ8evQIX375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", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAHHCAYAAABDUnkqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABN30lEQVR4nO3deXxMZ98/8M+ZRCb7JpFFQ4QgJSIV0lBFpY0gFbXGkoSgailSLXnsXdBaGmrpzU1ye4pYiupNpRE7qbVRKvYQSxJCsyKRzPX7w888RoKETCZzfN6v17xqrnOdc77ndNr5uM515khCCAEiIiIimVDougAiIiKiysRwQ0RERLLCcENERESywnBDREREssJwQ0RERLLCcENERESywnBDREREssJwQ0RERLLCcENERESywnBDRJVGkiRMnz69wutduXIFkiQhNja20msiotcPww2RzMTGxkKSJEiShAMHDpRaLoSAi4sLJElC165ddVAhEZF2MdwQyZSxsTHWrFlTqn3v3r24fv06lEqlDqoiItI+hhsimercuTM2bNiA4uJijfY1a9agRYsWcHR01FFlr4+CggJdl0D0WmK4IZKpkJAQ3LlzBwkJCeq2oqIibNy4Ef369StznYKCAnz22WdwcXGBUqlEo0aNMHfuXAghNPoVFhZi3LhxsLe3h4WFBT788ENcv369zG3euHEDgwcPhoODA5RKJZo0aYKVK1e+1DHdvXsX48ePh6enJ8zNzWFpaYnAwECcPHmyVN8HDx5g+vTpaNiwIYyNjeHk5ISPPvoIly5dUvdRqVRYsGABPD09YWxsDHt7e3Tq1AnHjh0D8Py5QE/PL5o+fTokScKZM2fQr18/2NjY4J133gEA/PXXXwgPD4ebmxuMjY3h6OiIwYMH486dO2Wer4iICDg7O0OpVKJevXr45JNPUFRUhMuXL0OSJHz//fel1jt06BAkScLatWsrelqJZMdQ1wUQkXa4urrCz88Pa9euRWBgIADgt99+Q05ODvr27YuFCxdq9BdC4MMPP8Tu3bsRERGB5s2bIz4+Hp9//jlu3Lih8YU6ZMgQ/PTTT+jXrx9at26NXbt2oUuXLqVqyMzMxNtvvw1JkjBq1CjY29vjt99+Q0REBHJzczF27NgKHdPly5exZcsW9OrVC/Xq1UNmZib+9a9/oV27djhz5gycnZ0BACUlJejatSsSExPRt29fjBkzBnl5eUhISMDp06dRv359AEBERARiY2MRGBiIIUOGoLi4GPv378cff/wBHx+fCtX2WK9eveDu7o6ZM2eqQ2FCQgIuX76MQYMGwdHREX///TeWLVuGv//+G3/88QckSQIA3Lx5E61atUJ2djaGDRuGxo0b48aNG9i4cSPu3bsHNzc3tGnTBqtXr8a4ceM09rt69WpYWFigW7duL1U3kawIIpKVmJgYAUAcPXpULFq0SFhYWIh79+4JIYTo1auX6NChgxBCiLp164ouXbqo19uyZYsAIL7++muN7fXs2VNIkiQuXrwohBAiOTlZABAjRozQ6NevXz8BQEybNk3dFhERIZycnERWVpZG3759+worKyt1XampqQKAiImJee6xPXjwQJSUlGi0paamCqVSKb788kt128qVKwUAMX/+/FLbUKlUQgghdu3aJQCITz/99Jl9nlfX08c6bdo0AUCEhISU6vv4OJ+0du1aAUDs27dP3RYaGioUCoU4evToM2v617/+JQCIlJQU9bKioiJhZ2cnwsLCSq1H9DriZSkiGevduzfu37+P//73v8jLy8N///vfZ16S2r59OwwMDPDpp59qtH/22WcQQuC3335T9wNQqt/TozBCCPz8888ICgqCEAJZWVnqV0BAAHJycnDixIkKHY9SqYRC8eh/WyUlJbhz5w7Mzc3RqFEjjW39/PPPsLOzw+jRo0tt4/Eoyc8//wxJkjBt2rRn9nkZw4cPL9VmYmKi/vODBw+QlZWFt99+GwDUdatUKmzZsgVBQUFljho9rql3794wNjbG6tWr1cvi4+ORlZWFAQMGvHTdRHLCcEMkY/b29vD398eaNWuwadMmlJSUoGfPnmX2vXr1KpydnWFhYaHR7uHhoV7++J8KhUJ9aeexRo0aaby/ffs2srOzsWzZMtjb22u8Bg0aBAC4detWhY5HpVLh+++/h7u7O5RKJezs7GBvb4+//voLOTk56n6XLl1Co0aNYGj47Cvvly5dgrOzM2xtbStUw4vUq1evVNvdu3cxZswYODg4wMTEBPb29up+j+u+ffs2cnNz0bRp0+du39raGkFBQRp3wq1evRq1a9fGe++9V4lHQqS/OOeGSOb69euHoUOHIiMjA4GBgbC2tq6S/apUKgDAgAEDEBYWVmafZs2aVWibM2fOxJQpUzB4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Vq0C8OhSVFhYGBYsWABfX19kZGQAAExMTGBlZaWTYyAiIqLqRaeXpY4dOwZvb294e3sDACIjI+Ht7a2+rTs9PR1paWnq/suWLUNxcTFGjhwJJycn9WvMmDE6qZ+IiIiqn2rzOzdVhb9zQ0REpH9em9+5ISIiInoaww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyYpOw82+ffsQFBQEZ2dnSJKELVu2vHCdPXv24K233oJSqUSDBg0QGxur9TqJiIhIf+g03BQUFMDLywuLFy8uV//U1FR06dIFHTp0QHJyMsaOHYshQ4YgPj5ey5USERGRvjDU5c4DAwMRGBhY7v4//vgj6tWrh3nz5gEAPDw8cODAAXz//fcICAjQVplERESkR/Rqzk1SUhL8/f012gICApCUlPTMdQoLC5Gbm6vxIiIiIvnSq3CTkZEBBwcHjTYHBwfk5ubi/v37Za4za9YsWFlZqV8uLi5VUSoRERHpiF6Fm5cRFRWFnJwc9evatWu6LomIiIi0SKdzbirK0dERmZmZGm2ZmZmwtLSEiYlJmesolUoolcqqKI+IiIiqAb0aufHz80NiYqJGW0JCAvz8/HRUEREREVU3Og03+fn5SE5ORnJyMoBHt3onJycjLS0NwKNLSqGhoer+w4cPx+XLl/HFF1/g7NmzWLJkCdavX49x48bponwiIiKqhnQabo4dOwZvb294e3sDACIjI+Ht7Y2pU6cCANLT09VBBwDq1auHbdu2ISEhAV5eXpg3bx7+/e9/8zZwIiIiUpOEEELXRVSl3NxcWFlZIScnB5aWlrouh4iIiMqhIt/fejXnhoiIiOhFGG6IiIhIVl4q3BQXF2Pnzp3417/+hby8PADAzZs3kZ+fX6nFEREREVVUhX/n5urVq+jUqRPS0tJQWFiI999/HxYWFvj2229RWFiIH3/8URt1EhEREZVLhUduxowZAx8fH/zzzz8aP5zXvXv3Ur9BQ0RERFTVKjxys3//fhw6dAhGRkYa7a6urrhx40alFUZERET0Mio8cqNSqVBSUlKq/fr167CwsKiUooiIiIheVoXDzQcffIDo6Gj1e0mSkJ+fj2nTpqFz586VWRsRERFRhVX4R/yuX7+OgIAACCFw4cIF+Pj44MKFC7Czs8O+fftQq1YtbdVaKfgjfkRERPqnIt/fL/ULxcXFxYiLi8Nff/2F/Px8vPXWW+jfv/8zn8xdnTDcEBER6Z+KfH9XeEIxABgaGmLAgAEvVRwRERGRNlU43Kxateq5y598ijcRERFRVavwZSkbGxuN9w8fPsS9e/dgZGQEU1NT3L17t1ILrGy8LEVERKR/tPrgzH/++UfjlZ+fj3PnzuGdd97B2rVrX7poIiIiospQKQ/OdHd3x+zZszFmzJjK2BwRERHRS6u0p4IbGhri5s2blbU5IiIiopdS4QnFW7du1XgvhEB6ejoWLVqENm3aVFphRERERC+jwuEmODhY470kSbC3t8d7772HefPmVVZdRERERC+lwuFGpVJpow4iIiKiSlFpc26IiIiIqoNyjdxERkaWe4Pz589/6WKIiIiIXlW5ws2ff/5Zro1JkvRKxRARERG9qnKFm927d2u7DiIiIqJKwTk3REREJCsv9VTwY8eOYf369UhLS0NRUZHGsk2bNlVKYUREREQvo8IjN3FxcWjdujVSUlKwefNmPHz4EH///Td27doFKysrbdRIREREVG4VDjczZ87E999/j19//RVGRkZYsGABzp49i969e6NOnTraqJGIiIio3Cocbi5duoQuXboAAIyMjFBQUABJkjBu3DgsW7as0gskIiIiqogKhxsbGxvk5eUBAGrXro3Tp08DALKzs3Hv3r3KrY6IiIiogsodbh6HmHfffRcJCQkAgF69emHMmDEYOnQoQkJC0LFjR+1USURERFRO5b5bqlmzZmjZsiWCg4PRq1cvAMCkSZNQo0YNHDp0CD169MDkyZO1VigRERFReUhCCFGejvv370dMTAw2btwIlUqFHj16YMiQIWjbtq22a6xUubm5sLKyQk5ODiwtLXVdDhEREZVDRb6/y31Zqm3btli5ciXS09Pxww8/4MqVK2jXrh0a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", "text/plain": [ "
" ] @@ -511,6 +490,33 @@ "plt.show()" ] }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "8/8 [==============================] - 32s 4s/step - loss: 1.6094 - accuracy: 0.1992\n" + ] + }, + { + "data": { + "text/plain": [ + "[1.609419822692871, 0.19921875]" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.evaluate(test_ds)" + ] + }, { "attachments": {}, "cell_type": "markdown", @@ -521,21 +527,66 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Model: \"model_1\"\n", + "Downloading data from https://storage.googleapis.com/tensorflow/keras-applications/resnet/resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5\n", + "94765736/94765736 [==============================] - 5s 0us/step\n" + ] + } + ], + "source": [ + "from keras.layers import Input, Lambda, Dense, Flatten\n", + "from keras.models import Model\n", + "from keras.applications import ResNet50\n", + "from keras.preprocessing import image\n", + "from keras.preprocessing.image import ImageDataGenerator\n", + "from keras.models import Sequential\n", + "import numpy as np\n", + "from glob import glob\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# re-size all the images to this\n", + "IMAGE_SIZE = [224, 224]\n", + "\n", + "# add preprocessing layer to the front of resnet\n", + "resnet = ResNet50(input_shape=IMAGE_SIZE + [3], weights='imagenet', include_top=False)\n", + "\n", + "# don't train existing weights\n", + "for layer in resnet.layers:\n", + " layer.trainable = False\n", + " \n", + " # useful for getting number of classes\n", + "classes = 5\n", + " \n", + "\n", + "# our layers - you can add more if you want\n", + "x = Flatten()(resnet.output)\n", + "# x = Dense(1000, activation='relu')(x)\n", + "prediction = Dense(5, activation='softmax')(x)" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"model\"\n", "__________________________________________________________________________________________________\n", " Layer (type) Output Shape Param # Connected to \n", "==================================================================================================\n", - " input_3 (InputLayer) [(None, 224, 224, 3 0 [] \n", + " input_1 (InputLayer) [(None, 224, 224, 3 0 [] \n", " )] \n", " \n", - " conv1_pad (ZeroPadding2D) (None, 230, 230, 3) 0 ['input_3[0][0]'] \n", + " conv1_pad (ZeroPadding2D) (None, 230, 230, 3) 0 ['input_1[0][0]'] \n", " \n", " conv1_conv (Conv2D) (None, 112, 112, 64 9472 ['conv1_pad[0][0]'] \n", " ) \n", @@ -1000,108 +1051,18 @@ " \n", " conv5_block3_out (Activation) (None, 7, 7, 2048) 0 ['conv5_block3_add[0][0]'] \n", " \n", - " flatten_6 (Flatten) (None, 100352) 0 ['conv5_block3_out[0][0]'] \n", + " flatten_2 (Flatten) (None, 100352) 0 ['conv5_block3_out[0][0]'] \n", " \n", - " dense_13 (Dense) (None, 5) 501765 ['flatten_6[0][0]'] \n", + " dense_6 (Dense) (None, 5) 501765 ['flatten_2[0][0]'] \n", " \n", "==================================================================================================\n", "Total params: 24,089,477\n", "Trainable params: 501,765\n", "Non-trainable params: 23,587,712\n", - "__________________________________________________________________________________________________\n", - "Epoch 1/5\n" + "__________________________________________________________________________________________________\n" ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/var/folders/_h/ljwht4gd7lb99rm1hm78h7_00000gn/T/ipykernel_13133/3879957867.py:45: UserWarning: `Model.fit_generator` is deprecated and will be removed in a future version. Please use `Model.fit`, which supports generators.\n", - " r = model.fit_generator(\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "25/25 [==============================] - 90s 3s/step - loss: 4.3387 - accuracy: 0.2100 - val_loss: 2.1355 - val_accuracy: 0.1875\n", - "Epoch 2/5\n", - "25/25 [==============================] - 84s 3s/step - loss: 1.9657 - accuracy: 0.2550 - val_loss: 2.3121 - val_accuracy: 0.2188\n", - "Epoch 3/5\n", - "25/25 [==============================] - 84s 3s/step - loss: 1.8658 - accuracy: 0.2600 - val_loss: 1.4832 - val_accuracy: 0.3073\n", - "Epoch 4/5\n", - "25/25 [==============================] - 83s 3s/step - loss: 1.7074 - accuracy: 0.2775 - val_loss: 1.5045 - val_accuracy: 0.3698\n", - "Epoch 5/5\n", - "25/25 [==============================] - 85s 3s/step - loss: 1.9758 - accuracy: 0.2800 - val_loss: 1.7073 - val_accuracy: 0.2812\n" - ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "ename": "KeyError", - "evalue": "'acc'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn [55], line 60\u001b[0m\n\u001b[1;32m 57\u001b[0m plt\u001b[39m.\u001b[39msavefig(\u001b[39m'\u001b[39m\u001b[39mLossVal_loss\u001b[39m\u001b[39m'\u001b[39m)\n\u001b[1;32m 59\u001b[0m \u001b[39m# accuracies\u001b[39;00m\n\u001b[0;32m---> 60\u001b[0m plt\u001b[39m.\u001b[39mplot(r\u001b[39m.\u001b[39;49mhistory[\u001b[39m'\u001b[39;49m\u001b[39macc\u001b[39;49m\u001b[39m'\u001b[39;49m], label\u001b[39m=\u001b[39m\u001b[39m'\u001b[39m\u001b[39mtrain acc\u001b[39m\u001b[39m'\u001b[39m)\n\u001b[1;32m 61\u001b[0m plt\u001b[39m.\u001b[39mplot(r\u001b[39m.\u001b[39mhistory[\u001b[39m'\u001b[39m\u001b[39mval_acc\u001b[39m\u001b[39m'\u001b[39m], label\u001b[39m=\u001b[39m\u001b[39m'\u001b[39m\u001b[39mval acc\u001b[39m\u001b[39m'\u001b[39m)\n\u001b[1;32m 62\u001b[0m plt\u001b[39m.\u001b[39mlegend()\n", - "\u001b[0;31mKeyError\u001b[0m: 'acc'" - ] - }, - { - "data": { - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" } ], - "source": [ - "from keras.layers import Input, Lambda, Dense, Flatten\n", - "from keras.models import Model\n", - "from keras.applications import ResNet50\n", - "from keras.preprocessing import image\n", - "from keras.preprocessing.image import ImageDataGenerator\n", - "from keras.models import Sequential\n", - "import numpy as np\n", - "from glob import glob\n", - "import matplotlib.pyplot as plt\n", - "\n", - "# re-size all the images to this\n", - "IMAGE_SIZE = [224, 224]\n", - "\n", - "# add preprocessing layer to the front of resnet\n", - "resnet = ResNet50(input_shape=IMAGE_SIZE + [3], weights='imagenet', include_top=False)\n", - "\n", - "# don't train existing weights\n", - "for layer in resnet.layers:\n", - " layer.trainable = False\n", - " \n", - " # useful for getting number of classes\n", - "classes = 5\n", - " \n", - "\n", - "# our layers - you can add more if you want\n", - "x = Flatten()(resnet.output)\n", - "# x = Dense(1000, activation='relu')(x)\n", - "prediction = Dense(5, activation='softmax')(x)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], "source": [ "# create a model object\n", "model = Model(inputs=resnet.input, outputs=prediction)\n", @@ -1112,9 +1073,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 34, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/6b/j4d60ym516x2s6wymzj707rh0000gn/T/ipykernel_9339/2291254579.py:10: UserWarning: `Model.fit_generator` is deprecated and will be removed in a future version. Please use `Model.fit`, which supports generators.\n", + " r = model.fit_generator(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "25/25 [==============================] - 54s 2s/step - loss: 7.2784 - accuracy: 0.2350 - val_loss: 2.7387 - val_accuracy: 0.2240\n" + ] + } + ], "source": [ "# tell the model what cost and optimization method to use\n", "model.compile(\n", @@ -1128,7 +1105,7 @@ "r = model.fit_generator(\n", " train_ds,\n", " validation_data=validation_ds,\n", - " epochs=100,\n", + " epochs=1,\n", " steps_per_epoch=len(train_ds),\n", " validation_steps=len(validation_ds)\n", ")" @@ -1136,9 +1113,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 35, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAioAAAHHCAYAAACRAnNyAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABGwklEQVR4nO3deXxN597///dOsDMnQkjSpqaaqjHUVHVaVE5JUdTUFDEEHdCietRNi/YUPTpoq3W3vUmOc4qipe1pNUVNNQ8nSg1FU/OsEjEkJNfvDz/7a0uQkGSt8Ho+HuvBvta11vqsJey3a11rb4cxxggAAMCGPKwuAAAA4FoIKgAAwLYIKgAAwLYIKgAAwLYIKgAAwLYIKgAAwLYIKgAAwLYIKgAAwLYIKgAAwLYIKgBy5HA4NHr06Dxv98cff8jhcCghISHfawJw5yGoADaWkJAgh8Mhh8Ohn3/+Odt6Y4wiIiLkcDjUunVrCyoEgIJFUAGKAC8vL02fPj1b+9KlS7V//345nU4LqgKAgkdQAYqAxx9/XLNnz9bFixfd2qdPn666desqNDTUosruHGfOnLG6BOCORFABioCYmBidOHFCCxYscLVlZGRozpw5evrpp3Pc5syZM3rppZcUEREhp9OpqlWr6u2339bVX5ienp6uwYMHKyQkRP7+/nriiSe0f//+HPd54MAB9e7dW2XLlpXT6VSNGjU0derUmzqnkydPaujQoYqMjJSfn58CAgIUHR2tTZs2Zet7/vx5jR49WlWqVJGXl5fCwsL05JNPavfu3a4+WVlZev/99xUZGSkvLy+FhISoZcuWWr9+vaTrz525ej7O6NGj5XA4tHXrVj399NMqWbKk/vKXv0iSfvnlF/Xs2VMVK1aUl5eXQkND1bt3b504cSLH6xUXF6fw8HA5nU5VqFBBzz33nDIyMvT777/L4XDovffey7bdypUr5XA4NGPGjLxeVuC2U8zqAgDcWPny5dWoUSPNmDFD0dHRkqT58+crJSVFTz31lD744AO3/sYYPfHEE1q8eLHi4uJUu3ZtJSYm6uWXX9aBAwfc3hz79Omjf//733r66af10EMP6aefflKrVq2y1XDkyBE9+OCDcjgcGjBggEJCQjR//nzFxcUpNTVVgwYNytM5/f7775o3b546deqkChUq6MiRI/rkk0/UpEkTbd26VeHh4ZKkzMxMtW7dWosWLdJTTz2lF198UadPn9aCBQu0ZcsWVapUSZIUFxenhIQERUdHq0+fPrp48aKWL1+u1atXq169enmq7bJOnTqpcuXKGjt2rCvgLViwQL///rt69eql0NBQ/frrr/r000/166+/avXq1XI4HJKkgwcPqkGDBjp16pT69eunatWq6cCBA5ozZ47Onj2rihUrqnHjxvr88881ePBgt+N+/vnn8vf3V9u2bW+qbuC2YgDYVnx8vJFk1q1bZyZNmmT8/f3N2bNnjTHGdOrUyTRr1swYY0y5cuVMq1atXNvNmzfPSDJ///vf3fbXsWNH43A4zK5du4wxxiQlJRlJ5vnnn3fr9/TTTxtJZtSoUa62uLg4ExYWZo4fP+7W96mnnjKBgYGuupKTk40kEx8ff91zO3/+vMnMzHRrS05ONk6n07z++uuutqlTpxpJ5t133822j6ysLGOMMT/99JORZF544YVr9rleXVef66hRo4wkExMTk63v5fO80owZM4wks2zZMldbbGys8fDwMOvWrbtmTZ988omRZLZt2+Zal5GRYUqXLm169OiRbTvgTsStH6CI6Ny5s86dO6f//Oc/On36tP7zn/9c87bP999/L09PT73wwgtu7S+99JKMMZo/f76rn6Rs/a4eHTHG6Msvv1SbNm1kjNHx48ddS4sWLZSSkqKNGzfm6XycTqc8PC79E5SZmakTJ07Iz89PVatWddvXl19+qdKlS2vgwIHZ9nF59OLLL7+Uw+HQqFGjrtnnZjz77LPZ2ry9vV2/P3/+vI4fP64HH3xQklx1Z2Vlad68eWrTpk2OozmXa+rcubO8vLz0+eefu9YlJibq+PHj6tat203XDdxOCCpAERESEqKoqChNnz5dX331lTIzM9WxY8cc++7Zs0fh4eHy9/d3a69evbpr/eVfPTw8XLdPLqtatarb62PHjunUqVP69NNPFRIS4rb06tVLknT06NE8nU9WVpbee+89Va5cWU6nU6VLl1ZISIh++eUXpaSkuPrt3r1bVatWVbFi175TvXv3boWHhys4ODhPNdxIhQoVsrWdPHlSL774osqWLStvb2+FhIS4+l2u+9ixY0pNTdX9999/3f0HBQWpTZs2bk90ff7557rrrrv06KOP5uOZAEUXc1SAIuTpp59W3759dfjwYUVHRysoKKhQjpuVlSVJ6tatm3r06JFjn5o1a+Zpn2PHjtWrr76q3r1764033lBwcLA8PDw0aNAg1/Hy07VGVjIzM6+5zZWjJ5d17txZK1eu1Msvv6zatWvLz89PWVlZatmy5U3VHRsbq9mzZ2vlypWKjIzUN998o+eff9412gTc6QgqQBHSvn17PfPMM1q9erW++OKLa/YrV66cFi5cqNOnT7uNqmzfvt21/vKvWVlZrlGLy3bs2OG2v8tPBGVmZioqKipfzmXOnDlq1qyZpkyZ4tZ+6tQplS5d2vW6UqVKWrNmjS5cuKDixYvnuK9KlSopMTFRJ0+evOaoSsmSJV37v9Ll0aXc+PPPP7Vo0SKNGTNGr732mqt9586dbv1CQkIUEBCgLVu23HCfLVu2VEhIiD7//HM1bNhQZ8+eVffu3XNdE3C7I7IDRYifn58mT56s0aNHq02bNtfs9/jjjyszM1OTJk1ya3/vvffkcDhcTw5d/vXqp4YmTpzo9trT01MdOnTQl19+meOb77Fjx/J8Lp6entkelZ49e7YOHDjg1tahQwcdP34827lIcm3foUMHGWM0ZsyYa/YJCAhQ6dKltWzZMrf1H3/8cZ5qvnKfl119vTw8PNSuXTt9++23rsejc6pJkooVK6aYmBjNmjVLCQkJioyMzPPoFHA7Y0QFKGKudevlSm3atFGzZs00YsQI/fHHH6pVq5Z+/PFHff311xo0aJBrTkrt2rUVExOjjz/+WCkpKXrooYe0aNEi7dq1K9s+x48fr8WLF6thw4bq27ev7rvvPp08eVIbN27UwoULdfLkyTydR+vWrfX666+rV69eeuihh7R582Z9/vnnqlixolu/2NhYTZs2TUOGDNHatWv18MMP68yZM1q4cKGef/55tW3bVs2aNVP37t31wQcfaOfOna7bMMuXL1ezZs00YMAASZcexR4/frz69OmjevXqadmyZfrtt99yXXNAQIAeeeQR/eMf/9CFCxd011136ccff1RycnK2vmPHjtWPP/6oJk2aqF+/fqpevboOHTqk2bNn6+eff3a7bRcbG6sPPvhAixcv1ltvvZWn6wjc9ix73gjADV35ePL1XP14sjHGnD592gwePNiEh4eb4sWLm8qVK5sJEya4Ho297Ny5c+aFF14wpUqVMr6+vqZNmzZm37592R7ZNcaYI0eOmP79+5uIiAhTvHhxExoaapo3b24+/fRTV5+8PJ780ksvmbCwMOPt7W0aN25sVq1aZZo0aWKaNGni1vfs2bNmxIgRpkKFCq7jduzY0ezevdvV5+LFi2bChAmmWrVqpkSJEiYkJMRER0ebDRs2uO0nLi7OBAYGGn9/f9O5c2dz9OjRaz6efOzYsWx179+/37Rv394EBQWZwMBA06lTJ3Pw4MEcr9eePXtMbGysCQkJMU6n01SsWNH079/fpKenZ9tvjRo1jIeHh9m/f/91rxtwp3EYc9UYJgCg0NWpU0fBwcFatGiR1aUAtsIcFQCw2Pr165WUlKTY2FirSwFshxEVALDIli1btGHDBr3zzjs6fvy4fv/9d3l5eVldFmArjKgAgEXmzJmjXr166cKFC5oxYwYhBcgBIyoAAMC2GFEBAAC2RVABAAC2VaQ/8C0rK0sHDx6Uv7//LX1DKgAAKDzGGJ0+fVrh4eE3/F6rIh1UDh48qIiICKvLAAAAN2Hfvn26++67r9unSAeVy1+2tm/fPgUEBFhcDQAAyI3U1FRFRES4fWnqtRTpoHL5dk9AQABBBQCAIiY30zaYTAsAAGyLoAIAAGyLoAIAAGyrSM9RAYCiLDMzUxcuXLC6DCDfFS9eXJ6envmyL4IKABQyY4wOHz6sU6dOWV0KUGCCgoIUGhp6y59zRlABgEJ2OaSUKVNGPj4+fGAlbivGGJ09e1ZHjx6VJIWFhd3S/ggqAFCIMjMzXSGlVKlSVpcDFAhvb29J0tGjR1WmTJlbug3EZFoAKESX56T4+PhYXAlQsC7/jN/qPCyCCgBYgNs9uN3l1884QQUAANgWQQUAANgWQQUAkCerVq2Sp6enWrVqZXUpuAMQVAAAeTJlyhQNHDhQy5Yt08GDBy2rIyMjw7Jjo/AQVAAAuZaWlqYvvvhCzz33nFq1aqWEhAS39d9++63q168vLy8vlS5dWu3bt3etS09P17BhwxQRESGn06l7771XU6ZMkSQlJCQoKCjIbV/z5s1zm5A5evRo1a5dW//3f/+nChUqyMvLS5L0ww8/6C9/+YuCgoJUqlQptW7dWrt373bb1/79+xUTE6Pg4GD5+vqqXr16WrNmjf744w95eHho/fr1bv0nTpyocuXKKSsr61YvGW4Rn6MCABYzxujchUxLju1d3DNPT2fMmjVL1apVU9WqVdWtWzcNGjRIw4cPl8Ph0Hfffaf27dtrxIgRmjZtmjIyMvT999+7to2NjdWqVav0wQcfqFatWkpOTtbx48fzVO+uXbv05Zdf6quvvnJ9NseZM2c0ZMgQ1axZU2lpaXrttdfUvn17JSUlycPDQ2lpaWrSpInuuusuffPNNwoNDdXGjRuVlZWl8uXLKyoqSvHx8apXr57rOPHx8erZs6c8PPj/vNUIKgBgsXMXMnXfa4mWHHvr6y3kUyL3bwVTpkxRt27dJEktW7ZUSkqKli5dqqZNm+rNN9/UU089pTFjxrj616pVS5L022+/adasWVqwYIGioqIkSRUrVsxzvRkZGZo2bZpCQkJcbR06dHDrM3XqVIWEhGjr1q26//77NX36dB07dkzr1q1TcHCwJOnee+919e/Tp4+effZZvfvuu3I6ndq4caM2b96sr7/+Os/1If8RFQEAubJjxw6tXbtWMTExkqRixYqpS5curts3SUlJat68eY7bJiUlydPTU02aNLmlGsqVK+cWUiRp586diomJUcWKFRUQEKDy5ctLkvbu3es6dp06dVwh5Wrt2rWTp6en5s6dK+nSbahmzZq59gNrMaICABbzLu6pra+3sOzYuTVlyhRdvHhR4eHhrjZjjJxOpyZNmuT62PQcj3OddZLk4eEhY4xbW06faOrr65utrU2bNipXrpw+++wzhYeHKysrS/fff79rsu2Njl2iRAnFxsYqPj5eTz75pKZPn67333//utug8BBUAMBiDocjT7dfrHDx4kVNmzZN77zzjh577DG3de3atdOMGTNUs2ZNLVq0SL169cq2fWRkpLKysrR06VLXrZ8rhYSE6PTp0zpz5owrjCQlJd2wrhMnTmjHjh367LPP9PDDD0uSfv75Z7c+NWvW1P/93//p5MmT1xxV6dOnj+6//359/PHHunjxop588skbHhuFw95/MwAAtvCf//xHf/75p+Li4hQYGOi2rkOHDpoyZYomTJig5s2bq1KlSnrqqad08eJFff/99xo2bJjKly+vHj16qHfv3q7JtHv27NHRo0fVuXNnNWzYUD4+Pvqf//kfvfDCC1qzZk22J4pyUrJkSZUqVUqffvqpwsLCtHfvXr3yyitufWJiYjR27Fi1a9dO48aNU1hYmP773/8qPDxcjRo1kiRVr15dDz74oIYNG6bevXvfcBQGhYc5KgCAG5oyZYqioqKyhRTpUlBZv369goOD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JG3atElPP/202+hQ+fLl1aNHD/Xu3Vvz5s1TcnKylixZolmzZrn6eHp6qmfPnho+fLgqV66c4625/EZQAQDkSVxcnP7880+1aNHCbT7JyJEj9cADD6hFixZq2rSpQkND1a5du1zv18PDQ3PnztW5c+fUoEED9enTR2+++aZbnyeeeEKDBw/WgAEDVLt2ba1cuVKvvvqqW58OHTqoZcuWatasmUJCQnJ8RNrHx0eJiYk6efKk6tevr44dO6p58+aaNGlS3i7GFS5PzM1pfknz5s3l7e2tf//73ypVqpR++uknpaWlqUmTJqpbt64+++wz122mHj16aOLEifr4449Vo0YNtW7dWjt37nTta+rUqbp48aLq1q2rQYMG6e9//3uu6nv33XdVsmRJPfTQQ2rTpo1atGihBx54wK3P5MmT1bFjRz3//POqVq2a+vbt6zbqJF3688/IyFCvXr3yeoluisNceaOriElNTVVgYKBSUlIUEBBgdTkAcEPnz59XcnKyKlSoIC8vL6vLAfJs+fLlat68ufbt23fd0afr/azn5f2bybQAAOCG0tPTdezYMY0ePVqdOnW66VtkecWtHwAAcEMzZsxQuXLldOrUKf3jH/8otOMSVAAAwA317NlTmZmZ2rBhg+66665COy5BBQAA2BZBBQAA2BZBBQAA2BZBBQAA2BZBBQAA2BZBBQAA2BZBBQAA2BZBBQCQKz179szTd/cA+YGgAgAAbIugAgC4ZUuXLlWDBg3kdDoVFhamV155RRcvXnStnzNnjiIjI+Xt7a1SpUopKirK9a28S5YsUYMGDeTr66ugoCA1btxYe/bssepUYDN8KSEAWMwYo3MXz1lybO9i3nI4HLe0jwMHDujxxx9Xz549NW3aNG3fvl19+/aVl5eXRo8erUOHDikmJkb/+Mc/1L59e50+fVrLly+XMUYXL15Uu3bt1LdvX82YMUMZGRlau3btLdeE2wdBBQAsdu7iOTWc3tCSY695eo18ivvc0j4+/vhjRUREaNKkSXI4HKpWrZoOHjyoYcOG6bXXXtOhQ4d08eJFPfnkkypXrpwkKTIyUpJ08uRJpaSkqHXr1qpUqZIkqXr16rd2UritcOsHAHBLtm3bpkaNGrmNgjRu3FhpaWnav3+/atWqpebNmysyMlKdOnXSZ599pj///FOSFBwcrJ49e6pFixZq06aN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Vq1arpAiXfrPc1ZWltt/oGvUqCFPT0/X67CwMB09ejRPx7rymBEREW7zK++77z4FBQVp27ZtkqQhQ4aoT58+ioqK0vjx47V7925X3xdeeEF///vf1bhxY40aNeqmJi8XRZaOqNSvX19z587V8OHD9frrr6tChQqaOHGiunbtamVZAFCoHN7eqrpxg2XHzou4uDgNHDhQH330keLj41WpUiU1adJEkjRhwgS9//77mjhxoiIjI+Xr66tBgwYpIyMj3+pdtWqVunbtqjFjxqhFixYKDAzUzJkz9c477+TbMa50+bbLZQ6HQ1lZWQVyLOnSE0tPP/20vvvuO82fP1+jRo3SzJkz1b59e/Xp00ctWrTQd999px9//FHjxo3TO++8o4EDBxZYPXZgaVCRLk3Qat26tdVlAIBlHA5Hrm+/WK1z58568cUXNX36dE2bNk3PPfeca77KihUr1LZtW3Xr1k3SpTkZv/32W7a5iNdSvXp17du3T4cOHVJYWJgkafXq1W59Vq5cqXLlymnEiBGutj179rj1KVGihDIzM294rISEBJ05c8Y1qrJixQp5eHioatWquao3ry6f3759+1yjKlu3btWpU6fcrlGVKlVUpUoVDR48WDExMYqPj1f79u0lSREREXr22Wf17LPPavjw4frss89u+6Bi+UfoAwCKDj8/P3Xp0kXDhw/XoUOH1LNnT9e6ypUra8GCBVq5cqW2bdumZ555xu2JlhuJiopSlSpV1KNHD23atEnLly93CySXj7F3717NnDlTu3fv1gcffKC5c+e69SlfvrySk5OVlJSk48ePKz09PduxunbtKi8vL/Xo0UNbtmzR4sWLNXDgQHXv3t01P+VmZWZmKikpyW3Ztm2boqKiFBkZqa5du2rjxo1au3atYmNj1aRJE9WrV0/nzp3TgAEDtGTJEu3Zs0crVqzQunXrVL16dUnSoEGDlJiYqOTkZG3cuFGLFy92rbudEVQAAHkSFxenP//8Uy1atHCbTzJy5Eg98MADatGihZo2barQ0FC1a9cu1/v18PDQ3Llzde7cOTVo0EB9+vTRm2++6dbniSee0ODBgzVgwADVrl1bK1eu1KuvvurWp0OHDmrZsqWaNWumkJCQHB+R9vHxUWJiok6ePKn69eurY8eOat68uSZNmpS3i5GDtLQ01alTx21p06aNHA6Hvv76a5UsWVKPPPKIoqKiVLFiRX3xxReSJE9PT504cUKxsbGqUqWKOnfurOjoaI0ZM0bSpQDUv39/Va9eXS1btlSVKlX08ccf33K9ducwxhiri7hZqampCgwMVEpKigICAqwuBwBu6Pz580pOTlaFChXk5eVldTlAgbnez3pe3r8ZUQEAALZFUAEAALZFUAEAALZFUAEAALZFUAEACxTh5xiAXMmvn3GCCgAUosufdHr27FmLKwEK1uWf8as/3TevLP9kWgC4k3h6eiooKMj1fTE+Pj65+vZioKgwxujs2bM6evSogoKC3L4r6WYQVACgkF3+Vt+b/XI7oCgICgq67jdY5xZBBQAKmcPhUFhYmMqUKaMLFy5YXQ6Q74oXL37LIymXEVQAwCKenp759o85cLtiMi0AALAtggoAALAtggoAALAtggoAALAtggoAALAtggoAALAtggoAALAtggoAALAtggoAALAtggoAALAtggoAALAtggoAALAtggoAALAtggoAALAtggoAALAtggoAALAtggoAALAtggoAALAtggoAALAtggoAALAtggoAALAtggoAALAtggoAALAtS4PK6NGj5XA43JZq1apZWRIAALCRYlYXUKNGDS1cuND1ulgxy0sCAAA2YXkqKFasmEJDQ60uAwAA2JDlc1R27typ8PBwVaxYUV27dtXevXuv2Tc9PV2pqaluCwAAuH1ZGlQaNmyohIQE/fDDD5o8ebKSk5P18MMP6/Tp0zn2HzdunAIDA11LREREIVcMAAAKk8MYY6wu4rJTp06pXLlyevfddxUXF5dtfXp6utLT012vU1NTFRERoZSUFAUEBBRmqQAA4CalpqYqMDAwV+/fls9RuVJQUJCqVKmiXbt25bje6XTK6XQWclUAAMAqls9RuVJaWpp2796tsLAwq0sBAAA2YGlQGTp0qJYuXao//vhDK1euVPv27eXp6amYmBgrywIAADZh6a2f/fv3KyYmRidOnFBISIj+8pe/aPXq1QoJCbGyLAAAYBOWBpWZM2daeXgAAGBztpqjAgAAcCWCCgAAsC2CCgAAsC2CCgAAsC2CCgAAsC2CCgAAsC2CCgAAsC2CCgAAsC2CCgAAsC2CCgAAsC2CCgAAsC2CCgAAsC2CCgAAsC2CCgAAsC2CCgAAsC2CCgAAsC2CCgAAsC2CCgAAsC2CCgAAsC2CCgAA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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# loss\n", "plt.plot(r.history[\"accuracy\"])\n", @@ -1153,6 +1141,33 @@ "\n", "model.save('resnet_1.h5')" ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "8/8 [==============================] - 12s 1s/step - loss: 2.9013 - accuracy: 0.2031\n" + ] + }, + { + "data": { + "text/plain": [ + "[2.901285171508789, 0.203125]" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.evaluate(test_ds)" + ] } ], "metadata": { diff --git a/sw_lab9-10_2.ipynb b/sw_lab9-10_2.ipynb new file mode 100644 index 0000000..d96a151 --- /dev/null +++ b/sw_lab9-10_2.ipynb @@ -0,0 +1,1252 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Aleksandra Jonas, Aleksandra Gronowska, Iwona Christop\n", + "# Zadanie 9-10 - AlexNet, VGG16, ResNet on village" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Przygotowanie danych" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from IPython.display import Image, display" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "import subprocess\n", + "import pkg_resources\n", + "import numpy as np\n", + "\n", + "required = { 'scikit-image'}\n", + "installed = {pkg.key for pkg in pkg_resources.working_set}\n", + "missing = required - installed\n", + "\n", + "if missing: \n", + " python = sys.executable\n", + " subprocess.check_call([python, '-m', 'pip', 'install', *missing], stdout=subprocess.DEVNULL)\n", + "\n", + "def load_data(input_dir, img_size):\n", + " import numpy as np\n", + " import pandas as pd\n", + " import os\n", + " from skimage.io import imread\n", + " import cv2 as cv\n", + " from pathlib import Path\n", + " import random\n", + " from shutil import copyfile, rmtree\n", + " import json\n", + "\n", + " import seaborn as sns\n", + " import matplotlib.pyplot as plt\n", + "\n", + " import matplotlib\n", + " \n", + " image_dir = Path(input_dir)\n", + " categories_name = []\n", + " for file in os.listdir(image_dir):\n", + " d = os.path.join(image_dir, file)\n", + " if os.path.isdir(d):\n", + " categories_name.append(file)\n", + "\n", + " folders = [directory for directory in image_dir.iterdir() if directory.is_dir()]\n", + " \n", + " ds_img = []\n", + " categories_count=[]\n", + " labels=[]\n", + " for i, direc in enumerate(folders):\n", + " count = 0\n", + " for obj in direc.iterdir():\n", + " if os.path.isfile(obj) and os.path.basename(os.path.normpath(obj)) != 'desktop.ini':\n", + " labels.append(os.path.basename(os.path.normpath(direc)))\n", + " count += 1\n", + " img = imread(obj)#zwraca ndarry postaci xSize x ySize x colorDepth\n", + " img = img[:, :, :3]\n", + " img = cv.resize(img, img_size, interpolation=cv.INTER_AREA)# zwraca ndarray\n", + " img = img / 255 #normalizacja\n", + " ds_img.append(img)\n", + " categories_count.append(count)\n", + " X={}\n", + " X[\"values\"] = np.array(ds_img)\n", + " X[\"categories_name\"] = categories_name\n", + " X[\"categories_count\"] = categories_count\n", + " X[\"labels\"]=labels\n", + " return X" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def get_run_logdir(root_logdir):\n", + " import os\n", + " import time\n", + "\n", + " run_id = time.strftime(\"run_%Y_%m_%d-%H_%M_%S\")\n", + " return os.path.join(root_logdir, run_id)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def diagram_setup(model_name):\n", + " from tensorflow import keras\n", + " import os\n", + " \n", + " root_logdir = os.path.join(os.curdir, f\"logs\\\\fit\\\\{model_name}\\\\\")\n", + " \n", + " run_logdir = get_run_logdir(root_logdir)\n", + " tensorboard_cb = keras.callbacks.TensorBoard(run_logdir)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def prepare_data(path, img_size, test_size, val_size):\n", + " from sklearn.model_selection import train_test_split\n", + " from sklearn.preprocessing import LabelEncoder\n", + " import tensorflow as tf\n", + "\n", + " data = load_data(path, img_size)\n", + " values = data['values']\n", + " labels = data['labels']\n", + "\n", + " X_train, X_test, y_train, y_test = train_test_split(values, labels, test_size=test_size, random_state=42)\n", + " X_train, X_validate, y_train, y_validate = train_test_split(X_train, y_train, test_size=val_size, random_state=42)\n", + "\n", + " class_le = LabelEncoder()\n", + " y_train_enc = class_le.fit_transform(y_train)\n", + " y_validate_enc = class_le.fit_transform(y_validate)\n", + " y_test_enc = class_le.fit_transform(y_test)\n", + "\n", + " train_ds = tf.data.Dataset.from_tensor_slices((X_train, y_train_enc))\n", + " validation_ds = tf.data.Dataset.from_tensor_slices((X_validate, y_validate_enc))\n", + " test_ds = tf.data.Dataset.from_tensor_slices((X_test, y_test_enc))\n", + "\n", + " train_ds_size = tf.data.experimental.cardinality(train_ds).numpy()\n", + " test_ds_size = tf.data.experimental.cardinality(test_ds).numpy()\n", + " validation_ds_size = tf.data.experimental.cardinality(validation_ds).numpy()\n", + "\n", + " #Rozmiary zbiorów\n", + " print(\"Training:\", train_ds_size)\n", + " print(\"Test:\", test_ds_size)\n", + " print(\"Validation:\", validation_ds_size)\n", + "\n", + " # Mieszanie zriorów\n", + " train_ds = (train_ds.shuffle(buffer_size=train_ds_size).batch(batch_size=32, drop_remainder=True))\n", + " test_ds = (test_ds.shuffle(buffer_size=train_ds_size).batch(batch_size=32, drop_remainder=True))\n", + " validation_ds = (validation_ds.shuffle(buffer_size=train_ds_size).batch(batch_size=32, drop_remainder=True))\n", + "\n", + " return train_ds, test_ds, validation_ds\n", + "\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# AlexNet" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:absl:`lr` is deprecated, please use `learning_rate` instead, or use the legacy optimizer, e.g.,tf.keras.optimizers.legacy.SGD.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"sequential\"\n", + "_________________________________________________________________\n", + " Layer (type) Output Shape Param # \n", + "=================================================================\n", + " conv2d (Conv2D) (None, 55, 55, 96) 34944 \n", + " \n", + " max_pooling2d (MaxPooling2D (None, 27, 27, 96) 0 \n", + " ) \n", + " \n", + " conv2d_1 (Conv2D) (None, 27, 27, 256) 614656 \n", + " \n", + " max_pooling2d_1 (MaxPooling (None, 13, 13, 256) 0 \n", + " 2D) \n", + " \n", + " conv2d_2 (Conv2D) (None, 13, 13, 384) 885120 \n", + " \n", + " conv2d_3 (Conv2D) (None, 13, 13, 384) 1327488 \n", + " \n", + " conv2d_4 (Conv2D) (None, 13, 13, 256) 884992 \n", + " \n", + " max_pooling2d_2 (MaxPooling (None, 6, 6, 256) 0 \n", + " 2D) \n", + " \n", + " flatten (Flatten) (None, 9216) 0 \n", + " \n", + " dense (Dense) (None, 4096) 37752832 \n", + " \n", + " dense_1 (Dense) (None, 4096) 16781312 \n", + " \n", + " dense_2 (Dense) (None, 3) 12291 \n", + " \n", + "=================================================================\n", + "Total params: 58,293,635\n", + "Trainable params: 58,293,635\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "from tensorflow import keras\n", + "import tensorflow as tf\n", + "import os\n", + "import time\n", + "\n", + "model = keras.models.Sequential([\n", + " keras.layers.Conv2D(filters=96, kernel_size=(11,11), strides=(4,4), activation='relu', input_shape=(227,227,3)),\n", + " keras.layers.MaxPool2D(pool_size=(3,3), strides=(2,2)),\n", + " keras.layers.Conv2D(filters=256, kernel_size=(5,5), strides=(1,1), activation='relu', padding=\"same\"),\n", + " keras.layers.MaxPool2D(pool_size=(3,3), strides=(2,2)),\n", + " keras.layers.Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), activation='relu', padding=\"same\"),\n", + " keras.layers.Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), activation='relu', padding=\"same\"),\n", + " keras.layers.Conv2D(filters=256, kernel_size=(3,3), strides=(1,1), activation='relu', padding=\"same\"),\n", + " keras.layers.MaxPool2D(pool_size=(3,3), strides=(2,2)),\n", + " keras.layers.Flatten(),\n", + " keras.layers.Dense(4096, activation='relu'),\n", + " keras.layers.Dense(4096, activation='relu'),\n", + " keras.layers.Dense(3, activation='softmax')\n", + "])\n", + "\n", + "model.compile(loss='sparse_categorical_crossentropy', optimizer=tf.optimizers.SGD(lr=.001), metrics=['accuracy'])\n", + "model.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training: 4772\n", + "Test: 1492\n", + "Validation: 1194\n" + ] + } + ], + "source": [ + "train_ds_a, test_ds_a, val_ds_a = prepare_data(\"./plantvillage/color\", (227, 227), 0.2, 0.2)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING:tensorflow:`period` argument is deprecated. Please use `save_freq` to specify the frequency in number of batches seen.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:tensorflow:`period` argument is deprecated. Please use `save_freq` to specify the frequency in number of batches seen.\n", + "/var/folders/6b/j4d60ym516x2s6wymzj707rh0000gn/T/ipykernel_9542/953612165.py:6: UserWarning: `Model.fit_generator` is deprecated and will be removed in a future version. Please use `Model.fit`, which supports generators.\n", + " alex = model.fit_generator(\n", + "2023-01-06 04:01:52.794677: W tensorflow/tsl/platform/profile_utils/cpu_utils.cc:128] Failed to get CPU frequency: 0 Hz\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "149/149 [==============================] - ETA: 0s - loss: 0.5993 - accuracy: 0.7576\n", + "Epoch 1: val_accuracy improved from -inf to 0.41385, saving model to alex_2.h5\n", + "149/149 [==============================] - 167s 1s/step - loss: 0.5993 - accuracy: 0.7576 - val_loss: 0.9947 - val_accuracy: 0.4139\n" + ] + } + ], + "source": [ + "from keras.callbacks import ModelCheckpoint, EarlyStopping\n", + "\n", + "checkpoint = ModelCheckpoint(\"alex_2.h5\", monitor='val_accuracy', verbose=1, save_best_only=True, save_weights_only=False, mode='auto', period=1)\n", + "early = EarlyStopping(monitor='val_accuracy', min_delta=0, patience=20, verbose=1, mode='auto')\n", + "\n", + "alex = model.fit_generator(\n", + " steps_per_epoch=len(train_ds_a), \n", + " generator=train_ds_a, \n", + " validation_data= val_ds_a, \n", + " validation_steps=len(val_ds_a), \n", + " epochs=1, \n", + " callbacks=[checkpoint,early])" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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khSGGyIiIpIUhhsiIiKSFIYbIiIikhSGGyIiIpIUhhsiIiKSFIYbIiIikhSGGyIiIpIUhhsiIiKSFIYbIiIikhSGGyIiIpIUhhsiIiKSFIYbIiIikpR6EW6WLVsGV1dXGBkZoWPHjjh69GilfZOSkiCTyTQmIyOjOqyWiIiI6jOdh5t169YhJiYGsbGxOHnyJLy8vBAYGIibN29WuoyFhQWys7PV05UrV+qwYiIiIqrPdB5uFi1ahKioKERERKBNmzZYsWIFTExMkJCQUOkyMpkMDg4O6sne3r4OKyYiIqL6TKfhprS0FCdOnEBAQIC6TS6XIyAgAGlpaZUuV1RUhKZNm8LFxQV9+/bF77//XmnfkpISFBYWakxEREQkXToNN3l5eVAqleXOvNjb2yMnJ6fCZVq1aoWEhAT89NNP+OGHH6BSqdCpUydcu3atwv7z5s2DpaWlenJxcan1/SAiIqL6Q+eXpWrK398fYWFh8Pb2RpcuXbB582bY2dnhu+++q7D/1KlTUVBQoJ6uXr1axxUTERFRXdLX5cZtbW2hp6eH3Nxcjfbc3Fw4ODhUax0GBgZo3749Ll68WOF8hUIBhULxwrUSERFRw6DTMzeGhobw8fFBamqquk2lUiE1NRX+/v7VWodSqcTp06fh6OiorTKJiIioAdHpmRsAiImJQXh4OHx9feHn54e4uDgUFxcjIiICABAWFgZnZ2fMmzcPADBnzhy8/vrraNGiBfLz8zF//nxcuXIFo0eP1uVuEBERUT2h83ATEhKCW7duYebMmcjJyYG3tzd27typHmSclZUFufz/TjDdvXsXUVFRyMnJgbW1NXx8fHD48GG0adNGV7tARERE9YhMCCF0XURdKiwshKWlJQoKCmBhYaHrcoiIiKgaavL73eDuliIiIiKqCsMNERERSQrDDREREUkKww0RERFJCsMNERERSQrDDREREUkKww0RERFJCsMNERERSQrDDREREUkKww0RERFJCsMNERERSQrDDREREUkKww0RERFJCsMNERERSQrDDREREUkKww0RERFJCsMNERERSQrDDREREUkKww0RERFJCsMNERERSQrDDREREUkKww0RERFJCsMNERERSQrDDREREUkKww0RERFJCsMNERERSQrDDREREUkKww0RERFJCsMNERERSQrDDREREUkKww0RERFJCsMN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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "plt.plot(alex.history[\"accuracy\"])\n", + "plt.plot(alex.history['val_accuracy'])\n", + "plt.plot(alex.history['loss'])\n", + "plt.plot(alex.history['val_loss'])\n", + "plt.title(\"Model accuracy\")\n", + "plt.ylabel(\"Value\")\n", + "plt.xlabel(\"Epoch\")\n", + "plt.legend([\"Accuracy\",\"Validation Accuracy\",\"Loss\",\"Validation Loss\"])\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "46/46 [==============================] - 24s 518ms/step - loss: 1.0025 - accuracy: 0.4137\n" + ] + }, + { + "data": { + "text/plain": [ + "[1.0024936199188232, 0.41372281312942505]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.evaluate(test_ds_a)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# VGG16" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"sequential_1\"\n", + "_________________________________________________________________\n", + " Layer (type) Output Shape Param # \n", + "=================================================================\n", + " conv2d_5 (Conv2D) (None, 224, 224, 64) 1792 \n", + " \n", + " conv2d_6 (Conv2D) (None, 224, 224, 64) 36928 \n", + " \n", + " max_pooling2d_3 (MaxPooling (None, 112, 112, 64) 0 \n", + " 2D) \n", + " \n", + " conv2d_7 (Conv2D) (None, 112, 112, 128) 73856 \n", + " \n", + " conv2d_8 (Conv2D) (None, 112, 112, 128) 147584 \n", + " \n", + " max_pooling2d_4 (MaxPooling (None, 56, 56, 128) 0 \n", + " 2D) \n", + " \n", + " conv2d_9 (Conv2D) (None, 56, 56, 256) 295168 \n", + " \n", + " conv2d_10 (Conv2D) (None, 56, 56, 256) 590080 \n", + " \n", + " conv2d_11 (Conv2D) (None, 56, 56, 256) 590080 \n", + " \n", + " max_pooling2d_5 (MaxPooling (None, 28, 28, 256) 0 \n", + " 2D) \n", + " \n", + " conv2d_12 (Conv2D) (None, 28, 28, 512) 1180160 \n", + " \n", + " conv2d_13 (Conv2D) (None, 28, 28, 512) 2359808 \n", + " \n", + " conv2d_14 (Conv2D) (None, 28, 28, 512) 2359808 \n", + " \n", + " max_pooling2d_6 (MaxPooling (None, 14, 14, 512) 0 \n", + " 2D) \n", + " \n", + " conv2d_15 (Conv2D) (None, 14, 14, 512) 2359808 \n", + " \n", + " conv2d_16 (Conv2D) (None, 14, 14, 512) 2359808 \n", + " \n", + " conv2d_17 (Conv2D) (None, 14, 14, 512) 2359808 \n", + " \n", + " flatten_1 (Flatten) (None, 100352) 0 \n", + " \n", + " dense_3 (Dense) (None, 4096) 411045888 \n", + " \n", + " dense_4 (Dense) (None, 4096) 16781312 \n", + " \n", + " dense_5 (Dense) (None, 3) 12291 \n", + " \n", + "=================================================================\n", + "Total params: 442,554,179\n", + "Trainable params: 442,554,179\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/jonas/Library/Python/3.9/lib/python/site-packages/keras/optimizers/optimizer_v2/adam.py:117: UserWarning: The `lr` argument is deprecated, use `learning_rate` instead.\n", + " super().__init__(name, **kwargs)\n" + ] + } + ], + "source": [ + "import keras,os\n", + "from keras.models import Sequential\n", + "from keras.layers import Dense, Conv2D, MaxPool2D , Flatten\n", + "from keras.preprocessing.image import ImageDataGenerator\n", + "from keras.optimizers import Adam\n", + "import numpy as np\n", + "\n", + "model = keras.models.Sequential([\n", + " keras.layers.Conv2D(filters=64, kernel_size=(3,3), activation='relu', input_shape=(224,224,3), padding=\"same\"),\n", + " keras.layers.Conv2D(filters=64, kernel_size=(3,3), activation='relu', input_shape=(224,224,3), padding=\"same\"),\n", + " keras.layers.MaxPool2D(pool_size=(2,2), strides=(2,2)),\n", + " keras.layers.Conv2D(filters=128, kernel_size=(3,3), padding=\"same\", activation=\"relu\"),\n", + " keras.layers.Conv2D(filters=128, kernel_size=(3,3), padding=\"same\", activation=\"relu\"),\n", + " keras.layers.MaxPool2D(pool_size=(2,2), strides=(2,2)),\n", + " keras.layers.Conv2D(filters=256, kernel_size=(3,3), padding=\"same\", activation=\"relu\"),\n", + " keras.layers.Conv2D(filters=256, kernel_size=(3,3), padding=\"same\", activation=\"relu\"),\n", + " keras.layers.Conv2D(filters=256, kernel_size=(3,3), padding=\"same\", activation=\"relu\"),\n", + " keras.layers.MaxPool2D(pool_size=(2,2), strides=(2,2)),\n", + " keras.layers.Conv2D(filters=512, kernel_size=(3,3), padding=\"same\", activation=\"relu\"),\n", + " keras.layers.Conv2D(filters=512, kernel_size=(3,3), padding=\"same\", activation=\"relu\"),\n", + " keras.layers.Conv2D(filters=512, kernel_size=(3,3), padding=\"same\", activation=\"relu\"),\n", + " keras.layers.MaxPool2D(pool_size=(2,2), strides=(2,2)),\n", + " keras.layers.Conv2D(filters=512, kernel_size=(3,3), padding=\"same\", activation=\"relu\"),\n", + " keras.layers.Conv2D(filters=512, kernel_size=(3,3), padding=\"same\", activation=\"relu\"),\n", + " keras.layers.Conv2D(filters=512, kernel_size=(3,3), padding=\"same\", activation=\"relu\"),\n", + " keras.layers.Flatten(),\n", + " keras.layers.Dense(units = 4096, activation='relu'),\n", + " keras.layers.Dense(units = 4096, activation='relu'),\n", + " keras.layers.Dense(units = 3, activation='softmax')\n", + "])\n", + "\n", + "opt = Adam(lr=0.001)\n", + "model.compile(optimizer=opt, loss=keras.losses.sparse_categorical_crossentropy, metrics=['accuracy'])\n", + "\n", + "model.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training: 4772\n", + "Test: 1492\n", + "Validation: 1194\n" + ] + } + ], + "source": [ + "train_ds_v, test_ds_v, val_ds_v = prepare_data('./plantvillage/color', (224, 224), 0.2, 0.2)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING:tensorflow:`period` argument is deprecated. Please use `save_freq` to specify the frequency in number of batches seen.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:tensorflow:`period` argument is deprecated. Please use `save_freq` to specify the frequency in number of batches seen.\n", + "/var/folders/6b/j4d60ym516x2s6wymzj707rh0000gn/T/ipykernel_9542/385174540.py:5: UserWarning: `Model.fit_generator` is deprecated and will be removed in a future version. Please use `Model.fit`, which supports generators.\n", + " vgg = model.fit_generator(steps_per_epoch=len(train_ds_v), generator=train_ds_v, validation_data= val_ds_v, validation_steps=len(val_ds_v), epochs=1, callbacks=[checkpoint,early])\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "149/149 [==============================] - ETA: 0s - loss: 0.8037 - accuracy: 0.7024 \n", + "Epoch 1: val_accuracy improved from -inf to 0.72804, saving model to vgg16_2.h5\n", + "149/149 [==============================] - 3159s 21s/step - loss: 0.8037 - accuracy: 0.7024 - val_loss: 0.7223 - val_accuracy: 0.7280\n" + ] + } + ], + "source": [ + "from keras.callbacks import ModelCheckpoint, EarlyStopping\n", + "\n", + "checkpoint = ModelCheckpoint(\"vgg16_2.h5\", monitor='val_accuracy', verbose=1, save_best_only=True, save_weights_only=False, mode='auto', period=1)\n", + "early = EarlyStopping(monitor='val_accuracy', min_delta=0, patience=20, verbose=1, mode='auto')\n", + "vgg = model.fit_generator(steps_per_epoch=len(train_ds_v), generator=train_ds_v, validation_data= val_ds_v, validation_steps=len(val_ds_v), epochs=1, callbacks=[checkpoint,early])" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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h5/bxoABA2BsbIx169Zh7969mDBhQpX2/SoYgIiISOtMTEzg7++PefPmISsrC+PGjZPXtW7dGvHx8Thx4gTS0tLw3nvvlXvnY2W8vb3Rpk0bBAcH49y5czh69Cjmz5+vUad169bIzMxEbGwsrl69itWrV2Pnzp0adVxcXJCRkYGUlBTk5eWhuLi43L7GjBkDAwMDBAcHIzU1FQcPHkRYWBjGjh370g/kvX37Nn744QcEBwfjjTfe0FiCgoKwa9cu3L17F1OnTkVBQQFGjRqFM2fO4PLly/jXv/4lX3pbvHgxvvzyS6xevRqXL19GcnIyvv76awBPztK8+eabWLZsGdLS0nD48GGNOVGVad26NXbs2IGUlBScO3cOo0eP1jib5eLiguDgYEyYMAG7du1CRkYGDh06hK1bt8p1dHR0MG7cOMybNw+tW7euk9dXMQAREVG9EBISgj/++AM+Pj4a83UWLFiAv/zlL/Dx8UHv3r1hb29fracuq1Qq7Ny5Ew8fPoSnpydCQ0M13iAAAIMHD8aMGTMwdepUuLu748SJE1i4cKFGnWHDhqFfv37o06cPbG1tK7wV38jICPv27cPdu3fRtWtXDB8+HH379sWaNWuqdzD+5OmE6orm7/Tt2xeGhob497//DWtra/z8888oLCxEr1690KVLF3z//ffy5bbg4GBERkbim2++QceOHTFo0CBcvnxZbmv9+vV4/PgxunTpgunTp+OTTz6pUv9WrlwJS0tLdO/eHb6+vvDx8cFf/vIXjTrr1q3D8OHD8f7776Ndu3aYOHGixlky4Mk//5KSkjp7dRWfBF0BPgmaiBqahvokaKKnjh49ir59++L69euVni2rqSdBcxI0ERERaU1xcTFu376NxYsXY8SIEXX27k5eAiMiIiKt2bx5M5ydnXHv3j188cUXdbZfBiAiIiLSmnHjxqGsrAxnz55Fs2bN6my/DEBERESkOAxAREREpDgMQERERKQ4DEBERESkOAxAREREpDgMQERERKQ4DEBERESkOAxARESkVePGjavWu72IagIDEBERESkOAxAREdVbhw8fhqenJ/T19eHg4IC5c+fi8ePH8vpt27bB1dUVhoaGsLa2hre3t/yW8UOHDsHT0xPGxsawsLBAjx49cO3aNW0NheoZvgyViKiREkLg4eOHWtm3oa4hJEl6pTZu3ryJAQMG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9pVuW1RUhNjYWISEhJRrU1dXFx06dNAob9++faV3genr68PMzExjISIiosZLawFIT08PXbp0QUJCglymVquRkJCAbt26VbptXFwciouLERgYWK7Nrl27Ij09XaP8119/hbOzc811noiIiBo0XW3uPDw8HMHBwfDw8ICnpyciIyNRVFSE8ePHAwCCgoLQrFkzLF26VGO7qKgo+Pn5wdraulybs2fPhr+/P3r27Ik+ffpg7969+OGHH3Do0KG6GBIRERE1AFoNQP7+/rh9+zYWLVqE7OxsuLu7Y+/evfLE6MzMTKhUmiep0tPTcezYMezfv7/CNocOHYpvv/0WS5cuxbRp09C2bVts374db731Vq2Ph4iIiBqGl3oO0OPHj3Ho0CFcvXoVo0ePhqmpKW7dugUzMzOYmJjURj/rFJ8DRERE1PBU5/e72meArl27hn79+iEzMxPFxcX461//ClNTU3z++ecoLi6u9G4rIiIiovqg2pOgP/jgA3h4eOCPP/6AoaGhXD506FCNCc1ERERE9VW1zwAdPXoUJ06cgJ6enka5i4sLbt68WWMdIyIiIqot1T4DpFarUVZWVq78xo0bMDU1rZFOEREREdWmagegv/3tb4iMjJQ/S5KEwsJCREREYMCAATXZNyIiIqJaUe27wG7cuAEfHx8IIXD58mV4eHjg8uXLsLGxwZEjR9C0adPa6mud4V1gREREDU91fr9f+jb42NhYnD9/HoWFhfjLX/6CMWPGaEyKbsgYgIiIiBqeWr0NHgB0dXXLvYaCiIiIqKGodgDasGFDpeuDgoJeujNEREREdaHal8AsLS01PpeWluLBgwfQ09ODkZER7t69W6Md1AZeAiMiImp4qvP7Xe27wP744w+NpbCwEOnp6XjrrbewefPml+40ERERUV2pdgCqSOvWrbFs2TJ88MEHNdEcERERUa2qkQAEPJkYfevWrZpqjoiIiKjWVHsS9O7duzU+CyGQlZWFNWvWoEePHjXWMSIiIqLaUu0A5Ofnp/FZkiTY2trinXfewZdffllT/SIiIiKqNdUOQGq1ujb6QURERFRnamwOEBEREVFDUaUzQOHh4VVucOXKlS/dGSIiIqK6UKUA9H//939VakySpFfqDBEREVFdqFIAOnjwYG33g4iIiKjOcA4QERERKc5LvQ3+zJkz2Lp1KzIzM1FSUqKxbseOHTXSMSIiIqLaUu0zQLGxsejevTvS0tKwc+dOlJaW4pdffsHPP/8Mc3Pz2ugjERERUY2qdgD67LPP8NVXX+GHH36Anp4eVq1ahUuXLmHkyJFo3rx5bfSRiIiIqEZVOwBdvXoVAwcOBADo6emhqKgIkiRhxowZ+O6772q8g0REREQ1rdoByNLSEvfv3wcANGvWDKmpqQCAe/fu4cGDBzXbOyIiIqJaUOUA9DTo9OzZE/Hx8QCAESNG4IMPPsDEiRMREBCAvn371k4viYiIiGpQle8C69SpE7p27Qo/Pz+MGDECADB//nw0adIEJ06cwLBhw7BgwYJa6ygRERFRTZGEEKIqFY8ePYro6Ghs27YNarUaw4YNQ2hoKN5+++3a7mOdKygogLm5OfLz82FmZqbt7hAREVEVVOf3u8qXwN5++22sX78eWVlZ+Prrr/H777+jV69eaNOmDT7//HNkZ2e/cseJiIiI6kK1J0EbGxtj/PjxOHz4MH799VeMGDECa9euRfPmzTF48ODa6CMRERFRjaryJbDnKSoqwsaNGzFv3jzcu3cPZWVlNdU3reElMCIiooanOr/fL/UqDAA4cuQI1q9fj+3bt0OlUmHkyJEICQl52eaIiIiI6ky1AtCtW7cQExODmJgYXLlyBd27d8fq1asxcuRIGBsb11YfiYiIiGpUlQNQ//79ceDAAdjY2CAoKAgTJkxA27Zta7NvRERERLWiygGoSZMm2LZtGwYNGgQdHZ3a7BMRERFRrapyANq9e3dt9oOIiIiozlT7NngiIiKiho4BiIiIiBSHAYiIiIgUhwGIiIiIFIcBiIiIiBSHAYiIiIgUhwGIiIiIFIcBiIiIiBSHAYiIiIgUhwGIiIiIFIcBiIiIiBSHAYiIiIgUhwGIiIiIFIcBiIiIiBSHAYiIiIgUhwGIiIiIFIcBiIiIiBSHAYiIiIgUp14EoLVr18LFxQUGBgbw8vJCUlLSc+v27t0bkiSVWwYOHFhh/cmTJ0OSJERGRtZS74mIiKih0XoA2rJlC8LDwxEREYHk5GS4ubnBx8cHubm5FdbfsWMHsrKy5CU1NRU6OjoYMWJEubo7d+7EyZMn4ejoWNvDICIiogZE6wFo5cqVmDhxIsaPH48OHTrg22+/hZGREdavX19hfSsrK9jb28tLfHw8jIyMygWgmzdvIiwsDBs3bkSTJk3qYihERETUQGg1AJWUlODs2bPw9vaWy1QqFby9vZGYmFilNqKiojBq1CgYGxvLZWq1GmPHjsXs2bPRsWPHF7ZRXFyMgoICjYWIiIgaL60GoLy8PJSVlcHOzk6j3M7ODtnZ2S/cPikpCampqQgNDdUo//zzz6Grq4tp06ZVqR9Lly6Fubm5vDg5OVV9EERERNTgaP0S2KuIioqCq6srPD095bKzZ89i1apViImJgSRJVWpn3rx5yM/Pl5fr16/XVpeJiIioHtBqALKxsYGOjg5ycnI0ynNycmBvb1/ptkVFRYiNjUVISIhG+dGjR5Gbm4vmzZtDV1cXurq6uHbtGmbOnAkXF5cK29LX14eZmZnGQkRERI2XVgOQnp4eunTpgoSEBLlMrVYjISEB3bp1q3TbuLg4FBcXIzAwUKN87NixOH/+PFJSUuTF0dERs2fPxr59+2plHERERNSw6Gq7A+Hh4QgODoaHhwc8PT0RGRmJoqIijB8/HgAQFBSEZs2aYenSpRrbRUVFwc/PD9bW1hrl1tbW5cqaNGkCe3t7tG3btnYHQ0RERA2C1gOQv78/bt++jUWLFiE7Oxvu7u7Yu3evPDE6MzMTKpXmiar09HQcO3YM+/fv10aXiYiIqIGThBBC252obwoKCmBubo78/HzOByIiImogqvP73aDvAiMiIiJ6GQxAREREpDgMQERERKQ4DEBERESkOAxAREREpDgMQERERKQ4DEBERESkOAxAREREpDgMQERERKQ4DEBERESkOAxAREREpDgMQERERKQ4DEBERESkOAxAREREpDgMQERERKQ4DEBERESkOAxAREREpDgMQERERKQ4DEBERESkOAxAREREpDgMQERERKQ4DEBERESkOAxAREREpDgMQERERKQ4DEBERESkOAxAREREpDgMQERERKQ4DEBERESkOAxAREREpDgMQERERKQ4DEBERESkOAxAREREpDgMQERERKQ4DEBERESkOAxAREREpDgMQERERKQ4DEBERESkOAxAREREpDgMQERERKQ4DEBERESkOAxAREREpDgMQERERKQ4DEBERESkOAxAREREpDgMQERERKQ4DEBERESkOAxAREREpDgMQERERKQ4DEBERESkOAxAREREpDgMQERERKQ4DEBERESkOAxAREREpDgMQERERKQ4DEBERESkOPUiAK1duxYuLi4wMDCAl5cXkpKSnlu3d+/ekCSp3DJw4EAAQGlpKebMmQNXV1cYGxvD0dERQUFBuHXrVl0Nh4iIiOo5rQegLVu2IDw8HBEREUhOToabmxt8fHyQm5tbYf0dO3YgKytLXlJTU6Gjo4MRI0YAAB48eIDk5GQsXLgQycnJ2LFjB9LT0zF48OC6HBYRERHVY5IQQmizA15eXujatSvWrFkDAFCr1XByckJYWBjmzp37wu0jIyOxaNEiZGVlwdjYuMI6p0+fhqenJ65du4bmzZu/sM2CggKYm5sjPz8fZmZm1RsQERERaUV1fr+1egaopKQEZ8+ehbe3t1ymUqng7e2NxMTEKrURFRWFUaNGPTf8AEB+fj4kSYKFhcWrdpmIiIgaAV1t7jwvLw9lZWWws7PTKLezs8OlS5deuH1SUhJSU1MRFRX13DqPHj3CnDlzEBAQ8Nw0WFxcjOLiYvlzQUFBFUdAREREDZHW5wC9iqioKLi6usLT07PC9aWlpRg5ciSEEFi3bt1z21m6dCnMzc3lxcnJqba6TERERPWAVgOQjY0NdHR0kJOTo1Gek5MDe3v7SrctKipCbGwsQkJCKlz/NPxcu3YN8fHxlV4LnDdvHvLz8+Xl+vXr1R8MERERNRhaDUB6enro0qULEhIS5DK1Wo2EhAR069at0m3j4uJQXFyMwMDAcuuehp/Lly/jwIEDsLa2rrQtfX19mJmZaSxERETUeGl1DhAAhIeHIzg4GB4eHvD09ERkZCSKioowfvx4AEBQUBCaNWuGpUuXamwXFRUFPz+/cuGmtLQUw4cPR3JyMv773/+irKwM2dnZAAArKyvo6enVzcCIiIio3tJ6APL398ft27exaNEiZGdnw93dHXv37pUnRmdmZkKl0jxRlZ6ejmPHjmH//v3l2rt58yZ2794NAHB3d9dYd/DgQfTu3btWxkFEREQNh9afA1Qf8TlAREREDU+DeQ4QERERkTYwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHi1IsAtHbtWri4uMDAwABeXl5ISkp6bt3evXtDkqRyy8CBA+U6QggsWrQIDg4OMDQ0hLe3Ny5fvlwXQyEiIqIGQOsBaMuWLQgPD0dERASSk5Ph5uYGHx8f5ObmVlh/x44dyMrKkpfU1FTo6OhgxIgRcp0vvvgCq1evxrfffotTp07B2NgYPj4+ePToUV0Ni4iIiOoxSQghtNkBLy8vdO3aFWvWrAEAqNVqODk5ISwsDHPnzn3h9pGRkVi0aBGysrJgbGwMIQQcHR0xc+ZMzJo1CwCQn58POzs7xMTEYNSoUS9ss6CgAObm5sjPz4eZmdmrDZCIiIjqRHV+v7V6BqikpARnz56Ft7e3XKZSqeDt7Y3ExMQqtREVFYVRo0bB2NgYAJCRkYHs7GyNNs3NzeHl5fXcNouLi1FQUKCxEBERUeOl1QCUl5eHsrIy2NnZaZTb2dkhOzv7hdsnJSUhNTUVoaGhctnT7arT5tKlS2Fubi4vTk5O1R0KERERNSBanwP0KqKiouDq6gpPT89XamfevHnIz8+Xl+vXr9dQD4mIiKg+0moAsrGxgY6ODnJycjTKc3JyYG9vX+m2RUVFiI2NRUhIiEb50+2q06a+vj7MzMw0FiIiImq8tBqA9PT00KVLFyQkJMhlarUaCQkJ6NatW6XbxsXFobi4GIGBgRrlLVq0gL29vUabBQUFOHXq1AvbJCIiImXQ1XYHwsPDERwcDA8PD3h6eiIyMhJFRUUYP348ACAoKAjNmjXD0qVLNbaLioqCn58frK2tNcolScL06dPxySefoHXr1mjRogUWLlwIR0dH+Pn51dWwiIiIqB7TegDy9/fH7du3sWjRImRnZ8Pd3R179+6VJzFnZmZCpdI8UZWeno5jx45h//79Fbb54Ycfoqio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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "plt.plot(vgg.history[\"accuracy\"])\n", + "plt.plot(vgg.history['val_accuracy'])\n", + "plt.plot(vgg.history['loss'])\n", + "plt.plot(vgg.history['val_loss'])\n", + "plt.title(\"Model accuracy\")\n", + "plt.ylabel(\"Value\")\n", + "plt.xlabel(\"Epoch\")\n", + "plt.legend([\"Accuracy\",\"Validation Accuracy\",\"Loss\",\"Validation Loss\"])\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "46/46 [==============================] - 238s 5s/step - loss: 0.7124 - accuracy: 0.7364\n" + ] + }, + { + "data": { + "text/plain": [ + "[0.7124184966087341, 0.7364130616188049]" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.evaluate(test_ds_v)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# ResNet50" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"model\"\n", + "__________________________________________________________________________________________________\n", + " Layer (type) Output Shape Param # Connected to \n", + "==================================================================================================\n", + " input_1 (InputLayer) [(None, 224, 224, 3 0 [] \n", + " )] \n", + " \n", + " conv1_pad (ZeroPadding2D) (None, 230, 230, 3) 0 ['input_1[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", + " flatten_2 (Flatten) (None, 100352) 0 ['conv5_block3_out[0][0]'] \n", + " \n", + " dense_6 (Dense) (None, 5) 501765 ['flatten_2[0][0]'] \n", + " \n", + "==================================================================================================\n", + "Total params: 24,089,477\n", + "Trainable params: 501,765\n", + "Non-trainable params: 23,587,712\n", + "__________________________________________________________________________________________________\n" + ] + } + ], + "source": [ + "from keras.layers import Input, Lambda, Dense, Flatten\n", + "from keras.models import Model\n", + "from keras.applications import ResNet50\n", + "from keras.preprocessing import image\n", + "from keras.preprocessing.image import ImageDataGenerator\n", + "from keras.models import Sequential\n", + "import numpy as np\n", + "from glob import glob\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# re-size all the images to this\n", + "IMAGE_SIZE = [224, 224]\n", + "\n", + "# add preprocessing layer to the front of resnet\n", + "resnet = ResNet50(input_shape=IMAGE_SIZE + [3], weights='imagenet', include_top=False)\n", + "\n", + "# don't train existing weights\n", + "for layer in resnet.layers:\n", + " layer.trainable = False\n", + " \n", + " # useful for getting number of classes\n", + "classes = 5\n", + " \n", + "\n", + "# our layers - you can add more if you want\n", + "x = Flatten()(resnet.output)\n", + "# x = Dense(1000, activation='relu')(x)\n", + "prediction = Dense(5, activation='softmax')(x)\n", + "\n", + "# create a model object\n", + "model = Model(inputs=resnet.input, outputs=prediction)\n", + "\n", + "# view the structure of the model\n", + "model.summary()\n", + "\n", + "# tell the model what cost and optimization method to use\n", + "model.compile(\n", + " loss='sparse_categorical_crossentropy',\n", + " optimizer='adam',\n", + " metrics=['accuracy']\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'prepare_data' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[1], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m train_ds_r, test_ds_r, val_ds_r \u001b[39m=\u001b[39m prepare_data(\u001b[39m'\u001b[39m\u001b[39m./plantvillage/color\u001b[39m\u001b[39m'\u001b[39m, img_size\u001b[39m=\u001b[39mIMAGE_SIZE, test_size\u001b[39m=\u001b[39m\u001b[39m0.2\u001b[39m, val_size\u001b[39m=\u001b[39m\u001b[39m0.2\u001b[39m)\n", + "\u001b[0;31mNameError\u001b[0m: name 'prepare_data' is not defined" + ] + } + ], + "source": [ + "train_ds_r, test_ds_r, val_ds_r = prepare_data('./plantvillage/color', img_size=IMAGE_SIZE, test_size=0.2, val_size=0.2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "r = model.fit_generator(\n", + " train_ds_r,\n", + " validation_data=val_ds_r,\n", + " epochs=1,\n", + " steps_per_epoch=len(train_ds_r),\n", + " validation_steps=len(val_ds_r)\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plt.plot(r.history[\"accuracy\"])\n", + "plt.plot(r.history['val_accuracy'])\n", + "plt.plot(r.history['loss'])\n", + "plt.plot(r.history['val_loss'])\n", + "plt.title(\"Model accuracy\")\n", + "plt.ylabel(\"Value\")\n", + "plt.xlabel(\"Epoch\")\n", + "plt.legend([\"Accuracy\",\"Validation Accuracy\",\"Loss\",\"Validation Loss\"])\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "model.save('resnet_2.h5')\n", + "model.evaluate(test_ds_r)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.6" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}