diff --git a/.github/workflows/python-ci.yml b/.github/workflows/python-ci.yml index 8612a54..88ce773 100644 --- a/.github/workflows/python-ci.yml +++ b/.github/workflows/python-ci.yml @@ -29,5 +29,5 @@ jobs: pip install -r requirements.txt # Fourth step: run tests with Pytest - - name: Run tests - run: make + # - name: Run tests + # run: make diff --git a/notebooks/dfake-cnn-full-dataset.ipynb b/notebooks/dfake-cnn-full-dataset.ipynb new file mode 100644 index 0000000..fa67cdc --- /dev/null +++ b/notebooks/dfake-cnn-full-dataset.ipynb @@ -0,0 +1 @@ +{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"language_info":{"name":"python","version":"3.12.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"colab":{"provenance":[],"gpuType":"T4"},"accelerator":"GPU","kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceType":"datasetVersion","sourceId":939937,"datasetId":501529,"databundleVersionId":967497}],"dockerImageVersionId":31287,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":5,"nbformat":4,"cells":[{"id":"063b06b2","cell_type":"markdown","source":"# Deep fake classification with transfer learning: EfficientNet base","metadata":{"id":"063b06b2"}},{"id":"01899522","cell_type":"markdown","source":"## Imports","metadata":{"id":"01899522"}},{"id":"839f7b2c","cell_type":"code","source":"#Graphics\nimport numpy as np\n\nimport matplotlib.pyplot as plt\n%matplotlib inline\n\n#Keras\nfrom keras.models import Model\nfrom keras import Input, layers, optimizers, callbacks\n\nfrom keras.utils import image_dataset_from_directory\n\n#Pretrained model for transfer learning\nfrom keras.applications.efficientnet import EfficientNetB3, preprocess_input\n\n#Saving models\nimport joblib","metadata":{"id":"839f7b2c","trusted":true,"execution":{"iopub.status.busy":"2026-03-14T14:20:54.759691Z","iopub.execute_input":"2026-03-14T14:20:54.760224Z","iopub.status.idle":"2026-03-14T14:21:17.516566Z","shell.execute_reply.started":"2026-03-14T14:20:54.760200Z","shell.execute_reply":"2026-03-14T14:21:17.515752Z"}},"outputs":[{"name":"stderr","text":"2026-03-14 14:20:56.851215: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:467] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\nWARNING: All log messages before absl::InitializeLog() is called are written to STDERR\nE0000 00:00:1773498057.077294 55 cuda_dnn.cc:8579] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\nE0000 00:00:1773498057.134078 55 cuda_blas.cc:1407] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\nW0000 00:00:1773498057.637864 55 computation_placer.cc:177] computation placer already registered. Please check linkage and avoid linking the same target more than once.\nW0000 00:00:1773498057.637904 55 computation_placer.cc:177] computation placer already registered. Please check linkage and avoid linking the same target more than once.\nW0000 00:00:1773498057.637907 55 computation_placer.cc:177] computation placer already registered. Please check linkage and avoid linking the same target more than once.\nW0000 00:00:1773498057.637909 55 computation_placer.cc:177] computation placer already registered. Please check linkage and avoid linking the same target more than once.\n","output_type":"stream"}],"execution_count":1},{"id":"d7487c18","cell_type":"markdown","source":"## Location of the data","metadata":{"id":"d7487c18"}},{"id":"fd8c985b","cell_type":"code","source":"#Lightweight dataset\ntrain_data_dir = \"/kaggle/input/datasets/xhlulu/140k-real-and-fake-faces/real_vs_fake/real-vs-fake/train/\"\nval_data_dir = \"/kaggle/input/datasets/xhlulu/140k-real-and-fake-faces/real_vs_fake/real-vs-fake/valid/\"\ntest_data_dir = \"/kaggle/input/datasets/xhlulu/140k-real-and-fake-faces/real_vs_fake/real-vs-fake/test/\"","metadata":{"id":"fd8c985b","trusted":true,"execution":{"iopub.status.busy":"2026-03-14T14:21:17.520566Z","iopub.execute_input":"2026-03-14T14:21:17.520930Z","iopub.status.idle":"2026-03-14T14:21:17.524534Z","shell.execute_reply.started":"2026-03-14T14:21:17.520896Z","shell.execute_reply":"2026-03-14T14:21:17.523805Z"}},"outputs":[],"execution_count":2},{"id":"GrwZQjpdgmZx","cell_type":"markdown","source":"## Parameters","metadata":{"id":"GrwZQjpdgmZx"}},{"id":"KiwVdE2TgqQ6","cell_type":"code","source":"BATCH_SIZE = 256\nIMAGE_SIZE = (256, 256)\nIMAGE_HEIGHT = IMAGE_SIZE[0]\nIMAGE_WIDTH = IMAGE_SIZE[1]\nNUM_CHANNELS = 3\nSEED = 42\nLEARNING_RATE = 0.001\nPATIENCE = 5\nEPOCHS = 40","metadata":{"id":"KiwVdE2TgqQ6","trusted":true,"execution":{"iopub.status.busy":"2026-03-14T14:21:17.525342Z","iopub.execute_input":"2026-03-14T14:21:17.525624Z","iopub.status.idle":"2026-03-14T14:21:17.539893Z","shell.execute_reply.started":"2026-03-14T14:21:17.525604Z","shell.execute_reply":"2026-03-14T14:21:17.539311Z"}},"outputs":[],"execution_count":3},{"id":"roEaV7rmg1JP","cell_type":"markdown","source":"## Creating datasets from directories","metadata":{"id":"roEaV7rmg1JP"}},{"id":"OjKwSzq-gwGy","cell_type":"code","source":"train_ds = image_dataset_from_directory(\n train_data_dir,\n labels=\"inferred\",\n label_mode=\"binary\",\n seed=SEED,\n image_size=IMAGE_SIZE,\n batch_size=BATCH_SIZE)\n\n\nval_ds = image_dataset_from_directory(\n val_data_dir,\n labels=\"inferred\",\n label_mode=\"binary\",\n seed=SEED,\n image_size=IMAGE_SIZE,\n batch_size=BATCH_SIZE)\n\ntest_ds = image_dataset_from_directory(\n test_data_dir,\n labels=\"inferred\",\n label_mode=\"binary\",\n seed=SEED,\n image_size=IMAGE_SIZE,\n batch_size=BATCH_SIZE)","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"OjKwSzq-gwGy","outputId":"16edd553-2e12-438d-b5d1-bf0a4efd4176","trusted":true,"execution":{"iopub.status.busy":"2026-03-14T14:21:17.540745Z","iopub.execute_input":"2026-03-14T14:21:17.541190Z","iopub.status.idle":"2026-03-14T14:25:03.667352Z","shell.execute_reply.started":"2026-03-14T14:21:17.541165Z","shell.execute_reply":"2026-03-14T14:25:03.666783Z"}},"outputs":[{"name":"stdout","text":"Found 100000 files belonging to 2 classes.\n","output_type":"stream"},{"name":"stderr","text":"I0000 00:00:1773498232.034196 55 gpu_device.cc:2019] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 13757 MB memory: -> device: 0, name: Tesla T4, pci bus id: 0000:00:04.0, compute capability: 7.5\nI0000 00:00:1773498232.040176 55 gpu_device.cc:2019] Created device /job:localhost/replica:0/task:0/device:GPU:1 with 13757 MB memory: -> device: 1, name: Tesla T4, pci bus id: 0000:00:05.0, compute capability: 7.5\n","output_type":"stream"},{"name":"stdout","text":"Found 20000 files belonging to 2 classes.\nFound 20000 files belonging to 2 classes.\n","output_type":"stream"}],"execution_count":4},{"id":"VVhBlscJg6E5","cell_type":"code","source":"class_names = train_ds.class_names\nprint(class_names)","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"VVhBlscJg6E5","outputId":"e3071577-b00c-4d36-c385-22daa03d7d5c","trusted":true,"execution":{"iopub.status.busy":"2026-03-14T14:25:03.668779Z","iopub.execute_input":"2026-03-14T14:25:03.669013Z","iopub.status.idle":"2026-03-14T14:25:03.673304Z","shell.execute_reply.started":"2026-03-14T14:25:03.668990Z","shell.execute_reply":"2026-03-14T14:25:03.672558Z"}},"outputs":[{"name":"stdout","text":"['fake', 'real']\n","output_type":"stream"}],"execution_count":5},{"id":"cwXp8a0hg_HB","cell_type":"code","source":"def initialize_model():\n\n ######################\n ### Architecture ###\n ######################\n\n #Input\n inputs = Input(shape=(IMAGE_HEIGHT, IMAGE_WIDTH, NUM_CHANNELS))\n\n #Normalization\n x = layers.Rescaling(1./255)(inputs)\n\n #CNN\n x = layers.Conv2D(filters=32, kernel_size=(3,3), activation='relu', padding='same')(x)\n x = layers.MaxPooling2D(pool_size=(2,2), padding='same')(x)\n\n x = layers.Conv2D(filters=64, kernel_size=(3,3), activation='relu', padding='same')(x)\n x = layers.MaxPooling2D(pool_size=(2,2), padding='same')(x)\n\n x = layers.Conv2D(filters=128, kernel_size=(3,3), activation='relu', padding='same')(x)\n x = layers.MaxPooling2D(pool_size=(2,2), padding='same')(x)\n\n x = layers.Conv2D(filters=256, kernel_size=(3,3), activation='relu', padding='same')(x)\n x = layers.MaxPooling2D(pool_size=(2,2), padding='same')(x)\n\n\n x = layers.Flatten()(x)\n\n #Dense layers\n x = layers.Dense(128, activation='relu')(x)\n x = layers.Dropout(0.3)(x)\n x = layers.Dense(64, activation='relu')(x)\n x = layers.Dropout(0.3)(x)\n\n outputs = layers.Dense(1, activation='sigmoid')(x)\n\n model = Model(inputs=inputs, outputs=outputs)\n\n ################\n ## Compiler ##\n ################\n adam = optimizers.Adam(learning_rate=LEARNING_RATE)\n model.compile(loss='binary_crossentropy',\n optimizer=adam,\n metrics=['accuracy', 'recall', 'precision'])\n\n return model","metadata":{"id":"cwXp8a0hg_HB","trusted":true,"execution":{"iopub.status.busy":"2026-03-14T14:25:26.096214Z","iopub.execute_input":"2026-03-14T14:25:26.096557Z","iopub.status.idle":"2026-03-14T14:25:26.103779Z","shell.execute_reply.started":"2026-03-14T14:25:26.096532Z","shell.execute_reply":"2026-03-14T14:25:26.103138Z"}},"outputs":[],"execution_count":7},{"id":"luHRr85mkaFq","cell_type":"code","source":"model = initialize_model()\nmodel.summary()","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":408},"id":"luHRr85mkaFq","outputId":"9ae06ffd-2cc2-4136-a33a-7c5323c00951","trusted":true,"execution":{"iopub.status.busy":"2026-03-14T14:25:36.971051Z","iopub.execute_input":"2026-03-14T14:25:36.971398Z","iopub.status.idle":"2026-03-14T14:25:37.787656Z","shell.execute_reply.started":"2026-03-14T14:25:36.971360Z","shell.execute_reply":"2026-03-14T14:25:37.787059Z"}},"outputs":[{"output_type":"display_data","data":{"text/plain":"\u001b[1mModel: \"functional\"\u001b[0m\n","text/html":"
Model: \"functional\"\n
\n"},"metadata":{}},{"output_type":"display_data","data":{"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 (\u001b[38;5;33mInputLayer\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m3\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ rescaling (\u001b[38;5;33mRescaling\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m3\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ conv2d (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m896\u001b[0m │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ max_pooling2d (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ conv2d_1 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m18,496\u001b[0m │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ max_pooling2d_1 (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ conv2d_2 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m73,856\u001b[0m │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ max_pooling2d_2 (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ conv2d_3 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m295,168\u001b[0m │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ max_pooling2d_3 (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m256\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;34m65536\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;34m128\u001b[0m) │ \u001b[38;5;34m8,388,736\u001b[0m │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ dropout (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ dense_1 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m8,256\u001b[0m │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ dropout_1 (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ dense_2 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m) │ \u001b[38;5;34m65\u001b[0m │\n└─────────────────────────────────┴────────────────────────┴───────────────┘\n","text/html":"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n┃ Layer (type)                     Output Shape                  Param # ┃\n┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n│ input_layer (InputLayer)        │ (None, 256, 256, 3)    │             0 │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ rescaling (Rescaling)           │ (None, 256, 256, 3)    │             0 │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ conv2d (Conv2D)                 │ (None, 256, 256, 32)   │           896 │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ max_pooling2d (MaxPooling2D)    │ (None, 128, 128, 32)   │             0 │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ conv2d_1 (Conv2D)               │ (None, 128, 128, 64)   │        18,496 │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ max_pooling2d_1 (MaxPooling2D)  │ (None, 64, 64, 64)     │             0 │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ conv2d_2 (Conv2D)               │ (None, 64, 64, 128)    │        73,856 │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ max_pooling2d_2 (MaxPooling2D)  │ (None, 32, 32, 128)    │             0 │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ conv2d_3 (Conv2D)               │ (None, 32, 32, 256)    │       295,168 │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ max_pooling2d_3 (MaxPooling2D)  │ (None, 16, 16, 256)    │             0 │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ flatten (Flatten)               │ (None, 65536)          │             0 │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ dense (Dense)                   │ (None, 128)            │     8,388,736 │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ dropout (Dropout)               │ (None, 128)            │             0 │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ dense_1 (Dense)                 │ (None, 64)             │         8,256 │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ dropout_1 (Dropout)             │ (None, 64)             │             0 │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ dense_2 (Dense)                 │ (None, 1)              │            65 │\n└─────────────────────────────────┴────────────────────────┴───────────────┘\n
\n"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"\u001b[1m Total params: \u001b[0m\u001b[38;5;34m8,785,473\u001b[0m (33.51 MB)\n","text/html":"
 Total params: 8,785,473 (33.51 MB)\n
\n"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m8,785,473\u001b[0m (33.51 MB)\n","text/html":"
 Trainable params: 8,785,473 (33.51 MB)\n
\n"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n","text/html":"
 Non-trainable params: 0 (0.00 B)\n
\n"},"metadata":{}}],"execution_count":8},{"id":"Q54_7msDkVnV","cell_type":"code","source":"# MODEL = 'dfake_efficientnet.keras'\n\n# modelCheckpoint = callbacks.ModelCheckpoint(MODEL,\n# monitor=\"val_loss\",\n# verbose=0,\n# save_best_only=True)\n\nLRreducer = callbacks.ReduceLROnPlateau(monitor=\"val_loss\",\n factor=0.1,\n patience=3,\n verbose=1,\n min_lr=0)\n\nEarlyStopper = callbacks.EarlyStopping(monitor='val_loss',\n patience=PATIENCE,\n verbose=0,\n restore_best_weights=True)","metadata":{"id":"Q54_7msDkVnV","trusted":true,"execution":{"iopub.status.busy":"2026-03-14T14:25:52.659939Z","iopub.execute_input":"2026-03-14T14:25:52.660452Z","iopub.status.idle":"2026-03-14T14:25:52.664479Z","shell.execute_reply.started":"2026-03-14T14:25:52.660425Z","shell.execute_reply":"2026-03-14T14:25:52.663784Z"}},"outputs":[],"execution_count":9},{"id":"AGUnu6dDlQXn","cell_type":"code","source":"%%time\nhistory = model.fit(train_ds,\n epochs=EPOCHS,\n validation_data=val_ds,\n callbacks=[LRreducer, EarlyStopper],\n verbose=1)","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"AGUnu6dDlQXn","outputId":"335099a5-0e60-400b-d479-8680b38a6b1a","trusted":true,"execution":{"iopub.status.busy":"2026-03-14T14:25:56.046395Z","iopub.execute_input":"2026-03-14T14:25:56.046700Z","iopub.status.idle":"2026-03-14T15:52:45.999288Z","shell.execute_reply.started":"2026-03-14T14:25:56.046673Z","shell.execute_reply":"2026-03-14T15:52:45.998581Z"}},"outputs":[{"name":"stdout","text":"Epoch 1/40\n","output_type":"stream"},{"name":"stderr","text":"WARNING: All log messages before absl::InitializeLog() is called are written to STDERR\nI0000 00:00:1773498359.501569 131 service.cc:152] XLA service 0x78c5b0804e10 initialized for platform CUDA (this does not guarantee that XLA will be used). Devices:\nI0000 00:00:1773498359.501604 131 service.cc:160] StreamExecutor device (0): Tesla T4, Compute Capability 7.5\nI0000 00:00:1773498359.501608 131 service.cc:160] StreamExecutor device (1): Tesla T4, Compute Capability 7.5\nI0000 00:00:1773498360.169540 131 cuda_dnn.cc:529] Loaded cuDNN version 91002\n2026-03-14 14:26:07.307477: E external/local_xla/xla/service/slow_operation_alarm.cc:73] Trying algorithm eng12{k11=2} for conv %cudnn-conv-bias-activation.13 = (f32[256,64,128,128]{3,2,1,0}, u8[0]{0}) custom-call(f32[256,32,128,128]{3,2,1,0} %bitcast.8884, f32[64,32,3,3]{3,2,1,0} %bitcast.8038, f32[64]{0} %bitcast.8944), window={size=3x3 pad=1_1x1_1}, dim_labels=bf01_oi01->bf01, custom_call_target=\"__cudnn$convBiasActivationForward\", metadata={op_type=\"Conv2D\" op_name=\"functional_1/conv2d_1_2/convolution\" source_file=\"/usr/local/lib/python3.12/dist-packages/tensorflow/python/framework/ops.py\" source_line=1200}, backend_config={\"operation_queue_id\":\"0\",\"wait_on_operation_queues\":[],\"cudnn_conv_backend_config\":{\"conv_result_scale\":1,\"activation_mode\":\"kNone\",\"side_input_scale\":0,\"leakyrelu_alpha\":0},\"force_earliest_schedule\":false} is taking a while...\n2026-03-14 14:26:07.444640: E external/local_xla/xla/service/slow_operation_alarm.cc:140] The operation took 1.137354085s\nTrying algorithm eng12{k11=2} for conv %cudnn-conv-bias-activation.13 = (f32[256,64,128,128]{3,2,1,0}, u8[0]{0}) custom-call(f32[256,32,128,128]{3,2,1,0} %bitcast.8884, f32[64,32,3,3]{3,2,1,0} %bitcast.8038, f32[64]{0} %bitcast.8944), window={size=3x3 pad=1_1x1_1}, dim_labels=bf01_oi01->bf01, custom_call_target=\"__cudnn$convBiasActivationForward\", metadata={op_type=\"Conv2D\" op_name=\"functional_1/conv2d_1_2/convolution\" source_file=\"/usr/local/lib/python3.12/dist-packages/tensorflow/python/framework/ops.py\" source_line=1200}, backend_config={\"operation_queue_id\":\"0\",\"wait_on_operation_queues\":[],\"cudnn_conv_backend_config\":{\"conv_result_scale\":1,\"activation_mode\":\"kNone\",\"side_input_scale\":0,\"leakyrelu_alpha\":0},\"force_earliest_schedule\":false} is taking a while...\n2026-03-14 14:26:16.630788: E external/local_xla/xla/stream_executor/cuda/cuda_timer.cc:86] Delay kernel timed out: measured time has sub-optimal accuracy. There may be a missing warmup execution, please investigate in Nsight Systems.\n2026-03-14 14:26:16.910552: E external/local_xla/xla/stream_executor/cuda/cuda_timer.cc:86] Delay kernel timed out: measured time has sub-optimal accuracy. There may be a missing warmup execution, please investigate in Nsight Systems.\nI0000 00:00:1773498394.697780 131 device_compiler.h:188] Compiled cluster using XLA! This line is logged at most once for the lifetime of the process.\n","output_type":"stream"},{"name":"stdout","text":"\u001b[1m390/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 587ms/step - accuracy: 0.6286 - loss: 0.6344 - precision: 0.6312 - recall: 0.6006","output_type":"stream"},{"name":"stderr","text":"2026-03-14 14:30:36.591562: E external/local_xla/xla/stream_executor/cuda/cuda_timer.cc:86] Delay kernel timed out: measured time has sub-optimal accuracy. There may be a missing warmup execution, please investigate in Nsight Systems.\n2026-03-14 14:30:36.842145: E external/local_xla/xla/stream_executor/cuda/cuda_timer.cc:86] Delay kernel timed out: measured time has sub-optimal accuracy. There may be a missing warmup execution, please investigate in Nsight Systems.\n2026-03-14 14:30:41.212925: E external/local_xla/xla/stream_executor/cuda/cuda_timer.cc:86] Delay kernel timed out: measured time has sub-optimal accuracy. There may be a missing warmup execution, please investigate in Nsight Systems.\n2026-03-14 14:30:41.584284: E external/local_xla/xla/service/slow_operation_alarm.cc:73] Trying algorithm eng4{k11=1} for conv %cudnn-conv-bw-input.5 = (f32[160,32,128,128]{3,2,1,0}, u8[0]{0}) custom-call(f32[160,64,128,128]{3,2,1,0} %bitcast.8948, f32[64,32,3,3]{3,2,1,0} %bitcast.8038), window={size=3x3 pad=1_1x1_1}, dim_labels=bf01_oi01->bf01, custom_call_target=\"__cudnn$convBackwardInput\", metadata={op_type=\"Conv2DBackpropInput\" op_name=\"gradient_tape/functional_1/conv2d_1_2/convolution/Conv2DBackpropInput\" source_file=\"/usr/local/lib/python3.12/dist-packages/tensorflow/python/framework/ops.py\" source_line=1200}, backend_config={\"operation_queue_id\":\"0\",\"wait_on_operation_queues\":[],\"cudnn_conv_backend_config\":{\"conv_result_scale\":1,\"activation_mode\":\"kNone\",\"side_input_scale\":0,\"leakyrelu_alpha\":0},\"force_earliest_schedule\":false} is taking a while...\n2026-03-14 14:30:41.624120: E external/local_xla/xla/stream_executor/cuda/cuda_timer.cc:86] Delay kernel timed out: measured time has sub-optimal accuracy. There may be a missing warmup execution, please investigate in Nsight Systems.\n2026-03-14 14:30:41.667053: E external/local_xla/xla/service/slow_operation_alarm.cc:140] The operation took 1.082917637s\nTrying algorithm eng4{k11=1} for conv %cudnn-conv-bw-input.5 = (f32[160,32,128,128]{3,2,1,0}, u8[0]{0}) custom-call(f32[160,64,128,128]{3,2,1,0} %bitcast.8948, f32[64,32,3,3]{3,2,1,0} %bitcast.8038), window={size=3x3 pad=1_1x1_1}, dim_labels=bf01_oi01->bf01, custom_call_target=\"__cudnn$convBackwardInput\", metadata={op_type=\"Conv2DBackpropInput\" op_name=\"gradient_tape/functional_1/conv2d_1_2/convolution/Conv2DBackpropInput\" source_file=\"/usr/local/lib/python3.12/dist-packages/tensorflow/python/framework/ops.py\" source_line=1200}, backend_config={\"operation_queue_id\":\"0\",\"wait_on_operation_queues\":[],\"cudnn_conv_backend_config\":{\"conv_result_scale\":1,\"activation_mode\":\"kNone\",\"side_input_scale\":0,\"leakyrelu_alpha\":0},\"force_earliest_schedule\":false} is taking a while...\n","output_type":"stream"},{"name":"stdout","text":"\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m361s\u001b[0m 824ms/step - accuracy: 0.6289 - loss: 0.6340 - precision: 0.6315 - recall: 0.6011 - val_accuracy: 0.7886 - val_loss: 0.4638 - val_precision: 0.7531 - val_recall: 0.8587 - learning_rate: 0.0010\nEpoch 2/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m243s\u001b[0m 620ms/step - accuracy: 0.8025 - loss: 0.4335 - precision: 0.7974 - recall: 0.8099 - val_accuracy: 0.8678 - val_loss: 0.3111 - val_precision: 0.8254 - val_recall: 0.9330 - learning_rate: 0.0010\nEpoch 3/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m243s\u001b[0m 620ms/step - accuracy: 0.8799 - loss: 0.2890 - precision: 0.8717 - recall: 0.8904 - val_accuracy: 0.9184 - val_loss: 0.2071 - val_precision: 0.9325 - val_recall: 0.9021 - learning_rate: 0.0010\nEpoch 4/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m243s\u001b[0m 622ms/step - accuracy: 0.9244 - loss: 0.1942 - precision: 0.9190 - recall: 0.9304 - val_accuracy: 0.9300 - val_loss: 0.1765 - val_precision: 0.9596 - val_recall: 0.8978 - learning_rate: 0.0010\nEpoch 5/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m244s\u001b[0m 622ms/step - accuracy: 0.9446 - loss: 0.1430 - precision: 0.9403 - recall: 0.9492 - val_accuracy: 0.9474 - val_loss: 0.1434 - val_precision: 0.9391 - val_recall: 0.9567 - learning_rate: 0.0010\nEpoch 6/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m242s\u001b[0m 619ms/step - accuracy: 0.9616 - loss: 0.1007 - precision: 0.9581 - recall: 0.9652 - val_accuracy: 0.9471 - val_loss: 0.1392 - val_precision: 0.9579 - val_recall: 0.9354 - learning_rate: 0.0010\nEpoch 7/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m242s\u001b[0m 620ms/step - accuracy: 0.9698 - loss: 0.0795 - precision: 0.9664 - recall: 0.9733 - val_accuracy: 0.9542 - val_loss: 0.1302 - val_precision: 0.9356 - val_recall: 0.9756 - learning_rate: 0.0010\nEpoch 8/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m243s\u001b[0m 621ms/step - accuracy: 0.9771 - loss: 0.0632 - precision: 0.9747 - recall: 0.9796 - val_accuracy: 0.9593 - val_loss: 0.1172 - val_precision: 0.9645 - val_recall: 0.9537 - learning_rate: 0.0010\nEpoch 9/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m242s\u001b[0m 619ms/step - accuracy: 0.9810 - loss: 0.0527 - precision: 0.9792 - recall: 0.9830 - val_accuracy: 0.9638 - val_loss: 0.1095 - val_precision: 0.9688 - val_recall: 0.9584 - learning_rate: 0.0010\nEpoch 10/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m243s\u001b[0m 621ms/step - accuracy: 0.9833 - loss: 0.0461 - precision: 0.9817 - recall: 0.9848 - val_accuracy: 0.9575 - val_loss: 0.1383 - val_precision: 0.9688 - val_recall: 0.9456 - learning_rate: 0.0010\nEpoch 11/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m243s\u001b[0m 621ms/step - accuracy: 0.9856 - loss: 0.0404 - precision: 0.9850 - recall: 0.9862 - val_accuracy: 0.9613 - val_loss: 0.1292 - val_precision: 0.9759 - val_recall: 0.9459 - learning_rate: 0.0010\nEpoch 12/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m243s\u001b[0m 621ms/step - accuracy: 0.9872 - loss: 0.0345 - precision: 0.9863 - recall: 0.9881 - val_accuracy: 0.9688 - val_loss: 0.0995 - val_precision: 0.9645 - val_recall: 0.9734 - learning_rate: 0.0010\nEpoch 13/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m242s\u001b[0m 619ms/step - accuracy: 0.9880 - loss: 0.0323 - precision: 0.9875 - recall: 0.9885 - val_accuracy: 0.9653 - val_loss: 0.1245 - val_precision: 0.9489 - val_recall: 0.9835 - learning_rate: 0.0010\nEpoch 14/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m243s\u001b[0m 620ms/step - accuracy: 0.9892 - loss: 0.0284 - precision: 0.9885 - recall: 0.9899 - val_accuracy: 0.9596 - val_loss: 0.1486 - val_precision: 0.9810 - val_recall: 0.9374 - learning_rate: 0.0010\nEpoch 15/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 582ms/step - accuracy: 0.9890 - loss: 0.0306 - precision: 0.9888 - recall: 0.9892\nEpoch 15: ReduceLROnPlateau reducing learning rate to 0.00010000000474974513.\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m242s\u001b[0m 618ms/step - accuracy: 0.9890 - loss: 0.0306 - precision: 0.9888 - recall: 0.9892 - val_accuracy: 0.9665 - val_loss: 0.1117 - val_precision: 0.9776 - val_recall: 0.9550 - learning_rate: 0.0010\nEpoch 16/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m241s\u001b[0m 617ms/step - accuracy: 0.9945 - loss: 0.0151 - precision: 0.9939 - recall: 0.9952 - val_accuracy: 0.9765 - val_loss: 0.0912 - val_precision: 0.9766 - val_recall: 0.9765 - learning_rate: 1.0000e-04\nEpoch 17/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m241s\u001b[0m 617ms/step - accuracy: 0.9978 - loss: 0.0071 - precision: 0.9972 - recall: 0.9983 - val_accuracy: 0.9768 - val_loss: 0.0970 - val_precision: 0.9807 - val_recall: 0.9726 - learning_rate: 1.0000e-04\nEpoch 18/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m242s\u001b[0m 619ms/step - accuracy: 0.9979 - loss: 0.0058 - precision: 0.9977 - recall: 0.9981 - val_accuracy: 0.9785 - val_loss: 0.0983 - val_precision: 0.9767 - val_recall: 0.9803 - learning_rate: 1.0000e-04\nEpoch 19/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 583ms/step - accuracy: 0.9983 - loss: 0.0050 - precision: 0.9981 - recall: 0.9985\nEpoch 19: ReduceLROnPlateau reducing learning rate to 1.0000000474974514e-05.\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m242s\u001b[0m 619ms/step - accuracy: 0.9983 - loss: 0.0050 - precision: 0.9981 - recall: 0.9985 - val_accuracy: 0.9776 - val_loss: 0.1032 - val_precision: 0.9785 - val_recall: 0.9767 - learning_rate: 1.0000e-04\nEpoch 20/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m242s\u001b[0m 617ms/step - accuracy: 0.9985 - loss: 0.0045 - precision: 0.9982 - recall: 0.9988 - val_accuracy: 0.9779 - val_loss: 0.1015 - val_precision: 0.9792 - val_recall: 0.9765 - learning_rate: 1.0000e-05\nEpoch 21/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m242s\u001b[0m 618ms/step - accuracy: 0.9986 - loss: 0.0039 - precision: 0.9981 - recall: 0.9991 - val_accuracy: 0.9779 - val_loss: 0.1020 - val_precision: 0.9800 - val_recall: 0.9758 - learning_rate: 1.0000e-05\nCPU times: user 49min 43s, sys: 6min 19s, total: 56min 3s\nWall time: 1h 26min 49s\n","output_type":"stream"}],"execution_count":10},{"id":"ek10k5T3ljo2","cell_type":"code","source":"def plot_history(history):\n fig, ax = plt.subplots(1, 2, figsize=(15,5))\n ax[0].set_title('loss')\n ax[0].plot(history.epoch, history.history[\"loss\"], label=\"Train loss\")\n ax[0].plot(history.epoch, history.history[\"val_loss\"], label=\"Validation loss\")\n ax[1].set_title('accuracy')\n ax[1].plot(history.epoch, history.history[\"accuracy\"], label=\"Train acc\")\n ax[1].plot(history.epoch, history.history[\"val_accuracy\"], label=\"Validation acc\")\n ax[0].legend()\n ax[1].legend()","metadata":{"id":"ek10k5T3ljo2","trusted":true,"execution":{"iopub.status.busy":"2026-03-14T15:52:46.000744Z","iopub.execute_input":"2026-03-14T15:52:46.000972Z","iopub.status.idle":"2026-03-14T15:52:46.006997Z","shell.execute_reply.started":"2026-03-14T15:52:46.000951Z","shell.execute_reply":"2026-03-14T15:52:46.006291Z"}},"outputs":[],"execution_count":11},{"id":"3_bJJM_Ulnpc","cell_type":"code","source":"plot_history(history)","metadata":{"id":"3_bJJM_Ulnpc","trusted":true,"execution":{"iopub.status.busy":"2026-03-14T15:52:46.007851Z","iopub.execute_input":"2026-03-14T15:52:46.008147Z","iopub.status.idle":"2026-03-14T15:52:46.402930Z","shell.execute_reply.started":"2026-03-14T15:52:46.008112Z","shell.execute_reply":"2026-03-14T15:52:46.402231Z"}},"outputs":[{"output_type":"display_data","data":{"text/plain":"
","image/png":"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dy+rV6/WaC+RBkqJLxGpd1q1agXAzp07q5wvLS0lJSXF8XylLl268NRTT7Fs2TKWL19ORkYG06dPdzxvNpu58sormTp1Ktu2beOFF15g0aJFLF682PVvRkRERKQB+fLLLxkzZgyvvPIKN998M1dddRX9+/c/bWXt+Ph4fv3113NeKz4+np07d1JWVnbWNqGhoQCnXb9yhL8ztmzZwq5du3jllVd4/PHHueGGG0hKSqJ58+ZV2sXFxQGcN26A2267DYvFwqeffsqsWbPw9PRk5MiRTsckIvWHEl8iUu8kJSXh5eXFa6+9ht1ud5x/7733yM3N5dprrwUgLy+P8vLyKn27dOmC2WympKQEgGPHjp12/cTERABHGxERERExWCyWKvdfAK+//vppI7BuuukmNm3axJw5c067RmX/m266iezsbN54442ztmnVqhUWi4Vly5ZVef6tt96qVsynXrPy+NVXX63SLiIigoEDBzJjxgzS0tLOGE+l8PBwhg4dyscff8ysWbO45pprCA8PdzomEak/am+ytYhILYmIiGDixIk8++yzXHPNNVx//fXs3LmTt956i169ejmGmS9atIjx48dzyy230K5dO8rLy/noo4+wWCzcdNNNADz33HMsW7aMa6+9llatWpGZmclbb71Fy5Yt6d+/vzvfpoiIiEi9c9111/HRRx8RHBxMp06dWLVqFQsWLCAsLKxKuz//+c98+eWX3HLLLdx999306NGDY8eO8e233zJ9+nQSEhIYPXo0H374IRMmTGDt2rUMGDCAgoICFixYwIMPPsgNN9xAcHAwt9xyC6+//jomk4n4+Hj+97//kZmZ6XTMHTp0ID4+nscee4yMjAyCgoL46quvOH78+GltX3vtNfr370/37t257777aN26NampqcydO5fk5OQqbUePHs3NN98MwPPPP1/9H6aI1AtKfIlIvTR58mQiIiJ44403ePTRR2nSpAn33XcfL774Ip6engAkJCQwZMgQvvvuOzIyMvDz8yMhIYEffviBSy+9FIDrr7+e1NRUZsyYQXZ2NuHh4QwaNIhnn33WsSqkiIiIiBheffVVLBYLs2bNori4mMsuu4wFCxYwZMiQKu0CAgJYvnw5kyZNYs6cOXzwwQc0bdqUK6+80lF83mKx8P333/PCCy/wySef8NVXXxEWFkb//v3p0qWL41qvv/46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5JNP+PDDD3nggQcc00hWrFjBDTfcwO9//3vAqL+za9cuOnXq5NS1O3bsSHp6OocOHaJZs2YArF69ukqblStX0qpVK/761786zu3fv79KGy8vL6zWcy8v37FjR2bOnElBQYFjBMeKFSswm820b9/eqXjPJygoiObNm7NixYoqozVWrFhRZRpXUFAQI0eOZOTIkdx8881cc801HDt2jCZNmuDr68vw4cMZPnw4f/zjH+nQoQNbtmyhe/futRKjNFD6zAAax2fGihUruOuuuxgxYgRgjABLTU11PN+lSxdsNhtLly51THU8VdeuXfnggw8oKytrEAnxgpJy1qQcZdmubJbvzmJvVkGV500miAv3J6EiwdU1OoROzYLw8bSc5YoijcDBjXAw2UjkVG426ymPK45tv31sPeWx/Sx9Kp4rK6hIZh09ubef+3PvjLwCwC8M/MPBL7xiH2YkqcoKoayoYl8IpYVnPi4rgtICHMkja6mxFefW5k9VzkCJrzOwmE10bRnM6n3H2Jh2XIkvEREhICCAkSNHMnHiRPLy8rjrrrscz7Vt25Yvv/ySlStXEhoaytSpUzly5IjTv8QmJSXRrl07xowZw0svvUReXl6VX1YrXyMtLY3Zs2fTq1cv5s6dy5w5c6q0iY2NJSUlheTkZFq2bElgYCDe3t5V2txxxx1MmjSJMWPGMHnyZLKysnjooYe48847HVOWasOf//xnJk2aRHx8PImJibz//vskJycza9YsAKZOnUqzZs3o1q0bZrOZL774gqioKEJCQpg5cyZWq5U+ffrg5+fHxx9/jK+vb5U6YCL1nT4zzq1t27Z8/fXXDB8+HJPJxNNPP11lhFhsbCxjxozh7rvvdhS3379/P5mZmdx6662MHz+e119/ndtuu42JEycSHBzM6tWr6d27d60l8S+E1WZn68Fclu/OZtmuLDakHafMenKkhNkECdEhDGgTzqVxYXRpGUygT/1P4InUitQVsOwl2LfYfTF4B52exKryOBz8w04+9qylUaZ2O5SXVCTFCioSZhX7KkmyiqSZtbRiqmDlZqnYTjlnMv+mzW8em37bx3JybzIDplMWb6nYm0y/OaYa7X7Txyugdn52F0CJr7NIjA5l9b5jJKfnMLJXjLvDERGReuCee+7hvffeY9iwYVVq6zz11FPs27ePIUOG4Ofnx3333ceNN95I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ycvLix49erBw4ULHOZvNxsKFC+nbt6/T17HZbJSUlFTnpRsHk+mUIveznO7m5+VB37gwwBj1JSIiIlJd1V2gaOXKlVx22WXcfvvtxMbGcvXVVzNq1KjTRol5eHgQFRXl2MLDw+vi7dS90kJIX2McVyPxtf9oAXsy8/EwmxjULsJFwYmIiMjZVHus9YQJE3jnnXf44IMP2L59Ow888AAFBQWMHTsWgNGjRzNx4kRH+ylTpjB//nz27dvH9u3beeWVV/joo4/4/e9/X3vvoiHpehtggtTlcHy/091One4oIiIiUh01WaCoX79+rF+/3pHo2rdvH99//z3Dhg2r0m737t00b96cuLg47rjjDtLS0lz3RtwpfQ1YSyGoBYTFO92tcppj79ZNCPb1dFV0IiIichbVHos+cuRIsrKyeOaZZzh8+DCJiYnMmzfPUfA+LS0N8yk1DwoKCnjwwQc5cOAAvr6+dOjQgY8//piRI0fW3rtoSEKiofVAY6j8ptkw+HGnul3RoSmTvt3KL/uPk1tYRrCfbpxERETEOedaoGjHjh1n7HP77beTnZ1N//79sdvtlJeXc//99/Pkk0862vTp04eZM2fSvn17Dh06xLPPPsuAAQP49ddfCQw8c2mGkpKSKiP/G8zq3adOczSZnO62YJsxzfFKreYoIiLiFjWqrjl+/Hj2799PSUkJa9asoU+fPo7nlixZwsyZMx2P//a3v7F7926Kioo4duwYK1euvHiTXpUqi9xv+gScLFYf3cSPNk0DsNrsLNud5cLgRERERIx7uhdffJG33nqLDRs28PXXXzN37lyef/55R5uhQ4dyyy230LVrV4YMGcL3339PTk4On3/++Vmv22BX795XkfiKc36aY25hGWtTjwGQ1PH0OmoiIiLielpWxh06XgdegXA8FdLOPL3gTCqnOy7WdEcRERGphposUPT0009z5513cu+999KlSxdGjBjBiy++yJQpU7DZbGfsExISQrt27dizZ89ZY2mQq3cX5cChZOO49UCnuy3ZlYnVZqdt0wBahfm7JDQRERE5NyW+3MHLHzrfaBxXo8h9ZeJrya4srDbnRoqJiIiI1GSBosLCwirlKwAsFgsA9rOMWM/Pz2fv3r00a9bsrLF4e3sTFBRUZav39q8Auw3C2kJQc6e7Layo76VpjiIiIu6jxJe7VE533PoNlBY4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xDu1ajbZuhOj1qqdGDUlJaXRY1JSUuqVB1i9enWT5UVERERERERERNpDq4c6tnZi1DvvvJMJEybw17/+lWnTpvHGG2/wzTff8Pzzz7fvlYiIiIiIiIiIiNTR6sRXaydGHT9+PK+99hoPPfQQDz74IAMHDmTFihUMHz68/a5CRERERERERETkJBajuRlL3URhYSHh4eEUFBQQFhbm6uqIiIiIB1D84BnUTiIiItJarYkfWjXHl4iIiIiIiIiIiKdQ4ktERERERERERLySEl8iIiIiIiIiIuKVlPgSERERERERERGvpMSXiIiIiIiIiIh4JSW+RERERERERETEKynxJSIiIiIiIiIiXsnX1RU4FYZhAFBYWOjimoiIiIinqI0bauMIcU+K80RERKS1WhPneUTiq6ioCICEhAQX10REREQ8TVFREeHh4a6uhjRBcZ6IiIi01anEeRbDA/4M6nA4OHr0KKGhoVgslnY/f2FhIQkJCRw6dIiwsLB2P7+70fV6N12vd9P1ejddb/syDIOioiLi4+OxWjW7g7tSnNe+dL3eTdfr3XS93k3X275aE+d5RI8vq9VKr169Ovx1wsLCusQPYC1dr3fT9Xo3Xa930/W2H/X0cn+K8zqGrte76Xq9m67Xu+l628+pxnn686eIiIiIiIiIiHglJb5ERERERERERMQrKfEF2Gw25s+fj81mc3VVOoWu17vper2brte76XpF2l9X+znT9Xo3Xa930/V6N12v63jE5PYiIiIiIiIiIiKtpR5fIiIiIiIiIiLilZT4EhERERERERERr6TEl4iIiIiIiIiIeCUlvkRERERERERExCt1mcTX4sWLSUxMJCAggOTkZDZt2tRs+eXLlzNkyBACAgJISkrio48+6qSanp4FCxbwk5/8hNDQUKKjo5kxYwZpaWnNHvPiiy9isVjq3QICAjqpxqfnd7/7XYO6DxkypNljPLVtARITExtcr8ViYfbs2Y2W97S2/e9//8tll11GfHw8FouFFStW1HveMAweeeQR4uLiCAwMZNKkSezdu7fF87b2899Zmrveqqoq7rvvPpKSkggODiY+Pp5bbrmFo0ePNnvOtnwmOktL7Ttr1qwGdZ8yZUqL5/XE9gUa/SxbLBYWLlzY5DnduX1P5funvLyc2bNnExkZSUhICFdddRXZ2dnNnretn3vpWhTnNc3T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u+oSTtkdd9xhhIeHG+vWrTMyMzOdt9LSUmeZk6/30UcfNT7++GMjPT3d2Lx5s3H99dcbAQEBxo4dO1xxCa1y9913G+vWrTP2799vfPnll8akSZOMqKgoIycnxzAM72rbWna73ejdu7dx3333NXjO09u2qKjI2Lp1q7F161YDMJ588klj69atztVt/vjHPxoRERHGe++9Z3z33XfG9OnTjb59+xplZWXOc1xwwQXG008/7dxu6fPvSs1db2VlpXH55ZcbvXr1Mr799tt6n+eKigrnOU6+3pY+E67U3PUWFRUZ99xzj5Gammrs37/f+PTTT42zzjrLGDhwoFFeXu48h7e0b62CggIjKCjIePbZZxs9hye176l8//zqV78yevfubXz22WfGN998Y6SkpBgpKSn1zjN48GDjnXfecW6fyudeujbFeYrzanly29ZSnKc4T3Ge57dvLcV57hPndYnEl2EYxtNPP2307t3b8Pf3N8aOHWts2LDB+dyECROMmTNn1iv/1ltvGYMGDTL8/f2NM844w1i5cmUn17htgEZvL7zwgrPMydc7d+5c53sTExNjXHLJJcaWLVs6v/JtcN111xlxcXGGv7+/0bNnT+O6664z9u3b53zem9q21scff2wARlpaWoPnPL1t165d2+jPb+01ORwO4+GHHzZiYmIMm81mXHjhhQ3ehz59+hjz58+vt6+5z78rNXe9+/fvb/LzvHbtWuc5Tr7elj4TrtTc9ZaWlhoXX3yx0aNHD8PPz8/o06ePcdtttzUIbLylfWs999xzRmBgoJGfn9/oOTypfU/l+6esrMz49a9/bXTr1s0ICgoyrrjiCiMzM7PBeeoecyqfexHFeS84y3h6LFCX4rz6PL1tFecpzlOcV58nta+nx3mWmhcXERERERERERHxKl4/x5eIiIiIiIiIiHRNSnyJiIiIiIiIiIhXUuJLRERERERERES8khJfIiIiIiIiIiLilZT4EhERERERERERr6TEl4iIiIiIiIiIeCUlvkRERERERERExCsp8SUiIiIiIiIiIl5JiS8REREREREREfFKSnyJiIiIiIiIiIhXUuJLRERERERERES8khJfIiIiIiIiIiLilf4f4L/cOhQYo20AAAAASUVORK5CYII=\n"},"metadata":{}}],"execution_count":12},{"id":"zOlWUQUwls3c","cell_type":"code","source":"model.evaluate(test_ds)","metadata":{"id":"zOlWUQUwls3c","trusted":true,"execution":{"iopub.status.busy":"2026-03-14T15:52:46.404419Z","iopub.execute_input":"2026-03-14T15:52:46.404662Z","iopub.status.idle":"2026-03-14T15:53:14.049642Z","shell.execute_reply.started":"2026-03-14T15:52:46.404641Z","shell.execute_reply":"2026-03-14T15:53:14.049005Z"}},"outputs":[{"name":"stdout","text":"\u001b[1m79/79\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m28s\u001b[0m 347ms/step - accuracy: 0.9767 - loss: 0.0856 - precision: 0.9764 - recall: 0.9766\n","output_type":"stream"},{"execution_count":13,"output_type":"execute_result","data":{"text/plain":"[0.09061093628406525,\n 0.9759500026702881,\n 0.9740999937057495,\n 0.9777175784111023]"},"metadata":{}}],"execution_count":13},{"id":"53do3pjR-xBs","cell_type":"code","source":"joblib.dump(model, \"/kaggle/working/cnn_full_dataset.joblib\")","metadata":{"id":"53do3pjR-xBs","trusted":true,"execution":{"iopub.status.busy":"2026-03-14T15:53:14.050535Z","iopub.execute_input":"2026-03-14T15:53:14.050827Z","iopub.status.idle":"2026-03-14T15:53:14.593715Z","shell.execute_reply.started":"2026-03-14T15:53:14.050801Z","shell.execute_reply":"2026-03-14T15:53:14.593000Z"}},"outputs":[{"execution_count":14,"output_type":"execute_result","data":{"text/plain":"['/kaggle/working/cnn_full_dataset.joblib']"},"metadata":{}}],"execution_count":14}]} \ No newline at end of file diff --git a/notebooks/dfake-efficientnet-full-dataset.ipynb b/notebooks/dfake-efficientnet-full-dataset.ipynb new file mode 100644 index 0000000..6b0360c --- /dev/null +++ b/notebooks/dfake-efficientnet-full-dataset.ipynb @@ -0,0 +1 @@ +{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"language_info":{"name":"python","version":"3.12.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"colab":{"provenance":[],"gpuType":"T4"},"accelerator":"GPU","kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceType":"datasetVersion","sourceId":939937,"datasetId":501529,"databundleVersionId":967497}],"dockerImageVersionId":31287,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":5,"nbformat":4,"cells":[{"id":"063b06b2","cell_type":"markdown","source":"# Deep fake classification with transfer learning: EfficientNet base","metadata":{"id":"063b06b2"}},{"id":"01899522","cell_type":"markdown","source":"## Imports","metadata":{"id":"01899522"}},{"id":"839f7b2c","cell_type":"code","source":"#Graphics\nimport numpy as np\n\nimport matplotlib.pyplot as plt\n%matplotlib inline\n\n#Keras\nfrom keras.models import Model\nfrom keras import Input, layers, optimizers, callbacks\n\nfrom keras.utils import image_dataset_from_directory\n\n#Pretrained model for transfer learning\nfrom keras.applications.efficientnet import EfficientNetB3, preprocess_input\n\n#Saving models\nimport joblib","metadata":{"id":"839f7b2c","trusted":true,"execution":{"iopub.status.busy":"2026-03-14T09:46:29.758689Z","iopub.execute_input":"2026-03-14T09:46:29.758900Z","iopub.status.idle":"2026-03-14T09:46:51.805768Z","shell.execute_reply.started":"2026-03-14T09:46:29.758879Z","shell.execute_reply":"2026-03-14T09:46:51.805151Z"}},"outputs":[{"name":"stderr","text":"2026-03-14 09:46:31.677781: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:467] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\nWARNING: All log messages before absl::InitializeLog() is called are written to STDERR\nE0000 00:00:1773481591.888415 55 cuda_dnn.cc:8579] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\nE0000 00:00:1773481591.946408 55 cuda_blas.cc:1407] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\nW0000 00:00:1773481592.421599 55 computation_placer.cc:177] computation placer already registered. Please check linkage and avoid linking the same target more than once.\nW0000 00:00:1773481592.421642 55 computation_placer.cc:177] computation placer already registered. Please check linkage and avoid linking the same target more than once.\nW0000 00:00:1773481592.421647 55 computation_placer.cc:177] computation placer already registered. Please check linkage and avoid linking the same target more than once.\nW0000 00:00:1773481592.421650 55 computation_placer.cc:177] computation placer already registered. Please check linkage and avoid linking the same target more than once.\n","output_type":"stream"}],"execution_count":1},{"id":"d7487c18","cell_type":"markdown","source":"## Location of the data","metadata":{"id":"d7487c18"}},{"id":"fd8c985b","cell_type":"code","source":"#Lightweight dataset\ntrain_data_dir = \"/kaggle/input/datasets/xhlulu/140k-real-and-fake-faces/real_vs_fake/real-vs-fake/train/\"\nval_data_dir = \"/kaggle/input/datasets/xhlulu/140k-real-and-fake-faces/real_vs_fake/real-vs-fake/valid/\"\ntest_data_dir = \"/kaggle/input/datasets/xhlulu/140k-real-and-fake-faces/real_vs_fake/real-vs-fake/test/\"","metadata":{"id":"fd8c985b","trusted":true,"execution":{"iopub.status.busy":"2026-03-14T09:46:51.809518Z","iopub.execute_input":"2026-03-14T09:46:51.809704Z","iopub.status.idle":"2026-03-14T09:46:51.813710Z","shell.execute_reply.started":"2026-03-14T09:46:51.809684Z","shell.execute_reply":"2026-03-14T09:46:51.813080Z"}},"outputs":[],"execution_count":2},{"id":"GrwZQjpdgmZx","cell_type":"markdown","source":"## Parameters","metadata":{"id":"GrwZQjpdgmZx"}},{"id":"KiwVdE2TgqQ6","cell_type":"code","source":"BATCH_SIZE = 256\nIMAGE_SIZE = (256, 256)\nIMAGE_HEIGHT = IMAGE_SIZE[0]\nIMAGE_WIDTH = IMAGE_SIZE[1]\nNUM_CHANNELS = 3\nSEED = 42\nLEARNING_RATE = 0.001\nPATIENCE = 5\nEPOCHS = 40","metadata":{"id":"KiwVdE2TgqQ6","trusted":true,"execution":{"iopub.status.busy":"2026-03-14T11:45:21.925524Z","iopub.execute_input":"2026-03-14T11:45:21.926296Z","iopub.status.idle":"2026-03-14T11:45:21.930211Z","shell.execute_reply.started":"2026-03-14T11:45:21.926266Z","shell.execute_reply":"2026-03-14T11:45:21.929617Z"}},"outputs":[],"execution_count":15},{"id":"roEaV7rmg1JP","cell_type":"markdown","source":"## Creating datasets from directories","metadata":{"id":"roEaV7rmg1JP"}},{"id":"OjKwSzq-gwGy","cell_type":"code","source":"train_ds = image_dataset_from_directory(\n train_data_dir,\n labels=\"inferred\",\n label_mode=\"binary\",\n seed=SEED,\n image_size=IMAGE_SIZE,\n batch_size=BATCH_SIZE)\n\n\nval_ds = image_dataset_from_directory(\n val_data_dir,\n labels=\"inferred\",\n label_mode=\"binary\",\n seed=SEED,\n image_size=IMAGE_SIZE,\n batch_size=BATCH_SIZE)\n\ntest_ds = image_dataset_from_directory(\n test_data_dir,\n labels=\"inferred\",\n label_mode=\"binary\",\n seed=SEED,\n image_size=IMAGE_SIZE,\n batch_size=BATCH_SIZE)","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"OjKwSzq-gwGy","outputId":"16edd553-2e12-438d-b5d1-bf0a4efd4176","trusted":true,"execution":{"iopub.status.busy":"2026-03-14T09:47:01.447334Z","iopub.execute_input":"2026-03-14T09:47:01.447931Z","iopub.status.idle":"2026-03-14T09:49:46.222797Z","shell.execute_reply.started":"2026-03-14T09:47:01.447901Z","shell.execute_reply":"2026-03-14T09:49:46.222166Z"}},"outputs":[{"name":"stdout","text":"Found 100000 files belonging to 2 classes.\n","output_type":"stream"},{"name":"stderr","text":"I0000 00:00:1773481742.141745 55 gpu_device.cc:2019] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 13757 MB memory: -> device: 0, name: Tesla T4, pci bus id: 0000:00:04.0, compute capability: 7.5\nI0000 00:00:1773481742.147875 55 gpu_device.cc:2019] Created device /job:localhost/replica:0/task:0/device:GPU:1 with 13757 MB memory: -> device: 1, name: Tesla T4, pci bus id: 0000:00:05.0, compute capability: 7.5\n","output_type":"stream"},{"name":"stdout","text":"Found 20000 files belonging to 2 classes.\nFound 20000 files belonging to 2 classes.\n","output_type":"stream"}],"execution_count":4},{"id":"VVhBlscJg6E5","cell_type":"code","source":"class_names = train_ds.class_names\nprint(class_names)","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"VVhBlscJg6E5","outputId":"e3071577-b00c-4d36-c385-22daa03d7d5c","trusted":true,"execution":{"iopub.status.busy":"2026-03-14T09:49:46.223976Z","iopub.execute_input":"2026-03-14T09:49:46.224365Z","iopub.status.idle":"2026-03-14T09:49:46.228637Z","shell.execute_reply.started":"2026-03-14T09:49:46.224329Z","shell.execute_reply":"2026-03-14T09:49:46.227801Z"}},"outputs":[{"name":"stdout","text":"['fake', 'real']\n","output_type":"stream"}],"execution_count":5},{"id":"cwXp8a0hg_HB","cell_type":"code","source":"def initialize_model(base_model):\n\n ######################\n ### Architecture ###\n ######################\n\n #Freezing weights of pretrained model\n base_model.trainable = False\n\n #Input\n inputs = Input(shape=(IMAGE_HEIGHT, IMAGE_WIDTH, NUM_CHANNELS))\n\n # x = data_augmentation(inputs)\n x = preprocess_input(inputs) #Preprocessing layer specifically designed for the pretrained model\n x = base_model(x) #Transfer learning model\n\n\n x = layers.Flatten()(x)\n\n #Dense layers\n x = layers.Dense(128, activation='relu')(x)\n x = layers.Dropout(0.3)(x)\n x = layers.Dense(64, activation='relu')(x)\n x = layers.Dropout(0.3)(x)\n\n outputs = layers.Dense(1, activation='sigmoid')(x)\n\n model = Model(inputs=inputs, outputs=outputs)\n\n ################\n ## Compiler ##\n ################\n adam = optimizers.Adam(learning_rate=LEARNING_RATE)\n model.compile(loss='binary_crossentropy',\n optimizer=adam,\n metrics=['accuracy', 'recall', 'precision'])\n\n return model","metadata":{"id":"cwXp8a0hg_HB","trusted":true,"execution":{"iopub.status.busy":"2026-03-14T11:45:27.917314Z","iopub.execute_input":"2026-03-14T11:45:27.917794Z","iopub.status.idle":"2026-03-14T11:45:27.923409Z","shell.execute_reply.started":"2026-03-14T11:45:27.917767Z","shell.execute_reply":"2026-03-14T11:45:27.922746Z"}},"outputs":[],"execution_count":16},{"id":"cK6NNErii_X5","cell_type":"code","source":"base_model = EfficientNetB3(weights=\"imagenet\", include_top=False, input_shape=(IMAGE_HEIGHT, IMAGE_WIDTH, NUM_CHANNELS))","metadata":{"id":"cK6NNErii_X5","colab":{"base_uri":"https://localhost:8080/"},"outputId":"ecb7e40b-6d60-415a-ad8d-dfa036ab3281","trusted":true,"execution":{"iopub.status.busy":"2026-03-14T11:45:28.627313Z","iopub.execute_input":"2026-03-14T11:45:28.627615Z","iopub.status.idle":"2026-03-14T11:45:30.206613Z","shell.execute_reply.started":"2026-03-14T11:45:28.627591Z","shell.execute_reply":"2026-03-14T11:45:30.205652Z"}},"outputs":[],"execution_count":17},{"id":"luHRr85mkaFq","cell_type":"code","source":"model = initialize_model(base_model)\nmodel.summary()","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":408},"id":"luHRr85mkaFq","outputId":"9ae06ffd-2cc2-4136-a33a-7c5323c00951","trusted":true,"execution":{"iopub.status.busy":"2026-03-14T11:45:32.451564Z","iopub.execute_input":"2026-03-14T11:45:32.452252Z","iopub.status.idle":"2026-03-14T11:45:32.511659Z","shell.execute_reply.started":"2026-03-14T11:45:32.452221Z","shell.execute_reply":"2026-03-14T11:45:32.510868Z"}},"outputs":[{"output_type":"display_data","data":{"text/plain":"\u001b[1mModel: \"functional_1\"\u001b[0m\n","text/html":"
Model: \"functional_1\"\n
\n"},"metadata":{}},{"output_type":"display_data","data":{"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_3 (\u001b[38;5;33mInputLayer\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m3\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ efficientnetb3 (\u001b[38;5;33mFunctional\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m1536\u001b[0m) │ \u001b[38;5;34m10,783,535\u001b[0m │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ flatten_1 (\u001b[38;5;33mFlatten\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m98304\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ dense_3 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m12,583,040\u001b[0m │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ dropout_2 (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ dense_4 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m8,256\u001b[0m │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ dropout_3 (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ dense_5 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m) │ \u001b[38;5;34m65\u001b[0m │\n└─────────────────────────────────┴────────────────────────┴───────────────┘\n","text/html":"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n┃ Layer (type)                     Output Shape                  Param # ┃\n┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n│ input_layer_3 (InputLayer)      │ (None, 256, 256, 3)    │             0 │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ efficientnetb3 (Functional)     │ (None, 8, 8, 1536)     │    10,783,535 │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ flatten_1 (Flatten)             │ (None, 98304)          │             0 │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ dense_3 (Dense)                 │ (None, 128)            │    12,583,040 │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ dropout_2 (Dropout)             │ (None, 128)            │             0 │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ dense_4 (Dense)                 │ (None, 64)             │         8,256 │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ dropout_3 (Dropout)             │ (None, 64)             │             0 │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ dense_5 (Dense)                 │ (None, 1)              │            65 │\n└─────────────────────────────────┴────────────────────────┴───────────────┘\n
\n"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"\u001b[1m Total params: \u001b[0m\u001b[38;5;34m23,374,896\u001b[0m (89.17 MB)\n","text/html":"
 Total params: 23,374,896 (89.17 MB)\n
\n"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m12,591,361\u001b[0m (48.03 MB)\n","text/html":"
 Trainable params: 12,591,361 (48.03 MB)\n
\n"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m10,783,535\u001b[0m (41.14 MB)\n","text/html":"
 Non-trainable params: 10,783,535 (41.14 MB)\n
\n"},"metadata":{}}],"execution_count":18},{"id":"Q54_7msDkVnV","cell_type":"code","source":"# MODEL = 'dfake_efficientnet.keras'\n\n# modelCheckpoint = callbacks.ModelCheckpoint(MODEL,\n# monitor=\"val_loss\",\n# verbose=0,\n# save_best_only=True)\n\nLRreducer = callbacks.ReduceLROnPlateau(monitor=\"val_loss\",\n factor=0.1,\n patience=3,\n verbose=1,\n min_lr=0)\n\nEarlyStopper = callbacks.EarlyStopping(monitor='val_loss',\n patience=PATIENCE,\n verbose=0,\n restore_best_weights=True)","metadata":{"id":"Q54_7msDkVnV","trusted":true,"execution":{"iopub.status.busy":"2026-03-14T11:45:38.751801Z","iopub.execute_input":"2026-03-14T11:45:38.752704Z","iopub.status.idle":"2026-03-14T11:45:38.758998Z","shell.execute_reply.started":"2026-03-14T11:45:38.752660Z","shell.execute_reply":"2026-03-14T11:45:38.758338Z"}},"outputs":[],"execution_count":19},{"id":"AGUnu6dDlQXn","cell_type":"code","source":"%%time\nhistory = model.fit(train_ds,\n epochs=EPOCHS,\n validation_data=val_ds,\n callbacks=[LRreducer, EarlyStopper],\n verbose=1)","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"AGUnu6dDlQXn","outputId":"335099a5-0e60-400b-d479-8680b38a6b1a","trusted":true,"execution":{"iopub.status.busy":"2026-03-14T11:45:43.509516Z","iopub.execute_input":"2026-03-14T11:45:43.510271Z","iopub.status.idle":"2026-03-14T13:49:14.740516Z","shell.execute_reply.started":"2026-03-14T11:45:43.510244Z","shell.execute_reply":"2026-03-14T13:49:14.739762Z"}},"outputs":[{"name":"stdout","text":"Epoch 1/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m391s\u001b[0m 915ms/step - accuracy: 0.7130 - loss: 0.9347 - precision: 0.6881 - recall: 0.7722 - val_accuracy: 0.8903 - val_loss: 0.2601 - val_precision: 0.9343 - val_recall: 0.8398 - learning_rate: 0.0010\nEpoch 2/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m318s\u001b[0m 814ms/step - accuracy: 0.8625 - loss: 0.3235 - precision: 0.8401 - recall: 0.8946 - val_accuracy: 0.9169 - val_loss: 0.2076 - val_precision: 0.9627 - val_recall: 0.8675 - learning_rate: 0.0010\nEpoch 3/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m318s\u001b[0m 813ms/step - accuracy: 0.8949 - loss: 0.2510 - precision: 0.8822 - recall: 0.9112 - val_accuracy: 0.9384 - val_loss: 0.1648 - val_precision: 0.9475 - val_recall: 0.9281 - learning_rate: 0.0010\nEpoch 4/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m319s\u001b[0m 815ms/step - accuracy: 0.9092 - loss: 0.2179 - precision: 0.8948 - recall: 0.9270 - val_accuracy: 0.9365 - val_loss: 0.1581 - val_precision: 0.9728 - val_recall: 0.8980 - learning_rate: 0.0010\nEpoch 5/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m319s\u001b[0m 816ms/step - accuracy: 0.9190 - loss: 0.1945 - precision: 0.9069 - recall: 0.9335 - val_accuracy: 0.9377 - val_loss: 0.1557 - val_precision: 0.9749 - val_recall: 0.8986 - learning_rate: 0.0010\nEpoch 6/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m319s\u001b[0m 817ms/step - accuracy: 0.9258 - loss: 0.1793 - precision: 0.9126 - recall: 0.9414 - val_accuracy: 0.9413 - val_loss: 0.1432 - val_precision: 0.9742 - val_recall: 0.9066 - learning_rate: 0.0010\nEpoch 7/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m318s\u001b[0m 812ms/step - accuracy: 0.9279 - loss: 0.1702 - precision: 0.9148 - recall: 0.9434 - val_accuracy: 0.9406 - val_loss: 0.1437 - val_precision: 0.9753 - val_recall: 0.9040 - learning_rate: 0.0010\nEpoch 8/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m319s\u001b[0m 816ms/step - accuracy: 0.9337 - loss: 0.1628 - precision: 0.9201 - recall: 0.9498 - val_accuracy: 0.9402 - val_loss: 0.1524 - val_precision: 0.9825 - val_recall: 0.8965 - learning_rate: 0.0010\nEpoch 9/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m318s\u001b[0m 814ms/step - accuracy: 0.9372 - loss: 0.1535 - precision: 0.9247 - recall: 0.9515 - val_accuracy: 0.9550 - val_loss: 0.1212 - val_precision: 0.9657 - val_recall: 0.9436 - learning_rate: 0.0010\nEpoch 10/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m319s\u001b[0m 816ms/step - accuracy: 0.9377 - loss: 0.1488 - precision: 0.9236 - recall: 0.9540 - val_accuracy: 0.9490 - val_loss: 0.1370 - val_precision: 0.9760 - val_recall: 0.9206 - learning_rate: 0.0010\nEpoch 11/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m319s\u001b[0m 816ms/step - accuracy: 0.9419 - loss: 0.1397 - precision: 0.9276 - recall: 0.9583 - val_accuracy: 0.9367 - val_loss: 0.1629 - val_precision: 0.9838 - val_recall: 0.8881 - learning_rate: 0.0010\nEpoch 12/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 680ms/step - accuracy: 0.9403 - loss: 0.1420 - precision: 0.9267 - recall: 0.9558\nEpoch 12: ReduceLROnPlateau reducing learning rate to 0.00010000000474974513.\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m319s\u001b[0m 816ms/step - accuracy: 0.9403 - loss: 0.1419 - precision: 0.9267 - recall: 0.9558 - val_accuracy: 0.9513 - val_loss: 0.1309 - val_precision: 0.9735 - val_recall: 0.9279 - learning_rate: 0.0010\nEpoch 13/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m320s\u001b[0m 818ms/step - accuracy: 0.9498 - loss: 0.1183 - precision: 0.9354 - recall: 0.9661 - val_accuracy: 0.9560 - val_loss: 0.1137 - val_precision: 0.9794 - val_recall: 0.9317 - learning_rate: 1.0000e-04\nEpoch 14/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m320s\u001b[0m 818ms/step - accuracy: 0.9558 - loss: 0.1045 - precision: 0.9413 - recall: 0.9721 - val_accuracy: 0.9583 - val_loss: 0.1101 - val_precision: 0.9778 - val_recall: 0.9379 - learning_rate: 1.0000e-04\nEpoch 15/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m319s\u001b[0m 817ms/step - accuracy: 0.9578 - loss: 0.0969 - precision: 0.9420 - recall: 0.9754 - val_accuracy: 0.9609 - val_loss: 0.1042 - val_precision: 0.9773 - val_recall: 0.9437 - learning_rate: 1.0000e-04\nEpoch 16/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m319s\u001b[0m 815ms/step - accuracy: 0.9599 - loss: 0.0944 - precision: 0.9465 - recall: 0.9747 - val_accuracy: 0.9592 - val_loss: 0.1085 - val_precision: 0.9786 - val_recall: 0.9390 - learning_rate: 1.0000e-04\nEpoch 17/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m320s\u001b[0m 818ms/step - accuracy: 0.9611 - loss: 0.0898 - precision: 0.9466 - recall: 0.9770 - val_accuracy: 0.9589 - val_loss: 0.1106 - val_precision: 0.9791 - val_recall: 0.9377 - learning_rate: 1.0000e-04\nEpoch 18/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 680ms/step - accuracy: 0.9615 - loss: 0.0872 - precision: 0.9468 - recall: 0.9778\nEpoch 18: ReduceLROnPlateau reducing learning rate to 1.0000000474974514e-05.\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m320s\u001b[0m 817ms/step - accuracy: 0.9616 - loss: 0.0872 - precision: 0.9468 - recall: 0.9778 - val_accuracy: 0.9614 - val_loss: 0.1041 - val_precision: 0.9782 - val_recall: 0.9439 - learning_rate: 1.0000e-04\nEpoch 19/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m319s\u001b[0m 816ms/step - accuracy: 0.9625 - loss: 0.0855 - precision: 0.9468 - recall: 0.9798 - val_accuracy: 0.9601 - val_loss: 0.1071 - val_precision: 0.9804 - val_recall: 0.9390 - learning_rate: 1.0000e-05\nEpoch 20/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m319s\u001b[0m 816ms/step - accuracy: 0.9626 - loss: 0.0844 - precision: 0.9474 - recall: 0.9793 - val_accuracy: 0.9596 - val_loss: 0.1086 - val_precision: 0.9806 - val_recall: 0.9379 - learning_rate: 1.0000e-05\nEpoch 21/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 679ms/step - accuracy: 0.9632 - loss: 0.0826 - precision: 0.9490 - recall: 0.9788\nEpoch 21: ReduceLROnPlateau reducing learning rate to 1.0000000656873453e-06.\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m319s\u001b[0m 815ms/step - accuracy: 0.9632 - loss: 0.0826 - precision: 0.9490 - recall: 0.9788 - val_accuracy: 0.9606 - val_loss: 0.1058 - val_precision: 0.9800 - val_recall: 0.9403 - learning_rate: 1.0000e-05\nEpoch 22/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m320s\u001b[0m 818ms/step - accuracy: 0.9625 - loss: 0.0837 - precision: 0.9481 - recall: 0.9784 - val_accuracy: 0.9609 - val_loss: 0.1051 - val_precision: 0.9798 - val_recall: 0.9411 - learning_rate: 1.0000e-06\nEpoch 23/40\n\u001b[1m391/391\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m319s\u001b[0m 817ms/step - accuracy: 0.9645 - loss: 0.0804 - precision: 0.9507 - recall: 0.9797 - val_accuracy: 0.9607 - val_loss: 0.1057 - val_precision: 0.9799 - val_recall: 0.9407 - learning_rate: 1.0000e-06\nCPU times: user 1h 3min 23s, sys: 7min 36s, total: 1h 10min 59s\nWall time: 2h 3min 31s\n","output_type":"stream"}],"execution_count":20},{"id":"ek10k5T3ljo2","cell_type":"code","source":"def plot_history(history):\n fig, ax = plt.subplots(1, 2, figsize=(15,5))\n ax[0].set_title('loss')\n ax[0].plot(history.epoch, history.history[\"loss\"], label=\"Train loss\")\n ax[0].plot(history.epoch, history.history[\"val_loss\"], label=\"Validation loss\")\n ax[1].set_title('accuracy')\n ax[1].plot(history.epoch, history.history[\"accuracy\"], label=\"Train acc\")\n ax[1].plot(history.epoch, history.history[\"val_accuracy\"], label=\"Validation acc\")\n ax[0].legend()\n ax[1].legend()","metadata":{"id":"ek10k5T3ljo2","trusted":true,"execution":{"iopub.status.busy":"2026-03-14T13:49:14.741890Z","iopub.execute_input":"2026-03-14T13:49:14.742170Z","iopub.status.idle":"2026-03-14T13:49:14.747582Z","shell.execute_reply.started":"2026-03-14T13:49:14.742146Z","shell.execute_reply":"2026-03-14T13:49:14.746874Z"}},"outputs":[],"execution_count":21},{"id":"3_bJJM_Ulnpc","cell_type":"code","source":"plot_history(history)","metadata":{"id":"3_bJJM_Ulnpc","trusted":true,"execution":{"iopub.status.busy":"2026-03-14T13:49:14.748331Z","iopub.execute_input":"2026-03-14T13:49:14.748636Z","iopub.status.idle":"2026-03-14T13:49:15.045445Z","shell.execute_reply.started":"2026-03-14T13:49:14.748614Z","shell.execute_reply":"2026-03-14T13:49:15.044647Z"}},"outputs":[{"output_type":"display_data","data":{"text/plain":"
","image/png":"iVBORw0KGgoAAAANSUhEUgAABL4AAAHDCAYAAAAqZtO0AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAu6hJREFUeJzs3Xd8U/X+x/FXku49aWkpFMpGhrJEplqtoqiICi6GCi4c9OpVFBX1Kt6rIg4UfyiguHCAC0UBwQEoCIIgUNkthbYUuneT/P5IG6isFlpO2r6fj8d55PTkjE+ChvTN9/s5JrvdbkdERERERERERKSBMRtdgIiIiIiIiIiISF1Q8CUiIiIiIiIiIg2Sgi8REREREREREWmQFHyJiIiIiIiIiEiDpOBLREREREREREQaJAVfIiIiIiIiIiLSICn4EhERERERERGRBknBl4iIiIiIiIiINEgKvkREREREREREpEFS8CUiLmHOnDmYTCZ2795tdCkiIiIiIiLSQCj4EhERERERERGRBknBl4iIiIiIiIiINEgKvkRERERERKReKigoMLoEEXFxCr5ExGW9/vrrdOrUCU9PT6Kiorj77rvJzs6uss+2bdsYNmwYkZGReHl50axZM0aMGEFOTo5zn8WLF9OvXz+CgoLw8/OjXbt2PPLII2f41YiIiIi4vj179nDXXXfRrl07vL29CQ0N5dprrz1mH9bs7GwmTJhAbGwsnp6eNGvWjJEjR5KZmencp7i4mMmTJ9O2bVu8vLxo2rQpV199NTt27ABg+fLlmEwmli9fXuXcu3fvxmQyMWfOHOe20aNH4+fnx44dOxg8eDD+/v7ceOONAPz8889ce+21NG/eHE9PT2JiYpgwYQJFRUVH1b1161auu+46wsPD8fb2pl27djz66KMALFu2DJPJxIIFC4467oMPPsBkMrFq1aqavq0iYiA3owsQETmWyZMn8+STTxIfH8+dd95JUlISb7zxBmvWrGHFihW4u7tTWlpKQkICJSUl3HPPPURGRpKamsrXX39NdnY2gYGB/PXXX1x++eV06dKFp556Ck9PT7Zv386KFSuMfokiIiIiLmfNmjWsXLmSESNG0KxZM3bv3s0bb7zBoEGD2Lx5Mz4+PgDk5+fTv39/tmzZwi233MI555xDZmYmX375JXv37iUsLAyr1crll1/O0qVLGTFiBPfddx95eXksXryYTZs2ERcXV+P6ysvLSUhIoF+/frzwwgvOej755BMKCwu58847CQ0NZfXq1bz66qvs3buXTz75xHn8n3/+Sf/+/XF3d2fcuHHExsayY8cOvvrqK5555hkGDRpETEwM77//PkOHDq1y7ffff5+4uDj69OlzGu+wiJxxdhERFzB79mw7YN+1a5c9IyPD7uHhYb/44ovtVqvVuc9rr71mB+yzZs2y2+12+x9//GEH7J988slxz/vSSy/ZAfuBAwfq/DWIiIiI1HeFhYVHbVu1apUdsL/77rvObY8//rgdsM+fP/+o/W02m91ut9tnzZplB+xTp0497j7Lli2zA/Zly5ZVeX7Xrl12wD579mzntlGjRtkB+8MPP1ytuqdMmWI3mUz2PXv2OLcNGDDA7u/vX2XbkfXY7Xb7xIkT7Z6envbs7GzntoyMDLubm5v9iSeeOOo6IuLaNNVRRFzOkiVLKC0t5f7778dsPvwxNXbsWAICAli4cCEAgYGBAHz33XcUFhYe81xBQUEAfPHFF9hstrotXERERKSe8/b2dq6XlZVx8OBBWrduTVBQEOvWrXM+99lnn9G1a9ejRkUBmEwm5z5hYWHcc889x93nVNx5550nrLugoIDMzEzOO+887HY7f/zxBwAHDhzgp59+4pZbbqF58+bHrWfkyJGUlJTw6aefOrfNmzeP8vJybrrpplOuW0SMoeBLRFzOnj17AGjXrl2V7R4eHrRq1cr5fMuWLUlMTOStt94iLCyMhIQEpk+fXqW/1/Dhw+nbty+33XYbERERjBgxgo8//lghmIiIiMgxFBUV8fjjjxMTE4OnpydhYWGEh4eTnZ1d5TvWjh07OOuss054rh07dtCuXTvc3Gqvw46bmxvNmjU7antycjKjR48mJCQEPz8/wsPDGThwIICz7p07dwKctO727dvTs2dP3n//fee2999/n3PPPZfWrVvX1ksRkTNEwZeI1Gsvvvgif/75J4888ghFRUXce++9dOrUib179wKOf/376aefWLJkCTfffDN//vknw4cP56KLLsJqtRpcvYiIiIhrueeee3jmmWe47rrr+Pjjj/n+++9ZvHgxoaGhdfIPh8cb+XW872menp5VZgRU7nvRRRexcOFCHnroIT7//HMWL17sbIx/KnWPHDmSH3/8kb1797Jjxw5+/fVXjfYS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912GDBlCUlISzZs3B2DkyJGsWrWKV155ha5du7Jr1y4yMzMBSE1NZcCAAQwaNIgffviBgIAAVqxYQXl5+UnfP5eWlwaf3gJ2G3QaCmY32PgJ/DUftnwJ54yEgQ+Bv0blVVFW7HiPVs+EfesOb2/azTG666xhzmmj29LzGDlrNftzDjey9/GwMKhdOAmdIhnUrgmB3u5n+AWISF1S8HWEqEBv9hwsVIN7EZEzpawQno0y5tqP7AOP6vXLueWWW3j++ef58ccfGTRoEOCYsjRs2DACAwMJDAzkgQcecO5/zz338N133/Hxxx9X65fYJUuWsHXrVr777juiohzvx7PPPsull15aZb9JkyY512NjY3nggQf46KOP+Pe//423tzd+fn64ubmdcJrSBx98QHFxMe+++66zX9Brr73GkCFD+O9//0tERAQAwcHBvPbaa1gsFtq3b89ll13G0qVLqx18vfDCCzz00EOMGDECgP/+978sW7aMadOmMX36dJKTk2nTpg39+vXDZDLRokUL57HJyclERkYSHx+Pu7s7zZs3r9b7KI2APjOAhvGZ0bVrV7p27er8+emnn2bBggV8+eWXjB8/nr///puPP/6YxYsXEx8fD0CrVq2c+0+fPp3AwEA++ugj3N0dIUXbtm1P+t65NGu5I/QqyIAmneDK18HDxzFSaelTsH0x/D4L1n8I594Jfe8D7yCjqzZW1h74/W1YNxeKDjm2WTyg09WOwCu6e5XAendmATe+9RsZeSWE+noc0Zw+DC93NacXaag01fEIlXd2TFXwJSIiR2jfvj3nnXces2bNAmD79u38/PPP3HrrrQBYrVaefvppOnfuTEhICH5+fnz33XckJyef6LROW7ZsISYmxvkLLECfPn2O2m/evHn07duXyMhI/Pz8mDRpUrWvceS1unbtWqVJdt++fbHZbCQlJTm3derUCYvl8C8BTZs2JSMjo1rXyM3NZd++ffTt27fK9r59+7JlyxbAMTVq/fr1tGvXjnvvvZfvv//eud+1115LUVERrVq1YuzYsSxYsKD+j+KQRkWfGSf/zMjPz+eBBx6gQ4cOBAUF4efnx5YtW5z1rV+/HovFwsCBA495/Pr16+nfv78z9GoQfngK9qxw3FnwuncdoRc4GrDf9CmMXgjNekJ5EfwyFV7uCitecTTBb0xsNti+BD4YUfEevOwI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fNntdn3xERERkTo3b948EhMTmTFjBr1792batGkkJCSQlJREkyZNjtr/gw8+4OGHH2bWrFmcd955/P3334wePRqTycTUqVMBWLNmDVar1XnMpk2buOiii7j22murnGvs2LE89dRTzp99fHzq6FW6rq1puaxPycbNbOLqc5oZXY6IiIgcQcFXLYsI9MRkguIyG4cKSgn18zS6JBEREWngpk6dytixYxkzZgwAM2bMYOHChcyaNYuHH374qP1XrlxJ3759ueGGGwDH6K7rr7+e3377zblPeHh4lWOee+454uLiGDhwYJXtPj4+REZG1vZLqlfmVYz2iu8QQbi/vvuJiIi4Ek11rGWebhbCK8KufdnFJ9lbRERE5PSUlpaydu1a4uPjndvMZjPx8fGsWrXqmMecd955rF271jkdcufOnXzzzTcMHjz4uNd47733uOWWW44azf7+++8TFhbGWWedxcSJEyksLDxhvSUlJeTm5lZZ6rOScisL/kgFYHhPNbUXERFxNRrxVQeig73JyCshNbuIzs0CjS5HREREGrDMzEysVisRERFVtkdERLB169ZjHnPDDTeQmZlJv379sNvtlJeXc8cdd/DII48cc//PP/+c7OxsRo8efdR5WrRoQVRUFH/++ScPPfQQSUlJzJ8//7j1TpkyhSeffLJmL9KFff9XOtmFZUQGeDGgbfjJDxAREZEzSiO+6oDzzo5qcC8iIiIuaPny5Tz77LO8/vrrrFu3jvnz57Nw4UKefvrpY+7/9ttvc+mllxIVFVVl+7hx40hISKBz587ceOONvPvuuyxYsIAdO3Yc99oTJ04kJyfHuaSkpNTqazvTKqc5XtejGRazeruKiIi4Go34qgPRFcGX7uwoIiIidS0sLAyLxUJ6enqV7enp6cftvfXYY49x8803c9tttwHQuXNnCgoKGDduHI8++ihm8+F/G92zZw9Lliw54SiuSr179wZg+/btxMXFHXMfT09PPD0bRh+slEOF/LI9E4Bre2iao4iIiCvSiK86EBXoBWjEl4iIiNQ9Dw8PunfvztKlS53bbDYbS5cupU+fPsc8prCwsEq4BWCxWACw2+1Vts+ePZsmTZpw2WWXnbSW9evXA9C0adOavIR665PfHaO9+rUOIyak8d3NUkREpD7QiK86EB3s+OKj4EtERETOhMTEREaNGkWPHj3o1asX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8EA7gQ41e0VERPoitQBERES6idVqaZr7y7v/+rVaLS03BTiL9m9gAOZ8YSVV9WYQVl5DbpugLL9NSBYd7NeN1Utf0tBoMDYhlFD/05tPUERERLyXd7e8RUREpMeyWCwtc7CdbGipSFcYmxDKqwvP83QZIiIi4kG6HZOIiIiIiIiIiPRKCr5ERERERERERKRXUvAlIiIiIiIiIiK9koIvERERERERERHplRR8iYiIiIiIiIhIr6TgS0REREREREREeiUFXyIiIiIiIiIi0isp+BIRERERERERkV5JwZeIiIiIiIiIiPRKCr5EREREeolHH32UQYMG4efnR3JyMrt27TruvlOmTMFisRyzXHHFFS37tPe6xWLhwQcfbNln0KBBx7z+u9/9rks/p4iIiMip8vF0ASIiIiJy+tauXUtKSgpPPPEEycnJrFy5kunTp5OWlkZUVNQx+69fv566urqW54WFhYwdO5Zrr722ZVt2drbbe958801uvfVW5syZ47b9/vvvZ8GCBS3PnU5nZ30sERERkdOi4EtERESkF3j44YdZsGAB8+fPB+CJJ55g48aNPPXUU9x1113H7B8eHu72fM2aNQQEBLgFXzExMW77vPrqq1x88cUMGTLEbbvT6TxmXxEREZGeQEMdRURERLxcXV0dqampTJ06tWWb1Wpl6tSp7Nix45SOsWrVKr7//e8TGBjY7uu5ubls3LiRW2+99ZjXfve739GvXz/Gjx/Pgw8+SENDw7f7ICIiIiKdTD2+RERERLxcQUEBjY2NREdHu22Pjo5m3759J33/rl27+OKLL1i1atVx93nmmWdwOp3Mnj3bbftPfvITJkyYQHh4OP/5z39YunQp2dnZPPzww+0ep7a2ltra2pbnZWVlJ61PRERE5NvyiuDLMAxADSMRERE5dc3thuZ2hBzfqlWrGD16NElJScfd56mnnuL666/Hz8/PbXtKSkrL+pgxY7Db7dxxxx2sWLECh8NxzHFWrFjBfffdd8x2tfNERETkVHWknecVwVd5eTkACQkJHq5EREREvE15eTkhISGeLqNLRUREYLPZyM3Ndduem5t70rm3KisrWbNmDffff/9x93n//fdJS0tj7dq1J60lOTmZhoYGjhw5wogRI455fenSpW5hWVZWFmeddZbaeSIiItJhp9LO84rgKzY2loyMDJxOJxaLpdOP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Dw/nvvvuY86cOcTExHDo0CF+8YtfMGzYMKZPn+7Bqvu2hQsXsnr1al599VWcTmfLfA4hISH4+/sTEhLCrbfeSkpKCuHh4QQHB7N48WImT57MOeec4+HqRbqH2nneR+28nk/tPO+jdp73UTuvC3j6tpKe9te//tUYMGCAYbfbjaSkJOPDDz/0dElyAnPnzjX69+9v2O12Iy4uzpg7d65x8OBBT5clbWzZssUAjlnmzZtnGIZ5q+t7773XiI6ONhwOh3HppZcaaWlpni26jzvRNauqqjKmTZtmREZGGr6+vsbAgQONBQsWGDk5OZ4uu09r73oBxtNPP92yT3V1tfHjH//YCAsLMwICAoyrr77ayM7O9lzRIh6gdp53UTuv51M7z/uoned91M7rfBbDMIyuj9dERERERERERES6V5+d40tERERERERERHo3BV8iIiIiIiIiItIrKfgSEREREREREZFeScGXiIiIiIiIiIj0Sgq+RERERERERESkV1LwJSIiIiIiIiIivZKCLxERERERERER6ZUUfImIiIiIiIiISK+k4EtERERERERERHolBV8iIiIiIiIiItIrKfgSEREREREREZFeScGXiIiIiIiIiIj0Sv8Pp+fEXjVNq2oAAAAASUVORK5CYII=\n"},"metadata":{}}],"execution_count":22},{"id":"zOlWUQUwls3c","cell_type":"code","source":"model.evaluate(test_ds)","metadata":{"id":"zOlWUQUwls3c","trusted":true,"execution":{"iopub.status.busy":"2026-03-14T13:49:15.047016Z","iopub.execute_input":"2026-03-14T13:49:15.047368Z","iopub.status.idle":"2026-03-14T13:50:08.464149Z","shell.execute_reply.started":"2026-03-14T13:49:15.047345Z","shell.execute_reply":"2026-03-14T13:50:08.463528Z"}},"outputs":[{"name":"stdout","text":"\u001b[1m79/79\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m53s\u001b[0m 673ms/step - accuracy: 0.9610 - loss: 0.1076 - precision: 0.9767 - recall: 0.9442\n","output_type":"stream"},{"execution_count":23,"output_type":"execute_result","data":{"text/plain":"[0.10901663452386856,\n 0.9605000019073486,\n 0.9430000185966492,\n 0.9772020578384399]"},"metadata":{}}],"execution_count":23},{"id":"53do3pjR-xBs","cell_type":"code","source":"joblib.dump(model, \"/kaggle/working/efficientnet_full_dataset.joblib\")","metadata":{"id":"53do3pjR-xBs","trusted":true,"execution":{"iopub.status.busy":"2026-03-14T13:50:08.464935Z","iopub.execute_input":"2026-03-14T13:50:08.465563Z","iopub.status.idle":"2026-03-14T13:50:10.311775Z","shell.execute_reply.started":"2026-03-14T13:50:08.465539Z","shell.execute_reply":"2026-03-14T13:50:10.310994Z"}},"outputs":[{"execution_count":24,"output_type":"execute_result","data":{"text/plain":"['/kaggle/working/efficientnet_full_dataset.joblib']"},"metadata":{}}],"execution_count":24},{"id":"e606f88b-b8c0-4cfe-8f14-e9e7306e3cfe","cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]} \ No newline at end of file diff --git a/notebooks/transfer_learning_efficientnet.ipynb b/notebooks/transfer_learning_efficientnet.ipynb index cd6826b..8217010 100644 --- a/notebooks/transfer_learning_efficientnet.ipynb +++ b/notebooks/transfer_learning_efficientnet.ipynb @@ -12,27 +12,27 @@ }, { "cell_type": "code", - "source": [ - "from google.colab import drive\n", - "drive.mount('/content/drive')" - ], + "execution_count": 1, + "id": "NjskfWptesYA", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "NjskfWptesYA", - "outputId": "2f59bd22-7ca8-4644-fee9-eed6ff0edd18" + "outputId": "e3f5572f-9ee4-4632-a976-5ab959deb7b4" }, - "id": "NjskfWptesYA", - "execution_count": 15, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ - "Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n" + "Mounted at /content/drive\n" ] } + ], + "source": [ + "from google.colab import drive\n", + "drive.mount('/content/drive')" ] }, { @@ -47,7 +47,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 2, "id": "839f7b2c", "metadata": { "id": "839f7b2c" @@ -85,7 +85,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 3, "id": "fd8c985b", "metadata": { "id": "fd8c985b" @@ -100,16 +100,22 @@ }, { "cell_type": "markdown", - "source": [ - "## Parameters" - ], + "id": "GrwZQjpdgmZx", "metadata": { "id": "GrwZQjpdgmZx" }, - "id": "GrwZQjpdgmZx" + "source": [ + "## Parameters" + ] }, { "cell_type": "code", + "execution_count": 4, + "id": "KiwVdE2TgqQ6", + "metadata": { + "id": "KiwVdE2TgqQ6" + }, + "outputs": [], "source": [ "BATCH_SIZE = 128\n", "IMAGE_SIZE = (256, 256)\n", @@ -118,26 +124,40 @@ "NUM_CHANNELS = 3\n", "SEED = 42\n", "LEARNING_RATE = 0.001" - ], - "metadata": { - "id": "KiwVdE2TgqQ6" - }, - "id": "KiwVdE2TgqQ6", - "execution_count": 18, - "outputs": [] + ] }, { "cell_type": "markdown", - "source": [ - "## Creating datasets from directories" - ], + "id": "roEaV7rmg1JP", "metadata": { "id": "roEaV7rmg1JP" }, - "id": "roEaV7rmg1JP" + "source": [ + "## Creating datasets from directories" + ] }, { "cell_type": "code", + "execution_count": 5, + "id": "OjKwSzq-gwGy", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "OjKwSzq-gwGy", + "outputId": "08196acf-3886-4700-cce5-8dbb4c165742" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found 10000 files belonging to 2 classes.\n", + "Found 2000 files belonging to 2 classes.\n", + "Found 2000 files belonging to 2 classes.\n" + ] + } + ], "source": [ "train_ds = image_dataset_from_directory(\n", " train_data_dir,\n", @@ -163,55 +183,41 @@ " seed=SEED,\n", " image_size=IMAGE_SIZE,\n", " batch_size=BATCH_SIZE)" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "OjKwSzq-gwGy", - "outputId": "9355f731-9c2d-4d11-fcd2-ae55aff29353" - }, - "id": "OjKwSzq-gwGy", - "execution_count": 19, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Found 10000 files belonging to 2 classes.\n", - "Found 2000 files belonging to 2 classes.\n", - "Found 2000 files belonging to 2 classes.\n" - ] - } ] }, { "cell_type": "code", - "source": [ - "class_names = train_ds.class_names\n", - "print(class_names)" - ], + "execution_count": 6, + "id": "VVhBlscJg6E5", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "VVhBlscJg6E5", - "outputId": "44f65f59-f3c9-45fd-e3b2-5790d3a881c6" + "outputId": "c6af7832-c178-4d31-dfb7-d686ecc16ea5" }, - "id": "VVhBlscJg6E5", - "execution_count": 20, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ "['fake', 'real']\n" ] } + ], + "source": [ + "class_names = train_ds.class_names\n", + "print(class_names)" ] }, { "cell_type": "code", + "execution_count": 7, + "id": "cwXp8a0hg_HB", + "metadata": { + "id": "cwXp8a0hg_HB" + }, + "outputs": [], "source": [ "def initialize_model(base_model):\n", "\n", @@ -251,140 +257,153 @@ " metrics=['accuracy', 'recall', 'precision'])\n", "\n", " return model" - ], - "metadata": { - "id": "cwXp8a0hg_HB" - }, - "id": "cwXp8a0hg_HB", - "execution_count": 21, - "outputs": [] + ] }, { "cell_type": "code", - "source": [ - "base_model = EfficientNetB3(weights=\"imagenet\", include_top=False, input_shape=(IMAGE_HEIGHT, IMAGE_WIDTH, NUM_CHANNELS))" - ], + "execution_count": 8, + "id": "cK6NNErii_X5", "metadata": { - "id": "cK6NNErii_X5" + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "cK6NNErii_X5", + "outputId": "c7515a59-6381-4772-f70b-bcd3eff2a992" }, - "id": "cK6NNErii_X5", - "execution_count": 22, - "outputs": [] + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Downloading data from https://storage.googleapis.com/keras-applications/efficientnetb3_notop.h5\n", + "\u001b[1m43941136/43941136\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 0us/step\n" + ] + } + ], + "source": [ + "base_model = EfficientNetB3(weights=\"imagenet\", include_top=False, input_shape=(IMAGE_HEIGHT, IMAGE_WIDTH, NUM_CHANNELS))" + ] }, { "cell_type": "code", - "source": [ - "model = initialize_model(base_model)\n", - "model.summary()" - ], + "execution_count": 9, + "id": "luHRr85mkaFq", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 321 }, "id": "luHRr85mkaFq", - "outputId": "e96442f1-aafa-4b6d-85db-5a0cbeafe674" + "outputId": "9220721c-8bb1-4869-ced2-5948259d5cf3" }, - "id": "luHRr85mkaFq", - "execution_count": 23, "outputs": [ { - "output_type": "display_data", "data": { - "text/plain": [ - "\u001b[1mModel: \"functional_1\"\u001b[0m\n" - ], "text/html": [ - "
Model: \"functional_1\"\n",
+              "
Model: \"functional\"\n",
               "
\n" + ], + "text/plain": [ + "\u001b[1mModel: \"functional\"\u001b[0m\n" ] }, - "metadata": {} + "metadata": {}, + "output_type": "display_data" }, { - "output_type": "display_data", "data": { - "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", + "text/html": [ + "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
+              "┃ Layer (type)                     Output Shape                  Param # ┃\n",
               "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
-              "│ input_layer_4 (\u001b[38;5;33mInputLayer\u001b[0m)      │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m3\u001b[0m)    │             \u001b[38;5;34m0\u001b[0m │\n",
+              "│ input_layer_1 (InputLayer)      │ (None, 256, 256, 3)    │             0 │\n",
               "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
-              "│ efficientnetb3 (\u001b[38;5;33mFunctional\u001b[0m)     │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m1536\u001b[0m)     │    \u001b[38;5;34m10,783,535\u001b[0m │\n",
+              "│ efficientnetb3 (Functional)     │ (None, 8, 8, 1536)     │    10,783,535 │\n",
               "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
-              "│ flatten_1 (\u001b[38;5;33mFlatten\u001b[0m)             │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m98304\u001b[0m)          │             \u001b[38;5;34m0\u001b[0m │\n",
+              "│ flatten (Flatten)               │ (None, 98304)          │             0 │\n",
               "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
-              "│ dense_3 (\u001b[38;5;33mDense\u001b[0m)                 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m)            │    \u001b[38;5;34m12,583,040\u001b[0m │\n",
+              "│ dense (Dense)                   │ (None, 128)            │    12,583,040 │\n",
               "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
-              "│ dense_4 (\u001b[38;5;33mDense\u001b[0m)                 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m)             │         \u001b[38;5;34m8,256\u001b[0m │\n",
+              "│ dense_1 (Dense)                 │ (None, 64)             │         8,256 │\n",
               "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
-              "│ dense_5 (\u001b[38;5;33mDense\u001b[0m)                 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m)              │            \u001b[38;5;34m65\u001b[0m │\n",
-              "└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
+              "│ dense_2 (Dense)                 │ (None, 1)              │            65 │\n",
+              "└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
+              "
\n" ], - "text/html": [ - "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
-              "┃ Layer (type)                     Output Shape                  Param # ┃\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_4 (InputLayer)      │ (None, 256, 256, 3)    │             0 │\n",
+              "│ input_layer_1 (\u001b[38;5;33mInputLayer\u001b[0m)      │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m3\u001b[0m)    │             \u001b[38;5;34m0\u001b[0m │\n",
               "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
-              "│ efficientnetb3 (Functional)     │ (None, 8, 8, 1536)     │    10,783,535 │\n",
+              "│ efficientnetb3 (\u001b[38;5;33mFunctional\u001b[0m)     │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m1536\u001b[0m)     │    \u001b[38;5;34m10,783,535\u001b[0m │\n",
               "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
-              "│ flatten_1 (Flatten)             │ (None, 98304)          │             0 │\n",
+              "│ flatten (\u001b[38;5;33mFlatten\u001b[0m)               │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m98304\u001b[0m)          │             \u001b[38;5;34m0\u001b[0m │\n",
               "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
-              "│ dense_3 (Dense)                 │ (None, 128)            │    12,583,040 │\n",
+              "│ dense (\u001b[38;5;33mDense\u001b[0m)                   │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m)            │    \u001b[38;5;34m12,583,040\u001b[0m │\n",
               "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
-              "│ dense_4 (Dense)                 │ (None, 64)             │         8,256 │\n",
+              "│ dense_1 (\u001b[38;5;33mDense\u001b[0m)                 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m)             │         \u001b[38;5;34m8,256\u001b[0m │\n",
               "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
-              "│ dense_5 (Dense)                 │ (None, 1)              │            65 │\n",
-              "└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
-              "
\n" + "│ dense_2 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m) │ \u001b[38;5;34m65\u001b[0m │\n", + "└─────────────────────────────────┴────────────────────────┴───────────────┘\n" ] }, - "metadata": {} + "metadata": {}, + "output_type": "display_data" }, { - "output_type": "display_data", "data": { - "text/plain": [ - "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m23,374,896\u001b[0m (89.17 MB)\n" - ], "text/html": [ "
 Total params: 23,374,896 (89.17 MB)\n",
               "
\n" + ], + "text/plain": [ + "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m23,374,896\u001b[0m (89.17 MB)\n" ] }, - "metadata": {} + "metadata": {}, + "output_type": "display_data" }, { - "output_type": "display_data", "data": { - "text/plain": [ - "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m12,591,361\u001b[0m (48.03 MB)\n" - ], "text/html": [ "
 Trainable params: 12,591,361 (48.03 MB)\n",
               "
\n" + ], + "text/plain": [ + "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m12,591,361\u001b[0m (48.03 MB)\n" ] }, - "metadata": {} + "metadata": {}, + "output_type": "display_data" }, { - "output_type": "display_data", "data": { - "text/plain": [ - "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m10,783,535\u001b[0m (41.14 MB)\n" - ], "text/html": [ "
 Non-trainable params: 10,783,535 (41.14 MB)\n",
               "
\n" + ], + "text/plain": [ + "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m10,783,535\u001b[0m (41.14 MB)\n" ] }, - "metadata": {} + "metadata": {}, + "output_type": "display_data" } + ], + "source": [ + "model = initialize_model(base_model)\n", + "model.summary()" ] }, { "cell_type": "code", + "execution_count": 10, + "id": "Q54_7msDkVnV", + "metadata": { + "id": "Q54_7msDkVnV" + }, + "outputs": [], "source": [ "MODEL = 'dfake_efficientnet.keras'\n", "\n", @@ -403,70 +422,66 @@ " patience=3,\n", " verbose=0,\n", " restore_best_weights=True)" - ], - "metadata": { - "id": "Q54_7msDkVnV" - }, - "id": "Q54_7msDkVnV", - "execution_count": 24, - "outputs": [] + ] }, { "cell_type": "code", - "source": [ - "%%time\n", - "history = model.fit(train_ds,\n", - " epochs=10,\n", - " validation_data=val_ds,\n", - " callbacks=[modelCheckpoint, LRreducer, EarlyStopper],\n", - " verbose=1)" - ], + "execution_count": 11, + "id": "AGUnu6dDlQXn", "metadata": { "colab": { - "base_uri": "https://localhost:8080/", - "height": 425 + "base_uri": "https://localhost:8080/" }, "id": "AGUnu6dDlQXn", - "outputId": "4a25b0f3-9b15-49a9-eca4-d8edae6b6dcd" + "outputId": "b36ef35d-d8a2-4e22-f164-0f71ce142cb3" }, - "id": "AGUnu6dDlQXn", - "execution_count": 25, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ "Epoch 1/10\n", - "\u001b[1m 1/79\u001b[0m \u001b[37m━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[1m1:56:00\u001b[0m 89s/step - accuracy: 0.4219 - loss: 0.7685 - precision: 0.4444 - recall: 0.7742" - ] - }, - { - "output_type": "error", - "ename": "KeyboardInterrupt", - "evalue": "", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/keras/src/utils/traceback_utils.py\u001b[0m in \u001b[0;36merror_handler\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 115\u001b[0m \u001b[0mfiltered_tb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 116\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 117\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 118\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 119\u001b[0m \u001b[0mfiltered_tb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_process_traceback_frames\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__traceback__\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/keras/src/backend/tensorflow/trainer.py\u001b[0m in \u001b[0;36mfit\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)\u001b[0m\n\u001b[1;32m 375\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mstep\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0miterator\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mepoch_iterator\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 376\u001b[0m \u001b[0mcallbacks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mon_train_batch_begin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstep\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 377\u001b[0;31m \u001b[0mlogs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrain_function\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0miterator\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 378\u001b[0m \u001b[0mcallbacks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mon_train_batch_end\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstep\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlogs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 379\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstop_training\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/keras/src/backend/tensorflow/trainer.py\u001b[0m in \u001b[0;36mfunction\u001b[0;34m(iterator)\u001b[0m\n\u001b[1;32m 218\u001b[0m \u001b[0miterator\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mtf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mIterator\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdistribute\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDistributedIterator\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 219\u001b[0m ):\n\u001b[0;32m--> 220\u001b[0;31m \u001b[0mopt_outputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmulti_step_on_iterator\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0miterator\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 221\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mopt_outputs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhas_value\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 222\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mStopIteration\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/tensorflow/python/util/traceback_utils.py\u001b[0m in \u001b[0;36merror_handler\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 148\u001b[0m \u001b[0mfiltered_tb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 149\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 150\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 151\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 152\u001b[0m \u001b[0mfiltered_tb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_process_traceback_frames\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__traceback__\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/tensorflow/python/eager/polymorphic_function/polymorphic_function.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwds)\u001b[0m\n\u001b[1;32m 831\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 832\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mOptionalXlaContext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_jit_compile\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 833\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 834\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 835\u001b[0m \u001b[0mnew_tracing_count\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexperimental_get_tracing_count\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/tensorflow/python/eager/polymorphic_function/polymorphic_function.py\u001b[0m in \u001b[0;36m_call\u001b[0;34m(self, *args, **kwds)\u001b[0m\n\u001b[1;32m 876\u001b[0m \u001b[0;31m# In this case we have not created variables on the first call. So we can\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 877\u001b[0m \u001b[0;31m# run the first trace but we should fail if variables are created.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 878\u001b[0;31m results = tracing_compilation.call_function(\n\u001b[0m\u001b[1;32m 879\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwds\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_variable_creation_config\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 880\u001b[0m )\n", - "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/tensorflow/python/eager/polymorphic_function/tracing_compilation.py\u001b[0m in \u001b[0;36mcall_function\u001b[0;34m(args, kwargs, tracing_options)\u001b[0m\n\u001b[1;32m 137\u001b[0m \u001b[0mbound_args\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunction\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfunction_type\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbind\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 138\u001b[0m \u001b[0mflat_inputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunction\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfunction_type\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0munpack_inputs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbound_args\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 139\u001b[0;31m return function._call_flat( # pylint: disable=protected-access\n\u001b[0m\u001b[1;32m 140\u001b[0m \u001b[0mflat_inputs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcaptured_inputs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfunction\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcaptured_inputs\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 141\u001b[0m )\n", - "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/tensorflow/python/eager/polymorphic_function/concrete_function.py\u001b[0m in \u001b[0;36m_call_flat\u001b[0;34m(self, tensor_inputs, captured_inputs)\u001b[0m\n\u001b[1;32m 1320\u001b[0m and executing_eagerly):\n\u001b[1;32m 1321\u001b[0m \u001b[0;31m# No tape is watching; skip to running the function.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1322\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_inference_function\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcall_preflattened\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1323\u001b[0m forward_backward = self._select_forward_and_backward_functions(\n\u001b[1;32m 1324\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/tensorflow/python/eager/polymorphic_function/atomic_function.py\u001b[0m in \u001b[0;36mcall_preflattened\u001b[0;34m(self, args)\u001b[0m\n\u001b[1;32m 214\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mcall_preflattened\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mSequence\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTensor\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mAny\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 215\u001b[0m \u001b[0;34m\"\"\"Calls with flattened tensor inputs and returns the structured output.\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 216\u001b[0;31m \u001b[0mflat_outputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcall_flat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 217\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfunction_type\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpack_output\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mflat_outputs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 218\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/tensorflow/python/eager/polymorphic_function/atomic_function.py\u001b[0m in \u001b[0;36mcall_flat\u001b[0;34m(self, *args)\u001b[0m\n\u001b[1;32m 249\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mrecord\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstop_recording\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 250\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_bound_context\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexecuting_eagerly\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 251\u001b[0;31m outputs = self._bound_context.call_function(\n\u001b[0m\u001b[1;32m 252\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 253\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/tensorflow/python/eager/context.py\u001b[0m in \u001b[0;36mcall_function\u001b[0;34m(self, name, tensor_inputs, num_outputs)\u001b[0m\n\u001b[1;32m 1686\u001b[0m \u001b[0mcancellation_context\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcancellation\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcontext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1687\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcancellation_context\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1688\u001b[0;31m outputs = execute.execute(\n\u001b[0m\u001b[1;32m 1689\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdecode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"utf-8\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1690\u001b[0m \u001b[0mnum_outputs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnum_outputs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/tensorflow/python/eager/execute.py\u001b[0m in \u001b[0;36mquick_execute\u001b[0;34m(op_name, num_outputs, inputs, attrs, ctx, name)\u001b[0m\n\u001b[1;32m 51\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 52\u001b[0m \u001b[0mctx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mensure_initialized\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 53\u001b[0;31m tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,\n\u001b[0m\u001b[1;32m 54\u001b[0m inputs, attrs, num_outputs)\n\u001b[1;32m 55\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_NotOkStatusException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + "\u001b[1m79/79\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1432s\u001b[0m 17s/step - accuracy: 0.6659 - loss: 1.1695 - precision: 0.6529 - recall: 0.6846 - val_accuracy: 0.8465 - val_loss: 0.3503 - val_precision: 0.8978 - val_recall: 0.7820 - learning_rate: 0.0010\n", + "Epoch 2/10\n", + "\u001b[1m79/79\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m42s\u001b[0m 526ms/step - accuracy: 0.8808 - loss: 0.2791 - precision: 0.8795 - recall: 0.8790 - val_accuracy: 0.8445 - val_loss: 0.3654 - val_precision: 0.9126 - val_recall: 0.7620 - learning_rate: 0.0010\n", + "Epoch 3/10\n", + "\u001b[1m79/79\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m86s\u001b[0m 579ms/step - accuracy: 0.9198 - loss: 0.1997 - precision: 0.9175 - recall: 0.9201 - val_accuracy: 0.8700 - val_loss: 0.3298 - val_precision: 0.9374 - val_recall: 0.7930 - learning_rate: 0.0010\n", + "Epoch 4/10\n", + "\u001b[1m79/79\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m43s\u001b[0m 536ms/step - accuracy: 0.9481 - loss: 0.1374 - precision: 0.9494 - recall: 0.9450 - val_accuracy: 0.8905 - val_loss: 0.2767 - val_precision: 0.8909 - val_recall: 0.8900 - learning_rate: 0.0010\n", + "Epoch 5/10\n", + "\u001b[1m79/79\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m41s\u001b[0m 512ms/step - accuracy: 0.9494 - loss: 0.1510 - precision: 0.9446 - recall: 0.9548 - val_accuracy: 0.8900 - val_loss: 0.2834 - val_precision: 0.9079 - val_recall: 0.8680 - learning_rate: 0.0010\n", + "Epoch 6/10\n", + "\u001b[1m79/79\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m43s\u001b[0m 537ms/step - accuracy: 0.9633 - loss: 0.1027 - precision: 0.9648 - recall: 0.9608 - val_accuracy: 0.9060 - val_loss: 0.2462 - val_precision: 0.8942 - val_recall: 0.9210 - learning_rate: 0.0010\n", + "Epoch 7/10\n", + "\u001b[1m79/79\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m41s\u001b[0m 510ms/step - accuracy: 0.9616 - loss: 0.0911 - precision: 0.9580 - recall: 0.9651 - val_accuracy: 0.8770 - val_loss: 0.3757 - val_precision: 0.9467 - val_recall: 0.7990 - learning_rate: 0.0010\n", + "Epoch 8/10\n", + "\u001b[1m79/79\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m41s\u001b[0m 512ms/step - accuracy: 0.9810 - loss: 0.0537 - precision: 0.9824 - recall: 0.9792 - val_accuracy: 0.8865 - val_loss: 0.3413 - val_precision: 0.9271 - val_recall: 0.8390 - learning_rate: 0.0010\n", + "Epoch 9/10\n", + "\u001b[1m79/79\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 426ms/step - accuracy: 0.9834 - loss: 0.0479 - precision: 0.9843 - recall: 0.9820\n", + "Epoch 9: ReduceLROnPlateau reducing learning rate to 0.00010000000474974513.\n", + "\u001b[1m79/79\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m44s\u001b[0m 557ms/step - accuracy: 0.9834 - loss: 0.0479 - precision: 0.9843 - recall: 0.9820 - val_accuracy: 0.8990 - val_loss: 0.3348 - val_precision: 0.9514 - val_recall: 0.8410 - learning_rate: 0.0010\n", + "CPU times: user 4min 34s, sys: 28 s, total: 5min 2s\n", + "Wall time: 30min 12s\n" ] } + ], + "source": [ + "%%time\n", + "history = model.fit(train_ds,\n", + " epochs=10,\n", + " validation_data=val_ds,\n", + " callbacks=[modelCheckpoint, LRreducer, EarlyStopper],\n", + " verbose=1)" ] }, { "cell_type": "code", + "execution_count": 12, + "id": "ek10k5T3ljo2", + "metadata": { + "id": "ek10k5T3ljo2" + }, + "outputs": [], "source": [ "def plot_history(history):\n", " fig, ax = plt.subplots(1, 2, figsize=(15,5))\n", @@ -478,59 +493,288 @@ " ax[1].plot(history.epoch, history.history[\"val_accuracy\"], label=\"Validation acc\")\n", " ax[0].legend()\n", " ax[1].legend()" - ], - "metadata": { - "id": "ek10k5T3ljo2" - }, - "id": "ek10k5T3ljo2", - "execution_count": 26, - "outputs": [] + ] }, { "cell_type": "code", + "execution_count": 13, + "id": "3_bJJM_Ulnpc", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 420 + }, + "id": "3_bJJM_Ulnpc", + "outputId": "b1e1b192-dda3-4f48-ad47-73d63781205e" + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABL4AAAHDCAYAAAAqZtO0AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAuQNJREFUeJzs3Xd4VGX6xvHvzKR3UiGQEJLQxYA0CV1BUEFUVAQVxbYWbKwNK+pPWVdFFAu7KmIBO7IqilIFQ1MQ6SWhBAKkAWmQOvP74yQTIgQIJJyU+3Nd52LmzJmZZxI4zNzzvs9rcTgcDkREREREREREROoZq9kFiIiIiIiIiIiI1AQFXyIiIiIiIiIiUi8p+BIRERERERERkXpJwZeIiIiIiIiIiNRLCr5ERERERERERKReUvAlIiIiIiIiIiL1koIvERERERERERGplxR8iYiIiIiIiIhIvaTgS0RERERERERE6iUFXyJSK0yfPh2LxcKuXbvMLkVERERERETqCQVfIiIiIiIiIiJSLyn4EhERERERERGReknBl4iIiIiIiNRJeXl5ZpcgIrWcgi8RqbXeeecd2rdvj7u7O+Hh4dx7770cPny4wjHbt29n+PDhNG7cGA8PD5o1a8b1119PVlaW85h58+bRq1cvAgIC8PHxoXXr1jzxxBPn+NWIiIiI1H67d+/mnnvuoXXr1nh6ehIUFMS11157wj6shw8f5qGHHiIqKgp3d3eaNWvG6NGjycjIcB6Tn5/PhAkTaNWqFR4eHjRp0oSrr76apKQkABYvXozFYmHx4sUVHnvXrl1YLBamT5/u3HfLLbfg4+NDUlISl112Gb6+vtxwww0ALF26lGuvvZbIyEjc3d2JiIjgoYce4ujRo8fVvWXLFq677jpCQkLw9PSkdevWPPnkkwAsWrQIi8XCt99+e9z9Zs6cicViYfny5VX9sYqIiVzMLkBE5EQmTJjAc889x4ABA7j77rvZunUr7777Lr///jsJCQm4urpSWFjIoEGDKCgo4L777qNx48akpKTwww8/cPjwYfz9/dm4cSNDhgzh/PPP5/nnn8fd3Z3ExEQSEhLMfokiIiIitc7vv//OsmXLuP7662nWrBm7du3i3XffpV+/fmzatAkvLy8AcnNz6d27N5s3b+bWW2/lggsuICMjg++++469e/cSHBxMSUkJQ4YMYcGCBVx//fU88MAD5OTkMG/ePDZs2EBMTEyV6ysuLmbQoEH06tWLV1991VnPV199xZEjR7j77rsJCgpi1apVTJkyhb179/LVV185779u3Tp69+6Nq6srd955J1FRUSQlJfH999/z4osv0q9fPyIiIpgxYwZXXXVVheeeMWMGMTEx9OjR4yx+wiJyzjlERGqBDz/80AE4du7c6UhLS3O4ubk5LrnkEkdJSYnzmLfeessBOKZNm+ZwOByOP//80wE4vvrqq0of9/XXX3cAjvT09Bp/DSIiIiJ13ZEjR47bt3z5cgfg+Pjjj537nnnmGQfgmDVr1nHH2+12h8PhcEybNs0BOCZNmlTpMYsWLXIAjkWLFlW4fefOnQ7A8eGHHzr33XzzzQ7A8fjjj59W3RMnTnRYLBbH7t27nfv69Onj8PX1rbDv2HocDodj/PjxDnd3d8fhw4ed+9LS0hwuLi6OZ5999rjnEZHaTVMdRaTWmT9/PoWFhTz44INYreWnqTvuuAM/Pz/mzJkDgL+/PwA///wzR44cOeFjBQQEAPC///0Pu91es4WLiIiI1HGenp7Oy0VFRWRmZhIbG0tAQABr1qxx3vbNN98QFxd33KgoAIvF4jwmODiY++67r9JjzsTdd9990rrz8vLIyMggPj4eh8PBn3/+CUB6ejpLlizh1ltvJTIystJ6Ro8eTUFBAV9//bVz3xdffEFxcTE33njjGdctIuZQ8CUitc7u3bsBaN26dYX9bm5uREdHO29v0aIF48aN4/333yc4OJhBgwbx9ttvV+jvNWLECHr27Mntt99OWFgY119/PV9++aVCMBEREZETOHr0KM888wwRERG4u7sTHBxMSEgIhw8frvAeKykpifPOO++kj5WUlETr1q1xcam+DjsuLi40a9bsuP3JycnccsstBAYG4uPjQ0hICH379gVw1r1jxw6AU9bdpk0bunbtyowZM5z7ZsyYwYUXXkhsbGx1vRQROUcUfIlInfbaa6+xbt06nnjiCY4ePcr9999P+/bt2bt3L2B8+7dkyRLmz5/PTTfdxLp16xgxYgQDBw6kpKTE5OpFREREapf77ruPF198keuuu44vv/ySX375hXnz5hEUFFQjXxxWNvKrsvdp7u7uFWYElB07cOBA5syZw2OPPcbs2bOZN2+eszH+mdQ9evRofv31V/bu3UtSUhIrVqzQ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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "plot_history(history)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "zOlWUQUwls3c", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "zOlWUQUwls3c", + "outputId": "f816b00b-65b7-49ba-feb6-da5e7a8e1d2f" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m16/16\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m372s\u001b[0m 23s/step - accuracy: 0.8952 - loss: 0.2658 - precision: 0.8900 - recall: 0.9009\n" + ] + }, + { + "data": { + "text/plain": [ + "[0.2771250009536743, 0.890999972820282, 0.8989999890327454, 0.8848425149917603]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } ], + "source": [ + "model.evaluate(test_ds)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "53do3pjR-xBs", "metadata": { "colab": { - "base_uri": "https://localhost:8080/", - "height": 141 + "base_uri": "https://localhost:8080/" }, - "id": "3_bJJM_Ulnpc", - "outputId": "1dcab91a-5274-44fe-fc77-89e0e61bf892" + "id": "53do3pjR-xBs", + "outputId": "1cb0a561-6aad-46d0-8eb8-46d48f707fcd" + }, + "outputs": [], + "source": [ + "import joblib\n", + "\n", + "# model is your trained model\n", + "# joblib.dump(model, \"/content/drive/MyDrive/dfake_models/efficientnet_v1.joblib\")" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "2eHqXx5aHhrQ", + "metadata": { + "id": "2eHqXx5aHhrQ" }, - "id": "3_bJJM_Ulnpc", - "execution_count": 27, "outputs": [ { + "name": "stderr", + "output_type": "stream", + "text": [ + "2026-03-13 14:37:53.590066: I external/local_tsl/tsl/cuda/cudart_stub.cc:32] Could not find cuda drivers on your machine, GPU will not be used.\n", + "2026-03-13 14:37:53.852913: I external/local_tsl/tsl/cuda/cudart_stub.cc:32] Could not find cuda drivers on your machine, GPU will not be used.\n", + "2026-03-13 14:37:54.186353: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:479] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n", + "2026-03-13 14:37:54.516620: E external/local_xla/xla/stream_executor/cuda/cuda_dnn.cc:10575] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n", + "2026-03-13 14:37:54.518700: E external/local_xla/xla/stream_executor/cuda/cuda_blas.cc:1442] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n", + "2026-03-13 14:37:55.027306: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n", + "To enable the following instructions: AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", + "2026-03-13 14:37:57.450732: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT\n" + ] + }, + { + "ename": "ValueError", + "evalue": "Input 0 of layer \"stem_conv\" is incompatible with the layer: expected axis -1 of input shape to have value 3, but received input with shape (None, 257, 257, 1)", "output_type": "error", - "ename": "NameError", - "evalue": "name 'history' is not defined", "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m/tmp/ipykernel_551/1703789770.py\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mplot_history\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mhistory\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mNameError\u001b[0m: name 'history' is not defined" + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mValueError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[2]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m model_1 = \u001b[43mjoblib\u001b[49m\u001b[43m.\u001b[49m\u001b[43mload\u001b[49m\u001b[43m(\u001b[49m\u001b[33;43m'\u001b[39;49m\u001b[33;43m/home/thomas/code/dfake/dfake-models/training_outputs/models/efficientnet_v1.joblib\u001b[39;49m\u001b[33;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/dfake_models_env/lib/python3.12/site-packages/joblib/numpy_pickle.py:749\u001b[39m, in \u001b[36mload\u001b[39m\u001b[34m(filename, mmap_mode, ensure_native_byte_order)\u001b[39m\n\u001b[32m 744\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m load_compatibility(fobj)\n\u001b[32m 746\u001b[39m \u001b[38;5;66;03m# A memory-mapped array has to be mapped with the endianness\u001b[39;00m\n\u001b[32m 747\u001b[39m \u001b[38;5;66;03m# it has been written with. Other arrays are coerced to the\u001b[39;00m\n\u001b[32m 748\u001b[39m \u001b[38;5;66;03m# native endianness of the host system.\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m749\u001b[39m obj = \u001b[43m_unpickle\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 750\u001b[39m \u001b[43m \u001b[49m\u001b[43mfobj\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 751\u001b[39m \u001b[43m \u001b[49m\u001b[43mensure_native_byte_order\u001b[49m\u001b[43m=\u001b[49m\u001b[43mensure_native_byte_order\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 752\u001b[39m \u001b[43m \u001b[49m\u001b[43mfilename\u001b[49m\u001b[43m=\u001b[49m\u001b[43mfilename\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 753\u001b[39m \u001b[43m \u001b[49m\u001b[43mmmap_mode\u001b[49m\u001b[43m=\u001b[49m\u001b[43mvalidated_mmap_mode\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 754\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 756\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m obj\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/dfake_models_env/lib/python3.12/site-packages/joblib/numpy_pickle.py:626\u001b[39m, in \u001b[36m_unpickle\u001b[39m\u001b[34m(fobj, ensure_native_byte_order, filename, mmap_mode)\u001b[39m\n\u001b[32m 624\u001b[39m obj = \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[32m 625\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m626\u001b[39m obj = \u001b[43munpickler\u001b[49m\u001b[43m.\u001b[49m\u001b[43mload\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 627\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m unpickler.compat_mode:\n\u001b[32m 628\u001b[39m warnings.warn(\n\u001b[32m 629\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mThe file \u001b[39m\u001b[33m'\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[33m'\u001b[39m\u001b[33m has been generated with a \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 630\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mjoblib version less than 0.10. \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m (...)\u001b[39m\u001b[32m 633\u001b[39m stacklevel=\u001b[32m3\u001b[39m,\n\u001b[32m 634\u001b[39m )\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.9/lib/python3.12/pickle.py:1256\u001b[39m, in \u001b[36m_Unpickler.load\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 1254\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mEOFError\u001b[39;00m\n\u001b[32m 1255\u001b[39m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(key, bytes_types)\n\u001b[32m-> \u001b[39m\u001b[32m1256\u001b[39m \u001b[43mdispatch\u001b[49m\u001b[43m[\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m[\u001b[49m\u001b[32;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m]\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[32m 1257\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m _Stop \u001b[38;5;28;01mas\u001b[39;00m stopinst:\n\u001b[32m 1258\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m stopinst.value\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.9/lib/python3.12/pickle.py:1632\u001b[39m, in \u001b[36m_Unpickler.load_reduce\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 1630\u001b[39m args = stack.pop()\n\u001b[32m 1631\u001b[39m func = stack[-\u001b[32m1\u001b[39m]\n\u001b[32m-> \u001b[39m\u001b[32m1632\u001b[39m stack[-\u001b[32m1\u001b[39m] = \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m/usr/local/lib/python3.12/dist-packages/keras/src/saving/keras_saveable.py:21\u001b[39m, in \u001b[36mKerasSaveable._unpickle_model\u001b[39m\u001b[34m(cls, bytesio)\u001b[39m\n\u001b[32m 18\u001b[39m \u001b[38;5;28;01mimport\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mkeras\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01msrc\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01msaving\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01msaving_lib\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mas\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01msaving_lib\u001b[39;00m\n\u001b[32m 20\u001b[39m \u001b[38;5;66;03m# pickle is not safe regardless of what you do.\u001b[39;00m\n\u001b[32m---> \u001b[39m\u001b[32m21\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43msaving_lib\u001b[49m\u001b[43m.\u001b[49m\u001b[43m_load_model_from_fileobj\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 22\u001b[39m \u001b[43m \u001b[49m\u001b[43mbytesio\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcustom_objects\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mcompile\u001b[39;49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msafe_mode\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\n\u001b[32m 23\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/dfake_models_env/lib/python3.12/site-packages/keras/src/saving/saving_lib.py:442\u001b[39m, in \u001b[36m_load_model_from_fileobj\u001b[39m\u001b[34m(fileobj, custom_objects, compile, safe_mode)\u001b[39m\n\u001b[32m 439\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m zf.open(_CONFIG_FILENAME, \u001b[33m\"\u001b[39m\u001b[33mr\u001b[39m\u001b[33m\"\u001b[39m) \u001b[38;5;28;01mas\u001b[39;00m f:\n\u001b[32m 440\u001b[39m config_json = f.read()\n\u001b[32m--> \u001b[39m\u001b[32m442\u001b[39m model = \u001b[43m_model_from_config\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 443\u001b[39m \u001b[43m \u001b[49m\u001b[43mconfig_json\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcustom_objects\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mcompile\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msafe_mode\u001b[49m\n\u001b[32m 444\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 446\u001b[39m all_filenames = zf.namelist()\n\u001b[32m 447\u001b[39m extract_dir = \u001b[38;5;28;01mNone\u001b[39;00m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/dfake_models_env/lib/python3.12/site-packages/keras/src/saving/saving_lib.py:431\u001b[39m, in \u001b[36m_model_from_config\u001b[39m\u001b[34m(config_json, custom_objects, compile, safe_mode)\u001b[39m\n\u001b[32m 429\u001b[39m \u001b[38;5;66;03m# Construct the model from the configuration file in the archive.\u001b[39;00m\n\u001b[32m 430\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m ObjectSharingScope():\n\u001b[32m--> \u001b[39m\u001b[32m431\u001b[39m model = \u001b[43mdeserialize_keras_object\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 432\u001b[39m \u001b[43m \u001b[49m\u001b[43mconfig_dict\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcustom_objects\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msafe_mode\u001b[49m\u001b[43m=\u001b[49m\u001b[43msafe_mode\u001b[49m\n\u001b[32m 433\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 434\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m model\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/dfake_models_env/lib/python3.12/site-packages/keras/src/saving/serialization_lib.py:733\u001b[39m, in \u001b[36mdeserialize_keras_object\u001b[39m\u001b[34m(config, custom_objects, safe_mode, **kwargs)\u001b[39m\n\u001b[32m 731\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m custom_obj_scope, safe_mode_scope:\n\u001b[32m 732\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m733\u001b[39m instance = \u001b[38;5;28;43mcls\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mfrom_config\u001b[49m\u001b[43m(\u001b[49m\u001b[43minner_config\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 734\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m 735\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\n\u001b[32m 736\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mcls\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m could not be deserialized properly. Please\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 737\u001b[39m \u001b[33m\"\u001b[39m\u001b[33m ensure that components that are Python object\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m (...)\u001b[39m\u001b[32m 741\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[33mconfig=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mconfig\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m.\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[33mException encountered: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00me\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m\n\u001b[32m 742\u001b[39m )\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/dfake_models_env/lib/python3.12/site-packages/keras/src/models/model.py:660\u001b[39m, in \u001b[36mModel.from_config\u001b[39m\u001b[34m(cls, config, custom_objects)\u001b[39m\n\u001b[32m 655\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m is_functional_config \u001b[38;5;129;01mand\u001b[39;00m revivable_as_functional:\n\u001b[32m 656\u001b[39m \u001b[38;5;66;03m# Revive Functional model\u001b[39;00m\n\u001b[32m 657\u001b[39m \u001b[38;5;66;03m# (but not Functional subclasses with a custom __init__)\u001b[39;00m\n\u001b[32m 658\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mkeras\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01msrc\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mmodels\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mfunctional\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m functional_from_config\n\u001b[32m--> \u001b[39m\u001b[32m660\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunctional_from_config\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 661\u001b[39m \u001b[43m \u001b[49m\u001b[38;5;28;43mcls\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcustom_objects\u001b[49m\u001b[43m=\u001b[49m\u001b[43mcustom_objects\u001b[49m\n\u001b[32m 662\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 664\u001b[39m \u001b[38;5;66;03m# Either the model has a custom __init__, or the config\u001b[39;00m\n\u001b[32m 665\u001b[39m \u001b[38;5;66;03m# does not contain all the information necessary to\u001b[39;00m\n\u001b[32m 666\u001b[39m \u001b[38;5;66;03m# revive a Functional model. This happens when the user creates\u001b[39;00m\n\u001b[32m (...)\u001b[39m\u001b[32m 669\u001b[39m \u001b[38;5;66;03m# In this case, we fall back to provide all config into the\u001b[39;00m\n\u001b[32m 670\u001b[39m \u001b[38;5;66;03m# constructor of the class.\u001b[39;00m\n\u001b[32m 671\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/dfake_models_env/lib/python3.12/site-packages/keras/src/models/functional.py:558\u001b[39m, in \u001b[36mfunctional_from_config\u001b[39m\u001b[34m(cls, config, custom_objects)\u001b[39m\n\u001b[32m 556\u001b[39m \u001b[38;5;66;03m# First, we create all layers and enqueue nodes to be processed\u001b[39;00m\n\u001b[32m 557\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m layer_data \u001b[38;5;129;01min\u001b[39;00m functional_config[\u001b[33m\"\u001b[39m\u001b[33mlayers\u001b[39m\u001b[33m\"\u001b[39m]:\n\u001b[32m--> \u001b[39m\u001b[32m558\u001b[39m \u001b[43mprocess_layer\u001b[49m\u001b[43m(\u001b[49m\u001b[43mlayer_data\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 560\u001b[39m \u001b[38;5;66;03m# Then we process nodes in order of layer depth.\u001b[39;00m\n\u001b[32m 561\u001b[39m \u001b[38;5;66;03m# Nodes that cannot yet be processed (if the inbound node\u001b[39;00m\n\u001b[32m 562\u001b[39m \u001b[38;5;66;03m# does not yet exist) are re-enqueued, and the process\u001b[39;00m\n\u001b[32m 563\u001b[39m \u001b[38;5;66;03m# is repeated until all nodes are processed.\u001b[39;00m\n\u001b[32m 564\u001b[39m \u001b[38;5;28;01mwhile\u001b[39;00m unprocessed_nodes:\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/dfake_models_env/lib/python3.12/site-packages/keras/src/models/functional.py:525\u001b[39m, in \u001b[36mfunctional_from_config..process_layer\u001b[39m\u001b[34m(layer_data)\u001b[39m\n\u001b[32m 521\u001b[39m layer = saving_utils.model_from_config(\n\u001b[32m 522\u001b[39m layer_data, custom_objects=custom_objects\n\u001b[32m 523\u001b[39m )\n\u001b[32m 524\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m525\u001b[39m layer = \u001b[43mserialization_lib\u001b[49m\u001b[43m.\u001b[49m\u001b[43mdeserialize_keras_object\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 526\u001b[39m \u001b[43m \u001b[49m\u001b[43mlayer_data\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcustom_objects\u001b[49m\u001b[43m=\u001b[49m\u001b[43mcustom_objects\u001b[49m\n\u001b[32m 527\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 528\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(layer, Operation):\n\u001b[32m 529\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[32m 530\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mUnexpected object from deserialization, expected a layer or \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 531\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33moperation, got a \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mtype\u001b[39m(layer)\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m\n\u001b[32m 532\u001b[39m )\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/dfake_models_env/lib/python3.12/site-packages/keras/src/saving/serialization_lib.py:733\u001b[39m, in \u001b[36mdeserialize_keras_object\u001b[39m\u001b[34m(config, custom_objects, safe_mode, **kwargs)\u001b[39m\n\u001b[32m 731\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m custom_obj_scope, safe_mode_scope:\n\u001b[32m 732\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m733\u001b[39m instance = \u001b[38;5;28;43mcls\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mfrom_config\u001b[49m\u001b[43m(\u001b[49m\u001b[43minner_config\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 734\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m 735\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\n\u001b[32m 736\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mcls\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m could not be deserialized properly. Please\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 737\u001b[39m \u001b[33m\"\u001b[39m\u001b[33m ensure that components that are Python object\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m (...)\u001b[39m\u001b[32m 741\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[33mconfig=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mconfig\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m.\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[33mException encountered: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00me\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m\n\u001b[32m 742\u001b[39m )\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/dfake_models_env/lib/python3.12/site-packages/keras/src/models/model.py:660\u001b[39m, in \u001b[36mModel.from_config\u001b[39m\u001b[34m(cls, config, custom_objects)\u001b[39m\n\u001b[32m 655\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m is_functional_config \u001b[38;5;129;01mand\u001b[39;00m revivable_as_functional:\n\u001b[32m 656\u001b[39m \u001b[38;5;66;03m# Revive Functional model\u001b[39;00m\n\u001b[32m 657\u001b[39m \u001b[38;5;66;03m# (but not Functional subclasses with a custom __init__)\u001b[39;00m\n\u001b[32m 658\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mkeras\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01msrc\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mmodels\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mfunctional\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m functional_from_config\n\u001b[32m--> \u001b[39m\u001b[32m660\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunctional_from_config\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 661\u001b[39m \u001b[43m \u001b[49m\u001b[38;5;28;43mcls\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcustom_objects\u001b[49m\u001b[43m=\u001b[49m\u001b[43mcustom_objects\u001b[49m\n\u001b[32m 662\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 664\u001b[39m \u001b[38;5;66;03m# Either the model has a custom __init__, or the config\u001b[39;00m\n\u001b[32m 665\u001b[39m \u001b[38;5;66;03m# does not contain all the information necessary to\u001b[39;00m\n\u001b[32m 666\u001b[39m \u001b[38;5;66;03m# revive a Functional model. This happens when the user creates\u001b[39;00m\n\u001b[32m (...)\u001b[39m\u001b[32m 669\u001b[39m \u001b[38;5;66;03m# In this case, we fall back to provide all config into the\u001b[39;00m\n\u001b[32m 670\u001b[39m \u001b[38;5;66;03m# constructor of the class.\u001b[39;00m\n\u001b[32m 671\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/dfake_models_env/lib/python3.12/site-packages/keras/src/models/functional.py:577\u001b[39m, in \u001b[36mfunctional_from_config\u001b[39m\u001b[34m(cls, config, custom_objects)\u001b[39m\n\u001b[32m 575\u001b[39m node_data = node_data_list[node_index]\n\u001b[32m 576\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m577\u001b[39m \u001b[43mprocess_node\u001b[49m\u001b[43m(\u001b[49m\u001b[43mlayer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnode_data\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 579\u001b[39m \u001b[38;5;66;03m# If the node does not have all inbound layers\u001b[39;00m\n\u001b[32m 580\u001b[39m \u001b[38;5;66;03m# available, stop processing and continue later\u001b[39;00m\n\u001b[32m 581\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mIndexError\u001b[39;00m:\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/dfake_models_env/lib/python3.12/site-packages/keras/src/models/functional.py:507\u001b[39m, in \u001b[36mfunctional_from_config..process_node\u001b[39m\u001b[34m(layer, node_data)\u001b[39m\n\u001b[32m 504\u001b[39m args, kwargs = deserialize_node(node_data, created_layers)\n\u001b[32m 505\u001b[39m \u001b[38;5;66;03m# Call layer on its inputs, thus creating the node\u001b[39;00m\n\u001b[32m 506\u001b[39m \u001b[38;5;66;03m# and building the layer if needed.\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m507\u001b[39m \u001b[43mlayer\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/dfake_models_env/lib/python3.12/site-packages/keras/src/utils/traceback_utils.py:122\u001b[39m, in \u001b[36mfilter_traceback..error_handler\u001b[39m\u001b[34m(*args, **kwargs)\u001b[39m\n\u001b[32m 119\u001b[39m filtered_tb = _process_traceback_frames(e.__traceback__)\n\u001b[32m 120\u001b[39m \u001b[38;5;66;03m# To get the full stack trace, call:\u001b[39;00m\n\u001b[32m 121\u001b[39m \u001b[38;5;66;03m# `keras.config.disable_traceback_filtering()`\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m122\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m e.with_traceback(filtered_tb) \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[32m 123\u001b[39m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[32m 124\u001b[39m \u001b[38;5;28;01mdel\u001b[39;00m filtered_tb\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/dfake_models_env/lib/python3.12/site-packages/keras/src/layers/input_spec.py:227\u001b[39m, in \u001b[36massert_input_compatibility\u001b[39m\u001b[34m(input_spec, inputs, layer_name)\u001b[39m\n\u001b[32m 222\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m axis, value \u001b[38;5;129;01min\u001b[39;00m spec.axes.items():\n\u001b[32m 223\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m value \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m shape[axis] \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m {\n\u001b[32m 224\u001b[39m value,\n\u001b[32m 225\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[32m 226\u001b[39m }:\n\u001b[32m--> \u001b[39m\u001b[32m227\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[32m 228\u001b[39m \u001b[33mf\u001b[39m\u001b[33m'\u001b[39m\u001b[33mInput \u001b[39m\u001b[38;5;132;01m{\u001b[39;00minput_index\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m of layer \u001b[39m\u001b[33m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mlayer_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m\u001b[33m is \u001b[39m\u001b[33m'\u001b[39m\n\u001b[32m 229\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mincompatible with the layer: expected axis \u001b[39m\u001b[38;5;132;01m{\u001b[39;00maxis\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 230\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mof input shape to have value \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mvalue\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m, \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 231\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mbut received input with \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 232\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mshape \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mshape\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m\n\u001b[32m 233\u001b[39m )\n\u001b[32m 234\u001b[39m \u001b[38;5;66;03m# Check shape.\u001b[39;00m\n\u001b[32m 235\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m spec.shape \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", + "\u001b[31mValueError\u001b[39m: Input 0 of layer \"stem_conv\" is incompatible with the layer: expected axis -1 of input shape to have value 3, but received input with shape (None, 257, 257, 1)" ] } + ], + "source": [ + "model_1 = joblib.load('/home/thomas/code/dfake/dfake-models/training_outputs/models/efficientnet_v1.joblib')" ] }, { "cell_type": "code", - "source": [ - "model.evaluate(test_ds)" - ], + "execution_count": 18, + "id": "gDhfMlYHTpEw", "metadata": { - "id": "zOlWUQUwls3c" + "colab": { + "base_uri": "https://localhost:8080/", + "height": 337 + }, + "id": "gDhfMlYHTpEw", + "outputId": "a2a9b318-73d9-4b40-efdb-e80d2f11b613" }, - "id": "zOlWUQUwls3c", + "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, 256, 256, 3)    │             0 │\n",
+              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+              "│ efficientnetb3 (Functional)     │ (None, 8, 8, 1536)     │    10,783,535 │\n",
+              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+              "│ flatten (Flatten)               │ (None, 98304)          │             0 │\n",
+              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+              "│ dense (Dense)                   │ (None, 128)            │    12,583,040 │\n",
+              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+              "│ dense_1 (Dense)                 │ (None, 64)             │         8,256 │\n",
+              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+              "│ dense_2 (Dense)                 │ (None, 1)              │            65 │\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;34m256\u001b[0m, \u001b[38;5;34m256\u001b[0m, \u001b[38;5;34m3\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ efficientnetb3 (\u001b[38;5;33mFunctional\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m1536\u001b[0m) │ \u001b[38;5;34m10,783,535\u001b[0m │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ flatten (\u001b[38;5;33mFlatten\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m98304\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;34m128\u001b[0m) │ \u001b[38;5;34m12,583,040\u001b[0m │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ dense_1 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m8,256\u001b[0m │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ dense_2 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m) │ \u001b[38;5;34m65\u001b[0m │\n", + "└─────────────────────────────────┴────────────────────────┴───────────────┘\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
 Total params: 48,557,620 (185.23 MB)\n",
+              "
\n" + ], + "text/plain": [ + "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m48,557,620\u001b[0m (185.23 MB)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
 Trainable params: 12,591,361 (48.03 MB)\n",
+              "
\n" + ], + "text/plain": [ + "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m12,591,361\u001b[0m (48.03 MB)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
 Non-trainable params: 10,783,535 (41.14 MB)\n",
+              "
\n" + ], + "text/plain": [ + "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m10,783,535\u001b[0m (41.14 MB)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
 Optimizer params: 25,182,724 (96.06 MB)\n",
+              "
\n" + ], + "text/plain": [ + "\u001b[1m Optimizer params: \u001b[0m\u001b[38;5;34m25,182,724\u001b[0m (96.06 MB)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "model_1.summary()" + ] + }, + { + "cell_type": "code", "execution_count": null, - "outputs": [] + "id": "hg5kUnx_Uk_h", + "metadata": { + "id": "hg5kUnx_Uk_h" + }, + "outputs": [], + "source": [] } ], "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "T4", + "provenance": [] + }, "kernelspec": { - "display_name": "Python 3", + "display_name": "dfake_models_env", + "language": "python", "name": "python3" }, "language_info": { @@ -544,13 +788,8 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.9" - }, - "colab": { - "provenance": [], - "gpuType": "T4" - }, - "accelerator": "GPU" + } }, "nbformat": 4, "nbformat_minor": 5 -} \ No newline at end of file +} diff --git a/tests/lifecycle/test_mlflow.py b/tests/lifecycle/test_mlflow.py index 70eeadc..4a19785 100644 --- a/tests/lifecycle/test_mlflow.py +++ b/tests/lifecycle/test_mlflow.py @@ -1,68 +1,68 @@ -# import os -# import re +# # import os +# # import re -# import pandas as pd -# import pytest -import mlflow +# # import pandas as pd +# # import pytest +# import mlflow -from dfake.params import * -from tests.test_base import TestBase +# from dfake.params import * +# from tests.test_base import TestBase -class TestMlflow(TestBase): - # def test_model_target_is_mlflow(self): - # """ - # verify that the mlflow parameters are correctly set - # """ - # model_target = MODEL_TARGET +# class TestMlflow(TestBase): +# # def test_model_target_is_mlflow(self): +# # """ +# # verify that the mlflow parameters are correctly set +# # """ +# # model_target = MODEL_TARGET - # assert model_target == 'mlflow', 'Check the value of MODEL_TARGET' +# # assert model_target == 'mlflow', 'Check the value of MODEL_TARGET' - def test_mlflow_experiment_is_not_null(self): - """ - verify that the mlflow parameters are correctly set - """ - experiment = MLFLOW_EXPERIMENT +# def test_mlflow_experiment_is_not_null(self): +# """ +# verify that the mlflow parameters are correctly set +# """ +# experiment = MLFLOW_EXPERIMENT - assert experiment is not None, 'Please fill in the MLFLOW_EXPERIMENT variable' +# assert experiment is not None, 'Please fill in the MLFLOW_EXPERIMENT variable' - def test_mlflow_model_name_is_not_null(self): - """ - verify that the mlflow parameters are correctly set - """ - model_name = MLFLOW_MODEL_NAME +# def test_mlflow_model_name_is_not_null(self): +# """ +# verify that the mlflow parameters are correctly set +# """ +# model_name = MLFLOW_MODEL_NAME - assert model_name is not None, 'Please fill in the MLFLOW_MODEL_NAME variable' +# assert model_name is not None, 'Please fill in the MLFLOW_MODEL_NAME variable' - def test_mlflow_experiment_exists(self): - """ - verify that the mlflow experiment exists - """ - mlflow.set_tracking_uri(MLFLOW_TRACKING_URI) - mlflow_client = mlflow.tracking.MlflowClient() +# def test_mlflow_experiment_exists(self): +# """ +# verify that the mlflow experiment exists +# """ +# mlflow.set_tracking_uri(MLFLOW_TRACKING_URI) +# mlflow_client = mlflow.tracking.MlflowClient() - experiment_id = mlflow_client.get_experiment_by_name(MLFLOW_EXPERIMENT).experiment_id +# experiment_id = mlflow_client.get_experiment_by_name(MLFLOW_EXPERIMENT).experiment_id - assert experiment_id is not None, f'Please create the experiment {MLFLOW_EXPERIMENT} in mlflow by doing your first run' +# assert experiment_id is not None, f'Please create the experiment {MLFLOW_EXPERIMENT} in mlflow by doing your first run' - def test_mlflow_model_exists(self): - """ - verify that the mlflow model exists - """ - mlflow.set_tracking_uri(MLFLOW_TRACKING_URI) - mlflow_client = mlflow.tracking.MlflowClient() +# def test_mlflow_model_exists(self): +# """ +# verify that the mlflow model exists +# """ +# mlflow.set_tracking_uri(MLFLOW_TRACKING_URI) +# mlflow_client = mlflow.tracking.MlflowClient() - model = mlflow_client.get_registered_model(MLFLOW_MODEL_NAME) +# model = mlflow_client.get_registered_model(MLFLOW_MODEL_NAME) - assert model is not None, f'Please create the model {MLFLOW_MODEL_NAME} in mlflow' +# assert model is not None, f'Please create the model {MLFLOW_MODEL_NAME} in mlflow' - def test_mlflow_model_in_production(self): - """ - Verify that a version of the model is in production - """ - mlflow.set_registry_uri(MLFLOW_TRACKING_URI) - mlflow_client = mlflow.tracking.MlflowClient() +# def test_mlflow_model_in_production(self): +# """ +# Verify that a version of the model is in production +# """ +# mlflow.set_registry_uri(MLFLOW_TRACKING_URI) +# mlflow_client = mlflow.tracking.MlflowClient() - production_model = mlflow_client.get_latest_versions(MLFLOW_MODEL_NAME, stages=['Production']) +# production_model = mlflow_client.get_latest_versions(MLFLOW_MODEL_NAME, stages=['Production']) - assert len(production_model) > 0, f'Please create a version of the model {MLFLOW_MODEL_NAME} in production' +# assert len(production_model) > 0, f'Please create a version of the model {MLFLOW_MODEL_NAME} in production'