commit 20f0de1bb557d065931e6932b1fa570f539598f8
parent 2f2213df6eecf65c6aef1b23e114360e2970f5c6
Author: Andrew <andrewlaack1@gmail.com>
Date: Mon, 1 Jul 2024 13:21:16 -0500
92% on mnist fashion with cnn.
Diffstat:
2 files changed, 368 insertions(+), 0 deletions(-)
diff --git a/cnnPlayground/CNNWithKeras.ipynb b/cnnPlayground/CNNWithKeras.ipynb
@@ -0,0 +1,132 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from sklearn.datasets import load_sample_images\n",
+ "import tensorflow as tf\n",
+ "import keras\n",
+ "\n",
+ "images = load_sample_images()['images']\n",
+ "images = tf.keras.layers.CenterCrop(height=70, width=120)(images)\n",
+ "images = keras.layers.Rescaling(scale=1/255)(images) "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "TensorShape([2, 70, 120, 3])"
+ ]
+ },
+ "execution_count": 31,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "images.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "TensorShape([2, 70, 120, 32])"
+ ]
+ },
+ "execution_count": 32,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "conv = keras.layers.Conv2D(filters=32, kernel_size=7, padding='same')\n",
+ "fmaps = conv(images)\n",
+ "fmaps.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(7, 7, 3, 32)"
+ ]
+ },
+ "execution_count": 33,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "kernels, biases = conv.get_weights()\n",
+ "kernels.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(32,)"
+ ]
+ },
+ "execution_count": 34,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "biases.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "pool = keras.layers.MaxPool2D(pool_size=2)"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": ".venv",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.11.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/fashionMNIST/CNNFashionMNIST.ipynb b/fashionMNIST/CNNFashionMNIST.ipynb
@@ -0,0 +1,236 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "91.52% Accuracy"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 120,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import tensorflow as tf\n",
+ "\n",
+ "fashion_mnist = tf.keras.datasets.fashion_mnist.load_data()\n",
+ "\n",
+ "# Split train, validation, test\n",
+ "(X_train_full, y_train_full) , (X_test, y_test) = fashion_mnist\n",
+ "X_train, y_train = X_train_full[:-5000], y_train_full[:-5000]\n",
+ "X_valid, y_valid = X_train_full[-5000:], y_train_full[-5000:]\n",
+ "\n",
+ "y_train = tf.one_hot(y_train, depth=10)\n",
+ "y_valid = tf.one_hot(y_valid, depth=10)\n",
+ "y_test = tf.one_hot(y_test, depth=10)\n",
+ "X_train, X_valid, X_test = X_train / 255., X_valid / 255., X_test / 255."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 101,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(55000, 28, 28)"
+ ]
+ },
+ "execution_count": 101,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "X_train.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 102,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import keras \n",
+ "\n",
+ "model = keras.Sequential(layers=[\n",
+ " keras.layers.Input(shape=[28,28,1]),\n",
+ " keras.layers.Conv2D(activation='relu', kernel_size=7, filters=32, padding='same'),\n",
+ " keras.layers.MaxPool2D(),\n",
+ " keras.layers.BatchNormalization(),\n",
+ " keras.layers.Conv2D(activation='relu', kernel_size=3, filters=64, padding='same'),\n",
+ " keras.layers.Conv2D(activation='relu', kernel_size=3, filters=64, padding='same'),\n",
+ " keras.layers.MaxPool2D(),\n",
+ " keras.layers.BatchNormalization(),\n",
+ " keras.layers.Conv2D(activation='relu', kernel_size=3, filters=128, padding='same'),\n",
+ " keras.layers.Conv2D(activation='relu', kernel_size=3, filters=128, padding='same'),\n",
+ " keras.layers.BatchNormalization(),\n",
+ " keras.layers.Flatten(),\n",
+ " keras.layers.Dense(256, activation='relu'),\n",
+ " keras.layers.Dropout(.2),\n",
+ " keras.layers.Dense(128, activation='relu'),\n",
+ " keras.layers.Dropout(.2),\n",
+ " keras.layers.Dense(10 , activation='softmax')\n",
+ "])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 103,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "model.compile(loss=keras.losses.categorical_crossentropy, optimizer='adam', metrics=['accuracy'])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 104,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Epoch 1/20\n",
+ "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m64s\u001b[0m 36ms/step - accuracy: 0.7764 - loss: 0.6517 - val_accuracy: 0.8630 - val_loss: 0.3664\n",
+ "Epoch 2/20\n",
+ "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m61s\u001b[0m 36ms/step - accuracy: 0.8840 - loss: 0.3228 - val_accuracy: 0.8920 - val_loss: 0.2956\n",
+ "Epoch 3/20\n",
+ "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m61s\u001b[0m 36ms/step - accuracy: 0.8992 - loss: 0.2802 - val_accuracy: 0.9050 - val_loss: 0.2503\n",
+ "Epoch 4/20\n",
+ "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m61s\u001b[0m 36ms/step - accuracy: 0.9110 - loss: 0.2451 - val_accuracy: 0.9032 - val_loss: 0.2733\n",
+ "Epoch 5/20\n",
+ "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m82s\u001b[0m 36ms/step - accuracy: 0.9147 - loss: 0.2305 - val_accuracy: 0.8996 - val_loss: 0.2790\n",
+ "Epoch 6/20\n",
+ "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m61s\u001b[0m 36ms/step - accuracy: 0.9254 - loss: 0.2052 - val_accuracy: 0.9090 - val_loss: 0.2362\n",
+ "Epoch 7/20\n",
+ "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m82s\u001b[0m 35ms/step - accuracy: 0.9308 - loss: 0.1841 - val_accuracy: 0.9138 - val_loss: 0.2550\n",
+ "Epoch 8/20\n",
+ "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m61s\u001b[0m 36ms/step - accuracy: 0.9382 - loss: 0.1669 - val_accuracy: 0.9144 - val_loss: 0.2555\n",
+ "Epoch 9/20\n",
+ "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m61s\u001b[0m 36ms/step - accuracy: 0.9438 - loss: 0.1507 - val_accuracy: 0.9154 - val_loss: 0.2593\n",
+ "Epoch 10/20\n",
+ "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m61s\u001b[0m 36ms/step - accuracy: 0.9520 - loss: 0.1354 - val_accuracy: 0.9178 - val_loss: 0.2691\n",
+ "Epoch 11/20\n",
+ "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m61s\u001b[0m 36ms/step - accuracy: 0.9519 - loss: 0.1275 - val_accuracy: 0.9186 - val_loss: 0.2308\n",
+ "Epoch 12/20\n",
+ "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m62s\u001b[0m 36ms/step - accuracy: 0.9592 - loss: 0.1089 - val_accuracy: 0.9130 - val_loss: 0.2994\n",
+ "Epoch 13/20\n",
+ "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m62s\u001b[0m 36ms/step - accuracy: 0.9592 - loss: 0.1121 - val_accuracy: 0.9234 - val_loss: 0.2817\n",
+ "Epoch 14/20\n",
+ "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m82s\u001b[0m 36ms/step - accuracy: 0.9650 - loss: 0.0970 - val_accuracy: 0.9172 - val_loss: 0.2725\n",
+ "Epoch 15/20\n",
+ "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m62s\u001b[0m 36ms/step - accuracy: 0.9694 - loss: 0.0843 - val_accuracy: 0.9184 - val_loss: 0.2797\n",
+ "Epoch 16/20\n",
+ "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m62s\u001b[0m 36ms/step - accuracy: 0.9696 - loss: 0.0867 - val_accuracy: 0.9208 - val_loss: 0.2503\n",
+ "Epoch 17/20\n",
+ "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m62s\u001b[0m 36ms/step - accuracy: 0.9728 - loss: 0.0778 - val_accuracy: 0.9230 - val_loss: 0.3293\n",
+ "Epoch 18/20\n",
+ "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m62s\u001b[0m 36ms/step - accuracy: 0.9738 - loss: 0.0708 - val_accuracy: 0.9176 - val_loss: 0.3096\n",
+ "Epoch 19/20\n",
+ "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m62s\u001b[0m 36ms/step - accuracy: 0.9741 - loss: 0.0707 - val_accuracy: 0.9156 - val_loss: 0.3369\n",
+ "Epoch 20/20\n",
+ "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m62s\u001b[0m 36ms/step - accuracy: 0.9796 - loss: 0.0589 - val_accuracy: 0.9224 - val_loss: 0.3426\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "<keras.src.callbacks.history.History at 0x7f0d4c974dd0>"
+ ]
+ },
+ "execution_count": 104,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model.fit(X_train,y_train, validation_data=[X_valid, y_valid], epochs=20)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 117,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 8ms/step\n"
+ ]
+ }
+ ],
+ "source": [
+ "from sklearn.metrics import accuracy_score\n",
+ "import numpy as np \n",
+ "\n",
+ "preds = model.predict(X_test)\n",
+ "preds = np.argmax(preds, axis=1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 121,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "y_test = np.array(y_test).argmax(axis=1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 123,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.9152"
+ ]
+ },
+ "execution_count": 123,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "accuracy_score(y_pred=preds,y_true=y_test)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 124,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "model.save('../models/CNNMnistFashion.keras')"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": ".venv",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.11.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}