{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Tensorflow intro\n",
    "TensorFlow is an end-to-end open source platform for machine learning. It has a comprehensive, flexible ecosystem of tools, libraries and community resources that lets researchers push the state-of-the-art in ML and developers easily build and deploy ML powered applications (from https://www.tensorflow.org ).\n",
    "\n",
    "It is a powerful tool for numerical computations. Its main principle is based on the computation graph of arithmetic expressions, which allows to compute derivatives and gradients efficiently.\n",
    "\n",
    "<img src=\"exp.png\">"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Exercise 1\n",
    "Represent the above expression $f(x,y)$ using tensorflow.\n",
    "\n",
    "**a)** Evaluate the expression and the derivative with respect to $x$ at $x=3,y=4$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import tensorflow as tf\n",
    "sess = tf.InteractiveSession()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "42.0\n",
      "24.0\n"
     ]
    }
   ],
   "source": [
    "x = tf.placeholder(dtype=tf.float32, name='x')\n",
    "y = tf.placeholder(dtype=tf.float32, name='y')\n",
    "f = x*x*y + y + 2\n",
    "\n",
    "print(f.eval({x: 3, y: 4}))\n",
    "\n",
    "df = tf.gradients(f, x)[0]\n",
    "print(df.eval({x: 3, y: 4}))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**b)** Set $y=1$ and plot $f$ and $\\frac{\\partial f}{\\partial x}$ for $x\\in [-10,10]$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "\n",
    "s = np.linspace(-10, 10, 100)\n",
    "\n",
    "plt.subplot(1,2,1)\n",
    "plt.plot(f.eval({x: s, y:1}))\n",
    "\n",
    "plt.subplot(1,2,2)\n",
    "plt.plot(df.eval({x: s, y:1}))\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Exercise 2\n",
    "Implement a 1-hidden layer network to solve the first exercise from (Neural Networks - Part 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.preprocessing import scale\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "np.random.seed(10)\n",
    "\n",
    "X = np.sort(np.random.uniform(0, 3, 300))\n",
    "Y_true = 10 * np.sin(np.pi * X * X) + 20 * (X - 0.5) ** 2 + 15 * X \n",
    "Y = Y_true + np.random.normal(size=X.shape) * 5\n",
    "\n",
    "X = scale(X)\n",
    "Y = scale(Y)\n",
    "\n",
    "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.5)\n",
    "\n",
    "plt.figure(figsize=(8,5))\n",
    "plt.scatter(X_train, Y_train, color='red', s=5, label='training')\n",
    "plt.scatter(X_test, Y_test, color='blue', s=5, label='validation')\n",
    "plt.xlabel('X')\n",
    "plt.ylabel('Y');\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From c:\\users\\dany\\appdata\\local\\continuum\\miniconda3\\lib\\site-packages\\tensorflow\\python\\framework\\op_def_library.py:263: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Colocations handled automatically by placer.\n",
      "Iter 49999: 0.017660494893789298\r"
     ]
    }
   ],
   "source": [
    "X_train = X_train.reshape(-1,1)\n",
    "Y_train = Y_train.reshape(-1,1)\n",
    "\n",
    "X_holder = tf.placeholder(tf.float32, shape=[None, 1])\n",
    "Y_holder = tf.placeholder(tf.float32, shape=[None, 1])\n",
    "\n",
    "input_n  = 1\n",
    "hidden_n = 100\n",
    "output_n = 1\n",
    "\n",
    "W1 = tf.Variable(tf.random_normal([input_n, hidden_n]), dtype=tf.float32)\n",
    "b1 = tf.Variable(tf.random_normal([hidden_n]), dtype=tf.float32)\n",
    "hidden = tf.tanh(tf.matmul(X_holder, W1) + b1)\n",
    "\n",
    "W2 = tf.Variable(tf.random_normal([hidden_n, output_n]), dtype=tf.float32)\n",
    "b2 = tf.Variable(tf.random_normal([output_n]), dtype=tf.float32)\n",
    "output = tf.matmul(hidden, W2) + b2\n",
    "\n",
    "loss = tf.reduce_mean(tf.square(output - Y_holder))\n",
    "dW1, db1, dW2, db2 = tf.gradients(loss, [W1, b1, W2, b2])\n",
    "\n",
    "sess.run(tf.global_variables_initializer())\n",
    "\n",
    "iters = 50000\n",
    "lr = 0.01\n",
    "\n",
    "W1_update = tf.assign(W1, W1 - lr * dW1)\n",
    "b1_update = tf.assign(b1, b1 - lr * db1)\n",
    "W2_update = tf.assign(W2, W2 - lr * dW2)\n",
    "b2_update = tf.assign(b2, b2 - lr * db2)\n",
    "    \n",
    "for i in range(iters):\n",
    "    \n",
    "    sess.run([W1_update, b1_update, W2_update, b2_update], {X_holder: X_train, Y_holder: Y_train})\n",
    "    loss_np = loss.eval({X_holder: X_train, Y_holder: Y_train})\n",
    "\n",
    "    print('Iter {}: {}'.format(i, loss_np), end='\\r')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x27f8ec7b7f0>]"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(X, Y, color='red', s=5)\n",
    "plt.plot(X, sess.run(output, {X_holder: X.reshape(-1,1)}), color='b', linewidth=2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iter 19999: 0.0076280180364847185\r"
     ]
    }
   ],
   "source": [
    "optimizer = tf.train.AdamOptimizer(learning_rate=lr)\n",
    "train_op = optimizer.minimize(loss)\n",
    "sess.run(tf.global_variables_initializer())\n",
    "\n",
    "iters = 20000\n",
    "lr = 0.01\n",
    "for i in range(iters):\n",
    "    loss_np,_ = sess.run([loss, train_op], {X_holder: X_train.reshape(-1,1), Y_holder: Y_train.reshape(-1,1)})\n",
    "    print('Iter {}: {}'.format(i, loss_np), end='\\r')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x27f933a2a20>]"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(X, Y, color='red', s=5)\n",
    "plt.plot(X, sess.run(output, {X_holder: X.reshape(-1,1)}), color='b', linewidth=2)"
   ]
  }
 ],
 "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.7.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}