Tutorial_NN.ipynb 470 KB
Newer Older
1
2
3
4
5
6
7
{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "Tutorial_BigMax.ipynb",
      "provenance": [],
Christoph Freysoldt's avatar
Christoph Freysoldt committed
8
      "collapsed_sections": []
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "aOpB14foyoVj"
      },
      "source": [
        "#Introduction\n",
        "In this notebook, we will implement a machine-learning framework accelerates functional high-entropy alloy discovery"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "HO3WeAGHmW_t"
      },
      "source": [
        "import cv2\n",
        "import os\n",
        "import time\n",
        "import random\n",
        "import numpy as np\n",
        "import pandas as pd\n",
        "\n",
        "import torch\n",
        "import torch.nn as nn\n",
        "import torch.nn.functional as F\n",
        "from torch.optim import Adam, lr_scheduler\n",
        "from torch.utils.data import Dataset, DataLoader\n",
        "from scipy.spatial.distance import cdist\n",
        "from sklearn.model_selection import train_test_split\n",
        "from sklearn.model_selection import KFold\n",
        "from sklearn.cluster import KMeans\n",
        "from sklearn.mixture import GaussianMixture\n",
        "\n",
        "import matplotlib.pyplot as plt\n",
        "import matplotlib.patches as patches\n",
        "from matplotlib.patches import Ellipse\n",
        "from mpl_toolkits.axes_grid1 import make_axes_locatable\n",
        "import seaborn as sns\n",
        "\n",
        "device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n",
60
        "root = 'content/'\n",
61
62
63
        "\n",
        "sns.set(color_codes=True)"
      ],
Christoph Freysoldt's avatar
Christoph Freysoldt committed
64
      "execution_count": 1,
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "OQnO2Nrq9Bc-"
      },
      "source": [
        "#Required packages"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "dTzbyKG1o_0i",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
83
        "outputId": "a7741bb9-e61a-47a5-b91b-1862e0778277"
84
85
86
87
88
      },
      "source": [
        "!pip install bayesian-optimization\n",
        "!pip install lightgbm"
      ],
Christoph Freysoldt's avatar
Christoph Freysoldt committed
89
      "execution_count": 2,
90
91
92
93
94
95
96
97
98
99
100
101
102
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Collecting bayesian-optimization\n",
            "  Downloading bayesian-optimization-1.2.0.tar.gz (14 kB)\n",
            "Requirement already satisfied: numpy>=1.9.0 in /usr/local/lib/python3.7/dist-packages (from bayesian-optimization) (1.19.5)\n",
            "Requirement already satisfied: scipy>=0.14.0 in /usr/local/lib/python3.7/dist-packages (from bayesian-optimization) (1.4.1)\n",
            "Requirement already satisfied: scikit-learn>=0.18.0 in /usr/local/lib/python3.7/dist-packages (from bayesian-optimization) (0.22.2.post1)\n",
            "Requirement already satisfied: joblib>=0.11 in /usr/local/lib/python3.7/dist-packages (from scikit-learn>=0.18.0->bayesian-optimization) (1.0.1)\n",
            "Building wheels for collected packages: bayesian-optimization\n",
            "  Building wheel for bayesian-optimization (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
103
            "  Created wheel for bayesian-optimization: filename=bayesian_optimization-1.2.0-py3-none-any.whl size=11685 sha256=fe62c2a660ed5d9d514b5ea22d24477c1375e2a76b765fe2428891c61cb98514\n",
104
105
106
107
108
109
            "  Stored in directory: /root/.cache/pip/wheels/fd/9b/71/f127d694e02eb40bcf18c7ae9613b88a6be4470f57a8528c5b\n",
            "Successfully built bayesian-optimization\n",
            "Installing collected packages: bayesian-optimization\n",
            "Successfully installed bayesian-optimization-1.2.0\n",
            "Requirement already satisfied: lightgbm in /usr/local/lib/python3.7/dist-packages (2.2.3)\n",
            "Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from lightgbm) (1.19.5)\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
110
            "Requirement already satisfied: scikit-learn in /usr/local/lib/python3.7/dist-packages (from lightgbm) (0.22.2.post1)\n",
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
            "Requirement already satisfied: scipy in /usr/local/lib/python3.7/dist-packages (from lightgbm) (1.4.1)\n",
            "Requirement already satisfied: joblib>=0.11 in /usr/local/lib/python3.7/dist-packages (from scikit-learn->lightgbm) (1.0.1)\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "4lKoaSz8pTHk"
      },
      "source": [
        "#Wasserstein Autoencoder\n",
        "Wasserstein autoencoder is used for learning the latent space representation"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "hlnrI--Mc9-T"
      },
      "source": [
        "class FeatureDataset(Dataset): #from numpy to tensor (pytroch-readable)\n",
        "    '''\n",
        "    Args: x is a 2D numpy array [x_size, x_features]\n",
        "    '''\n",
        "    def __init__(self, x, y):\n",
        "        self.x = x\n",
        "        self.y = y\n",
        "    \n",
        "    def __len__(self):\n",
        "        return self.x.shape[0]\n",
        "    \n",
        "    def __getitem__(self, idx):\n",
        "        return torch.FloatTensor(self.x[idx]), torch.FloatTensor(self.y[idx])\n",
        "\n",
        "class AttributeDataset(Dataset): # this is for classifier \n",
        "    '''\n",
        "    Args: x is a 2D numpy array [x_size, x_features]\n",
        "    '''\n",
        "    def __init__(self, x, y):\n",
        "        self.x = x\n",
        "        self.y = y\n",
        "    def __len__(self):\n",
        "        return self.x.shape[0]\n",
        "    def __getitem__(self, idx):\n",
        "        return torch.Tensor(self.x[idx]), torch.Tensor(self.y[idx])"
      ],
Christoph Freysoldt's avatar
Christoph Freysoldt committed
159
      "execution_count": 7,
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "3OkOhFJf1MBC"
      },
      "source": [
        "**Model architecture**"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "IYHg-od4o9dZ"
      },
      "source": [
        "def weights_init(m):\n",
        "    classname = m.__class__.__name__\n",
        "    if classname.find('BatchNorm') != -1:\n",
        "        m.weight.data.normal_(1.0, 0.02)\n",
        "        m.bias.data.fill_(0)\n",
        "\n",
        "class WAE(nn.Module):\n",
        "    def __init__(self, input_size):\n",
        "        super(WAE, self).__init__()\n",
        "        self.input_size = input_size\n",
        "\n",
        "        # encoder\n",
        "        self.encoder = nn.Sequential(\n",
        "                        nn.Linear(self.input_size, 80),\n",
        "                        nn.LayerNorm(80),\n",
        "                        nn.ReLU(),\n",
        "                        nn.Linear(80, 64),\n",
        "                        nn.LayerNorm(64),\n",
        "                        nn.ReLU(),\n",
        "                        nn.Linear(64, 48),\n",
        "                        nn.LayerNorm(48),\n",
        "                        nn.ReLU(),\n",
        "                        nn.Linear(48, 2),\n",
        "                        )\n",
        "\n",
        "        # decoder\n",
        "        self.decoder = nn.Sequential(\n",
        "                        nn.Linear(2, 48),\n",
        "                        nn.LayerNorm(48),\n",
        "                        nn.ReLU(),\n",
        "                        nn.Linear(48, 64),\n",
        "                        nn.LayerNorm(64),\n",
        "                        nn.ReLU(),\n",
        "                        nn.Linear(64, 80),\n",
        "                        nn.LayerNorm(80),\n",
        "                        nn.ReLU(),\n",
        "                        nn.Linear(80, self.input_size),\n",
        "                        nn.Softmax(dim=1) #(softmad along dimension 1)\n",
        "                        )\n",
        "        self.apply(weights_init)\n",
        "    \n",
        "    def forward(self, x):\n",
        "        z = self._encode(x)\n",
        "        x_recon = self._decode(z)\n",
        "\n",
        "        return x_recon, z\n",
        "    \n",
        "    def _encode(self, x):\n",
        "        return self.encoder(x)\n",
        "\n",
        "    def _decode(self, z):\n",
        "        return self.decoder(z)"
      ],
Christoph Freysoldt's avatar
Christoph Freysoldt committed
230
      "execution_count": 8,
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Rfgq7_H51Sgi"
      },
      "source": [
        "**Utility functions for WAE**\n",
        "\n",
        "\n",
        "*   same_seeds: fixing the randomness\n",
        "*   get_latents: get the latent spaces from the WAE\n",
        "*   imq_kernels: inverse multiquadric (IMQ) kernel - computing the maximum mean discrepancy, which is part of the loss function for WAE.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "8yBgwL4mqPFk"
      },
      "source": [
        "def same_seeds(seed): #fix np & torch seed to the same.\n",
        "    torch.manual_seed(seed)\n",
        "    if torch.cuda.is_available():\n",
        "        torch.cuda.manual_seed(seed)\n",
        "        torch.cuda.manual_seed_all(seed)  # if you are using multi-GPU.\n",
        "    np.random.seed(seed)  # Numpy module.\n",
        "    random.seed(seed)  # Python random module.\n",
        "    torch.backends.cudnn.benchmark = False\n",
        "    torch.backends.cudnn.deterministic = True\n",
        "\n",
        "def get_latents(model, dataset): #from dataset to altten\n",
        "    model.to(device).eval() # training model or evaluation mode, eval means setting the model to its evaluation mode (gradient fixed)\n",
        "    latents = []\n",
        "    with torch.no_grad(): # fix the gradient, assure that the model parameters are fixed\n",
        "        dataloader = DataLoader(dataset, batch_size=256, shuffle=False)\n",
        "        for i, data in enumerate(dataloader):\n",
        "            x = data[0].to(device)\n",
        "            recon_x, z = model(x)\n",
        "            latents.append(z.detach().cpu().numpy())\n",
        "    return np.concatenate(latents,axis=0)\n",
        "\n",
        "def imq_kernel(X: torch.Tensor, Y: torch.Tensor, h_dim: int): # common kerntl to choose\n",
        "    batch_size = X.size(0)\n",
        "\n",
        "    norms_x = X.pow(2).sum(1, keepdim=True)  # batch_size x 1\n",
        "    prods_x = torch.mm(X, X.t()).to(device)  # batch_size x batch_size\n",
        "    dists_x = norms_x + norms_x.t() - 2 * prods_x # mm matrix multiplicaiton\n",
        "\n",
        "    norms_y = Y.pow(2).sum(1, keepdim=True).to(device)  # batch_size x 1\n",
        "    prods_y = torch.mm(Y, Y.t()).to(device)  # batch_size x batch_size\n",
        "    dists_y = norms_y + norms_y.t() - 2 * prods_y\n",
        "\n",
        "    dot_prd = torch.mm(X, Y.t())\n",
        "    dists_c = norms_x + norms_y.t() - 2 * dot_prd\n",
        "\n",
        "    stats = 0\n",
        "    for scale in [.1, .2, .5, 1., 2., 5., 10.]: # need more study on this\n",
        "        C = 2 * h_dim * 1.0 * scale\n",
        "        res1 = C / (C + dists_x)\n",
        "        res1 += C / (C + dists_y)\n",
        "\n",
        "        if torch.cuda.is_available():\n",
        "            res1 = (1 - torch.eye(batch_size).to(device)) * res1\n",
        "        else:\n",
        "            res1 = (1 - torch.eye(batch_size)) * res1\n",
        "\n",
        "        res1 = res1.sum() / (batch_size - 1)\n",
        "        res2 = C / (C + dists_c)\n",
        "        res2 = res2.sum() * 2. / (batch_size)\n",
        "        stats += res1 - res2\n",
        "\n",
        "    return stats\n"
      ],
Christoph Freysoldt's avatar
Christoph Freysoldt committed
307
      "execution_count": 5,
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Tf5oEkuZ4fmv"
      },
      "source": [
        "**Data loading**  "
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "KReugJAwrE14",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
Christoph Freysoldt's avatar
Christoph Freysoldt committed
326
        "outputId": "b2397d63-7083-46d0-f2e5-4cfd56f62513"
327
328
      },
      "source": [
Christoph Freysoldt's avatar
Christoph Freysoldt committed
329
        "same_seeds(1) #seed equals to 1\n",
330
331
        "\n",
        "params = {\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
332
        "    'num_epoch' : 100,\n",
333
334
335
336
337
338
339
340
341
342
343
344
345
346
        "    'batch_size' : 20,\n",
        "    'lr' : 5e-4,\n",
        "    'weight_decay' : 0.0,\n",
        "    'sigma' : 8.0,\n",
        "    'MMD_lambda' : 1e-4,\n",
        "    'model_name' : 'WAE_v1',\n",
        "} # for WAE training\n",
        "all = pd.read_csv('data_base.csv', header=0).iloc[:,1:19].to_numpy()\n",
        "raw_x = all[:696,:6]\n",
        "raw_y = all[:696,17].reshape(-1,1)\n",
        "dataset = FeatureDataset(raw_x[:], raw_y[:]) #numpy to tensor\n",
        "dataloader = DataLoader(dataset, batch_size=params['batch_size'], shuffle=True) # tensor to dataloader\n",
        "print(raw_x[50:55])"
      ],
Christoph Freysoldt's avatar
Christoph Freysoldt committed
347
      "execution_count": 10,
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "[[0.701 0.2   0.099 0.    0.    0.   ]\n",
            " [0.65  0.25  0.1   0.    0.    0.   ]\n",
            " [0.62  0.28  0.1   0.    0.    0.   ]\n",
            " [0.601 0.3   0.099 0.    0.    0.   ]\n",
            " [0.58  0.32  0.1   0.    0.    0.   ]]\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "AkcWFeljrTEi",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
369
        "outputId": "7476a512-c833-4196-b95a-d58b1c16ab3c"
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
      },
      "source": [
        "model = WAE(raw_x.shape[1]).to(device) # initialize the model \n",
        "optimizer = Adam(model.parameters(), lr = params['lr'], weight_decay = params['weight_decay']) # optimizer\n",
        "def train_WAE(model, optimizer, dataloader, params):\n",
        "    model_name = params['model_name']\n",
        "    num_epoch = params['num_epoch']\n",
        "    sigma = params['sigma'] # assuming the latent space follows Gaussian\n",
        "    MMD_lambda = params['MMD_lambda'] #WAE distance (maximum mean discrepancy)\n",
        "\n",
        "    folder_dir = os.path.join(root, model_name) # a folder to save models\n",
        "    if not os.path.isdir(folder_dir):\n",
        "        os.mkdir(folder_dir)\n",
        "\n",
        "    for epoch in range(num_epoch):\n",
        "        start_time = time.time()\n",
        "        total_loss = [] #save for plot, recon loss+MMD\n",
        "        total_recon = [] # binary cross entropy\n",
        "        total_MMD = [] #maximum mean discrepancy\n",
        "        \n",
        "        for i, data in enumerate(dataloader):\n",
        "            x = data[0].to(device)\n",
        "            y = data[1].to(device)\n",
        "            model.train() # model goes to train mode\n",
        "            recon_x, z_tilde = model(x) # latent space is Z_tilde\n",
        "            z = sigma*torch.randn(z_tilde.size()).to(device) # z is sampled from a Gaussian that has the same dimension (but no relation to z_tilde).\n",
        "\n",
        "            recon_loss = F.binary_cross_entropy(recon_x, x, reduction='mean') #lowest reconstruction loss \n",
        "            #recon_loss = F.mse_loss(recon_x, x, reduction='mean') \n",
        "            #recon_loss = F.l1_loss(recon_x, x, reduction='mean')\n",
        "            \n",
        "            MMD_loss = imq_kernel(z_tilde, z, h_dim=2).to(device) #W-distance between z_tilde and z\n",
        "            MMD_loss = MMD_loss / x.size(0) #averaging, because recon loss is mean.\n",
        "            loss = recon_loss + MMD_loss * MMD_lambda #MM_lambda: learning-rate alike, hyperparamer\n",
        "\n",
        "            optimizer.zero_grad()\n",
        "            loss.backward()\n",
        "            optimizer.step()\n",
        "\n",
        "            total_loss.append(loss.item())# from tensor to values\n",
        "            total_recon.append(recon_loss.item())\n",
        "            total_MMD.append(MMD_loss.item())\n",
        "\n",
        "        avg_loss = sum(total_loss)/len(total_loss)\n",
        "        avg_recon = sum(total_recon)/len(total_recon)\n",
        "        avg_MMD = sum(total_MMD)/len(total_MMD)\n",
        "\n",
        "        #scheduler.step(avg_loss)\n",
        "\n",
        "        print('[{:03}/{:03}] loss: {:.6f} Recon_loss: {:.6f}, MMD_loss:{:.6f}, time: {:.3f} sec'.format(\\\n",
        "                                        epoch+1, num_epoch, \\\n",
        "                                        avg_loss, \\\n",
        "                                        avg_recon, avg_MMD, time.time() - start_time))\n",
        "        # save the model every 2 epoches\n",
        "        if (epoch+1) % 1 == 0:\n",
        "            save_model_dir = str(model_name + \"_{}.pth\".format(epoch+1))\n",
        "            torch.save(model.state_dict(), os.path.join(folder_dir, save_model_dir))\n",
        "\n",
        "train_WAE(model, optimizer, dataloader, params)"
      ],
Christoph Freysoldt's avatar
Christoph Freysoldt committed
430
      "execution_count": 11,
431
432
433
434
435
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
Christoph Freysoldt's avatar
Christoph Freysoldt committed
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
            "[001/100] loss: 0.365287 Recon_loss: 0.364788, MMD_loss:4.988922, time: 0.482 sec\n",
            "[002/100] loss: 0.319609 Recon_loss: 0.319189, MMD_loss:4.200815, time: 0.240 sec\n",
            "[003/100] loss: 0.311577 Recon_loss: 0.311122, MMD_loss:4.544367, time: 0.244 sec\n",
            "[004/100] loss: 0.308807 Recon_loss: 0.308342, MMD_loss:4.655530, time: 0.173 sec\n",
            "[005/100] loss: 0.307247 Recon_loss: 0.306776, MMD_loss:4.710283, time: 0.162 sec\n",
            "[006/100] loss: 0.306054 Recon_loss: 0.305588, MMD_loss:4.664705, time: 0.168 sec\n",
            "[007/100] loss: 0.305088 Recon_loss: 0.304617, MMD_loss:4.708817, time: 0.238 sec\n",
            "[008/100] loss: 0.304573 Recon_loss: 0.304105, MMD_loss:4.686302, time: 0.191 sec\n",
            "[009/100] loss: 0.303707 Recon_loss: 0.303228, MMD_loss:4.788946, time: 0.166 sec\n",
            "[010/100] loss: 0.302751 Recon_loss: 0.302280, MMD_loss:4.713873, time: 0.156 sec\n",
            "[011/100] loss: 0.301802 Recon_loss: 0.301345, MMD_loss:4.570692, time: 0.184 sec\n",
            "[012/100] loss: 0.301485 Recon_loss: 0.301018, MMD_loss:4.667446, time: 0.162 sec\n",
            "[013/100] loss: 0.300671 Recon_loss: 0.300216, MMD_loss:4.550119, time: 0.164 sec\n",
            "[014/100] loss: 0.300389 Recon_loss: 0.299938, MMD_loss:4.517685, time: 0.167 sec\n",
            "[015/100] loss: 0.300090 Recon_loss: 0.299639, MMD_loss:4.515236, time: 0.163 sec\n",
            "[016/100] loss: 0.299518 Recon_loss: 0.299062, MMD_loss:4.564801, time: 0.156 sec\n",
            "[017/100] loss: 0.299015 Recon_loss: 0.298569, MMD_loss:4.457237, time: 0.161 sec\n",
            "[018/100] loss: 0.299192 Recon_loss: 0.298747, MMD_loss:4.443053, time: 0.163 sec\n",
            "[019/100] loss: 0.298831 Recon_loss: 0.298389, MMD_loss:4.429230, time: 0.165 sec\n",
            "[020/100] loss: 0.298761 Recon_loss: 0.298314, MMD_loss:4.470654, time: 0.219 sec\n",
            "[021/100] loss: 0.298734 Recon_loss: 0.298295, MMD_loss:4.393027, time: 0.230 sec\n",
            "[022/100] loss: 0.298443 Recon_loss: 0.298006, MMD_loss:4.373185, time: 0.228 sec\n",
            "[023/100] loss: 0.299117 Recon_loss: 0.298690, MMD_loss:4.270142, time: 0.169 sec\n",
            "[024/100] loss: 0.298156 Recon_loss: 0.297726, MMD_loss:4.298305, time: 0.160 sec\n",
            "[025/100] loss: 0.298053 Recon_loss: 0.297621, MMD_loss:4.324094, time: 0.159 sec\n",
            "[026/100] loss: 0.297877 Recon_loss: 0.297460, MMD_loss:4.173318, time: 0.162 sec\n",
            "[027/100] loss: 0.297605 Recon_loss: 0.297177, MMD_loss:4.286124, time: 0.156 sec\n",
            "[028/100] loss: 0.297636 Recon_loss: 0.297209, MMD_loss:4.271590, time: 0.188 sec\n",
            "[029/100] loss: 0.297569 Recon_loss: 0.297137, MMD_loss:4.320729, time: 0.233 sec\n",
            "[030/100] loss: 0.297554 Recon_loss: 0.297129, MMD_loss:4.245043, time: 0.160 sec\n",
            "[031/100] loss: 0.297525 Recon_loss: 0.297099, MMD_loss:4.259788, time: 0.163 sec\n",
            "[032/100] loss: 0.297699 Recon_loss: 0.297271, MMD_loss:4.274336, time: 0.161 sec\n",
            "[033/100] loss: 0.297089 Recon_loss: 0.296667, MMD_loss:4.224826, time: 0.173 sec\n",
            "[034/100] loss: 0.297538 Recon_loss: 0.297113, MMD_loss:4.246197, time: 0.157 sec\n",
            "[035/100] loss: 0.297467 Recon_loss: 0.297044, MMD_loss:4.224483, time: 0.241 sec\n",
            "[036/100] loss: 0.297129 Recon_loss: 0.296705, MMD_loss:4.234460, time: 0.230 sec\n",
            "[037/100] loss: 0.296836 Recon_loss: 0.296420, MMD_loss:4.163971, time: 0.227 sec\n",
            "[038/100] loss: 0.297052 Recon_loss: 0.296619, MMD_loss:4.321280, time: 0.187 sec\n",
            "[039/100] loss: 0.296952 Recon_loss: 0.296546, MMD_loss:4.064921, time: 0.233 sec\n",
            "[040/100] loss: 0.297335 Recon_loss: 0.296923, MMD_loss:4.114959, time: 0.210 sec\n",
            "[041/100] loss: 0.297304 Recon_loss: 0.296895, MMD_loss:4.089278, time: 0.159 sec\n",
            "[042/100] loss: 0.297130 Recon_loss: 0.296715, MMD_loss:4.145263, time: 0.214 sec\n",
            "[043/100] loss: 0.297211 Recon_loss: 0.296795, MMD_loss:4.160071, time: 0.236 sec\n",
            "[044/100] loss: 0.296866 Recon_loss: 0.296452, MMD_loss:4.143130, time: 0.168 sec\n",
            "[045/100] loss: 0.296752 Recon_loss: 0.296336, MMD_loss:4.162766, time: 0.170 sec\n",
            "[046/100] loss: 0.296653 Recon_loss: 0.296245, MMD_loss:4.076583, time: 0.159 sec\n",
            "[047/100] loss: 0.296501 Recon_loss: 0.296101, MMD_loss:3.996096, time: 0.167 sec\n",
            "[048/100] loss: 0.297359 Recon_loss: 0.296951, MMD_loss:4.075806, time: 0.156 sec\n",
            "[049/100] loss: 0.296895 Recon_loss: 0.296487, MMD_loss:4.078783, time: 0.182 sec\n",
            "[050/100] loss: 0.296613 Recon_loss: 0.296219, MMD_loss:3.934222, time: 0.241 sec\n",
            "[051/100] loss: 0.296619 Recon_loss: 0.296196, MMD_loss:4.231486, time: 0.192 sec\n",
            "[052/100] loss: 0.296902 Recon_loss: 0.296487, MMD_loss:4.149249, time: 0.172 sec\n",
            "[053/100] loss: 0.296639 Recon_loss: 0.296232, MMD_loss:4.070097, time: 0.157 sec\n",
            "[054/100] loss: 0.296636 Recon_loss: 0.296248, MMD_loss:3.872639, time: 0.161 sec\n",
            "[055/100] loss: 0.296585 Recon_loss: 0.296192, MMD_loss:3.932009, time: 0.175 sec\n",
            "[056/100] loss: 0.296295 Recon_loss: 0.295894, MMD_loss:4.014891, time: 0.174 sec\n",
            "[057/100] loss: 0.296475 Recon_loss: 0.296065, MMD_loss:4.100971, time: 0.194 sec\n",
            "[058/100] loss: 0.296458 Recon_loss: 0.296047, MMD_loss:4.109641, time: 0.162 sec\n",
            "[059/100] loss: 0.296511 Recon_loss: 0.296105, MMD_loss:4.059724, time: 0.157 sec\n",
            "[060/100] loss: 0.296396 Recon_loss: 0.295992, MMD_loss:4.038733, time: 0.171 sec\n",
            "[061/100] loss: 0.296614 Recon_loss: 0.296203, MMD_loss:4.108154, time: 0.160 sec\n",
            "[062/100] loss: 0.296747 Recon_loss: 0.296337, MMD_loss:4.106113, time: 0.167 sec\n",
            "[063/100] loss: 0.296383 Recon_loss: 0.295984, MMD_loss:3.987412, time: 0.164 sec\n",
            "[064/100] loss: 0.296521 Recon_loss: 0.296123, MMD_loss:3.984291, time: 0.161 sec\n",
            "[065/100] loss: 0.296378 Recon_loss: 0.295979, MMD_loss:3.992087, time: 0.155 sec\n",
            "[066/100] loss: 0.296210 Recon_loss: 0.295811, MMD_loss:3.988383, time: 0.175 sec\n",
            "[067/100] loss: 0.296177 Recon_loss: 0.295773, MMD_loss:4.037848, time: 0.236 sec\n",
            "[068/100] loss: 0.296045 Recon_loss: 0.295667, MMD_loss:3.787771, time: 0.233 sec\n",
            "[069/100] loss: 0.296186 Recon_loss: 0.295795, MMD_loss:3.908190, time: 0.232 sec\n",
            "[070/100] loss: 0.296298 Recon_loss: 0.295903, MMD_loss:3.944492, time: 0.223 sec\n",
            "[071/100] loss: 0.296370 Recon_loss: 0.295976, MMD_loss:3.935484, time: 0.156 sec\n",
            "[072/100] loss: 0.296354 Recon_loss: 0.295953, MMD_loss:4.011393, time: 0.166 sec\n",
            "[073/100] loss: 0.296211 Recon_loss: 0.295825, MMD_loss:3.856404, time: 0.161 sec\n",
            "[074/100] loss: 0.296478 Recon_loss: 0.296078, MMD_loss:3.995800, time: 0.161 sec\n",
            "[075/100] loss: 0.296381 Recon_loss: 0.295980, MMD_loss:4.001204, time: 0.160 sec\n",
            "[076/100] loss: 0.296341 Recon_loss: 0.295940, MMD_loss:4.011523, time: 0.215 sec\n",
            "[077/100] loss: 0.296220 Recon_loss: 0.295829, MMD_loss:3.904648, time: 0.169 sec\n",
            "[078/100] loss: 0.296117 Recon_loss: 0.295726, MMD_loss:3.912922, time: 0.165 sec\n",
            "[079/100] loss: 0.296196 Recon_loss: 0.295803, MMD_loss:3.929377, time: 0.166 sec\n",
            "[080/100] loss: 0.295948 Recon_loss: 0.295549, MMD_loss:3.984029, time: 0.160 sec\n",
            "[081/100] loss: 0.295997 Recon_loss: 0.295608, MMD_loss:3.892871, time: 0.161 sec\n",
            "[082/100] loss: 0.295835 Recon_loss: 0.295448, MMD_loss:3.866601, time: 0.162 sec\n",
            "[083/100] loss: 0.295890 Recon_loss: 0.295501, MMD_loss:3.886154, time: 0.215 sec\n",
            "[084/100] loss: 0.296199 Recon_loss: 0.295807, MMD_loss:3.923056, time: 0.218 sec\n",
            "[085/100] loss: 0.295973 Recon_loss: 0.295577, MMD_loss:3.960673, time: 0.159 sec\n",
            "[086/100] loss: 0.296010 Recon_loss: 0.295614, MMD_loss:3.961454, time: 0.161 sec\n",
            "[087/100] loss: 0.295832 Recon_loss: 0.295442, MMD_loss:3.900643, time: 0.158 sec\n",
            "[088/100] loss: 0.295746 Recon_loss: 0.295352, MMD_loss:3.940127, time: 0.170 sec\n",
            "[089/100] loss: 0.295856 Recon_loss: 0.295475, MMD_loss:3.814231, time: 0.236 sec\n",
            "[090/100] loss: 0.296133 Recon_loss: 0.295738, MMD_loss:3.948777, time: 0.235 sec\n",
            "[091/100] loss: 0.295939 Recon_loss: 0.295552, MMD_loss:3.870931, time: 0.223 sec\n",
            "[092/100] loss: 0.295722 Recon_loss: 0.295336, MMD_loss:3.862048, time: 0.171 sec\n",
            "[093/100] loss: 0.295671 Recon_loss: 0.295289, MMD_loss:3.814457, time: 0.167 sec\n",
            "[094/100] loss: 0.295676 Recon_loss: 0.295293, MMD_loss:3.827099, time: 0.162 sec\n",
            "[095/100] loss: 0.295916 Recon_loss: 0.295534, MMD_loss:3.814622, time: 0.174 sec\n",
            "[096/100] loss: 0.295846 Recon_loss: 0.295460, MMD_loss:3.854504, time: 0.205 sec\n",
            "[097/100] loss: 0.295670 Recon_loss: 0.295290, MMD_loss:3.798476, time: 0.205 sec\n",
            "[098/100] loss: 0.296372 Recon_loss: 0.295990, MMD_loss:3.812305, time: 0.158 sec\n",
            "[099/100] loss: 0.296216 Recon_loss: 0.295829, MMD_loss:3.869949, time: 0.215 sec\n",
            "[100/100] loss: 0.295944 Recon_loss: 0.295553, MMD_loss:3.911615, time: 0.199 sec\n"
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "rSr013Mk7qeP"
      },
      "source": [
        "**double check on the recontruted compositions**\n",
        "\n",
        "*   one way to find out whether WAE (or any other VAE) has learned the \n",
        "repsentation is to compare the reconstructed and original compositions. \n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
558
          "height": 235
559
560
        },
        "id": "vcz36-9atIfk",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
561
        "outputId": "80c9dd91-75bc-4354-b5e3-a8a587297e09"
562
563
564
565
      },
      "source": [
        "#double check on the recontruted compositions\n",
        "#t = time.localtime()\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
566
        "model_dir = os.path.join(root,'{}/{}_100.pth'.format(params['model_name'], params['model_name']))\n",
567
568
569
570
571
572
573
574
575
576
577
578
579
        "model = WAE(raw_x.shape[1]).to(device)\n",
        "model.load_state_dict(torch.load(model_dir))\n",
        "model.eval()\n",
        "with torch.no_grad():\n",
        "    test = torch.FloatTensor(raw_x).to(device)\n",
        "    recon_x, z = model(test)\n",
        "    recon_x = model.decoder(z)\n",
        "    recon_x = recon_x.cpu().detach().numpy()\n",
        "\n",
        "column_name = ['Fe','Ni','Co','Cr','V','Cu']#,'VEC','AR1','AR2','PE','Density','TC','MP','FI','SI','TI','M']\n",
        "#recon_x = (recon_x * (max-min)) + min\n",
        "pd.DataFrame(recon_x.round(3), columns=column_name).loc[690:695]"
      ],
Christoph Freysoldt's avatar
Christoph Freysoldt committed
580
      "execution_count": 12,
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>Fe</th>\n",
              "      <th>Ni</th>\n",
              "      <th>Co</th>\n",
              "      <th>Cr</th>\n",
              "      <th>V</th>\n",
              "      <th>Cu</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>690</th>\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
615
616
617
              "      <td>0.614</td>\n",
              "      <td>0.330</td>\n",
              "      <td>0.053</td>\n",
618
              "      <td>0.000</td>\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
619
              "      <td>0.003</td>\n",
620
621
622
623
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>691</th>\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
624
625
626
              "      <td>0.613</td>\n",
              "      <td>0.331</td>\n",
              "      <td>0.052</td>\n",
627
              "      <td>0.000</td>\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
628
              "      <td>0.003</td>\n",
629
630
631
632
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>692</th>\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
633
634
635
              "      <td>0.612</td>\n",
              "      <td>0.323</td>\n",
              "      <td>0.062</td>\n",
636
              "      <td>0.001</td>\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
637
              "      <td>0.002</td>\n",
638
639
640
641
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>693</th>\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
642
643
644
              "      <td>0.608</td>\n",
              "      <td>0.326</td>\n",
              "      <td>0.063</td>\n",
645
              "      <td>0.000</td>\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
646
              "      <td>0.003</td>\n",
647
648
649
650
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>694</th>\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
651
652
653
              "      <td>0.608</td>\n",
              "      <td>0.317</td>\n",
              "      <td>0.072</td>\n",
654
              "      <td>0.001</td>\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
655
              "      <td>0.002</td>\n",
656
657
658
659
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>695</th>\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
660
661
662
              "      <td>0.605</td>\n",
              "      <td>0.320</td>\n",
              "      <td>0.073</td>\n",
663
              "      <td>0.001</td>\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
664
              "      <td>0.002</td>\n",
665
666
667
668
669
670
671
672
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "        Fe     Ni     Co     Cr      V   Cu\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
673
674
675
676
677
678
              "690  0.614  0.330  0.053  0.000  0.003  0.0\n",
              "691  0.613  0.331  0.052  0.000  0.003  0.0\n",
              "692  0.612  0.323  0.062  0.001  0.002  0.0\n",
              "693  0.608  0.326  0.063  0.000  0.003  0.0\n",
              "694  0.608  0.317  0.072  0.001  0.002  0.0\n",
              "695  0.605  0.320  0.073  0.001  0.002  0.0"
679
680
681
            ]
          },
          "metadata": {},
Christoph Freysoldt's avatar
Christoph Freysoldt committed
682
          "execution_count": 12
683
684
685
686
687
688
689
690
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
691
          "height": 235
692
693
        },
        "id": "uIm7HRMYthG5",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
694
        "outputId": "3202a4da-a783-44d9-cec9-ebb91cc6893d"
695
696
697
698
699
      },
      "source": [
        "csv_data = pd.read_csv('data_base.csv', header=0).iloc[:,1:19]\n",
        "csv_data.iloc[690:696,:6].round(3)"
      ],
Christoph Freysoldt's avatar
Christoph Freysoldt committed
700
      "execution_count": 13,
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>Fe</th>\n",
              "      <th>Ni</th>\n",
              "      <th>Co</th>\n",
              "      <th>Cr</th>\n",
              "      <th>V</th>\n",
              "      <th>Cu</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>690</th>\n",
              "      <td>0.630</td>\n",
              "      <td>0.330</td>\n",
              "      <td>0.04</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>691</th>\n",
              "      <td>0.625</td>\n",
              "      <td>0.335</td>\n",
              "      <td>0.04</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>692</th>\n",
              "      <td>0.635</td>\n",
              "      <td>0.315</td>\n",
              "      <td>0.05</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>693</th>\n",
              "      <td>0.625</td>\n",
              "      <td>0.325</td>\n",
              "      <td>0.05</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>694</th>\n",
              "      <td>0.635</td>\n",
              "      <td>0.305</td>\n",
              "      <td>0.06</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>695</th>\n",
              "      <td>0.625</td>\n",
              "      <td>0.315</td>\n",
              "      <td>0.06</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "        Fe     Ni    Co   Cr    V   Cu\n",
              "690  0.630  0.330  0.04  0.0  0.0  0.0\n",
              "691  0.625  0.335  0.04  0.0  0.0  0.0\n",
              "692  0.635  0.315  0.05  0.0  0.0  0.0\n",
              "693  0.625  0.325  0.05  0.0  0.0  0.0\n",
              "694  0.635  0.305  0.06  0.0  0.0  0.0\n",
              "695  0.625  0.315  0.06  0.0  0.0  0.0"
            ]
          },
          "metadata": {},
Christoph Freysoldt's avatar
Christoph Freysoldt committed
802
          "execution_count": 13
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "7uheLggK8WqX"
      },
      "source": [
        "**Visualize the WAE latent space**\n",
        "\n",
        "Here we assign different colors to alloy with and without Copper,\n",
        "as we expected them to differ significantly in the latent space.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 549
        },
        "id": "Ua13kwzjt0jv",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
