{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Variational Autoencoder for pan-cancer gene expression\n", "\n", "**Gregory Way 2017**\n", "\n", "This script trains and outputs results for a [variational autoencoder (VAE)](https://arxiv.org/abs/1312.6114)\n", "applied to gene expression data across 33 different cancer-types from The Cancer Genome Atlas (TCGA).\n", "\n", "A VAE aproximates the data generating function for the cancer data and learns the lower dimensional manifold a tumor occupies in gene expression space. By compressing the gene expression space into lower dimensional space, the VAE would, ideally, learn biological principles, such as cancer hallmark pathway activations, that help explain how tumors are similar and different. The VAE is also a generative model with a latent space that can be interpolated to observe transitions between cancer states.\n", "\n", "The particular model trained in this notebook consists of gene expression input (5000 most variably expressed genes by median absolute deviation) compressed down into two length 100 vectors (mean and variance encoded spaces) which are made deterministic through the reparameterization trick of sampling an epsilon vector from the uniform distribution. The encoded layer is then decoded back to original 5000 dimensions through a single reconstruction layer. I included a layer of batch normalization in the encoding step to prevent dead nodes. The encoding scheme also uses relu activation while the decoder uses a sigmoid activation to enforce positive activations. All weights are glorot uniform initialized. \n", "\n", "Another trick used here to encourage manifold learning is _warm start_ as discussed in [Sonderby et al. 2016](https://arxiv.org/abs/1602.02282). With warm starts, we add a parameter _beta_, which controls the contribution of the KL divergence loss in the total VAE loss (reconstruction + (beta * KL)). In this setting, the model begins training deterministically as a vanilla autoencoder (_beta_ = 0) and slowly ramps up after each epoch linearly until _beta_ = 1. After a parameter sweep, we observed that kappa has little influence in training, therefore, we set _kappa_ = 1, which is a full VAE.\n", "\n", "Much of this script is inspired by the [keras variational_autoencoder.py example](https://github.com/fchollet/keras/blob/master/examples/variational_autoencoder.py)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Using TensorFlow backend.\n" ] } ], "source": [ "import os\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "\n", "import tensorflow as tf\n", "from keras.layers import Input, Dense, Lambda, Layer, Activation\n", "from keras.layers.normalization import BatchNormalization\n", "from keras.models import Model\n", "from keras import backend as K\n", "from keras import metrics, optimizers\n", "from keras.callbacks import Callback\n", "import keras\n", "\n", "import pydot\n", "import graphviz\n", "from keras.utils import plot_model\n", "from keras_tqdm import TQDMNotebookCallback\n", "from IPython.display import SVG\n", "from keras.utils.vis_utils import model_to_dot" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2.1.3\n" ] }, { "data": { "text/plain": [ "'1.4.0'" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(keras.__version__)\n", "tf.__version__" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "plt.style.use('seaborn-notebook')" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "sns.set(style=\"white\", color_codes=True)\n", "sns.set_context(\"paper\", rc={\"font.size\":14,\"axes.titlesize\":15,\"axes.labelsize\":20,\n", " 'xtick.labelsize':14, 'ytick.labelsize':14})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Load Functions and Classes\n", "\n", "This will facilitate connections between layers and also custom hyperparameters" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# Function for reparameterization trick to make model differentiable\n", "def sampling(args):\n", " \n", " import tensorflow as tf\n", " # Function with args required for Keras Lambda function\n", " z_mean, z_log_var = args\n", "\n", " # Draw epsilon of the same shape from a standard normal distribution\n", " epsilon = K.random_normal(shape=tf.shape(z_mean), mean=0.,\n", " stddev=epsilon_std)\n", " \n", " # The latent vector is non-deterministic and differentiable\n", " # in respect to z_mean and z_log_var\n", " z = z_mean + K.exp(z_log_var / 2) * epsilon\n", " return z\n", "\n", "\n", "class CustomVariationalLayer(Layer):\n", " \"\"\"\n", " Define a custom layer that learns and performs the training\n", " This function is borrowed from:\n", " https://github.com/fchollet/keras/blob/master/examples/variational_autoencoder.py\n", " \"\"\"\n", " def __init__(self, **kwargs):\n", " # https://keras.io/layers/writing-your-own-keras-layers/\n", " self.is_placeholder = True\n", " super(CustomVariationalLayer, self).__init__(**kwargs)\n", "\n", " def vae_loss(self, x_input, x_decoded):\n", " reconstruction_loss = original_dim * metrics.binary_crossentropy(x_input, x_decoded)\n", " kl_loss = - 0.5 * K.sum(1 + z_log_var_encoded - K.square(z_mean_encoded) - \n", " K.exp(z_log_var_encoded), axis=-1)\n", " return K.mean(reconstruction_loss + (K.get_value(beta) * kl_loss))\n", "\n", " def call(self, inputs):\n", " x = inputs[0]\n", " x_decoded = inputs[1]\n", " loss = self.vae_loss(x, x_decoded)\n", " self.add_loss(loss, inputs=inputs)\n", " # We won't actually use the output.\n", " return x" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Implementing Warm-up as described in Sonderby et al. LVAE\n", "\n", "This is modified code from https://github.com/fchollet/keras/issues/2595" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "class WarmUpCallback(Callback):\n", " def __init__(self, beta, kappa):\n", " self.beta = beta\n", " self.kappa = kappa\n", " # Behavior on each epoch\n", " def on_epoch_end(self, epoch, logs={}):\n", " if K.get_value(self.beta) <= 1:\n", " K.set_value(self.beta, K.get_value(self.beta) + self.kappa)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "np.random.seed(123)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Load Gene Expression Data" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(10459, 5000)\n" ] }, { "data": { "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", " \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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
RPS4Y1XISTKRT5AGR2CEACAM5KRT6AKRT14CEACAM6DDX3YKDM5D...FAM129AC8orf48CDK5R1FAM81AC13orf18GDPD3SMAGPC2orf85POU5F1BCHST2
TCGA-02-0047-010.6782960.2899100.0342300.00.00.0847310.0318630.0377090.7467970.687833...0.4406100.4287820.7328190.6343400.5806620.2943130.4581340.4782190.1682630.638497
TCGA-02-0055-010.2006330.6549170.1819930.00.00.1006060.0500110.0925860.1037250.140642...0.6206580.3632070.5922690.6027550.6101920.3745690.7224200.2713560.1604650.602560
\n", "

2 rows × 5000 columns

\n", "
" ], "text/plain": [ " RPS4Y1 XIST KRT5 AGR2 CEACAM5 KRT6A \\\n", "TCGA-02-0047-01 0.678296 0.289910 0.034230 0.0 0.0 0.084731 \n", "TCGA-02-0055-01 0.200633 0.654917 0.181993 0.0 0.0 0.100606 \n", "\n", " KRT14 CEACAM6 DDX3Y KDM5D ... FAM129A \\\n", "TCGA-02-0047-01 0.031863 0.037709 0.746797 0.687833 ... 0.440610 \n", "TCGA-02-0055-01 0.050011 0.092586 0.103725 0.140642 ... 0.620658 \n", "\n", " C8orf48 CDK5R1 FAM81A C13orf18 GDPD3 SMAGP \\\n", "TCGA-02-0047-01 0.428782 0.732819 0.634340 0.580662 0.294313 0.458134 \n", "TCGA-02-0055-01 0.363207 0.592269 0.602755 0.610192 0.374569 0.722420 \n", "\n", " C2orf85 POU5F1B CHST2 \n", "TCGA-02-0047-01 0.478219 0.168263 0.638497 \n", "TCGA-02-0055-01 0.271356 0.160465 0.602560 \n", "\n", "[2 rows x 5000 columns]" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rnaseq_file = os.path.join('data', 'pancan_scaled_zeroone_rnaseq.tsv.gz')\n", "rnaseq_df = pd.read_table(rnaseq_file, index_col=0)\n", "print(rnaseq_df.shape)\n", "rnaseq_df.head(2)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "# Split 10% test set randomly\n", "test_set_percent = 0.1\n", "rnaseq_test_df = rnaseq_df.sample(frac=test_set_percent)\n", "rnaseq_train_df = rnaseq_df.drop(rnaseq_test_df.index)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Initialize variables and hyperparameters" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "# Set hyper parameters\n", "original_dim = rnaseq_df.shape[1]\n", "latent_dim = 100\n", "\n", "batch_size = 50\n", "epochs = 50\n", "learning_rate = 0.0005\n", "\n", "epsilon_std = 1.0\n", "beta = K.variable(0)\n", "kappa = 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Encoder" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "# Input place holder for RNAseq data with specific input size\n", "rnaseq_input = Input(shape=(original_dim, ))\n", "\n", "# Input layer is compressed into a mean and log variance vector of size `latent_dim`\n", "# Each layer is initialized with glorot uniform weights and each step (dense connections,\n", "# batch norm, and relu activation) are funneled separately\n", "# Each vector of length `latent_dim` are connected to the rnaseq input tensor\n", "z_mean_dense_linear = Dense(latent_dim, kernel_initializer='glorot_uniform')(rnaseq_input)\n", "z_mean_dense_batchnorm = BatchNormalization()(z_mean_dense_linear)\n", "z_mean_encoded = Activation('relu')(z_mean_dense_batchnorm)\n", "\n", "z_log_var_dense_linear = Dense(latent_dim, kernel_initializer='glorot_uniform')(rnaseq_input)\n", "z_log_var_dense_batchnorm = BatchNormalization()(z_log_var_dense_linear)\n", "z_log_var_encoded = Activation('relu')(z_log_var_dense_batchnorm)\n", "\n", "# return the encoded and randomly sampled z vector\n", "# Takes two keras layers as input to the custom sampling function layer with a `latent_dim` output\n", "z = Lambda(sampling, output_shape=(latent_dim, ))([z_mean_encoded, z_log_var_encoded])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Decoder" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "# The decoding layer is much simpler with a single layer and sigmoid activation\n", "decoder_to_reconstruct = Dense(original_dim, kernel_initializer='glorot_uniform', activation='sigmoid')\n", "rnaseq_reconstruct = decoder_to_reconstruct(z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Connect the encoder and decoder to make the VAE\n", "\n", "The `CustomVariationalLayer()` includes the VAE loss function (reconstruction + (beta * KL)), which is what will drive our model to learn an interpretable representation of gene expression space.\n", "\n", "The VAE is compiled with an Adam optimizer and built-in custom loss function. The `loss_weights` parameter ensures beta is updated at each epoch end callback" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "__________________________________________________________________________________________________\n", "Layer (type) Output Shape Param # Connected to \n", "==================================================================================================\n", "input_1 (InputLayer) (None, 5000) 0 \n", "__________________________________________________________________________________________________\n", "dense_1 (Dense) (None, 100) 500100 input_1[0][0] \n", "__________________________________________________________________________________________________\n", "dense_2 (Dense) (None, 100) 500100 input_1[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_1 (BatchNor (None, 100) 400 dense_1[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_2 (BatchNor (None, 100) 400 dense_2[0][0] \n", "__________________________________________________________________________________________________\n", "activation_1 (Activation) (None, 100) 0 batch_normalization_1[0][0] \n", "__________________________________________________________________________________________________\n", "activation_2 (Activation) (None, 100) 0 batch_normalization_2[0][0] \n", "__________________________________________________________________________________________________\n", "lambda_1 (Lambda) (None, 100) 0 activation_1[0][0] \n", " activation_2[0][0] \n", "__________________________________________________________________________________________________\n", "dense_3 (Dense) (None, 5000) 505000 lambda_1[0][0] \n", "__________________________________________________________________________________________________\n", "custom_variational_layer_1 (Cus [(None, 5000), (None 0 input_1[0][0] \n", " dense_3[0][0] \n", "==================================================================================================\n", "Total params: 1,506,000\n", "Trainable params: 1,505,600\n", "Non-trainable params: 400\n", "__________________________________________________________________________________________________\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/gway/anaconda3/envs/tybalt/lib/python3.5/site-packages/ipykernel/__main__.py:4: UserWarning: Output \"custom_variational_layer_1\" missing from loss dictionary. We assume this was done on purpose, and we will not be expecting any data to be passed to \"custom_variational_layer_1\" during training.\n" ] } ], "source": [ "adam = optimizers.Adam(lr=learning_rate)\n", "vae_layer = CustomVariationalLayer()([rnaseq_input, rnaseq_reconstruct])\n", "vae = Model(rnaseq_input, vae_layer)\n", "vae.compile(optimizer=adam, loss=None, loss_weights=[beta])\n", "\n", "vae.summary()" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "G\n", "\n", "\n", "139838144235112\n", "\n", "input_1: InputLayer\n", "\n", "\n", "139838144235168\n", "\n", "dense_1: Dense\n", "\n", "\n", "139838144235112->139838144235168\n", "\n", "\n", "\n", "\n", "139838144235952\n", "\n", "dense_2: Dense\n", "\n", "\n", "139838144235112->139838144235952\n", "\n", "\n", "\n", "\n", "139838143272776\n", "\n", "custom_variational_layer_1: CustomVariationalLayer\n", "\n", "\n", "139838144235112->139838143272776\n", "\n", "\n", "\n", "\n", "139838144235728\n", "\n", "batch_normalization_1: BatchNormalization\n", "\n", "\n", "139838144235168->139838144235728\n", "\n", "\n", "\n", "\n", "139838144235672\n", "\n", "batch_normalization_2: BatchNormalization\n", "\n", "\n", "139838144235952->139838144235672\n", "\n", "\n", "\n", "\n", "139838144236008\n", "\n", "activation_1: Activation\n", "\n", "\n", "139838144235728->139838144236008\n", "\n", "\n", "\n", "\n", "139838053071168\n", "\n", "activation_2: Activation\n", "\n", "\n", "139838144235672->139838053071168\n", "\n", "\n", "\n", "\n", "139838053071224\n", "\n", "lambda_1: Lambda\n", "\n", "\n", "139838144236008->139838053071224\n", "\n", "\n", "\n", "\n", "139838053071168->139838053071224\n", "\n", "\n", "\n", "\n", "139838144989392\n", "\n", "dense_3: Dense\n", "\n", "\n", "139838053071224->139838144989392\n", "\n", "\n", "\n", "\n", "139838144989392->139838143272776\n", "\n", "\n", "\n", "\n", "" ], "text/plain": [ "" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Visualize the connections of the custom VAE model\n", "output_model_file = os.path.join('figures', 'onehidden_vae_architecture.png')\n", "plot_model(vae, to_file=output_model_file)\n", "\n", "SVG(model_to_dot(vae).create(prog='dot', format='svg'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Train the model\n", "\n", "The training data is shuffled after every epoch and 10% of the data is heldout for calculating validation loss." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "32eaf8105c054fe29c7e169001f7391a" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "cfff123fe9214f5e93045dbd132ee89a" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "084aae2a0cdc42bc9651b9fe6e3a4389" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "5bc6ded663ae4b1bbe60e08a3fca0183" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "2313a2be37a548ceb4a540a06bdcdd9d" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "a55bd69ac6324059be14f1a85e9be5cd" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "fab18df7a8c9469a8151b56d5b94d0ea" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "8be0d3b732a046058ea25d5da1987756" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "67a7b8a7dafc4989948c7f29eb664f2e" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "b9b92de5cbfb47129b55935d3993200a" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "9f216e3711f64ea3b49fba5080fa4974" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "94953cafa07c4df788e10aa2c672c7d5" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "c522618c228b42dc924e29b7ad02c1a3" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "e77ffbaae3b14aa69f95f12c167b4fad" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "ba1faf6668f2479e850543b5713fec74" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "6afbe62e1de34e8da03330098e8a92f5" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "4d66d4a8749c4b95bf0d529871502c0c" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "8d23d51725ba4a72829cb2cf2cd3b160" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "66892cb856214933b6cba9d0bd5466bb" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "62206b37b34c4a3fbda5afc9cc268f41" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "ddb7fea9d8e84a5fa513ba0860f41a39" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "a1357e2c48f94a1497067f49d8c6449e" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "f493acbb35fc43509ddf292c9dafbef0" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "f2cd21f8848d4615af9e9a5327e91483" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "ab4eaeb2562d4923abb78513c27b5a0e" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "b2f826d6b05142398e076648e323102a" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "48304224df8547f0bf7bac17214f8a7e" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "f5bddc574ca74aab8bae32c63d71bd48" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "2ff4197bd1a145a4be17c94e7ac3cd01" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "bd8f852bf3f84d0bb8350bae7f1adb8a" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "fb8500353ea04b0fb3b586896f546d27" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "7cf8ea29afa147edb1667993fef0474c" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "d766fba954174efb928c020d503f6d1f" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "5582c58bb4874fe88f078a8a8c7b12e4" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "9582462a42d94bde90cb74002ebb5830" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "0250c18f5b604757a6498cc04c2aa02f" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "22605e04210b4eff87c7eb05eef62738" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "b13f543eb8634c298f1ae7808014fb96" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "5b16d05a91e6455cb2ff459e4b5da224" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "84d5356019594df9b83542b2b5c5ef2d" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "4549598c4f7e4ac49db7d3919c195cee" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "f8eb61ade6234285b6e0989919da7f46" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "68aa9b8711934d8a851308342b501fb3" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "e40fc964a8c047fbb99ad5dcbf9fe6bf" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "a2dcf5b28f48415e9507b3061616e00b" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "faacf926d6f74100a755d4b13a9076a6" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "3d163ca517a0466586fa1babcacd1693" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "da0144ba7e5f462497f3799ba6af59a5" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "1ab15a38b4f34cc294691ab58062655d" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "62dbeefe5f8845ac8efea116a8e7c409" } }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "9eec6dc240f24dcdbf3ab103d9f261b4" } }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "CPU times: user 12min 51s, sys: 1min 34s, total: 14min 25s\n", "Wall time: 5min 16s\n" ] } ], "source": [ "%%time\n", "hist = vae.fit(np.array(rnaseq_train_df),\n", " shuffle=True,\n", " epochs=epochs,\n", " verbose=0,\n", " batch_size=batch_size,\n", " validation_data=(np.array(rnaseq_test_df), None),\n", " callbacks=[WarmUpCallback(beta, kappa),\n", " TQDMNotebookCallback(leave_inner=True, leave_outer=True)])" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/png": "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vPNO27F27dpx/Pjxm1hezactrkVExBlUOTDUqlXLNlcBYOvWrRgMBtq0afPfi7m42HaYlKqxuLtq4SYREXF4VZ70GB4ezvfff8+5c+cwGo0sX76cVq1a4e3tbRtz/PhxAgMDb0mhNZXF3aSFm0RExOFVucPwxBNPcPr0aXr06EHPnj3JzMzkscces50vKytj27ZtREZG3pJCayrPnzsMWj9LREQcWZU7DH379uXll19m4cKFANx3333079/fdn7jxo3k5eXRpUuXm19lDebhbqK83EpRSRnuZofYPFREROQS1/UbavDgwQwePPiy57p160ZycvJNKep24vmLLa4VGERExFFpWUY70xbXIiLiDKocGPbu3cvnn3/OhQsXbMcKCgp46aWXiI2NpWfPnsyfP/+WFFmTWX7RYRAREXFUVQ4Ms2fP5u2338bLy8t2bPr06SxevJiioiKysrKIi4tj48aNt6TQmkodBhERcQZVDgy7du0iNjYWg8EAQGlpKV999RVRUVH8+OOPrFq1Cl9fXz766KNbVmxNdLHDoLUYRETEkVU5MGRlZVG3bl3bzykpKeTm5vLII4/g4eFB3bp16dOnD6mpqbek0JrqYodBazGIiIgju65Jj+Xl5ba/b9u2DYPBQGxsrO1YQEAA2dnZN6+624DJ1QWzq4s6DCIi4tCqHBhCQkLYsWOH7ec1a9ZQp04d6tevbzt2+vRpfHx8bm6FtwGLNqASEREHV+UX//v168fMmTN54YUXcHNzIykpiccff7zSmP379xMWFnbTi6zptAGViIg4uioHhieffJK1a9fy9ddfA9C0aVOGDx9uO5+WlkZKSgpPP/30za+yhqsIDOowiIiI46pyYPDy8mLhwoXs2bMHqAgMRqPRdt5sNvPmm2/SunXrm19lDVfxSEIdBhERcVzXvRZx8+bNL3s8LCxMjyNukDoMIiLi6G5o84Lt27eze/duLly4gJeXFy1btiQ6Ovpm13bbsLibOHsh195liIiIXNF1BYY9e/YwevRoDhw4AIDVarUt5NS4cWOmTp1KixYtbn6VNZzl5y2uRUREHFWVA8OxY8f4wx/+wPnz54mOjiY2NpbatWtz+vRpNm/ezPbt23nyySf58ssvK71qKf+VW5SHl5vnJcct7iYt3CQiIg6tyoFh5syZXLhwgddee4177733kvMJCQmMGjWK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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Visualize training performance\n", "history_df = pd.DataFrame(hist.history)\n", "hist_plot_file = os.path.join('figures', 'onehidden_vae_training.pdf')\n", "ax = history_df.plot()\n", "ax.set_xlabel('Epochs')\n", "ax.set_ylabel('VAE Loss')\n", "fig = ax.get_figure()\n", "fig.savefig(hist_plot_file)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Compile and output trained models\n", "\n", "We are interested in:\n", "\n", "1. The model to encode/compress the input gene expression data\n", " * Can be possibly used to compress other tumors\n", "2. The model to decode/decompress the latent space back into gene expression space\n", " * This is our generative model\n", "3. The latent space compression of all pan cancer TCGA samples\n", " * Non-linear reduced dimension representation of tumors can be used as features for various tasks\n", " * Supervised learning tasks predicting specific gene inactivation events\n", " * Interpolating across this space to observe how gene expression changes between two cancer states\n", "4. The weights used to compress each latent node\n", " * Potentially indicate learned biology differentially activating tumors" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Encoder model" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "# Model to compress input\n", "encoder = Model(rnaseq_input, z_mean_encoded)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "# Encode rnaseq into the hidden/latent representation - and save output\n", "encoded_rnaseq_df = encoder.predict_on_batch(rnaseq_df)\n", "encoded_rnaseq_df = pd.DataFrame(encoded_rnaseq_df, index=rnaseq_df.index)\n", "\n", "encoded_rnaseq_df.columns.name = 'sample_id'\n", "encoded_rnaseq_df.columns = encoded_rnaseq_df.columns + 1\n", "encoded_file = os.path.join('data', 'encoded_rnaseq_onehidden_warmup_batchnorm.tsv')\n", "encoded_rnaseq_df.to_csv(encoded_file, sep='\\t')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Decoder (generative) model" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "# build a generator that can sample from the learned distribution\n", "decoder_input = Input(shape=(latent_dim, )) # can generate from any sampled z vector\n", "_x_decoded_mean = decoder_to_reconstruct(decoder_input)\n", "decoder = Model(decoder_input, _x_decoded_mean)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Save the encoder/decoder models for future investigation" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "encoder_model_file = os.path.join('models', 'encoder_onehidden_vae.hdf5')\n", "decoder_model_file = os.path.join('models', 'decoder_onehidden_vae.hdf5')\n", "\n", "encoder.save(encoder_model_file)\n", "decoder.save(decoder_model_file)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Model Interpretation - Sanity Check\n", "\n", "\n", "### Observe the distribution of node activations.\n", "\n", "We want to ensure that the model is learning a distribution of feature activations, and not zeroing out features." ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "sample_id\n", "82 29584.533203\n", "5 29578.066406\n", "28 24349.054688\n", "16 24086.214844\n", "6 24084.980469\n", "63 23750.429688\n", "8 23380.603516\n", "57 23047.580078\n", "87 23010.695312\n", "37 22798.029297\n", "dtype: float32\n" ] }, { "data": { "text/plain": [ "sample_id\n", "91 14282.995117\n", "45 14082.565430\n", "34 13749.231445\n", "18 13509.525391\n", "97 13373.916992\n", "32 13035.963867\n", "92 12693.304688\n", "2 12593.957031\n", "20 11392.033203\n", "4 10859.074219\n", "dtype: float32" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# What are the most and least activated nodes\n", "sum_node_activity = encoded_rnaseq_df.sum(axis=0).sort_values(ascending=False)\n", "\n", "# Top 10 most active nodes\n", "print(sum_node_activity.head(10))\n", "\n", "# Bottom 10 least active nodes\n", "sum_node_activity.tail(10)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Histogram of node activity for all 100 latent features\n", "sum_node_activity.hist()\n", "plt.xlabel('Activation Sum')\n", "plt.ylabel('Count');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What does an example distribution of two latent features look like?" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Example of node activation distribution for the first two latent features\n", "plt.figure(figsize=(6, 6))\n", "plt.scatter(encoded_rnaseq_df.iloc[:, 1], encoded_rnaseq_df.iloc[:, 2])\n", "plt.xlabel('Latent Feature 1')\n", "plt.xlabel('Latent Feature 2');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Observe reconstruction fidelity" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "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", " \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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
RPS4Y1XISTKRT5AGR2CEACAM5KRT6AKRT14CEACAM6DDX3YKDM5D...FAM129AC8orf48CDK5R1FAM81AC13orf18GDPD3SMAGPC2orf85POU5F1BCHST2
TCGA-02-0047-010.6916380.1965290.1942040.0357440.0277840.0556220.0642140.0430930.7219250.690764...0.4513670.4861860.7884870.6800680.5751400.3246110.3855450.6058590.2101920.644549
TCGA-02-0055-010.0991890.5924600.1886170.1066640.0440370.1006980.1157200.0695240.0756630.055188...0.5645060.5190690.6466980.5904750.6243370.3857870.5701500.2462590.1817080.649352
\n", "

2 rows × 5000 columns

\n", "
" ], "text/plain": [ " RPS4Y1 XIST KRT5 AGR2 CEACAM5 KRT6A \\\n", "TCGA-02-0047-01 0.691638 0.196529 0.194204 0.035744 0.027784 0.055622 \n", "TCGA-02-0055-01 0.099189 0.592460 0.188617 0.106664 0.044037 0.100698 \n", "\n", " KRT14 CEACAM6 DDX3Y KDM5D ... FAM129A \\\n", "TCGA-02-0047-01 0.064214 0.043093 0.721925 0.690764 ... 0.451367 \n", "TCGA-02-0055-01 0.115720 0.069524 0.075663 0.055188 ... 0.564506 \n", "\n", " C8orf48 CDK5R1 FAM81A C13orf18 GDPD3 SMAGP \\\n", "TCGA-02-0047-01 0.486186 0.788487 0.680068 0.575140 0.324611 0.385545 \n", "TCGA-02-0055-01 0.519069 0.646698 0.590475 0.624337 0.385787 0.570150 \n", "\n", " C2orf85 POU5F1B CHST2 \n", "TCGA-02-0047-01 0.605859 0.210192 0.644549 \n", "TCGA-02-0055-01 0.246259 0.181708 0.649352 \n", "\n", "[2 rows x 5000 columns]" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# How well does the model reconstruct the input RNAseq data\n", "input_rnaseq_reconstruct = decoder.predict(np.array(encoded_rnaseq_df))\n", "input_rnaseq_reconstruct = pd.DataFrame(input_rnaseq_reconstruct, index=rnaseq_df.index,\n", " columns=rnaseq_df.columns)\n", "input_rnaseq_reconstruct.head(2)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "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", " \n", " \n", " \n", "
gene meangene abs(sum)
PPAN-P2RY11-0.0203640.230511
GSTT10.0247100.229753
GSTM10.0056500.216558
TBC1D3G-0.0103980.194532
RPS280.0122420.176380
\n", "
" ], "text/plain": [ " gene mean gene abs(sum)\n", "PPAN-P2RY11 -0.020364 0.230511\n", "GSTT1 0.024710 0.229753\n", "GSTM1 0.005650 0.216558\n", "TBC1D3G -0.010398 0.194532\n", "RPS28 0.012242 0.176380" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "reconstruction_fidelity = rnaseq_df - input_rnaseq_reconstruct\n", "\n", "gene_mean = reconstruction_fidelity.mean(axis=0)\n", "gene_abssum = reconstruction_fidelity.abs().sum(axis=0).divide(rnaseq_df.shape[0])\n", "gene_summary = pd.DataFrame([gene_mean, gene_abssum], index=['gene mean', 'gene abs(sum)']).T\n", "gene_summary.sort_values(by='gene abs(sum)', ascending=False).head()" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Mean of gene reconstruction vs. absolute reconstructed difference per sample\n", "g = sns.jointplot('gene mean', 'gene abs(sum)', data=gene_summary, stat_func=None);" ] } ], "metadata": { "kernelspec": { "display_name": "Python [conda env:tybalt]", "language": "python", "name": "conda-env-tybalt-py" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.5" } }, "nbformat": 4, "nbformat_minor": 1 }