Learn practical skills, build real-world projects, and advance your career

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:

  1. PyTorch Basics: Tensors & Gradients
  2. Linear Regression & Gradient Descent
  3. Image Classfication using Logistic Regression
  4. Training Deep Neural Networks on a GPU
  5. Image Classification using Convolutional Neural Networks
  6. Data Augmentation, Regularization and ResNets
  7. 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:

mnist-sample

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.16 | mkl 11 KB conda-forge ca-certificates-2020.6.20 | hecda079_0 145 KB conda-forge certifi-2020.6.20 | 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-9d | h516909a_0 266 KB conda-forge lcms2-2.11 | hbd6801e_0 431 KB conda-forge libblas-3.8.0 | 16_mkl 11 KB conda-forge libcblas-3.8.0 | 16_mkl 11 KB conda-forge libgfortran-ng-7.5.0 | hdf63c60_6 1.7 MB conda-forge liblapack-3.8.0 | 16_mkl 11 KB conda-forge liblapacke-3.8.0 | 16_mkl 11 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.9.2 | he1b5a44_1 226 KB conda-forge mkl-2020.1 | 217 129.0 MB defaults ninja-1.10.0 | hc9558a2_0 1.9 MB conda-forge numpy-1.19.0 | py37h8960a57_0 5.2 MB conda-forge olefile-0.46 | py_0 31 KB conda-forge pillow-7.2.0 | py37h718be6c_1 675 KB conda-forge pytorch-1.5.1 | py3.7_cpu_0 37.9 MB pytorch torchvision-0.6.1 | py37_cpu 11.0 MB pytorch zstd-1.4.5 | h6597ccf_1 428 KB conda-forge ------------------------------------------------------------ Total: 192.4 MB The following NEW packages will be INSTALLED: blas conda-forge/linux-64::blas-2.16-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-9d-h516909a_0 lcms2 conda-forge/linux-64::lcms2-2.11-hbd6801e_0 libblas conda-forge/linux-64::libblas-3.8.0-16_mkl libcblas conda-forge/linux-64::libcblas-3.8.0-16_mkl libgfortran-ng conda-forge/linux-64::libgfortran-ng-7.5.0-hdf63c60_6 liblapack conda-forge/linux-64::liblapack-3.8.0-16_mkl liblapacke conda-forge/linux-64::liblapacke-3.8.0-16_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.9.2-he1b5a44_1 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.19.0-py37h8960a57_0 olefile conda-forge/noarch::olefile-0.46-py_0 pillow conda-forge/linux-64::pillow-7.2.0-py37h718be6c_1 pytorch pytorch/linux-64::pytorch-1.5.1-py3.7_cpu_0 torchvision pytorch/linux-64::torchvision-0.6.1-py37_cpu zstd conda-forge/linux-64::zstd-1.4.5-h6597ccf_1 The following packages will be UPDATED: ca-certificates 2020.4.5.1-hecc5488_0 --> 2020.6.20-hecda079_0 certifi 2020.4.5.1-py37hc8dfbb8_0 --> 2020.6.20-py37hc8dfbb8_0 Downloading and Extracting Packages cpuonly-1.0 | 2 KB | ##################################### | 100% olefile-0.46 | 31 KB | ##################################### | 100% intel-openmp-2020.1 | 780 KB | ##################################### | 100% libblas-3.8.0 | 11 KB | ##################################### | 100% pillow-7.2.0 | 675 KB | ##################################### | 100% libtiff-4.1.0 | 668 KB | ##################################### | 100% lz4-c-1.9.2 | 226 KB | ##################################### | 100% mkl-2020.1 | 129.0 MB | ##################################### | 100% lcms2-2.11 | 431 KB | ##################################### | 100% pytorch-1.5.1 | 37.9 MB | ##################################### | 100% jpeg-9d | 266 KB | ##################################### | 100% blas-2.16 | 11 KB | ##################################### | 100% zstd-1.4.5 | 428 KB | ##################################### | 100% numpy-1.19.0 | 5.2 MB | ##################################### | 100% libcblas-3.8.0 | 11 KB | ##################################### | 100% ninja-1.10.0 | 1.9 MB | ##################################### | 100% ca-certificates-2020 | 145 KB | ##################################### | 100% liblapacke-3.8.0 | 11 KB | ##################################### | 100% torchvision-0.6.1 | 11.0 MB | ##################################### | 100% libgfortran-ng-7.5.0 | 1.7 MB | ##################################### | 100% certifi-2020.6.20 | 151 KB | ##################################### | 100% freetype-2.10.2 | 905 KB | ##################################### | 100% libpng-1.6.37 | 308 KB | ##################################### | 100% libwebp-base-1.1.0 | 845 KB | ##################################### | 100% liblapack-3.8.0 | 11 KB | ##################################### | 100% Preparing transaction: done Verifying transaction: done Executing transaction: done