{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "plaintext" } }, "outputs": [], "source": [ "import csv\n", "import os\n", "import re\n", "import time\n", "import math, re, os\n", "import tensorflow as tf\n", "import numpy as np\n", "from matplotlib import pyplot as plt\n", "from kaggle_datasets import KaggleDatasets\n", "from sklearn.metrics import f1_score, precision_score, recall_score, confusion_matrix\n", "\n", "def create_model(image_size):\n", " model = tf.keras.Sequential()\n", " \n", " if image_size <= 10:\n", " model.add(tf.keras.layers.Conv2D(32, (2, 2), activation='relu', input_shape=(image_size, image_size, 3)))\n", " model.add(tf.keras.layers.MaxPooling2D((2, 2), padding='same')) \n", " else:\n", " model.add(tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(image_size, image_size, 3)))\n", " model.add(tf.keras.layers.MaxPooling2D((2, 2)))\n", "\n", " if image_size > 10:\n", " model.add(tf.keras.layers.Conv2D(64, (3, 3), activation='relu'))\n", " model.add(tf.keras.layers.MaxPooling2D((2, 2)))\n", " \n", " if image_size > 20:\n", " model.add(tf.keras.layers.Conv2D(128, (3, 3), activation='relu'))\n", " model.add(tf.keras.layers.MaxPooling2D((2, 2)))\n", "\n", " model.add(tf.keras.layers.GlobalAveragePooling2D())\n", " \n", " model.add(tf.keras.layers.Dense(128, activation='relu'))\n", " model.add(tf.keras.layers.Dense(7, activation='softmax')) \n", "\n", " return model\n", "\n", "if __name__ == '__main__':\n", " dataset_path = os.path.abspath(\"/kaggle/input\")\n", " evaluation_csv = os.path.abspath(\"/kaggle/working/evaluation_ready.csv\")\n", "\n", " with open(evaluation_csv, \"w\") as csv_file:\n", " csv_writer = csv.writer(csv_file, delimiter=\";\")\n", " csv_writer.writerow([\"size\",\"errors\", \"duration_100_tests\"])\n", "\n", " datasets = os.listdir(dataset_path)\n", " for dataset_name in datasets:\n", " folders = os.listdir(os.path.abspath(os.path.join(dataset_path, dataset_name)))\n", " single_dataset_path = os.path.abspath(os.path.join(dataset_path, dataset_name, folders[0]))\n", " \n", " image_size = int(re.search(r'(\\d+)$', dataset_name)[0])\n", "\n", " test_amount = 100\n", " errors = []\n", "\n", " start = time.perf_counter()\n", " for test_number in range(test_amount):\n", " print(f\"Image: {image_size} starting test {test_number}\\n\\n\")\n", " \n", " ds = tf.data.Dataset.load(single_dataset_path)\n", " \n", " ds = ds.shuffle(buffer_size=43349)\n", " \n", " # Split into training and testing\n", " train_ds, test_ds = tf.keras.utils.split_dataset(ds, left_size=0.9)\n", " \n", " # Batch and prefetch\n", " train_data = train_ds.batch(5).prefetch(tf.data.AUTOTUNE)\n", " test_data = test_ds.batch(5).prefetch(tf.data.AUTOTUNE)\n", " \n", " model = create_model(image_size)\n", "\n", " tf.keras.utils.plot_model(model, to_file='/kaggle/working/model.png', show_shapes=True)\n", " \n", " model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),\n", " loss=tf.keras.losses.SparseCategoricalCrossentropy(),\n", " metrics=['accuracy'])\n", " \n", " \n", " model.fit(train_data, epochs=7)\n", " \n", " test_loss, test_acc = model.evaluate(test_data, verbose=2)\n", " errors.append(1 - test_acc)\n", "\n", " end = time.perf_counter()\n", " with open(evaluation_csv, \"a\") as csv_file:\n", " csv_writer = csv.writer(csv_file, delimiter=\";\")\n", " csv_writer.writerow([image_size, errors, round(end-start, 4)])" ] } ], "metadata": { "language_info": { "name": "python" } }, "nbformat": 4, "nbformat_minor": 2 }