{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### Uczenie maszynowe\n",
"# 10. Sieci neuronowe – wprowadzenie"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"slideshow": {
"slide_type": "notes"
}
},
"outputs": [],
"source": [
"# Przydatne importy\n",
"\n",
"import matplotlib\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"\n",
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"## 10.1. Perceptron"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"https://www.youtube.com/watch?v=cNxadbrN_aI"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"### Pierwszy perceptron liniowy\n",
"\n",
"* Frank Rosenblatt, 1957\n",
"* aparat fotograficzny podłączony do 400 fotokomórek (rozdzielczość obrazu: 20 x 20)\n",
"* wagi – potencjometry aktualizowane za pomocą silniczków"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"### Uczenie perceptronu\n",
"\n",
"Cykl uczenia perceptronu Rosenblatta:\n",
"\n",
"1. Sfotografuj planszę z kolejnym obiektem.\n",
"1. Zaobserwuj, która lampka zapaliła się na wyjściu.\n",
"1. Sprawdź, czy to jest właściwa lampka.\n",
"1. Wyślij sygnał „nagrody” lub „kary”."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"### Funkcja aktywacji perceptronu\n",
"\n",
"Funkcja bipolarna:\n",
"\n",
"$$ g(z) = \\left\\{ \n",
"\\begin{array}{rl}\n",
"1 & \\textrm{gdy $z > \\theta_0$} \\\\\n",
"-1 & \\textrm{wpp.}\n",
"\\end{array}\n",
"\\right. $$\n",
"\n",
"gdzie $z = \\theta_1x_1 + \\ldots + \\theta_nx_n$,
\n",
"$\\theta_0$ to próg aktywacji,
\n",
"$x_0 = 1$. "
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"slideshow": {
"slide_type": "notes"
}
},
"outputs": [],
"source": [
"def bipolar_plot():\n",
" matplotlib.rcParams.update({'font.size': 16})\n",
"\n",
" plt.figure(figsize=(8,5))\n",
" x = [-1,-.23,1] \n",
" y = [-1, -1, 1]\n",
" plt.ylim(-1.2,1.2)\n",
" plt.xlim(-1.2,1.2)\n",
" plt.plot([-2,2],[1,1], color='black', ls=\"dashed\")\n",
" plt.plot([-2,2],[-1,-1], color='black', ls=\"dashed\")\n",
" plt.step(x, y, lw=3)\n",
" ax = plt.gca()\n",
" ax.spines['right'].set_color('none')\n",
" ax.spines['top'].set_color('none')\n",
" ax.xaxis.set_ticks_position('bottom')\n",
" ax.spines['bottom'].set_position(('data',0))\n",
" ax.yaxis.set_ticks_position('left')\n",
" ax.spines['left'].set_position(('data',0))\n",
"\n",
" plt.annotate(r'$\\theta_0$',\n",
" xy=(-.23,0), xycoords='data',\n",
" xytext=(-50, +50), textcoords='offset points', fontsize=26,\n",
" arrowprops=dict(arrowstyle=\"->\"))\n",
"\n",
" plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"outputs": [
{
"data": {
"image/png": "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h9uPObttXOmFiwcOHKj+/fuXm9+/f3/79LfeesvVlmutG264QdKlayM6O8ljx44dkuRwjcCqKL0OY+nWRwDA5REAYbyytxFz9eLEzz77rP36fx07dtQ999xTrubcuXNKS0uTJA0dOtTpWLfddpskadOmTTp37pzLfddGzZo1U8+ePSVdOpnmp9LS0pSZmang4OBKfyeu2rVrl/0knl69elV5PAAwBQEQxiu7K/Ls2bM6ceJEpfVff/21/Y4WkjRv3rwKtxzu27fPvnWxc+fOTscrnVdcXKxvv/3WndZrpdKzcRcsWKBdu3bZp585c0YPPPCAJOmhhx5SZGSkfV5KSoo6dOhQ7g4sBQUFWrx4sf3s4rI+//xzjRw5UtKlC0wTAAHAdQRAGK9fv34KDg62f//OO+84rc3OztY999xj3/o3evToCk/+kC7dFaNUZWcWl513/Phxl/uure644w797ne/U15ennr37q2EhASNGjVK1157rb766iv17dtXc+fOdVgmOztb6enp9jOlSxUVFemhhx5S48aN1adPH919990aOXKkunTpooEDB+rIkSPq0qWL3n333Zp8igBQ5xEAYbyIiAjdeuut9u+TkpJ08ODBcnXHjh1TfHy8/v3vf0uS2rRpo6VLlzodt+xWq9DQUKd1Zef5yrXpkpOTtWLFCvXp00dbtmxRamqqmjVrpgULFmjDhg0KCQlxaZzQ0FA9/vjjGjRokE6ePKm1a9fqww8/1MmTJzVkyBC98sor2rFjh2JiYqr5GQGAb+E6gICkp556SmvWrFFxcbGysrJ00003aerUqerZs6fOnTunjRs36vXXX7ffMaRVq1Zav369w25MOBo9erRGjx7tUu19992n++67r9z0oKAgzZkzx8OdAQAIgICk66+/Xn/84x81Y8YMSdLp06ed3lmid+/eWrFiRaW3O5Mcz0otKChwWld2HpcmAQDUBHYBA//16KOP6q233nJ6vN4111yjF154QZs3b75s+JMczy4uezzgT5W9fl1sbKwbHQMAcGXYAgiUMW7cOI0ZM0afffaZDh48qB9//FGxsbHq2LGj/fImrurYsaP8/PxUUlKir776SgkJCRXWlR5T6O/vrw4dOlT5OQAAcDkEQOAnAgICNGTIEA0ZMqRK44SEhKhfv376/PPPlZqaqkceeaTCutTUVEmXLgrt6skRAABUBbuAgWpUemLDxo0btXnz5nLzN2/erM8//1ySdO+999ZkawAAgxEAgWo0btw4XX/99ZKkUaNGad26dbIsS5Zlad26dRo1apSkSyehjB071oudAgBMwi5goBr5+/vrww8/1M0336xDhw4pISHBvpu39LZv11xzjT788EP5+/t7s1UAgEHYAghUs+bNm2vPnj2aM2eOunXrJn9/f/n7+6tr16566qmntGfPHjVv3tzbbQIADGKzLMvydhMAvOtMXqF+Nm+9w7Sds4foqvBgJ0vUfTk5OYqMjFR2djbXXwRgHLYAAgAAGIYACAAAYBgCIAAAgGEIgAAAAIYhAAIAABiGAAh40VdffWW/EwgAADWFAAh40T/+8Q8lJCToyJEj3m4FAGAQAiDgRQ899JAaNWqkSZMmiUtyAgBqCgEQ8KL69etr8eLFWrdunVasWOHtdgAAhiAAAl42fPhwjRw5Ug8//LB++OEHb7cDADAAARCoBV544QWdP39ejzzyiLdbAQAYgAAI1AKxsbFasGCBXnvtNc4KBgBUOwIgUEtMnDhRffr00YQJE1RYWOjtdgAAPowACNQSfn5+Wrp0qQ4dOqQFCxZ4ux0AgA8jAAK1SOfOnfXII48oKSlJ3377rbfbAQD4KAIgUMvMnj1bLVq00MSJE1VSUuLtdgAAPogACNQyISEhWrJkiT7//HO98cYb3m4HAOCDCIBALTR48GDde++9mj59uk6ePOntdgAAPoYACNRSCxculL+/v6ZOnertVgAAPoYACNRSUVFRev755/W3v/1N69at83Y7AAAfQgAEarFf/epXGjx4sCZNmqT8/HxvtwMA8BEEQKAWs9lsWrJkib7//ns9+eST3m4HAOAjCIBALXfttdfqiSee0PPPP6/du3d7ux0AgA8gAAJ1wPTp09WxY0dNmDBBxcXF3m4HAFDHEQCBOiAwMFCvvvqqdu7cqUWLFnm7HQBAHUcABOqI3r1764EHHtCsWbOUkZHh7XYAAHUYARCoQ5KSkhQZGamHHnpIlmV5ux0AQB1FAATqkIiICC1atEirV6/WBx984O12AAB1FAEQqGPuvPNO3X777Zo8ebKys7O93Q4AoA4iAAJ10KJFi5Sbm6uZM2d6uxUAQB1EAATqoGbNmikpKUkvv/yytmzZ4u12AAB1DAEQqKMeeOAB9erVSxMmTFBRUZG32wEA1CEEQKCO8vf316uvvqpvv/1Wf/rTn7zdDgCgDiEAAnVY165dNX36dM2dO1cHDhzwdjsAgDqCAAjUcU888YRiY2M1ceJErg0IAHAJARCo40JDQ7VkyRJ9+umn+stf/uLtdgAAdQABEPABt9xyi/7f//t/SkxM1OnTp73dDgCgliMAAj7iueeekyRNmzbNy50AAGo7AiDgI5o0aaKFCxfq7bff1ieffOLtdgAAtRgBEPAh9913n+Li4nT//feroKDA2+0AAGopAiDgQ2w2m1555RUdO3ZMc+fO9XY7AIBaigAI+Jh27dpp9uzZWrhwofbu3evtdgAAtRABEPBBjzzyiNq1a6cJEyaouLi4whrLsjRo0CBt27athrsDAHgbARDwQUFBQVq6dKm2bt2qJUuWVFhjs9m0bds2paWl1XB3AABvIwACPqpv376aOHGiZs6cqWPHjlVYExsbq+PHj9dwZwAAbyMAAj5swYIFCgsL0+TJkyucHxMToxMnTtRwVwAAbyMAAj6sQYMGeuGFF5SSkqJVq1aVm88WQAAwEwEQ8HGjRo3Sbbfdpoceekg5OTkO89gCCABmIgACPs5ms2nx4sX68ccfNWvWLId5BEAAMBMBEPAhx44dk2VZ5aa3bNlSc+fO1eLFi7V161b79NjYWOXk5Cg/P78m2wQAeBkBEPARJ06cULNmzfSLX/xChw4dKjd/8uTJ6t69u37729/qwoULki5tAZSkk99/X6O9AgC8iwAI+IiYmBitWrVK//73v3Xdddfpqaee0vnz5+3zAwICtHTpUn399dd67rnnJF3aAihJ35/gRBAAMAkBEPAht99+u7755hslJibqj3/8ozp37qy1a9fa53fv3l1Tp07Vk08+qUOHDv1vC+BJtgACgEkIgICPCQsLU1JSkvbu3atWrVpp6NChGjFihDIyMiRJTz31lKKjozVp0iTVr19foaGh+p4TQQDAKARAwEd16NBBn3zyid555x1t3bpVHTt21IIFCxQYGKiXXnpJn3zyiZYvX66YmBiOAQQAwxAAAR9ms9l0991369tvv9X999+v2bNnq1u3bqpXr57uvvtuTZ06VY0bN9b333v+GMD33ntPcXFxatiwocLCwtStWzc988wz9hNQ3LVz507dddddio6OVr169dS6dWtNnjxZp06d8nDnAOD7CICAAerXr69nn31Wu3fvVuPGjTV48GAVFhaqqKhI33//vce3AE6ZMkWjR4/W5s2b1atXL8XHxysjI0OPPvqoBg0apHPnzrk13sqVK9W7d2+tXLlSLVu21O233y4/Pz8tWrRIXbt21cGDBz3aPwD4OgIgYJAuXbpo48aNeuutt7RlyxYVFhbqyJEjOvxd+cvGXKlVq1YpOTlZ4eHh2rp1qz766CO9//77OnDggLp06aK0tDQ9/vjjLo93/Phx3Xvvvbp48aJeeeUVbdu2TStWrND+/fv1q1/9SidPntSYMWMqvP4hAKBiBEDAMDabTePGjVN6errGjx8vSTrhwfsBJyUlSZJmzJih7t2726dHRUXppZdekiQtWrRI2dnZLo335z//WQUFBRoyZIgmTJhgn+7v76+XX35ZkZGR2r59uz7++GOPPQcA8HUEQMBQDRo00OLFi7V27VpNmPSgR8Y8duyYtm/fLkkaM2ZMufn9+vVT8+bNVVhYqNTUVJfGTElJcTpeeHi4hg8fLkn64IMPrrRtADAOARAwXHx8vObOf8YjY+3evVuS1KhRI7Vu3brCmh49ejjUViY3N9d+fF/pclUZDwBwSYArRZZlKTc3t7p7AeAluXmFKikscJyWk6PAkmC3xvnmm28kSU2bNlVOTk6FNU2aNJEk7d+/32lNqa+//tr+uEGDBhXWX3XVVZKkQ4cOVTpeYWGhCgsL7d+XfqZdrgcAqGvq168vm81WaY3NcuHI6ZycHEVGRnqsMQAAAFSP7OxsRUREVFrjUgD0tS2AOTk5at68uTIzMy/7C4JvYh1wdDavUAP+9JnDtM9/H6dG4e5tAVy4cKHmzp2rG2+80elJGXPmzNGzzz6rQYMG2Y/vc2br1q265ZZbJElnzpxRQED5nRYbNmzQnXfeqcDAQGVlZTkd66dbAE+cOKFevXrpm2++UdOmTV15evAxfA7AV9cBV7YAurQL2Gaz+dQvplRERIRPPi+4jnXgkgt+hfILDnWYVj8iQhFuBsDGjRtLuhS2nP1eSy8E3ahRo8v+7q+++mr7Y39//wrrS/+HjYyMvKLXsn79+qwDhuNzACauA5wEAsBjWrVqJUnKzMx0WlM6r7S2Mi1btrQ/Lr2XcVXGAwBcQgAE4DE33HCDpEu7aw8fPlxhzY4dOyTJ4RqBzkREROjaa691WK4q4wEALjEyAAYHB+sPf/iDgoPd270F38E6UD2aNWumnj17SpKWL19ebn5aWpoyMzMVHBysoUOHujTmnXfe6XS8vLw8rV69WpI0YsQIt3otfe1ZB8zF5wBMXgdcOgkEgG87k1eon81b7zBt5+whusrNYwClS7eCu/POOxUeHq6NGzfat8ydOXNGN998s7766itNmzZNCxcutC+TkpKimTNnqmnTpvrnP//pMN7x48fVtm1bFRQUaOnSpfrtb38rSSouLtavf/1rvf322+rZs6e2bt162YOeyyq9uoErZ8sBgK8xcgsggOpzxx136He/+53y8vLUu3dvJSQkaNSoUbr22mv11VdfqW/fvpo7d67DMtnZ2UpPT9ehQ+XvSRwbG6s333xT/v7+mjBhgnr37q177rlH7dq109tvv63o6GgtX77crfAHAKYjAALwuOTkZK1YsUJ9+vTRli1blJqaqmbNmmnBggXasGGDQkJC3Brvrrvu0tatWzVixAh99913SklJUXFxsR588EHt2bPHfpwgAMA17AIG4NFdwHUFu4ABmMyntwCmpqbqySef1LBhwxQbGyubzSabzaajR49WadyioiI9/fTT6tatm8LCwtSwYUPFxcVp5cqVHuocnpSbm6vHHntM7du3V0hIiKKionTbbbdpw4YNVzReXFycfV2q6KvstetQc9577z3FxcWpYcOGCgsLU7du3fTMM8/Yrzvorp07d+quu+5SdHS06tWrp9atW2vy5Mk6deqUhzuHp3hqHXjzzTcrfY/bbDatW7eump4FrkR6erpefPFF3XffferSpYsCAgJks9k0b968Ko27fv16DR06VFFRUQoJCVGHDh00a9Ys5eXleahz73HpQtB11ZgxY5Sdne3RMQsKCvTzn/9cW7ZsUYMGDRQfH6+8vDxt2LBBGzduLHdwO7zr1KlT6t+/v/bv36+YmBgNGzZMJ0+e1Nq1a7V27VolJydr8uTJVzT2rbfeWmHY47aJNW/KlClKTk5WQECABg0apPDwcG3YsEGPPvqoVq9erY8//tit3c4rV67UL3/5S128eFE9e/ZU69attWPHDi1atEjvvfee0tLS2O1cy3h6HZCka665Rv369atwHnePqV1efvllJScne3TM559/XomJibLZbOrfv7+io6O1adMmJSUl6f3331daWpqioqI8+jNrlOXDfv3rX1tJSUnWunXrrFOnTlmS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\n",
"text/plain": [
"