{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "provenance": [] }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" }, "gpuClass": "standard" }, "cells": [ { "cell_type": "markdown", "source": [ "# Biomedical Data Science 2022: Homework Assignment 2\n", "### CBB & CPSC & S&DS (programming) Assignment\n", "\n", "Due: April 26th (Wed) 11:59pm EST\n", "\n", "#### Name: write your name here (double click to edit)" ], "metadata": { "id": "2KEaADgvRO0Z" } }, { "cell_type": "markdown", "source": [ "## Instructions\n", "\n", "* You only need to write code between the `### START CODE HERE ###` and `### END CODE HERE ###` comments. \n", "* You may write code outside of these blocks, but it will not be graded.\n", "* If you make use of any online resource please cite the source in the code comments. \n", "* You may use some small utility functions directly, but notice that directly copying large chunks of codes (even with variable name replacement) are not allowed and will be considered as plagrism.\n", "* After writing your code, you can run the cell by either pressing \"SHIFT\"+\"ENTER\" or by clicking on \"Run Cell\" (denoted by a play symbol) in the upper bar of the notebook. \n", "* Some questions require a written answer. To edit a text block in Colab, double click the text cell.\n", "* After you are finished, turn in the .ipynb file to canvas (File->Download->Download .ipynb). " ], "metadata": { "id": "jm4IYMKizd-k" } }, { "cell_type": "markdown", "source": [ "## Part 1: Calculating dihedral angles of proteins\n" ], "metadata": { "id": "kPXgPj2MSKuk" } }, { "cell_type": "markdown", "source": [ "## 1.1 (25pts) \n", "Ramachandran plots allow us to investigate the sterically allowed and disallowed backbone\n", "dihedral angle combinations φ and ψ in proteins. Using the file core_THR_residues.txt provided,\n", "produce a Ramachandran plot for threonine residues. The file core_THR_residues.txt contains atomic coordinates for \n", "1000 threonine dipeptides taken from a database of high-resolution protein crystal structures. The\n", "Cα, carboxyl carbon, and oxygen atoms on the prior amino acid are labelled pCa, pC, and pO. The N,\n", "Cα and H atoms on the subsequent amino acid are labeled: nN, nCa and nH. Using this file, calculate\n", "φ and ψ for each residue and produce a Ramachandran plot similar to that shown in below. See the\n", "lecture notes for definitions of φ and ψ. " ], "metadata": { "id": "nhyZoJ78zH44" } }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "6V095gvORNBI", "outputId": "51a43a53-30dc-41f7-bcc0-896428318878" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([['1', 'pCA', '0.796000', '-4.634000', '-35.564999'],\n", " ['1', 'pC', '1.707000', '-5.823000', '-35.827999'],\n", " ['1', 'pO', '1.546000', '-6.572000', '-36.794998'],\n", " ...,\n", " ['1000', 'nN', '-9.844000', '-788.841980', '-20.346001'],\n", " ['1000', 'nCA', '-11.077000', '-788.564026', '-19.641001'],\n", " ['1000', 'nH', '-9.906000', '-788.838989', '-21.204000']],\n", " dtype='" ], "image/png": "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\n" }, "metadata": {} } ] }, { "cell_type": "markdown", "source": [ "**Expected Output:**\n", "\n", "![](http://files2.gersteinlab.org/public-docs/2022/04.26/hw2/hw2_img1.png)" ], "metadata": { "id": "e-Bj7Gs9BsDU" } }, { "cell_type": "markdown", "source": [ "## 1.2 (25pts) \n", "In the lecture notes, we not only discussed backbone dihedral angles φ and ψ, but we also discussed sidechain dihedral angles. As the side chains have different numbers of atoms, they can have different numbers of sidechain dihedral angles. In the case of threonine, there is only one sidechain dihedral angle χ1. Generate the observed side chain dihedral angle distribution from core_THR_residues.txt discussed in question 1. The observed distribution should be similar to that shown in below. See the lecture notes for the definition of χ1 in threonine." ], "metadata": { "id": "_GDO2OgZCH-W" } }, { "cell_type": "code", "source": [ "def calculate_threonine_dihedrals(data):\n", " ### START CODE HERE ### \n", "\n", " # replace this code, add comments:\n", " chi = np.random.uniform(0,360, 10000)\n", "\n", " ### END CODE HERE ###\n", " return chi\n", "\n", "chi = calculate_threonine_dihedrals(core_THR_residues)\n", "values, binedges = np.histogram(chi, bins = 60, density = True)\n", "x = 0.5*(binedges[:-1] + binedges[1:])\n", "\n", "plt.xticks(np.arange(0, 361, step=60))\n", "plt.xlabel('$\\chi_1(\\circ)$')\n", "plt.ylabel('$P(\\chi_1)$')\n", "_ = plt.plot(x, values, 'k')" ], "metadata": { "id": "duP9igAoDWV6", "colab": { "base_uri": "https://localhost:8080/", "height": 453 }, "outputId": "9cb58360-138f-45b2-de98-8727c34ea763" }, "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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egtx5dNPP8VNN92EFStWYOnSpXC73bj44ovR3NzcbdtHH3004HJdHo8HEydOREdHB7766is8//zzeO655zBr1qx4vIW4UlZWhv/7v//DmjVrsHr1alxwwQW49NJL8e233wII/9lJpX0lCbfPli9fjgkTJuDiiy/GypUrsWrVKtx8880+S8vE9DgmSFIxZswYcdNNNym/ezweUVpaKubOnZvAUZmDO++8U5x11llB7/d6vaK4uFg8+OCDym11dXXC5XKJV155JR5DNA0AxD/+8Y+Q26xcuVIAELt37xZCCLFx40YBQKxatUrZ5p///Kew2Wxi//79sRyuKQi0z773ve+JOXPm+Nw2atQo8T//8z9CiK7PV3p6uli0aJFy/3fffScAiOXLl8d8zInm0KFDAoD49NNPfW5ft26d6Nu3rzhw4EC3/bp48WJht9tFTU2NctuTTz4p8vLyRHt7e7yGnjB69Ogh/vrXv2r67KT6vpLIfSaEEGPHjhX33HNP0G1jfRyjU5VEdHR0YM2aNaisrFRus9vtqKysxPLlyxM4MnPwzjvv4PTTT8fkyZPRu3dvnHbaaXj66aeV+3fu3Imamhqf/Zefn4+xY8dy/wWgvr4eNpsNBQUFALquAAsKCnD66acr21RWVsJut6OqqipBo0ws48aNwzvvvIP9+/dDCIGPP/4YW7ZswcUXXwwAWLNmDdxut89nbujQoejfv39KfObq6+sBAD179lRua2lpwZVXXon58+ejuLi422OWL1+O4cOHo0+fPspt48ePR0NDg+JGWBGPx4NXX30Vzc3NqKio0PTZSdV9JfHfZ4cOHUJVVRV69+6NcePGoU+fPjj33HPxxRdfKI+J9XGMoiqJOHLkCDwej88XCAD69OmDmpqaBI3KPOzYsQNPPvkkBg8ejH/961+48cYb8dvf/hbPP/88ACj7iPsvPG1tbbjzzjsxZcoUZSHSmpoa9O7d22e7tLQ09OzZM2X33xNPPIGTTz4ZZWVlcDqdmDBhAubPn49zzjkHQNc+czqdijCVpMJnzuv14tZbb8WZZ56JU045Rbn9tttuw7hx43DppZcGfFxNTU3A76i8z2p88803yMnJgcvlwq9//Wv84x//wMknn6zps5Nq+0oSbJ/t2LEDAHDffffhuuuuw5IlSzBq1ChceOGFSnY21sextKifgRCT4PV6cfrpp+P//b//BwA47bTTsGHDBixYsABXX311gkeXPLjdblx++eUQQuDJJ59M9HBMzRNPPIEVK1bgnXfewYABA/DZZ5/hpptuQmlpqY/DkIrcdNNN2LBhg49L8M477+Cjjz7CunXrEjgyc3HSSSdh/fr1qK+vx9///ndcffXV+PTTTxM9LFMTbJ95vV4AwA033IBp06YB6DoPLFu2DM8++yzmzp0b87HRqUoiCgsL4XA4us3+OHjwYEAbPdUoKSnBySef7HPbsGHDsGfPHgBQ9hH3X3CkoNq9ezeWLl2quFRA1/7znxDR2dmJo0ePpuT+a21txd13342HH34YP/7xj3Hqqafi5ptvxhVXXIGHHnoIQNc+6+joQF1dnc9jrf6Zu/nmm/Hee+/h448/RllZmXL7Rx99hO3bt6OgoABpaWlIS+u6rr/ssstw3nnnAejaZ4G+o/I+q+F0OnHiiSdi9OjRmDt3LkaMGIHHHntM02cn1faVJNg+KykpAYCw54FYHscoqpIIp9OJ0aNHY9myZcptXq8Xy5YtQ0VFRQJHZg7OPPPMbtO3t2zZggEDBgAAysvLUVxc7LP/GhoaUFVVxf2H44Jq69at+PDDD9GrVy+f+ysqKlBXV4c1a9Yot3300Ufwer0YO3ZsvIebcNxuN9xut8+sIgBwOBzKFfPo0aORnp7u85nbvHkz9uzZY8nPnBACN998M/7xj3/go48+Qnl5uc/9d911F77++musX79e+QGARx55BAsXLgTQ9Tn75ptvfE58UuD7nyytiNfrRXt7u6bPTqrvK4ncZwMHDkRpaWnI80DMj2NRR91JXHn11VeFy+USzz33nNi4caO4/vrrRUFBgc/sj1Rl5cqVIi0tTfzhD38QW7duFS+99JLIysoSL774orLN//3f/4mCggLx9ttvi6+//lpceumlory8XLS2tiZw5PGhsbFRrFu3Tqxbt04AEA8//LBYt26d2L17t+jo6BCXXHKJKCsrE+vXrxcHDhxQftSziCZMmCBOO+00UVVVJb744gsxePBgMWXKlAS+q9gSap8JIcS5554rvve974mPP/5Y7NixQyxcuFBkZGSIP//5z8pz/PrXvxb9+/cXH330kVi9erWoqKgQFRUViXpLMeXGG28U+fn54pNPPvH5DLW0tAR9DPxm/3V2dopTTjlFXHzxxWL9+vViyZIloqioSMycOTMO7yC+3HXXXeLTTz8VO3fuFF9//bW46667hM1mEx988IEQIvxnJ5X2lSTcPnvkkUdEXl6eWLRokdi6dau45557REZGhti2bZvyHLE8jlFUJSFPPPGE6N+/v3A6nWLMmDFixYoViR6SaXj33XfFKaecIlwulxg6dKh46qmnfO73er3i3nvvFX369BEul0tceOGFYvPmzQkabXz5+OOPBYBuP1dffbXYuXNnwPsAiI8//lh5jtraWjFlyhSRk5Mj8vLyxLRp00RjY2Pi3lSMCbXPhBDiwIED4pprrhGlpaUiIyNDnHTSSWLevHnC6/Uqz9Ha2ir+67/+S/To0UNkZWWJn/zkJ+LAgQMJekexJdhnaOHChSEf49+qYteuXeIHP/iByMzMFIWFheK///u/hdvtju3gE8C1114rBgwYIJxOpygqKhIXXnihIg6E0PbZSZV9JQm3z4QQYu7cuaKsrExkZWWJiooK8fnnn/vcH8vjmE0IIaL3uwghhBBCUhtmqgghhBBCDICiihBCCCHEACiqCCGEEEIMgKKKEEIIIcQAKKoIIYQQQgyAoooQQgghxAAoqgghhBBCDICiihBCCCHEACiqCCGEEEIMgKKKEEIIIcQAKKoIIcQgamtr0bt3b+zatUvzY37+859j3rx5sRsUISRucO0/QggxiBkzZqCxsRFPP/205sds2LAB55xzDnbu3In8/PwYjo4QEmvoVBFCiAG0tLTgmWeewfTp03U97pRTTsGgQYPw4osvxmhkhJB4QVFFCCH/YfLkySgqKsJTTz2l3FZVVQWn04kPPvgg5GMXL14Ml8uF73//+7pf98c//jFeffVV3Y8jhJgLiipCCPkPjz/+OC677DLMmTMHANDU1ISrrroKN954Iy6++OKQj/38888xevTobrc3Nzfj2muvxSmnnBI0OzVmzBisXLkS7e3t0b8JQkjCoKgihJD/UFJSgltvvRX79+9HbW0tfvvb38LlcuGPf/wjAOAnP/kJevTogZ/97GfdHrt7926UlpZ2u/3//u//0K9fP3z++edYvHgxPvnkk27blJaWoqOjAzU1NYa/J0JI/KCoIoQQFUOGDEFWVhZmzZqFl156CS+99BIyMjIAALfccgteeOGFgI9rbW1VtlOzdu1aXHXVVejRoweuuOIKrF69uts2mZmZALpyWYSQ5IWiihBCVNjtdgwfPhx//vOfcf/992PEiBHKfeeddx5yc3MDPq6wsBDHjh3rdvuIESPw8ssvo76+Hm+88UbAEuHRo0cBAEVFRQa9C0JIIqCoIoQQFbLLzKhRo/Df//3fmh932mmnYePGjd1unzlzJnbu3Imzzz4bF110Ec4///xu22zYsAFlZWUoLCyMfOCEkISTlugBEEKImXj00UdRVVWFkSNHwm7Xft05fvx4zJw5E8eOHUOPHj2U23Nzc/Hcc8+FfOznn38eNghPCDE/dKoIIeQ/fPPNN5g5cyb+67/+Cxs3bkRnZ6fmxw4fPhyjRo3C66+/rus129ra8NZbb+G6667TO1xCiMmgqCKEEHSJmyuvvBJXXHEF7r//fnR0dGDTpk26nmPWrFl47LHH4PV6NT9m4cKFGDNmTET9rQgh5oKiihBCANx1111obm7Gn/70J/To0QMDBgzAo48+iurqamWbyspKTJ48GYsXL0ZZWRmWL1/u8xwTJ07E9ddfj/3792t+3fT0dDzxxBOGvQ9CSOLg2n+EkJTngw8+wMSJE/Hpp59i3LhxAIC//vWvuOuuu3D22WfjH//4R4JHSAhJBiiqCCGEEEIMgOU/QgghhBADoKgihBBCCDEAiipCCCGEEAOgqCKEEEIIMQCKKkIIIYQQA6CoIoQQQggxAIoqQgghhBADoKgihBBCCDEAiipCCCGEEAOgqCKEEEIIMYD/DyYYqSB/y+lyAAAAAElFTkSuQmCC\n" }, "metadata": {} } ] }, { "cell_type": "markdown", "source": [ "**Expected Output:**\n", "\n", "![](http://files2.gersteinlab.org/public-docs/2022/04.26/hw2/hw2_img2.png)" ], "metadata": { "id": "KZpDpCKFG2_J" } }, { "cell_type": "markdown", "source": [ "## Part 2: A simple neural network for finding transcription factor binding sites\n", "\n", "The following protocol is adapted from a colab notebook for one of our discussion section papers: **A Primer on Deep Learning in Genomics** (*Nature Genetics, 2018*) by James Zou, Mikael Huss, Abubakar Abid, Pejman Mohammadi, Ali Torkamani & Amalio Telentil. [paper link](https://www.nature.com/articles/s41588-018-0295-5). \n", "\n", "We will design a neural network that can discover binding motifs in DNA based on the results of an assay that determines whether a longer DNA sequence binds to the protein or not. Here, the longer DNA sequences are our *independent variables* (or *predictors*), while the positive or negative response of the assay is the *dependent variable* (or *response*).\n", "\n", "We will use simulated data that consists of DNA sequences of length 50 bases (chosen to be artificially short so that the data is easy to play around with), and is labeled with 0 or 1 depending on the result of the assay. Our goal is to build a classifier that can predict whether a particular sequence will bind to the protein and discover the short motif that is the binding site in the sequences that are bound to the protein.\n", "\n", "(Spoiler alert: the true regulatory motif is *`CGACCGAACTCC`*. Of course, the neural network doesn't know this.)\n" ], "metadata": { "id": "Dr2K-XeOHUka" } }, { "cell_type": "markdown", "source": [ "\n", "#### **Instructions for part 2**: Section 2.1-2.4 will preprocess data, set up a basic network, and run evaluation for you on that network. **You only need to read and run these cells.** In section 2.5 you will be doing hyperparameter tuning to optimize this model. You may edit code in all sections, but **only section 2.5 is graded.**" ], "metadata": { "id": "3STtpshr7K8G" } }, { "cell_type": "markdown", "metadata": { "id": "aK7wr8n8gzQ_" }, "source": [ "## 2.1 - Curate the Data" ] }, { "cell_type": "markdown", "metadata": { "id": "QRMSFdUSubgX" }, "source": [ "In order to train the neural network, we must load and preprocess the data, which consists of DNA sequences and their corresponding labels.By processing this data, the network will learn to distinguish sequences that bind to the transcription factor from those that do not. We will split the data into three different sub-datasets:\n", "\n", "(1) Training dataset: a dataset used to fit the parameters of a model or to define the weights of connections between neurons of a neural network.\n", "\n", "(2) Validation dataset: a second dataset used to minimize overfitting. The weights of the network are not adjusted with this data set. After each training cycle, if the accuracy over the training data set increases, but the accuracy over the validation data set stays the same or decreases, then there is overfitting on the neural network.\n", "\n", "(3) Testing dataset: is a third dataset not included in the training nor validation data sets. After all the training and validation cycles are complete, this dataset is used only for testing the final solution in order to measure the actual predictive power of the neural network on new examples.\n" ] }, { "cell_type": "code", "metadata": { "id": "B_F7VoAMhLiX", "colab": { "base_uri": "https://localhost:8080/", "height": 206 }, "outputId": "62d28872-7423-4c5f-b0a5-e7a27ed49468" }, "source": [ "# this notebook requires an earlier version of tensorflow \n", "# ignore any warnings created by this\n", "!pip install tensorflow==1.13.2 --quiet\n", "\n", "import tensorflow as tf\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import requests\n", "\n", "tf.set_random_seed(0)\n", "np.random.seed(0) \n", "\n", "SEQUENCES_URL = 'https://raw.githubusercontent.com/abidlabs/deep-learning-genomics-primer/master/sequences.txt'\n", "\n", "sequences = requests.get(SEQUENCES_URL).text.split('\\n')\n", "sequences = list(filter(None, sequences)) # This removes empty sequences.\n", "\n", "# Let's print the first few sequences.\n", "pd.DataFrame(sequences, index=np.arange(1, len(sequences)+1), \n", " columns=['Sequences']).head()" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " Sequences\n", "1 CCGAGGGCTATGGTTTGGAAGTTAGAACCCTGGGGCTTCTCGCGGA...\n", "2 GAGTTTATATGGCGCGAGCCTAGTGGTTTTTGTACTTGTTTGTCGC...\n", "3 GATCAGTAGGGAAACAAACAGAGGGCCCAGCCACATCTAGCAGGTA...\n", "4 GTCCACGACCGAACTCCCACCTTGACCGCAGAGGTACCACCAGAGC...\n", "5 GGCGACCGAACTCCAACTAGAACCTGCATAACTGGCCTGGGAGATA..." ], "text/html": [ "\n", "
\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Sequences
1CCGAGGGCTATGGTTTGGAAGTTAGAACCCTGGGGCTTCTCGCGGA...
2GAGTTTATATGGCGCGAGCCTAGTGGTTTTTGTACTTGTTTGTCGC...
3GATCAGTAGGGAAACAAACAGAGGGCCCAGCCACATCTAGCAGGTA...
4GTCCACGACCGAACTCCCACCTTGACCGCAGAGGTACCACCAGAGC...
5GGCGACCGAACTCCAACTAGAACCTGCATAACTGGCCTGGGAGATA...
\n", "
\n", " \n", " \n", " \n", "\n", " \n", "
\n", "
\n", " " ] }, "metadata": {}, "execution_count": 20 } ] }, { "cell_type": "markdown", "metadata": { "id": "bzsbNHqWiFek" }, "source": [ "The next step is to organize the data into a format that can be passed into a deep learning algorithm. Most deep learning algorithms accept data in the form of vectors or matrices (or more generally, tensors). \n", "\n", "To get each DNA sequence in the form of a matrix, we use _one-hot encoding_, which encodes every base in a sequence in the form of a 4-dimensional vector, with a separate dimension for each base. We place a \"1\" in the dimension corresponding to the base found in the DNA sequence, and \"0\"s in all other slots. We then concatenate these 4-dimensional vectors together along the bases in the sequence to form a matrix. \n", "\n", "In the cell below, we one-hot encode the simulated DNA sequences, and show an example of what the one-hot encoded sequence looks like:" ] }, { "cell_type": "code", "metadata": { "id": "IPJD6PuDnaS6", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "402d4cc3-000b-4c18-c811-dff6ec94cce0" }, "source": [ "from sklearn.preprocessing import LabelEncoder, OneHotEncoder\n", "\n", "# The LabelEncoder encodes a sequence of bases as a sequence of integers.\n", "integer_encoder = LabelEncoder() \n", "# The OneHotEncoder converts an array of integers to a sparse matrix where \n", "# each row corresponds to one possible value of each feature.\n", "one_hot_encoder = OneHotEncoder(categories='auto') \n", "input_features = []\n", "\n", "for sequence in sequences:\n", " integer_encoded = integer_encoder.fit_transform(list(sequence))\n", " integer_encoded = np.array(integer_encoded).reshape(-1, 1)\n", " one_hot_encoded = one_hot_encoder.fit_transform(integer_encoded)\n", " input_features.append(one_hot_encoded.toarray())\n", "\n", "np.set_printoptions(threshold=40)\n", "input_features = np.stack(input_features)\n", "print(\"Example sequence\\n-----------------------\")\n", "print('DNA Sequence #1:\\n',sequences[0][:10],'...',sequences[0][-10:])\n", "print('One hot encoding of Sequence #1:\\n',input_features[0].T)" ], "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Example sequence\n", "-----------------------\n", "DNA Sequence #1:\n", " CCGAGGGCTA ... CGCGGACACC\n", "One hot encoding of Sequence #1:\n", " [[0. 0. 0. ... 1. 0. 0.]\n", " [1. 1. 0. ... 0. 1. 1.]\n", " [0. 0. 1. ... 0. 0. 0.]\n", " [0. 0. 0. ... 0. 0. 0.]]\n" ] } ] }, { "cell_type": "markdown", "metadata": { "id": "AbBmrEVGrahN" }, "source": [ "Similarly, we can go ahead and load the labels (_response variables_). In this case, the labels are structured as follows: a \"1\" indicates that a protein bound to the sequence, while a \"0\" indicates that the protein did not. While we could use the labels as a vector, it is often easier to similarly one-hot encode the labels, as we did the features. We carry out that here:" ] }, { "cell_type": "code", "metadata": { "id": "IA9FJeQkr1Ze", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "36898cff-f5b8-4cad-ee44-9d3d0b575ae7" }, "source": [ "LABELS_URL = 'https://raw.githubusercontent.com/abidlabs/deep-learning-genomics-primer/master/labels.txt'\n", "\n", "labels = requests.get(LABELS_URL).text.split('\\n')\n", "labels = list(filter(None, labels)) # removes empty sequences\n", "\n", "one_hot_encoder = OneHotEncoder(categories='auto')\n", "labels = np.array(labels).reshape(-1, 1)\n", "input_labels = one_hot_encoder.fit_transform(labels).toarray()\n", "\n", "print('Labels:\\n',labels.T)\n", "print('One-hot encoded labels:\\n',input_labels.T)" ], "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Labels:\n", " [['0' '0' '0' ... '0' '1' '1']]\n", "One-hot encoded labels:\n", " [[1. 1. 1. ... 1. 0. 0.]\n", " [0. 0. 0. ... 0. 1. 1.]]\n" ] } ] }, { "cell_type": "markdown", "metadata": { "id": "MTokFzDZvQR-" }, "source": [ "We also go ahead and split the data into training and test sets. The purpose of the test set is to ensure that we can observe the performance of the model on new data, not seen previously during training. At a later step, we will further partition the training set into a training and validation set." ] }, { "cell_type": "code", "metadata": { "id": "P_7LKgvc3Lnn" }, "source": [ "from sklearn.model_selection import train_test_split\n", "\n", "train_features, test_features, train_labels, test_labels = train_test_split(\n", " input_features, input_labels, test_size=0.25, random_state=42)" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "7LQp2ZFrg6dm" }, "source": [ "## 2.2 - Select the Architecture and Train" ] }, { "cell_type": "markdown", "metadata": { "id": "xBT6Q3j-sjhh" }, "source": [ "![alt text](https://github.com/abidlabs/deep-learning-genomics-primer/blob/master/Screenshot%20from%202018-08-01%2020-31-49.png?raw=true)" ] }, { "cell_type": "markdown", "metadata": { "id": "krHJgtK_rzif" }, "source": [ "Next, we choose a neural network architecture to train the model. In this tutorial, we choose a simple 1D convolutional neural network (CNN), which is commonly used in deep learning for functional genomics applications.\n", "\n", "A CNN learns to recognize patterns that are generally invariant across space, by trying to match the input sequence to a number of learnable \"filters\" of a fixed size. In our dataset, the filters will be motifs within the DNA sequences. The CNN may then learn to combine these filters to recognize a larger structure (e.g. the presence or absence of a transcription factor binding site). \n", "\n", "We will use the deep learning library `Keras`. As of 2017, `Keras` has been integrated into `TensorFlow`, which makes it very easy to construct neural networks. We only need to specify the kinds of layers we would like to include in our network, and the dimensionality of each layer. The CNN we generate in this example consists of the following layers:\n", "\n", "- _Conv1D_: We define our convolutional layer to have 32 filters of size 12 bases.\n", "\n", "- _MaxPooling1D_: After the convolution, we use a pooling layer to down-sample the output of the each of the 32 convolutional filters. Though not always required, this is a typical form of non-linear down-sampling used in CNNs.\n", "\n", "- _Flatten_: This layer flattens the output of the max pooling layer, combining the results of the convolution and pooling layers across all 32 filters. \n", "\n", "- _Dense_: The first Dense tensor creates a layer (dense_1) that compresses the representation of the flattened layer, resulting in smaller layer with 16 tensors, and the second Dense function converges the tensors into the output layer (dense_2) that consists of the two possible response values (0 or 1).\n", "\n", "We can see the details of the architecture of the neural network we have created by running `model.summary()`, which prints the dimensionality and number of parameters for each layer in our network. " ] }, { "cell_type": "code", "metadata": { "id": "dU3imaIns80_", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "12fa6aca-b110-45a9-cfa0-c179169aec54" }, "source": [ "from tensorflow.keras.layers import Conv1D, Dense, MaxPooling1D, Flatten\n", "from tensorflow.keras.models import Sequential\n", "\n", "model = Sequential()\n", "model.add(Conv1D(filters=32, kernel_size=12, \n", " input_shape=(train_features.shape[1], 4)))\n", "model.add(MaxPooling1D(pool_size=4))\n", "model.add(Flatten())\n", "model.add(Dense(16, activation='relu'))\n", "model.add(Dense(2, activation='softmax'))\n", "\n", "model.compile(loss='binary_crossentropy', optimizer='adam', \n", " metrics=['binary_accuracy'])\n", "model.summary()" ], "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "WARNING:tensorflow:From /usr/local/lib/python3.7/dist-packages/tensorflow/python/ops/resource_variable_ops.py:435: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.\n", "Instructions for updating:\n", "Colocations handled automatically by placer.\n", "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", "conv1d (Conv1D) (None, 39, 32) 1568 \n", "_________________________________________________________________\n", "max_pooling1d (MaxPooling1D) (None, 9, 32) 0 \n", "_________________________________________________________________\n", "flatten (Flatten) (None, 288) 0 \n", "_________________________________________________________________\n", "dense (Dense) (None, 16) 4624 \n", "_________________________________________________________________\n", "dense_1 (Dense) (None, 2) 34 \n", "=================================================================\n", "Total params: 6,226\n", "Trainable params: 6,226\n", "Non-trainable params: 0\n", "_________________________________________________________________\n" ] } ] }, { "cell_type": "markdown", "metadata": { "id": "qSOUwoG_vHRA" }, "source": [ "Now, we are ready to go ahead and train the neural network. We will further divide the training set into a training and validation set. We will train only on the reduced training set, but plot the loss curve on both the training and validation sets. Once the loss for the validation set stops improving or gets worse throughout the learning cycles, it is time to stop training because the model has already converged and may be just overfitting." ] }, { "cell_type": "code", "metadata": { "id": "LSOmHIM83hXO", "colab": { "base_uri": "https://localhost:8080/", "height": 349 }, "outputId": "8121719c-7533-4294-b229-36499579d1a4" }, "source": [ "history = model.fit(train_features, train_labels, \n", " epochs=50, verbose=0, validation_split=0.5)\n", "\n", "plt.figure()\n", "plt.plot(history.history['loss'])\n", "plt.plot(history.history['val_loss'])\n", "plt.title('model loss')\n", "plt.ylabel('loss')\n", "plt.xlabel('epoch')\n", "plt.legend(['train', 'validation'])\n", "plt.show()" ], "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "WARNING:tensorflow:From /usr/local/lib/python3.7/dist-packages/tensorflow/python/ops/math_ops.py:3066: to_int32 (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.\n", "Instructions for updating:\n", "Use tf.cast instead.\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ] }, { "cell_type": "markdown", "metadata": { "id": "P5eKDmX8ODBE" }, "source": [ "Similarly, we can plot the accuracy of our neural network on the binary classification task. The metric used in this example is the _binary accuracy_, which calculates the proportion of predictions that match labels or response variables. Other metrics may be used in different tasks -- for example, the _mean squared error_ is typically used to measure the accuracy for continuous response variables (e.g. polygenic risk scores, total serum cholesterol level, height, weight and systolic blood pressure)." ] }, { "cell_type": "code", "metadata": { "id": "J2Jdpa1i8zqM", "colab": { "base_uri": "https://localhost:8080/", "height": 295 }, "outputId": "06d14c69-4989-4c39-fbdc-e87a3d2ccab5" }, "source": [ "plt.figure()\n", "plt.plot(history.history['binary_accuracy'])\n", "plt.plot(history.history['val_binary_accuracy'])\n", "plt.title('model accuracy')\n", "plt.ylabel('accuracy')\n", "plt.xlabel('epoch')\n", "plt.legend(['train', 'validation'])\n", "plt.show()" ], "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ] }, { "cell_type": "markdown", "metadata": { "id": "6Xy7VhhZg-hN" }, "source": [ "## 2.3 - Evaluate" ] }, { "cell_type": "markdown", "metadata": { "id": "btf7FyMVsnFA" }, "source": [ "![alt text](https://github.com/abidlabs/deep-learning-genomics-primer/blob/master/Screenshot%20from%202018-08-01%2020-32-12.png?raw=true)" ] }, { "cell_type": "markdown", "metadata": { "id": "eQ_xYCvfvFlE" }, "source": [ "The best way to evaluate whether the network has learned to classify sequences is to evaluate its performance on a fresh test set consisting of data that it has not observed at all during training. Here, we evaluate the model on the test set and plot the results as a confusion matrix. Nearly every test sequence should be correctly classified." ] }, { "cell_type": "code", "metadata": { "id": "J1bvxV9J-EMT", "colab": { "base_uri": "https://localhost:8080/", "height": 349 }, "outputId": "0cd86b05-6f6d-4c29-ec2d-8f91c3500235" }, "source": [ "from sklearn.metrics import confusion_matrix\n", "import itertools\n", "\n", "predicted_labels = model.predict(np.stack(test_features))\n", "cm = confusion_matrix(np.argmax(test_labels, axis=1), \n", " np.argmax(predicted_labels, axis=1))\n", "print('Confusion matrix:\\n',cm)\n", "\n", "cm = cm.astype('float') / cm.sum(axis = 1)[:, np.newaxis]\n", "\n", "plt.imshow(cm, cmap=plt.cm.Blues)\n", "plt.title('Normalized confusion matrix')\n", "plt.colorbar()\n", "plt.xlabel('True label')\n", "plt.ylabel('Predicted label')\n", "plt.xticks([0, 1]); plt.yticks([0, 1])\n", "plt.grid('off')\n", "for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):\n", " plt.text(j, i, format(cm[i, j], '.2f'),\n", " horizontalalignment='center',\n", " color='white' if cm[i, j] > 0.5 else 'black')" ], "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Confusion matrix:\n", " [[249 10]\n", " [ 7 234]]\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ] }, { "cell_type": "code", "source": [ "cm" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "hD-jrVWK-0G6", "outputId": "873649cc-808c-4a83-cc87-a3ec28c43077" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([[0.96138996, 0.03861004],\n", " [0.02904564, 0.97095436]])" ] }, "metadata": {}, "execution_count": 15 } ] }, { "cell_type": "markdown", "metadata": { "id": "UBdJQC1Ug__3" }, "source": [ "## 2.4 - Interpret" ] }, { "cell_type": "markdown", "metadata": { "id": "6qmKi1ResqHo" }, "source": [ "![alt text](https://github.com/abidlabs/deep-learning-genomics-primer/blob/master/Screenshot%20from%202018-08-01%2020-32-31.png?raw=true)" ] }, { "cell_type": "markdown", "metadata": { "id": "UpAwoK9SwAbb" }, "source": [ "Your results so far should allow you to conclude that the neural network is quite effective in learning to distinguish sequences that bind the protein from sequences that do not. But can we understand _why_ the neural network classifies a training point in the way that it does? To do so, we can compute a simple _saliency map_, which is the gradient of the model's prediction with respect to each individual nucleotide. \n", "\n", "In other words, the saliency maps shows how the output response value changes with respect to a small changes in input nucleotide sequence. All the positive values in the gradients tell us that a small change to that nucleotide will change the output value. Hence, visualizing these gradients for a given input sequence, should provide some clues about what nucleotides form the binding motive that we are trying to identify." ] }, { "cell_type": "code", "metadata": { "id": "WNT_Au-dAP8a" }, "source": [ "import tensorflow.keras.backend as K\n", "\n", "def compute_salient_bases(model, x):\n", " input_tensors = [model.input]\n", " gradients = model.optimizer.get_gradients(model.output[0][1], model.input)\n", " compute_gradients = K.function(inputs = input_tensors, outputs = gradients)\n", " \n", " x_value = np.expand_dims(x, axis=0)\n", " gradients = compute_gradients([x_value])[0][0]\n", " sal = np.clip(np.sum(np.multiply(gradients,x), axis=1),a_min=0, a_max=None)\n", " return sal" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "uObq5iC4BG1g", "colab": { "base_uri": "https://localhost:8080/", "height": 350 }, "outputId": "ceaa8fa8-067f-4dce-f5de-92f1f9311c1a" }, "source": [ "sequence_index = 1999 # You can change this to compute the gradient for a different example. But if so, change the coloring below as well.\n", "sal = compute_salient_bases(model, input_features[sequence_index])\n", "\n", "plt.figure(figsize=[16,5])\n", "barlist = plt.bar(np.arange(len(sal)), sal)\n", "[barlist[i].set_color('C1') for i in range(5,17)] # Change the coloring here if you change the sequence index.\n", "plt.xlabel('Bases')\n", "plt.ylabel('Magnitude of saliency values')\n", "plt.xticks(np.arange(len(sal)), list(sequences[sequence_index]));\n", "plt.title('Saliency map for bases in one of the positive sequences'\n", " ' (orange indicates the actual bases in motif)');" ], "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ] }, { "cell_type": "markdown", "metadata": { "id": "voPIrz9TPtIH" }, "source": [ "The results above should show high saliency values for the bases _CGACCGAACTCC_ appearing in the DNA sequence. If you recall from the top of the document, this is exactly the motif that we embedded in the positive sequences! The raw saliency values may be non-zero for other bases as well -- the gradient-based saliency map method is not perfect, and there other more complex interpretation methods that are used in practice to obtain better results. \n" ] }, { "cell_type": "markdown", "source": [ "## 2.5 - Hyperparameter tuning (graded portion)\n", "\n" ], "metadata": { "id": "uqDt9AeMvmCE" } }, { "cell_type": "markdown", "source": [ "For the following problems, you can (and should) copy/reuse any of the code from above." ], "metadata": { "id": "zXyCTman8tpF" } }, { "cell_type": "markdown", "source": [ "### a. (10 pts) \n", "The base model above uses `'binary_crossentropy'`(BCE) as its loss function. Re-train the model using `'mean_squared_error'` (MSE) and `'hinge'` as loss instead. Show, in a plot, how the precision and recall are affected on the test set for each of the losses (BCE,MSE, and hinge). " ], "metadata": { "id": "TwUw8NKS8EQF" } }, { "cell_type": "code", "source": [ "### START CODE HERE ### \n", "\n", "### END CODE HERE ###" ], "metadata": { "id": "IUpHywIS7fWx" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "### b. (10 pts) \n", "Explain why the binary cross entropy loss is more appropriate than MSE or hinge loss for this classification problem\n" ], "metadata": { "id": "MrWkNDZY9hgu" } }, { "cell_type": "markdown", "source": [ "\n", "**type your answer here (double click to edit)**" ], "metadata": { "id": "MRrB0FBV_AaR" } }, { "cell_type": "markdown", "source": [ "### c. (10 pts)\n", "\n", "Keeping all other parameters equal, vary the number of filters in the first convolutional layer from 1 to 64, in powers of 2, and show in a plot how the precision and recall are affected on the test set." ], "metadata": { "id": "dTjwnayj-IsA" } }, { "cell_type": "code", "source": [ "filters = 2**np.arange(7)\n", "\n", "### START CODE HERE ### \n", "for filter in filters:\n", "### END CODE HERE ###" ], "metadata": { "id": "mf912ZiwOcr8" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "### d. (10 pts)\n", "\n", "Keeping all other parameters equal, vary the size of the filter (kernel size) in the first convolutional layer from 1 to 32, in powers of 2, and show in a plot how the precision and recall are affected on the test set." ], "metadata": { "id": "nMnWyFJE_Air" } }, { "cell_type": "code", "source": [ "kernel_sizes = 2**np.arange(6)\n", "\n", "### START CODE HERE ### \n", "for kernel_size in kernel_sizes:\n", "### END CODE HERE ###\n" ], "metadata": { "id": "9g6yMjvDOvNS" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "### e. (10 pts)\n", "Explain how precision/recall are affected by the number of filters and the filter size. Explain why this might be happening." ], "metadata": { "id": "XcCcOZbzPOJa" } }, { "cell_type": "markdown", "source": [ "\n", "**type your answer here (double click to edit)**" ], "metadata": { "id": "St2N4-lqPnx6" } }, { "cell_type": "markdown", "source": [ "### f. extra credit (10 pts)\n", "\n", "Change the architecture of the convolutional neural network model to see if you can get a better validation accuracy. You can try adding some more convolutional layers or dense layers. \n", "\n", "Show the saliency map for your new model. How do the saliency values compare to before?\n" ], "metadata": { "id": "4xSTR0ivPrdF" } }, { "cell_type": "code", "source": [ "### START CODE HERE ### \n", "\n", "### END CODE HERE ###" ], "metadata": { "id": "DH1y8vtMSsrk" }, "execution_count": null, "outputs": [] } ] }