{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "6876d5cf", "metadata": {}, "outputs": [], "source": [ "from tensorflow.keras.layers import Input, Lambda, Dense, Flatten\n", "from tensorflow.keras.models import Model\n", "from tensorflow.keras.applications.vgg16 import VGG16, preprocess_input\n", "\n", "\n", "from glob import glob\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "IMAGE_SIZE = [224, 224]" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "train_dir='../fish-dataset/FishImgDataset/train'\n", "test_dir='../fish-dataset/FishImgDataset/test'\n", "val_dir='../fish-dataset/FishImgDataset/val'" ] }, { "cell_type": "code", "execution_count": 4, "id": "580e4e14", "metadata": {}, "outputs": [], "source": [ "# Define the input layer\n", "input_layer = Input(shape=IMAGE_SIZE + [3])" ] }, { "cell_type": "code", "execution_count": 5, "id": "6abf63f1", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "WARNING:tensorflow:From c:\\Users\\kengu\\AppData\\Local\\Programs\\Python\\Python310\\lib\\site-packages\\keras\\src\\backend\\tensorflow\\core.py:219: The name tf.placeholder is deprecated. Please use tf.compat.v1.placeholder instead.\n", "\n" ] } ], "source": [ "# Add preprocessing layer\n", "preprocessed = Lambda(preprocess_input)(input_layer)" ] }, { "cell_type": "code", "execution_count": 6, "id": "18c27a36", "metadata": {}, "outputs": [], "source": [ "# Load VGG16 model with pretrained ImageNet weights, without top layers\n", "vgg = VGG16(input_shape=IMAGE_SIZE + [3], weights='imagenet', include_top=False)" ] }, { "cell_type": "code", "execution_count": 7, "id": "5d291e73", "metadata": {}, "outputs": [], "source": [ "# Freeze the layers so they won't be trained\n", "for layer in vgg.layers:\n", " layer.trainable = False" ] }, { "cell_type": "code", "execution_count": 8, "id": "b400a18d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "31" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# For getting number of classes\n", "folders = glob('../fish-dataset/FishImgDataset/train/*')\n", "len(folders)" ] }, { "cell_type": "code", "execution_count": 9, "id": "c1cce70c", "metadata": {}, "outputs": [], "source": [ "# Layers\n", "x = Flatten()(vgg.output)\n", "# x = Dense(1000, activation='relu')(x)\n", "prediction = Dense(len(folders), activation='softmax')(x)" ] }, { "cell_type": "code", "execution_count": 10, "id": "36084bef", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Model: \"functional\"\n",
"\n"
],
"text/plain": [
"\u001b[1mModel: \"functional\"\u001b[0m\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
"┃ Layer (type) ┃ Output Shape ┃ Param # ┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
"│ input_layer_1 (InputLayer) │ (None, 224, 224, 3) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ block1_conv1 (Conv2D) │ (None, 224, 224, 64) │ 1,792 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ block1_conv2 (Conv2D) │ (None, 224, 224, 64) │ 36,928 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ block1_pool (MaxPooling2D) │ (None, 112, 112, 64) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ block2_conv1 (Conv2D) │ (None, 112, 112, 128) │ 73,856 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ block2_conv2 (Conv2D) │ (None, 112, 112, 128) │ 147,584 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ block2_pool (MaxPooling2D) │ (None, 56, 56, 128) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ block3_conv1 (Conv2D) │ (None, 56, 56, 256) │ 295,168 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ block3_conv2 (Conv2D) │ (None, 56, 56, 256) │ 590,080 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ block3_conv3 (Conv2D) │ (None, 56, 56, 256) │ 590,080 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ block3_pool (MaxPooling2D) │ (None, 28, 28, 256) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ block4_conv1 (Conv2D) │ (None, 28, 28, 512) │ 1,180,160 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ block4_conv2 (Conv2D) │ (None, 28, 28, 512) │ 2,359,808 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ block4_conv3 (Conv2D) │ (None, 28, 28, 512) │ 2,359,808 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ block4_pool (MaxPooling2D) │ (None, 14, 14, 512) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ block5_conv1 (Conv2D) │ (None, 14, 14, 512) │ 2,359,808 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ block5_conv2 (Conv2D) │ (None, 14, 14, 512) │ 2,359,808 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ block5_conv3 (Conv2D) │ (None, 14, 14, 512) │ 2,359,808 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ block5_pool (MaxPooling2D) │ (None, 7, 7, 512) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ flatten (Flatten) │ (None, 25088) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense (Dense) │ (None, 31) │ 777,759 │\n",
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
"\n"
],
"text/plain": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
"┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
"│ input_layer_1 (\u001b[38;5;33mInputLayer\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m224\u001b[0m, \u001b[38;5;34m224\u001b[0m, \u001b[38;5;34m3\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ block1_conv1 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m224\u001b[0m, \u001b[38;5;34m224\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m1,792\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ block1_conv2 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m224\u001b[0m, \u001b[38;5;34m224\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m36,928\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ block1_pool (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m112\u001b[0m, \u001b[38;5;34m112\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ block2_conv1 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m112\u001b[0m, \u001b[38;5;34m112\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m73,856\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ block2_conv2 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m112\u001b[0m, \u001b[38;5;34m112\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m147,584\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ block2_pool (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m56\u001b[0m, \u001b[38;5;34m56\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ block3_conv1 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m56\u001b[0m, \u001b[38;5;34m56\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m295,168\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ block3_conv2 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m56\u001b[0m, \u001b[38;5;34m56\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m590,080\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ block3_conv3 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m56\u001b[0m, \u001b[38;5;34m56\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m590,080\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ block3_pool (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ block4_conv1 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m1,180,160\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ block4_conv2 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m2,359,808\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ block4_conv3 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m2,359,808\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ block4_pool (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m14\u001b[0m, \u001b[38;5;34m14\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ block5_conv1 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m14\u001b[0m, \u001b[38;5;34m14\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m2,359,808\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ block5_conv2 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m14\u001b[0m, \u001b[38;5;34m14\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m2,359,808\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ block5_conv3 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m14\u001b[0m, \u001b[38;5;34m14\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m2,359,808\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ block5_pool (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m7\u001b[0m, \u001b[38;5;34m7\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ flatten (\u001b[38;5;33mFlatten\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m25088\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m31\u001b[0m) │ \u001b[38;5;34m777,759\u001b[0m │\n",
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"Total params: 15,492,447 (59.10 MB)\n", "\n" ], "text/plain": [ "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m15,492,447\u001b[0m (59.10 MB)\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Trainable params: 777,759 (2.97 MB)\n", "\n" ], "text/plain": [ "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m777,759\u001b[0m (2.97 MB)\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Non-trainable params: 14,714,688 (56.13 MB)\n", "\n" ], "text/plain": [ "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m14,714,688\u001b[0m (56.13 MB)\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Model object\n", "model = Model(inputs=vgg.input, outputs=prediction)\n", "\n", "# View the structure of the model\n", "model.summary()" ] }, { "cell_type": "code", "execution_count": 11, "id": "bf8918ba", "metadata": {}, "outputs": [], "source": [ "model.compile(\n", " loss='categorical_crossentropy',\n", " optimizer='adam',\n", " metrics=['accuracy']\n", ")" ] }, { "cell_type": "code", "execution_count": null, "id": "b01124ab", "metadata": {}, "outputs": [], "source": [ "from tensorflow.keras.callbacks import EarlyStopping\n", "\n", "early_stop = EarlyStopping(monitor='val_loss', patience=3, restore_best_weights=True)" ] }, { "cell_type": "code", "execution_count": 13, "id": "3a032b23", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Found 8791 images belonging to 31 classes.\n", "Found 2751 images belonging to 31 classes.\n", "Found 1760 images belonging to 31 classes.\n" ] } ], "source": [ "from tensorflow.keras.preprocessing.image import ImageDataGenerator\n", "\n", "train_datagen = ImageDataGenerator(rescale = 1./255,\n", " shear_range = 0.2,\n", " zoom_range = 0.2,\n", " horizontal_flip = True)\n", "\n", "test_datagen = ImageDataGenerator(rescale = 1./255)\n", "val_datagen = ImageDataGenerator(rescale = 1./255)\n", "\n", "training_set = train_datagen.flow_from_directory(train_dir,\n", " target_size = (224, 224),\n", " batch_size = 32,\n", " class_mode = 'categorical')\n", "val_set= val_datagen.flow_from_directory(val_dir,\n", " target_size = (224, 224),\n", " batch_size = 32,\n", " class_mode = 'categorical')\n", "\n", "test_set = test_datagen.flow_from_directory(test_dir,\n", " target_size = (224, 224),\n", " batch_size = 32,\n", " class_mode = 'categorical')" ] }, { "cell_type": "code", "execution_count": 14, "id": "d19157b3", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "c:\\Users\\kengu\\AppData\\Local\\Programs\\Python\\Python310\\lib\\site-packages\\keras\\src\\trainers\\data_adapters\\py_dataset_adapter.py:121: UserWarning: Your `PyDataset` class should call `super().__init__(**kwargs)` in its constructor. `**kwargs` can include `workers`, `use_multiprocessing`, `max_queue_size`. Do not pass these arguments to `fit()`, as they will be ignored.\n", " self._warn_if_super_not_called()\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/10\n", "\u001b[1m275/275\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 3s/step - accuracy: 0.4034 - loss: 2.5734" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING:absl:You are saving your model as an HDF5 file via `model.save()` or `keras.saving.save_model(model)`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')` or `keras.saving.save_model(model, 'my_model.keras')`. \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m275/275\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1253s\u001b[0m 5s/step - accuracy: 0.4039 - loss: 2.5708 - val_accuracy: 0.7354 - val_loss: 0.9202\n", "Epoch 2/10\n", "\u001b[1m275/275\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 4s/step - accuracy: 0.7362 - loss: 0.9456" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING:absl:You are saving your model as an HDF5 file via `model.save()` or `keras.saving.save_model(model)`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')` or `keras.saving.save_model(model, 'my_model.keras')`. \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m275/275\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1305s\u001b[0m 5s/step - accuracy: 0.7362 - loss: 0.9456 - val_accuracy: 0.8313 - val_loss: 0.6029\n", "Epoch 3/10\n", "\u001b[1m275/275\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 4s/step - accuracy: 0.8167 - loss: 0.6451" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING:absl:You are saving your model as an HDF5 file via `model.save()` or `keras.saving.save_model(model)`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')` or `keras.saving.save_model(model, 'my_model.keras')`. \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m275/275\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1322s\u001b[0m 5s/step - accuracy: 0.8167 - loss: 0.6451 - val_accuracy: 0.8771 - val_loss: 0.4544\n", "Epoch 4/10\n", "\u001b[1m275/275\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1360s\u001b[0m 5s/step - accuracy: 0.8573 - loss: 0.4972 - val_accuracy: 0.8644 - val_loss: 0.5038\n", "Epoch 5/10\n", "\u001b[1m275/275\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 4s/step - accuracy: 0.8587 - loss: 0.4766" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING:absl:You are saving your model as an HDF5 file via `model.save()` or `keras.saving.save_model(model)`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')` or `keras.saving.save_model(model, 'my_model.keras')`. \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m275/275\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1266s\u001b[0m 5s/step - accuracy: 0.8588 - loss: 0.4765 - val_accuracy: 0.9008 - val_loss: 0.3746\n", "Epoch 6/10\n", "\u001b[1m275/275\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 4s/step - accuracy: 0.8818 - loss: 0.3935" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING:absl:You are saving your model as an HDF5 file via `model.save()` or `keras.saving.save_model(model)`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')` or `keras.saving.save_model(model, 'my_model.keras')`. \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m275/275\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1279s\u001b[0m 5s/step - accuracy: 0.8818 - loss: 0.3935 - val_accuracy: 0.9335 - val_loss: 0.2650\n", "Epoch 7/10\n", "\u001b[1m275/275\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 3s/step - accuracy: 0.9117 - loss: 0.2993" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING:absl:You are saving your model as an HDF5 file via `model.save()` or `keras.saving.save_model(model)`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')` or `keras.saving.save_model(model, 'my_model.keras')`. \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m275/275\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1246s\u001b[0m 5s/step - accuracy: 0.9117 - loss: 0.2994 - val_accuracy: 0.9397 - val_loss: 0.2450\n", "Epoch 8/10\n", "\u001b[1m275/275\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1188s\u001b[0m 4s/step - accuracy: 0.9248 - loss: 0.2489 - val_accuracy: 0.9331 - val_loss: 0.2535\n", "Epoch 9/10\n", "\u001b[1m275/275\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 4s/step - accuracy: 0.9244 - loss: 0.2411" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING:absl:You are saving your model as an HDF5 file via `model.save()` or `keras.saving.save_model(model)`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')` or `keras.saving.save_model(model, 'my_model.keras')`. \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m275/275\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1290s\u001b[0m 5s/step - accuracy: 0.9244 - loss: 0.2412 - val_accuracy: 0.9447 - val_loss: 0.2200\n", "Epoch 10/10\n", "\u001b[1m275/275\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 3s/step - accuracy: 0.9304 - loss: 0.2308" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING:absl:You are saving your model as an HDF5 file via `model.save()` or `keras.saving.save_model(model)`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')` or `keras.saving.save_model(model, 'my_model.keras')`. \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m275/275\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1120s\u001b[0m 4s/step - accuracy: 0.9304 - loss: 0.2309 - val_accuracy: 0.9447 - val_loss: 0.2185\n" ] } ], "source": [ "# Model Training\n", "FishModel = model.fit(\n", " training_set,\n", " validation_data=val_set,\n", " epochs=10,\n", " steps_per_epoch=len(training_set),\n", " validation_steps=len(val_set),\n", " callbacks=[early_stop, checkpoint]\n", ")\n" ] }, { "cell_type": "code", "execution_count": 15, "id": "85ff2eb9", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "