{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"# Import helper libraries\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport requests\nfrom io import BytesIO # Use When expecting bytes-like objects\nimport pickle\nfrom collections import OrderedDict\nimport os\nfrom os import path\nimport ast\nimport random\n\n# import matplotlib for visualization\nfrom matplotlib.pyplot import imshow\nimport matplotlib.pyplot as plt\n\n# import PIL for image manipulation\nfrom PIL import Image, ImageDraw, ImageOps\n\n# import machine learning libraries\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import accuracy_score\n\n# import pytorch\nimport torch\nfrom torch import nn\nfrom torch import optim\nimport torch.nn.functional as F\nfrom torchvision import datasets, transforms","execution_count":1,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"![header image](https://github.com/Lexie88rus/quick-draw-image-recognition/blob/master/app/static/jumbotron.png?raw=true)"},{"metadata":{},"cell_type":"markdown","source":"# Getting Started with Deep Learning and PyTorch for Quick, Draw! Doodles Recognition"},{"metadata":{},"cell_type":"markdown","source":"## DEFINITION\n\n### Overview\nThe [Quick Draw](https://github.com/googlecreativelab/quickdraw-dataset) Dataset is a collection of 50 million drawings across 345 categories, contributed by players of the game [Quick, Draw!](https://quickdraw.withgoogle.com/). The player starts with an object to draw (for example it may say \"Draw a chair in under 20 seconds\"). Then the player has twenty seconds to draw that object. Based on what they draw, the AI guesses what they are drawing.\nResearch in recognition of images drawn by humans can improve pattern recognition solutions more broadly. Improving pattern recognition has an impact on handwriting recognition and its robust applications in areas including OCR (Optical Character Recognition), ASR (Automatic Speech Recognition) & NLP (Natural Language Processing).\n__In this kernel I analyzed the drawings and tried to build a deep learning application to classify those drawings__ (in this [GitHub repository](https://github.com/Lexie88rus/quick-draw-image-recognition) you can find the code for the resulting web application to play around with the model).\n\n### Problem Statement\n\nRecognition of a drawing is a classification problem. I have to build a solution, which classifies input images. I split the whole problem of recognition of drawings into the following tasks:\n* Input data analysis and preprocessing;\n* Building a model to classify drawings;\n* Evaluation of the model concerning chosen metrics;\n* Building a web-application to demonstrate the results.\n\nI am new to deep learning, so I simplified this task to only ten classes from the dataset. I will also shrink the input images to 28x28 pixels in order to be able to use simple fully connected network to classify the images.\n\n### Metrics\n\nI chose accuracy as a metric to evaluate the results. Because of the rules of the game, we mostly care about how many times did the AI recognize the drawing correctly, and this is just the accuracy of the model."},{"metadata":{},"cell_type":"markdown","source":"## INPUT DATA"},{"metadata":{},"cell_type":"markdown","source":"### Load Data"},{"metadata":{},"cell_type":"markdown","source":"I am going to load the simplified data for 10 classes:"},{"metadata":{"trusted":true},"cell_type":"code","source":"# define 10 classes to load the data for\ncategories = ['cannon','eye', 'face', 'nail', 'pear','piano','radio','spider','star','sword']\nlabel_dict = {0:'cannon',1:'eye', 2:'face', 3:'nail', 4:'pear',\n                      5:'piano',6:'radio', 7:'spider', 8:'star', 9:'sword'}\n\n# load data for each category\nclasses = {}\nfor category in categories:\n    data = pd.read_csv(\"../input/train_simplified/\" + category + \".csv\")\n    classes[category] = data","execution_count":2,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Explore and Preprocess Data"},{"metadata":{},"cell_type":"markdown","source":"I want to work with a simplified representation of images. I will shrink initial images to 28x28 grayscale images. For image manipulation I am going to use utility functions described below. "},{"metadata":{"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"# Image manipulation utilities: \n\ndef convert_to_PIL(drawing, width = 256, height = 256):\n    \"\"\"\n    Function to convert from drawing to PIL image.\n    INPUT:\n        drawing - drawing from 'drawing' column\n        width - width of the initial image\n        height - height of the initial image\n    OUTPUT:\n        pil_img - (PIL Image) image\n    \"\"\"\n    \n    # initialize empty (white) PIL image\n    pil_img = Image.new('RGB', (width, height), 'white')\n    pixels = pil_img.load()\n            \n    draw = ImageDraw.Draw(pil_img)\n    \n    # draw strokes as lines\n    for x,y in drawing:\n        for i in range(1, len(x)):\n            draw.line((x[i-1], y[i-1], x[i], y[i]), fill=0)\n        \n    return pil_img\n\ndef convert_to_np_raw(drawing, width = 256, height = 256):\n    \"\"\"\n    INPUT:\n        drawing - drawing in initial format\n        width - width of the initial image\n        height - height of the initial image\n    OUTPUT:\n        img - drawing converted to the numpy array (28 X 28)\n    \"\"\"\n    # initialize empty numpy array\n    img = np.zeros((28, 28))\n    \n    # create a PIL image out of drawing\n    pil_img = convert_to_PIL(drawing)\n    \n    #resize to 28,28\n    pil_img.thumbnail((28,28), Image.ANTIALIAS)\n    \n    pil_img = pil_img.convert('RGB')\n    pixels = pil_img.load()\n    \n    # fill in numpy array with pixel values\n    for i in range(0, 28):\n        for j in range(0, 28):\n            img[i, j] = 1 - pixels[j, i][0] / 255\n    \n    return img\n\ndef convert_to_np(pil_img, width = 256, height = 256):\n    \"\"\"\n    Function to convert PIL Image to numpy array.\n    INPUT:\n        pil_img - (PIL Image) image to be converted\n    OUTPUT:\n        img - (numpy array) converted image with shape (width, height)\n    \"\"\"\n    pil_img = pil_img.convert('RGB')\n\n    img = np.zeros((width, height))\n    pixels = pil_img.load()\n\n    for i in range(0, width):\n        for j in range(0, height):\n            img[i, j] = 1 - pixels[j, i][0] / 255\n\n    return img\n\ndef view_image(img, width = 256, height = 256):\n    \"\"\"\n    Function to view numpy image with matplotlib.\n    The function saves the image as png.\n    INPUT:\n        img - (numpy array) image from train dataset with size (1, 784)\n    OUTPUT:\n        None\n    \"\"\"\n    fig, ax = plt.subplots(figsize=(6,9))\n    ax.imshow(img.reshape(width, height).squeeze())\n    ax.axis('off')\n\n    plt.show()\n    \ndef crop_image(image):\n    \"\"\"\n    Crops image (crops out white spaces).\n    INPUT:\n        image - PIL image of original size to be cropped\n    OUTPUT:\n        cropped_image - PIL image cropped to the center  and resized to (28, 28)\n    \"\"\"\n    cropped_image = image\n\n    # get image size\n    width, height = cropped_image.size\n\n    # get image pixels\n    pixels = cropped_image.load()\n\n    image_strokes_rows = []\n    image_strokes_cols = []\n\n    # run through the image\n    for i in range(0, width):\n        for j in range(0, height):\n            # save coordinates of the image\n            if (pixels[i,j][0] > 0):\n                image_strokes_cols.append(i)\n                image_strokes_rows.append(j)\n\n    # if image is not empty then crop to contents of the image\n    if (len(image_strokes_rows)) > 0:\n        # find the box for image\n        row_min = np.array(image_strokes_rows).min()\n        row_max = np.array(image_strokes_rows).max()\n        col_min = np.array(image_strokes_cols).min()\n        col_max = np.array(image_strokes_cols).max()\n\n        # find the box for cropping\n        margin = min(row_min, height - row_max, col_min, width - col_max)\n\n        # crop image\n        border = (col_min, row_min, width - col_max, height - row_max)\n        cropped_image = ImageOps.crop(cropped_image, border)\n\n    # get cropped image size\n    width_cropped, height_cropped = cropped_image.size\n\n    # create square resulting image to paste cropped image into the center\n    dst_im = Image.new(\"RGBA\", (max(width_cropped, height_cropped), max(width_cropped, height_cropped)), \"white\")\n    offset = ((max(width_cropped, height_cropped) - width_cropped) // 2, (max(width_cropped, height_cropped) - height_cropped) // 2)\n    # paste to the center of a resulting image\n    dst_im.paste(cropped_image, offset)\n\n    #resize to 28,28\n    dst_im.thumbnail((28,28), Image.ANTIALIAS)\n\n    return dst_im\n\ndef normalize(arr):\n    \"\"\"\n    Function performs the linear normalizarion of the array.\n    https://stackoverflow.com/questions/7422204/intensity-normalization-of-image-using-pythonpil-speed-issues\n    http://en.wikipedia.org/wiki/Normalization_%28image_processing%29\n    INPUT:\n        arr - orginal numpy array\n    OUTPUT:\n        arr - normalized numpy array\n    \"\"\"\n    arr = arr.astype('float')\n    # Do not touch the alpha channel\n    for i in range(3):\n        minval = arr[...,i].min()\n        maxval = arr[...,i].max()\n        if minval != maxval:\n            arr[...,i] -= minval\n            arr[...,i] *= (255.0/(maxval-minval))\n    return arr\n\ndef normalize_image(image):\n    \"\"\"\n    Function performs the normalization of the image.\n    https://stackoverflow.com/questions/7422204/intensity-normalization-of-image-using-pythonpil-speed-issues\n    INPUT:\n        image - PIL image to be normalized\n    OUTPUT:\n        new_img - PIL image normalized\n    \"\"\"\n    arr = np.array(image)\n    new_img = Image.fromarray(normalize(arr).astype('uint8'),'RGBA')\n    return new_img\n\ndef rotate_image(src_im, angle = 45, size = (28,28)):\n    \"\"\"\n    Function to rotate PIL Image file\n    INPUT:\n        src_im - (PIL Image) 28x28 image to be rotated\n        angle - angle to rotate the image\n        size - (tuple) size of the output image\n    OUTPUT:\n        dst_im - (PIL Image) rotated image\n    \"\"\"\n    dst_im = Image.new(\"RGBA\", size, \"white\")\n    src_im = src_im.convert('RGBA')\n\n    rot = src_im.rotate(angle)\n    dst_im.paste(rot, (0, 0), rot)\n\n    return dst_im\n\ndef flip_image(src_im):\n    \"\"\"\n    Function to flip a PIL Image file.\n    INPUT:\n        scr_im - (PIL Image) image to be flipped\n    OUTPUT:\n        dst_im - (PIL Image) flipped image\n    \"\"\"\n    dst_im = src_im.transpose(Image.FLIP_LEFT_RIGHT)\n    return dst_im","execution_count":3,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Shrink the images and create datasets with images and labels:"},{"metadata":{"trusted":true},"cell_type":"code","source":"# shrinking the images\n\n# create the dictionary containing classes names as keys and images as values\nvalues_dict = {}\nfor category in categories:\n    data = classes[category][:3000]\n    values = [convert_to_np_raw(ast.literal_eval(img)).reshape(1, 784) for img in data['drawing'].values]\n    values_dict[category] = values\n    \n# concatenate to create X (values) and y (labels) datasets\nX = []\ny = []\n\nfor key, value in label_dict.items():\n    data_i = values_dict[value]\n    Xi = np.concatenate(data_i, axis = 0)\n    yi = np.full((len(Xi), 1), key).ravel()\n    \n    X.append(Xi)\n    y.append(yi)\n    \nX = np.concatenate(X, axis = 0)\ny = np.concatenate(y, axis = 0)","execution_count":4,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Preview some random examples of the images from the dataset:"},{"metadata":{"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"def view_images_grid(X, y):\n    \"\"\"\n    Function to plot grid with several examples of images.\n    INPUT:\n        X - (numpy array) images dataset\n        y - (numpy array) labels for images from X dataset\n\n    OUTPUT: None\n    \"\"\"\n    fig, axs = plt.subplots(5, 10, figsize=(20,10))\n    \n    for label_num in range(0,50):\n        r_label = random.randint(0, len(X) - 1)\n        image = X[r_label].reshape(28,28)  #reshape images\n        i = label_num // 10\n        j = label_num % 10\n        axs[i,j].imshow(image) #plot the data\n        axs[i,j].axis('off')\n        axs[i,j].set_title(label_dict[y[r_label]])\n\n    plt.show()","execution_count":5,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"view_images_grid(X, y)","execution_count":6,"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 1440x720 with 50 Axes>","image/png":"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\n"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"It is also interesting to view the \"heatmaps\" for images for one category. The \"heatmaps\" are generalized representations of images coming from one category. \"Heatmaps\" are created out of mean values for pixels for all images from one category:"},{"metadata":{"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"def get_label_heatmap(X, y, label, label_name):\n    \"\"\"\n    Function to plot the heatmap for images with same label.\n    INPUT:\n        X - (numpy array) dataset\n        y - (numpy array) labels for X dataset\n        label - (int) label for images\n        label_name - (str) name for images label\n\n    OUTPUT: None\n    \"\"\"\n    # filter X_train to remove all other images\n    label_filter = y == label\n    X = pd.DataFrame(X)\n    X_labeled = X[label_filter]\n\n    # find mean value for pixels\n    X_mean = np.sum(X_labeled, axis = 0).values\n\n    return X_mean","execution_count":7,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"fig, axs = plt.subplots(2,5, figsize=(10,5))\n\nfor key, value in label_dict.items():\n    # get heatmap\n    heatmap = get_label_heatmap(X, y, key, value)\n    \n    i = key // 5\n    j = key % 5\n    \n    # plot image\n    axs[i,j].set_title(value)\n    axs[i,j].imshow(heatmap.reshape(28, 28).squeeze())\n    axs[i,j].axis('off')\n    \nplt.show()","execution_count":8,"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 720x360 with 10 Axes>","image/png":"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\n"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"The heatmaps demonstrated on visualizations above, in fact, represent the generalized idea of each class. Looking at the heatmaps, we can make a lot of interesting observations:\n* People who play the game give the star a five-pointed representation.\n* People who play the game represent nail as a metal spike (not as a body part).\n* Game players generally draw the sword pointed upwards."},{"metadata":{},"cell_type":"markdown","source":"## MODELLING"},{"metadata":{},"cell_type":"markdown","source":"Since there is a lot of data, and I can even generate additional data by flipping and rotating the images, I decided to use deep learning approaches to classify drawings.\n<br>I started with a simple fully connected neural network with two hidden layers built with the PyTorch library.\nThe sizes of the layers are as follows:\n* Input layer: 784 (for 28 x 28 images),\n* Hidden layer 1: 128,\n* Hidden layer 2: 100,\n* Output layer: 10 (the number of classes).\n\nFor each hidden layer there is:\n* ReLU activation function,\n* Batch normalization.\n\nThe resulting model has hyperparameters as follows:\n* Learning rate,\n* Dropout for hidden layers,\n* Weight decay (L2 regularization),\n* Optimizer: Adam or SGD."},{"metadata":{"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"def build_model(input_size, output_size, hidden_sizes, dropout = 0.0):\n    '''\n    Function creates deep learning model based on parameters passed.\n\n    INPUT:\n        input_size, output_size, hidden_sizes - layer sizes\n        dropout - dropout (probability of keeping a node)\n\n    OUTPUT:\n        model - deep learning model\n    '''\n\n    # Build a feed-forward network\n    model = nn.Sequential(OrderedDict([\n                          ('fc1', nn.Linear(input_size, hidden_sizes[0])),\n                          ('relu1', nn.ReLU()),\n                          ('fc2', nn.Linear(hidden_sizes[0], hidden_sizes[1])),\n                          ('bn2', nn.BatchNorm1d(num_features=hidden_sizes[1])),\n                          ('relu2', nn.ReLU()),\n                          ('dropout', nn.Dropout(dropout)),\n                          ('fc3', nn.Linear(hidden_sizes[1], hidden_sizes[2])),\n                          ('bn3', nn.BatchNorm1d(num_features=hidden_sizes[2])),\n                          ('relu3', nn.ReLU()),\n                          ('logits', nn.Linear(hidden_sizes[2], output_size))]))\n\n    return model\n\ndef shuffle(X_train, y_train):\n    \"\"\"\n    Function which shuffles training dataset.\n    INPUT:\n        X_train - (tensor) training set\n        y_train - (tensor) labels for training set\n\n    OUTPUT:\n        X_train_shuffled - (tensor) shuffled training set\n        y_train_shuffled - (tensor) shuffled labels for training set\n    \"\"\"\n    X_train_shuffled = X_train.numpy()\n    y_train_shuffled = y_train.numpy().reshape((X_train.shape[0], 1))\n\n    permutation = list(np.random.permutation(X_train.shape[0]))\n    X_train_shuffled = X_train_shuffled[permutation, :]\n    y_train_shuffled = y_train_shuffled[permutation, :].reshape((X_train.shape[0], 1))\n\n    X_train_shuffled = torch.from_numpy(X_train_shuffled).float()\n    y_train_shuffled = torch.from_numpy(y_train_shuffled).long()\n\n    return X_train_shuffled, y_train_shuffled\n\ndef fit_model(model, X_train, y_train, epochs = 100, n_chunks = 1000, learning_rate = 0.003, weight_decay = 0, optimizer = 'SGD'):\n    \"\"\"\n    Function which fits the model.\n\n    INPUT:\n        model - pytorch model to fit\n        X_train - (tensor) train dataset\n        y_train - (tensor) train dataset labels\n        epochs - number of epochs\n        n_chunks - number of chunks to cplit the dataset\n        learning_rate - learning rate value\n\n    OUTPUT: None\n    \"\"\"\n\n    print(\"Fitting model with epochs = {epochs}, learning rate = {lr}\\n\"\\\n    .format(epochs = epochs, lr = learning_rate))\n\n    criterion = nn.CrossEntropyLoss()\n\n    if (optimizer == 'SGD'):\n        optimizer = optim.SGD(model.parameters(), lr=learning_rate, weight_decay= weight_decay)\n    else:\n        optimizer = optim.Adam(model.parameters(), lr=learning_rate, weight_decay= weight_decay)\n\n    print_every = 10\n\n    steps = 0\n\n    for e in range(epochs):\n        running_loss = 0\n\n        X_train, y_train = shuffle(X_train, y_train)\n\n        images = torch.chunk(X_train, n_chunks)\n        labels = torch.chunk(y_train, n_chunks)\n\n        for i in range(n_chunks):\n            steps += 1\n\n            optimizer.zero_grad()\n\n            # Forward and backward passes\n            output = model.forward(images[i])\n            loss = criterion(output, labels[i].squeeze())\n            loss.backward()\n            optimizer.step()\n\n            running_loss += loss.item()\n        \n        if epochs % print_every == 0:\n            print(\"Epoch: {}/{}... \".format(e+1, epochs),\n                  \"Loss: {:.4f}\".format(running_loss/print_every))\n\n            running_loss = 0\n                \n                \ndef view_classify(img, ps):\n    \"\"\"\n    Function for viewing an image and it's predicted classes\n    with matplotlib.\n\n    INPUT:\n        img - (tensor) image file\n        ps - (tensor) predicted probabilities for each class\n    \"\"\"\n    ps = ps.data.numpy().squeeze()\n\n    fig, (ax1, ax2) = plt.subplots(figsize=(6,9), ncols=2)\n    ax1.imshow(img.resize_(1, 28, 28).numpy().squeeze())\n    ax1.axis('off')\n    ax2.barh(np.arange(10), ps)\n    ax2.set_aspect(0.1)\n    ax2.set_yticks(np.arange(10))\n    ax2.set_yticklabels(['cannon','eye', 'face', 'nail', 'pear','piano','radio','spider','star','sword'], size='small');\n    ax2.set_title('Class Probability')\n    ax2.set_xlim(0, 1.1)\n\n    plt.tight_layout()\n    plt.show()\n    \ndef test_model(model, img):\n    \"\"\"\n    Function creates test view of the model's prediction for image.\n\n    INPUT:\n        model - pytorch model\n        img - (tensor) image from the dataset\n\n    OUTPUT: None\n    \"\"\"\n\n    # Convert 2D image to 1D vector\n    img = img.resize_(1, 784)\n\n    ps = get_preds(model, img)\n    view_classify(img.resize_(1, 28, 28), ps)\n\ndef get_preds(model, input):\n    \"\"\"\n    Function to get predicted probabilities from the model for each class.\n\n    INPUT:\n        model - pytorch model\n        input - (tensor) input vector\n\n    OUTPUT:\n        ps - (tensor) vector of predictions\n    \"\"\"\n\n    # Turn off gradients to speed up this part\n    with torch.no_grad():\n        logits = model.forward(input)\n    ps = F.softmax(logits, dim=1)\n    return ps\n\ndef get_labels(pred):\n    \"\"\"\n        Function to get the vector of predicted labels for the images in\n        the dataset.\n\n        INPUT:\n            pred - (tensor) vector of predictions (probabilities for each class)\n        OUTPUT:\n            pred_labels - (numpy) array of predicted classes for each vector\n    \"\"\"\n\n    pred_np = pred.numpy()\n    pred_values = np.amax(pred_np, axis=1, keepdims=True)\n    pred_labels = np.array([np.where(pred_np[i, :] == pred_values[i, :])[0] for i in range(pred_np.shape[0])])\n    pred_labels = pred_labels.reshape(len(pred_np), 1)\n\n    return pred_labels\n\ndef evaluate_model(model, train, y_train, test, y_test):\n    \"\"\"\n    Function to print out train and test accuracy of the model.\n\n    INPUT:\n        model - pytorch model\n        train - (tensor) train dataset\n        y_train - (numpy) labels for train dataset\n        test - (tensor) test dataset\n        y_test - (numpy) labels for test dataset\n\n    OUTPUT:\n        accuracy_train - accuracy on train dataset\n        accuracy_test - accuracy on test dataset\n    \"\"\"\n    train_pred = get_preds(model, train)\n    train_pred_labels = get_labels(train_pred)\n\n    test_pred = get_preds(model, test)\n    test_pred_labels = get_labels(test_pred)\n\n    accuracy_train = accuracy_score(y_train, train_pred_labels)\n    accuracy_test = accuracy_score(y_test, test_pred_labels)\n\n    print(\"Accuracy score for train set is {} \\n\".format(accuracy_train))\n    print(\"Accuracy score for test set is {} \\n\".format(accuracy_test))\n\n    return accuracy_train, accuracy_test\n\ndef plot_learning_curve(input_size, output_size, hidden_sizes, train, labels, y_train, test, y_test, learning_rate = 0.003, weight_decay = 0.0, dropout = 0.0, n_chunks = 1000, optimizer = 'SGD'):\n    \"\"\"\n    Function to plot learning curve depending on the number of epochs.\n\n    INPUT:\n        input_size, output_size, hidden_sizes - model parameters\n        train - (tensor) train dataset\n        labels - (tensor) labels for train dataset\n        y_train - (numpy) labels for train dataset\n        test - (tensor) test dataset\n        y_test - (numpy) labels for test dataset\n        learning_rate - learning rate hyperparameter\n        weight_decay - weight decay (regularization)\n        dropout - dropout for hidden layer\n        n_chunks - the number of minibatches to train the model\n        optimizer - optimizer to be used for training (SGD or Adam)\n\n    OUTPUT: None\n    \"\"\"\n    train_acc = []\n    test_acc = []\n\n    for epochs in np.arange(10, 60, 10):\n        # create model\n        model = build_model(input_size, output_size, hidden_sizes, dropout = dropout)\n\n        # fit model\n        fit_model(model, train, labels, epochs = epochs, n_chunks = n_chunks, learning_rate = learning_rate, weight_decay = weight_decay, optimizer = 'SGD')\n        # get accuracy\n        accuracy_train, accuracy_test = evaluate_model(model, train, y_train, test, y_test)\n\n        train_acc.append(accuracy_train)\n        test_acc.append(accuracy_test)\n    \n    return train_acc, test_acc","execution_count":9,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Let's try out the model:"},{"metadata":{"trusted":true},"cell_type":"code","source":"# Split dataset into train/test splits\nX_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3,random_state=1)","execution_count":10,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Convert to tensors\ntrain = torch.from_numpy(X_train).float()\nlabels = torch.from_numpy(y_train).long()\ntest = torch.from_numpy(X_test).float()\ntest_labels = torch.from_numpy(y_test).long()\n\n# Set hyperparameters for our network\ninput_size = 784\nhidden_sizes = [128, 100, 64]\noutput_size = 10\n\ndropout = 0.0\nweight_decay = 0.0\nn_chunks = 700\nlearning_rate = 0.03\noptimizer = 'SGD'","execution_count":14,"outputs":[]},{"metadata":{"trusted":true,"_kg_hide-output":true},"cell_type":"code","source":"# Build model\nmodel = build_model(input_size, output_size, hidden_sizes, dropout = dropout)\n\n# Fit model\ntrain_acc, test_acc = plot_learning_curve(input_size, output_size, hidden_sizes, train, labels, y_train, test, y_test, learning_rate = learning_rate, dropout = dropout, weight_decay = weight_decay, n_chunks = n_chunks, optimizer = optimizer)","execution_count":15,"outputs":[{"output_type":"stream","text":"Fitting model with epochs = 10, learning rate = 0.03\n\nEpoch: 1/10...  Loss: 84.8703\nEpoch: 2/10...  Loss: 56.4065\nEpoch: 3/10...  Loss: 48.7383\nEpoch: 4/10...  Loss: 43.2959\nEpoch: 5/10...  Loss: 38.9596\nEpoch: 6/10...  Loss: 35.6102\nEpoch: 7/10...  Loss: 32.2861\nEpoch: 8/10...  Loss: 29.1549\nEpoch: 9/10...  Loss: 26.3767\nEpoch: 10/10...  Loss: 24.3731\nAccuracy score for train set is 0.9347142857142857 \n\nAccuracy score for test set is 0.787 \n\nFitting model with epochs = 20, learning rate = 0.03\n\nEpoch: 1/20...  Loss: 85.6614\nEpoch: 2/20...  Loss: 56.8123\nEpoch: 3/20...  Loss: 48.8489\nEpoch: 4/20...  Loss: 43.4952\nEpoch: 5/20...  Loss: 39.2700\nEpoch: 6/20...  Loss: 35.5530\nEpoch: 7/20...  Loss: 32.7583\nEpoch: 8/20...  Loss: 29.6239\nEpoch: 9/20...  Loss: 27.3271\nEpoch: 10/20...  Loss: 24.4448\nEpoch: 11/20...  Loss: 22.3826\nEpoch: 12/20...  Loss: 20.6359\nEpoch: 13/20...  Loss: 18.4333\nEpoch: 14/20...  Loss: 17.2650\nEpoch: 15/20...  Loss: 15.9475\nEpoch: 16/20...  Loss: 14.2731\nEpoch: 17/20...  Loss: 13.0164\nEpoch: 18/20...  Loss: 11.8121\nEpoch: 19/20...  Loss: 11.6631\nEpoch: 20/20...  Loss: 10.4220\nAccuracy score for train set is 0.9787142857142858 \n\nAccuracy score for test set is 0.7807777777777778 \n\nFitting model with epochs = 30, learning rate = 0.03\n\nEpoch: 1/30...  Loss: 86.7281\nEpoch: 2/30...  Loss: 57.8150\nEpoch: 3/30...  Loss: 49.5362\nEpoch: 4/30...  Loss: 44.2299\nEpoch: 5/30...  Loss: 40.0523\nEpoch: 6/30...  Loss: 36.3508\nEpoch: 7/30...  Loss: 33.1790\nEpoch: 8/30...  Loss: 30.1099\nEpoch: 9/30...  Loss: 27.5727\nEpoch: 10/30...  Loss: 24.7544\nEpoch: 11/30...  Loss: 22.3916\nEpoch: 12/30...  Loss: 20.4516\nEpoch: 13/30...  Loss: 18.9608\nEpoch: 14/30...  Loss: 16.4040\nEpoch: 15/30...  Loss: 15.7828\nEpoch: 16/30...  Loss: 14.1464\nEpoch: 17/30...  Loss: 12.6914\nEpoch: 18/30...  Loss: 11.9619\nEpoch: 19/30...  Loss: 11.2375\nEpoch: 20/30...  Loss: 10.4594\nEpoch: 21/30...  Loss: 9.5636\nEpoch: 22/30...  Loss: 8.6112\nEpoch: 23/30...  Loss: 8.5181\nEpoch: 24/30...  Loss: 7.4567\nEpoch: 25/30...  Loss: 6.9029\nEpoch: 26/30...  Loss: 6.3613\nEpoch: 27/30...  Loss: 6.0407\nEpoch: 28/30...  Loss: 6.1184\nEpoch: 29/30...  Loss: 6.0100\nEpoch: 30/30...  Loss: 5.3079\nAccuracy score for train set is 0.9930952380952381 \n\nAccuracy score for test set is 0.7798888888888889 \n\nFitting model with epochs = 40, learning rate = 0.03\n\nEpoch: 1/40...  Loss: 87.4743\nEpoch: 2/40...  Loss: 57.2188\nEpoch: 3/40...  Loss: 49.3772\nEpoch: 4/40...  Loss: 43.9619\nEpoch: 5/40...  Loss: 39.7861\nEpoch: 6/40...  Loss: 35.9696\nEpoch: 7/40...  Loss: 32.3642\nEpoch: 8/40...  Loss: 29.7003\nEpoch: 9/40...  Loss: 27.2369\nEpoch: 10/40...  Loss: 24.7827\nEpoch: 11/40...  Loss: 22.6175\nEpoch: 12/40...  Loss: 20.1828\nEpoch: 13/40...  Loss: 19.0215\nEpoch: 14/40...  Loss: 17.0176\nEpoch: 15/40...  Loss: 15.9535\nEpoch: 16/40...  Loss: 14.2026\nEpoch: 17/40...  Loss: 12.8665\nEpoch: 18/40...  Loss: 12.0403\nEpoch: 19/40...  Loss: 10.7090\nEpoch: 20/40...  Loss: 10.1389\nEpoch: 21/40...  Loss: 9.3880\nEpoch: 22/40...  Loss: 8.6024\nEpoch: 23/40...  Loss: 7.9102\nEpoch: 24/40...  Loss: 7.7508\nEpoch: 25/40...  Loss: 7.0697\nEpoch: 26/40...  Loss: 5.8757\nEpoch: 27/40...  Loss: 6.0146\nEpoch: 28/40...  Loss: 5.3671\nEpoch: 29/40...  Loss: 5.2149\nEpoch: 30/40...  Loss: 4.4140\nEpoch: 31/40...  Loss: 5.2239\nEpoch: 32/40...  Loss: 5.0950\nEpoch: 33/40...  Loss: 3.9457\nEpoch: 34/40...  Loss: 4.5415\nEpoch: 35/40...  Loss: 4.3025\nEpoch: 36/40...  Loss: 4.3903\nEpoch: 37/40...  Loss: 3.9380\nEpoch: 38/40...  Loss: 3.8064\nEpoch: 39/40...  Loss: 3.4714\nEpoch: 40/40...  Loss: 2.7563\nAccuracy score for train set is 0.9980952380952381 \n\nAccuracy score for test set is 0.785 \n\nFitting model with epochs = 50, learning rate = 0.03\n\nEpoch: 1/50...  Loss: 85.1270\nEpoch: 2/50...  Loss: 56.7797\nEpoch: 3/50...  Loss: 49.1620\nEpoch: 4/50...  Loss: 43.9200\nEpoch: 5/50...  Loss: 39.9907\nEpoch: 6/50...  Loss: 36.8926\nEpoch: 7/50...  Loss: 33.6233\nEpoch: 8/50...  Loss: 31.0162\nEpoch: 9/50...  Loss: 27.9945\nEpoch: 10/50...  Loss: 25.8716\nEpoch: 11/50...  Loss: 23.7980\nEpoch: 12/50...  Loss: 21.5091\nEpoch: 13/50...  Loss: 19.8837\nEpoch: 14/50...  Loss: 18.5452\nEpoch: 15/50...  Loss: 17.5010\nEpoch: 16/50...  Loss: 15.2072\nEpoch: 17/50...  Loss: 14.0601\nEpoch: 18/50...  Loss: 13.0257\nEpoch: 19/50...  Loss: 12.4237\nEpoch: 20/50...  Loss: 11.3866\nEpoch: 21/50...  Loss: 10.5379\nEpoch: 22/50...  Loss: 9.5837\nEpoch: 23/50...  Loss: 9.3574\nEpoch: 24/50...  Loss: 8.9808\nEpoch: 25/50...  Loss: 8.3318\nEpoch: 26/50...  Loss: 7.0672\nEpoch: 27/50...  Loss: 6.9059\nEpoch: 28/50...  Loss: 6.2699\nEpoch: 29/50...  Loss: 6.4661\nEpoch: 30/50...  Loss: 6.0871\nEpoch: 31/50...  Loss: 6.0596\nEpoch: 32/50...  Loss: 5.0566\nEpoch: 33/50...  Loss: 5.1316\nEpoch: 34/50...  Loss: 4.8595\nEpoch: 35/50...  Loss: 4.3459\nEpoch: 36/50...  Loss: 4.3941\nEpoch: 37/50...  Loss: 3.9935\nEpoch: 38/50...  Loss: 3.8487\nEpoch: 39/50...  Loss: 3.6419\nEpoch: 40/50...  Loss: 3.5470\nEpoch: 41/50...  Loss: 4.1252\nEpoch: 42/50...  Loss: 4.0406\nEpoch: 43/50...  Loss: 4.0181\nEpoch: 44/50...  Loss: 3.5417\nEpoch: 45/50...  Loss: 3.4327\nEpoch: 46/50...  Loss: 3.2659\nEpoch: 47/50...  Loss: 2.9233\nEpoch: 48/50...  Loss: 2.7096\nEpoch: 49/50...  Loss: 2.7058\nEpoch: 50/50...  Loss: 3.0579\nAccuracy score for train set is 0.999 \n\nAccuracy score for test set is 0.7898888888888889 \n\n","name":"stdout"}]},{"metadata":{},"cell_type":"markdown","source":"Let's plot the accuracy with respect to the number of epochs:"},{"metadata":{"trusted":true},"cell_type":"code","source":"# Plot curve\nx = np.arange(10, 10 * (len(train_acc) + 1), 10)\nplt.plot(x, train_acc)\nplt.plot(x, test_acc)\nplt.legend(['train', 'test'], loc='upper left')\nplt.title('Accuracy, learning_rate = ' + str(learning_rate), fontsize=14)\nplt.xlabel('Number of epochs', fontsize=11)\nplt.ylabel('Accuracy', fontsize=11)\nplt.show()","execution_count":16,"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 432x288 with 1 Axes>","image/png":"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\n"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"Looking at the plot above we can say that we have model variance problem. On the training set we achieved 99% accuracy, which means that we fitted the training set quite well. But there is also a huge gap between training and test accuracy, which means that there is a variance problem, and we actually overfitted for the training dataset and fail to predict on the test set.\n<br>Variance problem can be addressed by increasing the training set. We have two options: get more images from the original dataset or generate more images from existing ones by flipping and rotating.\n<br>I will try the second option just to demonstrate how generation more data out of the existing works."},{"metadata":{"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"def convert_to_PIL_from_np(img):\n    \"\"\"\n    Function to convert numpy (1, 784) image to PIL image.\n    INPUT:\n        img - (numpy array) image from train dataset with size (1, 784)\n    OUTPUT:\n        pil_img - (PIL Image) 28x28 image\n    \"\"\"\n    img_r = img.reshape(28,28)\n\n    pil_img = Image.new('RGB', (28, 28), 'white')\n    pixels = pil_img.load()\n\n    for i in range(0, 28):\n        for j in range(0, 28):\n            if img_r[i, j] > 0:\n                pixels[j, i] = (255 - int(img_r[i, j] * 255), 255 - int(img_r[i, j] * 255), 255 - int(img_r[i, j] * 255))\n\n    return pil_img\n\ndef add_flipped_and_rotated_images(X_train, y_train):\n    \"\"\"\n    Function which adds flipped and rotated images to the original dataset.\n    INPUT:\n        X_train - (numpy array) the original training set\n        y_train - (numpy array) original labels dataset\n    OUTPUT:\n        X_Train_new - (numpy array) the dataset with added flipped and rotated\n        images\n        y_train_new - (numpy array) labels for the new training dataset\n    \"\"\"\n    print(\"Adding flipped and rotated images to the training set. \\n\")\n\n    X_train_new = X_train.copy()\n    y_train_new = y_train.copy().reshape(y_train.shape[0], 1)\n\n    for i in range(0, X_train.shape[0], 10): # I will skip some images just to run this faster \n        # get image to rotate and flip\n        img = X_train[i]\n        pil_img = convert_to_PIL_from_np(img)\n\n        # get random angle\n        angle = random.randint(5, 10)\n\n        # rotate and flip\n        rotated = convert_to_np(rotate_image(pil_img, angle), 28, 28)\n        flipped = convert_to_np(flip_image(pil_img), 28, 28)\n\n        # add to the original dataset\n        X_train_new = np.append(X_train_new, rotated.reshape(1, 784), axis = 0)\n        X_train_new = np.append(X_train_new, flipped.reshape(1, 784), axis = 0)\n        y_train_new = np.append(y_train_new, y_train[i].reshape(1,1), axis = 0)\n        y_train_new = np.append(y_train_new, y_train[i].reshape(1,1), axis = 0)\n\n        # print out progress\n        if i % 1000 == 0:\n            print(\"Processed {i} files out of {total}.\".format(i= i, total = X_train.shape[0]))\n\n    return X_train_new, y_train_new","execution_count":17,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"I will demonstrate example of flipped and rotated images:"},{"metadata":{"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"# examples of flipped and rotated images\nfig, axs = plt.subplots(1,3, figsize=(6,3))\n\nnp_img = X[0]\nnp_img_flipped = convert_to_np(flip_image(convert_to_PIL_from_np(np_img)), 28, 28)\nnp_img_rotated = convert_to_np(rotate_image(convert_to_PIL_from_np(np_img)), 28, 28)\n\n# plot the original image\naxs[0].set_title('original image')\naxs[0].imshow(np_img.reshape(28, 28).squeeze())\naxs[0].axis('off')\n\n# plot the flipped image\naxs[1].set_title('flipped image')\naxs[1].imshow(np_img_flipped.reshape(28, 28).squeeze())\naxs[1].axis('off')\n\n# plot the rotated image\naxs[2].set_title('rotated image')\naxs[2].imshow(np_img_rotated.reshape(28, 28).squeeze())\naxs[2].axis('off')","execution_count":18,"outputs":[{"output_type":"execute_result","execution_count":18,"data":{"text/plain":"(-0.5, 27.5, 27.5, -0.5)"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<Figure size 432x216 with 3 Axes>","image/png":"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\n"},"metadata":{}}]},{"metadata":{"trusted":true,"_kg_hide-output":true},"cell_type":"code","source":"X_train, y_train = add_flipped_and_rotated_images(X_train, y_train)","execution_count":19,"outputs":[{"output_type":"stream","text":"Adding flipped and rotated images to the training set. \n\nProcessed 0 files out of 21000.\nProcessed 1000 files out of 21000.\nProcessed 2000 files out of 21000.\nProcessed 3000 files out of 21000.\nProcessed 4000 files out of 21000.\nProcessed 5000 files out of 21000.\nProcessed 6000 files out of 21000.\nProcessed 7000 files out of 21000.\nProcessed 8000 files out of 21000.\nProcessed 9000 files out of 21000.\nProcessed 10000 files out of 21000.\nProcessed 11000 files out of 21000.\nProcessed 12000 files out of 21000.\nProcessed 13000 files out of 21000.\nProcessed 14000 files out of 21000.\nProcessed 15000 files out of 21000.\nProcessed 16000 files out of 21000.\nProcessed 17000 files out of 21000.\nProcessed 18000 files out of 21000.\nProcessed 19000 files out of 21000.\nProcessed 20000 files out of 21000.\n","name":"stdout"}]},{"metadata":{},"cell_type":"markdown","source":"Let's try to fit the model using new dataset with generated images:"},{"metadata":{"trusted":true,"_kg_hide-output":true},"cell_type":"code","source":"train = torch.from_numpy(X_train).float()\nlabels = torch.from_numpy(y_train).long()\n\n# Fit model\ntrain_acc, test_acc = plot_learning_curve(input_size, output_size, hidden_sizes, train, labels, y_train, test, y_test, learning_rate = learning_rate, dropout = dropout, weight_decay = weight_decay, n_chunks = 400, optimizer = optimizer)","execution_count":20,"outputs":[{"output_type":"stream","text":"Fitting model with epochs = 10, learning rate = 0.03\n\nEpoch: 1/10...  Loss: 57.0027\nEpoch: 2/10...  Loss: 34.9338\nEpoch: 3/10...  Loss: 28.9488\nEpoch: 4/10...  Loss: 25.6552\nEpoch: 5/10...  Loss: 22.8640\nEpoch: 6/10...  Loss: 20.4858\nEpoch: 7/10...  Loss: 18.4331\nEpoch: 8/10...  Loss: 16.4242\nEpoch: 9/10...  Loss: 14.6638\nEpoch: 10/10...  Loss: 13.3762\nAccuracy score for train set is 0.9317460317460318 \n\nAccuracy score for test set is 0.7873333333333333 \n\nFitting model with epochs = 20, learning rate = 0.03\n\nEpoch: 1/20...  Loss: 55.3013\nEpoch: 2/20...  Loss: 34.6174\nEpoch: 3/20...  Loss: 28.5719\nEpoch: 4/20...  Loss: 25.2271\nEpoch: 5/20...  Loss: 22.5080\nEpoch: 6/20...  Loss: 20.2876\nEpoch: 7/20...  Loss: 18.0582\nEpoch: 8/20...  Loss: 16.4023\nEpoch: 9/20...  Loss: 15.0036\nEpoch: 10/20...  Loss: 13.4893\nEpoch: 11/20...  Loss: 12.0587\nEpoch: 12/20...  Loss: 10.6883\nEpoch: 13/20...  Loss: 9.7426\nEpoch: 14/20...  Loss: 8.8166\nEpoch: 15/20...  Loss: 7.9992\nEpoch: 16/20...  Loss: 7.1888\nEpoch: 17/20...  Loss: 6.6972\nEpoch: 18/20...  Loss: 5.7407\nEpoch: 19/20...  Loss: 5.6925\nEpoch: 20/20...  Loss: 4.6963\nAccuracy score for train set is 0.9847222222222223 \n\nAccuracy score for test set is 0.7815555555555556 \n\nFitting model with epochs = 30, learning rate = 0.03\n\nEpoch: 1/30...  Loss: 54.9032\nEpoch: 2/30...  Loss: 35.0373\nEpoch: 3/30...  Loss: 29.0490\nEpoch: 4/30...  Loss: 25.5300\nEpoch: 5/30...  Loss: 22.5729\nEpoch: 6/30...  Loss: 20.2887\nEpoch: 7/30...  Loss: 18.1197\nEpoch: 8/30...  Loss: 16.1841\nEpoch: 9/30...  Loss: 14.4506\nEpoch: 10/30...  Loss: 13.0459\nEpoch: 11/30...  Loss: 11.7427\nEpoch: 12/30...  Loss: 10.4996\nEpoch: 13/30...  Loss: 9.1441\nEpoch: 14/30...  Loss: 8.3924\nEpoch: 15/30...  Loss: 7.6874\nEpoch: 16/30...  Loss: 6.9694\nEpoch: 17/30...  Loss: 6.3246\nEpoch: 18/30...  Loss: 5.4574\nEpoch: 19/30...  Loss: 4.8619\nEpoch: 20/30...  Loss: 4.6265\nEpoch: 21/30...  Loss: 4.2870\nEpoch: 22/30...  Loss: 3.8865\nEpoch: 23/30...  Loss: 3.2041\nEpoch: 24/30...  Loss: 2.7389\nEpoch: 25/30...  Loss: 2.8792\nEpoch: 26/30...  Loss: 2.5303\nEpoch: 27/30...  Loss: 2.2905\nEpoch: 28/30...  Loss: 2.2037\nEpoch: 29/30...  Loss: 2.0194\nEpoch: 30/30...  Loss: 1.9561\nAccuracy score for train set is 0.9931746031746032 \n\nAccuracy score for test set is 0.7787777777777778 \n\nFitting model with epochs = 40, learning rate = 0.03\n\nEpoch: 1/40...  Loss: 57.2296\nEpoch: 2/40...  Loss: 35.2636\nEpoch: 3/40...  Loss: 28.9804\nEpoch: 4/40...  Loss: 25.4508\nEpoch: 5/40...  Loss: 22.4699\nEpoch: 6/40...  Loss: 20.3306\nEpoch: 7/40...  Loss: 18.4175\nEpoch: 8/40...  Loss: 16.3406\nEpoch: 9/40...  Loss: 15.0061\nEpoch: 10/40...  Loss: 13.4860\nEpoch: 11/40...  Loss: 11.8453\nEpoch: 12/40...  Loss: 10.7777\nEpoch: 13/40...  Loss: 9.8590\nEpoch: 14/40...  Loss: 8.6935\nEpoch: 15/40...  Loss: 7.9577\nEpoch: 16/40...  Loss: 6.9825\nEpoch: 17/40...  Loss: 6.3283\nEpoch: 18/40...  Loss: 6.0978\nEpoch: 19/40...  Loss: 5.4854\nEpoch: 20/40...  Loss: 4.7939\nEpoch: 21/40...  Loss: 4.2796\nEpoch: 22/40...  Loss: 3.8792\nEpoch: 23/40...  Loss: 3.5198\nEpoch: 24/40...  Loss: 3.1778\nEpoch: 25/40...  Loss: 2.9374\nEpoch: 26/40...  Loss: 2.9690\nEpoch: 27/40...  Loss: 2.6827\nEpoch: 28/40...  Loss: 2.3475\nEpoch: 29/40...  Loss: 2.1859\nEpoch: 30/40...  Loss: 2.1580\nEpoch: 31/40...  Loss: 2.2814\nEpoch: 32/40...  Loss: 2.1361\nEpoch: 33/40...  Loss: 1.9275\nEpoch: 34/40...  Loss: 1.6423\nEpoch: 35/40...  Loss: 1.3466\nEpoch: 36/40...  Loss: 1.5826\nEpoch: 37/40...  Loss: 1.7644\nEpoch: 38/40...  Loss: 1.6019\nEpoch: 39/40...  Loss: 1.4285\nEpoch: 40/40...  Loss: 1.1573\nAccuracy score for train set is 0.998531746031746 \n\nAccuracy score for test set is 0.7863333333333333 \n\nFitting model with epochs = 50, learning rate = 0.03\n\nEpoch: 1/50...  Loss: 56.4840\nEpoch: 2/50...  Loss: 34.6913\nEpoch: 3/50...  Loss: 28.9037\nEpoch: 4/50...  Loss: 25.5047\nEpoch: 5/50...  Loss: 23.0237\nEpoch: 6/50...  Loss: 20.7671\nEpoch: 7/50...  Loss: 18.3894\nEpoch: 8/50...  Loss: 16.7072\nEpoch: 9/50...  Loss: 15.0449\nEpoch: 10/50...  Loss: 13.4411\nEpoch: 11/50...  Loss: 12.3500\nEpoch: 12/50...  Loss: 11.1051\nEpoch: 13/50...  Loss: 9.8283\nEpoch: 14/50...  Loss: 9.0717\nEpoch: 15/50...  Loss: 8.0207\nEpoch: 16/50...  Loss: 7.1166\nEpoch: 17/50...  Loss: 6.3416\nEpoch: 18/50...  Loss: 5.9101\nEpoch: 19/50...  Loss: 5.6232\nEpoch: 20/50...  Loss: 5.0599\nEpoch: 21/50...  Loss: 4.4515\nEpoch: 22/50...  Loss: 4.0591\nEpoch: 23/50...  Loss: 3.7318\nEpoch: 24/50...  Loss: 3.1240\nEpoch: 25/50...  Loss: 2.7715\nEpoch: 26/50...  Loss: 2.8569\nEpoch: 27/50...  Loss: 3.0254\nEpoch: 28/50...  Loss: 2.5992\nEpoch: 29/50...  Loss: 2.1808\nEpoch: 30/50...  Loss: 2.0505\nEpoch: 31/50...  Loss: 2.0148\nEpoch: 32/50...  Loss: 1.9077\nEpoch: 33/50...  Loss: 1.6858\nEpoch: 34/50...  Loss: 1.5426\nEpoch: 35/50...  Loss: 1.2371\nEpoch: 36/50...  Loss: 1.3867\nEpoch: 37/50...  Loss: 1.2515\nEpoch: 38/50...  Loss: 1.3423\nEpoch: 39/50...  Loss: 1.2541\nEpoch: 40/50...  Loss: 1.5962\nEpoch: 41/50...  Loss: 1.6899\nEpoch: 42/50...  Loss: 1.3928\nEpoch: 43/50...  Loss: 0.9499\nEpoch: 44/50...  Loss: 1.1275\nEpoch: 45/50...  Loss: 0.6816\nEpoch: 46/50...  Loss: 0.9853\nEpoch: 47/50...  Loss: 0.6413\nEpoch: 48/50...  Loss: 0.5374\nEpoch: 49/50...  Loss: 0.4575\nEpoch: 50/50...  Loss: 0.7540\nAccuracy score for train set is 0.9994047619047619 \n\nAccuracy score for test set is 0.777 \n\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Plot curve\nx = np.arange(10, 10 * (len(train_acc) + 1), 10)\nplt.plot(x, train_acc)\nplt.plot(x, test_acc)\nplt.legend(['train', 'test'], loc='upper left')\nplt.title('Accuracy, learning_rate = ' + str(learning_rate), fontsize=14)\nplt.xlabel('Number of epochs', fontsize=11)\nplt.ylabel('Accuracy', fontsize=11)\nplt.show()","execution_count":21,"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 432x288 with 1 Axes>","image/png":"iVBORw0KGgoAAAANSUhEUgAAAYsAAAEXCAYAAABcRGizAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3Xl8VdW5//HPk4EESJApQQEVrNYJ5zhVbR1+VlDrcLXWOlStveqt9rbW9qp1ttert7XzrXOpQ6vWDiq1WKdCbSsO4AgIgjgQUEYhjIEkz++PtQ7ZnAznBDg5J8n3/XrtV/a8n7OTrGfvtfZZ29wdERGR9hTlOwARESl8ShYiIpKRkoWIiGSkZCEiIhkpWYiISEZKFiIikpGShXRbZna9mU3NdxwpZnavmT2R7zhENoWSRRdnZvuaWaOZ/SvfsUhG3wTOyncQ2Si0xGZmXzez98xsrZlNMbPDstjmc3HdtWY2x8wuSlt+sZm9aWZ1cZhkZsfl7lN0bUoWXd/XgNuAUWa2a76DMbNe+Y6hM5lZkZkVZ7Ouuy9392W5jqk9XfH3Y2ZfAn4G/A+wD/AC8KSZbdfONiOB8XHdfYCbgV+Y2SmJ1WqBy4F9gRrgb8BjZrZnLj5Hl+fuGrroAPQGlgF7AL8Cbm1lnaHAb4ElwGrgdeCIxPJjgZeANXGdPwPlcdn7wHfS9jcR+L/E9PvA9cDYGMvv4/xbgJlxv+8DP0jtN9OxgWuBqa18ln8BP+/A+bk+fT/AecB0YC3wDnApUJRY/m3gTWAVMA+4B+ifWH4usDLGPhVoAEYB9wJPEO4e5gGfAL8G+iS2vRd4Iu1c3kYoBBcDC4Fb0+IZAoyL5+iDGP9U4Posz4EDFwN/ip/pVqA4/r28F/c7C/iv1HHjefO04fC4bBjwcPx8nwB/AXbK8d/5S8DdafNmATe3s83/ArPS5t0DTMpwrKXAhfn+3y7EQXcWXdupwAfu/hbwAPAVMytNLTSzvsDfgRHASYSkcmNi+WhCQfQMsB9wRFy/o38X3wZmEK7OvhfnrQK+CuwKfB04Hbgqy2OPBXYxswMS6+8MfIZQyG0SM/t3QsF8bYzrMsKV5dcTqzUB3wJ2B84ADgB+kbarcuAa4EJgN0IhDnAYIXH8P+BLwMmE5NGeMwkJ5zPAJfHYX0osvw/YHjgSOJFQjbV9Fh836TrCVfYewC8J53gecBrhPFxF+L2dF9e/FXgEeBbYJg4vmFkfYAIh0X4OOBj4CHg2LmuVmT1pZivbG9rZthfh7+PptEVPE85ZWw5uZZungJrk/0jiOMVmdjpQQbgbkXT5zlYaNn0gXJl+J44b4Qr+1MTyfwdWAIPb2P5fwMPt7P99sruz+HMWsV4EzO7AsZ8A7khM/y8wuYPn53oSdxbAh8DZaet8C5jezj5GA/U0X3WfS7jS3i9tvXuBuUBxYt7dwLNp66TfWUxK288zwD1xfOd4rIMSy7cFGunYncUvsljvlvZijfO+Sriit8S8YsJd4Wnt7HsYsGN7QzvbDo2f4bNp868FZraz3TvAtWnzPhv3tU1i3h6EO8UGwp3xcR35G+tJQwnSJZnZjsChhKtf3N3N7LfA+cAf4mr7AG+6++I2drMPoVDYXJNbie9UQkG8I+FqrTgO2R77buA+M7sUWAecDXx/UwM0sypCQXunmd2eWFRCSLSp9Y4EriRccW8VY+4FbA3Mj6s1EKrz0k1398bE9HzgwAyhvZk2PR+ojuO7EO50Npxfd59rZvPpmNZ+PxcR2ru2J1RnltJ8h9SW/YCRwAozS87vA3yqrY3cfV4H4+1MM4G9Cb/rUwl/c4e7e8E8RVcolCy6rq8RCrIPE/+4BmBm27r73C1wjCYSBWnU4haeUOW0gZkdRKjXvoHQJrAMOIFQvZGtvxDaWE4BlgP9gQc7sH26VNXaRbRRzWBm28fj3k24cl1CaPx8iJAwUurTkkLK+rRpJ3OV3qZs01Hpv58vAT8FvkM4F3WEdo2TM+yniJAkT29l2dK2NjKzJwlVdG1y94o2Fi0m3EkNSZs/BPi4nV1+3MY2DXGfqeOuA2bHySlmtj/hb/b89uLtiZQsuiAzKwHOIVwBpz/e+ACh7vlG4DXgbDMb3MbdxWvAUYTCsTWLCPXVqeOWE652X8sQ4iHAPHffcCcQC+Ksj+3uDWZ2L6HqYznwJ3dfnuG4bXL3BfGK/FPufn8bq9UQksKlqWRgZsdv6jG3gBmEAno/QiMvZjacUDWzOQ4FXnL3/0vNMLP0O4N1bHwnCPAq8GVgsXfsqa6vEe5eOszd15nZFOBo4PeJRUcDf2xn00m0TH5HE6oy0xN0UhFQtimxdndKFl3TccBgwhMiS5ILzOxh4CIz+z7hSvwK4HEzu4LQqDkKWOHuE4CbgD+b2ey4rgGfB+5099WERwm/ambjCInjKrL7m3kHGGZmZxL+aY8hFDJJmY4N4emVywl3OJ/P6sy07zrC45PLCA2+pYQ7h2HufjOhPr4I+JaZ/Qk4iFCVlhfuPtPMngLuMLP/IDQs/5Bwx7U5L6J5BzjXzMYQrqpPJzRYf5JY531gTHywYAkhYf+WcDfyuJldS2gD2pbQ8H6Hu89q43NsbjXUj4EHzOxlQlvXRYSEeUdqBTO7Px7rK3HWHcAlZvZT4E7CBcy5JP4OzewWwp3kXKCSUKV7OOH/S9Loaaiu6XxgQnqiiH5PePrpaHdfRSgEagmPpU4lVA2Flk/38YSrrzGEK/2/E55Kaor7upmQMB4nPFnyTzLfVeDufyYUaj8l1MkfTajWSa6T6di4+5w4/0NCY/AGZna4mbmZHZ4pnsT+7iHcqZwNvAH8A7iA8Agp7v4m4emlbxMer/0aoXDMp3MJv7+JhKfHfkt4xHbtZuzzTsLTTg8CrxD+Xn6Uts7dwNuE9o5FwCExiX8WmEP4O5tBeFprABsnmi3K3X9HSNpXE6rBDgWOdfdkG8t2cUht8x7h8ebPxm2uAv7T3ZN3I1sDvyG0WzwH7A+Mcfcnc/VZujKLTwSIFCQzmw781t1vSpt/HuEJnp07WCXSpZnZYEIj+JfTCj6RnFI1lBSk+PTSqYSr3jtbWeVY4PLuniji01mVwFuEp6RuIjTQ/jWfcUnPo2QhhWohoVC8sLXGeXf/YueHlBelwH8DOxDaKl4kfOdgVWwTai2RQviy5u6dFKP0AKqGEumizKySlo+HpqxPq9MX2SxKFiIiklG3qYYaPHiwjxgxIt9hiIh0KVOmTFns7lWZ1us2yWLEiBFMntyiVwMREWmHmWVVXanvWYiISEZKFiIikpGShYiIZNRt2ixas379empra1m7dnN6RugaysvLGT58OKWlrXUKKyKyebp1sqitraWyspIRI0aQ1v9+t+LuLFmyhNraWkaOHJnvcESkG8pZNZSZjTWzhWbW6ktELPi5mc02szfNbN/EsnPMbFYcztnUGNauXcugQYO6daIAMDMGDRrUI+6gRCQ/ctlmcS/hlZRtGQPsFIcLgNsBzGwgoSvpAwnvP77OzAZsahDdPVGk9JTPKSL5kbNqKHd/3sxGtLPKicD9Hr5C/qKZ9TezbQj9yT/j7ksBzOwZQtJ5KFexikjP5O40NjmN7rhDY5PT5E5TEzR6atxp8jgdl29YL9M2G9bzFuuFYyfHwzZNMZ7UfjbM37AfmpfFGLbuV84ZB26X+QNvhny2WQwjvHQkpTbOa2t+C2Z2AeGuhO22y+2J2lTLli3jwQcf5Otf/3qHtjv22GN58MEH6d+/f44iE+k86xubqFuznrq1DfHneurWNMSfLafrG5paFMjuoXBsbCJRuKYX2M0F6MYFOxvGPRb8jU3dp6ujfbbr362TxWZz97uAuwBqamoK8je/bNkybrvtthbJoqGhgZKStk//+PHjcx2aSNbWNzaxIsuCfnkrSWHN+tZeWd6suMjoV15Cv96lVJaX0Lu0GDOjpKiIoiIoMqO4yCgyi+NhXlGcV2wkxi2LbYjr2Yb1LM4L42GfG8bjNhvts9X9kDheK/tsZT+tblMUPkdqm2IzrCgeK36+5vHOqYLOZ7KYR3glY8rwOG8eoSoqOX9ip0W1hV1xxRW8++677L333pSWllJeXs6AAQOYMWMG77zzDieddBJz585l7dq1fPOb3+SCCy4AmrsvWblyJWPGjOHQQw/lhRdeYNiwYTz++OP07r1JrzSWHqojhX1rV/+r12Vf2PcrL6Vf7xKqKys2jIefaeOJZX16FavdrcDlM1mMI7wj92FCY/Zyd/8ovnP4fxKN2p8Hrtzcg93w52lMn1+3ubvZyG5D+3HdF9p/ZcAtt9zC1KlTef3115k4cSLHHXccU6dO3fCI69ixYxk4cCBr1qxh//3355RTTmHQoEEb7WPWrFk89NBD3H333Zx22mn88Y9/5Kyzztqin0UKW0OqsG+loF++JjeF/adU2EtCzpKFmT1EuEMYbGa1hCecSgHc/Q5gPOFtZ7MJL3U5Ly5bambfJ7wbGODGVGN3d3DAAQds9F2In//85zz66KMAzJ07l1mzZrVIFiNHjmTvvfcGYL/99uP999/vtHhly2ivsM9U0NetWc+qDIV9kdGiAN9hcEVa4Z5MBqVs1VuFvWQvl09DfTnDcgcubmPZWGDslown0x1AZ+nbt++G8YkTJ/Lss88yadIk+vTpw+GHH97qdyXKyso2jBcXF7NmzZpOiVUyW1nfwMK6tSyoq2fhirUsWlHPgrq1LFxRz8I4b+GKelasbWh3P60V9iMH9223sE8u66vCXnKsSzdwdwWVlZWsWLGi1WXLly9nwIAB9OnThxkzZvDiiy92cnTSGnenbk3DhoJ+4YqYDBKF/8KYEFqr3ikvLaK6spzqyjJ22bofh+1UxsC+vVTYS5emZJFjgwYN4pBDDmHUqFH07t2bIUOa34I5evRo7rjjDnbddVd23nlnDjrooDxG2v25O5+sXh8K/LrmO4BFyYQQl9U3NLXYvm+vYqr7lVNVWcYew/tTXVlGdWUZQ/qFxFDdr4yqynL6lZeo4Jdup9u8VrWmpsbTX3709ttvs+uuu+Ypos7X0z5vSlOTs2TVug0FffPPlglhfWPLv/fK8pK0Qj/tZxyvKNO1lXQ/ZjbF3Wsyrae/filYDY1NLF65ro3Cf+2G6cUr17X6Bav+fUoZUllOdb8ydqjqS3VlOUP6lYUqon4xCVSW07tXcR4+nUjXomQhnW5dQxOLVjbX+y9MaxBeEBPDklX1tHbjO6hvrw1X/TsPqQx3BLHwr4oJoaqyjLISJQGRLUXJQraYtesbN67/TyWBeAewKI4vXbWuxbZFBoMrQr3/1luVs+fwrTaqBkolhMEVZZQW651dIp1NyUI6pKGxiXFvzGfmghUbtQ8sqFtLXSuPh5YUGVWxwB8+oA/7bT9go2qgVDvBoIoyijup2wIR6TglC8naG3OXcdVjbzF1Xh29iotCEuhXxqeqKjj4U4M2tAFUJ9oFBvbp1Wl914hI7ihZSEZ1a9fzo6dmcv+LH1BVUcYvz9iXY/fYWo+HivQgqvzNsVSvs5vipz/9KatXr97CEWXP3fnzG/M56kd/5/4XP+Ccg0fw3GWf47g9t1GiEOlhlCxyrKsmiw+WrOKcX7/CNx56jSH9ynj84kO4/oTdqSwvzUs8IpJfqobKsWQX5UcffTTV1dU88sgj1NfXc/LJJ3PDDTewatUqTjvtNGpra2lsbOSaa65hwYIFzJ8/nyOOOILBgwczYcKETom3vqGRu5+fwy/+NpvS4iKu/8JunH3wCDU+i/RwPSdZPHkFfPzWlt3n1nvAmFvaXSXZRfnTTz/NH/7wB15++WXcnRNOOIHnn3+eRYsWMXToUP7yl78Aoc+orbbaih//+MdMmDCBwYMHb9m42/DinCVc9ehbvLtoFcftsQ3XHL8bW29V3inHFpHC1nOSRQF4+umnefrpp9lnn30AWLlyJbNmzeKwww7jsssu4/LLL+f444/nsMMO69S4lqys53/Gz+CPr9ay7cDe/Prc/Tlil+pOjUFEClvPSRYZ7gA6g7tz5ZVXcuGFF7ZY9uqrrzJ+/HiuvvpqjjrqKK699tqcx9PU5Px+ylxufnIGq+obuPiIT3HJETup+wsRaaHnJIs8SXZRfswxx3DNNddw5plnUlFRwbx58ygtLaWhoYGBAwdy1lln0b9/f+65556Nts1FNdTMj1dw9WNv8cr7n3DAiIHcdPIodhpSucWPIyLdg5JFjiW7KB8zZgxnnHEGBx98MAAVFRX85je/Yfbs2Xz3u9+lqKiI0tJSbr/9dgAuuOACRo8ezdChQ7dYA/fqdQ38/LnZ3POPOVSWl/CDU/fki/sN16OwItIudVHejWT6vH+bsYBrHpvGvGVrOK1mOFeM2ZWBfXt1YoQiUmjURbls8NHyNdwwbjp/nfYxO1VX8LsLDuLAHQZl3lBEJFKy6MYaGpu4b9IH/PjpmTQ0Od89Zmf+/bAd6FWi72KKSMd0+2Th7j2iPj69OvH1ucu46tG3mDa/jsN3ruLGE0ax3aA+eYpORLq6bp0sysvLWbJkCYMGDerWCcPdWbJkCeXl5dStXc+tT83kgRc/oLqyjNvO3Jcxo9Tpn4hsnm6dLIYPH05tbS2LFi3Kdyg5V15ezrTlJdzw4N9ZsrKecw4ewWWf/7T6chKRLaJbJ4vS0lJGjhyZ7zBy7v3Fq7jm8an8Y9Zi9hy+FWPP2Z89hm+V77BEpBvp1smiu6tvaOSuv8/hFxNm06u4iBtO2J2zDtpenf6JyBanZNFFvfDuYq5+bCpzFq3iuD234drjd2NIP3X6JyK5oWTRxSxZWc9N49/mT6/OY7uBfbj3vP05fGd1+iciuaVk0UU0NTmPTA6d/q1e18AlR+zIJUfuSHmpOv0TkdxTsugCZnxcx1WPTmXKB59w4MjQ6d+O1er0T0Q6j5JFAVu9roGfPTeLX/3jPSrLS7j1i3txyr7D9J0JEel0ShYF6rm3F3Dt46HTvy/VbMsVY3ZhgDr9E5E8UbIoMB8tX8P146bx1LQFfHpIBb+/6GD2HzEw32GJSA+nZFEgGhqbuPeF9/nJM+/Q6M7lo3fh/ENHqtM/ESkIShYF4PW5y/jen95i+kd1HLFzFTeeOIptB6rTPxEpHEoWebR8zXp++NQMfvvSh1RXlnH7mfsyWp3+iUgBymmyMLPRwM+AYuAed78lbfn2wFigClgKnOXutXFZI/BWXPVDdz8hl7F2Jndn3Bvz+f4Tb7N0VT3nfmYEl31+ZyrKlLtFpDDlrHQys2Lgl8DRQC3wipmNc/fpidVuBe539/vM7EjgZuDsuGyNu++dq/jyJb3Tv3vP259Rw9Tpn4gUtlxeyh4AzHb3OQBm9jBwIpBMFrsB347jE4DHchhPXtU3NHLHxDn8cuJsyoqLuPHE3TnzQHX6JyJdQy6TxTBgbmK6FjgwbZ03gH8jVFWdDFSa2SB3XwKUm9lkoAG4xd1bJBIzuwC4AGC77bbb8p9gC3lhduz0b/EqvrDXUK45bleq1emfiHQh+a4k/w7wf2Z2LvA8MA9ojMu2d/d5ZrYD8Dcze8vd301u7O53AXcB1NTUbPxe0QKweGU9N/3lbR59LXT6d99XD+Bzn67Kd1giIh2Wy2QxD9g2MT08ztvA3ecT7iwwswrgFHdfFpfNiz/nmNlEYB9go2RRqJqanN9NnsstsdO/bxy5IxcfoU7/RKTrymWyeAXYycxGEpLE6cAZyRXMbDCw1N2bgCsJT0ZhZgOA1e5eH9c5BPhBDmPdYt7+qI6rHn2LVz9cxkE7DOS/T9qDHasr8h2WiMhmyVmycPcGM7sEeIrw6OxYd59mZjcCk919HHA4cLOZOaEa6uK4+a7AnWbWBBQR2iymtzhIAVm9roGfPTuLe/75Hlv1LuVHX9yLf1OnfyLSTZh7wVX1b5KamhqfPHlyXo797PQFXDcudPp3+v7bcvlodfonIl2DmU1x95pM6+W7gbtLm78sdPr39PQF7Dykkj9cdDA16vRPRLohJYtNkOr078fPvEOTO1eMCZ3+lRar0z8R6Z6ULDrotQ8/4XuPTuXtj+o4cpdqbjhhd3X6JyLdnpJFlpavXs8PnprBgy9/yJDKcu44az+O2X2IGrBFpEdQssigudO/6SxdtY6vHjKSS4/+tDr9E5EeRSVeO95bvIprHpvKP2cvZq9t+3PveQeo0z8R6ZGULFpR39DI7RPf5baJ71JWUsT3TxrFGQdsp07/RKTHUrJI86/Zi7kmdvp3wl5Dufr4XamuVKd/ItKzKVlEi1bUc9NfpvPY6/PZflAf7v/qAXxWnf6JiABKFjQ1OQ+98iH/++QM1qxv5D+P3JGvq9M/EZGN9Phk8cHS1Vz3+DT2HzGQ7580Sp3+iYi0oscni5GD+/L4JYew2zb99J0JEZE29PhkAbD7UD0OKyLSHnVmJCIiGSlZiIhIRkoWIiKSkZKFiIhkpGQhIiIZKVmIiEhGShYiIpKRkoWIiGSkZCEiIhkpWYiISEZKFiIikpGShYiIZKRkISIiGWVMFmY2vDMCERGRwpXNncXLZvZHMzsy59GIiEhByiZZjAAeA24ys+lmdrGZVeY2LBERKSQZk4W7r3P3B9z9YOBrwOXAPDP7hZlV5zxCERHJu6wauM1sezO7GXgIeBYYDSwAnsphbCIiUiAyvlbVzJ4AdgfuBPZ19yVx0QtmdnougxMRkcKQzTu47wUedffG9AXuPmqLRyQiIgUnm2qoZUBFasLM+uvJKBGRniWbZPFDoC4xXQfcmptwRESkEGWTLMzdPTXh7k1AcTY7N7PRZjbTzGab2RWtLN/ezJ4zszfNbGLyC4Bmdo6ZzYrDOdkcT0REciObZLHCzA5MTcTxVZk2MrNi4JfAGGA34MtmtlvaarcC97v7nsCNwM1x24HAdcCBwAHAdWY2IItYRUQkB7Jp4P4v4DEzmxandwP+LYvtDgBmu/scADN7GDgRmJ5YZzfg23F8AuHLfwDHAM+4+9K47TOEx3UfyuK4IiKyhWVMFu4+Kd4RHBxnTXL3T7LY9zBgbmK6lnCnkPQGIfH8DDgZqDSzQW1sOyyLY4qISA5k9aU8d//E3cfHIZtEka3vAJ8zs9eAzwHzgBaP6LbFzC4ws8lmNnnRokVbMCwREUnKptfZPc1skpmtNrPG1JDFvucB2yamh8d5G7j7fHf/N3ffB7gqzluWzbZx3bvcvcbda6qqqrIISURENkU2dxa3A1cDswiF9s3A97LY7hVgJzMbaWa9gNOBcckVzGywmaViuBIYG8efAj5vZgNiw/bnUdciIiJ5k02yKHf354Aid//I3a8GTs20kbs3AJcQCvm3gUfcfZqZ3WhmJ8TVDgdmmtk7wBDgprjtUuD7hITzCnBjqrFbREQ6XzZPQ6WqnJaa2V6ExubB2ezc3ccD49PmXZsY/wPwhza2HUvznYaIiORRNsni4fiE0s3APwlfyLu2/U1ERKQ7aTdZxPaEZ2NPs3+NX5Yrd/cVnRKdiIgUhHbbLGLXHr9JTK9XohAR6XmyaeCebWYjchyHiIgUsGzaLCqBN83sn8DK1Ex3Py1nUYmISEHJJln8hkRVlIiI9DzZ9A11X2cEIiIihSubd3D/HvD0+aqGEhHpObKphnoiMV5O+Pb29DbWFRGRbqjD1VBm9mvg6ZxFJCIiBSerLsrTOHq3hIhIj9LRNosiYE/gmVwGJSIihaWjbRYNwA/d/aUcxSMiIgVIj86KiEhG2bwp75/xBUSp6YFm9nxuwxIRkUKSTQN3RfK92/ElRJW5C0lERApNNsmiyMz6pCbMrAIozV1IIiJSaLJp4H4IeMbMbo/T/4H6ihIR6VGyaeC+2czmA6n3Zt/p7vfnNiwRESkk2dxZpJ6I0lNRIiI9VDZPQ/0xvk41NT3IzB7JbVgiIlJIsmng3iE+AQVAfB/3jrkLSURECk02yaLEzIpTE2ZWCpTlLiQRESk02SSLvwK/M7NDzexQ4GHgydyGJSIihSSbBu7vxeHHhA4FnwAm5jAmEREpMBnvLNx9vbvfAJwEPA6cDYzNdWAiIlI42r2zMLMS4ETgq8BBcf1j3P3FTohNREQKRJt3Fmb2E6AWuBD4LTAcWKpEISLS87R3Z3EhMAm42d0nAJiZt7O+iIh0U+0li6HAGcAP45fy7s+wvoiIdFNtVkO5+zJ3v83dawiN2/2BcjN73swu7LQIRUQk77L5ngXu/qa7fwsYBvyC0OgtIiI9RFbJIiU+Rvt7dz82VwGJiEjh6VCyEBGRnknJQkREMlKyEBGRjHKaLMxstJnNNLPZZnZFK8u3M7MJZvaamb1pZsfG+SPMbI2ZvR6HO3IZp4iItC9n35uI3Zr/Ejia8E3wV8xsnLtPT6x2NfCIu99uZrsB44ERcdm77r53ruITEZHs5fLO4gBgtrvPcfd1hK7N0x+5daBfHN8KmJ/DeEREZBPlMlkMA+YmpmvjvKTrgbPMrJZwV/GNxLKRsXrq72Z2WGsHMLMLzGyymU1etGjRFgxdRESS8t3A/WXgXncfDhwLPGBmRcBHwHbuvg/wbeBBM+uXvrG73+XuNe5eU1VV1amBi4j0JLlMFvOAbRPTw+O8pPOBRwDcfRJQDgx29/r4rm/cfQrwLvDpHMYqIiLtyGWyeAXYycxGmlkv4HRgXNo6HwJHAZjZroRkscjMqlLv/TazHYCdgDk5jFVERNqRs6eh3L3BzC4BngKKgbHuPs3MbgQmu/s44DLgbjO7lNDYfa67u5l9FrjRzNYDTcBF7r40V7GKiEj7zL17vKKipqbGJ0+enO8wRES6FDObEnsXb1e+G7hFRKQLULIQEZGMlCxERCQjJQsREclIyUJERDJSshARkYyULEREJCMlCxERyUjJQkREMlKyEBGRjJQsREQkIyULERHJSMlCREQyUrIQEZGMlCxERCQjJQsREclIyUJERDJSshARkYyULEREJCMlCxERyUjJQkREMlKyEBGRjJQsREQkIyULERHJSMlCREQyUrIQEZGMlCxERCQjJQsREclIyUJERDJSshARkYyULEREJCMlCxERyUjJQkREMlKyEBGRjJQsREQko5wmCzOLOUyJAAAN20lEQVQbbWYzzWy2mV3RyvLtzGyCmb1mZm+a2bGJZVfG7Waa2TG5jFNERNpXkqsdm1kx8EvgaKAWeMXMxrn79MRqVwOPuPvtZrYbMB4YEcdPB3YHhgLPmtmn3b0xV/GKiEjbcnlncQAw293nuPs64GHgxLR1HOgXx7cC5sfxE4GH3b3e3d8DZsf9iYhIHuQyWQwD5iama+O8pOuBs8yslnBX8Y0ObIuZXWBmk81s8qJFi7ZU3CIikibfDdxfBu519+HAscADZpZ1TO5+l7vXuHtNVVVVzoIUEenpctZmAcwDtk1MD4/zks4HRgO4+yQzKwcGZ7mtiIh0klzeWbwC7GRmI82sF6HBelzaOh8CRwGY2a5AObAorne6mZWZ2UhgJ+DlHMYqIiLtyNmdhbs3mNklwFNAMTDW3aeZ2Y3AZHcfB1wG3G1mlxIau891dwemmdkjwHSgAbhYT0KJiOSPhbK566upqfHJkyfnOwwRkS7FzKa4e02m9fLdwC0iIl2AkoWIiGSkZCEiIhkpWYiISEZKFu6wfk2+oxARKWi5/FJe17DmE/jBSCgph/L+0Lt//DmgjfE4nVy3pFe+P4VI99DYAKuXQHFp+D8zy3dEEilZFJfCUdfCmmWwdllIHmuWQV0tLJgWptetaH8fpX3bSSyJ+enLy7eCYv0KpJtbvwZWLoRVi2HVwji+qHlITq9eSvjKFeECrt9Q6DcMKrdpHu83tHm8bxUUqYKkM6ikKquEwy5rf53GBli7PCSOtctaJpb08aXvNa+7fnWG4/eLSWSrlncs7d3dlG2lfxLJD/fwt71qcSzoFybGW0kC61a2vp+yfqGw71sFg3eC7T8Dfauh72BoaoC6eVA3PwxzX4S6j6Bp/cb7KCqByqGJBJJKKNs0J5aKrXVRtgXoDGajuAT6DgpDRzXUNyeaVpPMso2T0KKZzeON9e3s2MKdyaZUm5VV6vZeNpaq/lkVC/iVi9LG43RqPL3QBsBCQZ9KAMP2g4pY+Pet3ni872Ao7d2xGJuaYPXijZPIhmEefPQGzHwSGtLaIK0IKoakJZO0u5TKbaCkbJNPX0+gZJFrJWXhn6SiuuPbrl+TfZJZuwyWz20eb2poe79W3HYyaffupj+U9lGi6Sqyqv6Jy5LVP0nFvWJBXxUK3CF7hIK+orq50K+oDsmhzyAoKs7d5ykqav5fGrpP6+u4h/+LZBKpmw8r4vTiWTDn71Bf13LbPoNbr+pK3q306pu7z1fglCwKWWnvMPQb2rHt3MOtf1uJJT3JrF4CS95tntdaoZFS3Cskjl59oKR3SIYl5eFnaXK6fBPnt7KsuHSzTmO30aL6p5U6/w5X/+wI2x/cnBD6VsUkUBWmy/p1rYsDM+gzMAxbj2p7vbV1sOKjtLuUOL68Fua+BGuWttyuvH+imquNxNLVzlmWlCy6I7NQ1VRWycY9vWehqSlcdbWVWFJ3N+vXQMPajYc1n4Rqt43mx+nN+jzFmRNPSTmUJqd7d3B+WsJKLcvllTJkX/2zanEYb1zX2gnKbfVPd1TeLwxVO7e9zvo1Lau6kuMfvwUrF7TcrldFywRSuc3Gdyl9Bna5hKJkIRsrKmp+imvAFtqneyKJ1Ic65dT0+rWtz2+ojwkpPfmkb7M2XEGvXhy3Sdtfq4VrBxSVZJd4MiWydSu7bvVPT1XaGwZ9KgxtaVgHKz9uPZnUzYc5E2HFx5DeaXZxWTtVXnHoW11QD7EoWUjumYVCtrS884/d1BQeFFi/ZgsmrMT8tcuhYcHGySu1v/RG4O5c/dNTlfSC/tuFoS1NjeECYaOEknzS66VQJZZ+YVNUknhkuI3E0olPeilZSPdWVARFvfNT9dLU2JxESvMUg+RfUXFs49gG2K/1dZqaQnXkinaqvN55quWj+Kknvbb/DJw6NqcfQ8lCJFeKisPTMz34CRrJUlFRrHKsgm32an2d1AMOrT02vClPW3aQkoWISFdgFh9lHwBDdu/0wxdO64mIiBQsJQsREclIyUJERDJSshARkYyULEREJCMlCxERyUjJQkREMlKyEBGRjMy9ne6ouxAzWwR8sBm7GAws3kLhbEmKq2MUV8coro7pjnFt7+5VmVbqNslic5nZZHevyXcc6RRXxyiujlFcHdOT41I1lIiIZKRkISIiGSlZNLsr3wG0QXF1jOLqGMXVMT02LrVZiIhIRrqzEBGRjJQsREQkox6XLMxsrJktNLOpiXkDzewZM5sVfw4okLiuN7N5ZvZ6HI7NQ1zbmtkEM5tuZtPM7Jtxfl7PWTtx5fWcmVm5mb1sZm/EuG6I80ea2UtmNtvMfmdmvQokrnvN7L3E+dq7M+NKxFdsZq+Z2RNxOq/nq524CuV8vW9mb8UYJsd5Of2f7HHJArgXGJ027wrgOXffCXguTne2e2kZF8BP3H3vOIzv5JgAGoDL3H034CDgYjPbjfyfs7bigvyes3rgSHffC9gbGG1mBwH/G+PaEfgEOL9A4gL4buJ8vd7JcaV8E3g7MZ3v85WSHhcUxvkCOCLGkPp+RU7/J3tcsnD354GlabNPBO6L4/cBJ3VqULQZV965+0fu/mocX0H4xxlGns9ZO3HllQcr42RpHBw4EvhDnJ+P89VWXHlnZsOB44B74rSR5/PVWlxdQE7/J3tcsmjDEHf/KI5/DAzJZzBpLjGzN2M1VadXjyWZ2QhgH+AlCuicpcUFeT5nseridWAh8AzwLrDM3RviKrXkIbGlx+XuqfN1UzxfPzGzss6OC/gp8F9AU5weRAGcr1biSsn3+YKQ6J82sylmdkGcl9P/SSWLNB6eJS6IKy7gduBThGqDj4Af5SsQM6sA/gh8y93rksvyec5aiSvv58zdG919b2A4cACwS2fH0Jr0uMxsFHAlIb79gYHA5Z0Zk5kdDyx09ymdedxM2okrr+cr4VB33xcYQ6iC/WxyYS7+J5UsggVmtg1A/Lkwz/EA4O4L4j94E3A3oeDpdGZWSiiQf+vuf4qz837OWourUM5ZjGUZMAE4GOhvZiVx0XBgXgHENTpW57m71wO/pvPP1yHACWb2PvAwofrpZ+T/fLWIy8x+UwDnCwB3nxd/LgQejXHk9H9SySIYB5wTx88BHs9jLBukfvHRycDUttbNYQwG/Ap4291/nFiU13PWVlz5PmdmVmVm/eN4b+BoQnvKBODUuFo+zldrcc1IFC5GqOPu1PPl7le6+3B3HwGcDvzN3c8kz+erjbjOyvf5isfua2aVqXHg8zGO3P5PunuPGoCHCNUT6wl1oecT6kifA2YBzwIDCySuB4C3gDfjH8I2eYjrUMLt7JvA63E4Nt/nrJ248nrOgD2B1+LxpwLXxvk7AC8Ds4HfA2UFEtff4vmaCvwGqOjsv7FEjIcDTxTC+Wonrryfr3hu3ojDNOCqOD+n/5Pq7kNERDJSNZSIiGSkZCEiIhkpWYiISEZKFiIikpGShYiIZKRkIQUt9q451cyK0uaN2oLHGGFmi7fU/jpw3F/HHmB/19nHTsSQl88uXU9J5lVE8q4COJvmTtIKkpkVu3tjlusOAU4B+nv4trlIQdOdhXQF1wPXtfZOg/S7jOR0HP9vM5tkZh+a2Rlm9q34XofZ6f3pmNmPYgdxb5nZYYn5x5rZv2KnbZNSXXub2eFx/V/HDvrGtBLfV+L+3jSzR82sOn77dgLQB3jVzC5tZbudzexJM3vFwjsozkssczO7wcK7DGaa2SmJZaMtvH/hTTN7zsx2TCz7atzXG3G/QxLLborbzTSzQ+O8ajN7Nsb/lpn9pP1fk3Rr+fpWpAYN2QzA+8Aowrd4v5mclz7exrIfxvH9gVXAxXH6NOCfcXwE4dvgX4nThxO+RV9G6JRwEtAvLtsd+DCxXiNwcBuxjwLmE79FDnwf+F3imIvb2K4EmALsEqcrgZmJaaf5G9g7A0uA6jgsAnaLy84HXkrEOhvYOk5XAOWJz358nH8m8K84filwZyKuAfn+e9CQv0HVUNJVXA1MMLNfdXC7VHvAq4Qr+dT0FGDHxHrrCN034O4TzWwNoSA+lJAwng/dAQFQkrgqn+Xuk9o49hHAeG/uNvpOQhcNmXwa2BV4OHHMsjhvRpz+VYx1ppm9SngBlANvuPv0uM6vgdvincxxwP3u/nHcbiVA3P9Kd38ibvMizT31vghcamY/BP4OPJVF7NJNKVlIlxALxfHAt9MWNbBxdWp52vK1cfvGWDCujfMbye7v34C/uvtXWiww2xVY2XKTzWaEu47OemVnfWJ8w3lx90lmtg+h08GzCW9eO7STYpICozYL6UquBy4mVMukzCZUMWFmR7HpL3zpBZwR93MY0JtwFf804RWku6dWNLP9s9znBOBYM9s6Tv874WVImcwEVpvZ2Ylj7mJm/RLrnBfn70R48dOLcdjLzFLvzzgHeM3DmwT/AnwldUdkZhVmlp5YN2JmI4E6d3+YkKT3Sz6VJj2L7iyky3D3WjN7ALgsMfsa4D4z+wahR9APN3H3S4C9zey/CFf2X3b3dcAsMzsL+FXs2rsX8C/glSzinWpmVwDPmJkDc4ALs9iuwcy+APzUzL4LFAMLCO0sKSVm9hqhau1CD+81ICaYBy28C2IRcFbc50Qzuxl41syaCHcTX8gQyuHAt82skXBheZHrya0eS73OinQxMfFUevM7tUVyTreUIiKSke4sREQkI91ZiIhIRkoWIiKSkZKFiIhkpGQhIiIZKVmIiEhG/x8X3GeWVu1iAgAAAABJRU5ErkJggg==\n"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"The plot above shows us that even adding generated data can help to reduce bias and variance."},{"metadata":{},"cell_type":"markdown","source":"I still see huge gap between train and test accuracy scores. It means that we have to implement some regularizations techniques to reduce the variance. In current case it turns out that L2 regularization (weight decay) doesn't work out. But adding dropout to each hidden layer will help a little. I also added Adam optimizer to speed up the calculations."},{"metadata":{"trusted":true,"_kg_hide-output":true},"cell_type":"code","source":"# Fit model\ntrain_acc, test_acc = plot_learning_curve(input_size, output_size, hidden_sizes, train, labels, y_train, test, y_test, learning_rate = learning_rate, dropout = 0.2, weight_decay = weight_decay, n_chunks = 400, \\\n                                          optimizer = 'Adam')","execution_count":22,"outputs":[{"output_type":"stream","text":"Fitting model with epochs = 10, learning rate = 0.03\n\nEpoch: 1/10...  Loss: 58.4843\nEpoch: 2/10...  Loss: 38.3502\nEpoch: 3/10...  Loss: 32.7945\nEpoch: 4/10...  Loss: 29.1901\nEpoch: 5/10...  Loss: 26.7329\nEpoch: 6/10...  Loss: 24.9017\nEpoch: 7/10...  Loss: 22.8454\nEpoch: 8/10...  Loss: 21.4652\nEpoch: 9/10...  Loss: 19.8019\nEpoch: 10/10...  Loss: 18.3294\nAccuracy score for train set is 0.8884126984126984 \n\nAccuracy score for test set is 0.7767777777777778 \n\nFitting model with epochs = 20, learning rate = 0.03\n\nEpoch: 1/20...  Loss: 58.1969\nEpoch: 2/20...  Loss: 38.6106\nEpoch: 3/20...  Loss: 32.8852\nEpoch: 4/20...  Loss: 29.7066\nEpoch: 5/20...  Loss: 27.1662\nEpoch: 6/20...  Loss: 25.1468\nEpoch: 7/20...  Loss: 23.2873\nEpoch: 8/20...  Loss: 21.4434\nEpoch: 9/20...  Loss: 20.5872\nEpoch: 10/20...  Loss: 18.7321\nEpoch: 11/20...  Loss: 17.6253\nEpoch: 12/20...  Loss: 16.4780\nEpoch: 13/20...  Loss: 15.1763\nEpoch: 14/20...  Loss: 14.2951\nEpoch: 15/20...  Loss: 13.2435\nEpoch: 16/20...  Loss: 12.4960\nEpoch: 17/20...  Loss: 11.9754\nEpoch: 18/20...  Loss: 10.9650\nEpoch: 19/20...  Loss: 10.2456\nEpoch: 20/20...  Loss: 9.7227\nAccuracy score for train set is 0.9399603174603175 \n\nAccuracy score for test set is 0.7703333333333333 \n\nFitting model with epochs = 30, learning rate = 0.03\n\nEpoch: 1/30...  Loss: 58.5948\nEpoch: 2/30...  Loss: 38.6526\nEpoch: 3/30...  Loss: 33.1787\nEpoch: 4/30...  Loss: 29.8738\nEpoch: 5/30...  Loss: 27.2636\nEpoch: 6/30...  Loss: 25.1088\nEpoch: 7/30...  Loss: 23.1984\nEpoch: 8/30...  Loss: 21.7359\nEpoch: 9/30...  Loss: 20.3179\nEpoch: 10/30...  Loss: 18.8553\nEpoch: 11/30...  Loss: 17.5097\nEpoch: 12/30...  Loss: 16.7108\nEpoch: 13/30...  Loss: 15.5530\nEpoch: 14/30...  Loss: 14.5778\nEpoch: 15/30...  Loss: 13.5962\nEpoch: 16/30...  Loss: 12.8540\nEpoch: 17/30...  Loss: 11.8884\nEpoch: 18/30...  Loss: 11.3864\nEpoch: 19/30...  Loss: 10.6062\nEpoch: 20/30...  Loss: 10.1327\nEpoch: 21/30...  Loss: 9.8966\nEpoch: 22/30...  Loss: 8.9411\nEpoch: 23/30...  Loss: 8.5437\nEpoch: 24/30...  Loss: 7.9477\nEpoch: 25/30...  Loss: 7.6251\nEpoch: 26/30...  Loss: 7.2315\nEpoch: 27/30...  Loss: 6.9606\nEpoch: 28/30...  Loss: 6.3899\nEpoch: 29/30...  Loss: 6.4334\nEpoch: 30/30...  Loss: 5.7630\nAccuracy score for train set is 0.9704365079365079 \n\nAccuracy score for test set is 0.7773333333333333 \n\nFitting model with epochs = 40, learning rate = 0.03\n\nEpoch: 1/40...  Loss: 59.0110\nEpoch: 2/40...  Loss: 38.4839\nEpoch: 3/40...  Loss: 32.4399\nEpoch: 4/40...  Loss: 29.1573\nEpoch: 5/40...  Loss: 26.7151\nEpoch: 6/40...  Loss: 24.5739\nEpoch: 7/40...  Loss: 22.7829\nEpoch: 8/40...  Loss: 21.3418\nEpoch: 9/40...  Loss: 19.7669\nEpoch: 10/40...  Loss: 18.3458\nEpoch: 11/40...  Loss: 17.1324\nEpoch: 12/40...  Loss: 15.8473\nEpoch: 13/40...  Loss: 14.8474\nEpoch: 14/40...  Loss: 13.7124\nEpoch: 15/40...  Loss: 12.8231\nEpoch: 16/40...  Loss: 11.9905\nEpoch: 17/40...  Loss: 10.8125\nEpoch: 18/40...  Loss: 10.4893\nEpoch: 19/40...  Loss: 9.9428\nEpoch: 20/40...  Loss: 9.3347\nEpoch: 21/40...  Loss: 8.6922\nEpoch: 22/40...  Loss: 8.2177\nEpoch: 23/40...  Loss: 7.6948\nEpoch: 24/40...  Loss: 7.0932\nEpoch: 25/40...  Loss: 6.7282\nEpoch: 26/40...  Loss: 6.6896\nEpoch: 27/40...  Loss: 6.3109\nEpoch: 28/40...  Loss: 6.1931\nEpoch: 29/40...  Loss: 5.7483\nEpoch: 30/40...  Loss: 5.2711\nEpoch: 31/40...  Loss: 5.0207\nEpoch: 32/40...  Loss: 4.8305\nEpoch: 33/40...  Loss: 4.5807\nEpoch: 34/40...  Loss: 4.5863\nEpoch: 35/40...  Loss: 4.2986\nEpoch: 36/40...  Loss: 4.0242\nEpoch: 37/40...  Loss: 3.8651\nEpoch: 38/40...  Loss: 3.7313\nEpoch: 39/40...  Loss: 3.4983\nEpoch: 40/40...  Loss: 3.5643\nAccuracy score for train set is 0.9807936507936508 \n\nAccuracy score for test set is 0.7755555555555556 \n\nFitting model with epochs = 50, learning rate = 0.03\n\nEpoch: 1/50...  Loss: 60.3563\nEpoch: 2/50...  Loss: 38.7615\nEpoch: 3/50...  Loss: 32.8665\nEpoch: 4/50...  Loss: 29.3344\nEpoch: 5/50...  Loss: 26.9352\nEpoch: 6/50...  Loss: 24.8493\nEpoch: 7/50...  Loss: 22.9607\nEpoch: 8/50...  Loss: 21.2716\nEpoch: 9/50...  Loss: 20.1129\nEpoch: 10/50...  Loss: 18.3825\nEpoch: 11/50...  Loss: 17.3599\nEpoch: 12/50...  Loss: 16.2097\nEpoch: 13/50...  Loss: 15.1522\nEpoch: 14/50...  Loss: 14.1815\nEpoch: 15/50...  Loss: 13.2481\nEpoch: 16/50...  Loss: 12.3368\nEpoch: 17/50...  Loss: 11.5774\nEpoch: 18/50...  Loss: 10.9702\nEpoch: 19/50...  Loss: 10.2250\nEpoch: 20/50...  Loss: 9.5929\nEpoch: 21/50...  Loss: 9.2789\nEpoch: 22/50...  Loss: 8.6585\nEpoch: 23/50...  Loss: 8.0410\nEpoch: 24/50...  Loss: 7.6088\nEpoch: 25/50...  Loss: 7.1072\nEpoch: 26/50...  Loss: 6.8647\nEpoch: 27/50...  Loss: 6.4235\nEpoch: 28/50...  Loss: 6.3577\nEpoch: 29/50...  Loss: 6.0465\nEpoch: 30/50...  Loss: 5.6794\nEpoch: 31/50...  Loss: 5.5043\nEpoch: 32/50...  Loss: 5.0200\nEpoch: 33/50...  Loss: 4.6663\nEpoch: 34/50...  Loss: 4.4585\nEpoch: 35/50...  Loss: 4.3955\nEpoch: 36/50...  Loss: 4.2388\nEpoch: 37/50...  Loss: 3.7392\nEpoch: 38/50...  Loss: 3.8554\nEpoch: 39/50...  Loss: 3.5858\nEpoch: 40/50...  Loss: 3.8296\nEpoch: 41/50...  Loss: 3.5882\nEpoch: 42/50...  Loss: 3.3005\nEpoch: 43/50...  Loss: 3.2737\nEpoch: 44/50...  Loss: 3.1723\nEpoch: 45/50...  Loss: 2.9743\nEpoch: 46/50...  Loss: 2.7797\nEpoch: 47/50...  Loss: 2.6272\nEpoch: 48/50...  Loss: 2.7007\nEpoch: 49/50...  Loss: 2.5154\nEpoch: 50/50...  Loss: 2.5156\nAccuracy score for train set is 0.989484126984127 \n\nAccuracy score for test set is 0.7736666666666666 \n\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Plot curve\nx = np.arange(10, 10 * (len(train_acc) + 1), 10)\nplt.plot(x, train_acc)\nplt.plot(x, test_acc)\nplt.legend(['train', 'test'], loc='upper left')\nplt.title('Accuracy, learning_rate = ' + str(learning_rate), fontsize=14)\nplt.xlabel('Number of epochs', fontsize=11)\nplt.ylabel('Accuracy', fontsize=11)\nplt.show()","execution_count":23,"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 432x288 with 1 Axes>","image/png":"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\n"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"We see that introducing dropout to the model actually helped to reduce the gap between train and test accuracy scores. But we still have to work on the regularization of the model, because we have poor test accuracy. The easiest thing, which I didn't do in this tutorial (to reduce the computation time) is to add more data to the training set (images from the original dataset or some generated data), and to make more training epochs."},{"metadata":{},"cell_type":"markdown","source":"The example of the output from the resulting model:"},{"metadata":{"trusted":true},"cell_type":"code","source":"# turn off batch normalization\nmodel.eval()\n\n# get prediction for the image from the test dataset\ntest_model(model, test[45])","execution_count":44,"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 432x648 with 2 Axes>","image/png":"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\n"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"## CONCLUSION"},{"metadata":{},"cell_type":"markdown","source":"In this kernel I demonstrated an example how to build simple fully connected neural network to classify simple images. While building the solution we used the original data and artificially generated data and introduced regularization techniques such as dropout to reduce variance of the model. The final model has the accuracy about 80% (this can be improved by adding more data and using more epochs while training, I didn't do that to reduce the running time of the kernel)."},{"metadata":{},"cell_type":"markdown","source":"### Improvement\nThe model performs quite well on ten image classes from the simplified dataset, but there is a lot to improve:\n* Add more drawing classes;\n* Try other architectures, such as convolutional neural networks;\n* Try the full dataset, which contains images with higher resolution and additional information (country, strokes and so on)."}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.4","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}