Image Classification using Logistic Regression in PyTorch
Part 3 of "PyTorch: Zero to GANs"
This post is the third in a series of tutorials on building deep learning models with PyTorch, an open source neural networks library. Check out the full series:
- PyTorch Basics: Tensors & Gradients
- Linear Regression & Gradient Descent
- Image Classfication using Logistic Regression
- Training Deep Neural Networks on a GPU
- Image Classification using Convolutional Neural Networks
- Data Augmentation, Regularization and ResNets
- Generating Images using Generative Adverserial Networks
In this tutorial, we'll use our existing knowledge of PyTorch and linear regression to solve a very different kind of problem: image classification. We'll use the famous MNIST Handwritten Digits Database as our training dataset. It consists of 28px by 28px grayscale images of handwritten digits (0 to 9), along with labels for each image indicating which digit it represents. Here are some sample images from the dataset:
System setup
This tutorial takes a code-first approach towards learning PyTorch, and you should try to follow along by running and experimenting with the code yourself. The easiest way to start executing this notebook is to click the "Run" button at the top of this page, and select "Run on Kaggle". This will run the notebook on Kaggle, a free online service for running Jupyter notebooks (you might need to create an account).
Running on your computer locally
(Skip this if you're running on Kaggle) To run this notebook locally, clone this notebook, install the required dependencies using conda, and start Jupyter by running the following commands on the terminal / Conda prompt:
pip install jovian --upgrade # Install the jovian library jovian clone aakashns/03-logistic-regression # Download notebook & dependencies cd 03-logistic-regression # Enter the created directory conda create -n 03-logistic-regression python=3.8 # Create an environment conda activate 03-logistic-regression # Activate virtual env jupyter notebook # Start Jupyter
You can find the notebook_id
by cliking the Clone button at the top of this page on Jovian. For a more detailed explanation of the above steps, check out the System setup section in the first notebook.
Exploring the Data
We begin by importing torch
and torchvision
. torchvision
contains some utilities for working with image data. It also contains helper classes to automatically download and import popular datasets like MNIST.
# Uncomment and run the commands below if imports fail
!conda install numpy pytorch torchvision cpuonly -c pytorch -y
!pip install matplotlib --upgrade --quiet
Collecting package metadata (current_repodata.json): done
Solving environment: done
==> WARNING: A newer version of conda exists. <==
current version: 4.8.2
latest version: 4.8.3
Please update conda by running
$ conda update -n base conda
## Package Plan ##
environment location: /srv/conda/envs/notebook
added / updated specs:
- cpuonly
- numpy
- pytorch
- torchvision
The following packages will be downloaded:
package | build
---------------------------|-----------------
blas-2.15 | mkl 10 KB conda-forge
ca-certificates-2020.4.5.1 | hecc5488_0 146 KB conda-forge
certifi-2020.4.5.1 | py37hc8dfbb8_0 151 KB conda-forge
cpuonly-1.0 | 0 2 KB pytorch
freetype-2.10.2 | he06d7ca_0 905 KB conda-forge
intel-openmp-2020.1 | 217 780 KB defaults
jpeg-9c | h14c3975_1001 251 KB conda-forge
libblas-3.8.0 | 15_mkl 10 KB conda-forge
libcblas-3.8.0 | 15_mkl 10 KB conda-forge
libgfortran-ng-7.5.0 | hdf63c60_6 1.7 MB conda-forge
liblapack-3.8.0 | 15_mkl 10 KB conda-forge
liblapacke-3.8.0 | 15_mkl 10 KB conda-forge
libpng-1.6.37 | hed695b0_1 308 KB conda-forge
libtiff-4.1.0 | hc7e4089_6 668 KB conda-forge
libwebp-base-1.1.0 | h516909a_3 845 KB conda-forge
lz4-c-1.8.3 | he1b5a44_1001 187 KB conda-forge
mkl-2020.1 | 217 129.0 MB defaults
ninja-1.10.0 | hc9558a2_0 1.9 MB conda-forge
numpy-1.18.4 | py37h8960a57_0 5.2 MB conda-forge
olefile-0.46 | py_0 31 KB conda-forge
openssl-1.1.1g | h516909a_0 2.1 MB conda-forge
pillow-7.1.2 | py37h718be6c_0 658 KB conda-forge
python_abi-3.7 | 1_cp37m 4 KB conda-forge
pytorch-1.5.0 | py3.7_cpu_0 90.5 MB pytorch
torchvision-0.6.0 | py37_cpu 11.0 MB pytorch
zstd-1.4.4 | h3b9ef0a_2 982 KB conda-forge
------------------------------------------------------------
Total: 247.2 MB
The following NEW packages will be INSTALLED:
blas conda-forge/linux-64::blas-2.15-mkl
cpuonly pytorch/noarch::cpuonly-1.0-0
freetype conda-forge/linux-64::freetype-2.10.2-he06d7ca_0
intel-openmp pkgs/main/linux-64::intel-openmp-2020.1-217
jpeg conda-forge/linux-64::jpeg-9c-h14c3975_1001
libblas conda-forge/linux-64::libblas-3.8.0-15_mkl
libcblas conda-forge/linux-64::libcblas-3.8.0-15_mkl
libgfortran-ng conda-forge/linux-64::libgfortran-ng-7.5.0-hdf63c60_6
liblapack conda-forge/linux-64::liblapack-3.8.0-15_mkl
liblapacke conda-forge/linux-64::liblapacke-3.8.0-15_mkl
libpng conda-forge/linux-64::libpng-1.6.37-hed695b0_1
libtiff conda-forge/linux-64::libtiff-4.1.0-hc7e4089_6
libwebp-base conda-forge/linux-64::libwebp-base-1.1.0-h516909a_3
lz4-c conda-forge/linux-64::lz4-c-1.8.3-he1b5a44_1001
mkl pkgs/main/linux-64::mkl-2020.1-217
ninja conda-forge/linux-64::ninja-1.10.0-hc9558a2_0
numpy conda-forge/linux-64::numpy-1.18.4-py37h8960a57_0
olefile conda-forge/noarch::olefile-0.46-py_0
pillow conda-forge/linux-64::pillow-7.1.2-py37h718be6c_0
python_abi conda-forge/linux-64::python_abi-3.7-1_cp37m
pytorch pytorch/linux-64::pytorch-1.5.0-py3.7_cpu_0
torchvision pytorch/linux-64::torchvision-0.6.0-py37_cpu
zstd conda-forge/linux-64::zstd-1.4.4-h3b9ef0a_2
The following packages will be UPDATED:
ca-certificates 2019.11.28-hecc5488_0 --> 2020.4.5.1-hecc5488_0
certifi 2019.11.28-py37_0 --> 2020.4.5.1-py37hc8dfbb8_0
openssl 1.1.1d-h516909a_0 --> 1.1.1g-h516909a_0
Downloading and Extracting Packages
certifi-2020.4.5.1 | 151 KB | ##################################### | 100%
pytorch-1.5.0 | 90.5 MB | ##################################### | 100%
libblas-3.8.0 | 10 KB | ##################################### | 100%
liblapack-3.8.0 | 10 KB | ##################################### | 100%
libpng-1.6.37 | 308 KB | ##################################### | 100%
libcblas-3.8.0 | 10 KB | ##################################### | 100%
olefile-0.46 | 31 KB | ##################################### | 100%
libgfortran-ng-7.5.0 | 1.7 MB | ##################################### | 100%
jpeg-9c | 251 KB | ##################################### | 100%
ninja-1.10.0 | 1.9 MB | ##################################### | 100%
python_abi-3.7 | 4 KB | ##################################### | 100%
liblapacke-3.8.0 | 10 KB | ##################################### | 100%
numpy-1.18.4 | 5.2 MB | ##################################### | 100%
libtiff-4.1.0 | 668 KB | ##################################### | 100%
zstd-1.4.4 | 982 KB | ##################################### | 100%
blas-2.15 | 10 KB | ##################################### | 100%
pillow-7.1.2 | 658 KB | ##################################### | 100%
intel-openmp-2020.1 | 780 KB | ##################################### | 100%
lz4-c-1.8.3 | 187 KB | ##################################### | 100%
mkl-2020.1 | 129.0 MB | ##################################### | 100%
freetype-2.10.2 | 905 KB | ##################################### | 100%
torchvision-0.6.0 | 11.0 MB | ##################################### | 100%
libwebp-base-1.1.0 | 845 KB | ##################################### | 100%
cpuonly-1.0 | 2 KB | ##################################### | 100%
openssl-1.1.1g | 2.1 MB | ##################################### | 100%
ca-certificates-2020 | 146 KB | ##################################### | 100%
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
WARNING: pip is being invoked by an old script wrapper. This will fail in a future version of pip.
Please see https://github.com/pypa/pip/issues/5599 for advice on fixing the underlying issue.
To avoid this problem you can invoke Python with '-m pip' instead of running pip directly.