From 1def74ee0e1ef867ec6e595f84f829662ed6e093 Mon Sep 17 00:00:00 2001 From: mhjensen Date: Sun, 11 Oct 2020 22:51:56 +0200 Subject: [PATCH] added files --- doc/pub/week42/ipynb/ipynb-week42-src.tar.gz | Bin 0 -> 87344 bytes doc/pub/week42/ipynb/week42.ipynb | 591 +++++++++++++++++++ 2 files changed, 591 insertions(+) create mode 100644 doc/pub/week42/ipynb/ipynb-week42-src.tar.gz create mode 100644 doc/pub/week42/ipynb/week42.ipynb diff --git a/doc/pub/week42/ipynb/ipynb-week42-src.tar.gz b/doc/pub/week42/ipynb/ipynb-week42-src.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..cd0706867c7d796e20232f7a7f9509d156f6ddd1 GIT binary patch literal 87344 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 z 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 TKjlyPza{?;{kk%@0CoWYxmz;E literal 0 HcmV?d00001 diff --git a/doc/pub/week42/ipynb/week42.ipynb b/doc/pub/week42/ipynb/week42.ipynb new file mode 100644 index 000000000..a48999e98 --- /dev/null +++ b/doc/pub/week42/ipynb/week42.ipynb @@ -0,0 +1,591 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "# Week 42 Convolutional and Recurrent Neural Networks and Autoencoders\n", + "\n", + " \n", + "**Morten Hjorth-Jensen**, Department of Physics, University of Oslo and Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University\n", + "\n", + "Date: **Oct 10, 2020**\n", + "\n", + "Copyright 1999-2020, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license\n", + "\n", + "\n", + "\n", + "\n", + "## Plan for week 42\n", + "\n", + "* Thursday: Convolutional Neural Networks and examples\n", + "\n", + "* Friday: Recurrent Neural Networks and Autoencoders\n", + "\n", + "Reading suggestions for both days: [Aurelien Geron's chapters 13 and 14](https://github.com/CompPhysics/MachineLearning/blob/master/doc/T\\\n", + "extbooks/TensorflowML.pdf). Autoencoders are discussed in chapter 15 of Geron's text.\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "## Convolutional Neural Networks (recognizing images)\n", + "\n", + "\n", + "Convolutional neural networks (CNNs) were developed during the last\n", + "decade of the previous century, with a focus on character recognition\n", + "tasks. Nowadays, CNNs are a central element in the spectacular success\n", + "of deep learning methods. The success in for example image\n", + "classifications have made them a central tool for most machine\n", + "learning practitioners.\n", + "\n", + "CNNs are very similar to ordinary Neural Networks.\n", + "They are made up of neurons that have learnable weights and\n", + "biases. Each neuron receives some inputs, performs a dot product and\n", + "optionally follows it with a non-linearity. The whole network still\n", + "expresses a single differentiable score function: from the raw image\n", + "pixels on one end to class scores at the other. And they still have a\n", + "loss function (for example Softmax) on the last (fully-connected) layer\n", + "and all the tips/tricks we developed for learning regular Neural\n", + "Networks still apply (back propagation, gradient descent etc etc).\n", + "\n", + "What is the difference? **CNN architectures make the explicit assumption that\n", + "the inputs are images, which allows us to encode certain properties\n", + "into the architecture. These then make the forward function more\n", + "efficient to implement and vastly reduce the amount of parameters in\n", + "the network.**\n", + "\n", + "Here we provide only a superficial overview, for the more interested, we recommend highly the course\n", + "[IN5400 – Machine Learning for Image Analysis](https://www.uio.no/studier/emner/matnat/ifi/IN5400/index-eng.html)\n", + "and the slides of [CS231](http://cs231n.github.io/convolutional-networks/).\n", + "\n", + "Another good read is the article here . \n", + "\n", + "## Regular NNs don’t scale well to full images\n", + "\n", + "As an example, consider\n", + "an image of size $32\\times 32\\times 3$ (32 wide, 32 high, 3 color channels), so a\n", + "single fully-connected neuron in a first hidden layer of a regular\n", + "Neural Network would have $32\\times 32\\times 3 = 3072$ weights. This amount still\n", + "seems manageable, but clearly this fully-connected structure does not\n", + "scale to larger images. For example, an image of more respectable\n", + "size, say $200\\times 200\\times 3$, would lead to neurons that have \n", + "$200\\times 200\\times 3 = 120,000$ weights. \n", + "\n", + "We could have\n", + "several such neurons, and the parameters would add up quickly! Clearly,\n", + "this full connectivity is wasteful and the huge number of parameters\n", + "would quickly lead to possible overfitting.\n", + "\n", + "\n", + "\n", + "\n", + "

A regular 3-layer Neural Network.

\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "## 3D volumes of neurons\n", + "\n", + "Convolutional Neural Networks take advantage of the fact that the\n", + "input consists of images and they constrain the architecture in a more\n", + "sensible way. \n", + "\n", + "In particular, unlike a regular Neural Network, the\n", + "layers of a CNN have neurons arranged in 3 dimensions: width,\n", + "height, depth. (Note that the word depth here refers to the third\n", + "dimension of an activation volume, not to the depth of a full Neural\n", + "Network, which can refer to the total number of layers in a network.)\n", + "\n", + "To understand it better, the above example of an image \n", + "with an input volume of\n", + "activations has dimensions $32\\times 32\\times 3$ (width, height,\n", + "depth respectively). \n", + "\n", + "The neurons in a layer will\n", + "only be connected to a small region of the layer before it, instead of\n", + "all of the neurons in a fully-connected manner. Moreover, the final\n", + "output layer could for this specific image have dimensions $1\\times 1 \\times 10$, \n", + "because by the\n", + "end of the CNN architecture we will reduce the full image into a\n", + "single vector of class scores, arranged along the depth\n", + "dimension. \n", + "\n", + "\n", + "\n", + "\n", + "

A CNN arranges its neurons in three dimensions (width, height, depth), as visualized in one of the layers. Every layer of a CNN transforms the 3D input volume to a 3D output volume of neuron activations. In this example, the red input layer holds the image, so its width and height would be the dimensions of the image, and the depth would be 3 (Red, Green, Blue channels).

\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "## Layers used to build CNNs\n", + "\n", + "\n", + "A simple CNN is a sequence of layers, and every layer of a CNN\n", + "transforms one volume of activations to another through a\n", + "differentiable function. We use three main types of layers to build\n", + "CNN architectures: Convolutional Layer, Pooling Layer, and\n", + "Fully-Connected Layer (exactly as seen in regular Neural Networks). We\n", + "will stack these layers to form a full CNN architecture.\n", + "\n", + "A simple CNN for image classification could have the architecture:\n", + "\n", + "* **INPUT** ($32\\times 32 \\times 3$) will hold the raw pixel values of the image, in this case an image of width 32, height 32, and with three color channels R,G,B.\n", + "\n", + "* **CONV** (convolutional )layer will compute the output of neurons that are connected to local regions in the input, each computing a dot product between their weights and a small region they are connected to in the input volume. This may result in volume such as $[32\\times 32\\times 12]$ if we decided to use 12 filters.\n", + "\n", + "* **RELU** layer will apply an elementwise activation function, such as the $max(0,x)$ thresholding at zero. This leaves the size of the volume unchanged ($[32\\times 32\\times 12]$).\n", + "\n", + "* **POOL** (pooling) layer will perform a downsampling operation along the spatial dimensions (width, height), resulting in volume such as $[16\\times 16\\times 12]$.\n", + "\n", + "* **FC** (i.e. fully-connected) layer will compute the class scores, resulting in volume of size $[1\\times 1\\times 10]$, where each of the 10 numbers correspond to a class score, such as among the 10 categories of the MNIST images we considered above . As with ordinary Neural Networks and as the name implies, each neuron in this layer will be connected to all the numbers in the previous volume.\n", + "\n", + "## Transforming images\n", + "\n", + "CNNs transform the original image layer by layer from the original\n", + "pixel values to the final class scores. \n", + "\n", + "Observe that some layers contain\n", + "parameters and other don’t. In particular, the CNN layers perform\n", + "transformations that are a function of not only the activations in the\n", + "input volume, but also of the parameters (the weights and biases of\n", + "the neurons). On the other hand, the RELU/POOL layers will implement a\n", + "fixed function. The parameters in the CONV/FC layers will be trained\n", + "with gradient descent so that the class scores that the CNN computes\n", + "are consistent with the labels in the training set for each image.\n", + "\n", + "\n", + "## CNNs in brief\n", + "\n", + "In summary:\n", + "\n", + "* A CNN architecture is in the simplest case a list of Layers that transform the image volume into an output volume (e.g. holding the class scores)\n", + "\n", + "* There are a few distinct types of Layers (e.g. CONV/FC/RELU/POOL are by far the most popular)\n", + "\n", + "* Each Layer accepts an input 3D volume and transforms it to an output 3D volume through a differentiable function\n", + "\n", + "* Each Layer may or may not have parameters (e.g. CONV/FC do, RELU/POOL don’t)\n", + "\n", + "* Each Layer may or may not have additional hyperparameters (e.g. CONV/FC/POOL do, RELU doesn’t)\n", + "\n", + "For more material on convolutional networks, we strongly recommend\n", + "the course\n", + "[IN5400 – Machine Learning for Image Analysis](https://www.uio.no/studier/emner/matnat/ifi/IN5400/index-eng.html)\n", + "and the slides of [CS231](http://cs231n.github.io/convolutional-networks/) which is taught at Stanford University (consistently ranked as one of the top computer science programs in the world). [Michael Nielsen's book is a must read, in particular chapter 6 which deals with CNNs](http://neuralnetworksanddeeplearning.com/chap6.html).\n", + "\n", + "\n", + "\n", + "## CNNs in more detail, building convolutional neural networks in Tensorflow and Keras\n", + "\n", + "\n", + "As discussed above, CNNs are neural networks built from the assumption that the inputs\n", + "to the network are 2D images. This is important because the number of features or pixels in images\n", + "grows very fast with the image size, and an enormous number of weights and biases are needed in order to build an accurate network. \n", + "\n", + "As before, we still have our input, a hidden layer and an output. What's novel about convolutional networks\n", + "are the **convolutional** and **pooling** layers stacked in pairs between the input and the hidden layer.\n", + "In addition, the data is no longer represented as a 2D feature matrix, instead each input is a number of 2D\n", + "matrices, typically 1 for each color dimension (Red, Green, Blue). \n", + "\n", + "\n", + "## Setting it up\n", + "\n", + "It means that to represent the entire\n", + "dataset of images, we require a 4D matrix or **tensor**. This tensor has the dimensions:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "(n_{inputs},\\, n_{pixels, width},\\, n_{pixels, height},\\, depth) .\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The MNIST dataset again\n", + "\n", + "The MNIST dataset consists of grayscale images with a pixel size of\n", + "$28\\times 28$, meaning we require $28 \\times 28 = 724$ weights to each\n", + "neuron in the first hidden layer.\n", + "\n", + "If we were to analyze images of size $128\\times 128$ we would require\n", + "$128 \\times 128 = 16384$ weights to each neuron. Even worse if we were\n", + "dealing with color images, as most images are, we have an image matrix\n", + "of size $128\\times 128$ for each color dimension (Red, Green, Blue),\n", + "meaning 3 times the number of weights $= 49152$ are required for every\n", + "single neuron in the first hidden layer.\n", + "\n", + "\n", + "## Strong correlations\n", + "\n", + "Images typically have strong local correlations, meaning that a small\n", + "part of the image varies little from its neighboring regions. If for\n", + "example we have an image of a blue car, we can roughly assume that a\n", + "small blue part of the image is surrounded by other blue regions.\n", + "\n", + "Therefore, instead of connecting every single pixel to a neuron in the\n", + "first hidden layer, as we have previously done with deep neural\n", + "networks, we can instead connect each neuron to a small part of the\n", + "image (in all 3 RGB depth dimensions). The size of each small area is\n", + "fixed, and known as a [receptive](https://en.wikipedia.org/wiki/Receptive_field).\n", + "\n", + "\n", + "\n", + "## Layers of a CNN\n", + "The layers of a convolutional neural network arrange neurons in 3D: width, height and depth. \n", + "The input image is typically a square matrix of depth 3. \n", + "\n", + "A **convolution** is performed on the image which outputs\n", + "a 3D volume of neurons. The weights to the input are arranged in a number of 2D matrices, known as **filters**.\n", + "\n", + "\n", + "Each filter slides along the input image, taking the dot product\n", + "between each small part of the image and the filter, in all depth\n", + "dimensions. This is then passed through a non-linear function,\n", + "typically the **Rectified Linear (ReLu)** function, which serves as the\n", + "activation of the neurons in the first convolutional layer. This is\n", + "further passed through a **pooling layer**, which reduces the size of the\n", + "convolutional layer, e.g. by taking the maximum or average across some\n", + "small regions, and this serves as input to the next convolutional\n", + "layer.\n", + "\n", + "\n", + "## Systematic reduction\n", + "\n", + "By systematically reducing the size of the input volume, through\n", + "convolution and pooling, the network should create representations of\n", + "small parts of the input, and then from them assemble representations\n", + "of larger areas. The final pooling layer is flattened to serve as\n", + "input to a hidden layer, such that each neuron in the final pooling\n", + "layer is connected to every single neuron in the hidden layer. This\n", + "then serves as input to the output layer, e.g. a softmax output for\n", + "classification.\n", + "\n", + "\n", + "## Prerequisites: Collect and pre-process data" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "\n", + "# import necessary packages\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from sklearn import datasets\n", + "\n", + "\n", + "# ensure the same random numbers appear every time\n", + "np.random.seed(0)\n", + "\n", + "# display images in notebook\n", + "%matplotlib inline\n", + "plt.rcParams['figure.figsize'] = (12,12)\n", + "\n", + "\n", + "# download MNIST dataset\n", + "digits = datasets.load_digits()\n", + "\n", + "# define inputs and labels\n", + "inputs = digits.images\n", + "labels = digits.target\n", + "\n", + "# RGB images have a depth of 3\n", + "# our images are grayscale so they should have a depth of 1\n", + "inputs = inputs[:,:,:,np.newaxis]\n", + "\n", + "print(\"inputs = (n_inputs, pixel_width, pixel_height, depth) = \" + str(inputs.shape))\n", + "print(\"labels = (n_inputs) = \" + str(labels.shape))\n", + "\n", + "\n", + "# choose some random images to display\n", + "n_inputs = len(inputs)\n", + "indices = np.arange(n_inputs)\n", + "random_indices = np.random.choice(indices, size=5)\n", + "\n", + "for i, image in enumerate(digits.images[random_indices]):\n", + " plt.subplot(1, 5, i+1)\n", + " plt.axis('off')\n", + " plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')\n", + " plt.title(\"Label: %d\" % digits.target[random_indices[i]])\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Importing Keras and Tensorflow" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from tensorflow.keras import datasets, layers, models\n", + "from tensorflow.keras.layers import Input\n", + "from tensorflow.keras.models import Sequential #This allows appending layers to existing models\n", + "from tensorflow.keras.layers import Dense #This allows defining the characteristics of a particular layer\n", + "from tensorflow.keras import optimizers #This allows using whichever optimiser we want (sgd,adam,RMSprop)\n", + "from tensorflow.keras import regularizers #This allows using whichever regularizer we want (l1,l2,l1_l2)\n", + "from tensorflow.keras.utils import to_categorical #This allows using categorical cross entropy as the cost function\n", + "#from tensorflow.keras import Conv2D\n", + "#from tensorflow.keras import MaxPooling2D\n", + "#from tensorflow.keras import Flatten\n", + "\n", + "from sklearn.model_selection import train_test_split\n", + "\n", + "# representation of labels\n", + "labels = to_categorical(labels)\n", + "\n", + "# split into train and test data\n", + "# one-liner from scikit-learn library\n", + "train_size = 0.8\n", + "test_size = 1 - train_size\n", + "X_train, X_test, Y_train, Y_test = train_test_split(inputs, labels, train_size=train_size,\n", + " test_size=test_size)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## Running with Keras" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def create_convolutional_neural_network_keras(input_shape, receptive_field,\n", + " n_filters, n_neurons_connected, n_categories,\n", + " eta, lmbd):\n", + " model = Sequential()\n", + " model.add(layers.Conv2D(n_filters, (receptive_field, receptive_field), input_shape=input_shape, padding='same',\n", + " activation='relu', kernel_regularizer=regularizers.l2(lmbd)))\n", + " model.add(layers.MaxPooling2D(pool_size=(2, 2)))\n", + " model.add(layers.Flatten())\n", + " model.add(layers.Dense(n_neurons_connected, activation='relu', kernel_regularizer=regularizers.l2(lmbd)))\n", + " model.add(layers.Dense(n_categories, activation='softmax', kernel_regularizer=regularizers.l2(lmbd)))\n", + " \n", + " sgd = optimizers.SGD(lr=eta)\n", + " model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])\n", + " \n", + " return model\n", + "\n", + "epochs = 100\n", + "batch_size = 100\n", + "input_shape = X_train.shape[1:4]\n", + "receptive_field = 3\n", + "n_filters = 10\n", + "n_neurons_connected = 50\n", + "n_categories = 10\n", + "\n", + "eta_vals = np.logspace(-5, 1, 7)\n", + "lmbd_vals = np.logspace(-5, 1, 7)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Final part" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "CNN_keras = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)\n", + " \n", + "for i, eta in enumerate(eta_vals):\n", + " for j, lmbd in enumerate(lmbd_vals):\n", + " CNN = create_convolutional_neural_network_keras(input_shape, receptive_field,\n", + " n_filters, n_neurons_connected, n_categories,\n", + " eta, lmbd)\n", + " CNN.fit(X_train, Y_train, epochs=epochs, batch_size=batch_size, verbose=0)\n", + " scores = CNN.evaluate(X_test, Y_test)\n", + " \n", + " CNN_keras[i][j] = CNN\n", + " \n", + " print(\"Learning rate = \", eta)\n", + " print(\"Lambda = \", lmbd)\n", + " print(\"Test accuracy: %.3f\" % scores[1])\n", + " print()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Final visualization" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# visual representation of grid search\n", + "# uses seaborn heatmap, could probably do this in matplotlib\n", + "import seaborn as sns\n", + "\n", + "sns.set()\n", + "\n", + "train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))\n", + "test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))\n", + "\n", + "for i in range(len(eta_vals)):\n", + " for j in range(len(lmbd_vals)):\n", + " CNN = CNN_keras[i][j]\n", + "\n", + " train_accuracy[i][j] = CNN.evaluate(X_train, Y_train)[1]\n", + " test_accuracy[i][j] = CNN.evaluate(X_test, Y_test)[1]\n", + "\n", + " \n", + "fig, ax = plt.subplots(figsize = (10, 10))\n", + "sns.heatmap(train_accuracy, annot=True, ax=ax, cmap=\"viridis\")\n", + "ax.set_title(\"Training Accuracy\")\n", + "ax.set_ylabel(\"$\\eta$\")\n", + "ax.set_xlabel(\"$\\lambda$\")\n", + "plt.show()\n", + "\n", + "fig, ax = plt.subplots(figsize = (10, 10))\n", + "sns.heatmap(test_accuracy, annot=True, ax=ax, cmap=\"viridis\")\n", + "ax.set_title(\"Test Accuracy\")\n", + "ax.set_ylabel(\"$\\eta$\")\n", + "ax.set_xlabel(\"$\\lambda$\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Recurrent neural networks: Overarching view\n", + "\n", + "Till now our focus has been, including convolutional neural networks\n", + "as well, on feedforward neural networks. The output or the activations\n", + "flow only in one direction, from the input layer to the output layer.\n", + "\n", + "A recurrent neural network (RNN) looks very much like a feedforward\n", + "neural network, except that it also has connections pointing\n", + "backward. \n", + "\n", + "RNNs are used to analyze time series data such as stock prices, and\n", + "tell you when to buy or sell. In autonomous driving systems, they can\n", + "anticipate car trajectories and help avoid accidents. More generally,\n", + "they can work on sequences of arbitrary lengths, rather than on\n", + "fixed-sized inputs like all the nets we have discussed so far. For\n", + "example, they can take sentences, documents, or audio samples as\n", + "input, making them extremely useful for natural language processing\n", + "systems such as automatic translation and speech-to-text.\n", + "\n", + "\n", + "\n", + "## Set up of an RNN\n", + "\n", + "The figure here displays a simple example of an RNN, with inputs $x_t$\n", + "at a given time $t$ and outputs $y_t$. Introducing time as a variable\n", + "offers an intutitive way of understanding these networks. In addition\n", + "to the inputs $x_t$, the layer at a time $t$ receives also as input\n", + "the output from the previous layer $t-1$, that is $y_{t1}$.\n", + "\n", + "This means also that we need to have weights that link both the inputs\n", + "$x_t$ to the outputs $y_t$ as well as weights that link the output\n", + "from the previous time $y_{t-1}$ and $y_t$. The figure here shows an\n", + "example of a simple RNN.\n", + "\n", + "\n", + "\n", + "## Solving differential equations and eigenvalue problems with RNNs\n", + "\n", + "\n", + "\n", + "In our discussions of ordinary differential equations and partial\n", + "differential equations using neural networks. Here we will discuss how\n", + "we can solve say ordinary differential equations and eigenvalue\n", + "problems using RNNs. Eigenvalue problems can be solved using RNNs by\n", + "rewriting such a problems as a non-linear differential equation.\n", + "\n", + "Instead of starting with a well-known ordinary differential equation,\n", + "we start directly with an eigenvaule problem.\n", + "\n", + "\n", + "\n", + "## Long-Short Time Memory\n", + "\n", + "Discussions about dynamic unrolling through time. discuss memory cells, input and output\n", + "\n", + "\n", + "\n", + "\n", + "## Autoencoders: Overarching view\n", + "\n", + "Autoencoders are artificial neural networks capable of learning\n", + "efficient representations of the input data (these representations are called codings) without\n", + "any supervision (i.e., the training set is unlabeled). These codings\n", + "typically have a much lower dimensionality than the input data, making\n", + "autoencoders useful for dimensionality reduction. \n", + "\n", + "More importantly, autoencoders act as powerful feature detectors, and\n", + "they can be used for unsupervised pretraining of deep neural networks.\n", + "\n", + "Lastly, they are capable of randomly generating new data that looks\n", + "very similar to the training data; this is called a generative\n", + "model. For example, you could train an autoencoder on pictures of\n", + "faces, and it would then be able to generate new faces. Surprisingly,\n", + "autoencoders work by simply learning to copy their inputs to their\n", + "outputs. This may sound like a trivial task, but we will see that\n", + "constraining the network in various ways can make it rather\n", + "difficult. For example, you can limit the size of the internal\n", + "representation, or you can add noise to the inputs and train the\n", + "network to recover the original inputs. These constraints prevent the\n", + "autoencoder from trivially copying the inputs directly to the outputs,\n", + "which forces it to learn efficient ways of representing the data. In\n", + "short, the codings are byproducts of the autoencoder’s attempt to\n", + "learn the identity function under some constraints.\n", + "\n", + "## Simple examples of Autoencoders" + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 4 +}