Skip to content

Instantly share code, notes, and snippets.

@tillahoffmann
Created December 30, 2016 12:10
Show Gist options
  • Save tillahoffmann/e2e639335f89f2e5e270bb18edd11ded to your computer and use it in GitHub Desktop.
Save tillahoffmann/e2e639335f89f2e5e270bb18edd11ded to your computer and use it in GitHub Desktop.
Gradient of the division operation in tensorflow
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import numpy as np\n",
"from matplotlib import pyplot as plt, colors as mcolors, rcParams\n",
"import tensorflow as tf\n",
"from tensorflow.python.framework import function\n",
"%matplotlib inline\n",
"rcParams['figure.dpi'] *= 2\n",
"\n",
"lower, upper = -40, 40\n",
"x = np.logspace(lower, upper, 100, dtype=np.float32)\n",
"xx, yy = [_.astype(np.float32) for _ in np.meshgrid(x, x)]"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Define the division function and its gradient\n",
"@function.Defun(tf.float32, tf.float32, tf.float32)\n",
"def newDivGrad(x, y, grad):\n",
" return tf.reciprocal(y) * grad, - tf.div(tf.div(x, y), y) * grad\n",
"\n",
"\n",
"@function.Defun(tf.float32, tf.float32, grad_func=newDivGrad)\n",
"def newDiv(x, y):\n",
" return tf.div(x, y)\n",
"\n",
"\n",
"# Contstruct a graph\n",
"with tf.Graph().as_default() as graph:\n",
" _x = tf.placeholder(tf.float32)\n",
" _y = tf.placeholder(tf.float32)\n",
" _f = - tf.div(_x, _y)\n",
" _g = - newDiv(_x, _y)\n",
" _df, = tf.gradients(_f, _y)\n",
" _dg, = tf.gradients(_g, _y)\n",
" \n",
"session = tf.Session(graph=graph)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.text.Text at 0x1273e1b38>"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/tillhoffmann/miniconda3/envs/aggregated_inference/lib/python3.5/site-packages/matplotlib/colors.py:921: RuntimeWarning: invalid value encountered in less_equal\n",
" mask |= resdat <= 0\n",
"/Users/tillhoffmann/miniconda3/envs/aggregated_inference/lib/python3.5/site-packages/matplotlib/image.py:371: RuntimeWarning: invalid value encountered in less\n",
" rgba[..., 1] = A < 0 # under data\n",
"/Users/tillhoffmann/miniconda3/envs/aggregated_inference/lib/python3.5/site-packages/matplotlib/image.py:372: RuntimeWarning: invalid value encountered in greater\n",
" rgba[..., 2] = A > 1 # over data\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1263d01d0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, axes = plt.subplots(2, 2, True, True)\n",
"ax1, ax2, ax3, ax4 = axes.ravel()\n",
"\n",
"# Compute the gradients\n",
"df = session.run(_df, {_x: xx, _y: yy})\n",
"dg = session.run(_dg, {_x: xx, _y: yy})\n",
"\n",
"# Compute the norm\n",
"vmax = np.max(dg[np.isfinite(dg)])\n",
"norm = mcolors.LogNorm(1/vmax, vmax)\n",
"\n",
"# Show the gradient\n",
"kwargs = {\n",
" 'origin': 'lower',\n",
" 'extent': [lower, upper, lower, upper]\n",
"}\n",
"ax1.imshow(df, norm=norm, **kwargs)\n",
"ax2.imshow(dg, norm=norm, **kwargs)\n",
"\n",
"# Show the overlap\n",
"mask_df = np.ones_like(df)\n",
"mask_df[~np.isfinite(df) | (df == 0)] = np.nan\n",
"ax3.imshow(mask_df, alpha=.5, cmap='Reds', **kwargs, vmin=0)\n",
"\n",
"mask_dg = np.ones_like(dg)\n",
"mask_dg[~np.isfinite(dg) | (dg == 0)] = np.nan\n",
"ax3.imshow(mask_dg, alpha=.5, cmap='Greens', **kwargs, vmin=0)\n",
"\n",
"ax1.set_title('old $-df/dy$')\n",
"ax2.set_title('new $-df/dy$')\n",
"ax3.set_title('coverage')\n",
"\n",
"ax1.set_ylabel(r'$\\log_{10}y$')\n",
"ax3.set_ylabel(r'$\\log_{10}y$')\n",
"ax3.set_xlabel(r'$\\log_{10}x$')\n",
"ax4.set_xlabel(r'$\\log_{10}x$')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"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.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment