111 lines
4.4 KiB
Plaintext
111 lines
4.4 KiB
Plaintext
{
|
|
"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
|
|
}
|