Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place. Commercial Alternative to JupyterHub.
Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place. Commercial Alternative to JupyterHub.
| Download
"Guiding Future STEM Leaders through Innovative Research Training" ~ thinkingbeyond.education
Project: stephanie's main branch
Path: ThinkingBeyond Activities / BeyondAI-2024-Mentee-Projects / nayra-priyam / testing_gradually.ipynb~
Views: 1144Image: ubuntu2204
{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "provenance": [] }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" } }, "cells": [ { "cell_type": "markdown", "source": [ "# Optimizing MLPs for MNIST\n", "#### **by:** *Nayra Saadawy & Priyam Raul*\n", "#### **mentor:** *Prof. Devendra Singh*\n", "\n" ], "metadata": { "id": "W098KNbU1xba" } }, { "cell_type": "code", "source": [ "!pip freeze > requirements.txt #gives a list of all requirements and packages\n" ], "metadata": { "id": "SlR0xPRWUz1e" }, "execution_count": 7, "outputs": [] }, { "cell_type": "code", "source": [ "!pip freeze | grep -E 'torch|torchvision|matplotlib' > requirements.txt # gives a filtered version of the requirements" ], "metadata": { "id": "EOL7shjLCS2d" }, "execution_count": 4, "outputs": [] }, { "cell_type": "code", "source": [ "!cat requirements.txt\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "g1L59nGHU6ny", "outputId": "8c8dae26-b16f-46c6-eae1-5c13ec21f334" }, "execution_count": 8, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "absl-py==1.4.0\n", "accelerate==1.2.1\n", "aiohappyeyeballs==2.4.4\n", "aiohttp==3.11.10\n", "aiosignal==1.3.2\n", "alabaster==1.0.0\n", "albucore==0.0.19\n", "albumentations==1.4.20\n", "altair==5.5.0\n", "annotated-types==0.7.0\n", "anyio==3.7.1\n", "argon2-cffi==23.1.0\n", "argon2-cffi-bindings==21.2.0\n", "array_record==0.5.1\n", "arviz==0.20.0\n", "astropy==6.1.7\n", "astropy-iers-data==0.2024.12.16.0.35.48\n", "astunparse==1.6.3\n", "async-timeout==4.0.3\n", "atpublic==4.1.0\n", "attrs==24.3.0\n", "audioread==3.0.1\n", "autograd==1.7.0\n", "babel==2.16.0\n", "backcall==0.2.0\n", "beautifulsoup4==4.12.3\n", "bigframes==1.29.0\n", "bigquery-magics==0.4.0\n", "bleach==6.2.0\n", "blinker==1.9.0\n", "blis==0.7.11\n", "blosc2==2.7.1\n", "bokeh==3.6.2\n", "Bottleneck==1.4.2\n", "bqplot==0.12.43\n", "branca==0.8.1\n", "CacheControl==0.14.1\n", "cachetools==5.5.0\n", "catalogue==2.0.10\n", "certifi==2024.12.14\n", "cffi==1.17.1\n", "chardet==5.2.0\n", "charset-normalizer==3.4.0\n", "chex==0.1.88\n", "clarabel==0.9.0\n", "click==8.1.7\n", "cloudpathlib==0.20.0\n", "cloudpickle==3.1.0\n", "cmake==3.31.2\n", "cmdstanpy==1.2.5\n", "colorcet==3.1.0\n", "colorlover==0.3.0\n", "colour==0.1.5\n", "community==1.0.0b1\n", "confection==0.1.5\n", "cons==0.4.6\n", "contourpy==1.3.1\n", "cryptography==43.0.3\n", "cuda-python==12.2.1\n", "cudf-cu12 @ https://pypi.nvidia.com/cudf-cu12/cudf_cu12-24.10.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl\n", "cufflinks==0.17.3\n", "cupy-cuda12x==12.2.0\n", "cvxopt==1.3.2\n", "cvxpy==1.6.0\n", "cycler==0.12.1\n", "cymem==2.0.10\n", "Cython==3.0.11\n", "dask==2024.10.0\n", "datascience==0.17.6\n", "db-dtypes==1.3.1\n", "dbus-python==1.2.18\n", "debugpy==1.8.0\n", "decorator==4.4.2\n", "defusedxml==0.7.1\n", "Deprecated==1.2.15\n", "diffusers==0.31.0\n", "distro==1.9.0\n", "dlib==19.24.2\n", "dm-tree==0.1.8\n", "docker-pycreds==0.4.0\n", "docstring_parser==0.16\n", "docutils==0.21.2\n", "dopamine_rl==4.1.0\n", "duckdb==1.1.3\n", "earthengine-api==1.4.3\n", "easydict==1.13\n", "editdistance==0.8.1\n", "eerepr==0.0.4\n", "einops==0.8.0\n", "en-core-web-sm @ https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-3.7.1/en_core_web_sm-3.7.1-py3-none-any.whl#sha256=86cc141f63942d4b2c5fcee06630fd6f904788d2f0ab005cce45aadb8fb73889\n", "entrypoints==0.4\n", "et_xmlfile==2.0.0\n", "etils==1.11.0\n", "etuples==0.3.9\n", "eval_type_backport==0.2.0\n", "exceptiongroup==1.2.2\n", "fastai==2.7.18\n", "fastcore==1.7.27\n", "fastdownload==0.0.7\n", "fastjsonschema==2.21.1\n", "fastprogress==1.0.3\n", "fastrlock==0.8.3\n", "filelock==3.16.1\n", "firebase-admin==6.6.0\n", "Flask==3.1.0\n", "flatbuffers==24.3.25\n", "flax==0.8.5\n", "folium==0.19.2\n", "fonttools==4.55.3\n", "frozendict==2.4.6\n", "frozenlist==1.5.0\n", "fsspec==2024.10.0\n", "future==1.0.0\n", "gast==0.6.0\n", "gcsfs==2024.10.0\n", "GDAL==3.6.4\n", "gdown==5.2.0\n", "geemap==0.35.1\n", "gensim==4.3.3\n", "geocoder==1.38.1\n", "geographiclib==2.0\n", "geopandas==1.0.1\n", "geopy==2.4.1\n", "gin-config==0.5.0\n", "gitdb==4.0.11\n", "GitPython==3.1.43\n", "glob2==0.7\n", "google==2.0.3\n", "google-ai-generativelanguage==0.6.10\n", "google-api-core==2.19.2\n", "google-api-python-client==2.155.0\n", "google-auth==2.27.0\n", "google-auth-httplib2==0.2.0\n", "google-auth-oauthlib==1.2.1\n", "google-cloud-aiplatform==1.74.0\n", "google-cloud-bigquery==3.25.0\n", "google-cloud-bigquery-connection==1.17.0\n", "google-cloud-bigquery-storage==2.27.0\n", "google-cloud-bigtable==2.27.0\n", "google-cloud-core==2.4.1\n", "google-cloud-datastore==2.20.2\n", "google-cloud-firestore==2.19.0\n", "google-cloud-functions==1.19.0\n", "google-cloud-iam==2.17.0\n", "google-cloud-language==2.16.0\n", "google-cloud-pubsub==2.27.1\n", "google-cloud-resource-manager==1.14.0\n", "google-cloud-storage==2.19.0\n", "google-cloud-translate==3.19.0\n", "google-colab @ file:///colabtools/dist/google_colab-1.0.0.tar.gz\n", "google-crc32c==1.6.0\n", "google-genai==0.3.0\n", "google-generativeai==0.8.3\n", "google-pasta==0.2.0\n", "google-resumable-media==2.7.2\n", "googleapis-common-protos==1.66.0\n", "googledrivedownloader==0.4\n", "graphviz==0.20.3\n", "greenlet==3.1.1\n", "grpc-google-iam-v1==0.13.1\n", "grpcio==1.68.1\n", "grpcio-status==1.62.3\n", "gspread==6.0.2\n", "gspread-dataframe==3.3.1\n", "gym==0.25.2\n", "gym-notices==0.0.8\n", "h11==0.14.0\n", "h5netcdf==1.4.1\n", "h5py==3.12.1\n", "holidays==0.63\n", "holoviews==1.20.0\n", "html5lib==1.1\n", "httpcore==1.0.7\n", "httpimport==1.4.0\n", "httplib2==0.22.0\n", "httpx==0.28.1\n", "huggingface-hub==0.27.0\n", "humanize==4.11.0\n", "hyperopt==0.2.7\n", "ibis-framework==9.2.0\n", "idna==3.10\n", "imageio==2.36.1\n", "imageio-ffmpeg==0.5.1\n", "imagesize==1.4.1\n", "imbalanced-learn==0.12.4\n", "imgaug==0.4.0\n", "immutabledict==4.2.1\n", "importlib_metadata==8.5.0\n", "importlib_resources==6.4.5\n", "imutils==0.5.4\n", "inflect==7.4.0\n", "iniconfig==2.0.0\n", "intel-cmplr-lib-ur==2025.0.4\n", "intel-openmp==2025.0.4\n", "ipyevents==2.0.2\n", "ipyfilechooser==0.6.0\n", "ipykernel==5.5.6\n", "ipyleaflet==0.19.2\n", "ipyparallel==8.8.0\n", "ipython==7.34.0\n", "ipython-genutils==0.2.0\n", "ipython-sql==0.5.0\n", "ipytree==0.2.2\n", "ipywidgets==7.7.1\n", "itsdangerous==2.2.0\n", "jax==0.4.33\n", "jax-cuda12-pjrt==0.4.33\n", "jax-cuda12-plugin==0.4.33\n", "jaxlib==0.4.33\n", "jeepney==0.7.1\n", "jellyfish==1.1.0\n", "jieba==0.42.1\n", "Jinja2==3.1.4\n", "jiter==0.8.2\n", "joblib==1.4.2\n", "jsonpatch==1.33\n", "jsonpickle==4.0.1\n", "jsonpointer==3.0.0\n", "jsonschema==4.23.0\n", "jsonschema-specifications==2024.10.1\n", "jupyter-client==6.1.12\n", "jupyter-console==6.1.0\n", "jupyter-leaflet==0.19.2\n", "jupyter-server==1.24.0\n", "jupyter_core==5.7.2\n", "jupyterlab_pygments==0.3.0\n", "jupyterlab_widgets==3.0.13\n", "kaggle==1.6.17\n", "kagglehub==0.3.5\n", "keras==3.5.0\n", "keyring==23.5.0\n", "kiwisolver==1.4.7\n", "langchain==0.3.12\n", "langchain-core==0.3.25\n", "langchain-text-splitters==0.3.3\n", "langcodes==3.5.0\n", "langsmith==0.2.3\n", "language_data==1.3.0\n", "launchpadlib==1.10.16\n", "lazr.restfulclient==0.14.4\n", "lazr.uri==1.0.6\n", "lazy_loader==0.4\n", "libclang==18.1.1\n", "libcudf-cu12 @ https://pypi.nvidia.com/libcudf-cu12/libcudf_cu12-24.10.1-py3-none-manylinux_2_28_x86_64.whl\n", "librosa==0.10.2.post1\n", "lightgbm==4.5.0\n", "linkify-it-py==2.0.3\n", "llvmlite==0.43.0\n", "locket==1.0.0\n", "logical-unification==0.4.6\n", "lxml==5.3.0\n", "marisa-trie==1.2.1\n", "Markdown==3.7\n", "markdown-it-py==3.0.0\n", "MarkupSafe==3.0.2\n", "matplotlib==3.8.0\n", "matplotlib-inline==0.1.7\n", "matplotlib-venn==1.1.1\n", "mdit-py-plugins==0.4.2\n", "mdurl==0.1.2\n", "miniKanren==1.0.3\n", "missingno==0.5.2\n", "mistune==3.0.2\n", "mizani==0.13.1\n", "mkl==2025.0.1\n", "ml-dtypes==0.4.1\n", "mlxtend==0.23.3\n", "more-itertools==10.5.0\n", "moviepy==1.0.3\n", "mpmath==1.3.0\n", "msgpack==1.1.0\n", "multidict==6.1.0\n", "multipledispatch==1.0.0\n", "multitasking==0.0.11\n", "murmurhash==1.0.11\n", "music21==9.3.0\n", "namex==0.0.8\n", "narwhals==1.18.4\n", "natsort==8.4.0\n", "nbclassic==1.1.0\n", "nbclient==0.10.1\n", "nbconvert==7.16.4\n", "nbformat==5.10.4\n", "ndindex==1.9.2\n", "nest-asyncio==1.6.0\n", "networkx==3.4.2\n", "nibabel==5.3.2\n", "nltk==3.9.1\n", "notebook==6.5.5\n", "notebook_shim==0.2.4\n", "numba==0.60.0\n", "numexpr==2.10.2\n", "numpy==1.26.4\n", "nvidia-cublas-cu12==12.6.4.1\n", "nvidia-cuda-cupti-cu12==12.6.80\n", "nvidia-cuda-nvcc-cu12==12.6.85\n", "nvidia-cuda-runtime-cu12==12.6.77\n", "nvidia-cudnn-cu12==9.6.0.74\n", "nvidia-cufft-cu12==11.3.0.4\n", "nvidia-curand-cu12==10.3.7.77\n", "nvidia-cusolver-cu12==11.7.1.2\n", "nvidia-cusparse-cu12==12.5.4.2\n", "nvidia-nccl-cu12==2.23.4\n", "nvidia-nvjitlink-cu12==12.6.85\n", "nvtx==0.2.10\n", "nx-cugraph-cu12 @ https://pypi.nvidia.com/nx-cugraph-cu12/nx_cugraph_cu12-24.10.0-py3-none-any.whl\n", "oauth2client==4.1.3\n", "oauthlib==3.2.2\n", "openai==1.57.4\n", "opencv-contrib-python==4.10.0.84\n", "opencv-python==4.10.0.84\n", "opencv-python-headless==4.10.0.84\n", "openpyxl==3.1.5\n", "opentelemetry-api==1.29.0\n", "opentelemetry-sdk==1.29.0\n", "opentelemetry-semantic-conventions==0.50b0\n", "opt_einsum==3.4.0\n", "optax==0.2.4\n", "optree==0.13.1\n", "orbax-checkpoint==0.6.4\n", "orjson==3.10.12\n", "osqp==0.6.7.post3\n", "packaging==24.2\n", "pandas==2.2.2\n", "pandas-datareader==0.10.0\n", "pandas-gbq==0.25.0\n", "pandas-stubs==2.2.2.240909\n", "pandocfilters==1.5.1\n", "panel==1.5.4\n", "param==2.2.0\n", "parso==0.8.4\n", "parsy==2.1\n", "partd==1.4.2\n", "pathlib==1.0.1\n", "patsy==1.0.1\n", "peewee==3.17.8\n", "peft==0.14.0\n", "pexpect==4.9.0\n", "pickleshare==0.7.5\n", "pillow==11.0.0\n", "platformdirs==4.3.6\n", "plotly==5.24.1\n", "plotnine==0.14.4\n", "pluggy==1.5.0\n", "ply==3.11\n", "polars==1.9.0\n", "pooch==1.8.2\n", "portpicker==1.5.2\n", "preshed==3.0.9\n", "prettytable==3.12.0\n", "proglog==0.1.10\n", "progressbar2==4.5.0\n", "prometheus_client==0.21.1\n", "promise==2.3\n", "prompt_toolkit==3.0.48\n", "propcache==0.2.1\n", "prophet==1.1.6\n", "proto-plus==1.25.0\n", "protobuf==4.25.5\n", "psutil==5.9.5\n", "psycopg2==2.9.10\n", "ptyprocess==0.7.0\n", "py-cpuinfo==9.0.0\n", "py4j==0.10.9.7\n", "pyarrow==17.0.0\n", "pyasn1==0.6.1\n", "pyasn1_modules==0.4.1\n", "pycocotools==2.0.8\n", "pycparser==2.22\n", "pydantic==2.10.3\n", "pydantic_core==2.27.1\n", "pydata-google-auth==1.9.0\n", "pydot==3.0.3\n", "pydotplus==2.0.2\n", "PyDrive==1.3.1\n", "PyDrive2==1.21.3\n", "pyerfa==2.0.1.5\n", "pygame==2.6.1\n", "pygit2==1.16.0\n", "Pygments==2.18.0\n", "PyGObject==3.42.1\n", "PyJWT==2.10.1\n", "pylibcudf-cu12 @ https://pypi.nvidia.com/pylibcudf-cu12/pylibcudf_cu12-24.10.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl\n", "pylibcugraph-cu12==24.10.0\n", "pylibraft-cu12==24.10.0\n", "pymc==5.19.1\n", "pymystem3==0.2.0\n", "pynvjitlink-cu12==0.4.0\n", "pyogrio==0.10.0\n", "Pyomo==6.8.2\n", "PyOpenGL==3.1.7\n", "pyOpenSSL==24.2.1\n", "pyparsing==3.2.0\n", "pyperclip==1.9.0\n", "pyproj==3.7.0\n", "pyshp==2.3.1\n", "PySocks==1.7.1\n", "pyspark==3.5.3\n", "pytensor==2.26.4\n", "pytest==8.3.4\n", "python-apt==0.0.0\n", "python-box==7.3.0\n", "python-dateutil==2.8.2\n", "python-louvain==0.16\n", "python-slugify==8.0.4\n", "python-utils==3.9.1\n", "pytz==2024.2\n", "pyviz_comms==3.0.3\n", "PyYAML==6.0.2\n", "pyzmq==24.0.1\n", "qdldl==0.1.7.post4\n", "ratelim==0.1.6\n", "referencing==0.35.1\n", "regex==2024.11.6\n", "requests==2.32.3\n", "requests-oauthlib==1.3.1\n", "requests-toolbelt==1.0.0\n", "requirements-parser==0.9.0\n", "rich==13.9.4\n", "rmm-cu12==24.10.0\n", "rpds-py==0.22.3\n", "rpy2==3.4.2\n", "rsa==4.9\n", "safetensors==0.4.5\n", "scikit-image==0.25.0\n", "scikit-learn==1.6.0\n", "scipy==1.13.1\n", "scooby==0.10.0\n", "scs==3.2.7\n", "seaborn==0.13.2\n", "SecretStorage==3.3.1\n", "Send2Trash==1.8.3\n", "sentence-transformers==3.3.1\n", "sentencepiece==0.2.0\n", "sentry-sdk==2.19.2\n", "setproctitle==1.3.4\n", "shap==0.46.0\n", "shapely==2.0.6\n", "shellingham==1.5.4\n", "simple-parsing==0.1.6\n", "six==1.17.0\n", "sklearn-pandas==2.2.0\n", "slicer==0.0.8\n", "smart-open==7.1.0\n", "smmap==5.0.1\n", "sniffio==1.3.1\n", "snowballstemmer==2.2.0\n", "soundfile==0.12.1\n", "soupsieve==2.6\n", "soxr==0.5.0.post1\n", "spacy==3.7.5\n", "spacy-legacy==3.0.12\n", "spacy-loggers==1.0.5\n", "Sphinx==8.1.3\n", "sphinxcontrib-applehelp==2.0.0\n", "sphinxcontrib-devhelp==2.0.0\n", "sphinxcontrib-htmlhelp==2.1.0\n", "sphinxcontrib-jsmath==1.0.1\n", "sphinxcontrib-qthelp==2.0.0\n", "sphinxcontrib-serializinghtml==2.0.0\n", "SQLAlchemy==2.0.36\n", "sqlglot==25.1.0\n", "sqlparse==0.5.3\n", "srsly==2.5.0\n", "stanio==0.5.1\n", "statsmodels==0.14.4\n", "StrEnum==0.4.15\n", "stringzilla==3.11.1\n", "sympy==1.13.1\n", "tables==3.10.1\n", "tabulate==0.9.0\n", "tbb==2022.0.0\n", "tcmlib==1.2.0\n", "tenacity==9.0.0\n", "tensorboard==2.17.1\n", "tensorboard-data-server==0.7.2\n", "tensorflow==2.17.1\n", "tensorflow-datasets==4.9.7\n", "tensorflow-hub==0.16.1\n", "tensorflow-io-gcs-filesystem==0.37.1\n", "tensorflow-metadata==1.13.1\n", "tensorflow-probability==0.24.0\n", "tensorstore==0.1.71\n", "termcolor==2.5.0\n", "terminado==0.18.1\n", "text-unidecode==1.3\n", "textblob==0.17.1\n", "tf-slim==1.1.0\n", "tf_keras==2.17.0\n", "thinc==8.2.5\n", "threadpoolctl==3.5.0\n", "tifffile==2024.12.12\n", "timm==1.0.12\n", "tinycss2==1.4.0\n", "tokenizers==0.21.0\n", "toml==0.10.2\n", "tomli==2.2.1\n", "toolz==0.12.1\n", "torch @ https://download.pytorch.org/whl/cu121_full/torch-2.5.1%2Bcu121-cp310-cp310-linux_x86_64.whl\n", "torchaudio @ https://download.pytorch.org/whl/cu121/torchaudio-2.5.1%2Bcu121-cp310-cp310-linux_x86_64.whl\n", "torchsummary==1.5.1\n", "torchvision @ https://download.pytorch.org/whl/cu121/torchvision-0.20.1%2Bcu121-cp310-cp310-linux_x86_64.whl\n", "tornado==6.3.3\n", "tqdm==4.67.1\n", "traitlets==5.7.1\n", "traittypes==0.2.1\n", "transformers==4.47.1\n", "tweepy==4.14.0\n", "typeguard==4.4.1\n", "typer==0.15.1\n", "types-pytz==2024.2.0.20241003\n", "types-setuptools==75.6.0.20241126\n", "typing_extensions==4.12.2\n", "tzdata==2024.2\n", "tzlocal==5.2\n", "uc-micro-py==1.0.3\n", "umf==0.9.1\n", "uritemplate==4.1.1\n", "urllib3==2.2.3\n", "vega-datasets==0.9.0\n", "wadllib==1.3.6\n", "wandb==0.19.1\n", "wasabi==1.1.3\n", "wcwidth==0.2.13\n", "weasel==0.4.1\n", "webcolors==24.11.1\n", "webencodings==0.5.1\n", "websocket-client==1.8.0\n", "websockets==14.1\n", "Werkzeug==3.1.3\n", "widgetsnbextension==3.6.10\n", "wordcloud==1.9.4\n", "wrapt==1.17.0\n", "xarray==2024.11.0\n", "xarray-einstats==0.8.0\n", "xgboost==2.1.3\n", "xlrd==2.0.1\n", "xyzservices==2024.9.0\n", "yarl==1.18.3\n", "yellowbrick==1.5\n", "yfinance==0.2.50\n", "zipp==3.21.0\n" ] } ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "id": "6NJZ0gD7fCPI", "outputId": "b29a3126-56cb-42a1-c4e1-eeee78dfc702" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-images-idx3-ubyte.gz\n", "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-images-idx3-ubyte.gz to ./data/FashionMNIST/raw/train-images-idx3-ubyte.gz\n" ] }, { "output_type": "stream", "name": "stderr", "text": [ "100%|██████████| 26.4M/26.4M [00:01<00:00, 20.0MB/s]\n" ] }, { "output_type": "stream", "name": "stdout", "text": [ "Extracting ./data/FashionMNIST/raw/train-images-idx3-ubyte.gz to ./data/FashionMNIST/raw\n", "\n", "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-labels-idx1-ubyte.gz\n", "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-labels-idx1-ubyte.gz to ./data/FashionMNIST/raw/train-labels-idx1-ubyte.gz\n" ] }, { "output_type": "stream", "name": "stderr", "text": [ "100%|██████████| 29.5k/29.5k [00:00<00:00, 340kB/s]\n" ] }, { "output_type": "stream", "name": "stdout", "text": [ "Extracting ./data/FashionMNIST/raw/train-labels-idx1-ubyte.gz to ./data/FashionMNIST/raw\n", "\n", "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-images-idx3-ubyte.gz\n", "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-images-idx3-ubyte.gz to ./data/FashionMNIST/raw/t10k-images-idx3-ubyte.gz\n" ] }, { "output_type": "stream", "name": "stderr", "text": [ "100%|██████████| 4.42M/4.42M [00:00<00:00, 6.25MB/s]\n" ] }, { "output_type": "stream", "name": "stdout", "text": [ "Extracting ./data/FashionMNIST/raw/t10k-images-idx3-ubyte.gz to ./data/FashionMNIST/raw\n", "\n", "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-labels-idx1-ubyte.gz\n", "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-labels-idx1-ubyte.gz to ./data/FashionMNIST/raw/t10k-labels-idx1-ubyte.gz\n" ] }, { "output_type": "stream", "name": "stderr", "text": [ "100%|██████████| 5.15k/5.15k [00:00<00:00, 15.0MB/s]\n" ] }, { "output_type": "stream", "name": "stdout", "text": [ "Extracting ./data/FashionMNIST/raw/t10k-labels-idx1-ubyte.gz to ./data/FashionMNIST/raw\n", "\n", "Epoch 1/50 \t\t Training Loss: 0.491073\n", "Epoch 2/50 \t\t Training Loss: 0.372335\n", "Epoch 3/50 \t\t Training Loss: 0.336426\n", "Epoch 4/50 \t\t Training Loss: 0.311305\n", "Epoch 5/50 \t\t Training Loss: 0.294551\n", "Epoch 6/50 \t\t Training Loss: 0.276374\n", "Epoch 7/50 \t\t Training Loss: 0.262887\n", "Epoch 8/50 \t\t Training Loss: 0.254526\n", "Epoch 9/50 \t\t Training Loss: 0.243179\n", "Epoch 10/50 \t\t Training Loss: 0.233376\n", "Epoch 11/50 \t\t Training Loss: 0.223815\n", "Epoch 12/50 \t\t Training Loss: 0.214887\n", "Epoch 13/50 \t\t Training Loss: 0.209000\n", "Epoch 14/50 \t\t Training Loss: 0.198861\n", "Epoch 15/50 \t\t Training Loss: 0.190729\n", "Epoch 16/50 \t\t Training Loss: 0.187529\n", "Epoch 17/50 \t\t Training Loss: 0.178979\n", "Epoch 18/50 \t\t Training Loss: 0.173951\n", "Epoch 19/50 \t\t Training Loss: 0.168973\n", "Epoch 20/50 \t\t Training Loss: 0.161324\n", "Epoch 21/50 \t\t Training Loss: 0.157319\n", "Epoch 22/50 \t\t Training Loss: 0.152727\n", "Epoch 23/50 \t\t Training Loss: 0.149666\n", "Epoch 24/50 \t\t Training Loss: 0.141848\n", "Epoch 25/50 \t\t Training Loss: 0.139228\n", "Epoch 26/50 \t\t Training Loss: 0.130827\n", "Epoch 27/50 \t\t Training Loss: 0.132600\n", "Epoch 28/50 \t\t Training Loss: 0.126852\n", "Epoch 29/50 \t\t Training Loss: 0.127855\n", "Epoch 30/50 \t\t Training Loss: 0.118615\n", "Epoch 31/50 \t\t Training Loss: 0.115961\n", "Epoch 32/50 \t\t Training Loss: 0.115706\n", "Epoch 33/50 \t\t Training Loss: 0.110119\n", "Epoch 34/50 \t\t Training Loss: 0.105448\n", "Epoch 35/50 \t\t Training Loss: 0.107012\n", "Epoch 36/50 \t\t Training Loss: 0.100668\n", "Epoch 37/50 \t\t Training Loss: 0.095950\n", "Epoch 38/50 \t\t Training Loss: 0.095926\n", "Epoch 39/50 \t\t Training Loss: 0.099695\n", "Epoch 40/50 \t\t Training Loss: 0.090311\n", "Epoch 41/50 \t\t Training Loss: 0.090154\n", "Epoch 42/50 \t\t Training Loss: 0.086391\n", "Epoch 43/50 \t\t Training Loss: 0.085310\n", "Epoch 44/50 \t\t Training Loss: 0.083046\n", "Epoch 45/50 \t\t Training Loss: 0.084120\n", "Epoch 46/50 \t\t Training Loss: 0.079927\n", "Epoch 47/50 \t\t Training Loss: 0.076103\n", "Epoch 48/50 \t\t Training Loss: 0.074748\n", "Epoch 49/50 \t\t Training Loss: 0.080083\n", "Epoch 50/50 \t\t Training Loss: 0.070000\n", "Epoch [50/50], Loss: 0.0700\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "<Figure size 800x600 with 1 Axes>" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAAArMAAAIjCAYAAAAQgZNYAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABQpElEQVR4nO3de3hU5bn+8XsyOREgnA2QRKKiAiqhgkAUBMqpaBUM/EREwdQzoMTU2mIriIeigIgHBBQRtYIoBbGtAhEJoqAIiCJbUCxIICQcFAJBkjBZvz9WJ2TITDJJJrNmJt/PdeWambXeWXmz3+2177141vPaDMMwBAAAAAShMKsnAAAAAFQXYRYAAABBizALAACAoEWYBQAAQNAizAIAACBoEWYBAAAQtAizAAAACFqEWQAAAAQtwiwAAACCFmEWAFArsrKyZLPZtGTJEqunAiCEEWYB4CwLFiyQzWbTpk2brJ6KV7755hulpaXpvPPOU3R0tBo0aKBOnTrpoYce0n//+1+rpwcAtSrc6gkAAKrvlVde0b333qvmzZtr5MiRateunU6fPq1vv/1Wb7zxhmbOnKlff/1Vdrvd6qkCQK0gzAJAkFq/fr3uvfdeXXXVVfr3v/+thg0bupx/5pln9OSTT1Z6nZMnTyomJqa2pgkAtYoyAwCopq+++kqDBg1SbGysGjRooL59++rzzz93GVNcXKzJkyfrwgsvVHR0tJo1a6YePXooMzOzdExubq7S0tKUkJCgqKgotWrVSoMHD9aePXsq/P2TJ0+WzWbTW2+9VS7ISlJ0dLQef/xxl7uyvXv31qWXXqrNmzfr6quvVkxMjB5++GFJ0vLly3XttdeqdevWioqK0gUXXKDHH39cDofD5bplr3HllVeqXr16Ou+88zRnzhy38ywpKdGTTz6phIQERUdHq2/fvtq1a1eFfxsAeIs7swBQDdu3b1fPnj0VGxurhx56SBEREZo7d6569+6ttWvXqlu3bpKkRx99VFOmTNEdd9yhrl27Kj8/X5s2bdKWLVvUv39/SdLQoUO1fft23XfffUpKStLBgweVmZmpvXv3Kikpye3vP3nypD7++GP17t1bCQkJVZr7kSNHNGjQIN1000265ZZbFBcXJ8msFW7QoIEyMjLUoEEDffzxx5o4caLy8/M1bdo0l2v88ssvuuaaa3TjjTdqxIgReuedd3TvvfcqMjJSf/jDH1zGPvXUUwoLC9ODDz6oY8eOaerUqRo5cqS++OKLKs0bANwyAAAuXnvtNUOS8eWXX3ocM2TIECMyMtL48ccfS4/l5OQYDRs2NK6++urSY8nJyca1117r8Tq//PKLIcmYNm1aleb49ddfG5KM9PT0cueOHDliHDp0qPSnsLCw9FyvXr0MScacOXPKfe/kyZPljt19991GTEyMcerUqXLXeOaZZ0qPFRYWGp06dTLOOecco6ioyDAMw1izZo0hyWjfvr3LHJ577jlDkrFt27Yq/c0A4A5lBgBQRQ6HQ6tWrdKQIUN0/vnnlx5v1aqVbr75Zn366afKz8+XJDVu3Fjbt2/XDz/84PZa9erVU2RkpLKysvTLL794PQfn9Rs0aFDu3Pnnn68WLVqU/rz//vsu56OiopSWluZ2Lk7Hjx/X4cOH1bNnT508eVI7duxwGRseHq6777679HNkZKTuvvtuHTx4UJs3b3YZm5aWpsjIyNLPPXv2lCQ6LQDwCcIsAFTRoUOHdPLkSV188cXlzrVv314lJSXKzs6WJD322GM6evSoLrroIl122WX605/+pG+++aZ0fFRUlJ5++ml9+OGHiouL09VXX62pU6cqNze3wjk4a2RPnDhR7tzy5cuVmZmp6dOnu/1ufHy8S7h02r59u2644QY1atRIsbGxatGihW655RZJ0rFjx1zGtm7dWvXr13c5dtFFF0lSuVrfc8891+VzkyZNJKlK4R0APCHMAkAtuvrqq/Xjjz9q/vz5uvTSSzVv3jxdfvnlmjdvXumY9PR0ff/995oyZYqio6P1yCOPqH379vrqq688Xrdt27YKDw/Xt99+W+5cr1691K9fP3Xu3Nntd8vegXU6evSoevXqpa+//lqPPfaY/vWvfykzM1NPP/20JPMhrury1BbMMIxqXxMAnAizAFBFLVq0UExMjHbu3Fnu3I4dOxQWFqbExMTSY02bNlVaWpoWLVqk7OxsdezYUY8++qjL9y644AL98Y9/1KpVq/Ttt9+qqKhIzzzzjMc51K9fv/Rhs/3799f4b8rKytKRI0e0YMECjR8/Xr///e/Vr1+/0ruoZ8vJyVFBQYHLse+//16SPD60BgC1gTALAFVkt9s1YMAALV++3OWf1PPy8rRw4UL16NFDsbGxkszOAWU1aNBAbdu2VWFhoSSzK8GpU6dcxlxwwQVq2LBh6RhPJk6cKIfDoVtuucVtuUFV7nw6756W/U5RUZFeeuklt+NPnz6tuXPnuoydO3euWrRo4fGOMADUBlpzAYAH8+fP14oVK8odHz9+vJ544gllZmaqR48eGjNmjMLDwzV37lwVFhZq6tSppWM7dOig3r17q3PnzmratKk2bdqkJUuWaNy4cZLMu5l9+/bVjTfeqA4dOig8PFzLli1TXl6ebrrppgrn17NnT7344ou67777dOGFF5buAFZUVKTvv/9eb731liIjI9WyZctK/9Yrr7xSTZo00ejRo3X//ffLZrPpzTff9BiIW7duraefflp79uzRRRddpMWLF2vr1q16+eWXFRERUenvAwCfsbaZAgAEHmdrLk8/2dnZhmEYxpYtW4yBAwcaDRo0MGJiYow+ffoY69evd7nWE088YXTt2tVo3LixUa9ePaNdu3bGk08+Wdq+6vDhw8bYsWONdu3aGfXr1zcaNWpkdOvWzXjnnXe8nu9XX31ljBo1yjj33HONyMhIo379+kbHjh2NP/7xj8auXbtcxvbq1cu45JJL3F7ns88+M7p3727Uq1fPaN26tfHQQw8ZK1euNCQZa9asKXeNTZs2GSkpKUZ0dLTRpk0b48UXX3S5nrM117vvvutyfPfu3YYk47XXXvP6bwQAT2yGQQU+AMB7vXv31uHDh90+fAYA/kbNLAAAAIIWYRYAAABBizALAACAoEXNLAAAAIIWd2YBAAAQtAizAAAACFp1btOEkpIS5eTkqGHDhrLZbFZPBwAAAGcxDEPHjx9X69atFRZW8b3XOhdmc3JyXPZMBwAAQGDKzs5WQkJChWPqXJht2LChJPN/OM6906uquLhYq1at0oABA9i2McixlqGDtQwdrGXoYC1Dh7/XMj8/X4mJiaW5rSJ1Lsw6SwtiY2NrFGZjYmIUGxvLf5xBjrUMHaxl6GAtQwdrGTqsWktvSkJ5AAwAAABBizALAACAoEWYBQAAQNAizAIAACBoEWYBAAAQtAIizM6aNUtJSUmKjo5Wt27dtHHjRo9jFyxYIJvN5vITHR3tx9kCAAAgUFgeZhcvXqyMjAxNmjRJW7ZsUXJysgYOHKiDBw96/E5sbKwOHDhQ+vPTTz/5ccYAAAAIFJaH2RkzZujOO+9UWlqaOnTooDlz5igmJkbz58/3+B2bzaaWLVuW/sTFxflxxgAAAAgUlm6aUFRUpM2bN2vChAmlx8LCwtSvXz9t2LDB4/dOnDihNm3aqKSkRJdffrn+/ve/65JLLnE7trCwUIWFhaWf8/PzJZnNf4uLi6s1b+f3qvt9BA7WMnSwlqGDtQwdrGXo8PdaVuX32AzDMGpxLhXKyclRfHy81q9fr5SUlNLjDz30kNauXasvvvii3Hc2bNigH374QR07dtSxY8c0ffp0ffLJJ9q+fbvbvXsfffRRTZ48udzxhQsXKiYmxrd/EAAAAGrs5MmTuvnmm3Xs2LFKd2wNuu1sU1JSXILvlVdeqfbt22vu3Ll6/PHHy42fMGGCMjIySj879/odMGBAjbazzczMVP/+/dmeL8ixlqGDtQwdrGXoYC1Dh7/X0vkv6d6wNMw2b95cdrtdeXl5Lsfz8vLUsmVLr64RERGh3/zmN9q1a5fb81FRUYqKinL7vZouhi+ugcDAWoYO1jJ0sJahg7UMHf5ay6r8DksfAIuMjFTnzp21evXq0mMlJSVavXq1y93XijgcDm3btk2tWrWqrWkCAAAgQFleZpCRkaHRo0erS5cu6tq1q2bOnKmCggKlpaVJkkaNGqX4+HhNmTJFkvTYY4+pe/fuatu2rY4ePapp06bpp59+0h133GHln+GWwyGtWycdOCC1aiX17CnZ7VbPCgAAIHRYHmaHDx+uQ4cOaeLEicrNzVWnTp20YsWK0nZbe/fuVVjYmRvIv/zyi+68807l5uaqSZMm6ty5s9avX68OHTpY9Se4tXSpNH68tG/fmWMJCdJzz0mpqdbNCwAAIJRYHmYlady4cRo3bpzbc1lZWS6fn332WT377LN+mFX1LV0qDRsmnd0nYv9+8/iSJQRaAAAAX7B804RQ43CYd2TdNTxzHktPN8cBAACgZgizPrZunWtpwdkMQ8rONscBAACgZgizPnbggG/HAQAAwDPCrI952yGMTmIAAAA1R5j1sZ49za4FNpv78zablJhojgMAAEDNEGZ9zG43229J5QOt8/PMmfSbBQAA8AXCbC1ITTXbb8XHux5PSKAtFwAAgC8RZmtJaqq0Z4+0cuWZY1u2EGQBAAB8iTBbi+x2acAAqXFj8/PBg5ZOBwAAIOQQZv3A2bmAdlwAAAC+RZj1A2eYzc21dh4AAAChhjDrB9yZBQAAqB2EWT9o2dJ8JcwCAAD4FmHWD7gzCwAAUDsIs35AmAUAAKgdhFk/IMwCAADUDsKsHxBmAQAAagdh1g+cYTY/Xzp50tq5AAAAhBLCrB/Exkr16pnv6TULAADgO4RZP7DZaM8FAABQGwizfkLdLAAAgO8RZv2EMAsAAOB7hFk/IcwCAAD4HmHWTwizAAAAvkeY9RPCLAAAgO8RZv3EGWZpzQUAAOA7hFk/4c4sAACA7xFm/cTZZ/bQIen0aWvnAgAAECoIs37SooVkt0uGIeXlWT0bAACA0ECY9ZOwMCkuznxPqQEAAIBvEGb9iLpZAAAA3yLM+hFhFgAAwLcIs35EmAUAAPAtwqwf0WsWAADAtwizfuRsz8WdWQAAAN8gzPoRZQYAAAC+RZj1I8IsAACAbxFm/ahszaxhWDsXAACAUECY9SNnzWxxsXTkiLVzAQAACAWEWT+KjJSaNTPfU2oAAABQc4RZP6M9FwAAgO8QZv2Mh8AAAAB8hzDrZ/SaBQAA8B3CrJ9xZxYAAMB3CLN+RpgFAADwHcKsnxFmAQAAfIcw62eEWQAAAN8hzPoZYRYAAMB3CLN+5gyzBQXSiRPWzgUAACDYEWb9rEEDqX598z13ZwEAAGqGMGsBSg0AAAB8gzBrAcIsAACAbxBmLUCYBQAA8A3CrAUIswAAAL5BmLUAYRYAAMA3CLMWcIbZ3Fxr5wEAABDsCLMW4M4sAACAbxBmLdCypflKmAUAAKgZwqwFnHdmjxyRioqsnQsAAEAwI8xaoFkzKSLCfE/dLAAAQPURZi1gs1FqAAAA4AuEWYvwEBgAAEDNEWYtQnsuAACAmiPMWoQ7swAAADVHmLUIYRYAAKDmCLMW4QEwAACAmiPMWoQ7swAAADVHmLUIYRYAAKDmCLMWcYbZvDzJ4bB2LgAAAMGKMGuRuDhz8wSHQzp82OrZAAAABCfCrEXCw6UWLcz39JoFAACoHsKshaibBQAAqBnCrIVozwUAAFAzhFkLcWcWAACgZgizFiLMAgAA1Axh1kKEWQAAgJohzFqIMAsAAFAzhFkLOcMsrbkAAACqhzBrobJ3Zg3D2rkAAAAEI8KshZytuX79VcrPt3YuAAAAwYgwa6GYGCk21nxP3SwAAEDVEWYtxkNgAAAA1UeYtRhhFgAAoPoIsxYjzAIAAFQfYdZihFkAAIDqI8xajF6zAAAA1UeYtRh3ZgEAAKqPMGsxZ69ZwiwAAEDVEWYtxp1ZAACA6guIMDtr1iwlJSUpOjpa3bp108aNG7363ttvvy2bzaYhQ4bU7gRrkTPMHj1q7gQGAAAA71keZhcvXqyMjAxNmjRJW7ZsUXJysgYOHKiDBw9W+L09e/bowQcfVM+ePf0009rRuLEUFWW+5yEwAACAqrE8zM6YMUN33nmn0tLS1KFDB82ZM0cxMTGaP3++x+84HA6NHDlSkydP1vnnn+/H2fqezUapAQAAQHWFW/nLi4qKtHnzZk2YMKH0WFhYmPr166cNGzZ4/N5jjz2mc845R7fffrvWrVtX4e8oLCxUYWFh6ef8/HxJUnFxsYqLi6s1b+f3qvv9s7VsadeePWHat++0iosNn1wT3vH1WsI6rGXoYC1DB2sZOvy9llX5PZaG2cOHD8vhcCguLs7leFxcnHbs2OH2O59++qleffVVbd261avfMWXKFE2ePLnc8VWrVikmJqbKcy4rMzOzRt8/4wpJrbV69f8pKmq3j66JqvDdWsJqrGXoYC1DB2sZOvy1lidPnvR6rKVhtqqOHz+uW2+9Va+88oqaN2/u1XcmTJigjIyM0s/5+flKTEzUgAEDFBsbW615FBcXKzMzU/3791dERES1rlHWypVh+vxzqWnTS3TNNe1rfD14z9drCeuwlqGDtQwdrGXo8PdaOv8l3RuWhtnmzZvLbrcrLy/P5XheXp5aOhuwlvHjjz9qz549uu6660qPlZSUSJLCw8O1c+dOXXDBBS7fiYqKUpTzCasyIiIiarwYvriGJLVubb4ePGhXRIS9xtdD1flqLWE91jJ0sJahg7UMHf5ay6r8DksfAIuMjFTnzp21evXq0mMlJSVavXq1UlJSyo1v166dtm3bpq1bt5b+XH/99erTp4+2bt2qxMREf07fZ3gADAAAoHosLzPIyMjQ6NGj1aVLF3Xt2lUzZ85UQUGB0tLSJEmjRo1SfHy8pkyZoujoaF166aUu32/cuLEklTseTAizAAAA1WN5mB0+fLgOHTqkiRMnKjc3V506ddKKFStKHwrbu3evwsIs7yBWqwizAAAA1WN5mJWkcePGady4cW7PZWVlVfjdBQsW+H5CfuYMswcPSqdPS+EBsSoAAACBL7RveQaJFi2ksDDJMKRDh6yeDQAAQPAgzAYAu11yttql1AAAAMB7hNkA4exERpgFAADwHmE2QPAQGAAAQNURZgMEYRYAAKDqCLMBgjALAABQdYTZAEGYBQAAqDrCbIBwhtncXGvnAQAAEEwIswGCO7MAAABVR5gNEGXDrGFYOxcAAIBgQZgNEM5NE4qKpF9+sXYuAAAAwYIwGyCio6UmTcz3lBoAAAB4hzAbQKibBQAAqBrCbAAhzAIAAFQNYTaAEGYBAACqhjAbQJwPgWVlmT8Oh5WzAQAACHyE2QCxdKk0b575/sMPpT59pKQk8zgAAADcI8wGgKVLpWHDpGPHXI/v328eJ9ACAAC4R5i1mMMhjR/vfqME57H0dEoOAAAA3CHMWmzdOmnfPs/nDUPKzjbHAQAAwBVh1mLedi6gwwEAAEB5hFmLOdtx+WocAABAXUKYtVjPnlJCgmSzuT9vs0mJieY4AAAAuCLMWsxul557znx/dqB1fp450xwHAAAAV4TZAJCaKi1ZIsXHux5v1Mg8nppqzbwAAAACHWE2QKSmSnv2SGvWSKNHm8fatyfIAgAAVIQwG0Dsdql3b+nJJ83PGzbQxQAAAKAihNkAFB8vde9uvl+2zNq5AAAABDLCbIBylhewlS0AAIBnhNkA5QyzWVnSkSOWTgUAACBgEWYD1AUXSMnJksMh/etfVs8GAAAgMBFmA5jz7uw//2ntPAAAAAIVYTaAOcPsqlXS8ePWzgUAACAQEWYD2CWXSBdeKBUVSR98YPVsAAAAAg9hNoDZbHQ1AAAAqAhhNsANHWq+/uc/0qlT1s4FAAAg0BBmA1yXLlJCglRQYNbOAgAA4AzCbICj1AAAAMAzwmwQcIbZ99+XioutnQsAAEAgIcwGgR49pBYtpF9+kdautXo2AAAAgYMwGwTsdmnIEPM9pQYAAABnEGaDhLPUYNkyqaTE2rkAAAAECsJskPjtb6XYWCk3V9qwwerZAAAABAbCbJCIjJSuu858T6kBAACAiTAbRJwbKCxdKhmGtXMBAAAIBITZIDJwoFSvnrRnj7R1q9WzAQAAsB5hNojExEiDBpnv//lPa+cCAAAQCAizQYbdwAAAAM4gzAaZ3/9eioiQvvvO/AEAAKjLCLNBplEjqV8/8/2yZdbOBQAAwGqE2SDkLDWgbhYAANR1hNkgNHiwZLNJW7ZIzz8vZWVJDofVswIAAPA/wmwQWrfO3ERBksaPl/r0kZKSeCgMAADUPYTZILN0qTRsmFRY6Hp8/37zOIEWAADUJYTZIOJwmHdi3e3+5TyWnk7JAQAAqDsIs0Fk3Tpp3z7P5w1Dys42xwEAANQFhNkgcuCAb8cBAAAEO8JsEGnVyrfjAAAAgh1hNoj07CklJJhtudyx2aTERHMcAABAXUCYDSJ2u/Tcc+Z7d4HWMKSZM81xAAAAdQFhNsikpkpLlkjx8eXPXXHFmd3BAAAA6gLCbBBKTZX27JHWrJEWLpRef908/uWX0o4dlk4NAADArwizQcpul3r3lkaMkEaNMre4laRnnrF0WgAAAH5FmA0Rf/qT+frGG7TmAgAAdQdhNkRcdZV05ZVSUZH0wgtWzwYAAMA/CLMhxHl39qWXpOPHrZ0LAACAPxBmQ8j110sXXSQdOybNm2f1bAAAAGofYTaEhIVJDz5ovn/2Wam42Nr5AAAA1DbCbIi59VYpLk7KzpYWL7Z6NgAAALWLMBtioqOl++8330+dau4KBgAAEKoIsyHo3nul+vWlbdukVausng0AAEDtIcyGoCZNpDvvNN9PnWrtXAAAAGoTYTZEPfCAuUvYxx9LmzdbPRsAAIDaQZgNUeeeK910k/l+2jRr5wIAAFBbCLMhzLmJwrvvSv/9r7VzAQAAqA2E2RCWnCwNGCCVlJh9ZwEAAEINYTbEPfSQ+TpvnrR8ubRokZSVJTkclk4LAADAJ8KtngBq129/K513nrR7tzRkyJnjCQnSc89JqamWTQ0AAKDGuDMb4pYtM4Ps2fbvl4YNk5Yu9f+cAAAAfIUwG8IcDmn8ePfnnDuDpadTcgAAAIIXYTaErVsn7dvn+bxhSNnZ5jgAAIBgRJgNYQcO+HYcAABAoCHMhrBWrXw7DgAAINAQZkNYz55m1wKbzf15m01KTDTHAQAABCPCbAiz2832W5L7QGsY0syZ5jgAAIBgRJgNcamp0pIlUny8+/Nh/G8AAAAIYkSZOiA1VdqzR1qzRlq40Hx98EHz3F13SQcPWjo9AACAamMHsDrCbpd69z7zOSVFWrlS2rbNDLTLlnmurQUAAAhUAXFndtasWUpKSlJ0dLS6deumjRs3ehy7dOlSdenSRY0bN1b9+vXVqVMnvfnmm36cbWiIipLefFOKiJCWL5feeMPqGQEAAFSd5WF28eLFysjI0KRJk7RlyxYlJydr4MCBOujh376bNm2qv/71r9qwYYO++eYbpaWlKS0tTStXrvTzzINfcrL02GPm+/vuk376ydr5AAAAVJXlYXbGjBm68847lZaWpg4dOmjOnDmKiYnR/Pnz3Y7v3bu3brjhBrVv314XXHCBxo8fr44dO+rTTz/188xDw5/+JF15pXT8uHTbbVJJidUzAgAA8J6lNbNFRUXavHmzJkyYUHosLCxM/fr104YNGyr9vmEY+vjjj7Vz5049/fTTbscUFhaqsLCw9HN+fr4kqbi4WMXFxdWat/N71f1+oJk3T+rSJVxZWTY9+6xD999fdxJtqK1lXcZahg7WMnSwlqHD32tZld9jaZg9fPiwHA6H4uLiXI7HxcVpx44dHr937NgxxcfHq7CwUHa7XS+99JL69+/vduyUKVM0efLkcsdXrVqlmJiYGs0/MzOzRt8PJKNGJWnOnGRNmCBFRa1TYuJxq6fkV6G0lnUdaxk6WMvQwVqGDn+t5cmTJ70eG5TdDBo2bKitW7fqxIkTWr16tTIyMnT++eerd9nH9f9nwoQJysjIKP2cn5+vxMREDRgwQLGxsdX6/cXFxcrMzFT//v0VERFR3T8joAwaJO3eXaKVK+2aP7+3/v73Eh06ZG5126OHEbIbK4TiWtZVrGXoYC1DB2sZOvy9ls5/SfeGpWG2efPmstvtysvLczmel5enli1bevxeWFiY2rZtK0nq1KmTvvvuO02ZMsVtmI2KilJUVFS54xERETVeDF9cI5DMny9ddJH01VdhGjToTDl1QoK5k1hqqoWTq2WhtpZ1GWsZOljL0MFahg5/rWVVfoelD4BFRkaqc+fOWr16demxkpISrV69WikpKV5fp6SkxKUuFtXz+edSQUH54/v3S8OGSUuX+n9OAAAAFbG8zCAjI0OjR49Wly5d1LVrV82cOVMFBQVKS0uTJI0aNUrx8fGaMmWKJLMGtkuXLrrgggtUWFioDz74QG+++aZmz55t5Z8R9BwOafx49+cMw9xQIT1dGjxYIVtyAAAAgo/lYXb48OE6dOiQJk6cqNzcXHXq1EkrVqwofShs7969Cgs7cwO5oKBAY8aM0b59+1SvXj21a9dO//jHPzR8+HCr/oSQsG6dtG+f5/OGIWVnm+PcVHMAAABYwvIwK0njxo3TuHHj3J7Lyspy+fzEE0/oiSee8MOs6pYDB3w7DgAAwB8s3zQBgaFVK9+OAwAA8Idqhdns7GztK/Nv0hs3blR6erpefvlln00M/tWzp9m1wGbzPCYx0RwHAAAQKKoVZm+++WatWbNGkpSbm6v+/ftr48aN+utf/6rHHnvMpxOEf9jtZvstyXOgnTCBh78AAEBgqVaY/fbbb9W1a1dJ0jvvvKNLL71U69ev11tvvaUFCxb4cn7wo9RUackSKT7e9bizTe9775kPggEAAASKaoXZ4uLi0o0IPvroI11//fWSpHbt2ukATwgFtdRUac8eac0aaeFC8/Wrr8xAu2qVeQwAACBQVCvMXnLJJZozZ47WrVunzMxM/e53v5Mk5eTkqFmzZj6dIPzPbjfbb40YYb62by898oh5Lj1dOnLEwskBAACUUa0w+/TTT2vu3Lnq3bu3RowYoeTkZEnS+++/X1p+gNDypz9Jl14qHT4s/fGPVs8GAADAVK0+s71799bhw4eVn5+vJk2alB6/6667FBMT47PJIXBERkqvvCJdeaX0+uvSrbdKfftaPSsAAFDXVevO7K+//qrCwsLSIPvTTz9p5syZ2rlzp8455xyfThCBo3t3aexY8/3dd0u//mrtfAAAAKoVZgcPHqw33nhDknT06FF169ZNzzzzjIYMGaLZs2f7dIIILE8+aXY7+PFHiS5sAADAatUKs1u2bFHP/3XPX7JkieLi4vTTTz/pjTfe0PPPP+/TCSKwxMZKs2aZ76dNk775xtr5AACAuq1aYfbkyZNq2LChJGnVqlVKTU1VWFiYunfvrp9++smnE0TgGTxYGjpUcjikO+4wXwEAAKxQrTDbtm1bvffee8rOztbKlSs1YMAASdLBgwcVGxvr0wkiMD3/vNSokfTll9ILL0hZWdKiReYr4RYAAPhLtcLsxIkT9eCDDyopKUldu3ZVSkqKJPMu7W9+8xufThCBqXVr6emnzfcZGVKfPtLNN5uvSUnS0qWWTg8AANQR1Qqzw4YN0969e7Vp0yatXLmy9Hjfvn317LPP+mxyCGzO/THO3uJ2/35p2DACLQAAqH3V6jMrSS1btlTLli21b98+SVJCQgIbJtQhDof0wAPuzxmGZLOZu4UNHmzuKAYAAFAbqnVntqSkRI899pgaNWqkNm3aqE2bNmrcuLEef/xxlZSU+HqOCEDr1kn/+/9j3DIMKTvbHAcAAFBbqnVn9q9//ateffVVPfXUU7rqqqskSZ9++qkeffRRnTp1Sk8++aRPJ4nAc+CAb8cBAABUR7XC7Ouvv6558+bp+uuvLz3WsWNHxcfHa8yYMYTZOqBVK9+OAwAAqI5qlRn8/PPPateuXbnj7dq1088//1zjSSHw9ewpJSSYtbGeJCaa4wAAAGpLtcJscnKyXnzxxXLHX3zxRXXs2LHGk0Lgs9ul554z33sKtL/9LQ9/AQCA2lWtMoOpU6fq2muv1UcffVTaY3bDhg3Kzs7WBx984NMJInClpkpLlkjjx7s+DNa4sXT0qPTGG9KQIeYPAABAbajWndlevXrp+++/1w033KCjR4/q6NGjSk1N1fbt2/Xmm2/6eo4IYKmp0p490po10sKF5uuhQ9I995gdDUaOlDZvtnqWAAAgVFW7z2zr1q3LPej19ddf69VXX9XLL79c44kheNjtUu/ersdeeEHavVtauVK67jrpiy/MGloAAABfqtadWaAy4eHSO+9Il15qtuf6/e+l48etnhUAAAg1hFnUmthY6d//luLipG++kW66SSoslLKypEWLzFeHw+pZAgCAYFbtMgPAG23aSO+/b5YhfPCB1Ly5dOLEmfMJCWZXhNRUy6YIAACCWJXCbGoliePo0aM1mQtCVNeu0tix0vTprkFWkvbvl4YNM7siEGgBAEBVVSnMNmrUqNLzo0aNqtGEEHocDuntt92fMwyzT216ujR4MH1pAQBA1VQpzL722mu1NQ+EsHXrXPvQns0wpOxsc9zZXREAAAAqwgNgqHUHDvh2HAAAgBNhFrWuVSvfjgMAAHAizKLW9expdi2w2TyPsdmkgwf9NycAABAaCLOodXa72X5LKh9onZ8NQxo+3NwG9+RJ/84PAAAEL8Is/CI11Wy/FR/vejwhQVq8WPrzn83Pc+dKV1xhbrIgmZ0Q2GQBAAB4wqYJ8JvUVLP91rp15sNerVqZJQh2u3TjjVK/ftKtt0r/939mb9pbb5VWrHDthMAmCwAAoCzCLPzKbvfcfqtfP/OO7G23mbuFzZtXfgybLAAAgLIoM0BAadFCWr5catzY/XnDMF/T0yk5AAAAhFkEoE8/lSraGbnsJgsAAKBuI8wi4LDJAgAA8BZhFgGHTRYAAIC3CLMION5sstC0qTkOAADUbYRZBJyKNllw+vln6R//8N+cAABAYCLMIiB52mQhMVHq3998n5Ymvfqq/+cGAAACB2EWASs1VdqzR1qzRlq40HzdvVtauVIaO9bsanDHHdLLL1s9UwAAYBU2TUBA87TJwgsvSOHhZjnC3XdLp0+br+52FwMAAKGLO7MISjab9Oyz0h//aH4eO1Zq3lzq00e6+WbzNSlJWrrU0mkCAIBaRphF0LLZpGnTpCFDzM9nb7Tg3PqWQAsAQOgizCKolZRImza5P8fWtwAAhD7CLILaunXSvn2ez7P1LQAAoY0wi6DG1rcAANRthFkENba+BQCgbiPMIqh5s/Wt3S41buy3KQEAAD8izCKoVbT1rfOzwyFdfbW0YoV/5wYAAGofYRZBz9PWtwkJ0oIFUq9e0vHj0rXXSrNmWTJFAABQSwizCAmetr4dPVpatUq67Tazjde4cdL48ebdWodDWrvWpk8+idfatTbadwEAEITYzhYhw9PWt5GR0vz50sUXSxMmSM8/L336qZSbK+XkhEvqohkzzDu5zz1nBmMAABAcuDOLOsFmk/7yF+ndd6WICGnLFiknx3UMO4YBABB8CLOoU264QWrSxP05dgwDACD4EGZRp6xbJx086Pk8O4YBABBcCLOoU9gxDACA0EKYRZ3CjmEAAIQWwizqFG92DIuIkNq08d+cAABA9RFmUadUtGOYU3GxlJIibdjgv3kBAIDqIcyizvG0Y1hiojRnjtSxo5SXZ/asffNN85zDIWVlSYsWma90OwAAIDAQZlEnOXcMy8w8rYyMTcrMPK3du6W775Y++0waMkQqKpJGjTLbeSUlSX36SDffbL4mJdGPFgCAQECYRZ1lt0u9ehm6+ur96tXLkN1uHm/QQPrnP6WHHzY/v/eetG+f63fZYAEAgMBAmAXcCAuTHntMatrU/Xk2WAAAIDAQZgEP1q2Tfv7Z83k2WAAAwHqEWcADNlgAACDwEWYBD9hgAQCAwEeYBTzwZoOF8HCpUSP/zQkAALgizAIeeLPBwunT0lVXSW+84b95AQCAMwizQAUq2mBhwQJp4EDp11+l0aOle++VCgvN82yyAACAfxBmgUo4N1hYs0ZauNB83b3bDLD/+Y/06KPmnds5c6QePaS5c9lkAQAAfwm3egJAMLDbze1t3R2fNEnq1k0aOVLatMn8OZtzk4UlS8xwDAAAfIM7s4AP/O530saNUkSE+/NssgAAQO0gzAI+kp0tFRd7Ps8mCwAA+B5hFvARNlkAAMD/qJkFfMTbzROcHQ+cHA7zbu2BA+Y1evY0a3EBAEDluDML+Ig3myxIUlqa+bDY99+bHQ7ofAAAQPURZgEfqWiTBZvN/Ona1fy8cKHUrp00dKi0b5/rWGfnAwItAACVI8wCPuRpk4WEBPP4F19ImzdL1157psPB2eh8AACA9wizgI952mTB2V/28sulBx+s+Bp0PgAAwDs8AAbUAk+bLDjR+QAAAN/gzixgAW87H3g7DgCAuoowC1jAm84HkZHSJZf4b04AAAQjwixggYo6HzgVFUlXX23W3wIAAPcIs4BFPHU+SEyUnn3WvHO7Y4fUvbvZAQEAAJQXEGF21qxZSkpKUnR0tLp166aNGzd6HPvKK6+oZ8+eatKkiZo0aaJ+/fpVOB4IZJ46H6SnS59/LnXsKOXlSb16SR98YH7H4ZCysqRFi8xX2ncBAOoyy8Ps4sWLlZGRoUmTJmnLli1KTk7WwIEDdfDgQbfjs7KyNGLECK1Zs0YbNmxQYmKiBgwYoP379/t55oBvODsfjBhhvjq3so2PN1tz9e8vFRRI118v3XsvO4YBAFCW5WF2xowZuvPOO5WWlqYOHTpozpw5iomJ0fz5892Of+uttzRmzBh16tRJ7dq107x581RSUqLVq1f7eeZA7YuNlf7zH2n0aPMO7Jw57BgGAEBZlvaZLSoq0ubNmzVhwoTSY2FhYerXr582bNjg1TVOnjyp4uJiNW3a1O35wsJCFRYWln7Oz8+XJBUXF6u4uLha83Z+r7rfR+AIlrWcPVtaujRcx4+Xf1rMMCSbzdD48dI115wuvbNb1wTLWqJyrGXoYC1Dh7/Xsiq/x9Iwe/jwYTkcDsXFxbkcj4uL044dO7y6xp///Ge1bt1a/fr1c3t+ypQpmjx5crnjq1atUkxMTNUnXUZmZmaNvo/AEehruW1bMx0/3sPjecOwad8+afr0L3TZZUf8OLPAE+hrCe+xlqGDtQwd/lrLkydPej02qHcAe+qpp/T2228rKytL0dHRbsdMmDBBGRkZpZ/z8/NL62xjY2Or9XuLi4uVmZmp/v37KyIiolrXQGAIlrXMz6+gIW0Zbdp01zXXGLU8m8AULGuJyrGWoYO1DB3+Xkvnv6R7w9Iw27x5c9ntduXl5bkcz8vLU8uWLSv87vTp0/XUU0/po48+UseOHT2Oi4qKUlRUVLnjERERNV4MX1wDgSHQ1zIx0dtx4QrgP8MvAn0t4T3WMnSwlqHDX2tZld9h6QNgkZGR6ty5s8vDW86HuVJSUjx+b+rUqXr88ce1YsUKdenSxR9TBSzlzY5hdrvqfJAFANQ9lnczyMjI0CuvvKLXX39d3333ne69914VFBQoLS1NkjRq1CiXB8SefvppPfLII5o/f76SkpKUm5ur3NxcnThxwqo/Aah13uwY5nCY/WgffVQ6ffrMMXrSAgBCmeVhdvjw4Zo+fbomTpyoTp06aevWrVqxYkXpQ2F79+7VgQMHSsfPnj1bRUVFGjZsmFq1alX6M336dKv+BMAvKtox7I03pJEjzbA6ebLUo4c0axY9aQEAoS8gHgAbN26cxo0b5/ZcVlaWy+c9bFSPOiw1VRo82NxM4cABqVUrswTBbpduvVW69lpzY4UvvjB/zubsSbtkiXktAACCXUCEWQDec+4Y5s6IEVL37lK7dlJRUfnzZk9ac7vcwYNVrietw+E+KAMAEKgsLzMA4Fs//eQ+yDoZhpSdbYbWspYupSwBABB8CLNAiClTYl6ht96S9u413y9dapYfsFUuACDYEGaBENOqlXfj5s2T2rQxSxJGjzbv2J7NeSw9nU4IAIDARJgFQow3PWljY6WUFCksTNq5U6qos52nsgQAAAIBYRYIMRX1pLXZzJ/XXpPWr5eOHDHvunrD2/IFAAD8iTALhCBPPWkTElzbcjVubHY18Ia35QsAAPgTrbmAEFVRT9qynGUJ+/e7r5uVpEaNpKuuqv05AwBQVdyZBUKYsyftiBHmq7uesd5slXvsmPT730sHD9bWTAEAqB7CLIAKt8odM0aqV09atUpKTpY+/vjMeYdDysqSFi0yX+l4AADwN8oMAEiquCxhzBjpxhul//s/qV8/6ZFHpMsukx54wLU3bUKCeZeXrXIBAP5CmAVQytNWuZdcIn35pXT//dKrr0qPPeb++85NFso+ZAYAQG2izACAV2JizI0W3nzTc20tmywAAPyNMAugShISPHc9kNhkAQDgX5QZAKgSbzdPOHucw1F5mzAAAKqKO7MAqsTbzRNWrpRyc833S5dKSUlSnz7SzTebr0lJ5nEAAGqCMAugSpybLHiqm3V6/XXp3HPNB8qGDnXteiCdeViMQAsAqAnCLIAqqWiTBZvN/MnIkFJSpOJiae1a99fhYTEAgC8QZgFUmadNFhISzOPPPCOtXy+99FLF1+FhMQBATfEAGIBqqWiTBafGjb27lruHynhgDADgDcIsgGrztMmCk7cPiz3zjNSwoXTNNVJYmFlHO348u4sBACpHmQGAWuPtw2KbN0vXXSdddJH0hz+YD4bxwBgAwBuEWQC1xpuHxWbPlh580CxJ+PFH6bXX3G/KwANjAAB3CLMAalVlD4vdc480bZp5J/aBByq+Fg+MAQDORs0sgFrnzcNi9etLV1zh3fW83YUMABD6CLMA/KKyh8Uk7x8Y83YcACD0UWYAIGB488CY3S4VFPhvTgCAwEaYBRAwKnpgzMnhkH7/e+n226WjR88cW7vWpk8+idfatTYeEAOAOoQwCyCgeHpgLDFReusts/+szSbNny9deqn0179KSUlS//7hmjGji/r3D1dSEi28AKCuIMwCCDipqdKePdKaNdLChebr7t3SzTdLM2dKn3wiXXih2Xv273+nJy0A1GU8AAYgIFX0wFiPHuZGC61bSydOlD9vGObd2/R0s4sC2+ACQOjiziyAoLR5s/sg61RRT1qHQ8rKkhYtMl+psQWA4EWYBRCUvO01+9RT0oYNZ3YQW7rUrLHt08csW+jTR9TYAkAQI8wCCEre9ppduVK68krp/PPNWtxhw6ixBYBQQpgFEJQq60lrs0nNm0sjRpi7i+3ZIy1bduYObVnOY+nplBwAQLAhzAIIShX1pHV+njvX7IZw8KA0aVLF1/NUY0t9LQAENsIsgKDlqSdtQoJ5PDXV/BwTI118sXfX/OabM++prwWAwEdrLgBBLTXVbL+1Zs1pffjhVg0a1El9+oSXa8flbY3t+PHShx9KHTtK06aVL0tw1teWDcsAAOsQZgEEPbtd6tXLUEHBfvXqley2r6yzxnb/fvd1s5IUFSUVFkorVpg/7lTWw9bhMEsVDhwwA3TPnvS5BYDaRJkBgDqhshpbm82sr921y3xorCKe6mspSwAA/yPMAqgzvKmxveAC6brrvLve669LO3ea4XbpUtp+AYAVKDMAUKc4a2wrKgXwtr52wQLzJz5e+uUXz22/2FoXAGoPYRZAnWO3S717ez7vTX1to0bS5ZdLn31mjqtI2bKEin4vAKDqKDMAgLN4U187f7708cfmHdkJE7y7rrdb8AIAvEeYBQA3qtLDdsAA767pbfkCAMB7lBkAgAfe1NdK3pUlxMRIl11W+3MGgLqGMAsAFaisvtY55rnnzK4FNpv7QHvypNSpk/Tqq2fu5NKTFgBqjjIDAPABT2UJiYnSk09KbduabbsGDpTuvVd66y160gKALxBmAcBHUlOlPXukNWvMDRjWrJF275YefljaulUaN84cN2eOdMst9KQFAF+gzAAAfMhTWUL9+tILL5gbMlxzjVlicDa2ygWAquPOLAD4UWSk+yDrxFa5AFA13JkFAD/yttfs3Xebd2evvFL6+WfpjjvKP1jmLEso2yoMAOoawiwA+JG3vWa//16aNq3iMWyVCwCUGQCAXzl70p69s5iTzWYG3vnzpbvuMksJKuKpLAEA6grCLAD4UWVb5UrSiy9KaWnS3LnS3//u3XXZKhdAXUWYBQA/83arXMn7soSabpXrcEhZWdKiReZrRQ+pAUAgoWYWACzgy61yw8KkX3+t/lyWLpXGj3fte5uQYN5B5sEyAIGOO7MAYBFnT9oRI8xXdw9weVOWUFJi9q596CGpqMg85u2d1qVLzY4IbOAAIFgRZgEgwFVUlrBwoTRmjPl52jSpRw/ppZe860nrcJh3ZN3d8XUeS0+n5ABAYKPMAACCQEVlCSNGSP36SbffLn35pflztrN70hYXm3dtz74jW1bZTgnudjUDgEBAmAWAIOFpq1xJuuEGqVMnqV27M6UGZTnvtI4cKSUmSrt3S6dPe/d7a9opgW14AdQmwiwAhIiffnIfZMs6dUr64QfzfXS0+bkyzZq5fq5KOOXhMgC1jZpZAAgR3t5BnTDBLB84frziDRyc/vAHafZsqbDQDKfe1ONKPFwGwD8IswAQIrztNTtggBliw8Mr75TQpIkZPseMMR9AGzrUu3DKw2UA/IUwCwAhwputchMTzXFOFXVK+Oc/pZwcc0ey1q2lI0fcX9cwzJ/bb5f+9jfpnnukXr28f7gMAGqCmlkACBHOnrTDhpnBtexdUWfAnTmzfH1rZRs4jB0rXXihNHBgxb//6FHpySerNme24QVQU4RZAAghzjut7h66mjnT80NXFXVKkDzflT1b//7SVVeZwXbmzMrH13QbXgAgzAJAiPF2q9yq8DZ0PvywGYodDjNUV7QNb7NmriUPAFAd1MwCQAjyZqvcqqhqPW5F2/A6HTki/eUv3ve7BQB3CLMAgEpVFE491eNW9HDZDTeY76dPlwYNOlPG4HBIa9fa9Mkn8Vq71ka3AwCVIswCALxSUTh1bpPr7jt79khr1kgLF5qve/aYbbzeeUeKiZE++ki64gppxgyzZ23//uGaMaOL+vcP99jDFgCcqJkFAHitOvW4nh4u+3//z9x+d8gQ6b//lf74x/JjnD1sPYVlACDMAgCqpLLOB1Vx2WXS55+b9baFheXPG4ZZxpCebobos0NzVbbWrcpYAMGDMgMAgKW2b3cfZJ08bbBQ1a11vR0LILgQZgEAlvJ244Qnn5Teesusuf3nP83yA2+21l261PuxAIIPZQYAAEt528P2o4/MH0kKC3Pfv9ZZlnD//dKAAVJkpLmBREVjPZUwAAgO3JkFAFjKmx62zZqZAfWKK8wgW1Li+XqGYd51bdhQiooqf0f27LHuShgABA/CLADAUt70sH35ZXPMxo3Sq6/6fg7eljoACDyEWQCA5arSwzYpybtr/uc/0vLl3o396iupqMj1mMMhZWVJixaZr2zgAAQmwiwAICA4N1jIzDytjIxNysw8rd27y/eX9XZr3YEDpWuvrXis07Rp0oUXSi+9JJ06RfcDIJgQZgEAAcNul3r1MnT11fvVq5fh9qGsqmytW9lYm00aPVpq2VLau1caO9Z8IG3oULofAMGCMAsACDpVKUuobOyCBdLu3dKsWeaxo0fd/05nR4T09JqXHFDCAPgOrbkAAEGpKlvrVjY2OloaM8YsNRgwwPPvLNv9oOwuaFXZXWzpUrNdWNk7vwkJ5h1ktuwFqo4wCwAIWlXZWtebsYcPe3et//73zLWqEk6dGzic3ffWWcJw9l1lAJWjzAAAgP/xdgOHsWOlO+80Hxzzdncxh6PiDRwk35QwAHUNd2YBAPgfZ6eE/fvdh05JCg83Ox7Mm+f5Os7dxe6+2yxL2L1b+uIL7zdw8PZuMwDuzAIAUMqb7gdvvy198onUt2/F1zIMs2whPd285uefezcHNnAAqoYwCwBAGZV1Pxg61LyDe/vt3l3viiukBx+UHnjAu/Fnb9VL5wOgYpQZAABwFm86JXhbXzt1qlk24HBI775bcQmDJN12m7lt7yOPmHeAA6nzQVW6NgD+Yvmd2VmzZikpKUnR0dHq1q2bNm7c6HHs9u3bNXToUCUlJclms2nmzJn+mygAoE5xdj8YMcJ8PTu0ebsTWc+eZ65XWQlDp07S6dPS889L554bWJs3sCsaApWlYXbx4sXKyMjQpEmTtGXLFiUnJ2vgwIE6ePCg2/EnT57U+eefr6eeekotW7b082wBADijKjuROVVWwvDVV1JmppScLP36q/vfa0XnA2dLsUAJ1kBZlobZGTNm6M4771RaWpo6dOigOXPmKCYmRvPnz3c7/oorrtC0adN00003KSoqys+zBQDAVVV2Iiv7nT17pDVrpIULzdfdu8+M7ddPmjGj4t9btvNBbaOlGAKdZTWzRUVF2rx5syZMmFB6LCwsTP369dOGDRt89nsKCwtVWFhY+jk/P1+SVFxcrOLi4mpd0/m96n4fgYO1DB2sZegItrW87jrpmmukTz+1ldaS9uhhyG6XKvoTrrrqzPuSEtcHv/bvt8mb/xOdnX1axcWuKdPhcD8Xd7wZu3atTfv2eZ6LM1ivWXNavXq5ziXY1hKe+Xstq/J7LAuzhw8flsPhUFxcnMvxuLg47dixw2e/Z8qUKZo8eXK546tWrVJMTEyNrp2ZmVmj7yNwsJahg7UMHcG4lrGxUkGBtHJlza7z00/NJPWodNxf/1qgLVt26corcxQZWaING1pp3rzLdORIvdIxzZr9qjvu2KaUFNeeX5WN/fXXcG3efI6WL79AUtNK5/Lhh1tVULDf7blgXEu456+1PHnypNdjbYZR0TOVtScnJ0fx8fFav369UlJSSo8/9NBDWrt2rb744osKv5+UlKT09HSlp6dXOM7dndnExEQdPnxYsbGx1Zp7cXGxMjMz1b9/f0VERFTrGggMrGXoYC1DB2tp3jFt2zZcOTmSYbh7wsz5f7rNc82aGbryyhL9+99h//un/zPfsdnMsW+/7dANN5jvly2z6aab7G7HGobUpYuhbdtsKiz08HSbG5mZ7u/M1vW1DBX+Xsv8/Hw1b95cx44dqzSvWXZntnnz5rLb7crLy3M5npeX59OHu6KiotzW10ZERNR4MXxxDQQG1jJ0sJahoy6vZUSE2dFg2DDzYbKyt53Mh8tseuUVKSdHevllad8+m/71L/e1BM4wfP/94TrvPPP7993nqQbWHLtpk/natq3ZUeG116RDhzy3FDvnHKlPn3CP5Qx1eS1Djb/Wsiq/w7IHwCIjI9W5c2etXr269FhJSYlWr17tcqcWAIC6qLKHy26/3exFu3u39MQTlV8vL0/q2tXcxMFD0yAX8+ZJ338vPfWUNHu2ecxTG7LDh6W5cyvunwvUFku7GWRkZOiVV17R66+/ru+++0733nuvCgoKlJaWJkkaNWqUywNiRUVF2rp1q7Zu3aqioiLt379fW7du1a5du6z6EwAAqDWVdT6QpPBw6fzzvbtekybmjzdiYs6E14qCdY8e5sNrY8dK99wjFRWZ5xwO8+GxTz6J19q1NrodoNZYugPY8OHDdejQIU2cOFG5ubnq1KmTVqxYUfpQ2N69exUWdiZv5+Tk6De/+U3p5+nTp2v69Onq1auXsrKy/D19AABqnXPzhop4uxuZsx9snz6Vjz37mp52RQsLk6ZNk/7yF7PkYft26Q9/kCZN0v+6IHTRjBmV71zG7mKoLsu3sx03bpzGjRvn9tzZATUpKUkWPa8GAEDAcu5G5mmrXJvNPO/cjawqY8vyFKwfeki69FJzZ7DPPjN/zubcYMFd/92lSwNr214EF8u3swUAADVTld3IqrNzmTeuuUZav94se3DH0wYL7C6GmiLMAgAQAqqyG1l1di7zxsGD0unTns87N1hIS5MmT5Yef9wsSajq7mIOh5SVJS1aZL5Sj1u3WV5mAAAAfMNTXau7u6xVGeutAwcqHyNJb77p3biy2/Y6yxuqU5JAPW5oI8wCABBCvHlgrDpjveHtg2hDhkgtW0o7d5odGiozfboUHW0G2BtvLH8nl3rcuo0wCwAAfMLbB9GWLDGDdFaWd2H2P/8xf+x2zyUJNptZkjB48Jm7rs563KqE36rirq/1qJkFAAA+UdWHy5zh19NmDDab1KyZNHy4eWe2otpYZ0nCm29KP/9s1u6OH1+79bhLl0pJSWars5tvNl+Tknhozd8IswAAwGeq8nCZN+H35Zelt9+W5szx7venpZkB2FmW4EnZelynqoRTujAEDsIsAADwKefOZZmZp5WRsUmZmafL7VxWdqw34bdNG+9+d8OG5qu3HQ7mzTNLHd580/tweuKEueNZVe/6onZQMwsAAHzObpd69TJUULBfvXolV1hH6k1nBW/rcXfvNksMli83yxMq89Zb5o8nzt91881moM7Lk44dq/ia7rowSIFVXxtIc6kp7swCAADLOTsrjBhhvp4drKpSjxsVJQ0dWnE9riQ1aiTdcIMUF1f5/AoLpe+/rzzIlrV8ufk9KbDqawNpLr5AmAUAAEHBl/W4Nps0f74Z4J591rvf/7e/Sd99J/3rX96NnznTvOs5YIAZrgOhvjYUa30JswAAIGg463HXrJEWLjRfa1qP621/3L59pXbtpEGDKu/C0LChed1ffpEyM92P83d9rcNRvQ4PgY4wCwAAgkplJQlleRN+vWkRlphojnP+/spKHhYsMOtmp0+v+G9x11XBydfb9q5bV/UOD8GAMAsAAEKaL+txnby562u3S61bezfHl14yd0Rzqmpda2XBd9cu6YknvJuLt9sSBwq6GQAAgDrPGU7dbX07c6bnMobKujB4W8Lw7rvmz2WXSZdcIi1e7P3OZRVt2ZuYKE2dKv3zn+7LC9zxds6BgjALAAAg78Lp2Zx3fT3xpqVYkybSFVdIq1dL27aZP+6427bX05a9+/aZD52VNWiQtGmTdPiw52DbuPGZcopgQZkBAADA/1SlHtfb61VWwvDKK9KKFWYP24ceqvh6zrrW7t2lO+4wdzyr7I7rLbdI33wjffDBmZ3UPNUHHz1qzqGkpOJrBhLCLAAAQC3ytqtC06ZSp07eXXPTJunVV6X8/MrH3n67Wb5Q0VwSE6VbbzXfz5gh3Xij9Ouv3s3FapQZAAAA1DJvSxi8rVd96CHpxx/NWtjKnP1AV0VzGTRIuu0287o5OdL775tlEGvX2vTJJ/GqX9+mPn0Ca7cwwiwAAIAfVFZfK3m/be/f/26GUW/CrLuA7GkuI0aYd20HD5Y2bDhzRzc3N1xSF82YcebhMncPxVmBMgMAAIAAUZU2YVXtj+utq6+W1q+XWrSQcnPNn7ICbbcwwiwAAEAA8bbGtjr9cb110UVSuId/vw+03cIIswAAAAHG2217vQ2+VeWsp/UkkHYLo2YWAAAgAHlTYytVrz9uZbzdBSwQdgsjzAIAAAQ5b4Ovt7ztqhAIu4VRZgAAAAAXtfVwWW0gzAIAAMBFbT5c5muEWQAAAJRTWw+X+Ro1swAAAHDL+XDZmjWn9eGHWzVoUCf16RMeEHdknQizAAAA8Mhul3r1MlRQsF+9eiUHVJCVKDMAAABAECPMAgAAIGgRZgEAABC0CLMAAAAIWoRZAAAABC3CLAAAAIIWYRYAAABBizALAACAoEWYBQAAQNAizAIAACBoEWYBAAAQtAizAAAACFqEWQAAAAStcKsn4G+GYUiS8vPzq32N4uJinTx5Uvn5+YqIiPDV1GAB1jJ0sJahg7UMHaxl6PD3WjpzmjO3VaTOhdnjx49LkhITEy2eCQAAACpy/PhxNWrUqMIxNsObyBtCSkpKlJOTo4YNG8pms1XrGvn5+UpMTFR2drZiY2N9PEP4E2sZOljL0MFahg7WMnT4ey0Nw9Dx48fVunVrhYVVXBVb5+7MhoWFKSEhwSfXio2N5T/OEMFahg7WMnSwlqGDtQwd/lzLyu7IOvEAGAAAAIIWYRYAAABBizBbDVFRUZo0aZKioqKsngpqiLUMHaxl6GAtQwdrGToCeS3r3ANgAAAACB3cmQUAAEDQIswCAAAgaBFmAQAAELQIswAAAAhahNkqmjVrlpKSkhQdHa1u3bpp48aNVk8JXvjkk0903XXXqXXr1rLZbHrvvfdczhuGoYkTJ6pVq1aqV6+e+vXrpx9++MGaycKjKVOm6IorrlDDhg11zjnnaMiQIdq5c6fLmFOnTmns2LFq1qyZGjRooKFDhyovL8+iGcOT2bNnq2PHjqUN2FNSUvThhx+Wnmcdg9dTTz0lm82m9PT00mOsZ3B49NFHZbPZXH7atWtXej5Q15EwWwWLFy9WRkaGJk2apC1btig5OVkDBw7UwYMHrZ4aKlFQUKDk5GTNmjXL7fmpU6fq+eef15w5c/TFF1+ofv36GjhwoE6dOuXnmaIia9eu1dixY/X5558rMzNTxcXFGjBggAoKCkrHPPDAA/rXv/6ld999V2vXrlVOTo5SU1MtnDXcSUhI0FNPPaXNmzdr06ZN+u1vf6vBgwdr+/btkljHYPXll19q7ty56tixo8tx1jN4XHLJJTpw4EDpz6efflp6LmDX0YDXunbtaowdO7b0s8PhMFq3bm1MmTLFwlmhqiQZy5YtK/1cUlJitGzZ0pg2bVrpsaNHjxpRUVHGokWLLJghvHXw4EFDkrF27VrDMMx1i4iIMN59993SMd99950hydiwYYNV04SXmjRpYsybN491DFLHjx83LrzwQiMzM9Po1auXMX78eMMw+O8ymEyaNMlITk52ey6Q15E7s14qKirS5s2b1a9fv9JjYWFh6tevnzZs2GDhzFBTu3fvVm5ursvaNmrUSN26dWNtA9yxY8ckSU2bNpUkbd68WcXFxS5r2a5dO5177rmsZQBzOBx6++23VVBQoJSUFNYxSI0dO1bXXnuty7pJ/HcZbH744Qe1bt1a559/vkaOHKm9e/dKCux1DLf0tweRw4cPy+FwKC4uzuV4XFycduzYYdGs4Au5ubmS5HZtnecQeEpKSpSenq6rrrpKl156qSRzLSMjI9W4cWOXsaxlYNq2bZtSUlJ06tQpNWjQQMuWLVOHDh20detW1jHIvP3229qyZYu+/PLLcuf47zJ4dOvWTQsWLNDFF1+sAwcOaPLkyerZs6e+/fbbgF5HwiyAoDR27Fh9++23LvVcCC4XX3yxtm7dqmPHjmnJkiUaPXq01q5da/W0UEXZ2dkaP368MjMzFR0dbfV0UAODBg0qfd+xY0d169ZNbdq00TvvvKN69epZOLOKUWbgpebNm8tut5d7ai8vL08tW7a0aFbwBef6sbbBY9y4cfr3v/+tNWvWKCEhofR4y5YtVVRUpKNHj7qMZy0DU2RkpNq2bavOnTtrypQpSk5O1nPPPcc6BpnNmzfr4MGDuvzyyxUeHq7w8HCtXbtWzz//vMLDwxUXF8d6BqnGjRvroosu0q5duwL6v0vCrJciIyPVuXNnrV69uvRYSUmJVq9erZSUFAtnhpo677zz1LJlS5e1zc/P1xdffMHaBhjDMDRu3DgtW7ZMH3/8sc477zyX8507d1ZERITLWu7cuVN79+5lLYNASUmJCgsLWccg07dvX23btk1bt24t/enSpYtGjhxZ+p71DE4nTpzQjz/+qFatWgX0f5eUGVRBRkaGRo8erS5duqhr166aOXOmCgoKlJaWZvXUUIkTJ05o165dpZ93796trVu3qmnTpjr33HOVnp6uJ554QhdeeKHOO+88PfLII2rdurWGDBli3aRRztixY7Vw4UItX75cDRs2LK3TatSokerVq6dGjRrp9ttvV0ZGhpo2barY2Fjdd999SklJUffu3S2ePcqaMGGCBg0apHPPPVfHjx/XwoULlZWVpZUrV7KOQaZhw4aldetO9evXV7NmzUqPs57B4cEHH9R1112nNm3aKCcnR5MmTZLdbteIESMC+79LS3spBKEXXnjBOPfcc43IyEija9euxueff271lOCFNWvWGJLK/YwePdowDLM91yOPPGLExcUZUVFRRt++fY2dO3daO2mU424NJRmvvfZa6Zhff/3VGDNmjNGkSRMjJibGuOGGG4wDBw5YN2m49Yc//MFo06aNERkZabRo0cLo27evsWrVqtLzrGNwK9uayzBYz2AxfPhwo1WrVkZkZKQRHx9vDB8+3Ni1a1fp+UBdR5thGIZFORoAAACoEWpmAQAAELQIswAAAAhahFkAAAAELcIsAAAAghZhFgAAAEGLMAsAAICgRZgFAABA0CLMAgAAIGgRZgGgjrLZbHrvvfesngYA1AhhFgAscNttt8lms5X7+d3vfmf11AAgqIRbPQEAqKt+97vf6bXXXnM5FhUVZdFsACA4cWcWACwSFRWlli1buvw0adJEklkCMHv2bA0aNEj16tXT+eefryVLlrh8f9u2bfrtb3+revXqqVmzZrrrrrt04sQJlzHz58/XJZdcoqioKLVq1Urjxo1zOX/48GHdcMMNiomJ0YUXXqj333+/dv9oAPAxwiwABKhHHnlEQ4cO1ddff62RI0fqpptu0nfffSdJKigo0MCBA9WkSRN9+eWXevfdd/XRRx+5hNXZs2dr7Nixuuuuu7Rt2za9//77atu2rcvvmDx5sm688UZ98803uuaaazRy5Ej9/PPPfv07AaAmbIZhGFZPAgDqmttuu03/+Mc/FB0d7XL84Ycf1sMPPyybzaZ77rlHs2fPLj3XvXt3XX755XrppZf0yiuv6M9//rOys7NVv359SdIHH3yg6667Tjk5OYqLi1N8fLzS0tL0xBNPuJ2DzWbT3/72Nz3++OOSzIDcoEEDffjhh9TuAgga1MwCgEX69OnjElYlqWnTpqXvU1JSXM6lpKRo69atkqTvvvtOycnJpUFWkq666iqVlJRo586dstlsysnJUd++fSucQ8eOHUvf169fX7GxsTp48GB1/yQA8DvCLABYpH79+uX+2d9X6tWr59W4iIgIl882m00lJSW1MSUAqBXUzAJAgPr888/LfW7fvr0kqX379vr6669VUFBQev6zzz5TWFiYLr74YjVs2FBJSUlavXq1X+cMAP7GnVkAsEhhYaFyc3NdjoWHh6t58+aSpHfffVddunRRjx499NZbb2njxo169dVXJUkjR47UpEmTNHr0aD366KM6dOiQ7rvvPt16662Ki4uTJD366KO65557dM4552jQoEE6fvy4PvvsM913333+/UMBoBYRZgHAIitWrFCrVq1cjl188cXasWOHJLPTwNtvv60xY8aoVatWWrRokTp06CBJiomJ0cqVKzV+/HhdccUViomJ0dChQzVjxozSa40ePVqnTp3Ss88+qwcffFDNmzfXsGHD/PcHAoAf0M0AAAKQzWbTsmXLNGTIEKunAgABjZpZAAAABC3CLAAAAIIWNbMAEICoAAMA73BnFgAAAEGLMAsAAICgRZgFAABA0CLMAgAAIGgRZgEAABC0CLMAAAAIWoRZAAAABC3CLAAAAILW/wdSh8yRwOPpZAAAAABJRU5ErkJggg==\n" }, "metadata": {} }, { "output_type": "stream", "name": "stdout", "text": [ "Total execution time: 908.36 seconds\n" ] } ], "source": [ "import torch # ACTIVATION FUNCTION testing using ReLU, fixing all other aspects to default\n", "import torch.nn as nn\n", "import torch.nn.init as init\n", "from torch.utils.data import DataLoader\n", "import torchvision\n", "import torchvision.transforms as transforms\n", "import matplotlib.pyplot as plt\n", "import time\n", "overall_start_time = time.time()\n", "\n", "model = nn.Sequential(\n", " nn.Linear(784, 196), # Input layer starting with number of pixels\n", " nn.ReLU(), # ReLU Activation\n", " nn.Linear(196, 49), # Hidden layer 1\n", " nn.ReLU(), # ReLU Activation again\n", " nn.Linear(49, 10), # Hidden layer 2\n", "\n", ")\n", "\n", "for layer in model.modules():\n", " if isinstance(layer, nn.Linear):\n", " init.kaiming_uniform_(layer.weight, nonlinearity='relu')\n", " if layer.bias is not None:\n", " init.zeros_(layer.bias)\n", "transform = transforms.Compose([\n", " transforms.ToTensor(),\n", " transforms.Normalize((0.5,), (0.5,)) #\n", "])\n", "\n", "train_dataset = torchvision.datasets.FashionMNIST(root='./data', train=True, download=True, transform=transform)\n", "test_dataset = torchvision.datasets.FashionMNIST(root='./data', train=False, download=True, transform=transform)\n", "train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)\n", "test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)\n", "\n", "optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # Adam optimization\n", "scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)\n", "loss_fn = nn.CrossEntropyLoss() # loss function\n", "\n", "num_epochs = 50\n", "loss_values = []\n", "for epoch in range(num_epochs):\n", " model.train()\n", " running_loss = 0.0\n", " for batch_idx, (images, labels) in enumerate(train_loader):\n", " images = images.view(-1, 784)\n", " optimizer.zero_grad()\n", " outputs = model(images)\n", " loss = loss_fn(outputs, labels)\n", " loss.backward()\n", " optimizer.step()\n", " running_loss += loss.item()\n", "\n", " avg_train_loss = running_loss / len(train_loader) # Calculate the average training loss\n", " loss_values.append(avg_train_loss)\n", " print(f'Epoch {epoch+1}/{num_epochs} \\t\\t Training Loss: {avg_train_loss:.6f}')\n", "\n", "print(f\"Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(train_loader):.4f}\") # average loss\n", "\n", "plt.figure(figsize=(8, 6)) # start plotting\n", "plt.plot(range(1, num_epochs + 1), loss_values, marker='o', linestyle='-', color='b')\n", "plt.title('Loss Graph')\n", "plt.xlabel('Epoch')\n", "plt.ylabel('Loss')\n", "plt.grid(True)\n", "plt.show()\n", "\n", "end_time = time.time()\n", "overall_time = end_time - overall_start_time\n", "print(f\"Total execution time: {overall_time:.2f} seconds\")\n" ] }, { "cell_type": "code", "source": [], "metadata": { "id": "FU1g4PYVJrmh" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "outputId": "a4738615-c572-417c-fe9f-0639b8f3e753", "id": "ilmFt3JBth1c" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Epoch 1/50 \t\t Training Loss: 0.623159\n", "Epoch 2/50 \t\t Training Loss: 0.396762\n", "Epoch 3/50 \t\t Training Loss: 0.352551\n", "Epoch 4/50 \t\t Training Loss: 0.322918\n", "Epoch 5/50 \t\t Training Loss: 0.303704\n", "Epoch 6/50 \t\t Training Loss: 0.287201\n", "Epoch 7/50 \t\t Training Loss: 0.272715\n", "Epoch 8/50 \t\t Training Loss: 0.258582\n", "Epoch 9/50 \t\t Training Loss: 0.250206\n", "Epoch 10/50 \t\t Training Loss: 0.237603\n", "Epoch 11/50 \t\t Training Loss: 0.227341\n", "Epoch 12/50 \t\t Training Loss: 0.218387\n", "Epoch 13/50 \t\t Training Loss: 0.210624\n", "Epoch 14/50 \t\t Training Loss: 0.199665\n", "Epoch 15/50 \t\t Training Loss: 0.195412\n", "Epoch 16/50 \t\t Training Loss: 0.186863\n", "Epoch 17/50 \t\t Training Loss: 0.179738\n", "Epoch 18/50 \t\t Training Loss: 0.170803\n", "Epoch 19/50 \t\t Training Loss: 0.165805\n", "Epoch 20/50 \t\t Training Loss: 0.160489\n", "Epoch 21/50 \t\t Training Loss: 0.154385\n", "Epoch 22/50 \t\t Training Loss: 0.147301\n", "Epoch 23/50 \t\t Training Loss: 0.142705\n", "Epoch 24/50 \t\t Training Loss: 0.137471\n", "Epoch 25/50 \t\t Training Loss: 0.132235\n", "Epoch 26/50 \t\t Training Loss: 0.128126\n", "Epoch 27/50 \t\t Training Loss: 0.123801\n", "Epoch 28/50 \t\t Training Loss: 0.118205\n", "Epoch 29/50 \t\t Training Loss: 0.115828\n", "Epoch 30/50 \t\t Training Loss: 0.108330\n", "Epoch 31/50 \t\t Training Loss: 0.107677\n", "Epoch 32/50 \t\t Training Loss: 0.104144\n", "Epoch 33/50 \t\t Training Loss: 0.099967\n", "Epoch 34/50 \t\t Training Loss: 0.093658\n", "Epoch 35/50 \t\t Training Loss: 0.089677\n", "Epoch 36/50 \t\t Training Loss: 0.090638\n", "Epoch 37/50 \t\t Training Loss: 0.084376\n", "Epoch 38/50 \t\t Training Loss: 0.081376\n", "Epoch 39/50 \t\t Training Loss: 0.083408\n", "Epoch 40/50 \t\t Training Loss: 0.075313\n", "Epoch 41/50 \t\t Training Loss: 0.078010\n", "Epoch 42/50 \t\t Training Loss: 0.070882\n", "Epoch 43/50 \t\t Training Loss: 0.070870\n", "Epoch 44/50 \t\t Training Loss: 0.069621\n", "Epoch 45/50 \t\t Training Loss: 0.066462\n", "Epoch 46/50 \t\t Training Loss: 0.063896\n", "Epoch 47/50 \t\t Training Loss: 0.061813\n", "Epoch 48/50 \t\t Training Loss: 0.059683\n", "Epoch 49/50 \t\t Training Loss: 0.060118\n", "Epoch 50/50 \t\t Training Loss: 0.055209\n", "Epoch [50/50], Loss: 0.0552\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "<Figure size 800x600 with 1 Axes>" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAAArMAAAIjCAYAAAAQgZNYAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABRrElEQVR4nO3de3hU1b3G8XdyJ4FwEQghiQS8AVpAQSBVBAoB0XohULlZaFqpArHQHKtFC4hgEVTEVhQVUWtBEQpqWwQiEryAIiCKlItYECSEixgCiSQh2eeP3QkZMklmJpPZM5Pv53nyJLP3nj0rXc3pexa//Vs2wzAMAQAAAAEoxOoBAAAAAJ4izAIAACBgEWYBAAAQsAizAAAACFiEWQAAAAQswiwAAAACFmEWAAAAAYswCwAAgIBFmAUAAEDAIswCAOpEdna2bDabli9fbvVQAAQxwiwAXOCVV16RzWbTli1brB6KS7788kulp6erbdu2ioqKUsOGDdWlSxfdf//9+u9//2v18ACgToVZPQAAgOdefPFFjRs3Ts2bN9eoUaPUvn17nTt3Tl999ZX+9re/ad68efrxxx8VGhpq9VABoE4QZgEgQG3cuFHjxo3Tddddp3/9619q1KiRw/knn3xSjz76aI33KSwsVHR0dF0NEwDqFGUGAOChzz//XIMGDVJsbKwaNmyofv366ZNPPnG4pqSkRNOnT9dll12mqKgoXXTRRbr++uuVlZVVfk1ubq7S09OVmJioyMhIxcfH67bbbtOBAweq/fzp06fLZrNp8eLFlYKsJEVFRWnGjBkOq7J9+vTRVVddpa1bt+qGG25QdHS0HnzwQUnS22+/rZtvvlmtW7dWZGSkLrnkEs2YMUOlpaUO9614j5/+9Kdq0KCB2rZtqwULFjgdZ1lZmR599FElJiYqKipK/fr10759+6r93QDAVazMAoAHdu7cqV69eik2Nlb333+/wsPD9fzzz6tPnz7asGGDevToIUl6+OGHNWvWLN11113q3r278vPztWXLFm3btk2pqamSpCFDhmjnzp269957lZycrGPHjikrK0sHDx5UcnKy088vLCzU+++/rz59+igxMdGtsX///fcaNGiQhg8frjvvvFNxcXGSzFrhhg0bKjMzUw0bNtT777+vqVOnKj8/X48//rjDPX744QfddNNNuuOOOzRixAi9+eabGjdunCIiIvTrX//a4drHHntMISEhuu+++3Tq1CnNmTNHo0aN0qeffurWuAHAKQMA4ODll182JBmfffZZldfcfvvtRkREhPHNN9+UH8vJyTEaNWpk3HDDDeXHOnfubNx8881V3ueHH34wJBmPP/64W2P84osvDEnGpEmTKp37/vvvjePHj5d/FRUVlZ/r3bu3IclYsGBBpfcVFhZWOnb33Xcb0dHRxtmzZyvd48knnyw/VlRUZHTp0sVo2bKlUVxcbBiGYaxfv96QZHTo0MFhDE8//bQhydixY4dbvzMAOEOZAQC4qbS0VGvXrtXtt9+udu3alR+Pj4/XyJEj9dFHHyk/P1+S1KRJE+3cuVNff/2103s1aNBAERERys7O1g8//ODyGOz3b9iwYaVz7dq1U4sWLcq/3nnnHYfzkZGRSk9PdzoWu9OnT+vEiRPq1auXCgsLtXv3bodrw8LCdPfdd5e/joiI0N13361jx45p69atDtemp6crIiKi/HWvXr0kiU4LALyCMAsAbjp+/LgKCwt1xRVXVDrXoUMHlZWV6dChQ5KkRx55RHl5ebr88sv1k5/8RH/4wx/05Zdfll8fGRmp2bNn691331VcXJxuuOEGzZkzR7m5udWOwV4je+bMmUrn3n77bWVlZemJJ55w+t6EhASHcGm3c+dODR48WI0bN1ZsbKxatGihO++8U5J06tQph2tbt26tmJgYh2OXX365JFWq9b344osdXjdt2lSS3ArvAFAVwiwA1KEbbrhB33zzjRYtWqSrrrpKCxcu1DXXXKOFCxeWXzNp0iTt3btXs2bNUlRUlKZMmaIOHTro888/r/K+l156qcLCwvTVV19VOte7d2/1799fXbt2dfreiiuwdnl5eerdu7e++OILPfLII/rnP/+prKwszZ49W5L5EJenqmoLZhiGx/cEADvCLAC4qUWLFoqOjtaePXsqndu9e7dCQkKUlJRUfqxZs2ZKT0/X66+/rkOHDqlTp056+OGHHd53ySWX6P/+7/+0du1affXVVyouLtaTTz5Z5RhiYmLKHzY7fPhwrX+n7Oxsff/993rllVc0ceJE/fznP1f//v3LV1EvlJOTo4KCAodje/fulaQqH1oDgLpAmAUAN4WGhmrAgAF6++23Hf5J/ejRo1qyZImuv/56xcbGSjI7B1TUsGFDXXrppSoqKpJkdiU4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dO6cNH261aMDAADwHY9WZm+77TalpaXpnnvuUV5ennr06KHw8HCdOHFCc+fO1bhx47w9TlwgNNQMsHYNGkgpKdIrr0j33y9dcYVVIwMAAPAdj1Zmt23bpl7/e8po+fLliouL07fffqu//e1v+stf/uLVAcI1PXtKt94qlZVJU6ZYPRoAAADf8CjMFhYWqlGjRpKktWvXKi0tTSEhIerZs6e+/fZbrw4Qrps503wwbNkyads2q0cDAABQ9zwKs5deeqneeustHTp0SGvWrNGAAQMkSceOHVNsbKxXBwjX/eQn0siR5s9/+pO1YwEAAPAFj8Ls1KlTdd999yk5OVndu3dXSkqKJHOV9uqrr/bqAOGe6dPNrgbvvsu2tgAAIPh5FGaHDh2qgwcPasuWLVqzZk358X79+umpp57y2uDgvksuke66y/z5wQfN3rMAAADByqMwK0mtWrXS1VdfrZycHH33v4an3bt3V/v27b02OHjmT3+SoqKkjz4yV2gBAACClUdhtqysTI888ogaN26sNm3aqE2bNmrSpIlmzJihsrIyb48RbkpIkO691/z5oYfMDgcAAADByKMw+9BDD+mZZ57RY489ps8//1yff/65/vznP+uvf/2rptAXyi888IDUqJG0fbu5YxgAAEAw8ijMvvrqq1q4cKHGjRunTp06qVOnTho/frxefPFFvfLKK14eIjxx0UXSffeZP0+ZYu4OBgAAEGw8CrMnT550Whvbvn17nTx5staDgnf8/vdS8+bS3r3Sq69aPRoAAADv8yjMdu7cWc8880yl488884w6depU60HBOxo1MjsaSNK0adLatdLrr0vZ2VJpqaVDAwAA8IowT940Z84c3XzzzXrvvffKe8xu2rRJhw4d0qpVq7w6QNTOuHHSo49Khw9LAweeP56YKD39tJSWZt3YAAAAasujldnevXtr7969Gjx4sPLy8pSXl6e0tDTt3LlTr732mrfHiFpYtUr6/vvKxw8floYOlVas8P2YAAAAvMWjlVlJat26tR599FGHY1988YVeeuklvfDCC7UeGGqvtFSaONH5OcOQbDZp0iTpttuk0FCfDg0AAMArPN40Af7vww+l/+1n4ZRhSIcOse0tAAAIXITZIHbkiHevAwAA8DeE2SAWH+/d6wAAAPyNWzWzaTU8+p6Xl1ebscDLevUyuxYcPmyWFDiT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q/+8quprJWpsAcAZwiwAeIErZQnt2pm1sa5YulQ6der8a2psAcA5ygwAwEtcKUtwte3XggXSokXSwIFS27bSX/9KD1sAcIYwCwBeVNOGDDXV19psUqNGUuvWZveDf/6z6ntVV2NbWlpzrS8ABAPKDADAh1xp+/Xyy9KuXdJXX0mjR1d/P2c1tpQkAKhPCLMA4GOutv268krpxhtdu+eECdKf/yzNnk3bLwD1C2UGAGABV9t+uVpj+5//SA89VPX5mtp+UZYAIFCxMgsAFnGl7ZcrW+u2amXuSHb99dV/XlVtvyhLABDICLMA4MdcqbGdP1+6915zhzFX3HOPNHOm9NlnZlkDZQkAAhlhFgD8nKs1tq6WJOzZI02ZInXvLg0b5ryrgv3YpElszgDAvxFmASAApKVJBw5I69dLS5aY3/fvd+wv60pJQny89Oyz0uDBUnS0VFZW9WdWVZbATmQA/AlhFgACRE01tq6UJDzzjDRunFk+sGCBa5/77bfnf6a+FoC/IcwCQBBxtSRBkpKSXLvnhAnS2LHSjBme1deykgugLtGaCwCCjKttv2rajUwy31NQIC1cWPXnVdf2a8UKaeJExwCcmGiuILMFLwBvYGUWAIKQK22/aipLsNmkN94w63MHDar+8+z1te+8cz4Yr1hBpwQAdY8wCwD1WE1lCUOHmmH4l790/X7Nmkk9epjvoVMCgLpGmQEA1HOulCW42vZLkvLypM2bq7+mYqeEPn08GTUAmAizAIDysoSq1FRfa7OZ5//zH+m//5VeesnclawmR444vi4tlTZssOmDDxIUE2NT375sqwugepQZAABq5Erbr3nzpIYNpU6dzD62rti2TSouNn+2t/1KTQ3T3LndlJoaVmPbLzolACDMAgBc4k7br5o2cLB74gnpkkuku+5y/2Exet4CkAizAAA3uLITmeRap4QxY8xa3O++M8sS3HlYjE4JAOyomQUAuKWm+lo7+0qusz6z8+aZ58+elR58UHrqqarvY39Y7MEHpa5dpago6Z57qg6/VfW8LS2tufcugMBDmAUA1JmaOiVERUnXXuvavebMce06Z50S2LwBCF6EWQBAnappJdfVtl/du5vh99Ahs7ShJr/+tXTLLVJYmLnye+FKrr0k4cJ6XwCBhTALALCUq22/Nm40g3F2tvmwV03276++PVh1JQkSZQlAoLD8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gwbp4osv1unTp7VkyRJlZ2drzZo1zGOAadSoUXndul1MTIwuuuii8uPMZ2C47777dMstt6hNmzbKycnRtGnTFBoaqhEjRvj336WlvRQC0F//+lfj4osvNiIiIozu3bsbn3zyidVDggvWr19vSKr0NWbMGMMwzPZcU6ZMMeLi4ozIyEijX79+xp49e6wdNCpxNoeSjJdffrn8mh9//NEYP3680bRpUyM6OtoYPHiwceTIEesGDad+/etfG23atDEiIiKMFi1aGP369TPWrl1bfp55DGwVW3MZBvMZKIYNG2bEx8cbERERRkJCgjFs2DBj37595ef9dR5thmEYFuVoAAAAoFaomQUAAEDAIswCAAAgYBFmAQAAELAIswAAAAhYhFkAAAAELMIsAAAAAhZhFgAAAAGLMAsAAICARZgFgHrKZrPprbfesnoYAFArhFkAsMCvfvUr2Wy2Sl833nij1UMDgIASZvUAAKC+uvHGG/Xyyy87HIuMjLRoNAAQmFiZBQCLREZGqlWrVg5fTZs2lWSWADz33HMaNGiQGjRooHbt2mn58uUO79+xY4d+9rOfqUGDBrrooov029/+VmfOnHG4ZtGiRbryyisVGRmp+Ph4ZWRkOJw/ceKEBg8erOjoaF122WV655136vaXBgAvI8wCgJ+aMmWKhgwZoi+++EKjRo3S8OHDtWvXLklSQUGBBg4cqKZNm+qzzz7TsmXL9N577zmE1eeee04TJkzQb3/7W+3YsUPvvPOOLr30UofPmD59uu644w59+eWXuummmzRq1CidPHnSp78nANSGzTAMw+pBAEB986tf/Up///vfFRUV5XD8wQcf1IMPPiibzaZ77rlHzz33XPm5nj176pprrtGzzz6rF198UQ888IAOHTqkmJgYSdKqVat0yy23KCcnR3FxcUpISFB6erpmzpzpdAw2m01/+tOfNGPGDElmQG7YsKHeffddancBBAxqZgHAIn379nUIq5LUrFmz8p9TUlIczqWkpGj79u2SpF27dqlz587lQVaSrrvuOpWVlWnPnj2y2WzKyclRv379qh1Dp06dyn+OiYlRbGysjh075umvBAA+R5gFAIvExMRU+md/b2nQoIFL14WHhzu8ttlsKisrq4shAUCdoGYWAPzUJ598Uul1hw4dJEkdOnTQF198oYKCgvLzH3/8sUJCQnTFFVeoUaNGSk5O1rp163w6ZgDwNVZmAcAiRUVFys3NdTgWFham5s2bS5KWLVumbt266frrr9fixYu1efNmvfTSS5KkUaNGadq0aRozZowefvhhHT9+XPfee69++ctfKi4uTpL08MMP65577lHLli01aNAgnT59Wh9//LHuvfde3/6iAFCHCLMAYJHVq1crPj7e4dgVV1yh3bt3SzI7DbzxxhsaP3684uPj9frrr6tjx46SpOjoaK1Zs0YTJ07Utddeq+joaA0ZMkRz584tv9eYMWN09uxZPfXUU7rvvvvUvHlzDR061He/IAD4AN0MAMAP2Ww2rVy5UrfffrvVQwEAv0bNLAAAAAIWYRYAAAABi5pZAPBDVIABgGtYmQUAAEDAIswCAAAgYBFmAQAAELAIswAAAAhYhFkAAAAELMIsAAAAAhZhFgAAAAGLMAsAAICA9f+Q9RiELxBecgAAAABJRU5ErkJggg==\n" }, "metadata": {} }, { "output_type": "stream", "name": "stdout", "text": [ "Total execution time: 886.70 seconds\n" ] } ], "source": [ "import torch # ACTIVATION FUNCTION testing using the sigmoid funciton, fixing all other aspects to default\n", "import torch.nn as nn\n", "import torch.nn.init as init\n", "from torch.utils.data import DataLoader\n", "import torchvision\n", "import torchvision.transforms as transforms\n", "import matplotlib.pyplot as plt\n", "import time\n", "overall_start_time = time.time()\n", "\n", "model = nn.Sequential(\n", " nn.Linear(784, 196), # Input layer starting with number of pixels\n", " nn.Sigmoid(), # sigmoid Activation\n", " nn.Linear(196, 49), # Hidden layer 1\n", " nn.Sigmoid(), # sigmoid Activation again\n", " nn.Linear(49, 10), # Hidden layer 2\n", "\n", ")\n", "\n", "for layer in model.modules():\n", " if isinstance(layer, nn.Linear):\n", " init.kaiming_uniform_(layer.weight, nonlinearity='relu')\n", " if layer.bias is not None:\n", " init.zeros_(layer.bias)\n", "transform = transforms.Compose([\n", " transforms.ToTensor(),\n", " transforms.Normalize((0.5,), (0.5,)) #\n", "])\n", "\n", "train_dataset = torchvision.datasets.FashionMNIST(root='./data', train=True, download=True, transform=transform)\n", "test_dataset = torchvision.datasets.FashionMNIST(root='./data', train=False, download=True, transform=transform)\n", "train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)\n", "test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)\n", "\n", "optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # Adam optimization\n", "scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)\n", "loss_fn = nn.CrossEntropyLoss() # loss function\n", "\n", "num_epochs = 50\n", "loss_values = []\n", "for epoch in range(num_epochs):\n", " model.train()\n", " running_loss = 0.0\n", " for batch_idx, (images, labels) in enumerate(train_loader):\n", " images = images.view(-1, 784)\n", " optimizer.zero_grad()\n", " outputs = model(images)\n", " loss = loss_fn(outputs, labels)\n", " loss.backward()\n", " optimizer.step()\n", " running_loss += loss.item()\n", "\n", " avg_train_loss = running_loss / len(train_loader) # Calculate the average training loss\n", " loss_values.append(avg_train_loss)\n", " print(f'Epoch {epoch+1}/{num_epochs} \\t\\t Training Loss: {avg_train_loss:.6f}')\n", "\n", "print(f\"Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(train_loader):.4f}\") # average loss\n", "\n", "plt.figure(figsize=(8, 6)) # start plotting\n", "plt.plot(range(1, num_epochs + 1), loss_values, marker='o', linestyle='-', color='b')\n", "plt.title('Loss Graph')\n", "plt.xlabel('Epoch')\n", "plt.ylabel('Loss')\n", "plt.grid(True)\n", "plt.show()\n", "\n", "end_time = time.time()\n", "overall_time = end_time - overall_start_time\n", "print(f\"Total execution time: {overall_time:.2f} seconds\")\n" ] }, { "cell_type": "code", "source": [ "import torch # ACTIVATION FUNCTION testing using the Tanh funciton, fixing all other aspects to default\n", "import torch.nn as nn\n", "import torch.nn.init as init\n", "from torch.utils.data import DataLoader\n", "import torchvision\n", "import torchvision.transforms as transforms\n", "import matplotlib.pyplot as plt\n", "import time\n", "overall_start_time = time.time()\n", "\n", "model = nn.Sequential(\n", " nn.Linear(784, 196), # Input layer starting with number of pixels\n", " nn.Tanh(), # tanh Activation\n", " nn.Linear(196, 49), # Hidden layer 1\n", " nn.Tanh(), # tanh Activation again\n", " nn.Linear(49, 10), # Hidden layer 2\n", "\n", ")\n", "\n", "for layer in model.modules():\n", " if isinstance(layer, nn.Linear):\n", " init.kaiming_uniform_(layer.weight, nonlinearity='relu')\n", " if layer.bias is not None:\n", " init.zeros_(layer.bias)\n", "transform = transforms.Compose([\n", " transforms.ToTensor(),\n", " transforms.Normalize((0.5,), (0.5,)) #\n", "])\n", "\n", "train_dataset = torchvision.datasets.FashionMNIST(root='./data', train=True, download=True, transform=transform)\n", "test_dataset = torchvision.datasets.FashionMNIST(root='./data', train=False, download=True, transform=transform)\n", "train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)\n", "test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)\n", "\n", "optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # Adam optimization\n", "scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)\n", "loss_fn = nn.CrossEntropyLoss() # loss function\n", "\n", "num_epochs = 50\n", "loss_values = []\n", "for epoch in range(num_epochs):\n", " model.train()\n", " running_loss = 0.0\n", " for batch_idx, (images, labels) in enumerate(train_loader):\n", " images = images.view(-1, 784)\n", " optimizer.zero_grad()\n", " outputs = model(images)\n", " loss = loss_fn(outputs, labels)\n", " loss.backward()\n", " optimizer.step()\n", " running_loss += loss.item()\n", "\n", " avg_train_loss = running_loss / len(train_loader) # Calculate the average training loss\n", " loss_values.append(avg_train_loss)\n", " print(f'Epoch {epoch+1}/{num_epochs} \\t\\t Training Loss: {avg_train_loss:.6f}')\n", "\n", "print(f\"Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(train_loader):.4f}\") # average loss\n", "\n", "plt.figure(figsize=(8, 6)) # start plotting\n", "plt.plot(range(1, num_epochs + 1), loss_values, marker='o', linestyle='-', color='b')\n", "plt.title('Loss Graph')\n", "plt.xlabel('Epoch')\n", "plt.ylabel('Loss')\n", "plt.grid(True)\n", "plt.show()\n", "\n", "end_time = time.time()\n", "overall_time = end_time - overall_start_time\n", "print(f\"Total execution time: {overall_time:.2f} seconds\")\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "id": "1I5IJVd1xcTZ", "outputId": "4a0c1417-c8d1-4e79-d0b0-4dfd5e44faaa" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Epoch 1/50 \t\t Training Loss: 0.489344\n", "Epoch 2/50 \t\t Training Loss: 0.374198\n", "Epoch 3/50 \t\t Training Loss: 0.342553\n", "Epoch 4/50 \t\t Training Loss: 0.327203\n", "Epoch 5/50 \t\t Training Loss: 0.310987\n", "Epoch 6/50 \t\t Training Loss: 0.303543\n", "Epoch 7/50 \t\t Training Loss: 0.289979\n", "Epoch 8/50 \t\t Training Loss: 0.279218\n", "Epoch 9/50 \t\t Training Loss: 0.274207\n", "Epoch 10/50 \t\t Training Loss: 0.268549\n", "Epoch 11/50 \t\t Training Loss: 0.261003\n", "Epoch 12/50 \t\t Training Loss: 0.255821\n", "Epoch 13/50 \t\t Training Loss: 0.244163\n", "Epoch 14/50 \t\t Training Loss: 0.241616\n", "Epoch 15/50 \t\t Training Loss: 0.234600\n", "Epoch 16/50 \t\t Training Loss: 0.229219\n", "Epoch 17/50 \t\t Training Loss: 0.223256\n", "Epoch 18/50 \t\t Training Loss: 0.221670\n", "Epoch 19/50 \t\t Training Loss: 0.211989\n", "Epoch 20/50 \t\t Training Loss: 0.209460\n", "Epoch 21/50 \t\t Training Loss: 0.203153\n", "Epoch 22/50 \t\t Training Loss: 0.201925\n", "Epoch 23/50 \t\t Training Loss: 0.197228\n", "Epoch 24/50 \t\t Training Loss: 0.194760\n", "Epoch 25/50 \t\t Training Loss: 0.190140\n", "Epoch 26/50 \t\t Training Loss: 0.186677\n", "Epoch 27/50 \t\t Training Loss: 0.180780\n", "Epoch 28/50 \t\t Training Loss: 0.176782\n", "Epoch 29/50 \t\t Training Loss: 0.172914\n", "Epoch 30/50 \t\t Training Loss: 0.176152\n", "Epoch 31/50 \t\t Training Loss: 0.164171\n", "Epoch 32/50 \t\t Training Loss: 0.166515\n", "Epoch 33/50 \t\t Training Loss: 0.166046\n", "Epoch 34/50 \t\t Training Loss: 0.160712\n", "Epoch 35/50 \t\t Training Loss: 0.160786\n", "Epoch 36/50 \t\t Training Loss: 0.151411\n", "Epoch 37/50 \t\t Training Loss: 0.154511\n", "Epoch 38/50 \t\t Training Loss: 0.147532\n", "Epoch 39/50 \t\t Training Loss: 0.145198\n", "Epoch 40/50 \t\t Training Loss: 0.143228\n", "Epoch 41/50 \t\t Training Loss: 0.140657\n", "Epoch 42/50 \t\t Training Loss: 0.139764\n", "Epoch 43/50 \t\t Training Loss: 0.138779\n", "Epoch 44/50 \t\t Training Loss: 0.134543\n", "Epoch 45/50 \t\t Training Loss: 0.130844\n", "Epoch 46/50 \t\t Training Loss: 0.131181\n", "Epoch 47/50 \t\t Training Loss: 0.129612\n", "Epoch 48/50 \t\t Training Loss: 0.124115\n", "Epoch 49/50 \t\t Training Loss: 0.121498\n", "Epoch 50/50 \t\t Training Loss: 0.124173\n", "Epoch [50/50], Loss: 0.1242\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "<Figure size 800x600 with 1 Axes>" ], "image/png": "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+vbbb/0zWFQqKytLv/zlL9WkSRO1bt1aw4cP186dO93anDlzRhMmTFDLli3VuHFjjRgxQgUFBX4aMSryzDPPqEuXLq4i9r169dL777/vus88Bq9HHnlENptNkyZNcl1jPoPDjBkzZLPZ3B6dOnVy3Q/UeSTg9bFly5YpMzNT06dP19atW9W1a1cNHjxYR44c8ffQUIni4mJ17dpVCxYs8Hh/7ty5mj9/vhYuXKhNmzapUaNGGjx4sM6cOVPPI0VV1q9frwkTJuiTTz5RTk6OSktLNWjQIBUXF7va/OEPf9A777yjN954Q+vXr9ehQ4eUlpbmx1HDk8TERD3yyCPasmWLPvvsM91www0aNmyYtm/fLol5DFaffvqpnn32WXXp0sXtOvMZPK644godPnzY9di4caPrXsDOowGf6tGjhzFhwgTXe4fDYbRp08bIysry46hQHZKMN9980/W+rKzMiIuLMx577DHXtcLCQiMiIsJYsmSJH0aI6jhy5IghyVi/fr1hGObchYWFGW+88YarzTfffGNIMvLy8vw1THipefPmxvPPP888BqmTJ08al1xyiZGTk2P07dvXmDhxomEY/F0Gk+nTpxtdu3b1eC+Q55EVXh86e/astmzZotTUVNe1kJAQpaamKi8vz48jQ23s2bNH+fn5bvPatGlT9ezZk3kNAidOnJAktWjRQpK0ZcsWlZaWus1np06ddPHFFzOfAczhcGjp0qUqLi5Wr169mMcgNWHCBP3qV79ymzeJv8tg8+2336pNmzZq3769brvtNu3bt09SYM9jqF+/3WKOHTsmh8Oh2NhYt+uxsbHasWOHn0aF2srPz5ckj/PqvIfAVFZWpkmTJum6667TlVdeKcmcz/DwcDVr1sytLfMZmL766iv16tVLZ86cUePGjfXmm2+qc+fO2rZtG/MYZJYuXaqtW7fq008/LXePv8vg0bNnT7300ku67LLLdPjwYc2cOVN9+vTR119/HdDzSMALwLImTJigr7/+2i2/DMHlsssu07Zt23TixAktX75c48eP1/r16/09LFTT/v37NXHiROXk5CgyMtLfw0EtDB061PW6S5cu6tmzp9q2bat//OMfioqK8uPIKkdKgw+1atVKdru93G7EgoICxcXF+WlUqC3n3DGvwSUjI0Pvvvuu1q1bp8TERNf1uLg4nT17VoWFhW7tmc/AFB4ero4dO6pbt27KyspS165d9eSTTzKPQWbLli06cuSIrr76aoWGhio0NFTr16/X/PnzFRoaqtjYWOYzSDVr1kyXXnqpdu3aFdB/lwS8PhQeHq5u3bpp7dq1rmtlZWVau3atevXq5ceRoTbatWunuLg4t3ktKirSpk2bmNcAZBiGMjIy9Oabb+rDDz9Uu3bt3O5369ZNYWFhbvO5c+dO7du3j/kMAmVlZSopKWEeg8yAAQP01Vdfadu2ba5H9+7dddttt7leM5/B6dSpU9q9e7fi4+MD+u+SlAYfy8zM1Pjx49W9e3f16NFD2dnZKi4uVnp6ur+HhkqcOnVKu3btcr3fs2ePtm3bphYtWujiiy/WpEmTNGfOHF1yySVq166dpk6dqjZt2mj48OH+GzQ8mjBhghYvXqy33npLTZo0ceWNNW3aVFFRUWratKnuvPNOZWZmqkWLFoqJidH999+vXr166ZprrvHz6HG+KVOmaOjQobr44ot18uRJLV68WLm5uVq9ejXzGGSaNGniyqN3atSokVq2bOm6znwGhwceeEA33XST2rZtq0OHDmn69Omy2+0aM2ZMYP9d+rVGhEX97W9/My6++GIjPDzc6NGjh/HJJ5/4e0iowrp16wxJ5R7jx483DMMsTTZ16lQjNjbWiIiIMAYMGGDs3LnTv4OGR57mUZLx4osvutr89NNPxn333Wc0b97ciI6ONm655Rbj8OHD/hs0PLrjjjuMtm3bGuHh4cZFF11kDBgwwFizZo3rPvMY3M4vS2YYzGewGDVqlBEfH2+Eh4cbCQkJxqhRo4xdu3a57gfqPNoMwzD8FGsDAAAAdY4cXgAAAFgaAS8AAAAsjYAXAAAAlkbACwAAAEsj4AUAAIClEfACAADA0gh4AQAAYGkEvAAAALA0Al4AQIVsNptWrlzp72EAQK0Q8AJAgLr99ttls9nKPYYMGeLvoQFAUAn19wAAABUbMmSIXnzxRbdrERERfhoNAAQnVngBIIBFREQoLi7O7dG8eXNJZrrBM888o6FDhyoqKkrt27fX8uXL3T7/1Vdf6YYbblBUVJRatmypu+++W6dOnXJrs2jRIl1xxRWKiIhQfHy8MjIy3O4fO3ZMt9xyi6Kjo3XJJZfo7bffrtsfDQA+RsALAEFs6tSpGjFihL744gvddtttGj16tL755htJUnFxsQYPHqzmzZvr008/1RtvvKEPPvjALaB95plnNGHCBN1999366quv9Pbbb6tjx45u3zFz5kzdeuut+vLLL3XjjTfqtttu0w8//FCvvxMAasNmGIbh70EAAMq7/fbb9dprrykyMtLt+oMPPqgHH3xQNptNv//97/XMM8+47l1zzTW6+uqr9fTTT+u5557Tn//8Z+3fv1+NGjWSJL333nu66aabdOjQIcXGxiohIUHp6emaM2eOxzHYbDY9/PDDmj17tiQziG7cuLHef/99cokBBA1yeAEggPXv398toJWkFi1auF736tXL7V6vXr20bds2SdI333yjrl27uoJdSbruuutUVlamnTt3ymaz6dChQxowYEClY+jSpYvrdaNGjRQTE6MjR47U9CcBQL0j4AWAANaoUaNyKQa+EhUV5VW7sLAwt/c2m01lZWV1MSQAqBPk8AJAEPvkk0/Kvb/88sslSZdffrm++OILFRcXu+7/61//UkhIiC677DI1adJEycnJWrt2bb2OGQDqGyu8ABDASkpKlJ+f73YtNDRUrVq1kiS98cYb6t69u3r37q3XX39dmzdv1gsvvCBJuu222zR9+nSNHz9eM2bM0NGjR3X//ffrt7/9rWJjYyVJM2bM0O9//3u1bt1aQ4cO1cmTJ/Wvf/1L999/f/3+UACoQwS8ABDAVq1apfj4eLdrl112mXbs2CHJrKCwdOlS3XfffYqPj9eSJUvUuXNnSVJ0dLRWr16tiRMn6pe//KWio6M1YsQIzZs3z9XX+PHjdebMGf31r3/VAw88oFatWmnkyJH19wMBoB5QpQEAgpTNZtObb76p4cOH+3soABDQyOEFAACApRHwAgAAwNLI4QWAIEVGGgB4hxVeAAAAWBoBLwAAACyNgBcAAACWRsALAAAASyPgBQAAgKUR8AIAAMDSCHgBAABgaQS8AAAAsLT/HxINYaLw5rSxAAAAAElFTkSuQmCC\n" }, "metadata": {} }, { "output_type": "stream", "name": "stdout", "text": [ "Total execution time: 885.05 seconds\n" ] } ] }, { "cell_type": "code", "source": [ "import torch # ACTIVATION FUNCTION testing using the leaky ReLU funciton, fixing all other aspects to default\n", "import torch.nn as nn\n", "import torch.nn.init as init\n", "from torch.utils.data import DataLoader\n", "import torchvision\n", "import torchvision.transforms as transforms\n", "import matplotlib.pyplot as plt\n", "import time\n", "overall_start_time = time.time()\n", "\n", "model = nn.Sequential(\n", " nn.Linear(784, 196), # Input layer starting with number of pixels\n", " nn.LeakyReLU(), # leaky relu Activation\n", " nn.Linear(196, 49), # Hidden layer 1\n", " nn.LeakyReLU(), # leaky relu Activation again\n", " nn.Linear(49, 10), # Hidden layer 2\n", "\n", ")\n", "\n", "for layer in model.modules():\n", " if isinstance(layer, nn.Linear):\n", " init.kaiming_uniform_(layer.weight, nonlinearity='relu')\n", " if layer.bias is not None:\n", " init.zeros_(layer.bias)\n", "transform = transforms.Compose([\n", " transforms.ToTensor(),\n", " transforms.Normalize((0.5,), (0.5,)) #\n", "])\n", "\n", "train_dataset = torchvision.datasets.FashionMNIST(root='./data', train=True, download=True, transform=transform)\n", "test_dataset = torchvision.datasets.FashionMNIST(root='./data', train=False, download=True, transform=transform)\n", "train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)\n", "test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)\n", "\n", "optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # Adam optimization\n", "scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)\n", "loss_fn = nn.CrossEntropyLoss() # loss function\n", "\n", "num_epochs = 50\n", "loss_values = []\n", "for epoch in range(num_epochs):\n", " model.train()\n", " running_loss = 0.0\n", " for batch_idx, (images, labels) in enumerate(train_loader):\n", " images = images.view(-1, 784)\n", " optimizer.zero_grad()\n", " outputs = model(images)\n", " loss = loss_fn(outputs, labels)\n", " loss.backward()\n", " optimizer.step()\n", " running_loss += loss.item()\n", "\n", " avg_train_loss = running_loss / len(train_loader) # Calculate the average training loss\n", " loss_values.append(avg_train_loss)\n", " print(f'Epoch {epoch+1}/{num_epochs} \\t\\t Training Loss: {avg_train_loss:.6f}')\n", "\n", "print(f\"Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(train_loader):.4f}\") # average loss\n", "\n", "plt.figure(figsize=(8, 6)) # start plotting\n", "plt.plot(range(1, num_epochs + 1), loss_values, marker='o', linestyle='-', color='b')\n", "plt.title('Loss Graph')\n", "plt.xlabel('Epoch')\n", "plt.ylabel('Loss')\n", "plt.grid(True)\n", "plt.show()\n", "\n", "end_time = time.time()\n", "overall_time = end_time - overall_start_time\n", "print(f\"Total execution time: {overall_time:.2f} seconds\")\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "id": "5U4jBxK23WE6", "outputId": "f55c0e82-4b2d-47c9-e72d-14599166fbd9" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Epoch 1/50 \t\t Training Loss: 0.486430\n", "Epoch 2/50 \t\t Training Loss: 0.372871\n", "Epoch 3/50 \t\t Training Loss: 0.334890\n", "Epoch 4/50 \t\t Training Loss: 0.313318\n", "Epoch 5/50 \t\t Training Loss: 0.296438\n", "Epoch 6/50 \t\t Training Loss: 0.278528\n", "Epoch 7/50 \t\t Training Loss: 0.267184\n", "Epoch 8/50 \t\t Training Loss: 0.252480\n", "Epoch 9/50 \t\t Training Loss: 0.243217\n", "Epoch 10/50 \t\t Training Loss: 0.233004\n", "Epoch 11/50 \t\t Training Loss: 0.226090\n", "Epoch 12/50 \t\t Training Loss: 0.217958\n", "Epoch 13/50 \t\t Training Loss: 0.210301\n", "Epoch 14/50 \t\t Training Loss: 0.201226\n", "Epoch 15/50 \t\t Training Loss: 0.193952\n", "Epoch 16/50 \t\t Training Loss: 0.189236\n", "Epoch 17/50 \t\t Training Loss: 0.178933\n", "Epoch 18/50 \t\t Training Loss: 0.173359\n", "Epoch 19/50 \t\t Training Loss: 0.169976\n", "Epoch 20/50 \t\t Training Loss: 0.164831\n", "Epoch 21/50 \t\t Training Loss: 0.157632\n", "Epoch 22/50 \t\t Training Loss: 0.156691\n", "Epoch 23/50 \t\t Training Loss: 0.145726\n", "Epoch 24/50 \t\t Training Loss: 0.143349\n", "Epoch 25/50 \t\t Training Loss: 0.137836\n", "Epoch 26/50 \t\t Training Loss: 0.132540\n", "Epoch 27/50 \t\t Training Loss: 0.126585\n", "Epoch 28/50 \t\t Training Loss: 0.126027\n", "Epoch 29/50 \t\t Training Loss: 0.122825\n", "Epoch 30/50 \t\t Training Loss: 0.120335\n", "Epoch 31/50 \t\t Training Loss: 0.115261\n", "Epoch 32/50 \t\t Training Loss: 0.112070\n", "Epoch 33/50 \t\t Training Loss: 0.109565\n", "Epoch 34/50 \t\t Training Loss: 0.106597\n", "Epoch 35/50 \t\t Training Loss: 0.103671\n", "Epoch 36/50 \t\t Training Loss: 0.099289\n", "Epoch 37/50 \t\t Training Loss: 0.098280\n", "Epoch 38/50 \t\t Training Loss: 0.096868\n", "Epoch 39/50 \t\t Training Loss: 0.092858\n", "Epoch 40/50 \t\t Training Loss: 0.092839\n", "Epoch 41/50 \t\t Training Loss: 0.087239\n", "Epoch 42/50 \t\t Training Loss: 0.087515\n", "Epoch 43/50 \t\t Training Loss: 0.083235\n", "Epoch 44/50 \t\t Training Loss: 0.085039\n", "Epoch 45/50 \t\t Training Loss: 0.080943\n", "Epoch 46/50 \t\t Training Loss: 0.078993\n", "Epoch 47/50 \t\t Training Loss: 0.079606\n", "Epoch 48/50 \t\t Training Loss: 0.077269\n", "Epoch 49/50 \t\t Training Loss: 0.075369\n", "Epoch 50/50 \t\t Training Loss: 0.075574\n", "Epoch [50/50], Loss: 0.0756\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "<Figure size 800x600 with 1 Axes>" ], "image/png": "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J93GnHfeeWrYsGHZmIpMmDBBJSUluummmzyWG3hz59N19/T07xQVFemf//ynx/G//fab5s2b5zZ23rx5Ovvssyu8IwwAtYHWXABQgQULFmjFihXljo8dO1aPPvqoMjMz1b17d919990KDw/XvHnzVFhYqOnTp5eNbdeunXr27KlOnTqpadOm+uqrr7Rs2TKNGTNGknk3s3fv3rrhhhvUrl07hYeH66233tL+/ft14403Vjq/1NRUPffcc7rnnnt0/vnnl+0AVlRUpO+//16LFi1SZGSk4uLiqvxbr7jiCjVp0kSjRo3SX//6VzkcDr366qsVBuKEhAQ98cQT2rVrly644AItXbpUmzdv1vPPP6+IiIgqfx8A+Iy9zRQAIPC4WnNV9JOTk2MYhmFs2rTJ6N+/v9GgQQMjJibG6NWrl7Fu3Tq3az366KNGly5djLPOOsuoV6+e0aZNG+Oxxx4ra1916NAhY/To0UabNm2M+vXrG40bNza6du1qvPHGG5bn+/XXXxsjR440WrRoYURGRhr169c32rdvb/z97383fvzxR7exPXr0MC666CKP1/nss8+Myy+/3KhXr56RkJBg3H///cZHH31kSDKysrLKXeOrr74yunXrZkRHRxstW7Y0nnvuObfruVpzvfnmm27Hd+7caUgyXnrpJct/IwBUxGEYVOADAKzr2bOnDh065PHhMwDwN2pmAQAAELQIswAAAAhahFkAAAAELWpmAQAAELS4MwsAAICgRZgFAABA0KpzmyaUlpYqNzdXDRs2lMPhsHs6AAAAOINhGDp27JgSEhIUFlb5vdc6F2Zzc3Pd9kwHAABAYMrJyVFSUlKlY+pcmG3YsKEk8384rr3TvVVcXKyVK1eqX79+bNsY5FjL0MFahg7WMnSwlqHD32uZn5+v5OTkstxWmToXZl2lBY0aNapRmI2JiVGjRo34xxnkWMvQwVqGDtYydLCWocOutbRSEhoQD4DNnj1bKSkpio6OVteuXbVhw4YKxy5cuFAOh8PtJzo62o+zBQAAQKCwPcwuXbpUGRkZmjhxojZt2qQOHTqof//+OnDgQIXfadSokfbt21f289NPP/lxxgAAAAgUtofZGTNm6LbbblN6erratWunuXPnKiYmRgsWLKjwOw6HQ3FxcWU/sbGxfpwxAAAAAoWtNbNFRUXauHGjxo8fX3YsLCxM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zXT77bfr+PHjbmMWLFigiy66SFFRUYqPj9eYMWPczh86dEiDBw9WTEyMzj//fL377ru1+0cDgI8RZgEgQD388MO6/vrr9c0332jEiBG68cYb9d1330mSCgoK1L9/fzVp0kRffvml3nzzTX388cduYXXOnDkaPXq0br/9dm3ZskXvvvuuWrdu7fY7Jk+erBtuuEHffvutrrnmGo0YMUK//PKLX/9OAKgJh2EYht2TAIC65s9//rNee+01RUdHux1/8MEH9eCDD8rhcOjOO+/UnDlzys5dfvnluvTSS/XPf/5TL7zwgh544AHl5OSofv36kqQPPvhA1113nXJzcxUbG6vExESlp6fr0Ucf9TgHh8Oh//mf/9GUKVMkmQG5QYMG+vDDD6ndBRA0qJkFAJv06tXLLaxKUtOmTcved+vWze1ct27dtHnzZknSd999pw4dOpQFWUm68sorVVpaqh07dsjhcCg3N1e9e/eudA7t27cve1+/fn01atRIBw4cqO6fBAB+R5gFAJvUr1+/3H/295V69epZGhcREeH22eFwqLS0tDamBAC1gppZAAhQn3/+ebnPbdu2lSS1bdtW33zzjQoKCsrOf/bZZwoLC9OFF16ohg0bKiUlRatWrfLrnAHA37gzCwA2KSwsVF5entux8PBwNW/eXJL05ptvqnPnzurevbsWLVqkDRs26MUXX5QkjRgxQhMnTtSoUaM0adIkHTx4UPfcc49uvvlmxcbGSpImTZqkO++8U+ecc44GDBigY8eO6bPPPtM999zj3z8UAGoRYRYAbLJixQrFx8e7Hbvwwgu1fft2SWangddff11333234uPjtWTJErVr106SFBMTo48++khjx47VZZddppiYGF1//fWaMWNG2bVGjRqlkydP6plnntG9996r5s2ba8iQIf77AwHAD+hmAAAByOFw6K233tKgQYPsngoABDRqZgEAABC0CLMAAAAIWtTMAkAAogIMAKzhziwAAACCFmEWAAAAQYswCwAAgKBFmAUAAEDQIswCAAAgaBFmAQAAELQIswAAAAhahFkAAAAErf8P08y2WWdqL4cAAAAASUVORK5CYII=\n" }, "metadata": {} }, { "output_type": "stream", "name": "stdout", "text": [ "Total execution time: 880.00 seconds\n" ] } ] }, { "cell_type": "code", "source": [], "metadata": { "id": "BgK2a0uO7pWh" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "after testing activation functions, we can rank them based on loss as follows:\n", "least loss value: sigmoid activation: 0.0552\n", "- ReLU: 0.0700\n", "- leaky ReLU: 0.0756\n", "- highest loss value: tanh: 0.1242\n", "- the previous test showed that the best choice was sigmoid activation, and ReLU came in the second place, to fix one of them, well test both for the learning rates and watch their behaviour, then fix one of them for the next step\n", "the next parameter that will be tested will be the learning rate, the learning rates tested will be:\n", "-default (0.001 lr) which is already tested\n", "- 0.0001 lr\n", "- 0.01 lr\n", "-first, sigmoid with **0.0001** and **0.01**" ], "metadata": { "id": "dLU91WTIJNfd" } }, { "cell_type": "code", "source": [ "import torch # ACTIVATION FUNCTION testing using the sigmoid funciton, and learning rate of 0.0001\n", "import torch.nn as nn\n", "import torch.nn.init as init\n", "from torch.utils.data import DataLoader\n", "import torchvision\n", "import torchvision.transforms as transforms\n", "import matplotlib.pyplot as plt\n", "import time\n", "overall_start_time = time.time()\n", "\n", "model = nn.Sequential(\n", " nn.Linear(784, 196), # Input layer starting with number of pixels\n", " nn.Sigmoid(), # sigmoid Activation\n", " nn.Linear(196, 49), # Hidden layer 1\n", " nn.Sigmoid(), # sigmoid Activation again\n", " nn.Linear(49, 10), # Hidden layer 2\n", "\n", ")\n", "\n", "for layer in model.modules():\n", " if isinstance(layer, nn.Linear):\n", " init.kaiming_uniform_(layer.weight, nonlinearity='relu')\n", " if layer.bias is not None:\n", " init.zeros_(layer.bias)\n", "transform = transforms.Compose([\n", " transforms.ToTensor(),\n", " transforms.Normalize((0.5,), (0.5,)) #\n", "])\n", "\n", "train_dataset = torchvision.datasets.FashionMNIST(root='./data', train=True, download=True, transform=transform)\n", "test_dataset = torchvision.datasets.FashionMNIST(root='./data', train=False, download=True, transform=transform)\n", "train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)\n", "test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)\n", "\n", "optimizer = torch.optim.Adam(model.parameters(), lr=0.0001) # Adam optimization (0.0001 learning rate)\n", "scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)\n", "loss_fn = nn.CrossEntropyLoss() # loss function\n", "\n", "num_epochs = 50\n", "loss_values = []\n", "for epoch in range(num_epochs):\n", " model.train()\n", " running_loss = 0.0\n", " for batch_idx, (images, labels) in enumerate(train_loader):\n", " images = images.view(-1, 784)\n", " optimizer.zero_grad()\n", " outputs = model(images)\n", " loss = loss_fn(outputs, labels)\n", " loss.backward()\n", " optimizer.step()\n", " running_loss += loss.item()\n", "\n", " avg_train_loss = running_loss / len(train_loader) # Calculate the average training loss\n", " loss_values.append(avg_train_loss)\n", " print(f'Epoch {epoch+1}/{num_epochs} \\t\\t Training Loss: {avg_train_loss:.6f}')\n", "\n", "print(f\"Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(train_loader):.4f}\") # average loss\n", "\n", "plt.figure(figsize=(8, 6)) # start plotting\n", "plt.plot(range(1, num_epochs + 1), loss_values, marker='o', linestyle='-', color='b')\n", "plt.title('Loss Graph')\n", "plt.xlabel('Epoch')\n", "plt.ylabel('Loss')\n", "plt.grid(True)\n", "plt.show()\n", "\n", "end_time = time.time()\n", "overall_time = end_time - overall_start_time\n", "print(f\"Total execution time: {overall_time:.2f} seconds\")\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "id": "yb3giOybAb1A", "outputId": "607b8d20-2011-41fc-9be2-b61052c2adbe" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Epoch 1/50 \t\t Training Loss: 1.357750\n", "Epoch 2/50 \t\t Training Loss: 0.764527\n", "Epoch 3/50 \t\t Training Loss: 0.603403\n", "Epoch 4/50 \t\t Training Loss: 0.526284\n", "Epoch 5/50 \t\t Training Loss: 0.482179\n", "Epoch 6/50 \t\t Training Loss: 0.452608\n", "Epoch 7/50 \t\t Training Loss: 0.431605\n", "Epoch 8/50 \t\t Training Loss: 0.414913\n", "Epoch 9/50 \t\t Training Loss: 0.401807\n", "Epoch 10/50 \t\t Training Loss: 0.390342\n", "Epoch 11/50 \t\t Training Loss: 0.380848\n", "Epoch 12/50 \t\t Training Loss: 0.371898\n", "Epoch 13/50 \t\t Training Loss: 0.364814\n", "Epoch 14/50 \t\t Training Loss: 0.357774\n", "Epoch 15/50 \t\t Training Loss: 0.351222\n", "Epoch 16/50 \t\t Training Loss: 0.345146\n", "Epoch 17/50 \t\t Training Loss: 0.339950\n", "Epoch 18/50 \t\t Training Loss: 0.334707\n", "Epoch 19/50 \t\t Training Loss: 0.329543\n", "Epoch 20/50 \t\t Training Loss: 0.325263\n", "Epoch 21/50 \t\t Training Loss: 0.320493\n", "Epoch 22/50 \t\t Training Loss: 0.316247\n", "Epoch 23/50 \t\t Training Loss: 0.312365\n", "Epoch 24/50 \t\t Training Loss: 0.308048\n", "Epoch 25/50 \t\t Training Loss: 0.304240\n", "Epoch 26/50 \t\t Training Loss: 0.300261\n", "Epoch 27/50 \t\t Training Loss: 0.297047\n", "Epoch 28/50 \t\t Training Loss: 0.293359\n", "Epoch 29/50 \t\t Training Loss: 0.290109\n", "Epoch 30/50 \t\t Training Loss: 0.286644\n", "Epoch 31/50 \t\t Training Loss: 0.283765\n", "Epoch 32/50 \t\t Training Loss: 0.280418\n", "Epoch 33/50 \t\t Training Loss: 0.277742\n", "Epoch 34/50 \t\t Training Loss: 0.273979\n", "Epoch 35/50 \t\t Training Loss: 0.271113\n", "Epoch 36/50 \t\t Training Loss: 0.268754\n", "Epoch 37/50 \t\t Training Loss: 0.265765\n", "Epoch 38/50 \t\t Training Loss: 0.262827\n", "Epoch 39/50 \t\t Training Loss: 0.259958\n", "Epoch 40/50 \t\t Training Loss: 0.257680\n", "Epoch 41/50 \t\t Training Loss: 0.254693\n", "Epoch 42/50 \t\t Training Loss: 0.252112\n", "Epoch 43/50 \t\t Training Loss: 0.249682\n", "Epoch 44/50 \t\t Training Loss: 0.247091\n", "Epoch 45/50 \t\t Training Loss: 0.244643\n", "Epoch 46/50 \t\t Training Loss: 0.242264\n", "Epoch 47/50 \t\t Training Loss: 0.239826\n", "Epoch 48/50 \t\t Training Loss: 0.237778\n", "Epoch 49/50 \t\t Training Loss: 0.235158\n", "Epoch 50/50 \t\t Training Loss: 0.232688\n", "Epoch [50/50], Loss: 0.2327\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "<Figure size 800x600 with 1 Axes>" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAAArMAAAIjCAYAAAAQgZNYAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABNXElEQVR4nO3deXgUVdr+8buzdRIgyBoSCAY3FpGAMGBG2YSA6A9F5AUBhYnjDgpkfFVGZREVNxB9RRER0VFAQRQXFCISQEWRJQqOgCgMCGETMZBIEpL6/VHTDW227k6nq7vz/VxXrqSrT1WfzDO55p7DU6dshmEYAgAAAIJQmNUTAAAAALxFmAUAAEDQIswCAAAgaBFmAQAAELQIswAAAAhahFkAAAAELcIsAAAAghZhFgAAAEGLMAsAAICgRZgFAFSLrKws2Ww2LV682OqpAAhhhFkA+JN58+bJZrNpw4YNVk/FLd99953S09PVokULRUdHq3bt2mrfvr3uvfde/fzzz1ZPDwCqVYTVEwAAeO/ll1/WHXfcoYYNG2r48OFq1aqVTp06pa1bt+r111/XjBkz9Mcffyg8PNzqqQJAtSDMAkCQ+vLLL3XHHXfo0ksv1Ycffqg6deq4vD9t2jQ9+uijlV4nPz9fsbGx1TVNAKhWtBkAgJc2b96sfv36KS4uTrVr11avXr301VdfuYwpKirS5MmTdf755ys6OloNGjTQZZddpszMTOeYAwcOKD09Xc2aNZPdbldCQoKuueYa7d69u8LPnzx5smw2m958881SQVaSoqOjNWXKFJdV2R49eqht27bauHGjunXrptjYWP3zn/+UJC1dulRXXXWVEhMTZbfbde6552rKlCkqLi52ue6Z1/jrX/+qmJgYtWjRQrNmzSpzniUlJXr00UfVrFkzRUdHq1evXtq5c2eFvxsAuIuVWQDwwvfff6+uXbsqLi5O9957ryIjI/XSSy+pR48eWr16tbp06SJJmjRpkqZOnaqbb75ZnTt3Vm5urjZs2KBNmzYpLS1NknTdddfp+++/11133aXk5GQdOnRImZmZ2rNnj5KTk8v8/Pz8fH322Wfq0aOHmjVr5tHcf/31V/Xr10/XX3+9brjhBsXHx0sye4Vr166tjIwM1a5dW5999pkmTJig3NxcPfXUUy7X+O2333TllVdq8ODBGjp0qN5++23dcccdioqK0k033eQy9vHHH1dYWJjuuece/f7773ryySc1fPhwff311x7NGwDKZAAAXLz66quGJOObb74pd8yAAQOMqKgo46effnIe279/v1GnTh2jW7duzmMpKSnGVVddVe51fvvtN0OS8dRTT3k0x2+//daQZIwdO7bUe7/++qtx+PBh51dBQYHzve7duxuSjFmzZpU6Lz8/v9Sx2267zYiNjTVOnjxZ6hrTpk1zHisoKDDat29vNG7c2CgsLDQMwzBWrVplSDJat27tModnn33WkGRs2bLFo98ZAMpCmwEAeKi4uFgrVqzQgAEDdM455ziPJyQkaNiwYfr888+Vm5srSTrrrLP0/fff68cffyzzWjExMYqKilJWVpZ+++03t+fguH7t2rVLvXfOOeeoUaNGzq/333/f5X273a709PQy5+Jw/PhxHTlyRF27dlV+fr62bdvmMjYiIkK33Xab83VUVJRuu+02HTp0SBs3bnQZm56erqioKOfrrl27ShI7LQDwCcIsAHjo8OHDys/PV8uWLUu917p1a5WUlGjv3r2SpIcffljHjh3TBRdcoIsuukj/+7//q++++8453m6364knntDHH3+s+Ph4devWTU8++aQOHDhQ4RwcPbInTpwo9d7SpUuVmZmpp59+usxzmzZt6hIuHb7//ntde+21qlu3ruLi4tSoUSPdcMMNkqTff//dZWxiYqJq1arlcuyCCy6QpFK9vs2bN3d5Xa9ePUnyKLwDQHkIswBQjbp166affvpJc+fOVdu2bTVnzhxdfPHFmjNnjnPM2LFjtWPHDk2dOlXR0dF66KGH1Lp1a23evLnc65533nmKiIjQ1q1bS73XvXt39e7dWx07dizz3DNXYB2OHTum7t2769tvv9XDDz+sDz74QJmZmXriiSckmTdxeau8bcEMw/D6mgDgQJgFAA81atRIsbGx2r59e6n3tm3bprCwMCUlJTmP1a9fX+np6VqwYIH27t2rdu3aadKkSS7nnXvuufrHP/6hFStWaOvWrSosLNS0adPKnUOtWrWcN5vt27evyr9TVlaWfv31V82bN09jxozR//t//0+9e/d2rqL+2f79+5WXl+dybMeOHZJU7k1rAFAdCLMA4KHw8HD16dNHS5cudfkn9YMHD2r+/Pm67LLLFBcXJ8ncOeBMtWvX1nnnnaeCggJJ5q4EJ0+edBlz7rnnqk6dOs4x5ZkwYYKKi4t1ww03lNlu4MnKp2P19MxzCgsL9cILL5Q5/tSpU3rppZdcxr700ktq1KhRuSvCAFAd2JoLAMoxd+5cffLJJ6WOjxkzRo888ogyMzN12WWX6c4771RERIReeuklFRQU6Mknn3SObdOmjXr06KGOHTuqfv362rBhgxYvXqzRo0dLMlcze/XqpcGDB6tNmzaKiIjQu+++q4MHD+r666+vcH5du3bV888/r7vuukvnn3++8wlghYWF2rFjh958801FRUWpSZMmlf6uf/3rX1WvXj2NHDlSd999t2w2m/71r3+VG4gTExP1xBNPaPfu3brgggv01ltvKTs7W7Nnz1ZkZGSlnwcAPmPtZgoAEHgcW3OV97V3717DMAxj06ZNRt++fY3atWsbsbGxRs+ePY0vv/zS5VqPPPKI0blzZ+Oss84yYmJijFatWhmPPvqoc/uqI0eOGKNGjTJatWpl1KpVy6hbt67RpUsX4+2333Z7vps3bzZGjBhhNG/e3IiKijJq1apltGvXzvjHP/5h7Ny502Vs9+7djQsvvLDM63zxxRfGJZdcYsTExBiJiYnGvffeayxfvtyQZKxatarUNTZs2GCkpqYa0dHRxtlnn208//zzLtdzbM21aNEil+O7du0yJBmvvvqq278jAJTHZhh04AMA3NejRw8dOXKkzJvPAMDf6JkFAABA0CLMAgAAIGgRZgEAABC06JkFAABA0GJlFgAAAEGLMAsAAICgVeMemlBSUqL9+/erTp06stlsVk8HAAAAf2IYho4fP67ExESFhVW89lrjwuz+/ftdnpkOAACAwLR37141a9aswjGWhtk1a9boqaee0saNG5WTk6N3331XAwYMcOvcL774Qt27d1fbtm2VnZ3t9mfWqVNHkvkfjuPZ6Z4qKirSihUr1KdPHx7bGOSoZeiglqGDWoYOahk6/F3L3NxcJSUlOXNbRSwNs3l5eUpJSdFNN92kgQMHun3esWPHNGLECPXq1UsHDx706DMdrQVxcXFVCrOxsbGKi4vjjzPIUcvQQS1DB7UMHdQydFhVS3daQi0Ns/369VO/fv08Pu/222/XsGHDFB4ervfee8/3EwMAAEBQCLqe2VdffVU///yz3njjDT3yyCOVji8oKFBBQYHzdW5uriTz/2EUFRV5NQfHed6ej8BBLUMHtQwd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AN4KiJVZfzIMQ5JnWz78WVFRkfLz85Wbm8vdmUGOWoYOahk6qGXooJahw9+1dOQ0R26rSI0Ls8ePH5ckJSUlWTwTAAAAVOT48eOqW7duhWNshjuRN4SUlJRo//79qlOnjmw2m1fXcDx4Ye/evV4/eAGBgVqGDmoZOqhl6KCWocPftTQMQ8ePH1diYqLLRgBlqXErs2FhYWrWrJlPrhUXF8cfZ4iglqGDWoYOahk6qGXo8GctK1uRdeAGMAAAAAQtwiwAAACCFmHWC3a7XRMnTpTdbrd6Kqgiahk6qGXooJahg1qGjkCuZY27AQwAAAChg5VZAAAABC3CLAAAAIIWYRYAAABBizALAACAoEWY9dDMmTOVnJys6OhodenSRevXr7d6SnDDmjVr1L9/fyUmJspms+m9995zed8wDE2YMEEJCQmKiYlR79699eOPP1ozWZRr6tSp+stf/qI6deqocePGGjBggLZv3+4y5uTJkxo1apQaNGig2rVr67rrrtPBgwctmjHK8+KLL6pdu3bODdhTU1P18ccfO9+njsHr8ccfl81m09ixY53HqGdwmDRpkmw2m8tXq1atnO8Hah0Jsx546623lJGRoYkTJ2rTpk1KSUlR3759dejQIaunhkrk5eUpJSVFM2fOLPP9J598Us8995xmzZqlr7/+WrVq1VLfvn118uRJP88UFVm9erVGjRqlr776SpmZmSoqKlKfPn2Ul5fnHDNu3Dh98MEHWrRokVavXq39+/dr4MCBFs4aZWnWrJkef/xxbdy4URs2bNDll1+ua665Rt9//70k6hisvvnmG7300ktq166dy3HqGTwuvPBC5eTkOL8+//xz53sBW0cDbuvcubMxatQo5+vi4mIjMTHRmDp1qoWzgqckGe+++67zdUlJidGkSRPjqaeech47duyYYbfbjQULFlgwQ7jr0KFDhiRj9erVhmGYdYuMjDQWLVrkHPPDDz8Ykox169ZZNU24qV69esacOXOoY5A6fvy4cf755xuZmZlG9+7djTFjxhiGwd9lMJk4caKRkpJS5nuBXEdWZt1UWFiojRs3qnfv3s5jYWFh6t27t9atW2fhzFBVu3bt0oEDB1xqW7duXXXp0oXaBrjff/9dklS/fn1J0saNG1VUVORSy1atWql58+bUMoAVFxdr4cKFysvLU2pqKnUMUqNGjdJVV13lUjeJv8tg8+OPPyoxMVHnnHOOhg8frj179kgK7DpGWPrpQeTIkSMqLi5WfHy8y/H4+Hht27bNolnBFw4cOCBJZdbW8R4CT0lJicaOHatLL71Ubdu2lWTWMioqSmeddZbLWGoZmLZs2aLU1FSdPHlStWvX1rvvvqs2bdooOzubOgaZhQsXatOmTfrmm29KvcffZfDo0qWL5s2bp5YtWyonJ0eTJ09W165dtXXr1oCuI2EWQFAaNWqUtm7d6tLPheDSsmVLZWdn6/fff9fixYs1cuRIrV692uppwUN79+7VmDFjlJmZqejoaKungyro16+f8+d27dqpS5cuOvvss/X2228rJibGwplVjDYDNzVs2FDh4eGl7to7ePCgmjRpYtGs4AuO+lHb4DF69Gh9+OGHWrVqlZo1a+Y83qRJExUWFurYsWMu46llYIqKitJ5552njh07aurUqUpJSdGzzz5LHYPMxo0bdejQIV188cWKiIhQRESEVq9ereeee04RERGKj4+nnkHqrLPO0gUXXKCdO3cG9N8lYdZNUVFR6tixo1auXOk8VlJSopUrVyo1NdXCmaGqWrRooSZNmrjUNjc3V19//TW1DTCGYWj06NF699139dlnn6lFixYu73fs2FGRkZEutdy+fbv27NlDLYNASUmJCgoKqGOQ6dWrl7Zs2aLs7GznV6dOnTR8+HDnz9QzOJ04cUI//fSTEhISAvrvkjYDD2RkZGjkyJHq1KmTOnfurBkzZigvL0/p6elWTw2VOHHihHbu3Ol8vWvXLmVnZ6t+/fpq3ry5xo4dq0ceeUTnn3++WrRooYceekiJiYkaMGCAdZNGKaNGjdL8+fO1dOlS1alTx9mnVbduXcXExKhu3br6+9//royMDNWvX19xcXG66667lJqaqksuucTi2eNM48ePV79+/dS8eXMdP35c8+fPV1ZWlpYvX04dg0ydOnWcfesOtWrVUoMGDZzHqWdwuOeee9S/f3+dffbZ2r9/vyZOnKjw8HANHTo0sP8uLd1LIQj93//9n9G8eXMjKirK6Ny5s/HVV19ZPSW4YdWqVYakUl8jR440DMPcnuuhhx4y4uPjDbvdbvTq1cvYvn27tZNGKWXVUJLx6quvOsf88ccfxp133mnUq1fPiI2NNa699lojJyfHukmjTDfddJNx9tlnG1FRUUajRo2MXr16GStWrHC+Tx2D25lbcxkG9QwWQ4YMMRISEoyoqCijadOmxpAhQ4ydO3c63w/UOtoMwzAsytEAAABAldAzCwAAgKBFmAUAAEDQIswCAAAgaBFmAQAAELQIswAAAAhahFkAAAAELcIsAAAAghZhFgAAAEGLMAsANZTNZtN7771n9TQAoEoIswBggb/97W+y2Wylvq644gqrpwYAQSXC6gkAQE11xRVX6NVXX3U5ZrfbLZoNAAQnVmYBwCJ2u11NmjRx+apXr54kswXgxRdfVL9+/RQTE6NzzjlHixcvdjl/y5YtuvzyyxUTE6MGDRro1ltv1YkTJ1zGzJ07VxdeeKHsdrsSEhI0evRol/ePHDmia6+9VrGxsTr//PP1/vvvV+8vDQA+RpgFgAD10EMP6brrrtO3336r4cOH6/rrr9cPP/wgScrLy1Pfvn1Vr149ffPNN1q0aJE+/fRTl7D64osvatSoUbr11lu1ZcsWvf/++zrvvPNcPmPy5MkaPHiwvvvuO1155ZUaPny4jh496tffEwCqwmYYhmH1JACgpvnb3/6mN954Q9HR0S7H//nPf+qf//ynbDabbr/9dr344ovO9y655BJdfPHFeuGFF/Tyyy/rvvvu0969e1WrVi1J0rJly9S/f3/t379f8fHxatq0qdLT0/XII4+UOQebzaYHH3xQU6ZMkWQG5Nq1a+vjjz+mdxdA0KBnFgAs0rNnT5ewKkn169d3/pyamuryXmpqqrKzsyVJP/zwg1JSUpxBVpIuvfRSlZSUaPv27bLZbNq/f7969epV4RzatWvn/LlWrVqKi4vToUOHvP2VAMDvCLMAYJFatWqV+md/X4mJiXFrXGRkpMtrm82mkpKS6pgSAFQLemYBIEB99dVXpV63bt1aktS6dWt9++23ysvLc77/xRdfKCwsTC1btlSdOnWUnJyslStX+nXOAOBvrMwCgEUKCgp04MABl2MRERFq2LChJGnRokXq1KmTLrvsMr355ptav369XnnlFUnS8OHDNXHiRI0cOVKTJk3S4cOHddddd+nGG29UfHy8JGnSpEm6/fbb1bhxY/Xr10/Hjx/XF198obvuusu/vygAVCPCLABY5JNPPlFCQoLLsZYtW2rbtm2SzJ0GFi5cqDvvvFMJCQlasGCB2rRpI0mKjY3V8uXLNWbMGP3lL39RbGysrrvuOk2fPt15rZEjR+rkyZN65plndM8996hhw4YaNGiQ/35BAPADdjMAgABks9n07rvvasCAAVZPBQACGj2zAAAACFqEWQAAAAQtemYBIADRAQYA7mFlFgAAAEGLMAsAAICgRZgFAABA0CLMAgAAIGgRZgEAABC0CLMAAAAIWoRZAAAABC3CLAAAAILW/wfwN2TfPXZSYgAAAABJRU5ErkJggg==\n" }, "metadata": {} }, { "output_type": "stream", "name": "stdout", "text": [ "Total execution time: 883.79 seconds\n" ] } ] }, { "cell_type": "code", "source": [ "import torch # ACTIVATION FUNCTION testing using the sigmoid funciton, and learning rate of 0.01\n", "import torch.nn as nn\n", "import torch.nn.init as init\n", "from torch.utils.data import DataLoader\n", "import torchvision\n", "import torchvision.transforms as transforms\n", "import matplotlib.pyplot as plt\n", "import time\n", "overall_start_time = time.time()\n", "\n", "model = nn.Sequential(\n", " nn.Linear(784, 196), # Input layer starting with number of pixels\n", " nn.Sigmoid(), # sigmoid Activation\n", " nn.Linear(196, 49), # Hidden layer 1\n", " nn.Sigmoid(), # sigmoid Activation again\n", " nn.Linear(49, 10), # Hidden layer 2\n", "\n", ")\n", "\n", "for layer in model.modules():\n", " if isinstance(layer, nn.Linear):\n", " init.kaiming_uniform_(layer.weight, nonlinearity='relu')\n", " if layer.bias is not None:\n", " init.zeros_(layer.bias)\n", "transform = transforms.Compose([\n", " transforms.ToTensor(),\n", " transforms.Normalize((0.5,), (0.5,)) #\n", "])\n", "\n", "train_dataset = torchvision.datasets.FashionMNIST(root='./data', train=True, download=True, transform=transform)\n", "test_dataset = torchvision.datasets.FashionMNIST(root='./data', train=False, download=True, transform=transform)\n", "train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)\n", "test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)\n", "\n", "optimizer = torch.optim.Adam(model.parameters(), lr=0.01) # Adam optimization (0.0001 learning rate)\n", "scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)\n", "loss_fn = nn.CrossEntropyLoss() # loss function\n", "\n", "num_epochs = 50\n", "loss_values = []\n", "for epoch in range(num_epochs):\n", " model.train()\n", " running_loss = 0.0\n", " for batch_idx, (images, labels) in enumerate(train_loader):\n", " images = images.view(-1, 784)\n", " optimizer.zero_grad()\n", " outputs = model(images)\n", " loss = loss_fn(outputs, labels)\n", " loss.backward()\n", " optimizer.step()\n", " running_loss += loss.item()\n", "\n", " avg_train_loss = running_loss / len(train_loader) # Calculate the average training loss\n", " loss_values.append(avg_train_loss)\n", " print(f'Epoch {epoch+1}/{num_epochs} \\t\\t Training Loss: {avg_train_loss:.6f}')\n", "\n", "print(f\"Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(train_loader):.4f}\") # average loss\n", "\n", "plt.figure(figsize=(8, 6)) # start plotting\n", "plt.plot(range(1, num_epochs + 1), loss_values, marker='o', linestyle='-', color='m')\n", "plt.title('Loss Graph')\n", "plt.xlabel('Epoch')\n", "plt.ylabel('Loss')\n", "plt.grid(True)\n", "plt.show()\n", "\n", "end_time = time.time()\n", "overall_time = end_time - overall_start_time\n", "print(f\"Total execution time: {overall_time:.2f} seconds\")\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "id": "6wX7HZVVEyZC", "outputId": "25e4f22f-f829-43ab-a5ff-f843a9b33a43" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Epoch 1/50 \t\t Training Loss: 0.610542\n", "Epoch 2/50 \t\t Training Loss: 0.518105\n", "Epoch 3/50 \t\t Training Loss: 0.491139\n", "Epoch 4/50 \t\t Training Loss: 0.481820\n", "Epoch 5/50 \t\t Training Loss: 0.469529\n", "Epoch 6/50 \t\t Training Loss: 0.461296\n", "Epoch 7/50 \t\t Training Loss: 0.460112\n", "Epoch 8/50 \t\t Training Loss: 0.445243\n", "Epoch 9/50 \t\t Training Loss: 0.455644\n", "Epoch 10/50 \t\t Training Loss: 0.446742\n", "Epoch 11/50 \t\t Training Loss: 0.441687\n", "Epoch 12/50 \t\t Training Loss: 0.444206\n", "Epoch 13/50 \t\t Training Loss: 0.445777\n", "Epoch 14/50 \t\t Training Loss: 0.448170\n", "Epoch 15/50 \t\t Training Loss: 0.430399\n", "Epoch 16/50 \t\t Training Loss: 0.427066\n", "Epoch 17/50 \t\t Training Loss: 0.428164\n", "Epoch 18/50 \t\t Training Loss: 0.429806\n", "Epoch 19/50 \t\t Training Loss: 0.418735\n", "Epoch 20/50 \t\t Training Loss: 0.420601\n", "Epoch 21/50 \t\t Training Loss: 0.426985\n", "Epoch 22/50 \t\t Training Loss: 0.427167\n", "Epoch 23/50 \t\t Training Loss: 0.420748\n", "Epoch 24/50 \t\t Training Loss: 0.419190\n", "Epoch 25/50 \t\t Training Loss: 0.416064\n", "Epoch 26/50 \t\t Training Loss: 0.412762\n", "Epoch 27/50 \t\t Training Loss: 0.423388\n", "Epoch 28/50 \t\t Training Loss: 0.421093\n", "Epoch 29/50 \t\t Training Loss: 0.418390\n", "Epoch 30/50 \t\t Training Loss: 0.409606\n", "Epoch 31/50 \t\t Training Loss: 0.410489\n", "Epoch 32/50 \t\t Training Loss: 0.420917\n", "Epoch 33/50 \t\t Training Loss: 0.422161\n", "Epoch 34/50 \t\t Training Loss: 0.413026\n", "Epoch 35/50 \t\t Training Loss: 0.416692\n", "Epoch 36/50 \t\t Training Loss: 0.410712\n", "Epoch 37/50 \t\t Training Loss: 0.407973\n", "Epoch 38/50 \t\t Training Loss: 0.410653\n", "Epoch 39/50 \t\t Training Loss: 0.413227\n", "Epoch 40/50 \t\t Training Loss: 0.411169\n", "Epoch 41/50 \t\t Training Loss: 0.410736\n", "Epoch 42/50 \t\t Training Loss: 0.407875\n", "Epoch 43/50 \t\t Training Loss: 0.411081\n", "Epoch 44/50 \t\t Training Loss: 0.406286\n", "Epoch 45/50 \t\t Training Loss: 0.407157\n", "Epoch 46/50 \t\t Training Loss: 0.413552\n", "Epoch 47/50 \t\t Training Loss: 0.407060\n", "Epoch 48/50 \t\t Training Loss: 0.407997\n", "Epoch 49/50 \t\t Training Loss: 0.414667\n", "Epoch 50/50 \t\t Training Loss: 0.411493\n", "Epoch [50/50], Loss: 0.4115\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "<Figure size 800x600 with 1 Axes>" ], "image/png": "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LYNOp8M999xjcuqENSOwraO4V+/T1NSEv//97ybrNzc348033zSq++abbyIkJMTsyDQRUVfgsmtERF1o8+bN2LVrV5vyRx99FM888wwyMjJw00034aGHHoKbmxvefPNNaDQavPDCC4a6gwcPxtixY5GUlITAwED8+OOP2LlzJ9LS0gC0jKqOHz8ed911FwYPHgw3Nzd88sknKCsrw+zZs9tt35gxY/D666/j4YcfRr9+/QxPqmtqasKpU6fwwQcfQKlUIjw8vMNrveGGGxAQEID58+fjkUcegSAI+Mc//mE2VEdGRuL5559HQUEB+vfvjx07diAnJwdvvfUWFApFh+cjIrIbaRe5ICJyTa3Lrpn7KioqEkVRFI8cOSJOnjxZ9Pb2Fj09PcVx48aJ+/fvNzrWM888I44aNUr09/cXPTw8xIEDB4rPPvusYWmyiooKcdGiReLAgQNFLy8v0c/PT0xOThb/9a9/Wdzen376SZw3b57Yq1cvUalUil5eXmJiYqL45z//WczPzzeqe/PNN4sJCQkmj/P999+Lo0ePFj08PMTIyEjx8ccfF7/++msRgPjtt9+2OcaPP/4opqSkiO7u7mLv3r3F119/3eh4rcuuffTRR0blZ8+eFQGI7733nsXXSERkjiCKvCOBiIi619ixY1FRUWHyhj4iou7GOcRERERE1KMxEBMRERFRj8ZATEREREQ9GucQExEREVGPxhFiIiIiIurRGIiJiIiIqEfjgzlspNfrUVxcDB8fHwiCIHVziIiIiOgaoiiitrYWkZGRkMnMjwMzENuouLgYMTExUjeDiIiIiDpQVFSE6Ohos9sZiG3k4+MDoOUN9vX1tXp/rVaL3bt3Y9KkSXxEqZNjX7oW9qfrYF+6Dval6+juvqypqUFMTIwht5nDQGyj1mkSvr6+NgdiT09P+Pr68pvbybEvXQv703WwL10H+9J1SNWXHU1v5U11RERERNSjMRATERERUY/GQExEREREPRoDMRERERH1aAzERERERNSjMRATERERUY/GQExEREREPRoDMRERERH1aAzERERERNSjMRATERERUY/GQExEREREPRoDMRERERH1aAzERERERNSjuUndAOqYqBOh3qdGU0kTlBFK+I/xhyAXpG4WERERkUtgIHZw5R+XI//RfGjOawxlqmgV4l+JR8iMEAlbRkREROQa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\n" }, "metadata": {} }, { "output_type": "stream", "name": "stdout", "text": [ "Total execution time: 987.29 seconds\n" ] } ] }, { "cell_type": "markdown", "source": [ "- Next, trying ReLU with **0.0001** and then **0.01** **learning** **rate**" ], "metadata": { "id": "IL9LRNa9Wufp" } }, { "cell_type": "code", "source": [ "import torch # ACTIVATION FUNCTION testing using ReLU, and learning rate of 0.0001\n", "import torch.nn as nn\n", "import torch.nn.init as init\n", "from torch.utils.data import DataLoader\n", "import torchvision\n", "import torchvision.transforms as transforms\n", "import matplotlib.pyplot as plt\n", "import time\n", "overall_start_time = time.time()\n", "\n", "model = nn.Sequential(\n", " nn.Linear(784, 196), # Input layer starting with number of pixels\n", " nn.ReLU(), # ReLU Activation\n", " nn.Linear(196, 49), # Hidden layer 1\n", " nn.ReLU(), # ReLU Activation again\n", " nn.Linear(49, 10), # Hidden layer 2\n", "\n", ")\n", "\n", "for layer in model.modules():\n", " if isinstance(layer, nn.Linear):\n", " init.kaiming_uniform_(layer.weight, nonlinearity='relu')\n", " if layer.bias is not None:\n", " init.zeros_(layer.bias)\n", "transform = transforms.Compose([\n", " transforms.ToTensor(),\n", " transforms.Normalize((0.5,), (0.5,)) #\n", "])\n", "\n", "train_dataset = torchvision.datasets.FashionMNIST(root='./data', train=True, download=True, transform=transform)\n", "test_dataset = torchvision.datasets.FashionMNIST(root='./data', train=False, download=True, transform=transform)\n", "train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)\n", "test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)\n", "\n", "optimizer = torch.optim.Adam(model.parameters(), lr=0.0001) # Adam optimization\n", "scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)\n", "loss_fn = nn.CrossEntropyLoss() # loss function\n", "\n", "num_epochs = 50\n", "loss_values = []\n", "for epoch in range(num_epochs):\n", " model.train()\n", " running_loss = 0.0\n", " for batch_idx, (images, labels) in enumerate(train_loader):\n", " images = images.view(-1, 784)\n", " optimizer.zero_grad()\n", " outputs = model(images)\n", " loss = loss_fn(outputs, labels)\n", " loss.backward()\n", " optimizer.step()\n", " running_loss += loss.item()\n", "\n", " avg_train_loss = running_loss / len(train_loader) # Calculate the average training loss\n", " loss_values.append(avg_train_loss)\n", " print(f'Epoch {epoch+1}/{num_epochs} \\t\\t Training Loss: {avg_train_loss:.6f}')\n", "\n", "print(f\"Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(train_loader):.4f}\") # average loss\n", "\n", "plt.figure(figsize=(8, 6)) # start plotting\n", "plt.plot(range(1, num_epochs + 1), loss_values, marker='o', linestyle='-', color='m')\n", "plt.title('Loss Graph')\n", "plt.xlabel('Epoch')\n", "plt.ylabel('Loss')\n", "plt.grid(True)\n", "plt.show()\n", "\n", "end_time = time.time()\n", "overall_time = end_time - overall_start_time\n", "print(f\"Total execution time: {overall_time:.2f} seconds\")\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "id": "iv2B5MZVJupN", "outputId": "ed3539c6-b485-456f-f07a-1751fccc48fd" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Epoch 1/50 \t\t Training Loss: 0.613651\n", "Epoch 2/50 \t\t Training Loss: 0.420630\n", "Epoch 3/50 \t\t Training Loss: 0.378545\n", "Epoch 4/50 \t\t Training Loss: 0.352966\n", "Epoch 5/50 \t\t Training Loss: 0.333582\n", "Epoch 6/50 \t\t Training Loss: 0.318511\n", "Epoch 7/50 \t\t Training Loss: 0.305931\n", "Epoch 8/50 \t\t Training Loss: 0.295367\n", "Epoch 9/50 \t\t Training Loss: 0.284473\n", "Epoch 10/50 \t\t Training Loss: 0.275701\n", "Epoch 11/50 \t\t Training Loss: 0.268150\n", "Epoch 12/50 \t\t Training Loss: 0.260276\n", "Epoch 13/50 \t\t Training Loss: 0.253808\n", "Epoch 14/50 \t\t Training Loss: 0.247806\n", "Epoch 15/50 \t\t Training Loss: 0.240589\n", "Epoch 16/50 \t\t Training Loss: 0.235360\n", "Epoch 17/50 \t\t Training Loss: 0.230745\n", "Epoch 18/50 \t\t Training Loss: 0.225381\n", "Epoch 19/50 \t\t Training Loss: 0.220176\n", "Epoch 20/50 \t\t Training Loss: 0.215123\n", "Epoch 21/50 \t\t Training Loss: 0.210319\n", "Epoch 22/50 \t\t Training Loss: 0.204473\n", "Epoch 23/50 \t\t Training Loss: 0.201269\n", "Epoch 24/50 \t\t Training Loss: 0.197964\n", "Epoch 25/50 \t\t Training Loss: 0.192583\n", "Epoch 26/50 \t\t Training Loss: 0.189566\n", "Epoch 27/50 \t\t Training Loss: 0.184053\n", "Epoch 28/50 \t\t Training Loss: 0.180786\n", "Epoch 29/50 \t\t Training Loss: 0.178173\n", "Epoch 30/50 \t\t Training Loss: 0.175019\n", "Epoch 31/50 \t\t Training Loss: 0.170429\n", "Epoch 32/50 \t\t Training Loss: 0.167533\n", "Epoch 33/50 \t\t Training Loss: 0.163002\n", "Epoch 34/50 \t\t Training Loss: 0.160265\n", "Epoch 35/50 \t\t Training Loss: 0.157373\n", "Epoch 36/50 \t\t Training Loss: 0.153442\n", "Epoch 37/50 \t\t Training Loss: 0.151394\n", "Epoch 38/50 \t\t Training Loss: 0.147814\n", "Epoch 39/50 \t\t Training Loss: 0.143295\n", "Epoch 40/50 \t\t Training Loss: 0.140794\n", "Epoch 41/50 \t\t Training Loss: 0.137969\n", "Epoch 42/50 \t\t Training Loss: 0.135147\n", "Epoch 43/50 \t\t Training Loss: 0.132733\n", "Epoch 44/50 \t\t Training Loss: 0.131101\n", "Epoch 45/50 \t\t Training Loss: 0.127653\n", "Epoch 46/50 \t\t Training Loss: 0.124836\n", "Epoch 47/50 \t\t Training Loss: 0.122102\n", "Epoch 48/50 \t\t Training Loss: 0.119400\n", "Epoch 49/50 \t\t Training Loss: 0.116196\n", "Epoch 50/50 \t\t Training Loss: 0.115179\n", "Epoch [50/50], Loss: 0.1152\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "<Figure size 800x600 with 1 Axes>" ], "image/png": "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n//858rJyVG3bt0UFxenm2++WVlZWRo3bpzJvcc3LViwQJdddpn69OmjqqoqPf/888rLy9Pbb7/NOAaY2NhYV916g+joaCUlJbmuM56B4ZZbbtEVV1yhvn376ujRo1q0aJGsVquuv/56//69NHUvhQD0f//3f0afPn2M8PBwY8yYMcamTZvM7hLc8N577xmSmvzMmjXLMIz67bluu+02IzU11bDZbMall15q7Nmzx9xOo4nmxlCS8fTTT7vanDp1ypg9e7aRmJhoREVFGVdffbVRWFhoXqfRrJ/97GdG3759jfDwcCMlJcW49NJLjbVr17reZxwD2ze35jIMxjNQTJ8+3UhLSzPCw8ON9PR0Y/r06UZBQYHrfX8dR4thGIZJORoAAADoEGpmAQAAELAIswAAAAhYhFkAAAAELMIsAAAAAhZhFgAAAAGLMAsAAICARZgFAABAwCLMAgAAIGARZgGgi7JYLPrnP/9pdjcAoEMIswBggp/+9KeyWCxNfr7//e+b3TUACCihZncAALqq73//+3r66acbXbPZbCb1BgACEzOzAGASm82mHj16NPpJTEyUVF8C8Nhjj+myyy5TZGSk+vfvr9WrVzf6/Geffabvfe97ioyMVFJSkn7xi1/o5MmTjdqsXLlSw4YNk81mU1pamubOndvo/ePHj+vqq69WVFSUBg4cqNdff71zvzQAeBlhFgD81G233aZrrrlG27dv14wZM3Tddddp165dkqTq6mpNnTpViYmJ+vjjj/XSSy/pnXfeaRRWH3vsMc2ZM0e/+MUv9Nlnn+n1119XZmZmo2csWbJEP/rRj7Rjxw794Ac/0IwZM3TixAmffk8A6AiLYRiG2Z0AgK7mpz/9qf7+978rIiKi0fXf//73+v3vfy+LxaL//d//1WOPPeZ6b9y4cTr//PP15z//WU888YR++9vf6tChQ4qOjpYkvfnmm7riiit09OhRpaamKj09XdnZ2brzzjub7YPFYtEf//hH3XHHHZLqA3JMTIzeeustancBBAxqZgHAJJdcckmjsCpJ3bp1c/05Kyur0XtZWVnatm2bJGnXrl0aMWKEK8hK0oUXXiin06k9e/bIYrHo6NGjuvTSS1vtw/Dhw11/jo6OVlxcnI4dO+bpVwIAnyPMAoBJoqOjm/y1v7dERka61S4sLKzRa4vFIqfT2RldAoBOQc0sAPipTZs2NXk9ZMgQSdKQIUO0fft2VVdXu97/4IMPFBISonPOOUexsbHKyMjQunXrfNpnAPA1ZmYBwCR2u11FRUWNroWGhio5OVmS9NJLL2n06NG66KKL9Nxzz2nz5s166qmnJEkzZszQokWLNGvWLC1evFglJSW6+eab9ZOf/ESpqamSpMWLF+t///d/1b17d1122WWqqqrSBx98oJtvvtm3XxQAOhFhFgBMsmbNGqWlpTW6ds4552j37t2S6ncaePHFFzV79mylpaXphRde0NChQyVJUVFRevvttzVv3jx997vfVVRUlK655hotW7bMda9Zs2bp9OnTevDBB3XLLbcoOTlZ1157re++IAD4ALsZAIAfslgsevXVV3XVVVeZ3RUA8GvUzAIAACBgEWYBAAAQsKiZBQA/RAUYALiHmVkAAAAELMIsAAAAAhZhFgAAAAGLMAsAAICARZgFAABAwCLMAgAAIGARZgEAABCwCLMAAAAIWP8fJTU7VjuTlIsAAAAASUVORK5CYII=\n" }, "metadata": {} }, { "output_type": "stream", "name": "stdout", "text": [ "Total execution time: 880.78 seconds\n" ] } ] }, { "cell_type": "code", "source": [ "import torch # ACTIVATION FUNCTION testing using ReLU, and learning rate of 0.01\n", "import torch.nn as nn\n", "import torch.nn.init as init\n", "from torch.utils.data import DataLoader\n", "import torchvision\n", "import torchvision.transforms as transforms\n", "import matplotlib.pyplot as plt\n", "import time\n", "overall_start_time = time.time()\n", "\n", "model = nn.Sequential(\n", " nn.Linear(784, 196), # Input layer starting with number of pixels\n", " nn.ReLU(), # ReLU Activation\n", " nn.Linear(196, 49), # Hidden layer 1\n", " nn.ReLU(), # ReLU Activation again\n", " nn.Linear(49, 10), # Hidden layer 2\n", "\n", ")\n", "\n", "for layer in model.modules():\n", " if isinstance(layer, nn.Linear):\n", " init.kaiming_uniform_(layer.weight, nonlinearity='relu')\n", " if layer.bias is not None:\n", " init.zeros_(layer.bias)\n", "transform = transforms.Compose([\n", " transforms.ToTensor(),\n", " transforms.Normalize((0.5,), (0.5,)) #\n", "])\n", "\n", "train_dataset = torchvision.datasets.FashionMNIST(root='./data', train=True, download=True, transform=transform)\n", "test_dataset = torchvision.datasets.FashionMNIST(root='./data', train=False, download=True, transform=transform)\n", "train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)\n", "test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)\n", "\n", "optimizer = torch.optim.Adam(model.parameters(), lr=0.01) # Adam optimization\n", "scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)\n", "loss_fn = nn.CrossEntropyLoss() # loss function\n", "\n", "num_epochs = 50\n", "loss_values = []\n", "for epoch in range(num_epochs):\n", " model.train()\n", " running_loss = 0.0\n", " for batch_idx, (images, labels) in enumerate(train_loader):\n", " images = images.view(-1, 784)\n", " optimizer.zero_grad()\n", " outputs = model(images)\n", " loss = loss_fn(outputs, labels)\n", " loss.backward()\n", " optimizer.step()\n", " running_loss += loss.item()\n", "\n", " avg_train_loss = running_loss / len(train_loader) # Calculate the average training loss\n", " loss_values.append(avg_train_loss)\n", " print(f'Epoch {epoch+1}/{num_epochs} \\t\\t Training Loss: {avg_train_loss:.6f}')\n", "\n", "print(f\"Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(train_loader):.4f}\") # average loss\n", "\n", "plt.figure(figsize=(8, 6)) # start plotting\n", "plt.plot(range(1, num_epochs + 1), loss_values, marker='o', linestyle='-', color='m')\n", "plt.title('Loss Graph')\n", "plt.xlabel('Epoch')\n", "plt.ylabel('Loss')\n", "plt.grid(True)\n", "plt.show()\n", "\n", "end_time = time.time()\n", "overall_time = end_time - overall_start_time\n", "print(f\"Total execution time: {overall_time:.2f} seconds\")\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "id": "DEEGUPXkNbMC", "outputId": "5b760b73-61b5-44d2-dee6-e0ccc666ce6e" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Epoch 1/50 \t\t Training Loss: 0.565660\n", "Epoch 2/50 \t\t Training Loss: 0.442644\n", "Epoch 3/50 \t\t Training Loss: 0.411351\n", "Epoch 4/50 \t\t Training Loss: 0.404930\n", "Epoch 5/50 \t\t Training Loss: 0.391816\n", "Epoch 6/50 \t\t Training Loss: 0.384859\n", "Epoch 7/50 \t\t Training Loss: 0.375026\n", "Epoch 8/50 \t\t Training Loss: 0.378583\n", "Epoch 9/50 \t\t Training Loss: 0.366482\n", "Epoch 10/50 \t\t Training Loss: 0.363885\n", "Epoch 11/50 \t\t Training Loss: 0.353679\n", "Epoch 12/50 \t\t Training Loss: 0.353171\n", "Epoch 13/50 \t\t Training Loss: 0.344180\n", "Epoch 14/50 \t\t Training Loss: 0.356926\n", "Epoch 15/50 \t\t Training Loss: 0.343681\n", "Epoch 16/50 \t\t Training Loss: 0.338881\n", "Epoch 17/50 \t\t Training Loss: 0.335849\n", "Epoch 18/50 \t\t Training Loss: 0.342563\n", "Epoch 19/50 \t\t Training Loss: 0.336395\n", "Epoch 20/50 \t\t Training Loss: 0.332542\n", "Epoch 21/50 \t\t Training Loss: 0.334098\n", "Epoch 22/50 \t\t Training Loss: 0.327308\n", "Epoch 23/50 \t\t Training Loss: 0.333985\n", "Epoch 24/50 \t\t Training Loss: 0.321507\n", "Epoch 25/50 \t\t Training Loss: 0.318541\n", "Epoch 26/50 \t\t Training Loss: 0.319549\n", "Epoch 27/50 \t\t Training Loss: 0.323762\n", "Epoch 28/50 \t\t Training Loss: 0.313547\n", "Epoch 29/50 \t\t Training Loss: 0.320260\n", "Epoch 30/50 \t\t Training Loss: 0.314008\n", "Epoch 31/50 \t\t Training Loss: 0.307129\n", "Epoch 32/50 \t\t Training Loss: 0.310373\n", "Epoch 33/50 \t\t Training Loss: 0.309876\n", "Epoch 34/50 \t\t Training Loss: 0.310303\n", "Epoch 35/50 \t\t Training Loss: 0.300945\n", "Epoch 36/50 \t\t Training Loss: 0.319638\n", "Epoch 37/50 \t\t Training Loss: 0.304515\n", "Epoch 38/50 \t\t Training Loss: 0.319913\n", "Epoch 39/50 \t\t Training Loss: 0.294351\n", "Epoch 40/50 \t\t Training Loss: 0.296698\n", "Epoch 41/50 \t\t Training Loss: 0.300885\n", "Epoch 42/50 \t\t Training Loss: 0.293036\n", "Epoch 43/50 \t\t Training Loss: 0.304532\n", "Epoch 44/50 \t\t Training Loss: 0.295627\n", "Epoch 45/50 \t\t Training Loss: 0.296901\n", "Epoch 46/50 \t\t Training Loss: 0.294613\n", "Epoch 47/50 \t\t Training Loss: 0.302215\n", "Epoch 48/50 \t\t Training Loss: 0.302604\n", "Epoch 49/50 \t\t Training Loss: 0.302699\n", "Epoch 50/50 \t\t Training Loss: 0.288628\n", "Epoch [50/50], Loss: 0.2886\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "<Figure size 800x600 with 1 Axes>" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAAArsAAAIjCAYAAAADVtOsAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABpd0lEQVR4nO3deXxU1cH/8e+dSTLZF0jIyhIIsgoolEVFUBC0rRv61K0VaattFQtPHmuLrSCIpS5VtFWxtri1LtUfahc3iqJYWRQEIbIF2UNCCFlIApNk5v7+iBkZMkkmk0lm4fN+vfKCuffcM2dyTPvl5CyGaZqmAAAAgDBkCXQDAAAAgM5C2AUAAEDYIuwCAAAgbBF2AQAAELYIuwAAAAhbhF0AAACELcIuAAAAwhZhFwAAAGGLsAsAAICwRdgFAATMypUrZRiGXnvttUA3BUCYIuwCgA+effZZGYahzz77LNBN8coXX3yhGTNmKDc3V9HR0YqPj9eIESN055136quvvgp08wCg00QEugEAgM719NNP62c/+5lSU1N1ww03aODAgWpoaNCWLVv0/PPPa/HixTp+/LisVmugmwoAfkfYBYAw9sknn+hnP/uZzj33XP3rX/9SQkKC2/3f//73uu+++9qsp7a2VrGxsZ3VTADoNExjAIBO9Pnnn+uSSy5RYmKi4uPjNWnSJK1Zs8atTH19vebPn6/+/fsrOjpa3bt313nnnafly5e7yhQXF2vGjBnKycmRzWZTZmamLr/8cu3Zs6fV958/f74Mw9Df/va3ZkFXkqKjo3Xvvfe6jepOnDhRQ4cO1fr163X++ecrNjZWd911lyTpzTff1He+8x1lZWXJZrOpX79+uvfee+VwONzqPbmOc845RzExMcrNzdWSJUs8ttPpdOq+++5TTk6OoqOjNWnSJBUWFrb62QDAG4zsAkAnKSgo0Pjx45WYmKg777xTkZGReuqppzRx4kR9+OGHGjNmjCTpnnvu0aJFi/TjH/9Yo0ePVlVVlT777DNt2LBBF110kSTpqquuUkFBgW6//Xb16dNHhw8f1vLly7Vv3z716dPH4/vX1tbq/fff18SJE5WTk9OutpeVlemSSy7Rtddeq+9///tKT0+X1DhXOT4+Xvn5+YqPj9f777+vuXPnqqqqSg8++KBbHeXl5fr2t7+t733ve7ruuuv097//XT/72c8UFRWlH/7wh25lf/e738liseiOO+5QZWWlHnjgAd1www1au3Ztu9oNAM2YAIB2e+aZZ0xJ5qefftpimSuuuMKMiooyd+3a5bpWVFRkJiQkmOeff77r2vDhw83vfOc7LdZTXl5uSjIffPDBdrVx06ZNpiRz9uzZze6VlZWZpaWlri+73e66N2HCBFOSuWTJkmbP1dbWNrv2k5/8xIyNjTVPnDjRrI7f//73rmt2u90cMWKE2aNHD7Ours40TdP84IMPTEnmoEGD3Nrw6KOPmpLMzZs3t+szA8CpmMYAAJ3A4XDovffe0xVXXKG+ffu6rmdmZur666/Xxx9/rKqqKklScnKyCgoKtHPnTo91xcTEKCoqSitXrlR5ebnXbWiqPz4+vtm9vn37Ki0tzfX1j3/8w+2+zWbTjBkzPLalybFjx3TkyBGNHz9etbW12rZtm1vZiIgI/eQnP3G9joqK0k9+8hMdPnxY69evdys7Y8YMRUVFuV6PHz9ektgpAkCHEXYBoBOUlpaqtrZWAwYMaHZv0KBBcjqd2r9/vyRpwYIFqqio0BlnnKEzzzxTv/jFL/TFF1+4yttsNt1///16++23lZ6ervPPP18PPPCAiouLW21D0xzd6urqZvfefPNNLV++XA899JDHZ7Ozs93CZ5OCggJdeeWVSkpKUmJiotLS0vT9739fklRZWelWNisrS3FxcW7XzjjjDElqNte4V69ebq9TUlIkqV3hHgA8IewCQICdf/752rVrl5YuXaqhQ4fqz3/+s84++2z9+c9/dpWZPXu2duzYoUWLFik6Olp33323Bg0apM8//7zFevPy8hQREaEtW7Y0uzdhwgRNnjxZI0eO9PjsySO4TSoqKjRhwgRt2rRJCxYs0D//+U8tX75c999/v6TGRWa+amnbM9M0fa4TACTCLgB0irS0NMXGxmr79u3N7m3btk0Wi0U9e/Z0XevWrZtmzJihl156Sfv379ewYcN0zz33uD3Xr18//d///Z/ee+89bdmyRXV1dfr973/fYhvi4uJci+EOHjzY4c+0cuVKlZWV6dlnn9WsWbP03e9+V5MnT3aNwp6qqKhINTU1btd27NghSS0uqgMAfyPsAkAnsFqtmjJlit588023X9mXlJToxRdf1HnnnafExERJjTsfnCw+Pl55eXmy2+2SGndVOHHihFuZfv36KSEh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1mOmSX+GimuuucbMzMw0o6KizOzsbPOaa64xCwsLXfeDsR8N0zTNAOVsAAAAoFMxZxcAAABhi7ALAACAsEXYBQAAQNgi7AIAACBsEXYBAAAQtgi7AAAACFuEXQAAAIQtwi4AAADCFmEXANAiwzD0xhtvBLoZAOAzwi4ABKmbbrpJhmE0+7r44osD3TQACBkRgW4AAKBlF198sZ555hm3azabLUCtAYDQw8guAAQxm82mjIwMt6+UlBRJjVMMnnzySV1yySWKiYlR37599dprr7k9v3nzZl144YWKiYlR9+7ddcstt6i6utqtzNKlSzVkyBDZbDZlZmZq5syZbvePHDmiK6+8UrGxserfv7/+8Y9/dO6HBgA/IuwCQAi7++67ddVVV2nTpk264YYbdO2112rr1q2SpJqaGk2dOlUpKSn69NNP9eqrr+o///mPW5h98sknddttt+mWW27R5s2b9Y9//EN5eXlu7zF//nx973vf0xdffKFvf/vbuuGGG3T06NEu/ZwA4CvDNE0z0I0AADR300036a9//auio6Pdrt9111266667ZBiGfvrTn+rJJ5903Rs7dqzOPvtsPfHEE3r66af1y1/+Uvv371dcXJwk6a233tKll16qoqIipaenKzs7WzNmzNDChQs9tsEwDP3mN7/RvffeK6kxQMfHx+vtt99m7jCAkMCcXQAIYhdccIFbmJWkbt26uf4+btw4t3vjxo3Txo0bJUlbt27V8OHDXUFXks4991w5nU5t375dhmGoqKhIkyZNarUNw4YNc/09Li5OiYmJOnz4sK8fCQC6FGEXAIJYXFxcs2kF/hITE+NVucjISLfXhmHI6XR2RpMAwO+YswsAIWzNmjXNXg8aNEiSNGjQIG3atEk1NTWu+//9739lsVg0YMAAJSQkqE+fPlqxYkWXthkAuhIjuwAQxOx2u4qLi92uRUREKDU1VZL06quvatSoUTrvvPP0t7/9TevWrdNf/vIXSdINN9ygefPmafr06brnnntUWlqq22+/XT/4wQ+Unp4uSbrnnnv005/+VD169NAll1yiY8eO6b///a9uv/32rv2gANBJCLsAEMTeeecdZWZmul0bMGCAtm3bJqlxp4SXX35Zt956qzIzM/XSSy9p8ODBkqTY2Fi9++67mjVrlr71rW8pNjZWV111lR5++GFXXdOnT9eJEyf0yCOP6I477lBqaqquvvrqrvuAANDJ2I0BAEKUYRh6/fXXdcUVVwS6KQAQtJizCwAAgLBF2AUAAEDYYs4uAIQoZqEBQNsY2QUAAEDYIuwCAAAgbBF2AQAAELYIuwAAAAhbhF0AAACELcIuAAAAwhZhFwAAAGGLsAsAAICw9f8BypwNR04zYtYAAAAASUVORK5CYII=\n" }, "metadata": {} }, { "output_type": "stream", "name": "stdout", "text": [ "Total execution time: 956.67 seconds\n" ] } ] }, { "cell_type": "markdown", "source": [ "after trying different learning rates with sigmoid and ReLU activation, the results were:\n", "- for sigmoid activation:\n", " - 0.0001 learning rate: Loss: 0.2327\n", " - 0.001 learning rate: Loss: 0.0552\n", " - 0.01 learning rate: Loss: 0.4115\n", "- for ReLU activation:\n", " - 0.0001 learning rate: Loss: 0.1152\n", " - 0.001 learning rate: Loss: 0.0700\n", " - 0.01 learning rate: Loss: 0.2886\n", "\n", " in both cases, the results indicate that 0.001 is the best learning rate choice, thus, for the next step, the learning rate will be fixed to 0.001, and the next variable will be tested for both sigmoid and relu too.\n", "\n", " the next parameter is the step size:\n", " - 20 steps\n", " - 30 steps (already tried)\n", " - 40 steps\n", " with both relu and sigmoid" ], "metadata": { "id": "psNJw9xpXlPz" } }, { "cell_type": "code", "source": [ "import torch # ACTIVATION FUNCTION testing using the sigmoid funciton, learning rate of 0.001, step size: 20\n", "import torch.nn as nn\n", "import torch.nn.init as init\n", "from torch.utils.data import DataLoader\n", "import torchvision\n", "import torchvision.transforms as transforms\n", "import matplotlib.pyplot as plt\n", "import time\n", "overall_start_time = time.time()\n", "\n", "model = nn.Sequential(\n", " nn.Linear(784, 196), # Input layer starting with number of pixels\n", " nn.Sigmoid(), # sigmoid Activation\n", " nn.Linear(196, 49), # Hidden layer 1\n", " nn.Sigmoid(), # sigmoid Activation again\n", " nn.Linear(49, 10), # Hidden layer 2\n", "\n", ")\n", "\n", "for layer in model.modules():\n", " if isinstance(layer, nn.Linear):\n", " init.kaiming_uniform_(layer.weight, nonlinearity='relu')\n", " if layer.bias is not None:\n", " init.zeros_(layer.bias)\n", "transform = transforms.Compose([\n", " transforms.ToTensor(),\n", " transforms.Normalize((0.5,), (0.5,)) #\n", "])\n", "\n", "train_dataset = torchvision.datasets.FashionMNIST(root='./data', train=True, download=True, transform=transform)\n", "test_dataset = torchvision.datasets.FashionMNIST(root='./data', train=False, download=True, transform=transform)\n", "train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)\n", "test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)\n", "\n", "optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # Adam optimization\n", "scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=20, gamma=0.1)\n", "loss_fn = nn.CrossEntropyLoss() # loss function\n", "\n", "num_epochs = 50\n", "loss_values = []\n", "for epoch in range(num_epochs):\n", " model.train()\n", " running_loss = 0.0\n", " for batch_idx, (images, labels) in enumerate(train_loader):\n", " images = images.view(-1, 784)\n", " optimizer.zero_grad()\n", " outputs = model(images)\n", " loss = loss_fn(outputs, labels)\n", " loss.backward()\n", " optimizer.step()\n", " running_loss += loss.item()\n", "\n", " avg_train_loss = running_loss / len(train_loader) # Calculate the average training loss\n", " loss_values.append(avg_train_loss)\n", " print(f'Epoch {epoch+1}/{num_epochs} \\t\\t Training Loss: {avg_train_loss:.6f}')\n", "\n", "print(f\"Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(train_loader):.4f}\") # average loss\n", "\n", "plt.figure(figsize=(8, 6)) # start plotting\n", "plt.plot(range(1, num_epochs + 1), loss_values, marker='o', linestyle='-', color='b')\n", "plt.title('Loss Graph')\n", "plt.xlabel('Epoch')\n", "plt.ylabel('Loss')\n", "plt.grid(True)\n", "plt.show()\n", "\n", "end_time = time.time()\n", "overall_time = end_time - overall_start_time\n", "print(f\"Total execution time: {overall_time:.2f} seconds\")\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "id": "rMI8289Yoqe7", "outputId": "9d63ed5d-616b-49fd-c73a-40ff048cd6ee" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Epoch 1/50 \t\t Training Loss: 0.624846\n", "Epoch 2/50 \t\t Training Loss: 0.395035\n", "Epoch 3/50 \t\t Training Loss: 0.354259\n", "Epoch 4/50 \t\t Training Loss: 0.324547\n", "Epoch 5/50 \t\t Training Loss: 0.305715\n", "Epoch 6/50 \t\t Training Loss: 0.288480\n", "Epoch 7/50 \t\t Training Loss: 0.274742\n", "Epoch 8/50 \t\t Training Loss: 0.261527\n", "Epoch 9/50 \t\t Training Loss: 0.250387\n", "Epoch 10/50 \t\t Training Loss: 0.238394\n", "Epoch 11/50 \t\t Training Loss: 0.228370\n", "Epoch 12/50 \t\t Training Loss: 0.218225\n", "Epoch 13/50 \t\t Training Loss: 0.211006\n", "Epoch 14/50 \t\t Training Loss: 0.203128\n", "Epoch 15/50 \t\t Training Loss: 0.194166\n", "Epoch 16/50 \t\t Training Loss: 0.188384\n", "Epoch 17/50 \t\t Training Loss: 0.180789\n", "Epoch 18/50 \t\t Training Loss: 0.174063\n", "Epoch 19/50 \t\t Training Loss: 0.167953\n", "Epoch 20/50 \t\t Training Loss: 0.160659\n", "Epoch 21/50 \t\t Training Loss: 0.155177\n", "Epoch 22/50 \t\t Training Loss: 0.150414\n", "Epoch 23/50 \t\t Training Loss: 0.146337\n", "Epoch 24/50 \t\t Training Loss: 0.138728\n", "Epoch 25/50 \t\t Training Loss: 0.135017\n", "Epoch 26/50 \t\t Training Loss: 0.129096\n", "Epoch 27/50 \t\t Training Loss: 0.123514\n", "Epoch 28/50 \t\t Training Loss: 0.118592\n", "Epoch 29/50 \t\t Training Loss: 0.116223\n", "Epoch 30/50 \t\t Training Loss: 0.111136\n", "Epoch 31/50 \t\t Training Loss: 0.109252\n", "Epoch 32/50 \t\t Training Loss: 0.105280\n", "Epoch 33/50 \t\t Training Loss: 0.102373\n", "Epoch 34/50 \t\t Training Loss: 0.097798\n", "Epoch 35/50 \t\t Training Loss: 0.094215\n", "Epoch 36/50 \t\t Training Loss: 0.088690\n", "Epoch 37/50 \t\t Training Loss: 0.087968\n", "Epoch 38/50 \t\t Training Loss: 0.080736\n", "Epoch 39/50 \t\t Training Loss: 0.081164\n", "Epoch 40/50 \t\t Training Loss: 0.075552\n", "Epoch 41/50 \t\t Training Loss: 0.076904\n", "Epoch 42/50 \t\t Training Loss: 0.072252\n", "Epoch 43/50 \t\t Training Loss: 0.071878\n", "Epoch 44/50 \t\t Training Loss: 0.066531\n", "Epoch 45/50 \t\t Training Loss: 0.067229\n", "Epoch 46/50 \t\t Training Loss: 0.061686\n", "Epoch 47/50 \t\t Training Loss: 0.063848\n", "Epoch 48/50 \t\t Training Loss: 0.062729\n", "Epoch 49/50 \t\t Training Loss: 0.056605\n", "Epoch 50/50 \t\t Training Loss: 0.060693\n", "Epoch [50/50], Loss: 0.0607\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "<Figure size 800x600 with 1 Axes>" ], "image/png": "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U6dOOY1p166dGjduXDamMlOnTpXdbtfNN9/sstygJlc+HVdPy3+muLhYzz//vMvxp0+f1vz5853Gzp8/Xy1btqz0ijAA1AVacwFAJRYtWqRVq1ZVOD5p0iQ98sgjyszMVO/evTVhwgSFhYVp/vz5Kioq0qxZs8rGdurUSf369VP37t3VvHlzbdy4UcuXL1d6erok82rmgAEDdOONN6pTp04KCwvTu+++q7y8PI0aNarK+fXp00fPPfec7r77bp1//vllO4AVFxdr586dWrx4sSIiIhQfH1/t73r55ZerWbNmGjdunP7nf/5HNptNr7/+eqWBuHXr1nr88ce1Z88eXXDBBVq2bJm2bNmiF198UeHh4dV+HwB4jbXNFADA/zhac1X2s2/fPsMwDGPz5s3GkCFDjEaNGhnR0dFG//79jS+++MLpXI888ojRs2dPo2nTpkaDBg2MDh06GI8++mhZ+6rDhw8bEydONDp06GA0bNjQaNKkidGrVy/jrbfecnu+33zzjTF27FjjnHPOMSIiIoyGDRsaXbp0Mf7yl78Yu3btchrbt29f46KLLnJ5nn/961/GZZddZjRo0MBo3bq1ce+99xoff/yxIclYs2ZNhXNs3LjRSElJMaKiooy2bdsazz33nNP5HK253n77bafju3fvNiQZL7/8stu/IwBUxmYYVOADANzXr18/HT582OXNZwDga9TMAgAAIGARZgEAABCwCLMAAAAIWNTMAgAAIGBxZRYAAAABizALAACAgFXvNk0oLS1VTk6OGjduLJvNZvV0AAAAcBbDMHTixAm1bt1aISFVX3utd2E2JyfHac90AAAA+Kd9+/apTZs2VY6pd2G2cePGksz/cBx7p9dUSUmJVq9ercGDB7NtY4BjLYMHaxk8WMvgwVoGD1+vZX5+vpKSkspyW1XqXZh1lBbExMTUKsxGR0crJiaGP84Ax1oGD9YyeLCWwYO1DB5WraU7JaHcAAYAAICARZgFAABAwCLMAgAAIGARZgEAABCwCLMAAAAIWIRZAAAABCzCLAAAAAIWYRYAAAABizALAACAgEWYBQAAQMAizAIAACBgEWYBAAAQsAizAAAACFhhVk8gmNnt0uefSwcOSAkJUp8+Umio1bMCAAAIHoTZOrJihTRpkvTLL2eOtWkjPfOMlJpq3bwAAACCCWUGdWDFCmnECOcgK0n795vHV6ywZl4AAADBhjDrZXa7eUXWMCq+5zg2ebI5DgAAALVDmPWyzz+veEW2PMOQ9u0zxwEAAKB2CLNeduCAd8cBAACgcoRZL0tI8O44AAAAVI4w62V9+phdC2w21+/bbFJSkjkOAAAAtUOY9bLQULP9llQx0Dpez5lDv1kAAABvIMzWgdRUaflyKTHR+XibNuZx+swCAAB4B2G2jqSmSnv2SPPnm69btJB27ybIAgAAeBNhtg6FhkqDBpnPCwooLQAAAPA2wmwda97cfDx1yvwBAACA9xBm61jjxlLIf/9TPnrU2rkAAAAEG8JsHQsJkZo2NZ8fOWLpVAAAAIIOYdYHHKUGXJkFAADwLsKsDzRrZj4SZgEAALyLMOsDjjBLmQEAAIB3EWZ9gDIDAACAumF5mJ07d66Sk5MVFRWlXr16acOGDVWOP3bsmCZOnKiEhARFRkbqggsu0MqVK300W89QZgAAAFA3wqz88mXLlikjI0Pz5s1Tr169NGfOHA0ZMkQ7duxQq1atKowvLi7WoEGD1KpVKy1fvlyJiYn6+eef1dTRLsBPUWYAAABQNywNs7Nnz9btt9+utLQ0SdK8efP04YcfatGiRfq///u/CuMXLVqkI0eO6IsvvlB4eLgkKTk52ZdT9ghlBgAAAHXDsjBbXFysTZs2acqUKWXHQkJCNHDgQK1fv97lZz744AOlpKRo4sSJev/999WyZUvddNNNuu+++xRayV6xRUVFKioqKnudn58vSSopKVFJSYlHc3d8zt3Px8TYJIXpyJFSlZTYPfpO1I2ariX8F2sZPFjL4MFaBg9fr2VNvseyMHv48GHZ7XbFxcU5HY+Li9P27dtdfuann37Sp59+qjFjxmjlypXatWuXJkyYoJKSEk2bNs3lZ2bOnKkZM2ZUOL569WpFR0fX6nfIzMx0a9xPPyVI6qmffjqmlSs/r9V3om64u5bwf6xl8GAtgwdrGTx8tZaFhYVuj7W0zKCmSktL1apVK7344osKDQ1V9+7dtX//fj3xxBOVhtkpU6YoIyOj7HV+fr6SkpI0ePBgxcTEeDSPkpISZWZmatCgQWXlDlVp1Mimxx6TDKOZrrnmGo++E3WjpmsJ/8VaBg/WMniwlsHD12vp+Jd0d1gWZmNjYxUaGqq8vDyn43l5eYqPj3f5mYSEBIWHhzuVFHTs2FG5ubkqLi5WREREhc9ERkYqMjKywvHw8PBaL4a752jZ0nw8dszGH7Of8sZ/H+AfWMvgwVoGD9YyePhqLWvyHZa15oqIiFD37t2VlZVVdqy0tFRZWVlKSUlx+ZkrrrhCu3btUmlpadmxnTt3KiEhwWWQ9RfluxkYhrVzAQAACCaW9pnNyMjQggUL9Oqrr+rHH3/U+PHjVVBQUNbdYOzYsU43iI0fP15HjhzRpEmTtHPnTn344Yf629/+pokTJ1r1K7jF0c3g9GmpoMDauQAAAAQTS2tmR44cqUOHDmnq1KnKzc1Vt27dtGrVqrKbwvbu3auQkDN5OykpSR9//LH+/Oc/q0uXLkpMTNSkSZN03333WfUruCU6WgoPl0pKzPZcjRpZPSMAAIDgYPkNYOnp6UpPT3f5XnZ2doVjKSkp+vLLL+t4Vt5ls5mlBgcPmqUGSUlWzwgAACA4WL6dbX3BxgkAAADeR5j1EcdNYIRZAAAA7yHM+kj5jgYAAADwDsKsj1BmAAAA4H2EWR+hzAAAAMD7CLM+QpkBAACA9xFmfYQyAwAAAO8jzPoIZQYAAADeR5j1EcoMAAAAvI8w6yOUGQAAAHgfYdZHKDMAAADwPsKsj5QPs6Wl1s4FAAAgWBBmfcQRZg1Dys+3di4AAADBgjDrI1FRUoMG5nNKDQAAALyDMOtDdDQAAADwLsKsD9HRAAAAwLsIsz5ERwMAAADvIsz6EGUGAAAA3kWY9SHKDAAAALyLMOtDlBkAAAB4F2HWhygzAAAA8C7CrA9RZgAAAOBdhFkfoswAAADAuwizPkSZAQAAgHcRZn2IMgMAAADvIsz6EGUGAAAA3kWY9SFHmM3Pl06ftnYuAAAAwYAw60OOMCtJx45ZNg0AAICgQZj1obAwqXFj8zmlBgAAALVHmPUxOhoAAAB4D2HWx+hoAAAA4D2EWR+jowEAAID3EGZ9jDIDAAAA7yHM+hhlBgAAAN5DmPUxygwAAAC8hzDrY5QZAAAAeA9h1scoMwAAAPAewqyPUWYAAADgPYRZH6PMAAAAwHsIsz5GmQEAAID3EGZ9jDIDAAAA7yHM+pgjzBYWSkVF1s4FAAAg0BFmfaxJE8lmM59zdRYAAKB2CLM+FhIiNW1qPifMAgAA1A5h1gJ0NAAAAPAOwqwF6GgAAADgHYRZC9DRAAAAwDsIsxagzAAAAMA7CLMWoMwAAADAOwizFqDMAAAAwDsIsxagzAAAAMA7CLMWoMwAAADAOwizFqDMAAAAwDsIsxagzAAAAMA7CLMWoMwAAADAOwizFihfZmAY1s4FAAAgkBFmLeAIs8XFUmGhtXMBAAAIZIRZCzRqJIWFmc8pNQAAAPAcYdYCNhsdDQAAALyBMGsROhoAAADUHmHWInQ0AAAAqD3CrEUoMwAAAKg9wqxFKDMAAACoPb8Is3PnzlVycrKioqLUq1cvbdiwodKxr7zyimw2m9NPVFSUD2frHZQZAAAA1J7lYXbZsmXKyMjQtGnTtHnzZnXt2lVDhgzRwYMHK/1MTEyMDhw4UPbz888/+3DG3kGZAQAAQO1ZHmZnz56t22+/XWlpaerUqZPmzZun6OhoLVq0qNLP2Gw2xcfHl/3ExcX5cMbeQZkBAABA7YVZ+eXFxcXatGmTpkyZUnYsJCREAwcO1Pr16yv93MmTJ9W2bVuVlpbqkksu0d/+9jdddNFFLscWFRWpqKio7HV+fr4kqaSkRCUlJR7N2/E5Tz8vSTExNklhOnKkVCUldo/Pg9rxxlrCP7CWwYO1DB6sZfDw9VrW5HssDbOHDx+W3W6vcGU1Li5O27dvd/mZCy+8UIsWLVKXLl10/PhxPfnkk7r88su1bds2tWnTpsL4mTNnasaMGRWOr169WtHR0bWaf2Zmpsef/emneEm9tHv3ca1c+Vmt5oHaq81awr+wlsGDtQwerGXw8NVaFhYWuj3WZhiGUYdzqVJOTo4SExP1xRdfKCUlpez4vffeq7Vr1+qrr76q9hwlJSXq2LGjRo8erYcffrjC+66uzCYlJenw4cOKiYnxaN4lJSXKzMzUoEGDFB4e7tE51q2z6fe/D1P79oZ++OG0R+dA7XljLeEfWMvgwVoGD9YyePh6LfPz8xUbG6vjx49Xm9csvTIbGxur0NBQ5eXlOR3Py8tTfHy8W+cIDw/XxRdfrF27drl8PzIyUpGRkS4/V9vFqM05WrUyH48etfEH7ge88d8H+AfWMniwlsGDtQwevlrLmnyHpTeARUREqHv37srKyio7VlpaqqysLKcrtVWx2+3aunWrEhIS6mqadaJ8N4PSUmvnAgAAEKgsvTIrSRkZGRo3bpx69Oihnj17as6cOSooKFBaWpokaezYsUpMTNTMmTMlSQ899JAuu+wytW/fXseOHdMTTzyhn3/+WbfddpuVv0aNOcJsaal04oTUpIm18wEAAAhElofZkSNH6tChQ5o6dapyc3PVrVs3rVq1quymsL179yok5MwF5KNHj+r2229Xbm6umjVrpu7du+uLL75Qp06drPoVPNKggRQVJZ06ZV6dJcwCAADUnOVhVpLS09OVnp7u8r3s7Gyn108//bSefvppH8yq7jVrJh04YIbZ5GSrZwMAABB4LN80oT5j4wQAAIDaIcxaqHlz85EtbQEAADxDmLVQ+Y4GAAAAqDnCrIUoMwAAAKgdwqyFKDMAAACoHcKshSgzAAAAqB3CrIUoMwAAAKgdwqyFKDMAAACoHcKshbgyCwAAUDuEWQtRMwsAAFA7hFkLUWYAAABQO4RZCzmuzB4/Ltnt1s4FAAAgEBFmLeQIs5J07Jhl0wAAAAhYhFkLhYdLjRqZzyk1AAAAqDnCrMXoaAAAAOA5wqzF6GgAAADgOcKsxehoAAAA4DnCrMUoMwAAAPAcYdZilBkAAAB4jjBrMcoMAAAAPEeYtRhlBgAAAJ4jzFqMMgMAAADPEWYtRpkBAACA5wizFqPMAAAAwHOEWYtRZgAAAOA5wqzFKDMAAADwHGHWYo4rswUFUnGxtXMBAAAINIRZizVpcuY5V2cBAABqhjBrsdBQqWlT8zlhFgAAoGYIs36AjgYAAACeIcz6AToaAAAAeIYw6wfoaAAAAOAZwqwfoMwAAADAM4RZP0CZAQAAgGcIs36AMgMAAADPEGb9AGUGAAAAniHM+gHKDAAAADxDmPUDlBkAAAB4hjDrBygzAAAA8Axh1g9QZgAAAOAZwqwfKF9mYBjWzgUAACCQEGb9gOPKbFGR9Ntv1s4FAAAgkBBm/UDjxlJoqPmcUgMAAAD3EWb9gM1G3SwAAIAnCLN+go4GAAAANUeY9RNcmQUAAKg5wqyfYOMEAACAmiPM+gnKDAAAAGqOMOsnKDMAAACoOcKsn6DMAAAAoOYIs36CMgMAAICaI8z6CcoMAAAAao4w6ycoMwAAAKg5wqyfoMwAAACg5gizfoIyAwAAgJojzPqJ8mUGhmHtXAAAAAIFYdZPOK7M2u3SiRPWzgUAACBQEGb9RIMGUkSE+ZxSAwAAAPcQZv2EzUZHAwAAgJoizPoROhoAAADUDGHWj9DRAAAAoGYIs36EMgMAAICaIcz6EcoMAAAAasYvwuzcuXOVnJysqKgo9erVSxs2bHDrc0uXLpXNZtMNN9xQtxP0EcoMAAAAasbyMLts2TJlZGRo2rRp2rx5s7p27aohQ4bo4MGDVX5uz549uueee9SnTx8fzbTuUWYAAABQM5aH2dmzZ+v2229XWlqaOnXqpHnz5ik6OlqLFi2q9DN2u11jxozRjBkzdN555/lwtnWLMgMAAICaCbPyy4uLi7Vp0yZNmTKl7FhISIgGDhyo9evXV/q5hx56SK1atdKf/vQnff7551V+R1FRkYqKispe5+fnS5JKSkpUUlLi0bwdn/P085Vp2NAmKUw//FCqTz4pVe/ehkJDvfoVOEtdrSV8j7UMHqxl8GAtg4ev17Im32NpmD18+LDsdrvi4uKcjsfFxWn79u0uP7Nu3Tq99NJL2rJli1vfMXPmTM2YMaPC8dWrVys6OrrGcy4vMzOzVp8vb/36BD3/fFdJYdq2LUSDBoWoRYvfdNttW5WScsBr3wPXvLmWsBZrGTxYy+DBWgYPX61lYWGh22MtDbM1deLECf3xj3/UggULFBsb69ZnpkyZooyMjLLX+fn5SkpK0uDBgxUTE+PRPEpKSpSZmalBgwYpPDzco3OU9+67Ns2aFSrDcD5+5EiUZs26VEuX2jVsmOH6w6gVb68lrMNaBg/WMniwlsHD12vp+Jd0d1gaZmNjYxUaGqq8vDyn43l5eYqPj68w/j//+Y/27Nmj6667ruxYaWmpJCksLEw7duxQu3btnD4TGRmpyMjICucKDw+v9WJ44xx2u/SXv6hCkJUkw7DJZpPuuSdMw4eLkoM65I21hH9gLYMHaxk8WMvg4au1rMl3WHoDWEREhLp3766srKyyY6WlpcrKylJKSkqF8R06dNDWrVu1ZcuWsp/rr79e/fv315YtW5SUlOTL6XvF559Lv/xS+fuGIe3bZ44DAACAM8vLDDIyMjRu3Dj16NFDPXv21Jw5c1RQUKC0tDRJ0tixY5WYmKiZM2cqKipKnTt3dvp806ZNJanC8UBxwM1yWHfHAQAA1CeWh9mRI0fq0KFDmjp1qnJzc9WtWzetWrWq7KawvXv3KiTE8g5idSYhwbvjAAAA6hPLw6wkpaenKz093eV72dnZVX72lVde8f6EfKhPH6lNG2n/ftd1szab+X4Q7Q0BAADgNcF7yTNAhIZKzzxjPrfZXI+ZM4ebvwAAAFwhzPqB1FRp+XIpMdH5uM0mLVlivg8AAICKCLN+IjVV2rNHWrNGeuMNKTbWLDsI4nJhAACAWiMq+ZHQUKlfP2nMGOnOO81jixZZOiUAAAC/Rpj1U7fcYj6uXm32mQUAAEBFhFk/1b691LevWWrw2mtWzwYAAMA/EWb92H/3jdCiRdJ/d+0FAABAOYRZPzZihNSokfTTT2xnCwAA4Aph1o81bCiNGmU+f/lla+cCAADgjwizfs5RavD221J+vrVzAQAA8DeEWT+XkiJdeKFUWCi99ZbVswEAAPAvhFk/Z7NJt95qPqfnLAAAgDPCbAD44x/NDRXWr5e2b7d6NgAAAP6DMBsAEhKkq682n3MjGAAAwBmE2QDhKDV47TXp9Glr5wIAAOAvCLMB4tprpZYtpdxcadUqq2cDAADgHwizASIiwqydlbgRDAAAwIEwG0AcPWf/8Q/p4EFr5wIAAOAPCLMBpHNn6dJLzZrZN96wejYAAADWI8wGmPI9Zw3D2rkAAABYjTAbYEaNkqKipG3bpI0brZ4NAACAtQizAaZpUyk11XzOjWAAAKC+I8wGIEepweuvS6++KmVnS3a7pVMCAACwBGE2AB09am5vW1Ag3XKL1L+/lJwsrVhh9cwAAAB8izAbYFaskG68seKV2P37pREjCLQAAKB+8SjM7tu3T7/88kvZ6w0bNmjy5Ml68cUXvTYxVGS3S5Mmue5i4Dg2eTIlBwAAoP7wKMzedNNNWrNmjSQpNzdXgwYN0oYNG/TAAw/ooYce8uoEccbnn0vl/j9EBYYh7dtnjgMAAKgPPAqz33//vXr27ClJeuutt9S5c2d98cUXWrx4sV555RVvzg/lHDjg3XEAAACBzqMwW1JSosjISEnSJ598ouuvv16S1KFDBx0gSdWZhATvjgMAAAh0HoXZiy66SPPmzdPnn3+uzMxMXXXVVZKknJwctWjRwqsTxBl9+kht2kg2m+v3bTYpKckcBwAAUB94FGYff/xxzZ8/X/369dPo0aPVtWtXSdIHH3xQVn4A7wsNlZ55xnzuKtAahjRnjjkOAACgPgjz5EP9+vXT4cOHlZ+fr2bNmpUdv+OOOxQdHe21yaGi1FRp+XKzq8HZN4PZbFLHjtbMCwAAwAoeXZn97bffVFRUVBZkf/75Z82ZM0c7duxQq1atvDpBVJSaKu3ZI61ZIy1ZYj4OHWpemZ061erZAQAA+I5HV2aHDh2q1NRU3XXXXTp27Jh69eql8PBwHT58WLNnz9b48eO9PU+cJTRU6tfvzOvYWOmDD8yrtps2Sd27WzY1AAAAn/HoyuzmzZvV5793GS1fvlxxcXH6+eef9dprr+nZZ5/16gThns6dpTFjzOd//au1cwEAAPAVj8JsYWGhGjduLElavXq1UlNTFRISossuu0w///yzVycI902fLoWFSatWSZ99ZvVsAAAA6p5HYbZ9+/Z67733tG/fPn388ccaPHiwJOngwYOKiYnx6gThvnbtpNtuM58/8IDrbW8BAACCiUdhdurUqbrnnnuUnJysnj17KiUlRZJ5lfbiiy/26gRRM3/9qxQVJa1bZ16hBQAACGYehdkRI0Zo79692rhxoz7++OOy4wMGDNDTTz/ttcmh5hITpfR08/kDD0ilpdbOBwAAoC55FGYlKT4+XhdffLFycnL0y38bnvbs2VMdOnTw2uTgmfvukxo3lr75RnrnHatnAwAAUHc8CrOlpaV66KGH1KRJE7Vt21Zt27ZV06ZN9fDDD6uUS4GWi42V7rnHfP7gg9Lp09bOBwAAoK54FGYfeOABPffcc3rsscf0zTff6JtvvtHf/vY3/f3vf9eDDz7o7TnCA3/+sxlqd+yQXnvN6tkAAADUDY/C7KuvvqqFCxdq/Pjx6tKli7p06aIJEyZowYIFeuWVV7w8RXiicWNpyhTz+fTpUlGRpdMBAACoEx6F2SNHjrisje3QoYOOHDlS60nBO8aPN28I27dPmj/f6tkAAAB4n0dhtmvXrnruuecqHH/uuefUpUuXWk8K3tGggTR1qvn8kUekjz6S3nxTys6W7HZLpwYAAOAVYZ58aNasWbr22mv1ySeflPWYXb9+vfbt26eVK1d6dYKonbQ0M9Dm5UnXXHPmeJs20jPPSKmp1s0NAACgtjy6Mtu3b1/t3LlTw4YN07Fjx3Ts2DGlpqZq27Ztev311709R9TCP/5hBtmz7d8vjRghrVjh+zkBAAB4i0dXZiWpdevWevTRR52Offvtt3rppZf04osv1npiqD27XZo0yfV7hiHZbNLkydLQoVJoqE+nBgAA4BUeb5oA//f559J/97NwyTDMm8M+/9x3cwIAAPAmwmwQO3DAu+MAAAD8DWE2iCUkeHccAACAv6lRzWxqNbe+Hzt2rDZzgZf16WN2Ldi/3ywpcCUpyRwHAAAQiGoUZps0aVLt+2PHjq3VhOA9oaFm+60RI8ybvVwF2j59uPkLAAAErhqF2Zdffrmu5oE6kpoqLV9udjUofzNYs2bS0aPSkiXSjTeaHQ0AAAACDTWz9UBqqrRnj7RmjRle16yRDh2SJk403x8zRvruO0unCAAA4BGP+8wisISGSv36OR97+mlp+3YpK0u6/nrp66+lli0tmR4AAIBHuDJbj4WHS2+9JbVvL/38szR8uFRcbPWsAAAA3EeYreeaN5c++ECKiTE3T5gwofLOBwAAAP6GMgOoY0dp6VLpD3+QXnpJuugi6eKLzc0UEhLoeAAAAPwXV2YhSbr6aumJJ8znGRlS//7STTeZj8nJ0ooVlk4PAADAJcIsyrRt6/r4/v1mr1oCLQAA8DeEWUiS7HZp8mTX7zlqaCdPNscBAAD4C8IsJJk3f5XfVOFshiHt22eOAwAA8Bd+EWbnzp2r5ORkRUVFqVevXtqwYUOlY1esWKEePXqoadOmatiwobp166bXX3/dh7MNTgcOeHccAACAL1geZpctW6aMjAxNmzZNmzdvVteuXTVkyBAdPHjQ5fjmzZvrgQce0Pr16/Xdd98pLS1NaWlp+vjjj3088+CSkODdcQAAAL5geZidPXu2br/9dqWlpalTp06aN2+eoqOjtWjRIpfj+/Xrp2HDhqljx45q166dJk2apC5dumjdunU+nnlw6dNHatNGstkqHxMTY44DAADwF5b2mS0uLtamTZs0ZcqUsmMhISEaOHCg1q9fX+3nDcPQp59+qh07dujxxx93OaaoqEhFRUVlr/Pz8yVJJSUlKikp8Wjejs95+nl/9dRTNo0aFSqbTTKM8qnWkGRTfr704ounddttwbOrQrCuZX3EWgYP1jJ4sJbBw9drWZPvsRmGdfs95eTkKDExUV988YVSUlLKjt97771au3atvvrqK5efO378uBITE1VUVKTQ0FA9//zzuvXWW12OnT59umbMmFHh+JIlSxQdHe2dXySIrF+foIULf6dff21Qdiw2tlDnn39U69cnKiTE0L33btBll+VaOEsAABDMCgsLddNNN+n48eOKiYmpcmxAhtnS0lL99NNPOnnypLKysvTwww/rvffeU79+/SqMdXVlNikpSYcPH672P5zKlJSUKDMzU4MGDVJ4eLhH5/Bndru0bp2tbAew3r0NhYRI48eHatGiEEVFGVq50q7evQP/Cm2wr2V9wloGD9YyeLCWwcPXa5mfn6/Y2Fi3wqylZQaxsbEKDQ1VXl6e0/G8vDzFx8dX+rmQkBC1b99ektStWzf9+OOPmjlzpsswGxkZqcjIyArHw8PDa70Y3jiHPwoPlwYOrHh8/nzp8GHpgw9sSk0N0+efS507+35+dSFY17I+Yi2DB2sZPFjL4OGrtazJd1h6A1hERIS6d++urKyssmOlpaXKyspyulJbndLSUqerr6gbYWHS0qXSFVdIx45JV10l7d1rXsnNzpbefNN8ZGMFAADgK5ZemZWkjIwMjRs3Tj169FDPnj01Z84cFRQUKC0tTZI0duxYJSYmaubMmZKkmTNnqkePHmrXrp2Kioq0cuVKvf7663rhhRes/DXqjQYNpA8+MLsa/PCDdPnl5oYKOTlnxrRpIz3zjJSaat08AQBA/WB5mB05cqQOHTqkqVOnKjc3V926ddOqVasUFxcnSdq7d69CQs5cQC4oKNCECRP0yy+/qEGDBurQoYPeeOMNjRw50qpfod5p3lxatUq6+GJp//6K7+/fL40YIS1fTqAFAAB1y/IwK0np6elKT093+V52drbT60ceeUSPPPKID2aFqrRubZYduGIYZr/ayZOloUOl0FCfTg0AANQjlm+agMD0+efSWfftOTEMad8+cxwAAEBdIczCIwcOeHccAACAJwiz8EhCgnfHAQAAeIIwC4/06WN2LbDZKh+TkGCOAwAAqCuEWXgkNNRsvyVVHmhPnpQ2bvTdnAAAQP1DmIXHUlPN9luJic7HW7eWzj1XOnFC6t/f7EsLAABQFwizqJXUVGnPHmnNGmnJEvNx717pu+/MHcJ++00aNkyaN88cz25hAADAm/yizywCW2io1K+f87FGjcwrsuPHSy+9ZD5mZkobNki//HJmHLuFAQCA2uDKLOpMeLi0YIE0Y4b5esUK5yArndktbMUK388PAAAEPsIs6pTNJj3wgNSsmev3DcN8nDyZkgMAAFBzhFnUuc8/l44erfx9dgsDAACeIsyizrFbGAAAqCuEWdQ5dgsDAAB1hTCLOufObmFNmki9e/tuTgAAIDgQZlHn3Nkt7Phx6a67pOJi380LAAAEPsIsfKKy3cKSkqRbb5VCQsx+tFddVfXNYgAAAOWxaQJ8JjVVGjrU7Fpw4IBZI9unj3nlNjVVGjXK3EHsssukDz+U2rc323W5Gg8AACARZuFjrnYLk6Rrr5X+9S/pD3+Qdu6UevWS/vxnaf58dgwDAACVo8wAfqNLF+mrr6RLL5WOHJEefJAdwwAAQNUIs/ArCQlSVpbUoIHr99kxDAAAlEeYhd/ZtEn67bfK32fHMAAA4ECYhd9hxzAAAOAuwiz8DjuGAQAAdxFm4Xfc2TEsIsIcAwAA6jfCLPyOOzuGFRdL3btLixefOWa3S9nZ0ptvmo/cIAYAQPAjzMIvVbVj2AsvSJdfLuXnSzffbP68/rqUnCz17y/ddJP5mJxMCy8AAIIdYRZ+KzVV2rPH3BVsyRLzcfdu6a67pLVrpenTzW1wFy+Wxo6lJy0AAPURO4DBr1W2Y1hYmDRtmvT735tXYV2VFBiGWaYwebK5jS7b4AIAEHy4MouAZrdXXRtLT1oAAIIbYRYBjZ60AADUb4RZBDR60gIAUL8RZhHQ3OlJGxUldezouzkBAADfIcwioLnTk/bUKalnT2nDBt/NCwAA+AZhFgGvqp60Tz0ltW8v7d0r9e4tPf+8eVOYZN44tnatTZ99lqi1a21ssgAAQAAizCIoVNaTNiND2rhRGjZMKimRJk6U/vhHc0xysjRoUJhmz+6hQYPC2GQBAIAARJhF0HD0pB092nx09JVt0kR65x3pySfNY4sXS2PGsMkCAADBgDCLesFmk/7yF+mTT8xdw1xxlB9Mnlx171oAAOA/CLOod0pLK3+PTRYAAAgshFnUK2yyAABAcCHMol5hkwUAAIILYRb1ijubLISESHl5Z2poAQCA/yLMol5xZ5OF0lJp1Cizndf+/eYxu13KzpbefNN85AYxAAD8A2EW9U5VmywsXSo9+KAUFia9/77UqZN0111mT9r+/aWbbjIf6UkLAIB/IMyiXnJsspCZeVoZGRuVmXlau3dLI0dKDz0kbd5sboGbny/Nn09PWgAA/BVhFvVWaKjUt6+hK6/cr759jbJNFiTpd78z23M1aeL6s/SkBQDAPxBmgUp88YV0/Hjl79OTFgAA6xFmgUrQkxYAAP9HmAUq4W6v2SNH6nYeAACgcoRZoBLu9KSVpPR0s3a2oODMMVp5AQDgG4RZoBJV9aS12cyffv3M1888Y940lpVldjiglRcAAL5BmAWqUFlP2jZtzONr1kgffSSdc460e7c0cKA0fDitvAAA8BXCLFANR0/aNWukJUvMx927zeOSdNVV0vffm5srVIZWXgAA1A3CLOCG0FCzpGD0aPOxfE9aSWrc2NxwoSq08gIAwPsIs4CX0MoLAADfC7N6AkCwcLeV186dZqmB4+qu3W5erT1wwDxHnz4Vr/wCAADXuDILeIm7rbymT5c6dJDmz5eWLqXzAQAAtUGYBbzEnVZeI0ZIzZpJu3aZN4yNHk3nAwAAaoMwC3hRda283n5b2rtXmj278lICOh8AAOA+amYBL0tNlYYOrbwOtlEj6eKLqw6q5TsfODZmAAAAFRFmgTrgaOVVGXc7GuzYUfE83DAGAMAZlBkAFnC388HkydKUKdKvv5qv2SoXAABnhFnAAu50PggPl06dkh57zAysI0aYP9wwBgDAGYRZwALudD54803p/felbt2kkyeld945c3NYedwwBgCoz/wizM6dO1fJycmKiopSr169tGHDhkrHLliwQH369FGzZs3UrFkzDRw4sMrxgL+qrvPB8OHS9ddLmzdLDz1U9bnYKhcAUF9ZHmaXLVumjIwMTZs2TZs3b1bXrl01ZMgQHTx40OX47OxsjR49WmvWrNH69euVlJSkwYMHa//+/T6eOVB7qanSnj3SmjXSkiXm4+7d5nEHm01q396987FVLgCgvrE8zM6ePVu333670tLS1KlTJ82bN0/R0dFatGiRy/GLFy/WhAkT1K1bN3Xo0EELFy5UaWmpsrKyfDxzwDscnQ9GjzYfXXUmcPeGMXfHAQAQLCxtzVVcXKxNmzZpypQpZcdCQkI0cOBArV+/3q1zFBYWqqSkRM2bN3f5flFRkYqKispe5+fnS5JKSkpUUlLi0bwdn/P08/AfgbKWl10mJSaGKSdHMozK7hoz9Morhtq3tysuzjxit0vr1tnK2nj17m0EbRuvQFlLVI+1DB6sZfDw9VrW5HtshuHqlhLfyMnJUWJior744gulpKSUHb/33nu1du1affXVV9WeY8KECfr444+1bds2RUVFVXh/+vTpmjFjRoXjS5YsUXR0dO1+AcCH1q9P0OOPX/rfV+UDreF0rEGDEt144061bFmol1/urF9/bVA2skWL33TbbVuVkkI9AgDAfxUWFuqmm27S8ePHFRMTU+XYgN404bHHHtPSpUuVnZ3tMshK0pQpU5SRkVH2Oj8/v6zOtrr/cCpTUlKizMxMDRo0SOHh4R6dA/4hkNbymmukSy6xKyMjVOVLxNu0kZ56yq74eCkjI0SbNoXr1Vcv0pmQe8aRI1GaNetSLV1q17Bhlv3/2DoRSGuJqrGWwYO1DB6+XkvHv6S7w9IwGxsbq9DQUOXl5Tkdz8vLU3x8fJWfffLJJ/XYY4/pk08+UZcuXSodFxkZqcjIyArHw8PDa70Y3jgH/EOgrOWNN5pdDpx3ALMpNNT8U96wQXr1Vem226TS0orlCIZhk80m3XNPmIYPD86dwwJlLVE91jJ4sJbBw1drWZPvsPQGsIiICHXv3t3p5i3HzVzlyw7ONmvWLD388MNatWqVevTo4YupAn6jqhvGQkKkc8+VSksr/3xVbbzsdik72+xxm51N31oAgP+zvJtBRkaGFixYoFdffVU//vijxo8fr4KCAqWlpUmSxo4d63SD2OOPP64HH3xQixYtUnJysnJzc5Wbm6uTJ09a9SsAfsXd9lzr1jlvwsBWuQCAQGR5zezIkSN16NAhTZ06Vbm5uerWrZtWrVqluP/ejr13716FhJzJ3C+88IKKi4s1YsQIp/NMmzZN06dP9+XUAb/kbnuuBx80e9uOGyc1by7deWfFHcYcW+UuX+7c+xYAAH9heZiVpPT0dKWnp7t8Lzs72+n1nj176n5CQADr08e8KWz/ftfb30pSdLRZQvDjj9L//V/l5zIMc9OGyZOloUODs8YWABDYLC8zAOBdoaHSM8+Yz21n3QNms5k/r78u5eVJCxZInTtXfT62ygUA+DPCLBCEUlPN0oDEROfjbdqcKRlo0sTsenD//e6dk61yAQD+yC/KDAB4X2qqWRrg3MarYqmAuzW25TbSK2O3V39+AADqEmEWCGKONl5VcafGVpLS0qQPP5T++lepa1ezy8GkSdIvv5wZ06aNWeLAzWIAAF+hzACo59ypse3Z03y9fLnUrZt06aXm5g3lg6x0pvsB7bwAAL5CmAVQbY3tV19JW7dKo0aZxzdudH0ex5XdyZPZcAEA4BuEWQCSzEC7Z4+0Zo3Zf3bNGmn37jMlA507mzuDvfpq1eeh+wEAwJeomQVQxp0aW3e3yz67+wE3iwEA6gJXZgHUiLvdD15/XfruO/M5W+UCAOoKYRZAjTi6H5x9s9jZPvrI7HrQuTM3iwEA6g5hFkCNuNP94NFHpf/3/6SQEGnbNtfn4WYxAIA3EGYB1Fh13Q/uv1966y3zhrGqVHWzmN0uZWeb58jOJvACAFzjBjAAHnFnhzF3A+iOHc43nrEhAwDAXYRZAB6rrvuBuzeLTZwoffKJdPvtUn6+dOONFXcjc9TYLl9OoAUAnEGZAYA6487NYhER5hXc5culIUPMjRlcbatLjS0AwBXCLIA6487NYm++KW3ZIqWnSw0bVh1U2ZABAHA2wiyAOlXdzWKpqWYLr7//XZo7171znr0hAwCg/qJmFkCdc+dmMUlq29a987Vo4fzabpfWrrXps88S1bChTf37s7sYANQXXJkF4BOOm8VGjzYfXYVNdzdkGDdOevJJ6cSJM7uLDRoUptmze2jQoDB2FwOAeoQwC8BvVFdjK0nNm0u5udL//q8UH8/uYgBQ3xFmAfiVqmps33nHLFNYtEi64AKpsND1Oeh8AAD1BzWzAPxOdTW2aWlmfe2AAZWfo3zng7N74drt1dfvAgACA2EWgF+qbkOGvDz3zvP221L37lLjxuZrdhcDgOBCmQGAgOTu7mLPPy/FxZmbMUyZYtbSUmMLAMGDK7MAApKj88H+/a53DLPZzKuxrVpJu3ZJy5ZVfi7DMMdPnmyWN5QvOaAkAQD8G1dmAQQkdzofvPyytHOn9PXX5pXXqrjaXczR9qt/f+mmm8xH2n4BgH8hzAIIWO7sLmazST16uF8Pu3ixeRV2xQpKEgAgEBBmAQS01FRpzx4pM/O0MjI2KjPztHbvrhhe3a2xXbhQat3a3NzBVflCdW2/7HYpO1t6803zkdZgAFC3CLMAAl5oqNS3r6Err9yvvn0Nj3YXs9mkJk2kSy81XxcXV/59rkoSJMoSAMAKhFkA9YI7NbaLFkkbNkhz57p3zk8+kU6dMp9TlgAA1iDMAqg33KmxlaROndw736OPSs2amZs3pKV5VpYAAKgdWnMBqFeq211Mqr7tlyRFR0sxMVJurvTpp1V/Z1W7kQEAaocrswDqHcfuYqNHm49n19hWV5Jgs0mvvy7l5Eg//CCNG+fe9x44UNuZAwDORpgFABfcbfvVsaN0yy3unTMuzvk1nQ8AoPYIswBQCUfbrzVrpCVLzEdXbb+q65TgkJ5unsdup/MBAHgLYRYAqlBdSYJjTHWdEqKjpR9/lMaMkZKSpOHD6XwAAN5AmAUAL6iqLOGdd8z62kceMbsfVFY7y4YMAFBzdDMAAC+prlPCAw9Il1wiXXNN5eeorPPBihXSpEnOV3PbtDGvCLu7VS8ABCPCLAB4kaMsoTLHjrl3ngkTzJKDPn2kgwelP/6xYpswR1lC+R65AFDfEGYBwIcSEtwb9+OP0sMPVz3GMMya3MmTzSvCrup5ASDYUTMLAD5UXecDm02Kj5eef968WaxVq6rPV74soTzqawHUF4RZAPAhdzofzJ0rjR8vvfGGNGeOe+f94Yczz2n7BaA+IcwCgI+5syGDg7tlCXffLV13nXTffWYdLW2/ANQX1MwCgAWq63zg4ChL2L+/4g1gDhERUnGx9M9/mj+uUF8LIFhxZRYALOKNDRlsNrMu9ocfpFGjqv6+yuprJWpsAQQuwiwA+Dl3yhI6dpSuv9698+3e7fyaGlsAgYwyAwAIAO6UJbhbXzt+vPTJJ9LNN0snT0ojR9LDFkDgIswCQICobkMGd+prw8KkoiJpyRLzJyTE9VhqbAEECsoMACBIuFNfu3Sp9NVXZveDJk2k0tLKz0cPWwCBgDALAEGkuvra4cOlnj2lZ5+V/v53985Zvs0X9bUA/A1lBgAQZNxt+5WU5N75Jkwwa2zj46VZs2peX2u3Vz8XAPAUYRYAglB19bWSezW2ISHSiRPSq69Wfp6q6mtXrJAmTXK+utumjVkOwY1lALyBMgMAqKfcrbHNzjbLE6riqK999FFp2zbzJrMVK9iNDEDdI8wCQD1WXY3t//t/Ut++1YdZh2nTpM6dpQYNpBtvrLxTgmReyT375jG7XVq71qbPPkvU2rU2bi4DUC3CLADUc6mp0p490po1ZruuNWvMjRXKlwG428P2ggukxo3NwFpVEHXVKcFxc9mgQWGaPbuHBg0K4+YyANWiZhYAUOsetjab+f4PP5h1ti+8IE2cWP33zp0rtWolbd9ulh5wcxmAmuLKLACgWtXV10rSnDnmOJtN6tTJvfMuXy5ddJHrXcikqksSaBMGQCLMAgDcVF19bfkrp44ruWcHXwebTWreXLrmGnNXstOnK/9eR0nC2rVnjnFzGQAHwiwAwG3u1NdK7l3JXbBA+vBDad489757yBCzJnfgQGnsWM9uLmPnMiD4EGYBADXiqK8dPdp8rKxG1d0rue3aufe9p09L//63lJUlFRRUPq6qm8soSQCCDzeAAQDqjDu7kblzc1lionkV+JdfpGXL3LuaO2GCNGqUeUPa1KncXAYEK8IsAKBOVdcpwVGSMGKEGVzLh05HScIzz0jt25s/knth9scfzb63lWHnMiA4UGYAALCct28ui4+Xnn+++i19HSUJs2aZwdUwuLkMCDSWh9m5c+cqOTlZUVFR6tWrlzZs2FDp2G3btmn48OFKTk6WzWbTnDlzfDdRAECdctxclpl5WhkZG5WZedrjm8vmzpXGj5fuuMO9777/fikpSYqNNWtqubkMCByWhtlly5YpIyND06ZN0+bNm9W1a1cNGTJEBw8edDm+sLBQ5513nh577DHFx8f7eLYAgLoWGir17Wvoyiv3q29fo9Y3l7m7c1lysvndR45IRUWVj+PmMsD/WBpmZ8+erdtvv11paWnq1KmT5s2bp+joaC1atMjl+EsvvVRPPPGERo0apcjISB/PFgDgT9xpE+ZOSUJSkrRrl3TypPToo+5998KF0o4d0jvvUJIAWM2yG8CKi4u1adMmTZkypexYSEiIBg4cqPXr13vte4qKilRU7v9m5+fnS5JKSkpUUlLi0Tkdn/P08/AfrGXwYC2DR03X8oorzjwvLTV/ynvqKZtGjQr9781lZ1KtzWbWDTz5pF2lpeZV4J49bXLnfxoXLzZ/QkON/5YfOKdl8+YyQ5MmSddcc7rCFWa7XVq3zlbWKaF378qvQgcy/i6Dh6/XsibfY1mYPXz4sOx2u+Li4pyOx8XFafv27V77npkzZ2rGjBkVjq9evVrR0dG1OndmZmatPg//wVoGD9YyeHhrLSMjpXvvTdDChb/Tr782KDveosVv+tOfvldk5AGtXGkes9ulFi0G69dfo3R2QDUZatiwRO3aHdP338fKbq/8HzgNw6ZffpGefPIr/e53v5YdX7/e9Vxuu22rUlIO1PbX9Uv8XQYPX61lYWGh22ODvjXXlClTlJGRUfY6Pz9fSUlJGjx4sGJiYjw6Z0lJiTIzMzVo0CCFh4d7a6qwAGsZPFjL4FEXa3nNNdL06dK6dafLXQ0NV2joxZIudhr7/PM2jRolSYbLK7mLFoVo2LBmeuWVUt1xR/XVeuvXX64OHUp1+eWG1q2zadas0Ao3mB05EqVZsy7V0qV2DRvm4u6zAMXfZfDw9Vo6/iXdHZaF2djYWIWGhiovL8/peF5enldv7oqMjHRZXxseHl7rxfDGOeAfWMvgwVoGD2+vZXi4uRVudW68UQoLc9Vn1qY5c6TUVPN/Os8/373vXbkyRCtXmqE3LKyyTgk22WzSPfeEafjw4Nucgb/L4OGrtazJd1h2A1hERIS6d++urKyssmOlpaXKyspSSkqKVdMCAMBrN5c1by796U/SRReZx06frvw7XXVKkGj7BVTH0jKDjIwMjRs3Tj169FDPnj01Z84cFRQUKC0tTZI0duxYJSYmaubMmZLMm8Z++OGHsuf79+/Xli1b1KhRI7V3bAsDAIAXeGPnsgULzgTghQul22+v/nu3bz/zvZ7sRMY2vKhvLA2zI0eO1KFDhzR16lTl5uaqW7duWrVqVdlNYXv37lVIyJmLxzk5Obr44jO1TU8++aSefPJJ9e3bV9nZ2b6ePgCgnnP0u3UVOM2ShDPH3L3mMnGi9N570gUXSM89V7EswdH26+yd0SS24UX9ZPkNYOnp6UpPT3f53tkBNTk5WYarYiMAACySmioNHVr91VBHWcL+/a7rZiUpIkIqLpY+/tj8ccVs+2XuRDZ06JnvcWzDW5PwCwQDy7ezBQAg0DlKEkaPNh9d/bN+ddvw2mxmXezOndK4cVV/n6O+tnNnacAA6frrpZtvrvk2vEAwIMwCAOAj7mzDe/750pAh7p1v+3bp00+lf/xD+u23ysdVdnMZEAwsLzMAAKA+cacsISHBvXM9+qh07rlmoF24sPrx+/c7v67pzWLcXAZ/RJgFAMDHquuUUF19rc1mvn/ffea5EhLcC7NTpkhFRdKYMdKHH9bsZjFuLoO/oswAAAA/U119rWR2S3BcFa2u563jc/v2mX1vExKk4cOdg6l05maxFSucjztuLnN3POBLhFkAAPyQO/W1Du7cXPb669KTT0qtW0tHj7r+TsMwf+66ywyob70lvfqqdNttdX9zGZtDwFOUGQAA4KfcbfvlGOtOz9suXaTBg6v+3kOHzCu37ih/c1n50gm7XVq71qbPPktUw4Y29e9feX0tJQyoDcIsAAB+rLr62vLcCb+HD7t3rnbtzKvCR45I339f/fg33pC6dpWaNSsfTsMk9dDs2ZWHU/rjorYIswAABJHqwq+7nRIWLjTPk50t9e9f/fiXXjJLGbp1kzZsqPi+q3B6+rR0992VlzC42hxCogsDnFEzCwBAPVLdzWI2m5SUZI5zd3yTJtLvfmfuXuYqyEpn6nHHjJEuucQ8Z1SUlJNT+Vxd9cddsUJKTjYD9k03mY/JyZXfhFbT8Qg8hFkAAOqRmnZKcGf8okXSd9+51x7s1Cnpm2/MK7Xu3uT18MPSP/9p3hxWk64KdGGoHwizAADUMzXplFCT8dHR7n3///6v9PXX0tKl7o3/9FPpuuvMK6vudlWw2826Xbb4DX7UzAIAUA/VpFOCu+Pdrce95hqpRw/p4our3xwiNta8ivrOO9LBg5Wf01GScPHFUqtW0smTFa/IuhrvqgsD9biBhTALAEA9VZNOCe6Md3fnMkc9rqOEYcQI873yn3GUMMybZwbp3r3NetvqbN3q9q8jyQyhDjVtEUZLMf9AmQEAAPCKmtbjSu6XMLRu7d4cpk+XFi+W7r3XvfEvvyytXGluEOFv9bhsJOEewiwAAPCamtbjOj6zZ4+0Zo20ZIn5uHu381h3uzD89a9mbe3f/lb9Fr+SlJkpXXutNGqU+/W1p09L//M/dVuPW9MuDPU5+BJmAQCAVznCaWbmaWVkbFRm5ukK4fRsjhKG0aPNx7PrTr3dhcFmkx591Oxz26yZ62Dq4KivbdlSatxYCg83r8BWN758SzHJ/cBZ06u+9b39GGEWAAB4XWio1LevoSuv3K++fQ2v3BTl7S4M998vPfus9Pe/u/f9R4+aN5a5a8uWM8/dDZw17cLgq3IHx9bEa9fa/O6qL2EWAAAEDHdKEmo6/uywW5kFC6Rdu8zOCu7485+llBTpttvcC5x2uxmy3enC8Oyz0ubNUnq6b8odBg0K0+zZPTRoUJjfXfWlmwEAAAgoVnVhSEszz5WcXPV4SYqMNHdE+/JL88cVx2fHjJHatjVDdnGxe79TRkb1YyprP+Yux1Xfs39HV1sTW4krswAAoF6ri3rcJUvM0DdhQvXff+qUtGOHGWTdLcc45xwpJsa9seXbjzlUV78bSJtOEGYBAEC9Vxe7oiUkmP1x3TFlinlltrDQva4NP/0kvf++e+eePl2aP1/KzzdfV1e/axjSa6+5v+mE1SgzAAAAkLW7og0ebAZKqfqNJBxXiasrj3DYuVO66y6zNKFXL7Nu+Gz790vDh5vh+9//lvLy3Ju3q6u+vkaYBQAA+C+rd0WTzlz1dbW72Jw5Z64Su7OD2qJF0pEj5s1r27e7DrLSmc+uW2c+RkS4V7/rblivS5QZAAAA1BFPdkWT3O/aUF25wy23mFdkf/jB7IDgjqefNtuQuVPuUD6EW4UrswAAAHXI3SutZ3P3KrE75Q42mxQb69584+Kk6Gj3yx2sRpgFAACoYzWtx60pd4KvuyUBjnGehnBfI8wCAAD4QE3rcb3N0/rdoUOlNWtO66OPtujqq7upf/8wv7gi60DNLAAAQD3gaf1uXWxN7E2EWQAAgHqipv10AwFlBgAAAPVIXdfv+hphFgAAoJ6xun7XmygzAAAAQMAizAIAACBgEWYBAAAQsAizAAAACFiEWQAAAAQswiwAAAACFmEWAAAAAYswCwAAgIBFmAUAAEDAIswCAAAgYBFmAQAAELAIswAAAAhYhFkAAAAErDCrJ+BrhmFIkvLz8z0+R0lJiQoLC5Wfn6/w8HBvTQ0WYC2DB2sZPFjL4MFaBg9fr6UjpzlyW1XqXZg9ceKEJCkpKcnimQAAAKAqJ06cUJMmTaocYzPcibxBpLS0VDk5OWrcuLFsNptH58jPz1dSUpL27dunmJgYL88QvsRaBg/WMniwlsGDtQwevl5LwzB04sQJtW7dWiEhVVfF1rsrsyEhIWrTpo1XzhUTE8MfZ5BgLYMHaxk8WMvgwVoGD1+uZXVXZB24AQwAAAABizALAACAgEWY9UBkZKSmTZumyMhIq6eCWmItgwdrGTxYy+DBWgYPf17LencDGAAAAIIHV2YBAAAQsAizAAAACFiEWQAAAAQswiwAAAACFmG2hubOnavk5GRFRUWpV69e2rBhg9VTghs+++wzXXfddWrdurVsNpvee+89p/cNw9DUqVOVkJCgBg0aaODAgfr3v/9tzWRRqZkzZ+rSSy9V48aN1apVK91www3asWOH05hTp05p4sSJatGihRo1aqThw4crLy/PohmjMi+88IK6dOlS1oA9JSVFH330Udn7rGPgeuyxx2Sz2TR58uSyY6xnYJg+fbpsNpvTT4cOHcre99d1JMzWwLJly5SRkaFp06Zp8+bN6tq1q4YMGaKDBw9aPTVUo6CgQF27dtXcuXNdvj9r1iw9++yzmjdvnr766is1bNhQQ4YM0alTp3w8U1Rl7dq1mjhxor788ktlZmaqpKREgwcPVkFBQdmYP//5z/rHP/6ht99+W2vXrlVOTo5SU1MtnDVcadOmjR577DFt2rRJGzdu1O9//3sNHTpU27Ztk8Q6Bqqvv/5a8+fPV5cuXZyOs56B46KLLtKBAwfKftatW1f2nt+uowG39ezZ05g4cWLZa7vdbrRu3dqYOXOmhbNCTUky3n333bLXpaWlRnx8vPHEE0+UHTt27JgRGRlpvPnmmxbMEO46ePCgIclYu3atYRjmuoWHhxtvv/122Zgff/zRkGSsX7/eqmnCTc2aNTMWLlzIOgaoEydOGOeff76RmZlp9O3b15g0aZJhGPxdBpJp06YZXbt2dfmeP68jV2bdVFxcrE2bNmngwIFlx0JCQjRw4ECtX7/ewpmhtnbv3q3c3FyntW3SpIl69erF2vq548ePS5KaN28uSdq0aZNKSkqc1rJDhw4655xzWEs/ZrfbtXTpUhUUFCglJYV1DFATJ07Utdde67RuEn+Xgebf//63WrdurfPOO09jxozR3r17Jfn3OoZZ+u0B5PDhw7Lb7YqLi3M6HhcXp+3bt1s0K3hDbm6uJLlcW8d78D+lpaWaPHmyrrjiCnXu3FmSuZYRERFq2rSp01jW0j9t3bpVKSkpOnXqlBo1aqR3331XnTp10pYtW1jHALN06VJt3rxZX3/9dYX3+LsMHL169dIrr7yiCy+8UAcOHNCMGTPUp08fff/99369joRZAAFp4sSJ+v77753quRBYLrzwQm3ZskXHjx/X8uXLNW7cOK1du9bqaaGG9u3bp0mTJikzM1NRUVFWTwe1cPXVV5c979Kli3r16qW2bdvqrbfeUoMGDSycWdUoM3BTbGysQkNDK9y1l5eXp/j4eItmBW9wrB9rGzjS09P1z3/+U2vWrFGbNm3KjsfHx6u4uFjHjh1zGs9a+qeIiAi1b99e3bt318yZM9W1a1c988wzrGOA2bRpkw4ePKhLLrlEYWFhCgsL09q1a/Xss88qLCxMcXFxrGeAatq0qS644ALt2rXLr/8uCbNuioiIUPfu3ZWVlVV2rLS0VFlZWUpJSbFwZqitc889V/Hx8U5rm5+fr6+++oq19TOGYSg9PV3vvvuuPv30U5177rlO73fv3l3h4eFOa7ljxw7t3buXtQwApaWlKioqYh0DzIABA7R161Zt2bKl7KdHjx4aM2ZM2XPWMzCdPHlS//nPf5SQkODXf5eUGdRARkaGxo0bpx49eqhnz56aM2eOCgoKlJaWZvXUUI2TJ09q165dZa93796tLVu2qHnz5jrnnHM0efJkPfLIIzr//PN17rnn6sEHH1Tr1q11ww03WDdpVDBx4kQtWbJE77//vho3blxWp9WkSRM1aNBATZo00Z/+9CdlZGSoefPmiomJ0d13362UlBRddtllFs8e5U2ZMkVXX321zjnnHJ04cUJLlixRdna2Pv74Y9YxwDRu3Lisbt2hYcOGatGiRdlx1jMw3HPPPbruuuvUtm1b5eTkaNq0aQoNDdXo0aP9++/S0l4KAejvf/+7cc455xgRERFGz549jS+//NLqKcENa9asMSRV+Bk3bpxhGGZ7rgcffNCIi4szIiMjjQEDBhg7duywdtKowNUaSjJefvnlsjG//fabMWHCBKNZs2ZGdHS0MWzYMOPAgQPWTRou3XrrrUbbtm2NiIgIo2XLlsaAAQOM1atXl73POga28q25DIP1DBQjR440EhISjIiICCMxMdEYOXKksWvXrrL3/XUdbYZhGBblaAAAAKBWqJkFAABAwCLMAgAAIGARZgEAABCwCLMAAAAIWIRZAAAABCzCLAAAAAIWYRYAAAABizALAACAgEWYBYB6ymaz6b333rN6GgBQK4RZALDALbfcIpvNVuHnqquusnpqABBQwqyeAADUV1dddZVefvllp2ORkZEWzQYAAhNXZgHAIpGRkYqPj3f6adasmSSzBOCFF17Q1VdfrQYNGui8887T8uXLnT6/detW/f73v1eDBg3UokUL3XHHHTp58qTTmEWLFumiiy5SZGSkEhISlJ6e7vT+4cOHNWzYMEVHR+v888/XBx98ULe/NAB4GWEWAPzUgw8+qOHDh+vbb7/VmDFjNGrUKP3444+SpIKCAg0ZMkTNmjXT119/rbfffluffPKJU1h94YUXNHHiRN1xxx3aunWrPvjgA7Vv397pO2bMmKEbb7xR3333na655hqNGTNGR44c8envCQC1YTMMw7B6EgBQ39xyyy164403FBUV5XT8/vvv1/333y+bzaa77rpLL7zwQtl7l112mS655BI9//zzWrBgge677z7t27dPDRs2lCStXLlS1113nXJychQXF6fExESlpaXpkUcecTkHm82mv/71r3r44YclmQG5UaNG+uijj6jdBRAwqJkFAIv079/fKaxKUvPmzcuep6SkOL2XkpKiLVu2SJJ+/PFHde3atSzIStIVV1yh0tJS7dixQzabTTk5ORowYECVc+jSpUvZ84YNGyomJkYHDx709FcCAJ8jzAKARRo2bFjhn/29pUGDBm6NCw8Pd3pts9lUWlpaF1MCgDpBzSwA+Kkvv/yywuuOHTtKkjp27Khvv/1WBQUFZe//61//UkhIiC688EI1btxYycnJysrK8umcAcDXuDILABYpKipSbm6u07GwsDDFxsZKkt5++2316NFDvXv31uLFi7Vhwwa99NJLkqQxY8Zo2rRpGjdunKZPn65Dhw7p7rvv1h//+EfFxcVJkqZPn6677rpLrVq10tVXX60TJ07oX//6l+6++27f/qIAUIcIswBgkVWrVikhIcHp2IUXXqjt27dLMjsNLF26VBMmTFBCQoLefPNNderUSZIUHR2tjz/+WJMmTdKll16q6OhoDR8+XLNnzy4717hx43Tq1Ck9/fTTuueeexQbG6sRI0b47hcEAB+gmwEA+CGbzaZ3331XN9xwg9VTAQC/Rs0sAAAAAhZhFgAAAAGLmlkA8ENUgAGAe7gyCwAAgIBFmAUAAEDAIswCAAAgYBFmAQAAELAIswAAAAhYhFkAAAAELMIsAAAAAhZhFgAAAAHr/wO/w1/2mOCzWQAAAABJRU5ErkJggg==\n" }, "metadata": {} }, { "output_type": "stream", "name": "stdout", "text": [ "Total execution time: 894.34 seconds\n" ] } ] }, { "cell_type": "code", "source": [ "import torch # ACTIVATION FUNCTION testing using the sigmoid funciton, learning rate of 0.001, step size: 40\n", "import torch.nn as nn\n", "import torch.nn.init as init\n", "from torch.utils.data import DataLoader\n", "import torchvision\n", "import torchvision.transforms as transforms\n", "import matplotlib.pyplot as plt\n", "import time\n", "overall_start_time = time.time()\n", "\n", "model = nn.Sequential(\n", " nn.Linear(784, 196), # Input layer starting with number of pixels\n", " nn.Sigmoid(), # sigmoid Activation\n", " nn.Linear(196, 49), # Hidden layer 1\n", " nn.Sigmoid(), # sigmoid Activation again\n", " nn.Linear(49, 10), # Hidden layer 2\n", "\n", ")\n", "\n", "for layer in model.modules():\n", " if isinstance(layer, nn.Linear):\n", " init.kaiming_uniform_(layer.weight, nonlinearity='relu')\n", " if layer.bias is not None:\n", " init.zeros_(layer.bias)\n", "transform = transforms.Compose([\n", " transforms.ToTensor(),\n", " transforms.Normalize((0.5,), (0.5,)) #\n", "])\n", "\n", "train_dataset = torchvision.datasets.FashionMNIST(root='./data', train=True, download=True, transform=transform)\n", "test_dataset = torchvision.datasets.FashionMNIST(root='./data', train=False, download=True, transform=transform)\n", "train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)\n", "test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)\n", "\n", "optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # Adam optimization\n", "scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=40, gamma=0.1)\n", "loss_fn = nn.CrossEntropyLoss() # loss function\n", "\n", "num_epochs = 50\n", "loss_values = []\n", "for epoch in range(num_epochs):\n", " model.train()\n", " running_loss = 0.0\n", " for batch_idx, (images, labels) in enumerate(train_loader):\n", " images = images.view(-1, 784)\n", " optimizer.zero_grad()\n", " outputs = model(images)\n", " loss = loss_fn(outputs, labels)\n", " loss.backward()\n", " optimizer.step()\n", " running_loss += loss.item()\n", "\n", " avg_train_loss = running_loss / len(train_loader) # Calculate the average training loss\n", " loss_values.append(avg_train_loss)\n", " print(f'Epoch {epoch+1}/{num_epochs} \\t\\t Training Loss: {avg_train_loss:.6f}')\n", "\n", "print(f\"Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(train_loader):.4f}\") # average loss\n", "\n", "plt.figure(figsize=(8, 6)) # start plotting\n", "plt.plot(range(1, num_epochs + 1), loss_values, marker='o', linestyle='-', color='m')\n", "plt.title('Loss Graph')\n", "plt.xlabel('Epoch')\n", "plt.ylabel('Loss')\n", "plt.grid(True)\n", "plt.show()\n", "\n", "end_time = time.time()\n", "overall_time = end_time - overall_start_time\n", "print(f\"Total execution time: {overall_time:.2f} seconds\")\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "id": "GuOuTPgOsxCO", "outputId": "e724c7c8-b520-4ae5-f2eb-049888f45c83" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Epoch 1/50 \t\t Training Loss: 0.621799\n", "Epoch 2/50 \t\t Training Loss: 0.398737\n", "Epoch 3/50 \t\t Training Loss: 0.354447\n", "Epoch 4/50 \t\t Training Loss: 0.324915\n", "Epoch 5/50 \t\t Training Loss: 0.306455\n", "Epoch 6/50 \t\t Training Loss: 0.288312\n", "Epoch 7/50 \t\t Training Loss: 0.275030\n", "Epoch 8/50 \t\t Training Loss: 0.260451\n", "Epoch 9/50 \t\t Training Loss: 0.248187\n", "Epoch 10/50 \t\t Training Loss: 0.238856\n", "Epoch 11/50 \t\t Training Loss: 0.228516\n", "Epoch 12/50 \t\t Training Loss: 0.218785\n", "Epoch 13/50 \t\t Training Loss: 0.211756\n", "Epoch 14/50 \t\t Training Loss: 0.199807\n", "Epoch 15/50 \t\t Training Loss: 0.194293\n", "Epoch 16/50 \t\t Training Loss: 0.185550\n", "Epoch 17/50 \t\t Training Loss: 0.179705\n", "Epoch 18/50 \t\t Training Loss: 0.172099\n", "Epoch 19/50 \t\t Training Loss: 0.165836\n", "Epoch 20/50 \t\t Training Loss: 0.158619\n", "Epoch 21/50 \t\t Training Loss: 0.154102\n", "Epoch 22/50 \t\t Training Loss: 0.151386\n", "Epoch 23/50 \t\t Training Loss: 0.139317\n", "Epoch 24/50 \t\t Training Loss: 0.137678\n", "Epoch 25/50 \t\t Training Loss: 0.129708\n", "Epoch 26/50 \t\t Training Loss: 0.126437\n", "Epoch 27/50 \t\t Training Loss: 0.119818\n", "Epoch 28/50 \t\t Training Loss: 0.116499\n", "Epoch 29/50 \t\t Training Loss: 0.113296\n", "Epoch 30/50 \t\t Training Loss: 0.107263\n", "Epoch 31/50 \t\t Training Loss: 0.104923\n", "Epoch 32/50 \t\t Training Loss: 0.102044\n", "Epoch 33/50 \t\t Training Loss: 0.096885\n", "Epoch 34/50 \t\t Training Loss: 0.093753\n", "Epoch 35/50 \t\t Training Loss: 0.090598\n", "Epoch 36/50 \t\t Training Loss: 0.084427\n", "Epoch 37/50 \t\t Training Loss: 0.086881\n", "Epoch 38/50 \t\t Training Loss: 0.081167\n", "Epoch 39/50 \t\t Training Loss: 0.077887\n", "Epoch 40/50 \t\t Training Loss: 0.073476\n", "Epoch 41/50 \t\t Training Loss: 0.074834\n", "Epoch 42/50 \t\t Training Loss: 0.071056\n", "Epoch 43/50 \t\t Training Loss: 0.070614\n", "Epoch 44/50 \t\t Training Loss: 0.068946\n", "Epoch 45/50 \t\t Training Loss: 0.063420\n", "Epoch 46/50 \t\t Training Loss: 0.060004\n", "Epoch 47/50 \t\t Training Loss: 0.061000\n", "Epoch 48/50 \t\t Training Loss: 0.059794\n", "Epoch 49/50 \t\t Training Loss: 0.059669\n", "Epoch 50/50 \t\t Training Loss: 0.054596\n", "Epoch [50/50], Loss: 0.0546\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "<Figure size 800x600 with 1 Axes>" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAAArMAAAIjCAYAAAAQgZNYAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABWmElEQVR4nO3deXiU5b3/8c9kkpksZIOEEBIgYtiRoCCLimAFqfa4oaeItNDY2lbBA83xp4e2gqgtrhStCy5FW3elbm0ViQi4gSgIQmSLsodskAUSmQwzz++PmJGYbZJM5pmZvF/XxVXnmXueucMtXp/efJ/vbTEMwxAAAAAQhMLMngAAAADQVoRZAAAABC3CLAAAAIIWYRYAAABBizALAACAoEWYBQAAQNAizAIAACBoEWYBAAAQtAizAAAACFqEWQBAh1izZo0sFouWL19u9lQAhDDCLAD8wDPPPCOLxaLPP//c7Kl45csvv1R2drZOO+00RUZGqkuXLho+fLhuueUWffPNN2ZPDwA6VLjZEwAAtN2TTz6pG264QUlJSZo+fboGDhyokydPatu2bfrHP/6hJUuW6Ntvv5XVajV7qgDQIQizABCkPvnkE91www0699xz9e9//1uxsbH13n/ggQf0pz/9qcX7VFdXKzo6uqOmCQAdijIDAGijL774QhdffLHi4uLUpUsXXXjhhVq/fn29MU6nUwsXLlS/fv0UGRmpbt266bzzzlNubq5nTGFhobKzs5Weni673a7U1FRdfvnl2rt3b7Pfv3DhQlksFj3//PMNgqwkRUZG6s4776y3KzthwgQNHTpUGzdu1Pnnn6/o6Gj9/ve/lyS9+eab+slPfqKePXvKbrfr9NNP15133imXy1Xvvqfe45xzzlFUVJROO+00LV26tNF5ut1u/elPf1J6eroiIyN14YUXKj8/v9mfDQC8xc4sALRBXl6exo0bp7i4ON1yyy2KiIjQ448/rgkTJmjt2rUaPXq0JOn222/XokWL9Ktf/UqjRo1SZWWlPv/8c23atEmTJk2SJF111VXKy8vTTTfdpIyMDBUXFys3N1f79+9XRkZGo99fXV2t999/XxMmTFB6enqr5n7kyBFdfPHFuuaaa/Szn/1MKSkpkmprhbt06aKcnBx16dJF77//vubPn6/Kykrdd9999e5RVlamSy65RD/96U81bdo0vfLK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oUWLFikrK0sPPvgg6xhkNm7cqOLiYp111lkKDw9XeHi41q5dq4ceekjh4eFKSUlhPYNUQkKC+vfvr/z8/ID+c0mY9ZLNZtOIESO0atUqzzW3261Vq1Zp7NixJs4M7XXaaaepR48e9da2srJSn376KWsbYAzD0OzZs/X666/r/fff12mnnVbv/REjRigiIqLeWu7cuVP79+9nLYOA2+2Ww+FgHYPMhRdeqK1bt2rz5s2eXyNHjtT06dM9/8x6Bqfjx4/r66+/VmpqakD/uaTMoBVycnI0c+ZMjRw5UqNGjdKSJUtUVVWl7Oxss6eGFhw/flz5+fme13v27NHmzZvVtWtX9e7dW3PnztVdd92lfv366bTTTtNtt92mnj176oorrjBv0mhg1qxZeuGFF/Tmm28qNjbWU6cVHx+vqKgoxcfH65e//KVycnLUtWtXxcXF6aabbtLYsWM1ZswYk2ePU82bN08XX3yxevfurWPHjumFF17QmjVr9O6777KOQSY2NtZTt14nJiZG3bp181xnPYPDzTffrEsvvVR9+vRRQUGBFixYIKvVqmnTpgX2n0tTeykEob/+9a9G7969DZvNZowaNcpYv3692VOCF1avXm1IavBr5syZhmHUtue67bbbjJSUFMNutxsXXnihsXPnTnMnjQYaW0NJxtNPP+0Z8+233xo33nijkZiYaERHRxtXXnmlcfjwYfMmjUZdd911Rp8+fQybzWYkJycbF154obFy5UrP+6xjcDu1NZdhsJ7BYurUqUZqaqphs9mMtLQ0Y+rUqUZ+fr7n/UBdR4thGIZJORoAAABoF2pmAQAAELQIswAAAAhahFkAAAAELcIsAAAAghZhFgAAAEGLMAsAAICgRZgFAABA0CLMAgAAIGgRZgGgk7JYLHrjjTfMngYAtAthFgBM8Itf/EIWi6XBrx//+MdmTw0Agkq42RMAgM7qxz/+sZ5++ul61+x2u0mzAYDgxM4sAJjEbrerR48e9X4lJiZKqi0BeOyxx3TxxRcrKipKffv21fLly+t9fuvWrfrRj36kqKgodevWTb/+9a91/PjxemOWLVumIUOGyG63KzU1VbNnz673fmlpqa688kpFR0erX79+euuttzr2hwYAHyPMAkCAuu2223TVVVdpy5Ytmj59uq655hpt375dklRVVaXJkycrMTFRn332mV599VW999579cLqY489plmzZunXv/61tm7dqrfeekuZmZn1vmPhwoX66U9/qi+//FKXXHKJpk+frqNHj/r15wSA9rAYhmGYPQkA6Gx+8Ytf6LnnnlNkZGS967///e/1+9//XhaLRb/97W/12GOPed4bM2aMzjrrLD366KN68skndeutt+rAgQOKiYmRJL399tu69NJLVVBQoJSUFKWlpSk7O1t33XVXo3OwWCz64x//qDvvvFNSbUDu0qWL3nnnHWp3AQQNamYBwCQXXHBBvbAqSV27dvX889ixY+u9N3bsWG3evFmStH37dmVlZXmCrCSde+65crvd2rlzpywWiwoKCnThhRc2O4dhw4Z5/jkmJkZxcXEqLi5u648EAH5HmAUAk8TExDT4a39fiYqK8mpcREREvdcWi0Vut7sjpgQAHYKaWQAIUOvXr2/wetCgQZKkQYMGacuWLaqqqvK8//HHHyssLEwDBgxQbGysMjIytGrVKr/OGQD8jZ1ZADCJw+FQYWFhvWvh4eFKSkqSJL366qsaOXKkzjvvPD3//PPasGGD/va3v0mSpk+frgULFmjmzJm6/fbbVVJSoptuukk///nPlZKSIkm6/fbb9dvf/lbdu3fXxRdfrGPHjunjjz/WTTfd5N8fFAA6EGEWAEyyYsUKpaam1rs2YMAA7dixQ1Jtp4GXXnpJN954o1JTU/Xiiy9q8ODBkqTo6Gi9++67mjNnjs4++2xFR0frqquu0uLFiz33mjlzpk6cOKG//OUvuvnmm5WUlKSrr77afz8gAPgB3QwAIABZLBa9/vrruuKKK8yeCgAENGpmAQAAELQIswAAAAha1MwCQACiAgwAvMPOLAAAAIIWYRYAAABBizALAACAoEWYBQAAQNAizAIAACBoEWYBAAAQtAizAAAACFqEWQAAAASt/w9bxRuR0FqcuAAAAABJRU5ErkJggg==\n" }, "metadata": {} }, { "output_type": "stream", "name": "stdout", "text": [ "Total execution time: 887.69 seconds\n" ] } ] }, { "cell_type": "markdown", "source": [ "now, using relu" ], "metadata": { "id": "51WYO3T4o4Tr" } }, { "cell_type": "code", "source": [ "import torch # ACTIVATION FUNCTION testing using ReLU, learning rate of 0.001, step size: 20\n", "import torch.nn as nn\n", "import torch.nn.init as init\n", "from torch.utils.data import DataLoader\n", "import torchvision\n", "import torchvision.transforms as transforms\n", "import matplotlib.pyplot as plt\n", "import time\n", "overall_start_time = time.time()\n", "\n", "model = nn.Sequential(\n", " nn.Linear(784, 196), # Input layer starting with number of pixels\n", " nn.ReLU(), # ReLU Activation\n", " nn.Linear(196, 49), # Hidden layer 1\n", " nn.ReLU(), # ReLU Activation again\n", " nn.Linear(49, 10), # Hidden layer 2\n", "\n", ")\n", "\n", "for layer in model.modules():\n", " if isinstance(layer, nn.Linear):\n", " init.kaiming_uniform_(layer.weight, nonlinearity='relu')\n", " if layer.bias is not None:\n", " init.zeros_(layer.bias)\n", "transform = transforms.Compose([\n", " transforms.ToTensor(),\n", " transforms.Normalize((0.5,), (0.5,)) #\n", "])\n", "\n", "train_dataset = torchvision.datasets.FashionMNIST(root='./data', train=True, download=True, transform=transform)\n", "test_dataset = torchvision.datasets.FashionMNIST(root='./data', train=False, download=True, transform=transform)\n", "train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)\n", "test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)\n", "\n", "optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # Adam optimization\n", "scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=20, gamma=0.1)\n", "loss_fn = nn.CrossEntropyLoss() # loss function\n", "\n", "num_epochs = 50\n", "loss_values = []\n", "for epoch in range(num_epochs):\n", " model.train()\n", " running_loss = 0.0\n", " for batch_idx, (images, labels) in enumerate(train_loader):\n", " images = images.view(-1, 784)\n", " optimizer.zero_grad()\n", " outputs = model(images)\n", " loss = loss_fn(outputs, labels)\n", " loss.backward()\n", " optimizer.step()\n", " running_loss += loss.item()\n", "\n", " avg_train_loss = running_loss / len(train_loader) # Calculate the average training loss\n", " loss_values.append(avg_train_loss)\n", " print(f'Epoch {epoch+1}/{num_epochs} \\t\\t Training Loss: {avg_train_loss:.6f}')\n", "\n", "print(f\"Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(train_loader):.4f}\") # average loss\n", "\n", "plt.figure(figsize=(8, 6)) # start plotting\n", "plt.plot(range(1, num_epochs + 1), loss_values, marker='o', linestyle='-', color='m')\n", "plt.title('Loss Graph')\n", "plt.xlabel('Epoch')\n", "plt.ylabel('Loss')\n", "plt.grid(True)\n", "plt.show()\n", "\n", "end_time = time.time()\n", "overall_time = end_time - overall_start_time\n", "print(f\"Total execution time: {overall_time:.2f} seconds\")\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "id": "0Tb8q3SuglLq", "outputId": "3c63fa2c-60f9-463a-ec2e-c4e96831384d" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Epoch 1/50 \t\t Training Loss: 0.502953\n", "Epoch 2/50 \t\t Training Loss: 0.376967\n", "Epoch 3/50 \t\t Training Loss: 0.338297\n", "Epoch 4/50 \t\t Training Loss: 0.313946\n", "Epoch 5/50 \t\t Training Loss: 0.295125\n", "Epoch 6/50 \t\t Training Loss: 0.278507\n", "Epoch 7/50 \t\t Training Loss: 0.267188\n", "Epoch 8/50 \t\t Training Loss: 0.255041\n", "Epoch 9/50 \t\t Training Loss: 0.243122\n", "Epoch 10/50 \t\t Training Loss: 0.235292\n", "Epoch 11/50 \t\t Training Loss: 0.225255\n", "Epoch 12/50 \t\t Training Loss: 0.217930\n", "Epoch 13/50 \t\t Training Loss: 0.210366\n", "Epoch 14/50 \t\t Training Loss: 0.203205\n", "Epoch 15/50 \t\t Training Loss: 0.195100\n", "Epoch 16/50 \t\t Training Loss: 0.186156\n", "Epoch 17/50 \t\t Training Loss: 0.183763\n", "Epoch 18/50 \t\t Training Loss: 0.177529\n", "Epoch 19/50 \t\t Training Loss: 0.171234\n", "Epoch 20/50 \t\t Training Loss: 0.165097\n", "Epoch 21/50 \t\t Training Loss: 0.157698\n", "Epoch 22/50 \t\t Training Loss: 0.154955\n", "Epoch 23/50 \t\t Training Loss: 0.150335\n", "Epoch 24/50 \t\t Training Loss: 0.145079\n", "Epoch 25/50 \t\t Training Loss: 0.141442\n", "Epoch 26/50 \t\t Training Loss: 0.133808\n", "Epoch 27/50 \t\t Training Loss: 0.132806\n", "Epoch 28/50 \t\t Training Loss: 0.128929\n", "Epoch 29/50 \t\t Training Loss: 0.123091\n", "Epoch 30/50 \t\t Training Loss: 0.122270\n", "Epoch 31/50 \t\t Training Loss: 0.117092\n", "Epoch 32/50 \t\t Training Loss: 0.112772\n", "Epoch 33/50 \t\t Training Loss: 0.111007\n", "Epoch 34/50 \t\t Training Loss: 0.109203\n", "Epoch 35/50 \t\t Training Loss: 0.106440\n", "Epoch 36/50 \t\t Training Loss: 0.102480\n", "Epoch 37/50 \t\t Training Loss: 0.100580\n", "Epoch 38/50 \t\t Training Loss: 0.096628\n", "Epoch 39/50 \t\t Training Loss: 0.095068\n", "Epoch 40/50 \t\t Training Loss: 0.092266\n", "Epoch 41/50 \t\t Training Loss: 0.087084\n", "Epoch 42/50 \t\t Training Loss: 0.086622\n", "Epoch 43/50 \t\t Training Loss: 0.089356\n", "Epoch 44/50 \t\t Training Loss: 0.081335\n", "Epoch 45/50 \t\t Training Loss: 0.081544\n", "Epoch 46/50 \t\t Training Loss: 0.078564\n", "Epoch 47/50 \t\t Training Loss: 0.076888\n", "Epoch 48/50 \t\t Training Loss: 0.080203\n", "Epoch 49/50 \t\t Training Loss: 0.074238\n", "Epoch 50/50 \t\t Training Loss: 0.071796\n", "Epoch [50/50], Loss: 0.0718\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "<Figure size 800x600 with 1 Axes>" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAAArMAAAIjCAYAAAAQgZNYAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABVKklEQVR4nO3deXiU5b3/8c9kkpmQQBZISCABAgZZ4iEoyFJFsIBUPW7Izw0rpa22Kh44qbWH9sjiUlwRe6pi3euuHKy2R1FEoFhBFMqWAhLWQMhCyAIJmRkyz++PkJEh2yRM5pmZvF/XxYXzzD3P3PEu53y8+T7f22IYhiEAAAAgBEWYPQEAAACgrQizAAAACFmEWQAAAIQswiwAAABCFmEWAAAAIYswCwAAgJBFmAUAAEDIIswCAAAgZBFmAQAAELIIswCAdrFq1SpZLBYtWbLE7KkACGOEWQA4w6uvviqLxaJvv/3W7Kn4ZMuWLZo+fbr69u2r6Ohode7cWUOHDtV9992nPXv2mD09AGhXkWZPAADQdi+88ILuvPNOJSUlaerUqRo4cKBOnjypbdu26c9//rMWLVqkEydOyGq1mj1VAGgXhFkACFFfffWV7rzzTl100UX629/+pi5duni9/+STT+rhhx9u8T7V1dWKiYlpr2kCQLuizAAA2uif//ynLr/8csXFxalz584aP3681q1b5zXG5XJp/vz56t+/v6Kjo9WtWzddfPHFWr58uWdMYWGhpk+frvT0dNntdvXo0UPXXHON9u3b1+z3z58/XxaLRW+++WaDICtJ0dHRevDBB712ZceNG6fzzjtPGzZs0CWXXKKYmBj99re/lSR9+OGHuvLKK9WzZ0/Z7Xadc845evDBB1VbW+t139Pv8YMf/ECdOnVS3759tXjx4kbn6Xa79fDDDys9PV3R0dEaP3688vLymv3ZAMBX7MwCQBvk5uZqzJgxiouL03333aeoqCg9//zzGjdunFavXq2RI0dKkubNm6cFCxbo5z//uUaMGKHKykp9++232rhxoyZOnChJuv7665Wbm6t77rlHGRkZKi4u1vLly3XgwAFlZGQ0+v3V1dX64osvNG7cOKWnp7dq7qWlpbr88st100036dZbb1VKSoqkulrhzp07KycnR507d9YXX3yhOXPmqLKyUo8//rjXPcrKynTFFVfohhtu0M0336z33ntPd955p2w2m3760596jX3kkUcUERGhe++9VxUVFXrsscc0depUff31162aNwA0ygAAeHnllVcMScY333zT5Jhrr73WsNlsxu7duz3XCgoKjC5duhiXXHKJ51p2drZx5ZVXNnmfsrIyQ5Lx+OOPt2qOmzdvNiQZs2bNavBeaWmpUVJS4vnlcDg8740dO9aQZCxevLjB56qrqxtc+8UvfmHExMQYNTU1De7x5JNPeq45HA5j6NChRvfu3Q2n02kYhmGsXLnSkGQMGjTIaw5PP/20IcnYunVrq35mAGgMZQYA0Eq1tbX67LPPdO2116pfv36e6z169NAtt9yiL7/8UpWVlZKkhIQE5ebmateuXY3eq1OnTrLZbFq1apXKysp8nkP9/Tt37tzgvX79+ik5Odnz66OPPvJ63263a/r06Y3Opd6xY8d05MgRjRkzRtXV1dqxY4fX2MjISP3iF7/wvLbZbPrFL36h4uJibdiwwWvs9OnTZbPZPK/HjBkjSXRaAOAXhFkAaKWSkhJVV1drwIABDd4bNGiQ3G638vPzJUkPPPCAysvLde655+rf/u3f9Otf/1pbtmzxjLfb7Xr00Uf1ySefKCUlRZdccokee+wxFRYWNjuH+hrZ48ePN3jvww8/1PLly/XEE080+tm0tDSvcFkvNzdX1113neLj4xUXF6fk5GTdeuutkqSKigqvsT179lRsbKzXtXPPPVeSGtT69u7d2+t1YmKiJLUqvANAUwizANCOLrnkEu3evVsvv/yyzjvvPL344ou64IIL9OKLL3rGzJo1S999950WLFig6Oho3X///Ro0aJD++c9/NnnfzMxMRUZGatu2bQ3eGzt2rCZMmKBhw4Y1+tnTd2DrlZeXa+zYsdq8ebMeeOAB/fWvf9Xy5cv16KOPSqp7iKutmmoLZhhGm+8JAPUIswDQSsnJyYqJidHOnTsbvLdjxw5FRESoV69enmtdu3bV9OnT9fbbbys/P19DhgzRvHnzvD53zjnn6Fe/+pU+++wzbdu2TU6nU08++WSTc4iNjfU8bHbo0KGz/plWrVql0tJSvfrqq5o5c6b+/d//XRMmTPDsop6poKBAVVVVXte+++47SWryoTUAaA+EWQBoJavVqssuu0wffvih11+pFxUV6a233tLFF1+suLg4SXWdA07XuXNnZWZmyuFwSKrrSlBTU+M1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6rLLLpMkFRcXt/mIWAS35OuS1eP2HpIhbf/xdrmOusyeEgAAQNvC7Jw5c3TvvfcqIyNDI0aM8Bxw8Nlnn+n888/36wQRPDKfylSnczvJecip737xnQyD08AAAIC52hRmp0yZogMHDujbb7/Vp59+6rk+fvx4PfXUU36bHIKLNdaqQW8OkiXSopIlJSp8rdDsKQEAgA6uTWFWklJTU3X++eeroKBABw8elCSNGDFCAwcO9NvkEHzihscp48EMSVLePXmqzqs2d0IAAKBDa1OYdbvdeuCBBxQfH68+ffqoT58+SkhI0IMPPii3m9ZN4a73r3srfmy8ao/Xavut21VbU6uyVWUqertIZavKZNRSfgAAAAKjTd0Mfve73+mll17SI488oosuukiS9OWXX2revHmqqanRww8/7NdJIrhYrBYN+vMgfTPkGx37+pi+6v6Vao/Vet63p9uV+XSmkicnmzhLAADQEbQpzL722mt68cUXdfXVV3uuDRkyRGlpabrrrrsIsx1AdO9o9fhZDx1ceNAryEqS45BDuVNylbUki0ALAADaVZvKDI4ePdpobezAgQN19OjRs54Ugp9Ra6jkvZIm3qz7LW9WHiUHAACgXbUpzGZnZ+uPf/xjg+t//OMfNWTIkLOeFIJf+ZpyOQ46mh5gSI58h8rXlAdsTgAAoONpU5nBY489piuvvFKff/65p8fs2rVrlZ+fr48//tivE0Rwch52+nUcAABAW7RpZ3bs2LH67rvvdN1116m8vFzl5eWaPHmycnNz9frrr/t7jghCth42v44DAABoizbtzEpSz549GzzotXnzZr300kv605/+dNYTQ3BLGJMge7pdjkMOT43smezpdiWMSQjovAAAQMfS5kMT0LFZrBZlPp156kXjYyKTIuV20HcYAAC0H8Is2ix5crKylmTJnmb3uh6VHCWLzaKqTVXacsUWnTx20qQZAgCAcNfmMgNAqgu0SdckqXxNuZyHnbL1sClhTIIq11VqyxVbVLG6Qlsu26J/++TfFJUQZfZ0AQBAmGlVmJ08eXKz75eXl5/NXBCiLFaLEsclel2Lvyhe2SuytWXSFlWuq9TmH27WkM+GKCoxqkHwtVibqFMAAABoQavCbHx8fIvv33bbbWc1IYSPuOFxGrpqqDZP2Kzj/zyub8//Vqr1btfF0bcAAOBstCrMvvLKK+01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euutt7Rq1Sp9+umnrGOI6dKli6duvV5sbKy6devmuc56hoZ7771XV111lfr06aOCggLNnTtXVqtVN998c3D/uTS1l0II+p//+R+jd+/ehs1mM0aMGGGsW7fO7CnBBytXrjQkNfg1bdo0wzDq2nPdf//9RkpKimG3243x48cbO3fuNHfSaKCxNZRkvPLKK54xJ06cMO666y4jMTHRiImJMa677jrj8OHD5k0ajfrpT39q9OnTx7DZbEZycrIxfvx447PPPvO8zzqGttNbcxkG6xkqbrzxRqNHjx6GzWYz0tLSjBtvvNHIy8vzvB+s62gxDMMwKUcDAAAAZ4WaWQAAAIQswiwAAABCFmEWAAAAIYswCwAAgJBFmAUAAEDIIswCAAAgZBFmAQAAELIIswAAAAhZhFkA6KAsFov+8pe/mD0NADgrhFkAMMFPfvITWSyWBr9+9KMfmT01AAgpkWZPAAA6qh/96Ed65ZVXvK7Z7XaTZgMAoYmdWQAwid1uV2pqqtevxMRESXUlAM8995wuv/xyderUSf369dOSJUu8Pr9161b98Ic/VKdOndStWzfdcccdOn78uNeYl19+WVlZWbLb7erRo4dmzJjh9f6RI0d03XXXKSYmRv3799dHH33Uvj80APgZYRYAgtT999+v66+/Xps3b9bUqVN10003afv27ZKkqqoqTZo0SYmJifrmm2/0/vvv6/PPP/cKq88995zuvvtu3XHHHdq6das++ugjZWZmen3H/PnzdcMNN2jLli264oorNHXqVB09ejSgPycAnA2LYRiG2ZMAgI7mJz/5id544w1FR0d7Xf/tb3+r3/72t7JYLPrlL3+p5557zvPeqFGjdMEFF+jZZ5/VCy+8oN/85jfKz89XbGysJOnjjz/WVVddpYKCAqWkpCgtLU3Tp0/XQw891OgcLBaL/vu//1sPPvigpLqA3LlzZ33yySfU7gIIGdTMAoBJLr30Uq+wKkldu3b1/PPo0aO93hs9erQ2bdokSdq+fbuys7M9QVaSLrroIrndbu3cuVMWi0UFBQUaP358s3MYMmSI559jY2MVFxen4uLitv5IABBwhFkAMElsbGyDv/b3l06dOvk0Lioqyuu1xWKR2+1ujykBQLugZhYAgtS6desavB40aJAkadCgQdq8ebOqqqo87//jH/9QRESEBgwYoC5duigjI0MrVqwI6JwBINDYmQUAkzgcDhUWFnpdi4yMVFJSkiTp/fff1/Dhw3XxxRfrzTff1Pr16/XSSy9JkqZOnaq5c+dq2rRpmjdvnkpKSnTPPffoxz/+sVJSUiRJ8+bN0y9/+Ut1795dl19+uY4dO6Z//OMfuueeewL7gwJAOyLMAoBJli1bph49enhdGzBggHbs2CGprtPAO++8o7vuuks9evTQ22+/rcGDB0uSYmJi9Omnn2rmzJm68MILFRMTo+uvv14LFy703GvatGmqqanRU089pXvvvVdJSUmaMmVK4H5AAAgAuhkAQBCyWCz64IMPdO2115o9FQAIatTMAgAAIGQRZgEAABCyqJkFgCBEBRgA+IadWQAAAIQswiwAAABCFmEWAAAAIYswCwAAgJBFmAUAAEDIIswCAAAgZBFmAQAAELIIswAAAAhZ/x/Ek0JI4TDbJAAAAABJRU5ErkJggg==\n" }, "metadata": {} }, { "output_type": "stream", "name": "stdout", "text": [ "Total execution time: 907.50 seconds\n" ] } ] }, { "cell_type": "code", "source": [ "import torch # ACTIVATION FUNCTION testing using ReLU, learning rate of 0.001, step size: 40\n", "import torch.nn as nn\n", "import torch.nn.init as init\n", "from torch.utils.data import DataLoader\n", "import torchvision\n", "import torchvision.transforms as transforms\n", "import matplotlib.pyplot as plt\n", "import time\n", "overall_start_time = time.time()\n", "\n", "model = nn.Sequential(\n", " nn.Linear(784, 196), # Input layer starting with number of pixels\n", " nn.ReLU(), # ReLU Activation\n", " nn.Linear(196, 49), # Hidden layer 1\n", " nn.ReLU(), # ReLU Activation again\n", " nn.Linear(49, 10), # Hidden layer 2\n", "\n", ")\n", "\n", "for layer in model.modules():\n", " if isinstance(layer, nn.Linear):\n", " init.kaiming_uniform_(layer.weight, nonlinearity='relu')\n", " if layer.bias is not None:\n", " init.zeros_(layer.bias)\n", "transform = transforms.Compose([\n", " transforms.ToTensor(),\n", " transforms.Normalize((0.5,), (0.5,)) #\n", "])\n", "\n", "train_dataset = torchvision.datasets.FashionMNIST(root='./data', train=True, download=True, transform=transform)\n", "test_dataset = torchvision.datasets.FashionMNIST(root='./data', train=False, download=True, transform=transform)\n", "train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)\n", "test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)\n", "\n", "optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # Adam optimization\n", "scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=40, gamma=0.1)\n", "loss_fn = nn.CrossEntropyLoss() # loss function\n", "\n", "num_epochs = 50\n", "loss_values = []\n", "for epoch in range(num_epochs):\n", " model.train()\n", " running_loss = 0.0\n", " for batch_idx, (images, labels) in enumerate(train_loader):\n", " images = images.view(-1, 784)\n", " optimizer.zero_grad()\n", " outputs = model(images)\n", " loss = loss_fn(outputs, labels)\n", " loss.backward()\n", " optimizer.step()\n", " running_loss += loss.item()\n", "\n", " avg_train_loss = running_loss / len(train_loader) # Calculate the average training loss\n", " loss_values.append(avg_train_loss)\n", " print(f'Epoch {epoch+1}/{num_epochs} \\t\\t Training Loss: {avg_train_loss:.6f}')\n", "\n", "print(f\"Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(train_loader):.4f}\") # average loss\n", "\n", "plt.figure(figsize=(8, 6)) # start plotting\n", "plt.plot(range(1, num_epochs + 1), loss_values, marker='o', linestyle='-', color='m')\n", "plt.title('Loss Graph')\n", "plt.xlabel('Epoch')\n", "plt.ylabel('Loss')\n", "plt.grid(True)\n", "plt.show()\n", "\n", "end_time = time.time()\n", "overall_time = end_time - overall_start_time\n", "print(f\"Total execution time: {overall_time:.2f} seconds\")\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "id": "3HRMz5hGkovv", "outputId": "ad551b0f-d412-4546-ecf5-b30c726abfa0" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Epoch 1/50 \t\t Training Loss: 0.490487\n", "Epoch 2/50 \t\t Training Loss: 0.369046\n", "Epoch 3/50 \t\t Training Loss: 0.335290\n", "Epoch 4/50 \t\t Training Loss: 0.308926\n", "Epoch 5/50 \t\t Training Loss: 0.291855\n", "Epoch 6/50 \t\t Training Loss: 0.274969\n", "Epoch 7/50 \t\t Training Loss: 0.261088\n", "Epoch 8/50 \t\t Training Loss: 0.251757\n", "Epoch 9/50 \t\t Training Loss: 0.240315\n", "Epoch 10/50 \t\t Training Loss: 0.231177\n", "Epoch 11/50 \t\t Training Loss: 0.222751\n", "Epoch 12/50 \t\t Training Loss: 0.216312\n", "Epoch 13/50 \t\t Training Loss: 0.207882\n", "Epoch 14/50 \t\t Training Loss: 0.200015\n", "Epoch 15/50 \t\t Training Loss: 0.189574\n", "Epoch 16/50 \t\t Training Loss: 0.188588\n", "Epoch 17/50 \t\t Training Loss: 0.181458\n", "Epoch 18/50 \t\t Training Loss: 0.172322\n", "Epoch 19/50 \t\t Training Loss: 0.167459\n", "Epoch 20/50 \t\t Training Loss: 0.164912\n", "Epoch 21/50 \t\t Training Loss: 0.159565\n", "Epoch 22/50 \t\t Training Loss: 0.153575\n", "Epoch 23/50 \t\t Training Loss: 0.147082\n", "Epoch 24/50 \t\t Training Loss: 0.144515\n", "Epoch 25/50 \t\t Training Loss: 0.139185\n", "Epoch 26/50 \t\t Training Loss: 0.136907\n", "Epoch 27/50 \t\t Training Loss: 0.129391\n", "Epoch 28/50 \t\t Training Loss: 0.130377\n", "Epoch 29/50 \t\t Training Loss: 0.121912\n", "Epoch 30/50 \t\t Training Loss: 0.119934\n", "Epoch 31/50 \t\t Training Loss: 0.116460\n", "Epoch 32/50 \t\t Training Loss: 0.115620\n", "Epoch 33/50 \t\t Training Loss: 0.109574\n", "Epoch 34/50 \t\t Training Loss: 0.105539\n", "Epoch 35/50 \t\t Training Loss: 0.106974\n", "Epoch 36/50 \t\t Training Loss: 0.103045\n", "Epoch 37/50 \t\t Training Loss: 0.098375\n", "Epoch 38/50 \t\t Training Loss: 0.094156\n", "Epoch 39/50 \t\t Training Loss: 0.097420\n", "Epoch 40/50 \t\t Training Loss: 0.089655\n", "Epoch 41/50 \t\t Training Loss: 0.090654\n", "Epoch 42/50 \t\t Training Loss: 0.088371\n", "Epoch 43/50 \t\t Training Loss: 0.085733\n", "Epoch 44/50 \t\t Training Loss: 0.083294\n", "Epoch 45/50 \t\t Training Loss: 0.082905\n", "Epoch 46/50 \t\t Training Loss: 0.081175\n", "Epoch 47/50 \t\t Training Loss: 0.081174\n", "Epoch 48/50 \t\t Training Loss: 0.075905\n", "Epoch 49/50 \t\t Training Loss: 0.078200\n", "Epoch 50/50 \t\t Training Loss: 0.075266\n", "Epoch [50/50], Loss: 0.0753\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "<Figure size 800x600 with 1 Axes>" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAAArMAAAIjCAYAAAAQgZNYAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABV0klEQVR4nO3deXxU9b3/8ffJMhMSskFCEpLIYpAlFBCQRUuBilDrVRG5UrWV0l5tFSw0te3Fe2VRe3Ev+nPBqqi17hSXLi6UGkQFURCEyBZcCIRskAUSmAyT8/sjZCQkk0ySyZyZyev5eOQhc+Y7J9/4LQ/f/eZzPl/DNE1TAAAAQBAKs3oCAAAAQHsRZgEAABC0CLMAAAAIWoRZAAAABC3CLAAAAIIWYRYAAABBizALAACAoEWYBQAAQNAizAIAACBoEWYBAJ0iNzdXhmFo1apVVk8FQAgjzALAGZ555hkZhqFPP/3U6ql45fPPP9ecOXPUr18/RUVFqXv37hoxYoR+97vf6csvv7R6egDQqSKsngAAoP2eeOIJ3XjjjUpKStK1116rQYMG6eTJk9qxY4f+/Oc/a/ny5Tp+/LjCw8OtnioAdArCLAAEqY8++kg33nijLrjgAv39739XbGxso/fvv/9+/eEPf2j1PjU1NYqOju6saQJAp6LMAADa6bPPPtPFF1+suLg4de/eXRdeeKE2btzYaIzT6dTSpUs1YMAARUVFqWfPnvrud7+rNWvWuMcUFRVpzpw5ysjIkN1uV1pami6//HJ9/fXXLX7/pUuXyjAMPf/8802CrCRFRUXpjjvuaLQrO2nSJA0dOlSbN2/W9773PUVHR+vWW2+VJL3xxhu65JJL1Lt3b9ntdp199tm644475HK5Gt339Hucf/756tatm/r166cVK1Y0O8+6ujr94Q9/UEZGhqKionThhRcqPz+/xZ8NALzFziwAtENeXp4mTJiguLg4/e53v1NkZKQef/xxTZo0SevWrdPYsWMlSUuWLNGyZcv0X//1XxozZoyqqqr06aefasuWLbroooskSVdeeaXy8vJ08803q2/fviopKdGaNWu0f/9+9e3bt9nvX1NTo3//+9+aNGmSMjIy2jT3w4cP6+KLL9aPfvQj/fjHP1ZKSoqk+lrh7t27KycnR927d9e///1vLVq0SFVVVbr33nsb3aO8vFw//OEPddVVV+nqq6/WK6+8ohtvvFE2m00/+9nPGo296667FBYWpltuuUWVlZW65557dO211+rjjz9u07wBoFkmAKCRp59+2pRkfvLJJx7HTJ8+3bTZbOa+ffvc1woLC83Y2Fjze9/7nvva8OHDzUsuucTjfcrLy01J5r333tumOW7bts2UZC5YsKDJe4cPHzZLS0vdXw6Hw/3exIkTTUnmihUrmnyupqamybVf/OIXZnR0tHnixIkm97j//vvd1xwOhzlixAizV69eZm1trWmapvnee++ZkszBgwc3msODDz5oSjK3b9/epp8ZAJpDmQEAtJHL5dK7776r6dOnq3///u7raWlpuuaaa/TBBx+oqqpKkpSQkKC8vDzt3bu32Xt169ZNNptNubm5Ki8v93oODffv3r17k/f69++v5ORk99ebb77Z6H273a45c+Y0O5cGR48eVVlZmSZMmKCamhrt2rWr0diIiAj94he/cL+22Wz6xS9+oZKSEm3evLnR2Dlz5shms7lfT5gwQZLotADAJwizANBGpaWlqqmp0cCBA5u8N3jwYNXV1amgoECSdPvtt6uiokLnnHOOvvOd7+i3v/2tPv/8c/d4u92uu+++W2+99ZZSUlL0ve99T/fcc4+KiopanENDjeyxY8eavPfGG29ozZo1uu+++5r9bHp6eqNw2SAvL09XXHGF4uPjFRcXp+TkZP34xz+WJFVWVjYa27t3b8XExDS6ds4550hSk1rfs846q9HrxMRESWpTeAcATwizANCJvve972nfvn1auXKlhg4dqieffFIjR47Uk08+6R6zYMEC7dmzR8uWLVNUVJRuu+02DR48WJ999pnH+2ZlZSkiIkI7duxo8t7EiRM1ZcoUjRo1qtnPnr4D26CiokITJ07Utm3bdPvtt+tvf/ub1qxZo7vvvltS/UNc7eWpLZhpmu2+JwA0IMwCQBslJycrOjpau3fvbvLerl27FBYWpszMTPe1Hj16aM6cOXrxxRdVUFCgYcOGacmSJY0+d/bZZ+s3v/mN3n33Xe3YsUO1tbW6//77Pc4hJibG/bDZwYMHO/wz5ebm6vDhw3rmmWc0f/58/cd//IemTJni3kU9U2Fhoaqrqxtd27NnjyR5fGgNADoDYRYA2ig8PFxTp07VG2+80ehX6sXFxXrhhRf03e9+V3FxcZLqOwecrnv37srKypLD4ZBU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ZswYLV++XNXV1e7uBtddd53S09O1bNkySdKyZcs0evRonX322XI4HPrnP/+p5557To899piVP0ZI6Lu0r4qfL1ZtYa12XLbDfd2eYVfWg1lKnpFs4ewAAACaaleYLSgokGEYysjIkCRt2rRJL7zwgoYMGaIbbrihTfeaNWuWSktLtWjRIhUVFWnEiBF6++233Q+F7d+/X2Fh324gV1dX66abbtKBAwfUrVs3DRo0SH/5y180a9as9vwoOM2Rt46otrC2yXXHQYfyZuYpe1U2gRYAAASUdoXZa665RjfccIN+8pOfqKioSBdddJGys7P1/PPPq6ioSIsWLWrT/ebNm6d58+Y1+15ubm6j13feeafuvPPO9kwbLTBdpvLn53t4U5Ih5S/IV9LlSTLCDb/ODQAAwJN21czu2LFDY8aMkSS98sorGjp0qD766CM9//zzeuaZZ3w5P/hJxfoKOQ60UHdsSo4ChyrWV/htTgAAAK1pV5h1Op3udlf/+te/dNlll0mSBg0apEOHDvludvCb2kNNyws6Mg4AAMAf2hVms7OztWLFCq1fv15r1qzRD37wA0lSYWGhevbs6dMJwj9saTafjgMAAPCHdoXZu+++W48//rgmTZqkq6++WsOHD5ckvfnmm+7yAwSXhAkJsmfYpRbKYe2ZdiVMSPDbnAAAAFrTrgfAJk2apLKyMlVVVSkxMdF9/YYbblB0dLTPJgf/McINZT2YpbyZefWBtpnWsr1m9eLhLwAAEFDatTN7/PhxORwOd5D95ptvtHz5cu3evVu9evXy6QThP8kzkpW9Klv29MbH/4bHhUuSip4pUm0JNbMAACBwtCvMXn755frzn/8sSaqoqNDYsWN1//33a/r06RxeEOSSZyRr3NfjNPy94Rr8wmANf2+4zi86XzHDYuQsc2rPTXtkmpwIBgAAAkO7wuyWLVs0YcIESdKqVauUkpKib775Rn/+85/10EMP+XSC8D8j3FDipESlXJ2ixEmJCu8WrkHPDJIRYajsr2UqebnE6ikCAABIameYrampUWxsrCTp3Xff1YwZMxQWFqZx48bpm2++8ekEERhiz41Vn//tI0naO3evHEUt9KQFAADwk3aF2aysLL3++usqKCjQO++8o6lTp0qSSkpKFBcX59MJInCcdetZ6n5ud508clJ7fkG5AQAAsF67wuyiRYt0yy23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Swvov5eUGbRBTk6OZs+erdGjR2vMmDFavny5qqurNWfOHKunhlYcO3ZM+fn57tdfffWVtm7dqh49euiss87SggULdOedd2rAgAHq16+fbrvtNvXu3VvTp0+3btJoYu7cuXrhhRf0xhtvKDY21l2nFR8fr27duik+Pl4///nPlZOTox49eiguLk4333yzxo8fr3Hjxlk8e5xu4cKFuvjii3XWWWfp6NGjeuGFF5Sbm6t33nmHdQwysbGx7rr1BjExMerZs6f7OusZHG655RZdeuml6tOnjwoLC7V48WKFh4fr6quvDuy/l5b2UghC/+///T/zrLPOMm02mzlmzBhz48aNVk8JXnjvvfdMSU2+Zs+ebZpmfXuu2267zUxJSTHtdrt54YUXmrt377Z20miiuTWUZD799NPuMcePHzdvuukmMzEx0YyOjjavuOIK89ChQ9ZNGs362c9+Zvbp08e02WxmcnKyeeGFF5rvvvuu+33WMbid3prLNFnPYDFr1iwzLS3NtNlsZnp6ujlr1iwzPz/f/X6grqNhmqZpUY4GAAAAOoSaWQAAAAQtwiwAAACCFmEWAAAAQYswCwAAgKBFmAUAAEDQIswCAAAgaBFmAQAAELQIswAAAAhahFkA6KIMw9Drr79u9TQAoEMIswBggZ/+9KcyDKPJ1w9+8AOrpwYAQSXC6gkAQFf1gx/8QE8//XSja3a73aLZAEBwYmcWACxit9uVmpra6CsxMVFSfQnAY489posvvljdunVT//79tWrVqkaf3759u77//e+rW7du6tmzp2644QYdO3as0ZiVK1cqOztbdrtdaWlpmjdvXqP3y8rKdMUVVyg6OloDBgzQm2++2bk/NAD4GGEWAALUbbfdpiuvvFLbtm3Ttddeqx/96EfauXOnJKm6ulrTpk1TYmKiPvnkE7366qv617/+1SisPvbYY5o7d65uuOEGbd++XW+++aaysrIafY+lS5fqqquu0ueff64f/vCHuvbaa3XkyBG//pwA0BGGaZqm1ZMAgK7mpz/9qf7yl78oKiqq0fVbb71Vt956qwzD0C9/+Us99thj7vfGjRunkSNH6tFHH9UTTzyh3//+9yooKFBMTIwk6Z///KcuvfRSFRYWKiUlRenp6ZozZ47uvPPOZudgGIb+93//V3fccYek+oDcvXt3vfXWW9TuAgga1MwCgEUmT57cKKxKUo8ePdx/Hj9+fKP3xo8fr61bt0qSdu7cqeHDh7uDrCRdcMEFqqur0+7du2UYhgoLC3XhhRe2OIdhw4a5/xwTE6O4uDiVlJS090cCAL8jzAKARWJiYpr82t9XunXr5tW4yMjIRq8Nw1BdXV1nTAkAOgU1swAQoDZu3Njk9eDBgyVJgwcP1rZt21RdXe1+/8MPP1RYWJgGDhyo2NhY9e3bV2vXrvXrnAHA39iZBQCLOBwOFRUVNboWERGhpKQkSdKrr76q0aNH67vf/a6ef/55bdq0SU899ZQk6dprr9XixYs1e/ZsLVmyRKWlpbr55pv1k5/8RCkpKZKkJUuW6Je//KV69eqliy++WEePHtWHH36om2++2b8/KAB0IsIsAFjk7bffVlpaWqNrAwcO1K5duyTVdxp46aWXdNNNNyktLU0vvviihgwZIkmKjo7WO++8o/nz5+u8885TdHS0rrzySj3wwAPue82ePVsnTpzQH//4R91yyy1KSkrSzJkz/fcDAoAf0M0AAAKQYRh67bXXNH36dKunAgABjZpZAAAABC3CLAAAAIIWNbMAEICoAAMA77AzCwAAgKBFmAUAAEDQIswCAAAgaBFmAQAAELQIswAAAAhahFkAAAAELcIsAAAAghZhFgAAAEHr/wOEeDTY3K8+PAAAAABJRU5ErkJggg==\n" }, "metadata": {} }, { "output_type": "stream", "name": "stdout", "text": [ "Total execution time: 905.97 seconds\n" ] } ] }, { "cell_type": "markdown", "source": [ "the results optained were:\n", "- for sigmoid:\n", " - 20 steps: Loss: 0.0607\n", " - 30 steps: Loss: 0.0552\n", " - 40 steps: Loss: 0.0546\n", "- for ReLU:\n", " - 20 steps: Loss: 0.0718\n", " - 30 steps: Loss: 0.0700\n", " - 40 steps: Loss: 0.0753" ], "metadata": { "id": "hePt7DnEwc6K" } }, { "cell_type": "markdown", "source": [ "based on all the results collected from the start and to the end, the model that showed the least loss value included:\n", "\n", "* sgmoid activationem\n", "* 0.001 learning rate\n", "* 40 step size\n", "\n" ], "metadata": { "id": "hX_-8JJIzmdB" } } ] }