827
        "outputId": "b1431013-bb2a-4797-9406-15394b20e9db"
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
      },
      "source": [
        "sns.set_style('ticks')\n",
        "model = WAE(raw_x.shape[1]).to(device)\n",
        "model.load_state_dict(torch.load(model_dir))\n",
        "dataset = FeatureDataset(raw_x[:], raw_y[:])\n",
        "latents = get_latents(model, dataset)\n",
        "\n",
        "low_cu = raw_x[:,5] < 0.05\n",
        "low_cu_latent = latents[low_cu]\n",
        "low_cu_color = raw_y[:][low_cu]\n",
        "\n",
        "high_cu = raw_x[:,5] >= 0.05\n",
        "high_cu_latent = latents[high_cu]\n",
        "high_cu_color = raw_y[:][high_cu]\n",
        "\n",
        "\n",
        "# figure settings\n",
        "fig, axs = plt.subplots(figsize = (3, 3),dpi=200)\n",
        "\n",
        "#axs.set_aspect(1.)\n",
        "#axs.set_ylim(-7,7)\n",
        "#axs.set_xlim(-11,5)\n",
        "\n",
        "axs.set_yticks(np.arange(-6, 8, step=2))\n",
        "axs.set_xticks(np.arange(-10, 5, step=2))\n",
        "\n",
        "axs.set_yticklabels(np.arange(-6, 8, step=2), fontsize=7)\n",
        "axs.set_xticklabels(np.arange(-10, 5, step=2), fontsize=7)\n",
        "\n",
        "\n",
        "for axis in ['top','bottom','left','right']:\n",
        "  axs.spines[axis].set_linewidth(1.)\n",
        "\n",
        "\n",
        "axs.tick_params(axis='both', which='major', top=False, labeltop=False, direction='out', width=1., length=4)\n",
        "axs.tick_params(axis='both', which='major', right=False, labelright=False, direction='out', width=1., length=4)\n",
        "\n",
        "#scatter1 = axs.scatter(low_cu_latent[:,0], low_cu_latent[:,1], c=low_cu_color, alpha=.75, s=10, linewidths=0, cmap='viridis')\n",
        "#scatter2 = axs.scatter(high_cu_latent[:,0], high_cu_latent[:,1], c=high_cu_color, alpha=.75, s=9, linewidths=0, cmap='Reds')\n",
        "\n",
        "scatter1 = axs.scatter(low_cu_latent[:,0], low_cu_latent[:,1], c='steelblue', alpha=.55, s=8, linewidths=0, label='Alloys w/o Cu')\n",
        "scatter2 = axs.scatter(high_cu_latent[:,0], high_cu_latent[:,1], c='firebrick', alpha=.65, s=14, linewidths=0, marker='^', label='Alloys w/ Cu')\n",
        "#scatter3 = axs.scatter(latents_exp_4[:,0], latents_exp_4[:,1], alpha=1., s=10, linewidths=.75, edgecolors='darkslategray', facecolors='w')#, label='New FeCoNiCr HEAs')\n",
        "#scatter4 = axs.scatter(latents_exp_5[:,0], latents_exp_5[:,1], alpha=1., s=16, linewidths=.75, edgecolors='darkred', facecolors='w',marker='^')#, label='New FeCoNiCrCu HEAs')\n",
        "\n",
        "handles,labels = axs.get_legend_handles_labels()\n",
        "handles = handles[::1]\n",
        "labels = labels[::1]\n",
        "\n",
        "legend_properties = {'size':7.5}\n",
        "axs.legend(handles, labels, loc='upper right', bbox_to_anchor=(1.015,1.017), handletextpad=-0.3, frameon=False, prop=legend_properties)\n",
        "#axs.legend(handles, labels, loc='upper left', bbox_to_anchor=(-0.045,1.017), handletextpad=-0.3, frameon=False, prop=legend_properties)\n",
        "\n",
        "#rect = patches.Rectangle((-19.4,15.0), 18, 4.5, linewidth=0,edgecolor=None,facecolor='k', alpha=0.03,linestyle=None,zorder=-10) #(0.2,15.4), 14, 4.1\n",
        "#axs.add_patch(rect)\n",
        "\n",
        "fig.savefig('Figure3_a.tif', bbox_inches = 'tight', pad_inches=0.01)"
      ],
Christoph Freysoldt's avatar
Christoph Freysoldt committed
887
      "execution_count": 14,
888
889
890
891
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
Christoph Freysoldt's avatar
Christoph Freysoldt committed
892
            "image/png": "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\n",
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
            "text/plain": [
              "<Figure size 600x600 with 1 Axes>"
            ]
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "6kU0c7vv9bkg"
      },
      "source": [
        "#**From WAE latent space to composition**\n",
        "\n",
        "In order to sample composition from the latent space. We turn the latent space into probability distribution via Gausian Mixture Model (GMM) \n",
        "\n",
        "\n",
        "\n",
        "\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "oS7EEdLX03Mo"
      },
      "source": [
        "#plotting functions\n",
        "def draw_ellipse(position, covariance, ax=None, **kwargs):\n",
        "    \"\"\"Draw an ellipse with a given position and covariance\"\"\"\n",
        "    ax = ax or plt.gca()\n",
        "    \n",
        "    # Convert covariance to principal axes\n",
        "    if covariance.shape == (2, 2):\n",
        "        U, s, Vt = np.linalg.svd(covariance)\n",
        "        angle = np.degrees(np.arctan2(U[1, 0], U[0, 0]))\n",
        "        width, height = 2 * np.sqrt(s)\n",
        "    else:\n",
        "        angle = 0\n",
        "        width, height = 2 * np.sqrt(covariance)\n",
        "    \n",
        "    # Draw the Ellipse\n",
        "    for nsig in range(1, 4):\n",
        "        ax.add_patch(Ellipse(position, nsig * width, nsig * height,\n",
        "                             angle, **kwargs))\n",
        "        \n",
        "def plot_gmm(gm, X, label=True, ax=None):\n",
        "    X= latents\n",
        "    fig, axs = plt.subplots(1,1,figsize=(2,2),dpi=200)\n",
        "    ax = axs or plt.gca()\n",
        "    labels = gm.fit(X).predict(X)\n",
        "    if label:\n",
        "        low_cu = raw_x[:,5] < 0.05\n",
        "        low_cu_latent = latents[low_cu]\n",
        "        low_cu_color = raw_y[:][low_cu]\n",
        "\n",
        "        high_cu = raw_x[:,5] >= 0.05\n",
        "        high_cu_latent = latents[high_cu]\n",
        "        high_cu_color = raw_y[:][high_cu]\n",
        "\n",
        "        scatter1 = axs.scatter(low_cu_latent[:,0], low_cu_latent[:,1], c=low_cu_color, alpha=.65, s=8, linewidths=0, cmap='viridis')\n",
        "        scatter2 = axs.scatter(high_cu_latent[:,0], high_cu_latent[:,1], c=high_cu_color, alpha=.65, s=14, linewidths=0, cmap='Reds', marker='^')\n",
        "        #scatter3 = axs.scatter(latents[698:,0], latents[698:,1], alpha=1., s=10, linewidths=.75, edgecolors='k', facecolors='none')\n",
        "    else:\n",
        "        ax.scatter(X[:, 0], X[:, 1], s=5, zorder=2)\n",
        "    ax.axis('equal')\n",
        "    \n",
        "    w_factor = 0.2 / gm.weights_.max()\n",
        "    for pos, covar, w in zip(gm.means_, gm.covariances_, gm.weights_):\n",
        "        draw_ellipse(pos, covar, alpha= 0.75*w * w_factor, facecolor='slategrey', zorder=-10)"
      ],
Christoph Freysoldt's avatar
Christoph Freysoldt committed
967
      "execution_count": 21,
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Mhbv_7whyr__"
      },
      "source": [
        "Here the GMM is applied, you might wonder why 4 is chosen, the answer can be found below"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
984
          "height": 434
985
986
        },
        "id": "lud3Guz13qvc",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
987
        "outputId": "6aed482a-0958-411c-8e37-1fe4a6c54843"
988
989
990
991
992
993
      },
      "source": [
        "gm = GaussianMixture(n_components=4, random_state=0, init_params='kmeans').fit(latents) #plot a n_components v.s. Average negative log likelihood\n",
        "print('Average negative log likelihood:', -1*gm.score(latents))\n",
        "plot_gmm(gm, latents)"
      ],
Christoph Freysoldt's avatar
Christoph Freysoldt committed
994
      "execution_count": 22,
995
996
997
998
999
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1000
            "Average negative log likelihood: 1.3329691491445406\n"
1001
1002
1003
1004
1005
          ]
        },
        {
          "output_type": "display_data",
          "data": {
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1006
            "image/png": "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\n",
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
            "text/plain": [
              "<Figure size 400x400 with 1 Axes>"
            ]
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "iaK6ggga-iRF"
      },
      "source": [
        "Using elbow method to find out the best # of components, the best number of cluster is either 4 or 5."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "P8_AGKU333z8",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1031
        "outputId": "f1da3e61-899b-4970-d681-bd025172fa57"
1032
1033
1034
1035
1036
1037
1038
1039
      },
      "source": [
        "scores=[] #using elbow method to find out the best # of components\n",
        "for i in range(1,12):\n",
        "  gm = GaussianMixture(n_components=i, random_state=0, init_params='kmeans').fit(latents)\n",
        "  print('Average negative log likelihood:', -1*gm.score(latents))\n",
        "  scores.append(-1*gm.score(latents))"
      ],
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1040
      "execution_count": 23,
1041
1042
1043
1044
1045
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
            "Average negative log likelihood: 1.6934940458870427\n",
            "Average negative log likelihood: 1.5939515381329854\n",
            "Average negative log likelihood: 1.3446285344006002\n",
            "Average negative log likelihood: 1.3329691491445406\n",
            "Average negative log likelihood: 1.1957491673672727\n",
            "Average negative log likelihood: 1.1577345788629838\n",
            "Average negative log likelihood: 1.1085116154613388\n",
            "Average negative log likelihood: 1.106149515195862\n",
            "Average negative log likelihood: 1.0059797843308775\n",
            "Average negative log likelihood: 1.012995374227744\n",
            "Average negative log likelihood: 0.9596908609051571\n"
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 268
        },
        "id": "ywT4MXG45OkC",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1069
        "outputId": "befdfcfc-0c12-4706-ce15-16ee75fbdcf4"
1070
1071
1072
1073
1074
1075
1076
1077
      },
      "source": [
        "import matplotlib.pyplot as plt\n",
        "plt.figure()\n",
        "plt.scatter(range(1,12), scores,color='red')\n",
        "plt.plot(range(1,12),scores)\n",
        "plt.show()"
      ],
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1078
      "execution_count": 24,
1079
1080
1081
1082
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1083
            "image/png": "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\n",
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "AINTm8aV-yqP"
      },
      "source": [
        "#INVAR Classifier\n",
        "\n",
        "A simple neural network classifier that predicts INVAR based on composition. "
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "80SQeJDw5er_"
      },
      "source": [
        "class Classifier(nn.Module): #a very simple classifer with large dropout. intuition here: as simple as possible, given that we only have 2d input\n",
        "    def __init__(self):\n",
        "        super(Classifier, self).__init__()\n",
        "        self.fc = nn.Sequential(\n",
        "            nn.Linear(2,8),\n",
        "            nn.Dropout(0.5),\n",
        "            nn.Linear(8,1),\n",
        "            nn.Sigmoid()\n",
        "        )\n",
        "    \n",
        "    def forward(self, x):\n",
        "        return self.fc(x)"
      ],
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1122
      "execution_count": 25,
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Gf_Nrnjx_1s_"
      },
      "source": [
        "**Classifier training**"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "6ervUJMQ5W7N",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1141
        "outputId": "a1613e9e-0970-48da-bb63-c644f122c192"
1142
1143
1144
1145
1146
1147
      },
      "source": [
        "same_seeds(1)\n",
        "\n",
        "params['cls_bs'] = 16\n",
        "params['cls_lr'] = 1e-4\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1148
        "params['cls_epoch'] = 100\n",
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
        "params['num_fold'] = 5\n",
        "\n",
        "\n",
        "params['label_y'] = np.where(raw_y<5, 1, 0)\n",
        "params['latents'] = latents\n",
        "\n",
        "cls = Classifier().to(device)\n",
        "opt = Adam(cls.parameters(), lr=params['cls_lr'], weight_decay=0.)\n",
        "\n",
        "\n",
        "def training_Cls(model, optimizer, params):\n",
        "    label_y = params['label_y']\n",
        "    latents = params['latents']\n",
        "    cls_epoch = params['cls_epoch']\n",
        "\n",
        "    kf = KFold(n_splits=params['num_fold'])\n",
        "    train_acc = []\n",
        "    test_acc = []\n",
        "\n",
        "    k=1\n",
        "    for train, test in kf.split(latents):\n",
        "        x_train, x_test, y_train, y_test = latents[train], latents[test], label_y[train], label_y[test]\n",
        "        cls_dataset = AttributeDataset(x_train, y_train)\n",
        "        cls_dataloader = DataLoader(cls_dataset, batch_size=params['cls_bs'], shuffle=True)\n",
        "        cls_testDataset = AttributeDataset(x_test, y_test)\n",
        "        cls_testDataloader = DataLoader(cls_testDataset, batch_size=cls_testDataset.__len__(), shuffle=False)\n",
        "\n",
        "\n",
        "        for epoch in range(cls_epoch):\n",
        "            t = time.time()\n",
        "            total_loss = []\n",
        "            total_acc = []\n",
        "            cls.train()\n",
        "            \n",
        "            for i, data in enumerate(cls_dataloader):\n",
        "                x = data[0].to(device)\n",
        "                y = data[1].to(device)\n",
        "                y_pred = cls(x)\n",
        "                loss = F.binary_cross_entropy(y_pred, y)\n",
        "                total_acc.append(torch.sum(torch.where(y_pred>=0.5,1,0) == y).detach().cpu().numpy())\n",
        "                total_loss.append(loss.item())\n",
        "\n",
        "                opt.zero_grad()\n",
        "                loss.backward()\n",
        "                opt.step()\n",
        "            \n",
        "            #eval\n",
        "            cls.eval()\n",
        "            for test in cls_testDataloader:\n",
        "                x = test[0].to(device)\n",
        "                y = test[1].to(device)\n",
        "                y_pred = cls(x)\n",
        "                accuracy = torch.sum(torch.where(y_pred>=0.5,1,0) == y) / y_pred.size(0)\n",
        "                test_loss = F.binary_cross_entropy(y_pred, y)\n",
        "\n",
        "            #print(f'[{epoch+1:03}/{cls_epoch}] loss:{sum(total_loss)/len(total_loss):.3f} test_loss:{test_loss.item():.3f} acc:{sum(total_acc)/cls_dataset.__len__():.3f} test_acc:{accuracy:.3f} time:{time.time()-t:.3f}')\n",
        "        \n",
        "        print('[{}/{}] train_acc: {:.04f} || test_acc: {:.04f}'.format(k, params['num_fold'], sum(total_acc)/cls_dataset.__len__(), accuracy.item()))\n",
        "        train_acc.append(sum(total_acc)/cls_dataset.__len__())\n",
        "        test_acc.append(accuracy.item())\n",
        "        k+=1\n",
        "    print('train_acc: {:.04f} || test_acc: {:.04f}'.format(sum(train_acc)/len(train_acc), sum(test_acc)/len(test_acc)))\n",
        "    return train_acc, test_acc\n",
        "\n",
        "train_acc, test_acc = training_Cls(cls, opt, params)"
      ],
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1215
      "execution_count": 26,
1216
1217
1218
1219
1220
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1221
1222
1223
1224
1225
1226
            "[1/5] train_acc: 0.8183 || test_acc: 0.8929\n",
            "[2/5] train_acc: 0.8797 || test_acc: 0.7122\n",
            "[3/5] train_acc: 0.8205 || test_acc: 0.9065\n",
            "[4/5] train_acc: 0.8474 || test_acc: 0.8058\n",
            "[5/5] train_acc: 0.8276 || test_acc: 0.9137\n",
            "train_acc: 0.8387 || test_acc: 0.8462\n"
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "hmkRO4PTAbmE"
      },
      "source": [
        "#Markov Chain Monte Carlo for composition sampling"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "tbBx1tu_6HR2"
      },
      "source": [
        "def MCMC(gm, classifier, n_samples, sigma=0.1): #MCMC\n",
        "    sample_z = []\n",
        "\n",
        "    z = gm.sample(1)[0]\n",
        "    for i in range(n_samples):\n",
        "        uniform_rand = np.random.uniform(size=1)\n",
        "        z_next = np.random.multivariate_normal(z.squeeze(),sigma*np.eye(2)).reshape(1,-1)\n",
        "\n",
        "        z_combined = np.concatenate((z, z_next),axis=0)\n",
        "        scores = cls(torch.Tensor(z_combined).to(device)).detach().cpu().numpy().squeeze() \n",
        "        z_score, z_next_score = np.log(scores[0]), np.log(scores[1]) #z score needes to be converted to log, coz gm score is log.\n",
        "        z_prob, z_next_prob = (gm.score(z)+z_score), (gm.score(z_next)+z_next_score) # two log addition, output: log probability\n",
        "        accepence = min(0, (z_next_prob - z_prob))\n",
        "\n",
        "        if i == 0:\n",
        "            sample_z.append(z.squeeze())\n",
        "\n",
        "        if np.log(uniform_rand) < accepence:\n",
        "            sample_z.append(z_next.squeeze())\n",
        "            z = z_next\n",
        "        else:\n",
        "            pass\n",
        "\n",
        "    return np.stack(sample_z)"
      ],
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1271
      "execution_count": 27,
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "TGX6Y-taAp2v"
      },
      "source": [
        "Sample 10000 times with sigma=0.5"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Z4uB20Bf6VZ_",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1290
        "outputId": "b6acefb4-c685-460a-9d5b-a52c718bf379"
1291
1292
      },
      "source": [
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1293
        "sample_z = MCMC(gm=gm, classifier=cls, n_samples=5000, sigma=0.5)\n",
1294
1295
1296
        "WAE_comps = model._decode(torch.Tensor(sample_z).to(device)).detach().cpu().numpy()  # new_comps save as csv and goes to TERM\n",
        "print('Sample size:', sample_z.shape)"
      ],
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1297
      "execution_count": 28,
1298
1299
1300
1301
1302
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1303
            "Sample size: (1129, 2)\n"
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "YJJIWk8L6go6",
        "colab": {
          "base_uri": "https://localhost:8080/",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1314
          "height": 204
1315
        },
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1316
        "outputId": "07f09e18-7012-4518-cc25-45669c346c23"
1317
1318
1319
1320
1321
1322
1323
      },
      "source": [
        "WAE_comps=pd.DataFrame(WAE_comps)\n",
        "WAE_comps.columns=column_name\n",
        "WAE_comps.to_csv('comps_WAE.csv',index=False)\n",
        "WAE_comps.head()"
      ],
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1324
      "execution_count": 29,
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>Fe</th>\n",
              "      <th>Ni</th>\n",
              "      <th>Co</th>\n",
              "      <th>Cr</th>\n",
              "      <th>V</th>\n",
              "      <th>Cu</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1359
1360
1361
1362
1363
1364
              "      <td>0.621771</td>\n",
              "      <td>0.278061</td>\n",
              "      <td>0.066139</td>\n",
              "      <td>0.033976</td>\n",
              "      <td>0.000051</td>\n",
              "      <td>0.000002</td>\n",
1365
1366
1367
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1368
1369
1370
1371
1372
1373
              "      <td>0.290811</td>\n",
              "      <td>0.193655</td>\n",
              "      <td>0.426399</td>\n",
              "      <td>0.000012</td>\n",
              "      <td>0.089111</td>\n",
              "      <td>0.000012</td>\n",
1374
1375
1376
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1377
1378
1379
1380
1381
1382
              "      <td>0.356562</td>\n",
              "      <td>0.032219</td>\n",
              "      <td>0.479116</td>\n",
              "      <td>0.132074</td>\n",
              "      <td>0.000014</td>\n",
              "      <td>0.000015</td>\n",
1383
1384
1385
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1386
1387
1388
1389
1390
1391
              "      <td>0.232804</td>\n",
              "      <td>0.026366</td>\n",
              "      <td>0.633758</td>\n",
              "      <td>0.107050</td>\n",
              "      <td>0.000015</td>\n",
              "      <td>0.000007</td>\n",
1392
1393
1394
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1395
1396
1397
1398
1399
1400
              "      <td>0.431049</td>\n",
              "      <td>0.083583</td>\n",
              "      <td>0.353330</td>\n",
              "      <td>0.132014</td>\n",
              "      <td>0.000015</td>\n",
              "      <td>0.000009</td>\n",
1401
1402
1403
1404
1405
1406
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1407
1408
1409
1410
1411
1412
              "         Fe        Ni        Co        Cr         V        Cu\n",
              "0  0.621771  0.278061  0.066139  0.033976  0.000051  0.000002\n",
              "1  0.290811  0.193655  0.426399  0.000012  0.089111  0.000012\n",
              "2  0.356562  0.032219  0.479116  0.132074  0.000014  0.000015\n",
              "3  0.232804  0.026366  0.633758  0.107050  0.000015  0.000007\n",
              "4  0.431049  0.083583  0.353330  0.132014  0.000015  0.000009"
1413
1414
1415
            ]
          },
          "metadata": {},
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1416
          "execution_count": 29
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "lwnDaCQmA72h"
      },
      "source": [
        "Plotting the sampled composition along with known datas"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 565
        },
        "id": "VlhEqqLS8N9x",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1437
        "outputId": "a70e2992-8738-49c2-9fed-545c1925b2f9"
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
      },
      "source": [
        "sns.set_style('ticks')\n",
        "\n",
        "t = time.localtime()\n",
        "model_dir = os.path.join(root, '{}/{}_100.pth'.format(params['model_name'], params['model_name']))\n",
        "model = WAE(raw_x.shape[1]).to(device)\n",
        "model.load_state_dict(torch.load(model_dir))\n",
        "model.eval()\n",
        "\n",
        "dataset = FeatureDataset(raw_x[:], raw_y[:])\n",
        "latents = get_latents(model,dataset)\n",
        "\n",
        "low_cu = raw_x[:,5] < 0.05\n",
        "low_cu_latent = latents[low_cu]\n",
        "low_cu_color = raw_y[:][low_cu]\n",
        "\n",
        "high_cu = raw_x[:,5] >= 0.05\n",
        "high_cu_latent = latents[high_cu]\n",
        "high_cu_color = raw_y[:][high_cu]\n",
        "\n",
        "fig, axs = plt.subplots(figsize = (3, 3),dpi=200)\n",
        "\n",
        "axs.set_xlim(-6,3)\n",
        "axs.set_ylim(-4,5)\n",
        "\n",
        "scatter1 = axs.scatter(low_cu_latent[:,0], low_cu_latent[:,1], c='steelblue', alpha=.55, s=2, linewidths=0, cmap='viridis')\n",
        "scatter2 = axs.scatter(high_cu_latent[:,0], high_cu_latent[:,1], c=high_cu_color, alpha=.65, s=3.5, linewidths=0, cmap='Reds', marker='^')\n",
        "\n",
        "scatter4 = axs.scatter(sample_z[:,0], sample_z[:,1], c='k', alpha=.15, s=0.8, linewidths=0, zorder=-1)\n",
        "\n",
        "plt.show()"
      ],
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1471
      "execution_count": 30,
1472
1473
1474
1475
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1476
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAIkCAYAAAD2/5R6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAewgAAHsIBbtB1PgAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzde3Cc933f+/dz2SsWwAIgSIBXgaIoWaJkO3FkS5GdOHUySZo/3NqZ9BzXPU0z9Uxnoun0NJOTsadxq8w00zSZpGNP25k2ceLaTurYudmpO+fETmRZtnWjbjRFUhRBEiQXFwJYYK/PPpff+WO5qwW4ABYgiNt+XjMacbH7PPvsktLz4ff3/f1+ljHGICIiItJF7O2+ABEREZGtpgAkIiIiXUcBSERERLqOApCIiIh0HQUgERER6ToKQCIiItJ1FIBERESk6ygAiYiISNdRABIREZGuowAkIiIiXUcBSERERLqOApCIiIh0HQUgERER6ToKQCIiItJ1FIBERESk6ygAiYiISNdRABIREZGu4273BXSDXC7Ht771rebjo0ePkkqltvGKREREdodKpcLVq1ebj3/iJ36C0dHROz6vAtAW+Na3vsVTTz213ZchIiKyJ3zsYx+743NoCExERES6jgKQiIiIdB0NgW2BI0eOLHn867/+69x///3bdDUiIiK7x/nz55e0kSy/p26UAtAWSKfTSx7ff//9vOc979mmqxEREdm9lt9TN0pDYCIiItJ1FIBERESk6ygAiYiISNdRABIREZGuowAkIiIiXUcBSERERLqOApCIiIh0HQUgERER6ToKQCIiItJ1FIBERESk6ygAiYiISNdRABIREZGuowAkIiIiXUcBSERERLqOApCIiIh0HQUgERER6ToKQCIiItJ1FIBERESk6ygAiYiISNdRABIREZGuowAkIiIiXUcBSERERLqOApCIiIh0HQUgERER6ToKQCIiItJ1FIBERESk6ygAiYiISNdRABIREZGuowAkIiIiXUcBSERERLqOApCIiIh0HQUgERER6ToKQCIiItJ1FIBERESk6ygAiYiISNdRABIREZGus+cD0K/92q9x//33N//5zGc+s92XJCIiIttsTwegp59+mj//8z/f7ssQERGRHWbPBqBiscinP/1pANLp9DZfjYiIiOwkezYA/dZv/Ra5XI7R0VF+4Rd+YbsvR0RERHaQPRmAvve97/HlL38ZgE9/+tP09PRs8xWJiIjITrLnAlClUuHf/Jt/gzGGn/3Zn+WDH/zgdl+SiIiI7DB7LgD9zu/8DhMTE2SzWT71qU9t9+WIiIjIDrSnAtDp06f54he/CMCv/uqvsm/fvm2+IhEREdmJ3O2+gM3ieR6f/OQniaKIxx57jI985CObev4bN25w48aNDR17/vz5Tb0WERERuTN7JgD9p//0nxgfHyeZTPLUU09t+vm/+tWv8tnPfnbTzysiIiJbb08Mgb322mv84R/+IQBPPvkkR48e3d4LEhERkR1t1wegWq3Gpz71KcIw5KGHHuIXf/EXt/uSREREZIfb9UNg/+W//BcuXLiA4zj8xm/8Bo7j3JX3+chHPsJjjz22oWPPnz9/V4blREREZGN2dQA6d+4c/+2//TcA/uk//ac89NBDd+29Dh48yMGDB+/a+UVERGTr7OoA9Gd/9mf4vo9t28RiMf7zf/7PbV/3wgsvLPl143VjY2P8zM/8zJZcq4iIiOwcuzoAGWMAiKKI//pf/2tHxzz33HM899xzAPy9v/f3FIBERES60K5vghYRERFZr11dAfrUpz7V0XYXn/nMZ5pr+PzyL/8yTz755N2+NBEREdnBVAESERGRrqMAJCIiIl1HAUhERES6jgKQiIiIdJ1d3QTdqSeffFKNzyIiItKkCpCIiIh0HQUgERER6ToKQCIiItJ1FIBERESk6ygAiYiISNdRABIREZGuowAkIiIiXUcBSERERLqOApCIiIh0HQUgERER6ToKQCIiItJ1FIBERESk6ygAiYiISNdRABIREZGuowAkIiIiXUcBSERERLqOApCIiIh0HQUgERER6ToKQCIiItJ1FIBERESk6ygAiYiISNdRABIREZGuowAkIiIiXUcBSERERLqOApCIiIh0HQUgERER6ToKQCIiItJ1FIBERESk6ygAiYiISNdRABIREZGuowAkIiIiXUcBSERERLqOApCIiIh0HQUgERER6ToKQCIiItJ1FIBERESk6ygAiYiISNdRABIREZGuowAkIiIiXUcBSERERLqOApCIiIh0HQUgERER6ToKQCIiItJ1FIBERESk6ygAiYiISNdRABIREZGuowAkIiIiXUcBSERERLqOApCIiIh0HQUgERER6ToK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x+Ohq6uLJ554gldffZVgMMjWrVsJhULcdNNNhR24iMgcTO1n8VgiBAIx4NQKRjIkhCJxxkIh9p708+61LYUY9rzMVL1K/z14PW6WNVXPK8SYrR9KMivZAAQTCf7666/POMV100038YMf/IAHHngAgAcffJBLLrmEFStWLPZQRUTmZWo/i9eeSPWwTNVa5yUSMzjQMwzArsMDrG2vLYkq0GzVq0KtoJPyVbIBqLa2lqeffpqKiooZH/eZz3yGV155hR07dhCNRvnlL3/JrbfeukijFBFZuKn9LDP1vbyjo5GRQIQKtx2n3TrrEvB89QzNtdk4m6XrhVhBJ+WrZAOQw+HA4XBk9djLL7+cHTt2ALBv3758DktEpKDWttey96R/xiXgyXBi2D088WrPjD1DMwWkmb6WbDb2jUcwnFU61kOKTskGoLmorKxM3Q6FQgUciYhIfmUzVZQMJydGxmasusw0LTXblFVtbS2+8Qi/OTSCxTo+a1P2XKe4tJxdFsoUASi96tPW1lbAkYiI5N9sU0XJ/qHOag8Hh3oyVl1mmpaabcrK4/FgOKuwWMczPmau406n5eyyUGUfgKLRKNu3b0/df8973jOv63R1ddHV1TWv79W0m4gUk/SVUH+x0Z3VyqupASmbKat8TmtpObssVNkHoO9///up5fJnnHHGvAPQ9u3b+fa3v527gYmIFIGZqi4zTUtlM2WVz5VbWs4uC1XWAeiZZ57hO9/5DjDRNL1161asVmuBRyUiUjpmC0izhRqt3JJildcAdO2117Jz586cXOsb3/gGmzdvzvrxu3fv5vbbb8d4a476rrvuYsOGDTkZi4iIiJS2sqwA7d27l0996lOMj0803918881ce+21C7rmli1bOP/88+f1vfv27WPr1q0Len4RkXKnlV2ymPIagC677DLWrl2bk2t1dHRk9bh9+/Zx/fXX4/f7AfjsZz/LbbfdtuDnb2tr0woyEZE80souWUx5DUDXXHNNPi9/imT48fl8AHz605/m9ttvX9QxiIjI/GhllyymspkCS4afoaEhAG688UbuuOOOAo9KRESypZVdspjKYknU1PBzww03cNdddxV4VCIiIlKsSj4AHThwYFL4uf766/n85z9f4FGJiIhIMSvpAHTw4EE++clPTgo/X/jCFwo8KhERESl2JdsD1NPTwyc/+UkGBwcBWLduHeeee27q1PdM3G43F1544WIMUURERIpUyQago0ePMjAwkLr/+uuvc8stt8z6fe3t7Tz99NP5HJqIiIgUuZKeAhMRERGZj5KtAL3rXe/SKesiIiIyL6oAiYiIiOkoAImIiIjpKACJiIiI6SgAiYiIiOkoAImIiIjpKACJiIiI6SgAiYiIiOkoAImIiIjpKACJiIiI6SgAiYiIiOkoAImIiIjpKACJiIiI6SgAiYiIiOkoAImIiIjpKACJiIiI6SgAiYiIiOkoAImIiIjpKACJiIiI6SgAiYiIiOkoAImIiIjpKACJiIiI6SgAiYiIiOkoAImIiIjpKACJiIiI6SgAiYiIiOkoAImIiIjpKACJiIiI6SgAiYiIiOkoAImIiIjpKACJiIiI6SgAiYiIiOkoAImIiIjpKACJiIiI6SgAiYiIiOkoAImIiIjpKACJiIiI6SgAiYiIiOkoAImIiIjpKACJiIiI6SgAiYiIiOkoAImIiIjpKACJiIiI6SgAiYiIiOkoAImIiIjpKACJiIiI6SgAiYiIiOkoAImIiIjpKACJiIiI6SgAiYiIiOkoAImIiIjpKACJiIiI6SgAiYiIiOkoAImIiIjpKACJiIiI6SgAiYiIiOkoAImIiIjpKACJiIiI6SgAiYiIiOkoAImIiIjpKACJiIiI6SgAiYiIiOkoAImIiIjpKACJiIiI6SgAiYiIiOkoAImIiIjpKACJiIiI6SgAiYiIiOkoAImIiIjpKACJiIiI6SgAiYiIiOkoAImIiIjpKACJiIiI6SgAiYiIiOkoAImIiIjpKACJiIiI6SgAiYiIiOkoAImIiIjpKACJiIiI6dgLPYB8OXToEB/+8IcJh8OpP9u3b18BRyQiIiLFoiwrQIZh8MUvfnFS+BERERFJKssAtG3bNnbt2oXX6y30UERERKQIlV0AOnbsGN/85jcBuO222wo8GhERESlGZRWAEokEX/ziFwkGg2zYsIHrrruu0EMSERGRIlRWAejhhx9m586dOBwO7rvvPqzWsvrxREREJEfKJiF0dXVx//33A3DTTTexZs2aAo9IREREilXZBKAvfelLjI+Ps3LlSm655ZZCD0dERESKWFnsA7R9+3Z++9vfYrFYuO+++3A6nTl/jq6uLrq6uub1va+88sqk+9qPSEREJDtT3zMDgUBOrlvyAai3t5evf/3rAFx11VWce+65eXme7du38+1vfzsn19q6dWtOriMiImI2x48fz8l1Sn4K7J577mFkZITm5mbuvPPOQg9HRERESkBeK0DXXnstO3fuzMm1vvGNb7B58+ZJf/bYY4/x9NNPA3D33XdTVVWVk+cSERGR8layU2CDg4N89atfBeDSSy/l0ksvzevzbdmyhfPPP39e37tz506+9a1vpe7/7d/+LWeddVauhiYLtG/fvknTknfffbdWERYJvTbFS69NcSun1ycYDHLs2LHU/fe97305uW5eA9Bll13G2rVrc3Ktjo6OSfe3bt2Kz+ejqqqKu+++OyfPMZO2tjba2tpycq2zzjqLc845JyfXktxbs2aNXp8ipdemeOm1KW56fU6V1wB0zTXX5OW6o6OjPPHEEwB0dnbyyCOPZPV93/3ud1O3r7rqKhobG/MyPhERESluJTkFlkgkUrd37drFrl27svq+9Gmo9773vQpAIiIiJlXyq8BERERE5qokK0DV1dVZbyaY3vSlDQhFREQEVAESERERE1IAEhEREdNRABIRERHTUQASERER0ynJJui5UOOziIiITKUKkIiIiJiOApCIiIiYjgKQiIiImI4CkIiIiJhO2TdBF4O2tjY+97nPTbovxUOvT/HSa1O89NoUN70+s7Mk0k8WFRERETEBTYGJiIiI6SgAiYiIiOkoAImIiIjpKACJiIiI6SgAiYiIiOkoAImIiIjpKACJiIiI6SgAiYiIiOloJ+giEwqFeOyxx3jqqafYv38/g4OD2O12GhsbWbFiBe9617t4//vfz8qVKws9VFM7dOgQH/7whwmHw6k/27dvXwFHZE579+7lueee46WXXuLAgQP09fURi8Worq7mtNNO44ILLmDLli00NzcXeqhl5amnnuLRRx9lz5499Pf3U1lZyYoVK7jkkkv42Mc+RmVlZaGHaCpjY2M899xzPP/887z++uscOXKE0dFRXC4Xzc3NbNiwgQ9+8INs2rQJi8VS6OEWDe0EXUSeeeYZ7r33Xrq6umZ83HXXXccXv/jFRRqVTGUYBp/4xCfYtWvXpD9XAFo8IyMjXHnllRw5cmTWx3o8Hu68806uvvrq/A+szI2Pj3PHHXfw9NNPZ3xMa2sr3/zmN3n729++iCMzrx/96Ec8+OCDkz6MZXLOOefwT//0TzoW4y2qABWJ7du38/d///cYhoHFYuHd7343F1xwAUuWLMFisdDf38+ePXv4zW9+U+ihmt62bdvYtWsXXq+XQCBQ6OGYUjgcToUfm83GO9/5Ts455xyWLVuGx+Ohq6uLJ554gldffZVgMMjWrVsJhULcdNNNhR14CYvH49x2222pf4MaGxu58sor6ezsZHh4mF/96le89NJLdHd385nPfIaHH36Y0047rcCjLn+HDx9OhZ8lS5ZwwQUXcOaZZ9LQ0EA4HObll1/ml7/8JYFAgBdeeIFrr72Wn//85zQ0NBR45IWnClARePHFF7nmmmswDIO2tjb+5V/+hfXr10/72Hg8zsDAAEuWLFnkUQrAsWPHuOKKKwgGg3zhC1/ga1/7WuprqgAtnv7+fj74wQ9y/fXXzzjF9YMf/IAHHngAAIfDweOPP86KFSsWc6hl46c//Slf/vKXAejs7OTHP/4xjY2Nkx7zj//4j/zbv/0bMFFt+I//+I9FH6fZfPnLX+bEiRPceOONnH/++Vitp7b2njx5kptuuonDhw8D8JGPfGTSv11mpQBUYNFolM2bN3P06FG8Xi+PPvooy5cvL/SwZBqJRILrrruOnTt3smHDBn72s59xxhlnpL6uALR4otEokUiEioqKWR97yy23sGPHDgA+97nPceutt+Z7eGUnHo9z8cUX09/fD8B//dd/ceaZZ077uC1btvDGG28A8MMf/pALL7xwUcdqNn6/n9ra2lkft3fvXj70oQ8BE9PCv//97/F4PPkeXlHTKrAC+9///V+OHj0KwA033KDwU8Qefvhhdu7cicPh4L777pv2k5YsDofDkVX4Abj88stTtxVS5+ePf/xjKvxs3Lhx2vADE9OR1157ber+448/vijjM7Nswg/A2rVr6ejoACAYDKbed8xM/4IX2COPPJK6nUznUny6urq4//77AbjppptYs2ZNgUck2UpfkRQKhQo4ktL1f//3f6nbF1100YyPTf96+vdJ4aX/v5BN03S5UxN0AcVisdRKotraWlasWEFfXx/btm3j6aefpqurC5vNRmtrK+eddx5XX311KsHL4vrSl77E+Pg4K1eu5JZbbin0cGQO0qs+Wv0yP/v370/dftvb3jbjY5uammhtbaW7u5uBgQGGhoaor6/P9xBlFpFIZNKqSf2/oApQQR08eJBgMAhMLB197rnn+PM//3P+9V//lUOHDhEMBhkbG+PAgQM89NBDbN68mR/84AcFHrX5bN++nd/+9rdYLBbuu+8+nE5noYckWYpGo2zfvj11/z3veU/hBlPCks2zAEuXLp318emPefPNN/MyJpmbX/3qV4yOjgJw5pln0tTUVOARFZ4qQAWUnFMHGBoa4nOf+xyBQIDVq1fzoQ99iLa2Nnw+H08++SS///3vicfjPPDAAzgcDm644YYCjtw8ent7+frXvw7AVVddxbnnnlvgEclcfP/730996j3jjDMUgOYp+cYJUFdXN+vj0/tS0r9XCmNoaCg1hQ/wV3/1VwUcTfFQACqgkZGR1O3e3l4AtmzZwle+8hVsNlvqa1dffTUPPfQQ9913HwAPPPAAl112mUqYi+Cee+5hZGSE5uZm7rzzzkIPR+bgmWee4Tvf+Q4w0TS9detWNa7PU/p+Vy6Xa9bHpz9mfHw8L2OS7EQiEW699VYGBwcBuOSSS7j00ksLPKrioAA0i2uvvZadO3fm5Frf+MY32Lx5c+q+YRiTvr5ixQruueeeSeEnfRzPP/88Tz75JNFolIcffpi/+Zu/ycm4SlU+XxuAxx57LLXj7d13301VVVVOnsss8v36zGT37t3cfvvtqf/H7rrrLjZs2JCTsYiUCsMw+Lu/+zteeOEFAJYvX84//MM/FHhUxUMfhwpo6jLej3zkIzP2l/zlX/5l6vYf/vCHvI1LYHBwkK9+9asAXHrppfrEVEL27t3Lpz71qVTl4eabb560NFvmzuv1pm5ns3oo/THZblcguZVIJPjyl7/MY489Bkw0Pf/oRz+ipqamwCMrHqoAzeKyyy5j7dq1ObnW1BVc1dXVk+5n2lsjKX136GPHjuVkTKUsn6/N1q1b8fl8VFVVcffdd+fkOcwmn69PJvv27eP666/H7/cD8NnPfpbbbrstJ2Mws6qqKoaHhwHw+Xyzhprk7z/5vbK4EokE99xzDz//+c8BaGlp4cc//nFWDexmogA0i2uuuSZv1161atWk+7P9Q5H+dc2r5++1GR0d5YknngAmtvxP36tpJt/97ndTt6+66qpTjgkwm3z+vzOdZPjx+XwAfPrTn+b2229f1DGUq46ODk6cOAHAiRMnZn0jTT4WTv13TvIrkUhw77338tOf/hSYOB9s27Zt2mR3GgpABVRfX09zczN9fX3A7Ksl0r+evqGV5Fb66TC7du065dT3TL71rW+lbr/3ve81fQBaTMnwMzQ0BMCNN97IHXfcUeBRlY/Vq1enDkHdvXs35513XsbHDgwM0N3dDUBDQ4P2AFpEyfDz8MMPA9Dc3My2bdt0/l0G6gEqsIsvvjh1+7XXXpvxsXv27End1oaIIhOmhp8bbriBu+66q8CjKi+bNm1K3Z5td+dnn302dTv93zfJr6nhp6mpiW3btrFy5crCDqyIqQJUYFdccQX/+Z//CUwcMHjjjTdmbIT+2c9+lro923b0Mn/V1dVZnxmVfiSGzplafAcOHJgUfq6//no+//nPF3hU5Wfjxo00NTXR39/Pzp07ee211zIehvrQQw+l7qefwyb5tXXr1lPCjz4oz0wVoALbuHFj6rTko0ePcu+9956yPB7g3//933nyySeBiVUVH//4xxd1nCLF5uDBg3zyk5+cFH6+8IUvFHhU5clms3HzzTen7t91112pfWXS3X///amT4M8+++xJlSPJn6985Sv85Cc/Af4UftR7NTtLIr3hQQri+PHjfPzjH0/tDL1mzZpTdoL+3e9+l3r8N7/5TT7wgQ8UariSRhWgwujp6WHLli0MDAwAsG7duqzOaHO73akPHDI3sViMz3zmMzz33HPAxBvtlVdeSWdnJ36/n8cff5wXX3wRmKii/uQnP+H0008v5JBN4cEHH+R73/seABaLhdtvvz2r8LNu3TrTb6arAFQk9u/fz1//9V9z6NChjI/xer189atfVVm5iCgAFcbzzz/PddddN+fva29vT21uKXM3NjbGHXfcwa9//euMj2lpaeHBBx/k7LPPXsSRmdd8Nxz92te+xkc+8pE8jKh0qAeoSKxevZpf/OIX/Pd//zdPPPEEBw8exOfz4fV6WblyJRdddBGf+MQntKJCRAqmsrKS733ve+zYsYNHH32U3bt3Mzg4SEVFBcuXL+fSSy/lYx/7mPb+kZKgCpCIiIiYjpqgRURExHQUgERERMR0FIBERETEdBSARERExHQUgERERMR0FIBERETEdBSARERExHQUgERERMR0FIBERETEdBSARERExHQUgERERMR0FIBERETEdBSARERExHQUgERERMR0FIBERETEdBSARERExHQUgERERMR0FIBERETEdBSARERExHQUgERERMR0FIBERETEdBSARERExHQUgERERMR0FIBERETEdBSARERExHT+f0GP5XTILLM4AAAAAElFTkSuQmCC\n",
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
            "text/plain": [
              "<Figure size 600x600 with 1 Axes>"
            ]
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "jKkdRjD1DZQN"
      },
      "source": [
        "#Two-stage ensemble regression model (TERM)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Cs6dt9E0ELs9"
      },
      "source": [
        "**Ultility functions**\n",
        "*   MAPELoss - Mean Absolute Percentile Error (MAPE)\n",
        "*   normalizing_data - Normalizing the data\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "k71dxvuL84R6"
      },
      "source": [
        "import torch.nn as nn\n",
        "import torch\n",
        "import numpy as np\n",
        "import pandas as pd\n",
        "from torch.utils.data import Dataset, DataLoader\n",
        "import random\n",
        "\n",
        "class MAPELoss(nn.Module):\n",
        "     def __init__(self):\n",
        "        super(MAPELoss, self).__init__() \n",
        "        \n",
        "     def forward (self, output, target):\n",
        "         loss = torch.mean(torch.abs((target - output) / target))\n",
        "         # loss = (-1)*loss\n",
        "         return loss\n",
        "     \n",
        "def minmaxscaler(data):\n",
        "    min = np.amin(data)\n",
        "    max = np.amax(data)    \n",
        "    return (data - min)/(max-min)\n",
        "\n",
        "def weights_init(m):\n",
        "    classname = m.__class__.__name__\n",
        "    if classname.find('BatchNorm') != -1:\n",
        "        m.weight.data.normal_(1.0, 0.02)\n",
        "        m.bias.data.fill_(0)\n",
        "        \n",
        "class FeatureDataset(Dataset):\n",
        "    '''\n",
        "    Args: x is a 2D numpy array [x_size, x_features]\n",
        "    '''\n",
        "    def __init__(self, x):\n",
        "        self.x = x\n",
        "    \n",
        "    def __len__(self):\n",
        "        return self.x.shape[0]\n",
        "    \n",
        "    def __getitem__(self, idx):\n",
        "        return torch.FloatTensor(self.x[idx])\n",
        "\n",
        "    def getBatch(self, idxs = []):\n",
        "        if idxs == None:\n",
        "            return idxs\n",
        "        else:\n",
        "            x_features = []\n",
        "            for i in idxs:\n",
        "                x_features.append(self.__getitem__(i))\n",
        "            return torch.FloatTensor(x_features)\n",
        "        \n",
        "def normalizing_data(data, seed=42):  \n",
        "  df_all = data.drop(columns=['alloy'])\n",
        "  #create a min max processing object\n",
        "  composition = df_all [['Fe','Ni','Co','Cr','V','Cu']]\n",
        "  min_max_scaler = preprocessing.MinMaxScaler()\n",
        "  normalized_atomic_properties = min_max_scaler.fit_transform(df_all[['VEC','AR1','AR2','PE','Density',\n",
        "                                              'TC','MP','FI','SI','TI','M']])\n",
        "  x = pd.concat([composition,pd.DataFrame(normalized_atomic_properties)],axis=1)\n",
        "  x=x.iloc[:697]\n",
        "  y = df_all[['TEC']][:697]\n",
        "  # bins     = [18,35,48,109,202,234,525,687,695]\n",
        "  bins     = [18,35,48,109,202,234,525,687]\n",
        "  y_binned = np.digitize(y.index, bins, right=True) #stratified 7-fold: each folder contains a specific type of alloys (7 types in total, each takes 85% and 15% as training and testing)\n",
        "\n",
        "  x = torch.FloatTensor(x.values) #numpy to tensor\n",
        "  y = torch.FloatTensor(y.values) #numpy to tensor\n",
        "\n",
        "  if torch.cuda.is_available():\n",
        "      x = x.cuda()\n",
        "      y = y.cuda() \n",
        "  \n",
        "  train_features, test_features, train_labels, test_labels = train_test_split(x, y, test_size=0.15, random_state=seed, stratify=y_binned)\n",
        "  return train_features, test_features, train_labels, test_labels"
      ],
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1585
      "execution_count": 31,
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "dcW5DVUsEo0o"
      },
      "source": [
        "**Data loading**"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "h9GqV60vATsC"
      },
      "source": [
        "import datetime\n",
        "import torch.utils.data as Data\n",
        "import pandas as pd\n",
        "import torch\n",
        "import torch.nn.functional as F    \n",
        "import matplotlib.pyplot as plt\n",
        "import numpy as np\n",
        "from sklearn.model_selection import train_test_split\n",
        "import torch.nn as nn\n",
        "import torch.optim as optim\n",
        "from bayes_opt import BayesianOptimization\n",
        "import time\n",
        "import os\n",
        "from sklearn import preprocessing\n",
        "\n",
        "\n",
        "t = time.localtime()\n",
        "    \n",
        "table = pd.DataFrame(columns=['target','batch_size','lr','module__n_hidden','module__w'])\n",
        "\n",
        "plt.close('all')\n",
        "starttime = datetime.datetime.now()\n",
        "data = pd.read_csv('data_base.csv')\n",
        "\n",
        "\n",
        "train_features, test_features, train_labels, test_labels = normalizing_data(data, seed=42)"
      ],
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1630
      "execution_count": 32,
1631
1632
1633
1634
1635
1636
1637
1638
1639
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "IuRdKijDE01B",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1640
        "outputId": "186ab58a-56d5-40bd-ae70-aebb667016ba"
1641
1642
1643
1644
      },
      "source": [
        "  print(torch.cuda.is_available())"
      ],
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1645
      "execution_count": 33,
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "False\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "cqhFxU_yE3pc"
      },
      "source": [
        "**Neural network architecture**"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "g2TdhVbt9j5F"
      },
      "source": [
        "\n",
        "class Net(nn.Module):  \n",
        "    def __init__(self, n_feature=17, n_hidden=218, n_output=1, w = 6):\n",
        "        super(Net, self).__init__()    \n",
        "        # self.BN=torch.nn.BatchNorm1d(n_hidden)\n",
        "        self.hidden1 = torch.nn.Linear(n_feature, n_hidden) \n",
        "        nn.init.kaiming_normal_(self.hidden1.weight)\n",
        "        \n",
        "        self.hiddens = nn.ModuleList ([nn.Linear(n_hidden, n_hidden) for i in range(w)])                            \n",
        "        for m in self.hiddens:\n",
        "            nn.init.kaiming_normal_(m.weight)   \n",
        "        \n",
        "        self.predict = torch.nn.Linear(n_hidden, n_output)  \n",
        "        nn.init.kaiming_normal_(self.predict.weight)\n",
        "\n",
        "    def forward(self, x):  \n",
        "        x = self.hidden1(x)\n",
        "        # x = self.BN(x)\n",
        "        # x = self.Dropout (x)\n",
        "        x = F.relu(x)   \n",
        "        \n",
        "        for m in self.hiddens:\n",
        "            x = m(x)\n",
        "            # x = self.BN(x)\n",
        "            x = F.relu(x) \n",
        "                      \n",
        "        x = self.predict(x)\n",
        "        # x = self.BN_3(x)\n",
        "        # x = self.Dropout (x)\n",
        "          # 输出值\n",
        "        return x\n",
        "\n",
        "def train(net, num_epochs, batch_size, train_features, test_features, train_labels, test_labels,\n",
        "          train_loader,\n",
        "          optimizer):\n",
        "    print (\"\\n=== train begin ===\")\n",
        "    print(net)\n",
        "    train_ls, test_ls = [], []\n",
        "    loss = MAPELoss() # MAPE means Mean Absolute percentile error \n",
        "    for epoch in range(num_epochs):\n",
        "        for x, y in train_loader:\n",
        "            ls = loss(net(x).view(-1, 1), y.view(-1, 1))\n",
        "            optimizer.zero_grad()\n",
        "            ls.backward()\n",
        "            optimizer.step()\n",
        "        if epoch % 100 == 0:\n",
        "            train_ls.append(loss(net(train_features).view(-1, 1), train_labels.view(-1, 1)).item())\n",
        "            test_ls.append(loss(net(test_features).view(-1, 1), test_labels.view(-1, 1)).item())\n",
        "            print (\"epoch %d: train loss %f, test loss %f\" % (epoch, train_ls[-1], test_ls[-1]))\n",
        "        \n",
        "    print (\"=== train end ===\")\n",
        "    \n",
        "def test(model, test_loader):\n",
        "    model.eval()\n",
        "    test_loss = 0\n",
        "    n = 0\n",
        "    loss = MAPELoss() \n",
        "    with torch.no_grad():\n",
        "        for data, target in test_loader:\n",
        "            output = model(data)\n",
        "            test_loss += loss(output.view(-1, 1), target.view(-1, 1)).item()  # sum up batch loss\n",
        "            n += 1\n",
        "\n",
        "    test_loss /= n\n",
        "    \n",
        "    print('Test set: Average loss: {:.4f}'.format(\n",
        "        test_loss))\n",
        "    \n",
        "    return test_loss   \n",
        "\n",
        "    \n",
        "\n",
        "\n",
        "def train_model(batch_size,lr, module__n_hidden,module__w):\n",
        "    module__n_hidden = int(module__n_hidden) # number of neurons per layer\n",
        "    module__w = int(module__w) # number of hidden layers\n",
        "    batch_size = int(batch_size)\n",
        "    train_dataset = Data.TensorDataset(train_features, train_labels)\n",
        "    test_dataset = Data.TensorDataset(test_features, test_labels)\n",
        "    train_loader = Data.DataLoader(train_dataset, batch_size, shuffle=True)\n",
        "    test_loader = Data.DataLoader(test_dataset, batch_size, shuffle=True) \n",
        "    net = Net(n_feature=17, n_hidden=module__n_hidden, n_output=1, w = module__w)\n",
        "    if torch.cuda.is_available():\n",
        "      net = net.cuda()\n",
        "    n_epochs = 20 \n",
        "    optimizer = optim.Adam(net.parameters(), lr=lr, weight_decay=0.0001)\n",
        "    train(net, n_epochs, batch_size,train_features, test_features, \n",
        "          train_labels, test_labels,train_loader, optimizer)\n",
        "    train_loss= test(net,train_loader)\n",
        "    test_loss = test(net, test_loader)\n",
        "\n",
        "    \n",
        "    r = -np.abs(train_loss-test_loss)\n",
        "    \n",
        "    return -test_loss\n",
        "          \n",
        "\n",
        "    "
      ],
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1770
      "execution_count": 34,
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "FyzNkXLkFQXT"
      },
      "source": [
        "**Bayesian hyperparameter optimization**\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "bHuElmYp-2Ws",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1790
        "outputId": "538b0f58-d458-4517-f65c-ae027c345a35"
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
      },
      "source": [
        "bounds = {'lr': (0.0005,0.001), 'batch_size': (32,64), 'module__n_hidden': (16,526),\n",
        "          'module__w': (2,10)}\n",
        "optimizer = BayesianOptimization(\n",
        "    f=train_model,\n",
        "    pbounds=bounds,\n",
        "    random_state=1,\n",
        ")\n",
        "\n",
        "optimizer.maximize(init_points=10, n_iter=1)\n",
        "print(optimizer.max)\n",
        "table = pd.DataFrame(columns=['target','batch_size','lr','module__n_hidden','module__w'])\n",
        "for res in optimizer.res:\n",
        "    table=table.append(pd.DataFrame({'target':[res['target']],'batch_size':[res['params']['batch_size']],\n",
        "                                     'lr':[res['params']['lr']], 'module__n_hidden':[res['params']['module__n_hidden']],\n",
        "                                     'module__w':[res['params']['module__w']]}),ignore_index=True)\n",
        "table=table.append(pd.DataFrame({'target':[optimizer.max['target']],'batch_size':[optimizer.max['params']['batch_size']],\n",
        "                                    'lr':[optimizer.max['params']['lr']], 'module__n_hidden':[optimizer.max['params']['module__n_hidden']],\n",
        "                                    'module__w':[optimizer.max['params']['module__w']]}),ignore_index=True)\n",
        "model_name = 'Invar_inference_NN'\n",
        "file_name = '{}.xlsx'.format(model_name)\n",
        "endtime = datetime.datetime.now()\n",
        "Rtime = endtime - starttime\n",
        "print(Rtime)\n",
        "table.to_excel(file_name)"
      ],
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1818
      "execution_count": 35,
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "|   iter    |  target   | batch_... |    lr     | module... | module__w |\n",
            "-------------------------------------------------------------------------\n",
            "\n",
            "=== train begin ===\n",
            "Net(\n",
            "  (hidden1): Linear(in_features=17, out_features=16, bias=True)\n",
            "  (hiddens): ModuleList(\n",
            "    (0): Linear(in_features=16, out_features=16, bias=True)\n",
            "    (1): Linear(in_features=16, out_features=16, bias=True)\n",
            "    (2): Linear(in_features=16, out_features=16, bias=True)\n",
            "    (3): Linear(in_features=16, out_features=16, bias=True)\n",
            "  )\n",
            "  (predict): Linear(in_features=16, out_features=1, bias=True)\n",
            ")\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1838
            "epoch 0: train loss 0.967301, test loss 0.964457\n",
1839
            "=== train end ===\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1840
1841
1842
            "Test set: Average loss: 0.6603\n",
            "Test set: Average loss: 0.6365\n",
            "| \u001b[0m 1       \u001b[0m | \u001b[0m-0.6365  \u001b[0m | \u001b[0m 45.34   \u001b[0m | \u001b[0m 0.000860\u001b[0m | \u001b[0m 16.06   \u001b[0m | \u001b[0m 4.419   \u001b[0m |\n",
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
            "\n",
            "=== train begin ===\n",
            "Net(\n",
            "  (hidden1): Linear(in_features=17, out_features=110, bias=True)\n",
            "  (hiddens): ModuleList(\n",
            "    (0): Linear(in_features=110, out_features=110, bias=True)\n",
            "    (1): Linear(in_features=110, out_features=110, bias=True)\n",
            "    (2): Linear(in_features=110, out_features=110, bias=True)\n",
            "    (3): Linear(in_features=110, out_features=110, bias=True)\n",
            "  )\n",
            "  (predict): Linear(in_features=110, out_features=1, bias=True)\n",
            ")\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1855
            "epoch 0: train loss 0.952195, test loss 0.945242\n",
1856
            "=== train end ===\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1857
1858
1859
            "Test set: Average loss: 0.4462\n",
            "Test set: Average loss: 0.4631\n",
            "| \u001b[95m 2       \u001b[0m | \u001b[95m-0.4631  \u001b[0m | \u001b[95m 36.7    \u001b[0m | \u001b[95m 0.000546\u001b[0m | \u001b[95m 111.0   \u001b[0m | \u001b[95m 4.764   \u001b[0m |\n",
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
            "\n",
            "=== train begin ===\n",
            "Net(\n",
            "  (hidden1): Linear(in_features=17, out_features=229, bias=True)\n",
            "  (hiddens): ModuleList(\n",
            "    (0): Linear(in_features=229, out_features=229, bias=True)\n",
            "    (1): Linear(in_features=229, out_features=229, bias=True)\n",
            "    (2): Linear(in_features=229, out_features=229, bias=True)\n",
            "    (3): Linear(in_features=229, out_features=229, bias=True)\n",
            "    (4): Linear(in_features=229, out_features=229, bias=True)\n",
            "    (5): Linear(in_features=229, out_features=229, bias=True)\n",
            "    (6): Linear(in_features=229, out_features=229, bias=True)\n",
            "  )\n",
            "  (predict): Linear(in_features=229, out_features=1, bias=True)\n",
            ")\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1875
            "epoch 0: train loss 0.887715, test loss 0.865657\n",
1876
            "=== train end ===\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1877
1878
1879
            "Test set: Average loss: 0.5808\n",
            "Test set: Average loss: 0.5417\n",
            "| \u001b[0m 3       \u001b[0m | \u001b[0m-0.5417  \u001b[0m | \u001b[0m 44.7    \u001b[0m | \u001b[0m 0.000769\u001b[0m | \u001b[0m 229.8   \u001b[0m | \u001b[0m 7.482   \u001b[0m |\n",
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
            "\n",
            "=== train begin ===\n",
            "Net(\n",
            "  (hidden1): Linear(in_features=17, out_features=29, bias=True)\n",
            "  (hiddens): ModuleList(\n",
            "    (0): Linear(in_features=29, out_features=29, bias=True)\n",
            "    (1): Linear(in_features=29, out_features=29, bias=True)\n",
            "    (2): Linear(in_features=29, out_features=29, bias=True)\n",
            "    (3): Linear(in_features=29, out_features=29, bias=True)\n",
            "    (4): Linear(in_features=29, out_features=29, bias=True)\n",
            "    (5): Linear(in_features=29, out_features=29, bias=True)\n",
            "    (6): Linear(in_features=29, out_features=29, bias=True)\n",
            "  )\n",
            "  (predict): Linear(in_features=29, out_features=1, bias=True)\n",
            ")\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1895
            "epoch 0: train loss 0.970142, test loss 0.981575\n",
1896
            "=== train end ===\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1897
1898
1899
            "Test set: Average loss: 0.4597\n",
            "Test set: Average loss: 0.4817\n",
            "| \u001b[0m 4       \u001b[0m | \u001b[0m-0.4817  \u001b[0m | \u001b[0m 38.54   \u001b[0m | \u001b[0m 0.000939\u001b[0m | \u001b[0m 29.97   \u001b[0m | \u001b[0m 7.364   \u001b[0m |\n",
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
            "\n",
            "=== train begin ===\n",
            "Net(\n",
            "  (hidden1): Linear(in_features=17, out_features=87, bias=True)\n",
            "  (hiddens): ModuleList(\n",
            "    (0): Linear(in_features=87, out_features=87, bias=True)\n",
            "    (1): Linear(in_features=87, out_features=87, bias=True)\n",
            "    (2): Linear(in_features=87, out_features=87, bias=True)\n",
            "  )\n",
            "  (predict): Linear(in_features=87, out_features=1, bias=True)\n",
            ")\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1911
            "epoch 0: train loss 0.989642, test loss 0.933345\n",
1912
            "=== train end ===\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1913
1914
1915
            "Test set: Average loss: 0.3933\n",
            "Test set: Average loss: 0.4565\n",
            "| \u001b[95m 5       \u001b[0m | \u001b[95m-0.4565  \u001b[0m | \u001b[95m 45.35   \u001b[0m | \u001b[95m 0.000779\u001b[0m | \u001b[95m 87.6    \u001b[0m | \u001b[95m 3.585   \u001b[0m |\n",
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
            "\n",
            "=== train begin ===\n",
            "Net(\n",
            "  (hidden1): Linear(in_features=17, out_features=175, bias=True)\n",
            "  (hiddens): ModuleList(\n",
            "    (0): Linear(in_features=175, out_features=175, bias=True)\n",
            "    (1): Linear(in_features=175, out_features=175, bias=True)\n",
            "    (2): Linear(in_features=175, out_features=175, bias=True)\n",
            "    (3): Linear(in_features=175, out_features=175, bias=True)\n",
            "    (4): Linear(in_features=175, out_features=175, bias=True)\n",
            "    (5): Linear(in_features=175, out_features=175, bias=True)\n",
            "    (6): Linear(in_features=175, out_features=175, bias=True)\n",
            "  )\n",
            "  (predict): Linear(in_features=175, out_features=1, bias=True)\n",
            ")\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1931
            "epoch 0: train loss 0.997312, test loss 0.987231\n",
1932
            "=== train end ===\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1933
1934
1935
            "Test set: Average loss: 0.4088\n",
            "Test set: Average loss: 0.4704\n",
            "| \u001b[0m 6       \u001b[0m | \u001b[0m-0.4704  \u001b[0m | \u001b[0m 57.62   \u001b[0m | \u001b[0m 0.000984\u001b[0m | \u001b[0m 175.8   \u001b[0m | \u001b[0m 7.539   \u001b[0m |\n",
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
            "\n",
            "=== train begin ===\n",
            "Net(\n",
            "  (hidden1): Linear(in_features=17, out_features=59, bias=True)\n",
            "  (hiddens): ModuleList(\n",
            "    (0): Linear(in_features=59, out_features=59, bias=True)\n",
            "    (1): Linear(in_features=59, out_features=59, bias=True)\n",
            "  )\n",
            "  (predict): Linear(in_features=59, out_features=1, bias=True)\n",
            ")\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1946
            "epoch 0: train loss 0.945286, test loss 0.931218\n",
1947
            "=== train end ===\n",
Christoph Freysoldt's avatar
Christoph Freysoldt committed
1948
1949
1950
            "Test set: Average loss: 0.4456\n",
            "Test set: Average loss: 0.4744\n",
            "| \u001b[0m 7       \u001b[0m | \u001b[0m-0.4744  \u001b[0m | \u001b[0m 60.04   \u001b[0m | \u001b[0m 0.000947\u001b[0m | \u001b[0m 59.37   \u001b[0m | \u001b[0m 2.312   \u001b[0m |\n",
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
            "\n",
            "=== train begin ===\n",
            "Net(\n",
            "  (hidden1): Linear(in_features=17, out_features=66, bias=True)\n",
            "  (hiddens): ModuleList(\n",
            "    (0): Linear(in_features=66, out_features=66, bias=True)\n",
            "    (1): Linear(in_features=66, out_features=66, bias=True)\n",
            "    (2): Linear(in_features=66, out_features=66, bias=True)\n",
            "    (3): Linear(in_features=66, out_features=66, bias=True)\n",
            "    (4): Linear(in_features=66, out_features=66, bias=True)\n",
            "  )\n",
            "  (predict): Linear(in_features=66, out_features=1, bias=True)\n",
            ")\n",