{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "CoAmo2D.ipynb", "provenance": [] }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "P5bly-NzWICq" }, "source": [ "# **Amorphization prediction by using 2D molecule representations**\n", "\n", "In this article, a keras based prediction of amorphization experiments is coded." ] }, { "cell_type": "markdown", "metadata": { "id": "RiwAhNr2Wfsa" }, "source": [ "Load all necessary packages" ] }, { "cell_type": "code", "metadata": { "id": "clw-RenvSvqo" }, "source": [ "%tensorflow_version 2.x\n", "import tensorflow as tf\n", "from tensorflow.keras import datasets, layers, models\n", "from keras.preprocessing import image\n", "from keras.preprocessing.image import load_img, ImageDataGenerator\n", "import warnings\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from PIL import Image\n", "import pandas as pd\n", "from sklearn.utils import shuffle" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "Dhfuw0FnW9KS" }, "source": [ "Connect to google drive" ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "DzNOG_RSlCA4", "outputId": "823fd347-e988-4a00-b924-e58ab1eee354" }, "source": [ "from google.colab import drive\n", "drive.mount('/content/drive')" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "lxtOlZQaW_1i" }, "source": [ "Name all experimentally used molecules and upload their 2D picutres (RGB and 500x500) " ] }, { "cell_type": "code", "metadata": { "id": "48TwMD5ikPJ_" }, "source": [ "molecules = ['2-Nitrobenzamide.png','2-Nitrobenzoicacid.png',\"3,3'-Thiodipropionicacid.png\",'3-Fluorobenzamide.png',\n", " '3-Methoxybenzoicacid.png','4-Aminobenzoicacid.png','4-Hydroxybenzamide.png','4-Methylbenzamide.png','4-Nitrobenzamide.png',\n", " 'Trans-Aconiticacid.png','Anthranilicacid.png','L-Ascorbicacid.png','Acetylsalicylicacid.png','Benzoicacid.png',\"4,4'-Bipyridine.png\",\n", " 'Caffeine.png','Carbamazepine.png','Citricacid.png','Diclofenac.png','Folicacid.png','L-Glutamicacid.png',\n", " 'Ibuprofene.png','L-Isoleucine.png','Isonicotinamide.png','L-Leucine.png','Mesaconicacid.png',\n", " 'Nicotinamide.png','Phenazine.png','Riboflavine.png','Salicylicacid.png','Theobromine.png','Theophylline.png','3-Methylbenzamide.png']\n", "\n", "im = []\n", "for i in molecules:\n", " dir = ('drive/MyDrive/Colab Notebooks/Molecules/'+ i)\n", " im1 = load_img(dir)\n", " im2 = im1.resize((100,100))\n", " im.append(im2)" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "dwelgCNGXXkb" }, "source": [ "\n", "Let's look at some images and check if everything is in place. By chaning the IMG_INDEX we can look at the different molecules." ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 285 }, "id": "IdUZEM1Poozj", "outputId": "69ec794d-246e-41d0-c5c1-945694ec7ed7" }, "source": [ "IMG_INDEX = 20\n", "print(molecules[IMG_INDEX])\n", "plt.imshow(im[IMG_INDEX] ,cmap=plt.cm.binary)\n", "plt.show()" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "L-Glutamicacid.png\n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "markdown", "metadata": { "id": "izshiWOwXlVT" }, "source": [ "Upload the result matrix" ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "LVNWVTbgqPrR", "outputId": "253ec922-e6c1-4ac5-9c3f-70acea877b88" }, "source": [ "results = pd.read_csv('drive/MyDrive/Colab Notebooks/Molecules/Results.csv')\n", "print(results)\n" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ " Component1 Component2 Outcome\n", "0 3,3'-Thiodipropionicacid 4,4'-Bipyridine 1\n", "1 3,3'-Thiodipropionicacid Acetylsalicylicacid 0\n", "2 3,3'-Thiodipropionicacid Anthranilicacid 0\n", "3 3,3'-Thiodipropionicacid Benzoicacid 0\n", "4 3,3'-Thiodipropionicacid Caffeine 0\n", ".. ... ... ...\n", "433 Folicacid 3-Methoxybenzoicacid 0\n", "434 Folicacid 2-Nitrobenzamide 1\n", "435 Folicacid 4-Nitrobenzamide 1\n", "436 Folicacid 3-Methylbenzamide 0\n", "437 Folicacid 4-Methylbenzamide 0\n", "\n", "[438 rows x 3 columns]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "NOhpwNlfXpIi" }, "source": [ "Define the function that combines both molecules horizontally." ] }, { "cell_type": "code", "metadata": { "id": "XiY2VMeL7Cuq" }, "source": [ "def get_concat_h(im1, im2):\n", " dst = Image.new('RGB', (im1.width + im2.width, im1.height))\n", " dst.paste(im1, (0, 0))\n", " dst.paste(im2, (im1.width, 0))\n", " return dst" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "W6qi6ToCXzv6" }, "source": [ "Execute the function on the result matrix." ] }, { "cell_type": "code", "metadata": { "id": "fcpcZIMttJ70" }, "source": [ "CC = []\n", "for i in range(len(results)):\n", " A = im[molecules.index(results.iloc[i][0]+'.png')]\n", " B = im[molecules.index(results.iloc[i][1]+'.png')]\n", " C = shuffle([A,B])\n", " AB = get_concat_h(C[0],C[1])\n", " pix_arr = np.array(AB) / 255.0\n", " CC.append(pix_arr)\n", "CC = tf.stack(CC)" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "JyuYmcsht_11" }, "source": [ "Let's look at some images and check if everything is in place. By chaning the IMG_INDEX we can look at the different molecule pairs" ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 235 }, "id": "hXb6a7TJt_BY", "outputId": "d945cf52-3105-4f7f-db54-b502264a3d6f" }, "source": [ "IMG_INDEX = 20\n", "print(results.iloc[IMG_INDEX][0]+' and '+results.iloc[IMG_INDEX][1])\n", "plt.imshow(CC[IMG_INDEX] ,cmap=plt.cm.binary)\n", "plt.show()" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "3,3'-Thiodipropionicacid and 3-Methoxybenzoicacid\n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "markdown", "metadata": { "id": "NZi5zGpo9iAo" }, "source": [ "Define classes and the labels of the results" ] }, { "cell_type": "code", "metadata": { "id": "ZJry3pzh9lsP" }, "source": [ "classes = ['1','0']\n", "CC_labels = results['Outcome']\n", "CC_labels = tf.stack(CC_labels)" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "KFkPx9E79xNQ" }, "source": [ "Building the **convolutional base**" ] }, { "cell_type": "code", "metadata": { "id": "oqZw50ODATHy" }, "source": [ "model = models.Sequential()\n", "model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(100,200, 3)))\n", "model.add(layers.MaxPooling2D((2, 2)))\n", "model.add(layers.Conv2D(64, (3, 3), activation='relu'))\n", "model.add(layers.MaxPooling2D((2, 2)))\n", "model.add(layers.Conv2D(64, (3, 3), activation='relu'))" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "bvLKK6f3AoHR" }, "source": [ "Let's have a look at the model so far\n" ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "iW4gTEj0Ae7J", "outputId": "841bb40c-dbc1-416f-e0f7-cdfdc9850875" }, "source": [ "model.summary()" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "Model: \"sequential\"\n", "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", "conv2d (Conv2D) (None, 98, 198, 32) 896 \n", "_________________________________________________________________\n", "max_pooling2d (MaxPooling2D) (None, 49, 99, 32) 0 \n", "_________________________________________________________________\n", "conv2d_1 (Conv2D) (None, 47, 97, 64) 18496 \n", "_________________________________________________________________\n", "max_pooling2d_1 (MaxPooling2 (None, 23, 48, 64) 0 \n", "_________________________________________________________________\n", "conv2d_2 (Conv2D) (None, 21, 46, 64) 36928 \n", "=================================================================\n", "Total params: 56,320\n", "Trainable params: 56,320\n", "Non-trainable params: 0\n", "_________________________________________________________________\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "wFBqfYXoA9nC" }, "source": [ "Adding **dense layer**" ] }, { "cell_type": "code", "metadata": { "id": "tujNlpkrAnCL" }, "source": [ "model.add(layers.Flatten())\n", "model.add(layers.Dense(64, activation='relu'))\n", "model.add(layers.Dense(2))" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "jCHyXxcyBJni" }, "source": [ "Training" ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "dcpeTbXQBL1K", "outputId": "ae813c52-e955-41e6-e8da-4c81b4aa7ce4" }, "source": [ "model.compile(optimizer='adam',\n", " loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n", " metrics=['accuracy'])\n", "\n", "history = model.fit(CC, CC_labels, epochs=1)" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "14/14 [==============================] - 10s 647ms/step - loss: 1.1864 - accuracy: 0.5525\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "EsygqiNSuBti" }, "source": [ "Augmentation" ] }, { "cell_type": "code", "metadata": { "id": "Jcbj9DesfsJP" }, "source": [ "datagen = ImageDataGenerator(\n", "rotation_range=40,\n", "width_shift_range=0.2,\n", "height_shift_range=0.2,\n", "shear_range=0.2,\n", "zoom_range=0.2,\n", "horizontal_flip=True,\n", "fill_mode='nearest')\n", "\n", "CC_Aug = []\n", "CC_Aug_labels = []\n", "\n", "for k in range(len(results)):\n", " test_img = CC[k]\n", " img = image.img_to_array(test_img)\n", " img = img.reshape((1,) + img.shape) \n", " i = 0\n", " for batch in datagen.flow(img):\n", " img = tf.reshape(img,CC[0].shape)\n", " CC_Aug.append(img)\n", " CC_Aug_labels.append(CC_labels[k])\n", " i += 1\n", " if i > 4:\n", " break" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "v5AQnqZikyI3" }, "source": [ "CC_new = tf.concat([CC,CC_Aug],0)\n", "CC_labels_new = tf.concat([CC_labels,CC_Aug_labels],-1)" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "ARKA6DOlrspF" }, "source": [ "CC_new = tf.random.shuffle(CC_new,1)\n", "CC_labels_new = tf.random.shuffle(CC_labels_new,1)" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "K33BJzn1jKDu" }, "source": [ "model = models.Sequential()\n", "model.add(layers.Conv2D(64, (3, 3), activation='relu', input_shape=(100,200, 3)))\n", "model.add(layers.MaxPooling2D((2, 2)))\n", "model.add(layers.Conv2D(128, (3, 3), activation='relu'))\n", "model.add(layers.MaxPooling2D((2, 2)))\n", "model.add(layers.Conv2D(128, (3, 3), activation='relu'))\n", "model.add(layers.Flatten())\n", "model.add(layers.Dense(256, activation='relu'))\n", "model.add(layers.Dense(2))" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "0fg-qUbaseEl", "outputId": "c01e761a-4977-4ed3-c70e-645be8300d45" }, "source": [ "model.compile(optimizer='adam',\n", " loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n", " metrics=['accuracy'])\n", "\n", "history = model.fit(CC_new, CC_labels_new, epochs=5)" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "Epoch 1/5\n", "83/83 [==============================] - 151s 2s/step - loss: 0.7944 - accuracy: 0.5845\n", "Epoch 2/5\n", "83/83 [==============================] - 150s 2s/step - loss: 0.6754 - accuracy: 0.6027\n", "Epoch 3/5\n", "83/83 [==============================] - 153s 2s/step - loss: 0.6782 - accuracy: 0.5982\n", "Epoch 4/5\n", "83/83 [==============================] - 154s 2s/step - loss: 0.6776 - accuracy: 0.6027\n", "Epoch 5/5\n", "83/83 [==============================] - 154s 2s/step - loss: 0.6748 - accuracy: 0.6012\n" ], "name": "stdout" } ] } ] }