machinelearning

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

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:
AcnnPlayground/CNNWithKeras.ipynb | 132+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
AfashionMNIST/CNNFashionMNIST.ipynb | 236+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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 +}