Skip to content

Instantly share code, notes, and snippets.

@jkrukowski
Created July 10, 2019 14:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jkrukowski/882d19091756881604a428b45560a761 to your computer and use it in GitHub Desktop.
Save jkrukowski/882d19091756881604a428b45560a761 to your computer and use it in GitHub Desktop.
liniear-regression.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "liniear-regression.ipynb",
"version": "0.3.2",
"provenance": [],
"collapsed_sections": [],
"include_colab_link": true
},
"kernelspec": {
"name": "swift",
"display_name": "Swift"
},
"accelerator": "GPU"
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/jkrukowski/882d19091756881604a428b45560a761/liniear-regression.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "CoEfOhVWQI9T",
"colab_type": "text"
},
"source": [
"# Linear Regression with Swift for TensorFlow"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "w9oJuFnoUKuS",
"colab_type": "text"
},
"source": [
"## Imports\n",
"### Import necessary libraries"
]
},
{
"cell_type": "code",
"metadata": {
"id": "glNzWvo49gIl",
"colab_type": "code",
"colab": {}
},
"source": [
"import TensorFlow\n",
"import Python\n",
"%include \"EnableIPythonDisplay.swift\"\n",
"IPythonDisplay.shell.enable_matplotlib(\"inline\")\n",
"let plt = Python.import(\"matplotlib.pyplot\")\n",
"let np = Python.import(\"numpy\")"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "S9aaSkrQVw0u",
"colab_type": "text"
},
"source": [
"## Data\n",
"### Data for linear regression"
]
},
{
"cell_type": "code",
"metadata": {
"id": "VEHLo6jPCw1i",
"colab_type": "code",
"colab": {}
},
"source": [
"let n = 100\n",
"let a: Float = 1.5\n",
"let b: Float = 4.0\n",
"let x = Tensor<Float>(randomNormal: [n])\n",
"let y = x * a + b + Tensor<Float>(randomNormal: [n])"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "tdNVW4siUNX5",
"colab_type": "text"
},
"source": [
"## Helper Functions\n",
"### Functions for plotting and numpy linear regression\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "DS-OLs3aTjvF",
"colab_type": "code",
"colab": {}
},
"source": [
"func plotData(\n",
" x: PythonObject, \n",
" y: PythonObject, \n",
" fitLine: PythonObject\n",
") {\n",
" plt.plot(x, y, \"yo\", x, fitLine, \"--k\")\n",
" plt.show()\n",
"}\n",
"\n",
"func linearRegression(\n",
" x: PythonObject, \n",
" y: PythonObject\n",
") -> PythonObject {\n",
" let fit = np.polyfit(x, y, 1)\n",
" return np.poly1d(fit)(x)\n",
"}"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "NFk9Lyd2UyMb",
"colab_type": "text"
},
"source": [
"## NumPy Linear Regression"
]
},
{
"cell_type": "code",
"metadata": {
"id": "3cHkRZ0jA8JK",
"colab_type": "code",
"outputId": "e47eb544-3cb7-44cc-fc7a-402a05fa0d86",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 269
}
},
"source": [
"let regressionFunction = linearRegression(\n",
" x: x.makeNumpyArray(), \n",
" y: y.makeNumpyArray()\n",
")\n",
"\n",
"plotData(\n",
" x: x.makeNumpyArray(), \n",
" y: y.makeNumpyArray(), \n",
" fitLine: regressionFunction\n",
")"
],
"execution_count": 4,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n/wJtGz+CGnL2cgAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "IcSlAmqpXFQ4",
"colab_type": "text"
},
"source": [
"## Swift for TensorFlow Linear Regression"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "wLAFXRftvPnP",
"colab_type": "text"
},
"source": [
"### S4TF Linear Model"
]
},
{
"cell_type": "code",
"metadata": {
"id": "pLeqd32UDGJi",
"colab_type": "code",
"colab": {}
},
"source": [
"struct LiniearModel: Differentiable {\n",
" var w: Float\n",
" var b: Float\n",
"\n",
" @differentiable\n",
" func applied(to input: Tensor<Float>) -> Tensor<Float> {\n",
" return w * input + b\n",
" }\n",
"}"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "hxfk4CYxv39O",
"colab_type": "text"
},
"source": [
"### Train Function"
]
},
{
"cell_type": "code",
"metadata": {
"id": "gq2SD-H1v21s",
"colab_type": "code",
"colab": {}
},
"source": [
"func train(\n",
" x: Tensor<Float>, \n",
" y: Tensor<Float>, \n",
" model: inout LiniearModel,\n",
" epoch: Int,\n",
" lr: Float = 0.1\n",
") {\n",
" for _ in 0..<epoch { \n",
" let grad = gradient(at: model) { m -> Tensor<Float> in\n",
" let predicted = m.applied(to: x)\n",
" return meanSquaredError(predicted: predicted, expected: y)\n",
" }\n",
" model.w -= lr * grad.w\n",
" model.b -= lr * grad.b\n",
" } \n",
"}"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "7Ob1Qu_jvZ_P",
"colab_type": "text"
},
"source": [
"### Training Loop"
]
},
{
"cell_type": "code",
"metadata": {
"id": "yuNumQaFGFIf",
"colab_type": "code",
"outputId": "8eb1b659-e0be-427b-b9c9-83a335184c8b",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
}
},
"source": [
"var model = LiniearModel(w: 0.0, b: 0.0)\n",
"train(x: x, y: y, model: &model, epoch: 40, lr: 0.1)\n",
"print(model)"
],
"execution_count": 7,
"outputs": [
{
"output_type": "stream",
"text": [
"LiniearModel(w: 1.5547348, b: 3.8642275)\r\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "c_ap6q_i-Gp0",
"colab_type": "text"
},
"source": [
"### Plot the result"
]
},
{
"cell_type": "code",
"metadata": {
"id": "Qqq1qHCvIjHX",
"colab_type": "code",
"outputId": "37e01d61-2b31-43f2-c365-02a0e2c96b10",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 269
}
},
"source": [
"func swiftLinearRegression(\n",
" x: Tensor<Float>, \n",
" model: LiniearModel\n",
") -> PythonObject {\n",
" let result = model.applied(to: x)\n",
" return result.makeNumpyArray()\n",
"}\n",
"\n",
"let swiftRegressionFunction = swiftLinearRegression(\n",
" x: x, \n",
" model: model\n",
")\n",
"\n",
"plotData(\n",
" x: x.makeNumpyArray(), \n",
" y: y.makeNumpyArray(), \n",
" fitLine: swiftRegressionFunction\n",
")"
],
"execution_count": 8,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\nAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "JrbIs7W9YIDo",
"colab_type": "code",
"colab": {}
},
"source": [
""
],
"execution_count": 0,
"outputs": []
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment