Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
B
beta-vae-normalizing-flows
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Kaan Güney Keklikçi
beta-vae-normalizing-flows
Commits
6439052e
Commit
6439052e
authored
Aug 08, 2021
by
Kaan Güney Keklikçi
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
added modular realnvp with experiment
parent
43147dc2
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
458 additions
and
0 deletions
+458
-0
realnvp_optimizer_experiment.ipynb
.../experiments/optimizer/realnvp_optimizer_experiment.ipynb
+247
-0
realnvp_execute.ipynb
notebooks/realnvp_execute.ipynb
+211
-0
No files found.
notebooks/experiments/optimizer/realnvp_optimizer_experiment.ipynb
0 → 100644
View file @
6439052e
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"import warnings\n",
"warnings.filterwarnings('ignore')\n",
"import os \n",
"os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' \n",
"import numpy as np\n",
"from sklearn.preprocessing import StandardScaler\n",
"\n",
"import tensorflow as tf\n",
"tf.compat.v1.disable_eager_execution() \n",
"import tensorflow_probability as tfp\n",
"import tensorflow.python.util.deprecation as deprecation\n",
"deprecation._PRINT_DEPRECATION_WARNINGS = False\n",
"\n",
"import matplotlib.pyplot as plt\n",
"plt.style.use('seaborn')\n",
"\n",
"from data_loader import load_data\n",
"from data_preprocesser import preprocess_data\n",
"from realnvp import RealNVP \n",
"from experiment import Experiment"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Data successfully loaded...\n",
"\n",
"Data successfully preprocessed...\n",
"\n",
"TensorFlow version: 2.5.0\n",
"Number of dimensions: 37\n",
"Learning rate: 0.0001\n",
"Number of masked dimensions: 36\n",
"\n",
"Successfully created model...\n",
"\n",
"Optimizer and loss successfully defined...\n",
"\n",
"Iteration 0: 60.184722900390625\n",
"Iteration 10000: 50.05358123779297\n",
"Iteration 20000: 49.8468017578125\n",
"Iteration 30000: 49.18869400024414\n",
"Iteration 40000: 50.25196838378906\n",
"Iteration 50000: 52.78778839111328\n",
"Iteration 60000: 58.92238998413086\n",
"Iteration 70000: 51.21335983276367\n",
"Iteration 80000: 55.31623458862305\n",
"Iteration 90000: 57.86042785644531\n",
"Training finished...\n",
"\n",
"Displaying results...\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAsgAAAFgCAYAAACmDI9oAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAB11UlEQVR4nO2deZhcZZ3vv+fUXtXV3eklISELnRCWgKCCiEMEN0YZ4GFXkYmOOCIColcdRQYEHhbFUedRnFG8M97LRUdlgFGvy/UqDiMoIHJBjEBYzEJIOul0d7prX84594/KqZw+ffY6p+pU1ffzD6Sq65x3f3/vb3sFRVEUEEIIIYQQQgAAYqcLQAghhBBCSJiggEwIIYQQQogGCsiEEEIIIYRooIBMCCGEEEKIBgrIhBBCCCGEaKCATAghhBBCiAYKyISQvmDnzp14zWte0+li+MbDDz+Mc845Z8FnDz74IM4++2y8/e1vx9VXX418Pg8AkCQJt9xyC97xjnfg9NNPx3e/+13DZ37lK1/BD37wAwDA1772Nfzyl7/0tcyXXnopZmZmAAAf/OAH8eKLL/r6fEII8QsKyIQQ0kWUy2X84z/+Iz72sY9BkqTm5zMzM/jMZz6DO+64Az//+c+xatUqfPGLXwQAfO9738P27dvx4x//GPfeey/uuusuPP3004ue/dGPfhTnnnsuAOCxxx5DvV73tey/+c1vmv//3//7f8fhhx/u6/MJIcQvop0uACGEdJpcLoebbroJzz33HARBwBvf+EZ8/OMfRzQaxVe/+lX84he/QCwWw5IlS/C5z30OS5cuNf1cyzXXXANBEPDSSy9hZmYGp5xyCq677jrEYjG89NJLuPXWW7F//35IkoRNmzbhwgsvxGOPPYZbb70V6XQaxWIR9957L+LxePOZDz/8MEqlEm677TZ89atfXfD5q171Khx22GEAgIsvvhjnnHMObrjhBvzyl7/EO9/5TkSjUQwNDeHMM8/Ej370Ixx33HGLyrt+/Xokk0ls3rwZX/jCFxCJRHDaaafhi1/8Ih5//HFIkoQNGzbguuuuw8DAAN7ylrfguOOOw5YtW5ptduedd6JarWJmZgbnnnsuPvaxj+Ezn/kMAOB973sfvvnNb+KSSy7BV77yFbzqVa/C97//fdx9990QRRFjY2O4/vrrMTExgWuuuQYDAwPYsmULJicnsXbtWnz5y19GJpMJaCQQQkgDapAJIX3PLbfcguHhYfzv//2/cd9992HLli341re+hd27d+Ouu+7Cfffdh/vvvx+nnHIKnn76adPPjXjuuefwP/7H/8BPf/pTvPTSS/j+97+Per2Oq6++Gp/4xCdw//3349vf/ja+9a1v4amnngIAvPDCC/jSl76EH/3oRwuEYwB429vehmuvvRZDQ0MLPp+cnMQhhxzS/PchhxyCfD6PQqGA3bt3Y/ny5Qu+m5ycNG2PSy65BMceeyw+9alP4fTTT8c3v/lNRCIR3H///fjRj36EpUuXNrXTALB+/Xr87Gc/w9ve9jZ861vfwuc//3ncf//9+P73v49vfvObmJmZwec+9zkAwF133bWgLI888gj+5V/+Bf/rf/0v/OhHP8JZZ52FK6+8Euolr5s3b8a//uu/4qc//Sn27t2L//N//o9VVxJCiC9Qg0wI6Xt+/etf47vf/S4EQUA8Hse73/1u3HXXXfjbv/1bHHXUUTjvvPNw6qmn4tRTT8Ub3vAGyLJs+LkR5513XlPjec455+CBBx7AySefjB07duDaa69t/l25XMYzzzyDdevWYfny5Tj00ENd1UGWZcPPRVFsCpv6z53y4IMPIpfL4be//S0AoFarYXR0tPn9iSeeCAAQBAHf+MY38OCDD+LHP/4xXnrpJSiKglKpZPrshx56CH/1V3+FkZERAMD555+PW2+9FTt37gQAvPGNb2weEo444gjMzc05LjchhHiFAjIhpO/RC5eyLKNer0MURXz729/GH//4RzzyyCO47bbb8PrXvx7XXXed6ed6IpFI8/8VRYEoipAkCYODg/jhD3/Y/G7fvn3IZrN46qmnkE6nXddh+fLl+MMf/tD89549ezA0NIR0Oo3ly5djampqwXdabbMdsizj2muvxWmnnQYAKBQKqFQqze/V8haLRZx33nl429vehhNPPBEXXHABfvnLXxoK6CpG3ymK0vR/TiaTzc8FQbB8FiGE+AVdLAghfc/GjRvxne98B4qioFqt4p577sFf/MVf4LnnnsNZZ52FdevW4UMf+hD+5m/+Blu2bDH93Iif/exnqFarqFQq+I//+A+8+c1vxsTEBBKJRFNA3r17N8466yxs3ry5pTr84Q9/wLZt2wA0AvPe+ta3AgDe+ta34r777kO9Xsf8/Dx+8pOf4G1ve5vl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oigQBKH5fS6XW9Tv6uck/Nx///0YGRlpHmwBsI97jNnZWWzevBlf+cpXcNNNN+GTn/wk+7gHSafTeOWVV3DGGWfg+uuvx6ZNm9jPPcLb3/52RKMHPXrd9KvR37YL+iBrGBgYQKFQaP5bluUFnUq6j927d+PKK6/Ee97zHpx99tn4h3/4h+Z3hUIBg4ODi/q9UCggm812orjEJffddx8EQcAjjzyCZ599Fp/+9KcXaJPYx93P8PAw1q5di3g8jrVr1yKRSGBycrL5Pfu4N/if//N/YuPGjfjEJz6B3bt3433vex9qtVrze/Zz76D1IbbrV6O/bVs52/amLuC1r30tfv3rXwMAnnrqKRxxxBEdLhFphX379uHSSy/F3/3d3+HCCy8EAGzYsAGPPfYYAODXv/41TjzxRLz2ta/Fww8/DFmWsWvXLsiyjJGRkU4WnTjkO9/5Dr797W/j7rvvxtFHH43bb78dp556Kvu4hzjhhBPw0EMPQVEU7NmzB6VSCW94wxvYxz3G4OBgU9AdGhpCvV7net2juOlXo79tF4KiKErb3hZy1CwWzz//PBRFwW233YZ169Z1uljEI7fccgt+9rOfYe3atc3P/v7v/x633HILarUa1q5di1tuuQWRSAR33HEHfv3rX0OWZXzmM59p6yQk/rBp0ybceOONEEUR119/Pfu4h/jCF76Axx57DIqi4L/9t/+GlStXso97jEKhgGuvvRZTU1Oo1Wp473vfi2OPPZb93CPs3LkTH//4x3HPPfdg69atjvvV7G/bAQVkQgghhBBCNNDFghBCCCGEEA0UkAkhhBBCCNFAAZkQQgghhBANFJAJIYQQQgjRQAGZEEIIIYQQDRSQCSGkgxx55JEAgFwuhyuuuMK3527atKn5/+ecc45vzyWEkH6AAjIhhISAubk5PPfcc74973e/+13z/3/4wx/69lxCCOkHeI8yIYSEgFtuuQV79+7FlVdeiX/6p3/CD37wA9x1112QZRnHHHMMbrjhBiQSCZx88sk45phjsG/fPtx777246aab8MILL2Dfvn2YmJjA1772NXzxi18EAFx00UX493//dxx55JHYsmULSqUSrrvuOmzZsgWCIOADH/gAzj33XNx///146KGHMDc3h5dffhmnnHIKbrzxxs42CCGEdBBqkAkhJARcd911WLp0Kf7pn/4JL7zwAu655x5873vfww9/+EOMjo7iX//1XwEAs7OzuOyyy/DDH/4QTz31FGKxGL7//e/jF7/4BSqVCv7rv/4L1113HQDg3//93xe844477sCSJUvw4x//GHfddRfuuOOOptb6ySefxFe/+lX86Ec/wn/+539iy5Yt7W0AQggJEdQgE0JIyHjsscewfft2vPOd7wQA1Go1bNiwofn98ccfDwB43eteh+HhYXznO9/Bn//8Z2zbtg3FYtH0uY8++ihuu+02AMDIyAje+ta34ne/+x0GBgbwmte8BgMDAwCAVatWYW5uLqjqEUJI6KGATAghIUOSJJxxxhlNTXChUIAkSc3vk8kkAOCBBx7AV7/6Vbz3ve/F+eefj9nZWSiKYvpc/XeKojSfm0gkmp8LgmD5HEII6XXoYkEIISEgGo2iXq8DAF7/+tfjF7/4Baanp6EoCm688Ubcddddi37zyCOP4IwzzsAFF1yAsbExPP74402BNxKJNJ+ncvLJJ+Pee+8FAMzMzOCBBx7ASSedFHDNCCGk+6CATAghIWB0dBQrVqzApk2bcNRRR+Gqq67C+973Ppx55pmQZRmXXXbZot9cdNFF+MlPfoJzzz0XH/nIR/DqV78aO3fuBAC89a1vxTnnnINKpdL8+yuvvBL79+/H2Wefjb/+67/G5ZdfjmOOOaZtdSSEkG5BUGhHI4QQQgghpAk1yIQQQgghhGiggEwIIYQQQogGCsiEEEIIIYRooIBMCCGEEEKIBgrIhBBCCCGEaKCATAghhBBCiAYKyIQQQgghhGj4/+dgmFtpv2bIAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 720x360 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Optimizer and loss successfully defined...\n",
"\n",
"Iteration 0: 60.184722900390625\n",
"Iteration 10000: 50.05423355102539\n",
"Iteration 20000: 49.84687042236328\n",
"Iteration 30000: 49.18657684326172\n",
"Iteration 40000: 50.251670837402344\n",
"Iteration 50000: 52.787811279296875\n",
"Iteration 60000: 58.922340393066406\n",
"Iteration 70000: 51.213382720947266\n",
"Iteration 80000: 55.316341400146484\n"
]
}
],
"source": [
"def train(session, loss, optimizer, steps=int(1e5)):\n",
" \n",
" \"\"\" optimize for all dimensions \"\"\"\n",
" \n",
" recorded_steps = []\n",
" recorded_losses = []\n",
" for i in range(steps):\n",
" _, loss_per_iteration = session.run([optimizer, loss])\n",
" if i % 100 == 0:\n",
" recorded_steps.append(i)\n",
" recorded_losses.append(loss_per_iteration)\n",
" if i % int(1e4) == 0:\n",
" print('Iteration {iteration}: {loss}'.format(iteration=i,loss=loss_per_iteration))\n",
" return recorded_losses\n",
"\n",
"def plot_results(recorded_losses):\n",
" \n",
" \"\"\" plot loss \"\"\"\n",
" print('Displaying results...')\n",
" fig = plt.figure(figsize=(10,5))\n",
" x = np.arange(len(recorded_losses))\n",
" y = recorded_losses\n",
" m, b = np.polyfit(x, y, 1) \n",
" plt.scatter(x, y, s=10, alpha=0.3)\n",
" plt.plot(x, m*x+b, c=\"r\")\n",
" plt.title('Loss per 100 iteration')\n",
" plt.xlabel('Iteration')\n",
" plt.ylabel('Loss')\n",
" plt.tight_layout()\n",
" plt.show()\n",
"\n",
"def main():\n",
" \n",
" \"\"\" load data \"\"\"\n",
"\n",
" filename = 'prostate.xls'\n",
" directory = '/Users/kaanguney.keklikci/Data/'\n",
"\n",
" loader = load_data(filename, directory)\n",
" loader.create_directory(directory)\n",
" data = loader.read_data(directory, filename)\n",
" print('Data successfully loaded...\\n')\n",
" \n",
" \"\"\" preprocess data \"\"\"\n",
"\n",
" fillna_vals = ['sz', 'sg', 'wt']\n",
" dropna_vals = ['ekg', 'age']\n",
" drop_vals = ['patno', 'sdate']\n",
"\n",
" preprocesser = preprocess_data(StandardScaler(), fillna_vals, dropna_vals, drop_vals)\n",
" data = preprocesser.dropna_features(data)\n",
" data = preprocesser.impute(data)\n",
" data = preprocesser.drop_features(data)\n",
" data = preprocesser.encode_categorical(data)\n",
" data = preprocesser.scale(data)\n",
" print('Data successfully preprocessed...\\n')\n",
" \n",
" \"\"\" set MAF parameters \"\"\"\n",
"\n",
" batch_size = 32\n",
" dtype = np.float32\n",
" tf_version = tf.__version__\n",
" params = 2\n",
" hidden_units = [512,512]\n",
" base_dist = tfp.distributions.Normal(loc=0., scale=1.)\n",
" dims = data.shape[1]\n",
" learning_rate = 1e-4\n",
" steps = 1e4\n",
" \n",
" \"\"\" initialize samples \"\"\"\n",
"\n",
" realnvp = RealNVP(dtype, tf_version, batch_size, params, hidden_units, \n",
" base_dist, dims, shift_only=True, \n",
" is_constant_jacobian=True, masked_dimension_count=dims-1)\n",
"\n",
" dims = realnvp.get_dims(data)\n",
" samples = realnvp.create_tensor(data)\n",
" print(f'TensorFlow version: {realnvp.tf_version}')\n",
" print(f'Number of dimensions: {realnvp.dims}')\n",
" print(f'Learning rate: {learning_rate}')\n",
" print(f'Number of masked dimensions: {realnvp.masked_dimension_count}\\n')\n",
" \n",
" \"\"\" initialize RealNVP \"\"\"\n",
"\n",
" realnvp = realnvp.make_realnvp(data)\n",
" print('Successfully created model...\\n')\n",
" \n",
" \"\"\" initialize loss and optimizer \"\"\"\n",
"\n",
" loss = -tf.reduce_mean(realnvp.log_prob(samples))\n",
" optimizer = tf.compat.v1.train.AdamOptimizer(learning_rate).minimize(loss)\n",
" \n",
" experiment = Experiment(optimizer, learning_rate, loss, steps)\n",
" \n",
" keywords = ['adam', 'rmsprop', 'sgd']\n",
" \n",
" for keyword in keywords:\n",
"\n",
" session = tf.compat.v1.Session()\n",
" tf.compat.v1.set_random_seed(42)\n",
" experiment.change_optimizer(learning_rate, loss, keyword=keyword)\n",
" optimizer = experiment.get_optimizer()\n",
" session.run(tf.compat.v1.global_variables_initializer())\n",
" print('Optimizer and loss successfully defined...\\n')\n",
"\n",
" \"\"\" start training \"\"\"\n",
" recorded_losses = train(session, loss, optimizer)\n",
" print('Training finished...\\n')\n",
"\n",
" \"\"\" display results \"\"\"\n",
" plot_results(recorded_losses)\n",
" \n",
" \n",
"if __name__ == \"__main__\":\n",
" main()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.10"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
notebooks/realnvp_execute.ipynb
0 → 100644
View file @
6439052e
{
"cells": [
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"import warnings\n",
"warnings.filterwarnings('ignore')\n",
"import os \n",
"os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' \n",
"import numpy as np\n",
"from sklearn.preprocessing import StandardScaler\n",
"\n",
"import tensorflow as tf\n",
"tf.compat.v1.disable_eager_execution() \n",
"import tensorflow_probability as tfp\n",
"\n",
"import matplotlib.pyplot as plt\n",
"plt.style.use('seaborn')\n",
"\n",
"from data_loader import load_data\n",
"from data_preprocesser import preprocess_data\n",
"from realnvp import RealNVP "
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Data successfully loaded...\n",
"\n",
"Data successfully preprocessed...\n",
"\n",
"TensorFlow version: 2.5.0\n",
"Number of dimensions: 37\n",
"Learning rate: 0.0001\n",
"Number of masked dimensions: 36\n",
"\n",
"Successfully created model...\n",
"\n",
"Optimizer and loss successfully defined...\n",
"\n",
"Iteration 0: 60.43388366699219\n",
"Iteration 10000: 62.8946533203125\n",
"Iteration 20000: 51.936767578125\n",
"Iteration 30000: 48.95115280151367\n",
"Iteration 40000: 48.97389221191406\n",
"Iteration 50000: 48.37859344482422\n",
"Iteration 60000: 48.292030334472656\n",
"Iteration 70000: 59.42523956298828\n",
"Iteration 80000: 51.48047637939453\n",
"Iteration 90000: 51.44146728515625\n",
"Training finished...\n",
"\n",
"Displaying results...\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAsgAAAFgCAYAAACmDI9oAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAB19UlEQVR4nO2deZxkVZXnf+/Fmhm5VWZlbVSRZJVAUdAogohj4YaO0sKwq9iNdmuLKLiM2oo0NPARpHFAP4rdLU43MwzaKg20Mi7jiLaDKCDNB0VEisWioKgtqyorKzL2eO/OH5Ev6sWLty8RLyJ+38/Hj1RGxH333eXcc84991xJCCFACCGEEEIIAQDI3a4AIYQQQgghcYIKMiGEEEIIITqoIBNCCCGEEKKDCjIhhBBCCCE6qCATQgghhBCigwoyIYQQQgghOqggE0IGgu3bt+OEE07odjVC44EHHsBZZ53V8ref//znOPPMM/HWt74VH/3oR7G4uAgAUBQF1113Hd72trfhLW95C771rW+ZlvnlL38Z3/3udwEAX/3qV3HfffeFWuf3ve992L9/PwDgAx/4AJ599tlQyyeEkLCggkwIIT1EuVzGl770JXz84x+HoijNv+/fvx+f/exnccstt+DHP/4x1q1bh5tuugkA8O1vfxvbtm3D97//fdx11124/fbb8fjjj7eV/bGPfQxnn302AODhhx9GvV4Pte6//OUvm//93//7f8fLXvayUMsnhJCwSHa7AoQQ0m3y+TyuvfZaPPXUU5AkCaeeeio+8YlPIJlM4itf+Qp+8pOfIJVKYdmyZbjhhhuwYsUKy7/rufzyyyFJEp577jns378fr33ta3HllVcilUrhueeew/XXX48DBw5AURRcdNFFOP/88/Hwww/j+uuvx/DwMIrFIu666y6k0+lmmQ888ABKpRI+//nP4ytf+UrL3//kT/4ERxxxBADgwgsvxFlnnYWrr74a9913H97xjncgmUxifHwcb3/723Hvvffi+OOPb6vvkUceiWw2iyeeeAJf+MIXkEgk8PrXvx433XQTHnnkESiKgk2bNuHKK6/EyMgI3vSmN+H444/Hli1bmm126623olqtYv/+/Tj77LPx8Y9/HJ/97GcBAO9973vx9a9/HX/2Z3+GL3/5y/iTP/kTfOc738Edd9wBWZaxfPlyXHXVVZidncXll1+OkZERbNmyBbt27cL69evxxS9+EblcLqKRQAghDehBJoQMPNdddx0mJibwv//3/8bdd9+NLVu24LbbbsPOnTtx++234+6778Y999yD1772tXj88cct/27GU089hf/xP/4HfvjDH+K5557Dd77zHdTrdXz0ox/FJz/5Sdxzzz34xje+gdtuuw2/+c1vAADPPPMMbr75Ztx7770tyjEAvPnNb8YVV1yB8fHxlr/v2rULq1atav571apVWFxcRKFQwM6dO7F69eqWz3bt2mXZHn/2Z3+G4447Dp/+9Kfxlre8BV//+teRSCRwzz334N5778WKFSua3mkAOPLII/GjH/0Ib37zm3Hbbbfh7/7u73DPPffgO9/5Dr7+9a9j//79uOGGGwAAt99+e0tdHnzwQfzTP/0T/tf/+l+49957ccYZZ+DSSy+FdsnrE088gX/+53/GD3/4Q+zZswf/5//8H7uuJISQUKAHmRAy8Nx///341re+BUmSkE6n8a53vQu33347/uqv/gobN27EOeecg9e97nV43eteh9e85jVQVdX072acc845TY/nWWedhZ/+9Kc45ZRT8MILL+CKK65ofq9cLuPJJ5/Ehg0bsHr1ahx22GGe3kFVVdO/y7LcVDaNf3fLz3/+c+TzefzqV78CANRqNUxNTTU/P+mkkwAAkiTha1/7Gn7+85/j+9//Pp577jkIIVAqlSzL/sUvfoE//dM/xeTkJADg3HPPxfXXX4/t27cDAE499dSmkXDUUUdhYWHBdb0JIcQvVJAJIQOPUblUVRX1eh2yLOMb3/gGfve73+HBBx/E5z//ebz61a/GlVdeafl3I4lEovnfQgjIsgxFUTA2Nobvfe97zc/27t2L0dFR/OY3v8Hw8LDnd1i9ejV++9vfNv+9e/dujI+PY3h4GKtXr8bc3FzLZ3pvsxOqquKKK67A61//egBAoVBApVJpfq7Vt1gs4pxzzsGb3/xmnHTSSTjvvPNw3333mSroGmafCSGa8c/ZbLb5d0mSbMsihJCwYIgFIWTg2bx5M775zW9CCIFqtYo777wT/+k//Sc89dRTOOOMM7BhwwZ88IMfxF/8xV9gy5Ytln8340c/+hGq1SoqlQr+7d/+DW984xsxOzuLTCbTVJB37tyJM844A0888USgd/jtb3+L559/HkDjYN5pp50GADjttNNw9913o16v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iUQC9Xq9izUiQcjlchgZGcHi4iI++tGP4uMf/ziEEJAkqfl5Pp9v63ft7yT+3HPPPZicnGwatgDYx33G/Pw8nnjiCXz5y1/Gtddei0996lPs4z5keHgYL730Ek4//XRcddVVuOiii9jPfcJb3/pWJJOHInq99KvZdzsFY5B1jIyMoFAoNP+tqmpLp5LeY+fOnbj00kvx7ne/G2eeeSb+23/7b83PCoUCxsbG2vq9UChgdHS0G9UlHrn77rshSRIefPBB/OEPf8BnPvOZFm8S+7j3mZiYwPr165FOp7F+/XpkMhns2rWr+Tn7uD/4n//zf2Lz5s345Cc/iZ07d+K9730varVa83P2c/+gjyF26lez73asnh17Ug/wyle+Evfffz8A4De/+Q2OOuqoLteIBGHv3r143/veh7/+67/G+eefDwDYtGkTHn74YQDA/fffj5NOOgmvfOUr8cADD0BVVezYsQOqqmJycrKbVScu+eY3v4lvfOMbuOOOO3DMMcfgxhtvxOte9zr2cR9x4okn4he/+AWEENi9ezdKpRJe85rXsI/7jLGxsaaiOz4+jnq9Tnndp3jpV7PvdgpJCCE69rSYo2WxePrppyGEwOc//3ls2LCh29UiPrnuuuvwox/9COvXr2/+7W/+5m9w3XXXoVarYf369bjuuuuQSCRwyy234P7774eqqvjsZz/b0UlIwuGiiy7CNddcA1mWcdVVV7GP+4gvfOELePjhhyGEwH/9r/8Va9euZR/3GYVCAVdccQXm5uZQq9Xwnve8B8cddxz7uU/Yvn07PvGJT+DOO+/E1q1bXfer1Xc7ARVkQgghhBBCdDDEghBCCCGEEB1UkAkhhBBCCNFBBZkQQgghhBAdVJAJIYQQQgjRQQWZEEIIIYQQHVSQCSGkixx99NEAgHw+jw9/+MOhlXvRRRc1//uss84KrVxCCBkEqCATQkgMWFhYwFNPPRVaeb/+9a+b//29730vtHIJIWQQ4D3KhBASA6677jrs2bMHl156Kf7+7/8e3/3ud3H77bdDVVUce+yxuPrqq5HJZHDKKafg2GOPxd69e3HXXXfh2muvxTPPPIO9e/didnYWX/3qV3HTTTcBAC644AL867/+K44++mhs2bIFpVIJV155JbZs2QJJkvD+978fZ599Nu655x784he/wMLCAl588UW89rWvxTXXXNPdBiGEkC5CDzIhhMSAK6+8EitWrMDf//3f45lnnsGdd96Jb3/72/je976Hqakp/PM//zMAYH5+HhdffDG+973v4Te/+Q1SqRS+853v4Cc/+QkqlQr+3//7f7jyyisBAP/6r//a8oxbbrkFy5Ytw/e//33cfvvtuOWWW5pe68ceewxf+cpXcO+99+Lf//3fsWXLls42ACGExAh6kAkhJGY8/PDD2LZtG97xjncAAGq1GjZt2tT8/OUvfzkA4FWvehUmJibwzW9+E3/84x/x/PPPo1gsWpb70EMP4fOf/zwAYHJyEqeddhp+/etfY2RkBCeccAJGRkYAAOvWrcPCwkJUr0cIIbGHCjIhhMQMRVFw+umnNz3BhUIBiqI0P89mswCAn/70p/jKV76C97znPTj33HMxPz8PIYRlucbPhBDNcjOZTPPvkiTZlkMIIf0OQywIISQGJJNJ1Ot1AMCrX/1q/OQnP8G+ffsghMA111yD22+/ve03Dz74IE4//XScd955WL58OR555JGmwptIJJrlaZxyyim46667AAD79+/HT3/6U5x88skRvxkhhPQeVJAJISQGTE1NYc2aNbjooouwceNGXHbZZXjve9+Lt7/97VBVFRdffHHbby644AL84Ac/wNlnn42PfOQjeMUrXoHt27cDAE477TScddZZqFQqze9feumlOHDgAM4880z8+Z//OS655BIce+yxHXtHQgjpFSTBfTRCCCGEEEKa0INMCCGEEEKIDirIhBBCCCGE6KCCTAghhBBCiA4qyIQQQgghhOiggkwIIYQQQogOKsiEEEIIIYTooIJMCCGEEEKIjv8PSqoj+ud2t+gAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 720x360 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def train(session, loss, optimizer, steps=int(1e5)):\n",
" \n",
" \"\"\" optimize for all dimensions \"\"\"\n",
" \n",
" recorded_steps = []\n",
" recorded_losses = []\n",
" for i in range(steps):\n",
" _, loss_per_iteration = session.run([optimizer, loss])\n",
" if i % 100 == 0:\n",
" recorded_steps.append(i)\n",
" recorded_losses.append(loss_per_iteration)\n",
" if i % int(1e4) == 0:\n",
" print('Iteration {iteration}: {loss}'.format(iteration=i,loss=loss_per_iteration))\n",
" return recorded_losses\n",
"\n",
"def plot_results(recorded_losses):\n",
" \n",
" \"\"\" plot loss \"\"\"\n",
" print('Displaying results...')\n",
" fig = plt.figure(figsize=(10,5))\n",
" x = np.arange(len(recorded_losses))\n",
" y = recorded_losses\n",
" m, b = np.polyfit(x, y, 1) \n",
" plt.scatter(x, y, s=10, alpha=0.3)\n",
" plt.plot(x, m*x+b, c=\"r\")\n",
" plt.title('Loss per 100 iteration')\n",
" plt.xlabel('Iteration')\n",
" plt.ylabel('Loss')\n",
" plt.tight_layout()\n",
" plt.show()\n",
"\n",
"def main():\n",
" \n",
" \"\"\" load data \"\"\"\n",
"\n",
" filename = 'prostate.xls'\n",
" directory = '/Users/kaanguney.keklikci/Data/'\n",
"\n",
" loader = load_data(filename, directory)\n",
" loader.create_directory(directory)\n",
" data = loader.read_data(directory, filename)\n",
" print('Data successfully loaded...\\n')\n",
" \n",
" \"\"\" preprocess data \"\"\"\n",
"\n",
" fillna_vals = ['sz', 'sg', 'wt']\n",
" dropna_vals = ['ekg', 'age']\n",
" drop_vals = ['patno', 'sdate']\n",
"\n",
" preprocesser = preprocess_data(StandardScaler(), fillna_vals, dropna_vals, drop_vals)\n",
" data = preprocesser.dropna_features(data)\n",
" data = preprocesser.impute(data)\n",
" data = preprocesser.drop_features(data)\n",
" data = preprocesser.encode_categorical(data)\n",
" data = preprocesser.scale(data)\n",
" print('Data successfully preprocessed...\\n')\n",
" \n",
" \"\"\" set MAF parameters \"\"\"\n",
"\n",
" batch_size = 32\n",
" dtype = np.float32\n",
" tf_version = tf.__version__\n",
" params = 2\n",
" hidden_units = [512,512]\n",
" base_dist = tfp.distributions.Normal(loc=0., scale=1.)\n",
" dims = data.shape[1]\n",
" learning_rate = 1e-4\n",
" \n",
" \"\"\" initialize samples \"\"\"\n",
"\n",
" realnvp = RealNVP(dtype, tf_version, batch_size, params, hidden_units, \n",
" base_dist, dims, shift_only=True, \n",
" is_constant_jacobian=True, masked_dimension_count=dims-1)\n",
"\n",
" dims = realnvp.get_dims(data)\n",
" samples = realnvp.create_tensor(data)\n",
" print(f'TensorFlow version: {realnvp.tf_version}')\n",
" print(f'Number of dimensions: {realnvp.dims}')\n",
" print(f'Learning rate: {learning_rate}')\n",
" print(f'Number of masked dimensions: {realnvp.masked_dimension_count}\\n')\n",
" \n",
" \"\"\" initialize RealNVP \"\"\"\n",
"\n",
" realnvp = realnvp.make_realnvp(data)\n",
" print('Successfully created model...\\n')\n",
" \n",
" \"\"\" initialize loss and optimizer \"\"\"\n",
"\n",
" loss = -tf.reduce_mean(realnvp.log_prob(samples))\n",
" optimizer = tf.compat.v1.train.AdamOptimizer(learning_rate).minimize(loss)\n",
"\n",
" session = tf.compat.v1.Session()\n",
" tf.compat.v1.set_random_seed(42)\n",
" session.run(tf.compat.v1.global_variables_initializer())\n",
" print('Optimizer and loss successfully defined...\\n')\n",
" \n",
" \"\"\" start training \"\"\"\n",
" recorded_losses = train(session, loss, optimizer)\n",
" print('Training finished...\\n')\n",
" \n",
" \"\"\" display results \"\"\"\n",
" plot_results(recorded_losses)\n",
" \n",
" \n",
"if __name__ == \"__main__\":\n",
" main()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.10"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment