{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# TPI-DeepTDA: Chignolin mini-protein" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Reference paper: _Ray, Trizio and Parrinello, [JCP](https://pubs.aip.org/aip/jcp/article/158/20/204102/2891484) (2023)_ [[arXiv]](https://arxiv.org/abs/2303.01629).\n", "\n", "Prerequisite: DeepTDA tutorial.\n", "\n", "[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/luigibonati/mlcolvar/blob/main/docs/notebooks/examples/ex_TPI-DeepTDA.ipynb)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Setup" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Colab setup\n", "import os\n", "\n", "if os.getenv(\"COLAB_RELEASE_TAG\"):\n", " import subprocess\n", " subprocess.run('wget https://raw.githubusercontent.com/luigibonati/mlcolvar/main/colab_setup.sh', shell=True)\n", " cmd = subprocess.run('bash colab_setup.sh EXAMPLE', shell=True, stdout=subprocess.PIPE)\n", " print(cmd.stdout.decode('utf-8'))\n", "\n", "# IMPORT PACKAGES\n", "import torch\n", "import lightning\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "# Set seed for reproducibility\n", "torch.manual_seed(42)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Chignolin protein" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "We first train a DeepTDA CV on the chignolin data, which is one of the examples of the [TPI-Deep-TDA paper](https://pubs.aip.org/aip/jcp/article/158/20/204102/2891484). \n", "This is a small protein often used for testing as it prvide a simple example of folding dynamics in protein. Indeed, chignolin in water presents two metastable states, folded and unfolded, and the interconversion between them involves several degrees of freedom. \n", "\n", "\n", "\n", "Image credits: Narjes Ansari" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Deep-TDA" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will use the folding of Chignolin protein as an example for the application of TPI-Deep-TDA as presented in [TPI-Deep-TDA paper](https://pubs.aip.org/aip/jcp/article/158/20/204102/2891484). As descriptors we will use the contacts between the $\\alpha$-carbon of the protein chain." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/etrizio@iit.local/Bin/miniconda3/envs/mlcvs_test/lib/python3.10/site-packages/tqdm/auto.py:22: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", " from .autonotebook import tqdm as notebook_tqdm\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Class 0 dataframe shape: (5000, 47)\n", "Class 1 dataframe shape: (5000, 47)\n", "\n", " - Loaded dataframe (10000, 47): ['cont1', 'cont2', 'cont3', 'cont4', 'cont5', 'cont6', 'cont7', 'cont8', 'cont9', 'cont10', 'cont11', 'cont12', 'cont13', 'cont14', 'cont15', 'cont16', 'cont17', 'cont18', 'cont19', 'cont20', 'cont21', 'cont22', 'cont23', 'cont24', 'cont25', 'cont26', 'cont27', 'cont28', 'cont29', 'cont30', 'cont31', 'cont32', 'cont33', 'cont34', 'cont35', 'cont36', 'cont37', 'cont38', 'cont39', 'cont40', 'cont41', 'cont42', 'cont43', 'cont44', 'cont45', 'walker', 'labels']\n", " - Descriptors (10000, 45): ['cont1', 'cont2', 'cont3', 'cont4', 'cont5', 'cont6', 'cont7', 'cont8', 'cont9', 'cont10', 'cont11', 'cont12', 'cont13', 'cont14', 'cont15', 'cont16', 'cont17', 'cont18', 'cont19', 'cont20', 'cont21', 'cont22', 'cont23', 'cont24', 'cont25', 'cont26', 'cont27', 'cont28', 'cont29', 'cont30', 'cont31', 'cont32', 'cont33', 'cont34', 'cont35', 'cont36', 'cont37', 'cont38', 'cont39', 'cont40', 'cont41', 'cont42', 'cont43', 'cont44', 'cont45']\n" ] } ], "source": [ "from mlcolvar.io import create_dataset_from_files\n", "from mlcolvar.data import DictModule\n", "\n", "filenames = [ \"https://raw.githubusercontent.com/dhimanray/TPI_deepTDA/main/chignolin/training/folded/contacts_folded_25000\", \n", " \"https://raw.githubusercontent.com/dhimanray/TPI_deepTDA/main/chignolin/training/unfolded/contacts_unfolded_25000\"]\n", "\n", "n_states = len(filenames)\n", "\n", "# load dataset\n", "# here we only load part of the data to speed up the training, change stop to 25000 and stride to 1 to use them all for better results\n", "dataset, df = create_dataset_from_files(filenames,\n", " create_labels=True,\n", " return_dataframe=True,\n", " filter_args={'regex':'cont' }, # select distances between heavy atoms\n", " stop=10000,\n", " stride=2)\n", "\n", "datamodule = DictModule(dataset,lengths=[0.8,0.2])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Model\n", "Here we use as target a series of three consecutive Gaussians, the second one will be broader as it is related to the TPE data " ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from mlcolvar.cvs import DeepTDA\n", "\n", "n_cvs = 1\n", "target_centers = [-7,7]\n", "target_sigmas = [0.2, 0.2]\n", "nn_layers = [45,24,12,1]\n", "# MODEL\n", "model = DeepTDA(n_states=n_states, n_cvs=1,target_centers=target_centers, target_sigmas=target_sigmas, model=nn_layers)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We initialize the `lightining.Trainer` and `Fit` the model." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "GPU available: True (cuda), used: True\n", "TPU available: False, using: 0 TPU cores\n", "IPU available: False, using: 0 IPUs\n", "HPU available: False, using: 0 HPUs\n", "Missing logger folder: /home/etrizio@iit.local/Bin/dev/mlcolvar/docs/notebooks/examples/lightning_logs\n", "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", "\n", " | Name | Type | Params | In sizes | Out sizes\n", "-----------------------------------------------------------------\n", "0 | loss_fn | TDALoss | 0 | ? | ? \n", "1 | norm_in | Normalization | 0 | [45] | [45] \n", "2 | nn | FeedForward | 1.4 K | [45] | [1] \n", "-----------------------------------------------------------------\n", "1.4 K Trainable params\n", "0 Non-trainable params\n", "1.4 K Total params\n", "0.006 Total estimated model params size (MB)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " " ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/etrizio@iit.local/Bin/miniconda3/envs/mlcvs_test/lib/python3.10/site-packages/lightning/pytorch/loops/fit_loop.py:280: PossibleUserWarning: The number of training batches (1) is smaller than the logging interval Trainer(log_every_n_steps=50). Set a lower value for log_every_n_steps if you want to see logs for the training epoch.\n", " rank_zero_warn(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 499: 100%|██████████| 1/1 [00:00<00:00, 22.68it/s, v_num=0]" ] }, { "name": "stderr", "output_type": "stream", "text": [ "`Trainer.fit` stopped: `max_epochs=500` reached.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 499: 100%|██████████| 1/1 [00:00<00:00, 21.80it/s, v_num=0]\n" ] } ], "source": [ "from mlcolvar.utils.trainer import MetricsCallback\n", "\n", "# define callbacks\n", "metrics = MetricsCallback()\n", "\n", "# define trainer\n", "# for better results we can also increase the number of epochs or use a early_stopping\n", "trainer = lightning.Trainer(callbacks=[metrics],\n", " max_epochs=500, logger=None, enable_checkpointing=False)\n", "\n", "# fit\n", "trainer.fit( model, datamodule )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Learning curve" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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JLj7SAD62n7moy++trgaEbnSTNMkJyfnorYtX748vr6+V7giKUwKz4JSuSkpNXphM0w67pvCb7uOWV2RSJFkmiZpWTmFvpimedE1Dh48mGXLlvHqq69iGAaGYfD+++9jGAbff/89TZs2xeFwsHz5cv766y9uuOEGQkND8ff3p1mzZixZsiTP+/37sK1hGLzzzjv06dMHX19foqKiWLhw4SX36bx586hfvz4Oh4OIiAgmTpyYZ/0bb7xBVFQU3t7ehIaG0q9fP/e6zz77jOjoaHx8fAgJCaFz586cPHnyoj53xowZ1K1bF29vb+rUqcMbb7zhXnfqkOrcuXNp1aoV3t7e1K9fn59++inPeyxbtozmzZvjcDioWLEijz/+eJ4/SpxOJy+++CI1a9bE4XBQtWpVnn/++TzvsWvXLjp27Iivry8xMTH8+uuvF9t1l8zSw7Y///wzL730EuvWrePQoUMsWLCA3r17u9ebpsmYMWN46623OHHiBC1atOD111+nfv367m0yMzN55JFHmDNnDunp6XTq1Ik33njjghOZXgkB1z5LzpRvaWffxOjPZ9Fs+IPYbBee2kakNEnPzqXe098X+uduHdsNX6+L+5X36quvsmPHDho0aMDYsWMB2LJlCwCPPfYYL7/8MtWrV6dMmTLs37+fnj178txzz+Ht7c3MmTPp1asX27dvp2rVquf8jDFjxjBhwgReeuklpkyZwsCBA9m7dy/BwcH5+l7r1q3j5ptvZvTo0dxyyy2sXLmSoUOHEhISwuDBg1m7di0PPvggH374Ia1ateL48eMsX74cgEOHDtG/f38mTJhAnz59SElJYfny5Rf1h8bbb7/NM888w9SpU2nUqBEbNmzgP//5D35+fgwaNMi93aOPPsrkyZOpV68ekyZN4vrrr2f37t2EhIRw4MABevbsyeDBg/nggw/4448/+M9//oO3tzejR48GYOTIkbz99tu88sortGnThkOHDvHHH3/kqWXUqFG8/PLLREVFMWrUKPr378+ff/6Jh8eVizhL9zxPnjxJTEwMU6dOPev6CRMmMGnSJKZOncqaNWsICwujS5cupKSkuLcZPnw4CxYsYO7cufzyyy+kpqZy3XXXkZubW1hf4x/BkWQ1vguAWxLf5uuN+wu/BhG5bEFBQXh5eeHr60tYWBhhYWHY7XYAxo4dS5cuXahRowYhISHExMRw7733Eh0dTVRUFM899xzVq1e/4J7k4MGD6d+/PzVr1mTcuHGcPHmS1atX57vWSZMm0alTJ5566ilq1arF4MGDGTZsGC+99BIA+/btw8/Pj+uuu45q1arRqFEjHnzwQcAVnjk5OfTt25eIiAiio6MZOnQo/v4Xvmbj2WefZeLEifTt25fIyEj69u3Lf//7X95888082w0bNowbb7yRunXrMm3aNIKCgnj33XcB1x5xlSpVmDp1KnXq1KF3796MGTOGiRMn4nQ6SUlJ4dVXX2XChAkMGjSIGjVq0KZNG+6+++48n/HII49w7bXXUqtWLcaMGcPevXv5888/892X+WHpnmePHj3o0aPHWdeZpsnkyZMZNWoUffv2BWDmzJmEhoYye/Zs7r33XpKSknj33Xf58MMP6dy5MwCzZs2iSpUqLFmyhG7duhXadznFt9PjZMTOpi5xLPzubXo2HINde58ibj6edraOLfz/N3087QXyPk2bNs3z/OTJk4wZM4avvvqKgwcPkpOTQ3p6Ovv27Tvv+zRs2ND92M/Pj4CAABISEvJdz7Zt27jhhhvytLVu3ZrJkyeTm5tLly5dqFatGtWrV6d79+50797dfbg4JiaGTp06ER0dTbdu3ejatSv9+vWjbNmy5/3MI0eOEBcXx1133cV//vMfd3tOTg5BQUF5tm3ZsqX7sYeHB02bNmXbtm3u2lu2bJln8unWrVuTmprK/v37iY+PJzMzk06dOp23ntP7smLFigAkJCRQp06d877uchTZc567d+8mPj6erl27utscDgft27dn5cqVgOtwRXZ2dp5twsPDadCggXubs8nMzCQ5OTnPUmB8gzHa/heAW9LmsnD9noJ7b5ESwDAMfL08Cn05/Rf05fj3VbOPPvoo8+bN4/nnn2f58uXExsYSHR1NVlbWed/H09PzjH5xOp35rsc0zTO+2+mHXQMCAli/fj1z5syhYsWKPP3008TExJCYmIjdbmfx4sV8++231KtXjylTplC7dm1279593s88Vefbb79NbGyse9m8eTOrVq26YM2n6j1f7YZh4OPjc+EOIG9fnnq/S+nL/Ciy4RkfHw9AaGhonvbQ0FD3uvj4eLy8vM74K+n0bc5m/PjxBAUFuZcqVaoUaO2OVkNI8yxLhO0wOxa9Q3bulf0hikjB8/LyuqjTP8uXL2fw4MH0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v0mbY5+xaf9goisHWV2ViPwtODiY7t27M3v2bHd4fvrppwQHB9OpUyfsdjsxMTHu7Z977jkWLFjAwoULGTZs2AXf/6OPPiI3N5f33nsPX19f6tevz/79+7nvvvsuqd5JkybRqVMnnnrqKQBq1arF1q1beemllxg8eDD79u3Dz8+P6667joCAAKpVq+aekOPQoUPk5OTQt29fqlWrBkB0dPQl1VGaKDwt4tvmPpzr36K9fSMTflpG9K3XW12SSOHw9HXtBVrxufkwcOBA7rnnHt544w0cDgcfffQR//d//4fdbufkyZOMGTOGr776ioMHD5KTk0N6evo5J8z+t23bthETE4Ov7z81tWzZMl/1/fv9brjhhjxtrVu3ZvLkyeTm5tKlSxeqVatG9erV6d69O927d6dPnz74+voSExNDp06diI6Oplu3bnTt2pV+/fpRtmzZS66nNNA5T6sER5Jc1TXnaKUdH3DiZJbFBYkUEsNwHT4t7MXI32xGvXr1wul08vXXXxMXF8fy5cu59dZbAXj00UeZN28ezz//PMuXLyc2Npbo6Giysi7u/+OCPiRqmibGv77f6Z8REBDA+vXrmTNnDhUrVuTpp58mJiaGxMRE7HY7ixcv5ttvv6VevXpMmTKF2rVrs3v37gKtsaRReFro1G0rfYyfWfDrFourEZHT+fj40LdvXz766CPmzJlDrVq1aNKkCQDLly9n8ODB9OnTh+joaMLCwtizZ89Fv3e9evX4/fffSU9Pd7etWrXqkmutV68ev/ySd+CVlStXUqtWLffcxh4eHnTu3JkJEyawceNG9uzZw48//gi4LmZq3bo1Y8aMYcOGDXh5ebFgwYJLrqc0UHhayIhsT2JAFL5GJmmrZpDr1Al6kaJk4MCBfP3117z33nvuvU6AmjVrMn/+fGJjY/n9998ZMGDAGVfmns+AAQOw2WzcddddbN26lW+++YaXX375kut8+OGH+eGHH3j22WfZsWMHM2fOZOrUqTzyyCMAfPXVV7z22mvExsayd+9ePvjgA5xOJ7Vr1+a3335j3LhxrF27ln379jF//nyOHDlC3bp1L7me0kDhaSXDwK/t/QDckPUNS7fqthWRouSaa64hODiY7du3M2DAAHf7K6+8QtmyZWnVqhW9evWiW7duNG7c+KLf19/fny+//JKtW7fSqFEjRo0axYsvvnjJ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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from mlcolvar.utils.plot import plot_metrics\n", "\n", "ax = plot_metrics(metrics.metrics, \n", " keys=['train_loss_epoch','valid_loss'],\n", " #linestyles=['-.','-'], colors=['fessa1','fessa5'],\n", " yscale='linear')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Analysis of the CV" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The histogram of the training data along th CVs should match the target distribution " ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig,ax = plt.subplots( 1, 1, figsize=(5,4) )\n", "\n", "X = dataset[:]['data']\n", "Y = dataset[:]['labels']\n", "\n", "with torch.no_grad():\n", " s = model(torch.Tensor(X)).numpy()\n", " \n", "for i in range(n_states):\n", " s_red = s[torch.nonzero(Y==i, as_tuple=True)]\n", " ax.hist(s_red[:,0],bins=100, label=f'State {i}')\n", "\n", "ax.set_xlabel(f'CV')\n", "ax.set_ylabel('Histogram')\n", "ax.set_title('DeepTDA')\n", "plt.legend()\n", "plt.show()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Transition State Informed Deep-TDA (TPI-DeepTDA)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "We will now try to imporve our CV using the TPI-Deep-TDA method, as presented in [TPI-Deep-TDA paper](https://pubs.aip.org/aip/jcp/article/158/20/204102/2891484). As descriptors we will again use the contacts between the $\\alpha$-carbon of the protein chain.\n", "The data from the trasition path ensemble was collected by running a series of OPES-Flooding simualtions biasing a Deep-TDA CV as the one trained above." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Class 0 dataframe shape: (5000, 47)\n", "Class 1 dataframe shape: (5000, 47)\n", "Class 2 dataframe shape: (5000, 47)\n", "\n", " - Loaded dataframe (15000, 47): ['cont1', 'cont2', 'cont3', 'cont4', 'cont5', 'cont6', 'cont7', 'cont8', 'cont9', 'cont10', 'cont11', 'cont12', 'cont13', 'cont14', 'cont15', 'cont16', 'cont17', 'cont18', 'cont19', 'cont20', 'cont21', 'cont22', 'cont23', 'cont24', 'cont25', 'cont26', 'cont27', 'cont28', 'cont29', 'cont30', 'cont31', 'cont32', 'cont33', 'cont34', 'cont35', 'cont36', 'cont37', 'cont38', 'cont39', 'cont40', 'cont41', 'cont42', 'cont43', 'cont44', 'cont45', 'walker', 'labels']\n", " - Descriptors (15000, 45): ['cont1', 'cont2', 'cont3', 'cont4', 'cont5', 'cont6', 'cont7', 'cont8', 'cont9', 'cont10', 'cont11', 'cont12', 'cont13', 'cont14', 'cont15', 'cont16', 'cont17', 'cont18', 'cont19', 'cont20', 'cont21', 'cont22', 'cont23', 'cont24', 'cont25', 'cont26', 'cont27', 'cont28', 'cont29', 'cont30', 'cont31', 'cont32', 'cont33', 'cont34', 'cont35', 'cont36', 'cont37', 'cont38', 'cont39', 'cont40', 'cont41', 'cont42', 'cont43', 'cont44', 'cont45']\n" ] } ], "source": [ "from mlcolvar.io import create_dataset_from_files\n", "from mlcolvar.data import DictModule\n", "\n", "filenames = [ \"https://raw.githubusercontent.com/dhimanray/TPI_deepTDA/main/chignolin/training/folded/contacts_folded_25000\", \n", " \"https://raw.githubusercontent.com/dhimanray/TPI_deepTDA/main/chignolin/training/flooding/Contact_CV/contacts_ts_data\",\n", " \"https://raw.githubusercontent.com/dhimanray/TPI_deepTDA/main/chignolin/training/unfolded/contacts_unfolded_25000\"]\n", "\n", "n_states = len(filenames)\n", "\n", "# load dataset\n", "# here we only load part of the data to speed up the training, change stop to 25000 and stride to 1 to use them all for better results\n", "dataset, df = create_dataset_from_files(filenames,\n", " create_labels=True,\n", " return_dataframe=True,\n", " filter_args={'regex':'cont' }, # select distances between heavy atoms\n", " stop=10000,\n", " stride=2)\n", "\n", "datamodule = DictModule(dataset,lengths=[0.8,0.2])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Model\n", "Here we use as target a series of three consecutive Gaussians, the second one will be broader as it is related to the TPE data " ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "from mlcolvar.cvs import DeepTDA\n", "\n", "n_cvs = 1\n", "target_centers = [-7,0,7]\n", "target_sigmas = [0.2, 1.5, 0.2]\n", "nn_layers = [45,24,12,1]\n", "# MODEL\n", "model = DeepTDA(n_states=n_states, n_cvs=1,target_centers=target_centers, target_sigmas=target_sigmas, model=nn_layers)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We initialize the `lightining.Trainer` and `Fit` the model." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "GPU available: True (cuda), used: True\n", "TPU available: False, using: 0 TPU cores\n", "IPU available: False, using: 0 IPUs\n", "HPU available: False, using: 0 HPUs\n", "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", "\n", " | Name | Type | Params | In sizes | Out sizes\n", "-----------------------------------------------------------------\n", "0 | loss_fn | TDALoss | 0 | ? | ? \n", "1 | norm_in | Normalization | 0 | [45] | [45] \n", "2 | nn | FeedForward | 1.4 K | [45] | [1] \n", "-----------------------------------------------------------------\n", "1.4 K Trainable params\n", "0 Non-trainable params\n", "1.4 K Total params\n", "0.006 Total estimated model params size (MB)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " " ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/etrizio@iit.local/Bin/miniconda3/envs/mlcvs_test/lib/python3.10/site-packages/lightning/pytorch/loops/fit_loop.py:280: PossibleUserWarning: The number of training batches (1) is smaller than the logging interval Trainer(log_every_n_steps=50). Set a lower value for log_every_n_steps if you want to see logs for the training epoch.\n", " rank_zero_warn(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 499: 100%|██████████| 1/1 [00:00<00:00, 23.01it/s, v_num=1] " ] }, { "name": "stderr", "output_type": "stream", "text": [ "`Trainer.fit` stopped: `max_epochs=500` reached.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 499: 100%|██████████| 1/1 [00:00<00:00, 22.00it/s, v_num=1]\n" ] } ], "source": [ "from mlcolvar.utils.trainer import MetricsCallback\n", "\n", "# define callbacks\n", "metrics = MetricsCallback()\n", "\n", "# define trainer\n", "# for better results we can also increase the number of epochs or use a early_stopping\n", "trainer = lightning.Trainer(callbacks=[metrics],\n", " max_epochs=500, logger=None, enable_checkpointing=False)\n", "\n", "# fit\n", "trainer.fit( model, datamodule )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Learning curve" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "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pWGxWOjTp88167m0Ly9eqUxPT6dly5bXfN2N0DU8z5w5wwMPPEBqaiomk4m2bduydu1a+vUrD54nnniCwsJCJk2aRGZmJp07d+a7777D19fXto+FCxfi6urK6NGjKSwspE+fPixfvtz2V2JNco/sDJmHCS84SEaehSCf6r00LERdoGlapS+fOiNvb2+7548//jjr1q3j1VdfpVmzZnh6ejJq1CiKi4uvuR83Nze755qmYbU6PtiwojEel1529fX15ZdffmHz5s189913PPfcc8yaNYtdu3bRoEED1q9fz/bt2/nuu+94/fXXmTlzJj/++CNRUVFXfc+Ldb799tt07tzZbltlfvderPdatWuahqen53X3BfZ9eXF/VelLR+h62fbdd98lISEBi8VCeno6GzZssAUnlHfCrFmzSE1NpaioiC1bthATE2O3Dw8PD15//XXOnTtHQUEBX331VbWMnq0K94guALQ3HOOXxExdahBCVA93d/dKTbaydetWxo8fz4gRI4iNjcVsNpOQkHDzC7ygdevWbNu2zW7d9u3bad68uS3IXF1d6du3L/PmzWPfvn0kJCSwceNGoPz3bLdu3Zg9ezZ79uzB3d2d1atXX/M9Q0JCaNSoESdPnqRZs2Z2y+Whu3PnTtvj0tJSdu/ebTsjbN26Ndu3b7cL++3bt+Pr60ujRo2Ijo7G09OT77//vuoddJPU3j//nNGFQUNttXheSzhL/zZmnQsSQlRVZGQkP/74IwkJCfj4+Fz1TKZZs2asWrWKoUOHomkazz777E0/67nU9OnT6dSpEy+88AL33nsvO3bsYPHixbaRr19//TUnT57kzjvvxN/fn2+//Rar1UqLFi348ccf+f777+nfvz/BwcH8+OOPnD17llatWl33fWfNmsWjjz6Kn58fgwYNwmKx8PPPP5OZmcm0adNs7d544w2io6Np1aoVCxcuJDMzk7/85S8ATJo0iUWLFjFlyhQmT57M0aNHef7555k2bRoGgwEPDw+efPJJnnjiCdzd3enWrRtnz57l4MGDTJgw4eZ0aGVVy7QMtVx1zDCklFLKalVFLzZR6nk/9fTry6qlNiGEPo4ePaq6dOmiPD09FaCWLVtW4cw+8fHxqlevXsrT01OFh4erxYsXqx49eqjHHnvM1ubyGYYAtXr1arv9mEwmtWzZsuvWVdEMQ5999plq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PqxevZrWrVvbfpHV135ZuXIlv/zyC7t27bpiW33+b6Zz5868//77NG/enDNnzvDiiy/StWtXDh48qHu/SHhWk8tvZaaUuqHbm9UFVemTutRvkydPZt++fWzbtu2KbfW1b1q0aMHevXvJysri888/Z9y4cWzZssW2vT72S1JSEo899hjfffcdHh4eV21XH/tm0KBBtsexsbHExcVxyy238N5779GlSxdAv36Ry7Y3KCgoCBcXlyv+iklPT7/iL6L64uJouGv1idlspri4mMzMzKu2qc2mTJnCmjVr2LRpk93t7up737i7u9OsWTM6duzI3LlzadeuHa+99lq97pfdu3eTnp5Ohw4dcHV1xdXVlS1btvDPf/4TV1dX27HVx765nLe3N7GxsRw7dkz3/2YkPG+Qu7s7HTp0YP369Xbr169fT9euXXWqSl9RUVGYzWa7PikuLmbLli22PunQoQNubm52bVJTUzlw4ECt7jelFJMnT2bVqlVs3LiRqKgou+31uW8qopTCYrHU637p06cP+/fvZ+/evbalY8eO3Hfffezdu5emTZvW2765nMVi4fDhw4SGhur/38wNDTcSSqnfv6ry7rvvqkOHDqmpU6cqb29vlZCQoHdpN01ubq7as2eP2rNnjwLUggUL1J49e2xfz3n55ZeVyWRSq1atUvv371djxoypcAh548aN1YYNG9Qvv/yievfuXeuH1j/88MPKZDKpzZs32w2vLygosLWpr33z1FNPqR9++EHFx8erffv2qaeffloZDAb13XffKaXqb79U5NLRtkrV376ZPn262rx5szp58qTauXOnGjJkiPL19bX9btWzXyQ8q8kbb7yhIiIilLu7u7rttttsX02oqzZt2qSAK5Zx48YppcqHkT///PPKbDYro9Go7rzzTrV//367fRQWFqrJkyergIAA5enpqYYMGaJOnTqlw9FUn4r6BFDLli2ztamvffOXv/zF9v9Iw4YNVZ8+fWzBqVT97ZeKXB6e9bVvLn5v083NTYWFhamRI0eqgwcP2rbr2S9ySzIhhBDCQfKZpxBCCOEgCU8hhBDCQRKeQgghhIMkPIUQQggHSXgKIYQQDpLwFEIIIRwk4SmEEEI4SMJTCCGEcJCEpxDihmiaxhdffKF3GULUKAlPIWqx8ePHo2naFcvAgQP1Lk2IOk3u5ylELTdw4ECWLVtmt85oNOpUjRD1g5x5ClHLGY1GzGaz3eLv7w+UX1JdsmQJgwYNwtPTk6ioKD799FO71+/fv5/evXvj6elJYGAgDz30EHl5eXZt/v3vf9OmTRuMRiOhoaFMnjzZbntGRgYjRozAy8uL6Oho1qxZc3MPWgidSXgKUcc9++yz3HPPPfz666/cf//9jBkzhsOHDwNQUFDAwIED8ff3Z9euXXz66ads2LDBLhyXLFnCI488wkMPPcT+/ftZs2YNzZo1s3uP2bNnM3r0aPbt28fgwYO57777OH/+fI0epxA16obvyyKE0M24ceOUi4uL8vb2tlvmzJmjlCq/RdrEiRPtXtO5c2f18MMPK6WUeuutt5S/v7/Ky8uzbf/mm2+UwWBQaWlpSimlwsLC1MyZM69aA6CeeeYZ2/O8vDylaZr673//W23HKYSzkc88hajlevXqxZIlS+zWBQQE2B7HxcXZbYuLi2Pv3r0AHD58mHbt2uHt7W3b3q1bN6xWK0ePHkXTNFJSUujTp881a2jbtq3tsbe3N76+vqSnp1f1kIRwehKeQtRy3t7eV1xGvR5N0wBQStkeV9TG09OzUvtzc3O74rVWq9WhmoSoTeQzTyHquJ07d17xvGXLlgC0bt2avXv3kp+fb9v+v//9D4PBQPPmzfH19SUyMpLvv/++RmsWwtnJmacQtZzFYiEtLc1unaurK0FBQQB8+umndOzYke7du/PRRx/x008/8e677wJw33338fzzzzNu3DhmzZrF2bNnmTJlCg888AAhISEAzJo1i4kTJxIcHMygQYPIzc3lf//7H1OmTKnZAxXCiUh4ClHLrV27ltDQULt1LVq04MiRI0D5SNiVK1cyadIkzGYzH330Ea1btwbAy8uLdevW8dhjj9GpUye8vLy45557WLBggW1f48aNo6ioiIULFzJjxgyCgoIYNWpUzR2gEE5IU0opvYsQQtwcmqaxevVqhg8frncpQtQp8pmnEEII4SAJTyGEEMJB8pmnEHWYfCojxM0hZ55CCCGEgyQ8hRBCCAdJeAohhBAOkvAUQgghHCThKYQQQjhIwlMIIYRwkISnEEII4SAJTyGEEMJB/x/AXehg8GhbbgAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from mlcolvar.utils.plot import plot_metrics\n", "\n", "ax = plot_metrics(metrics.metrics, \n", " keys=['train_loss_epoch','valid_loss'],\n", " #linestyles=['-.','-'], colors=['fessa1','fessa5'],\n", " yscale='linear')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Analysis of the CV" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The histogram of the training data along th CVs should match the target distribution " ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig,ax = plt.subplots( 1, 1, figsize=(5,4) )\n", "\n", "X = dataset[:]['data']\n", "Y = dataset[:]['labels']\n", "\n", "with torch.no_grad():\n", " s = model(torch.Tensor(X)).numpy()\n", " \n", "for i in range(n_states):\n", " s_red = s[torch.nonzero(Y==i, as_tuple=True)]\n", " ax.hist(s_red[:,0],bins=100, label=f'State {i}')\n", "\n", "ax.set_xlabel(f'CV')\n", "ax.set_ylabel('Histogram')\n", "ax.set_title('DeepTDA')\n", "plt.legend()\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "pytorch13", "language": "python", "name": "python3" }, "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.10.8" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }