For this competition, use a three-layer neural network. To train the multilayer neural network, use the PyTorch deep learning library.  The net has an input dimension of N, a hidden layer dimension of H, and performs classification over 10 classes of the CIFAR-10 dataset.

In other words, the network has the following architecture:
Input - fully connected layer - ReLU - Fully connected layer - ReLU - Fully connected layer -  Softmax 
The outputs of the third fully connected layer are the scores for each class.

To start working on this Project, follow the below steps:
**Step 1: Prepare the dataset:**
Prepare the CIFAR-10 dataset in PyTorch format and Develop train, val, and test dataloader for training and testing. 

PyTorch’s `Dataset` and `DataLoader `classes help us fetch the training batches in the background using multiple processes. To avoid computational bottlenecks, using these background processes ensures that the next batch of data is ready when the model finishes its backward pass. 
The code for this will be provided to you. 

```
# Preparing your pytorch custom dataset.
import torch
from torch.utils.data import Dataset
from torch.utils.data.dataset import random_split

transform = transforms.Compose([ transforms.ToTensor()])

class CustomImageDataset(Dataset):
    def __init__(self, img_dic, transform=None):

        self.img_dic = img_dic
        self.transform = transform

        self.img_names = list(img_dic.keys())
        self.labels = list(img_dic.values())

    def __getitem__(self, index):
        img = Image.open(self.img_names[index])
        label = self.labels[index]
        if self.transform is not None:
            img = self.transform(img)
            label = self.transform(label)
        return img, label

    def __len__(self):
        return len(self.img_names)
```
```
# Read the image name and label from the train.csv and test.csv files 
train_image_label_dic = ...
test_image_label_dic =...
```
```
train_dataset = CustomImageDataset(train_image_label_dic, transform)
test_dataset = CustomImageDataset(test_image_label_dic, transform)

torch.manual_seed(1)
train_dataset, val_dataset = random_split(train_dataset, lengths=[...., ...])
```
```
# Transform the train, val, and test pytorch dataset into dataloader

```
**Step 2: Build a three-layer neural network Pipeline:**
```
class ThreeLayer_DNN(torch.nn.Module):
    ......
```
**Additional resources:**
 [Datasets & DataLoaders] (https://pytorch.org/tutorials/beginner/basics/data_tutorial.html)