Created
May 15, 2019 16:10
-
-
Save yueyericardo/989391e58264f4217543f0986dd36c97 to your computer and use it in GitHub Desktop.
archieve
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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ZmnixIm66667dPjwYc2dO7ciOPXXpEmTNH/+fF111VV6+OGH1a5dOy1btkyrV6/WggULKgoajRo1Si1atNDNN9+s2bNn6/Tp0/rlL3+ppk2bVpqva9euio2N1eLFi9WqVSslJCSoW7dulYJWAAAAINJEYhVdX+hD6nFXXnmlVq9eLUmaPHmyxo4dq4ULF1bqH/rII49o4cKFWr9+vcaPH68rr7xS8+bNU8uWLdWlS5ca5+7cubNeeeUV7d+/X+PGjdMvf/lLPf744+ratWud1tikSROtW7dOOTk5uueee3TllVdq69ateu655yq1fDnnnHP05z//WTExMRo/frzuvfde3X777VUC5uTkZP33f/+3tm7dquzsbF166aXavHlzndYEAAAAhJuzq+jKKauiG+kcM2vwm2ZmZlphYWGD3xcAAAAAvOrsHVJZrGZlhO8OqeM4m80s09c4UnYBAAAAwAMisYquLwSkLjEzlZSU1DomNtb9v56SkhLVtoseExNTY49UAAAAAHUTaVV0fSGScMkzzzyjuLi4Wl9e0KlTp1rX+OCDnmo5CwAAACCMuL8FF6W+//3va9OmTW4vw6c//elPOn36dI3Xzz///AZcDQAAABDeoq2tiy8EpC5JTk5WcnKy28vwqVevXm4vAQAAAIgI0djWxRdSdgEAAACgAURjWxdfCEgBAAAAoAHkdOwvWazMHMliy95HOVJ2AQAAAKABRGNbF18ISAEAAACggURbWxdfSNkFAAAAgCDJ31agycvnKX9bgdtLCQvskAIAAABAEFBFt+7YIQUAAACAIKCKbt0RkEYRx3GUl5fn9jI8j98JAAAA9UEV3bojZRcAAAAAgoAqunVHQOqi06dPKyEhwe1leJqZqaioSPHx8W4vBQAAAPCJKrp1Ez0pu/v+KhU8VvanC/Ly8uQ4jrZv364RI0aoadOmGj9+vF/fXbdunYYPH64WLVqoSZMm6tOnj55++ulKYxYtWqQ+ffooMTFRKSkpmjx5so4ePVrrvJMmTVJaWlqVzwcPHqzBgwf7+2hKS0uT4zjVvs72xz/+UVlZWUpKStI555yja665Rp9//nmVua6//notXrxY3bt3V3x8vN544w1J0hdffKEbbrhBKSkpSkhIUO/evfX888/7vU5JOn78uG6//Xa1b99eCQkJOvfcczVs2DDt3Lmz1u+tWLFC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HkkvSRrqOM7z3x1kZgvNLNPMMlNTU4NwWwAAAADhIqdjf8liZebQ1gUVAg5IzexeM2tnZmmSrpX0v2Z2fcArizB5eXlyHEfFxcVuL0VLly6V4zjas2eP20vxNH4nAACA4JnQe5BmZcxXv3MmalYG6booQx9SAAAAAA2Cti74rmC2fZGZraUHKULl9OnTbi8BAAAAtaCKLuoqqAGpl5382990eMFCnfzb39xeSoUVK1aoadOmuu2221RaWupzfHFxsebNm6cLL7xQiYmJSk1N1ciRI7Vz586KMYcPH9a0adPUtm1bJSQkqHv37lq4cKHPuR3HUV5eXqXP9uzZI8dxtHTpUr+eZ+3atXIcp9rXpEmTKsadPHlSM2fOVHp6uuLj45Wenq6HH3640m9QPtcf//hH3XzzzUpNTdW5555bcX3FihW6/PLL1bhxY7Vo0ULjxo3Trl27/FpnuU2bNmn48OFKTk5WUlKSOnbsqFtuuaXW7xQVFen+++9XWlqa4uPjlZaWpvvvv19FRUUVY8p/t//5n//RXXfdpdatWyspKUljxoypNv130aJF6tOnjxITE5WSkqLJkyfr6NGjdXoWAAAAt5VX0d341TLN2XwHQSn8EhUpuyf/9jd9/pObZGfOyImPV/sli5V08cWurunZZ5/VlClTNGvWLM2aNcuv71x77bVavny57rzzTg0bNkzffPON1q9fry+++ELdu3fXv//9bw0YMECnTp1SXl6e0tPTtXLlSk2bNk2nT5/W7bffHtJnuuSSS/Tuu+9W+mzNmjX6+c9/rh49ekgqC6pHjBihHTt2aNasWerVq5fee+89zZkzR0ePHtVjjz1W6fu33367Ro0apeeee07ffPONpLJgdPTo0Ro6dKjy8/N1/PhxPfDAAxo4cKDef/99tW3b1udajx8/rhEjRuiyyy7T0qVL1axZM+3Zs0cbNtRe7e3GG2/U73//e/385z/XwIED9e677+qhhx7S7t279cILL1QaO3fuXPXt21dLlizRwYMH9fOf/1w5OTn68MMPFRcXJ0m655579Nhjj2n69Ol69NFHtX//ft1///3avn27NmzYoEaNGvl8FgAAAC84u4quqayKLum58MnMGvyVkZFhDenQ7xbYjh4X2o5u3W3HhT3t0O8WNOj9zcxyc3NNkhUVFdm8efMsNjbWFi1a5Pf333rrLZNk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\n", | |
"text/plain": [ | |
"<Figure size 1152x576 with 1 Axes>" | |
] | |
}, | |
"metadata": { | |
"needs_background": "light" | |
}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"import tensorflow as tf\n", | |
"\n", | |
"config = tf.ConfigProto()\n", | |
"config.gpu_options.allow_growth = True\n", | |
"tf.enable_eager_execution(config=config)\n", | |
"\n", | |
"def celu(inputs, alpha):\n", | |
" return tf.keras.activations.elu(\n", | |
" tf.math.divide(inputs, alpha),\n", | |
" alpha=alpha\n", | |
" )\n", | |
"\n", | |
"def AniCELU(input):\n", | |
" alpha = tf.constant(1.0, dtype=tf.float32)\n", | |
" after_0 = tf.maximum(input, 0)\n", | |
" before_0 = tf.minimum(alpha*(tf.exp(input/alpha) - 1), 0)\n", | |
" return after_0+before_0\n", | |
"\n", | |
"def mycelu(inputs):\n", | |
" return tf.keras.layers.Activation(AniCELU)(inputs)\n", | |
"\n", | |
"def check(input):\n", | |
" with tf.GradientTape() as tape:\n", | |
" r_celu_out = mycelu(input)\n", | |
"# print('-' * 20, 'richard', '-' * 20)\n", | |
"# print(\"CELU out:\", r_celu_out.numpy())\n", | |
" r_celu_zero_slope = tape.gradient(r_celu_out, input)\n", | |
"# print(\"CELU slope at zero:\", r_celu_zero_slope.numpy())\n", | |
" with tf.GradientTape() as tape:\n", | |
"# print('-' * 20, 'kevin', '-' * 20)\n", | |
" k_celu_out = celu(input, alpha=1.0)\n", | |
"# print(\"CELU out:\", k_celu_out.numpy())\n", | |
" k_celu_zero_slope = tape.gradient(k_celu_out, input)\n", | |
"# print(\"CELU slope at zero:\", k_celu_zero_slope.numpy())\n", | |
" return r_celu_out.numpy(), r_celu_zero_slope.numpy(), k_celu_out.numpy(), k_celu_zero_slope.numpy()\n", | |
"\n", | |
"import numpy as np\n", | |
"import matplotlib.pyplot as plt\n", | |
"testdata = np.linspace(-5, 5, num=101)\n", | |
" \n", | |
"plt.figure(figsize=(16,8))\n", | |
"r_celu_out = []\n", | |
"r_celu_zero_slope = []\n", | |
"k_celu_out = []\n", | |
"k_celu_zero_slope = []\n", | |
"\n", | |
"for i in (testdata):\n", | |
"# print(i)\n", | |
" result = check(tf.Variable(float(i)))\n", | |
" r_celu_out.append(result[0])\n", | |
" r_celu_zero_slope.append(result[1])\n", | |
" k_celu_out.append(result[2])\n", | |
" k_celu_zero_slope.append(result[3])\n", | |
"\n", | |
"plt.plot(testdata, r_celu_out, '.', label=\"r_celu_out\")\n", | |
"plt.plot(testdata, r_celu_zero_slope, '.', label=\"r_celu_zero_slope\")\n", | |
"plt.plot(testdata, k_celu_out, '.', label=\"k_celu_out\")\n", | |
"plt.plot(testdata, k_celu_zero_slope, '.', label=\"k_celu_zero_slope\")\n", | |
"plt.legend(frameon=False, fontsize=16)\n", | |
"plt.show()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3", | |
"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.6.8" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
About how to fix gradient
https://github.com/yueyericardo/tfani/issues/39