From 0c44eedada70ad53b4e4ccede22f51b6f2e4403c Mon Sep 17 00:00:00 2001 From: mhjensen Date: Thu, 4 Oct 2018 05:35:51 +0200 Subject: [PATCH] updated typos --- doc/pub/NeuralNet/html/._NeuralNet-bs000.html | 43 +-- doc/pub/NeuralNet/html/._NeuralNet-bs001.html | 41 +-- doc/pub/NeuralNet/html/._NeuralNet-bs002.html | 41 +-- doc/pub/NeuralNet/html/._NeuralNet-bs003.html | 41 +-- doc/pub/NeuralNet/html/._NeuralNet-bs004.html | 41 +-- doc/pub/NeuralNet/html/._NeuralNet-bs005.html | 41 +-- doc/pub/NeuralNet/html/._NeuralNet-bs006.html | 41 +-- doc/pub/NeuralNet/html/._NeuralNet-bs007.html | 41 +-- doc/pub/NeuralNet/html/._NeuralNet-bs008.html | 41 +-- doc/pub/NeuralNet/html/._NeuralNet-bs009.html | 41 +-- doc/pub/NeuralNet/html/._NeuralNet-bs010.html | 43 +-- doc/pub/NeuralNet/html/._NeuralNet-bs011.html | 41 +-- doc/pub/NeuralNet/html/._NeuralNet-bs012.html | 41 +-- doc/pub/NeuralNet/html/._NeuralNet-bs013.html | 41 +-- doc/pub/NeuralNet/html/._NeuralNet-bs014.html | 41 +-- doc/pub/NeuralNet/html/._NeuralNet-bs015.html | 43 +-- doc/pub/NeuralNet/html/._NeuralNet-bs016.html | 41 +-- doc/pub/NeuralNet/html/._NeuralNet-bs017.html | 41 +-- doc/pub/NeuralNet/html/._NeuralNet-bs018.html | 41 +-- doc/pub/NeuralNet/html/._NeuralNet-bs019.html | 41 +-- doc/pub/NeuralNet/html/._NeuralNet-bs020.html | 43 +-- doc/pub/NeuralNet/html/._NeuralNet-bs021.html | 41 +-- doc/pub/NeuralNet/html/._NeuralNet-bs022.html | 41 +-- doc/pub/NeuralNet/html/._NeuralNet-bs023.html | 46 +-- doc/pub/NeuralNet/html/._NeuralNet-bs024.html | 41 +-- doc/pub/NeuralNet/html/._NeuralNet-bs025.html | 41 +-- doc/pub/NeuralNet/html/._NeuralNet-bs026.html | 47 +-- doc/pub/NeuralNet/html/._NeuralNet-bs027.html | 41 +-- doc/pub/NeuralNet/html/._NeuralNet-bs028.html | 45 +-- doc/pub/NeuralNet/html/._NeuralNet-bs029.html | 41 +-- doc/pub/NeuralNet/html/._NeuralNet-bs030.html | 43 +-- doc/pub/NeuralNet/html/._NeuralNet-bs031.html | 47 +-- doc/pub/NeuralNet/html/._NeuralNet-bs032.html | 41 +-- doc/pub/NeuralNet/html/._NeuralNet-bs033.html | 41 +-- doc/pub/NeuralNet/html/._NeuralNet-bs034.html | 41 +-- doc/pub/NeuralNet/html/._NeuralNet-bs035.html | 41 +-- doc/pub/NeuralNet/html/._NeuralNet-bs036.html | 41 +-- doc/pub/NeuralNet/html/._NeuralNet-bs037.html | 43 +-- doc/pub/NeuralNet/html/._NeuralNet-bs038.html | 43 +-- doc/pub/NeuralNet/html/._NeuralNet-bs039.html | 53 ++-- doc/pub/NeuralNet/html/._NeuralNet-bs040.html | 51 ++-- doc/pub/NeuralNet/html/._NeuralNet-bs041.html | 41 +-- doc/pub/NeuralNet/html/._NeuralNet-bs042.html | 41 +-- doc/pub/NeuralNet/html/._NeuralNet-bs043.html | 41 +-- doc/pub/NeuralNet/html/._NeuralNet-bs044.html | 57 ++-- doc/pub/NeuralNet/html/._NeuralNet-bs045.html | 41 +-- doc/pub/NeuralNet/html/._NeuralNet-bs046.html | 41 +-- doc/pub/NeuralNet/html/._NeuralNet-bs047.html | 42 +-- doc/pub/NeuralNet/html/._NeuralNet-bs048.html | 89 ++---- doc/pub/NeuralNet/html/._NeuralNet-bs049.html | 77 ++--- doc/pub/NeuralNet/html/._NeuralNet-bs050.html | 79 +++-- doc/pub/NeuralNet/html/._NeuralNet-bs051.html | 112 ++++---- doc/pub/NeuralNet/html/._NeuralNet-bs052.html | 106 ++----- doc/pub/NeuralNet/html/._NeuralNet-bs053.html | 211 ++++---------- doc/pub/NeuralNet/html/._NeuralNet-bs054.html | 143 +++++----- doc/pub/NeuralNet/html/._NeuralNet-bs055.html | 263 ++++++++++------- doc/pub/NeuralNet/html/NeuralNet-bs.html | 43 +-- doc/pub/NeuralNet/html/NeuralNet-reveal.html | 128 +++++---- .../NeuralNet/html/NeuralNet-solarized.html | 147 +++++----- doc/pub/NeuralNet/html/NeuralNet.html | 147 +++++----- doc/pub/NeuralNet/ipynb/NeuralNet.ipynb | 270 +++++++++--------- .../ipynb/ipynb-NeuralNet-src.tar.gz | Bin 211 -> 211 bytes doc/pub/NeuralNet/pdf/NeuralNet-minted.pdf | Bin 455569 -> 455043 bytes doc/src/NeuralNet/NeuralNet.do.txt | 104 +++---- 64 files changed, 1948 insertions(+), 2013 deletions(-) diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs000.html b/doc/pub/NeuralNet/html/._NeuralNet-bs000.html index da168971c..ed51ffa10 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs000.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs000.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -250,7 +251,7 @@ MathJax.Hub.Config({
    [2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University

    -

    Oct 2, 2018

    +

    Oct 4, 2018


    @@ -274,7 +275,7 @@ MathJax.Hub.Config({

  • 9
  • 10
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs001.html b/doc/pub/NeuralNet/html/._NeuralNet-bs001.html index b5ad32372..b86941edd 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs001.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs001.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -259,7 +260,7 @@ a weight variable.
  • 10
  • 11
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs002.html b/doc/pub/NeuralNet/html/._NeuralNet-bs002.html index d8c58a5d8..0f5ee3643 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs002.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs002.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -309,7 +310,7 @@ humanities to life science and medicine.
  • 11
  • 12
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs003.html b/doc/pub/NeuralNet/html/._NeuralNet-bs003.html index 692933f0f..ed2a8f2dd 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs003.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs003.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -274,7 +275,7 @@ methods we discussed earlier.
  • 12
  • 13
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs004.html b/doc/pub/NeuralNet/html/._NeuralNet-bs004.html index 1bc44423b..762a0476c 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs004.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs004.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -266,7 +267,7 @@ to all nodes in the subsequent layer, making this a so-called
  • 13
  • 14
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs005.html b/doc/pub/NeuralNet/html/._NeuralNet-bs005.html index b914e2ccf..83d81154d 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs005.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs005.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -275,7 +276,7 @@ recognition.
  • 14
  • 15
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs006.html b/doc/pub/NeuralNet/html/._NeuralNet-bs006.html index 7c29a685c..d51d8df51 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs006.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs006.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -267,7 +268,7 @@ especially well-suited for handwriting and speech recognition.
  • 15
  • 16
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs007.html b/doc/pub/NeuralNet/html/._NeuralNet-bs007.html index 6526bfac9..e1d45b967 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs007.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs007.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -268,7 +269,7 @@ type of NN due the unusual activation functions.
  • 16
  • 17
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs008.html b/doc/pub/NeuralNet/html/._NeuralNet-bs008.html index 88085f60e..d6e9a4adf 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs008.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs008.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -266,7 +267,7 @@ Such networks are often called multilayer perceptrons (MLPs).
  • 17
  • 18
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs009.html b/doc/pub/NeuralNet/html/._NeuralNet-bs009.html index 83f1eb816..de330d23b 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs009.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs009.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -271,7 +272,7 @@ as to not restrict the range of output values.
  • 18
  • 19
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs010.html b/doc/pub/NeuralNet/html/._NeuralNet-bs010.html index a9d34b33e..d4981fa3e 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs010.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs010.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -240,7 +241,7 @@ $$ $$ This function receives \( x_i \) as inputs. -Here the activation \( z=\sum_{i=1}^n w_ix_i \). +Here the activation \( z=(\sum_{i=1}^n w_ix_i+b_i) \). In an FFNN of such neurons, the inputs \( x_i \) are the outputs of the neurons in the preceding layer. Furthermore, an MLP is fully-connected, which means that each neuron receives a weighted sum @@ -272,7 +273,7 @@ of the outputs of all neurons in the previous layer.
  • 19
  • 20
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs011.html b/doc/pub/NeuralNet/html/._NeuralNet-bs011.html index 5d2d2bc8c..963d3d0a9 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs011.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs011.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -301,7 +302,7 @@ is obtained.
  • 20
  • 21
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs012.html b/doc/pub/NeuralNet/html/._NeuralNet-bs012.html index e176eacef..1805c9d9f 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs012.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs012.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -283,7 +284,7 @@ $$
  • 21
  • 22
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs013.html b/doc/pub/NeuralNet/html/._NeuralNet-bs013.html index 8fd346e29..3d0d83a87 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs013.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs013.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -274,7 +275,7 @@ variables are the input values \( x_n \).
  • 22
  • 23
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs014.html b/doc/pub/NeuralNet/html/._NeuralNet-bs014.html index 68330d629..d668a9828 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs014.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs014.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -283,7 +284,7 @@ flexibility of a neural network.
  • 23
  • 24
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs015.html b/doc/pub/NeuralNet/html/._NeuralNet-bs015.html index bb4744750..ca829af46 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs015.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs015.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -244,7 +245,7 @@ is the bias \( b_i^l \) and activation \( y_i^l \) of node \( i \) in layer \( l

    We have that \( \mathrm{W}_l \) is an \( N_{l-1} \times N_l \) matrix, while \( \hat{b}_l \) and \( \hat{y}_l \) are \( N_l \times 1 \) column vectors. With this notation, the sum becomes a matrix-vector multiplication, and we can write -the equation for the activations of hidden layer 2 as +the equation for the activations of hidden layer 2 (assuming three nodes for simplicity) as $$ \begin{equation} \hat{y}_2 = f_2(\mathrm{W}_2 \hat{y}_{1} + \hat{b}_{2}) = @@ -293,7 +294,7 @@ $$

  • 24
  • 25
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs016.html b/doc/pub/NeuralNet/html/._NeuralNet-bs016.html index 256ec3d1a..f050fcc64 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs016.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs016.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -277,7 +278,7 @@ used as input to the activation functions. For each operation
  • 25
  • 26
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs017.html b/doc/pub/NeuralNet/html/._NeuralNet-bs017.html index a24bb7121..233b7fe13 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs017.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs017.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -271,7 +272,7 @@ for a FFNN to fulfill the universal approximation theorem
  • 26
  • 27
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs018.html b/doc/pub/NeuralNet/html/._NeuralNet-bs018.html index d948ee651..e1c71a17e 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs018.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs018.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -279,7 +280,7 @@ $$
  • 27
  • 28
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs019.html b/doc/pub/NeuralNet/html/._NeuralNet-bs019.html index 3136a9de4..5f0629d5d 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs019.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs019.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -341,7 +342,7 @@ plt.show()
  • 28
  • 29
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs020.html b/doc/pub/NeuralNet/html/._NeuralNet-bs020.html index dd8a3e604..acfe21abf 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs020.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs020.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -246,7 +247,7 @@ As a convention it is normal to call a network with one layer of input units, units and one layer of output units as a two-layer network. A network with two layers of hidden units is called a three-layer network etc etc.

    -For an MLP there is no direct connection between the output nodes/neurons/units and the input nodes/neurons/units. +For an MLP network there is no direct connection between the output nodes/neurons/units and the input nodes/neurons/units. Hereafter we will call the various entities of a layer for nodes. There are also no connections within a single layer. @@ -292,7 +293,7 @@ like logistic regression or linear regression and their modifications on the oth

  • 29
  • 30
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs021.html b/doc/pub/NeuralNet/html/._NeuralNet-bs021.html index b9444ef1e..24832b68d 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs021.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs021.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -282,7 +283,7 @@ the potential of being universal approximators.
  • 30
  • 31
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs022.html b/doc/pub/NeuralNet/html/._NeuralNet-bs022.html index 756587b22..d0f8718da 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs022.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs022.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -288,7 +289,7 @@ classes.
  • 31
  • 32
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs023.html b/doc/pub/NeuralNet/html/._NeuralNet-bs023.html index a65de3cf6..73621ffa1 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs023.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs023.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -256,11 +257,10 @@ $$ $$

    -With the activation function \( \hat{z}^l \) we can in turn define the +With the activation values \( \hat{z}^l \) we can in turn define the output of layer \( l \) as \( \hat{a}^l = f(\hat{z}^l) \) where \( f \) is our activation function. In the examples here we will use the sigmoid -function discussed in our logistic regression lectures and here as -well. We will also use the same activation function \( f \) for all layers +function discussed in our logistic regression lectures. We will also use the same activation function \( f \) for all layers and their nodes. It means we have $$ @@ -293,7 +293,7 @@ $$

  • 32
  • 33
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs024.html b/doc/pub/NeuralNet/html/._NeuralNet-bs024.html index f9cc99057..cc458764a 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs024.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs024.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -276,7 +277,7 @@ $$
  • 33
  • 34
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs025.html b/doc/pub/NeuralNet/html/._NeuralNet-bs025.html index 5713df15a..d6e684d38 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs025.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs025.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -279,7 +280,7 @@ $$
  • 34
  • 35
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs026.html b/doc/pub/NeuralNet/html/._NeuralNet-bs026.html index 68448e75b..ebb19e4bd 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs026.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs026.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -252,7 +253,7 @@ $$

    This is an important expression. The second term on the right handside -measures how fast the cost is changing as a function of the $j$th +measures how fast the cost function is changing as a function of the $j$th output activation. If, for example, the cost function doesn't depend much on a particular output node \( j \), then \( \delta_j^L \) will be small, which is what we would expect. The first term on the right, measures @@ -264,9 +265,9 @@ Notice that everything in the above equations is easily computed. In particular, we compute \( z_j^L \) while computing the behaviour of the network, and it is only a small additional overhead to compute \( f'(z^L_j) \). The exact form of the derivative with respect to the -outpuwill, of course, depend on the form of the cost function. +output depends on the form of the cost function. However, provided the cost function is known there should be little -trouble computing +trouble in calculating $$ \frac{\partial {\cal C}}{\partial (a_j^L)} @@ -304,7 +305,7 @@ $$

  • 35
  • 36
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs027.html b/doc/pub/NeuralNet/html/._NeuralNet-bs027.html index 9677c8ef3..1f3ae973b 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs027.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs027.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -271,7 +272,7 @@ That is, the error \( \delta_j^L \) is exactly equal to the rate of change of th
  • 36
  • 37
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs028.html b/doc/pub/NeuralNet/html/._NeuralNet-bs028.html index 7b1809730..5194b809c 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs028.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs028.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -235,6 +236,8 @@ MathJax.Hub.Config({

    We have now three equations that are essential for the computations of the derivatives of the cost function at the output layer. These equations are needed to start the algorithm and they are + +

    @@ -276,7 +279,7 @@ descent. In this case we say the system learns slowly.

    Another interesting feature is that is when the activation function, -represented by the sigmoid function here, is rather flat when towards +represented by the sigmoid function here, is rather flat when we move towards its end values \( 0 \) and \( 1 \) (see the above Python codes). In these cases, the derivatives of the activation function will also be close to zero, meaning again that the gradients will be small and the @@ -314,7 +317,7 @@ one \( L-1 \) in terms of the errors in the final output layer.

  • 37
  • 38
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs029.html b/doc/pub/NeuralNet/html/._NeuralNet-bs029.html index 979c8097d..51da2a78e 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs029.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs029.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -286,7 +287,7 @@ We are now ready to set up the algorithm for back propagation and learning the w
  • 38
  • 39
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs030.html b/doc/pub/NeuralNet/html/._NeuralNet-bs030.html index 4c148d3de..32c5d9b1e 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs030.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs030.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -302,7 +303,7 @@ $$

    The parameter \( \eta \) is the learning parameter discussed in connection with the gradient descent methods. -Here it is convenient to use stochastic radient descent with mini-batches with an outer loop that steps through multiple epochs of training. +Here it is convenient to use stochastic gradient descent (see the examples below) with mini-batches with an outer loop that steps through multiple epochs of training.

    @@ -330,7 +331,7 @@ Here it is convenient to use stochastic radient descent with mini-batches with a

  • 39
  • 40
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs031.html b/doc/pub/NeuralNet/html/._NeuralNet-bs031.html index 8b3ef453f..a2858fbc1 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs031.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs031.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -251,10 +252,10 @@ calculate.

    For an input \( \boldsymbol{a} \) from the hidden layer, the probability that the input \( \boldsymbol{x} \) -is in class 0 or 1 is just: - +is in class 0 or 1 is just. We let \( \theta \) represent the unknown weights and biases to be adjusted by our equations). The variable \( x \) +represents our activation values \( z \). We have $$ -P(y = 0 \mid \boldsymbol{x}, \boldsymbol{\theta}) = \frac{1}{1 + \exp (- \boldsymbol{a}^T \boldsymbol{w}_{out})} , +P(y = 0 \mid \boldsymbol{x}, \boldsymbol{\theta}) = \frac{1}{1 + \exp (- \boldsymbol{x}} , $$ and @@ -292,7 +293,7 @@ of our network.

  • 40
  • 41
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs032.html b/doc/pub/NeuralNet/html/._NeuralNet-bs032.html index 44a65b22a..e6682f208 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs032.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs032.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -315,7 +316,7 @@ We leave it as an exercise in project 2 to derive these equations.
  • 41
  • 42
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs033.html b/doc/pub/NeuralNet/html/._NeuralNet-bs033.html index c07325e1c..0f4f526e9 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs033.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs033.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -270,7 +271,7 @@ One can identify a set of key steps when using neural networks to solve supervis
  • 42
  • 43
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs034.html b/doc/pub/NeuralNet/html/._NeuralNet-bs034.html index 3dfb98d10..760ef5922 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs034.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs034.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -349,7 +350,7 @@ plt.show()
  • 43
  • 44
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs035.html b/doc/pub/NeuralNet/html/._NeuralNet-bs035.html index 548530f68..99139c071 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs035.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs035.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -303,7 +304,7 @@ X_train, X_test, Y_train, Y_test = train_tes
  • 44
  • 45
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs036.html b/doc/pub/NeuralNet/html/._NeuralNet-bs036.html index fb571d82e..4d7cc0f15 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs036.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs036.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -300,7 +301,7 @@ which is inspired by probability theory (see logistic regression) and was most c
  • 45
  • 46
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs037.html b/doc/pub/NeuralNet/html/._NeuralNet-bs037.html index db12206fe..77093ebaf 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs037.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs037.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -267,7 +268,7 @@ i.e. each neuron \( j \) outputs the probability of being in class \( j \) given The denominator is a normalization factor to ensure the outputs (probabilities) sum up to 1. The exponent is just the weighted sum of inputs as before: -$$ z_j = \sum_{i=1}^n w_ {ij} a_i = \boldsymbol{a}^T \boldsymbol{w}_j .$$ +$$ z_j = \sum_{i=1}^n w_ {ij} a_i+b_j.$$

    Since each neuron in the output layer is connected to the 50 inputs from the hidden layer we have 50x10 = 500 @@ -299,7 +300,7 @@ weights to the output layer.

  • 46
  • 47
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs038.html b/doc/pub/NeuralNet/html/._NeuralNet-bs038.html index 1609267e2..8a3684b93 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs038.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs038.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -241,7 +242,7 @@ or normal distribution. Setting all weights to zero means all neurons give the s Adding a bias value to the weighted sum of inputs allows the neural network to represent a greater range of values. Without it, any input with the value 0 will be mapped to zero (before being passed through the activation). The bias unit has an output of 1, and a weight to each neuron \( j \), \( b_j \): -$$ z_j = \sum_{i=1}^n w_ {ij} a_i + 1\cdot b_j = \boldsymbol{a}^T \boldsymbol{w}_j + b_j .$$ +$$ z_j = \sum_{i=1}^n w_ {ij} a_i + 1\cdot b_j.$$

    The bias weights \( \boldsymbol{b} \) are often initialized to zero, but a small value like \( 0.01 \) ensures all neurons have some output which can be backpropagated in the first training cycle. @@ -290,7 +291,7 @@ output_bias = np47

  • 48
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs039.html b/doc/pub/NeuralNet/html/._NeuralNet-bs039.html index fcfeedb6a..b7b51a363 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs039.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs039.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -235,25 +236,25 @@ MathJax.Hub.Config({

    Denote \( F \) the number of features, \( H \) the number of hidden neurons and \( C \) the number of categories. -For each input image we calculate a weighted sum of input features (pixel values) to each neuron \( j \) in the hidden layer: +For each input image we calculate a weighted sum of input features (pixel values) to each neuron \( j \) in the hidden layer \( l \): -$$ z_{j}^{h} = \sum_{i=1}^{F} w_{ij}^{h} x_i + b_{j}^{h} = \boldsymbol{x}^T \boldsymbol{w}_{j}^{h} + b_{j}^{h} ,$$ +$$ z_{j}^{l} = \sum_{i=1}^{F} w_{ij}^{l} x_i + b_{j}^{l},$$

    this is then passed through our activation function -$$ a_{j}^{h} = f(z_{j}^{h}) .$$ +$$ a_{j}^{l} = f(z_{j}^{l}) .$$

    We calculate a weighted sum of inputs (activations in the hidden layer) to each neuron \( j \) in the output layer: -$$ z_{j}^{o} = \sum_{i=1}^{H} w_{ij}^{o} a_{i}^{h} + b_{j}^{o} = (\boldsymbol{a}^{h})^T \boldsymbol{w}_{j}^{o} + b_{j}^{o} .$$ +$$ z_{j}^{L} = \sum_{i=1}^{H} w_{ij}^{L} a_{i}^{l} + b_{j}^{L}.$$

    Finally we calculate the output of neuron \( j \) in the output layer using the softmax function: -$$ a_{j}^{o} = \frac{\exp{(z_j^{o})}} -{\sum_{c=0}^{C-1} \exp{(z_c^{o})}} .$$ +$$ a_{j}^{L} = \frac{\exp{(z_j^{L})}} +{\sum_{c=0}^{C-1} \exp{(z_c^{L})}} .$$

    @@ -281,7 +282,7 @@ $$ a_{j}^{o} = \frac{\exp{(z_j^{o})}}

  • 48
  • 49
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs040.html b/doc/pub/NeuralNet/html/._NeuralNet-bs040.html index 3ffd9ef4e..2457d9cac 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs040.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs040.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -246,28 +247,28 @@ and obtain a matrix that holds the weighted sum of inputs to the hidden layer for each input image and each hidden neuron. We also add the bias to obtain a matrix of weighted sums to the hidden layer \( Z^{h} \): -$$ Z^{h} = X W^{h} + B^{h} ,$$ +$$ \hat{z}^{l} = \hat{X} \hat{W}^{l} + \hat{b}^{l} ,$$

    meaning the same bias (1D array with size equal number of hidden neurons) is added to each input image. This is then passed through the activation: -$$ A^{h} = f(Z^h) .$$ +$$ \hat{a}^{l} = f(\hat{z}^l) .$$

    This is fed to the output layer: -$$ Z^{o} = A^{h} W^{o} + B^{o} .$$ +$$ \hat{z}^{L} = \hat{a}^{L} \hat{W}^{L} + \hat{b}^{L} .$$

    Finally we receive our output values for each image and each category by passing it through the softmax function: -$$ output = softmax (Z^{o}) = (n_{inputs}, n_{categories}) .$$ +$$ output = softmax (\hat{z}^{L}) = (n_{inputs}, n_{categories}) .$$

    -

    # setup the feed-forward pass
    +
    # setup the feed-forward pass, subscript h = hidden layer
     
     def sigmoid(x):
         return 1/(1 + np.exp(-x))
    @@ -329,7 +330,7 @@ predictions = predict(X_train)
       
  • 49
  • 50
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs041.html b/doc/pub/NeuralNet/html/._NeuralNet-bs041.html index 51252507d..60b215165 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs041.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs041.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -296,7 +297,7 @@ A full derivation is given in the appendix at the end.
  • 50
  • 51
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs042.html b/doc/pub/NeuralNet/html/._NeuralNet-bs042.html index 8dfba7c3c..faca2788a 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs042.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs042.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -291,7 +292,7 @@ This has two important benefits:
  • 51
  • 52
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs043.html b/doc/pub/NeuralNet/html/._NeuralNet-bs043.html index bbd876bbb..457b1383a 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs043.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs043.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -287,7 +288,7 @@ calculate the gradient efficently.
  • 52
  • 53
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs044.html b/doc/pub/NeuralNet/html/._NeuralNet-bs044.html index 2c2944666..ce0fe019a 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs044.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs044.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -237,38 +238,38 @@ MathJax.Hub.Config({ To more efficently train our network these equations are implemented using matrix operations. The error in the output layer is calculated simply as -$$ \Delta_o = \hat{y} - y = (n_{inputs}, n_{categories}) .$$ +$$ \delta_L = \hat{y} - y = (n_{inputs}, n_{categories}) .$$

    The gradient for the output weights is calculated as -$$ \nabla W_{o} = A^T \Delta_o = (n_{hidden}, n_{categories}) ,$$ +$$ \nabla W_{L} = \hat{a}^T \delta_L = (n_{hidden}, n_{categories}) ,$$

    -where \( A = (n_{inputs}, n_{hidden}) \). This simply means that we are summing up the gradients for each input. +where \( \hat{a} = (n_{inputs}, n_{hidden}) \). This simply means that we are summing up the gradients for each input. Since we are going backwards we have to transpose the activation matrix.

    The gradient with respect to the output bias is then -$$ \nabla B_{o} = \sum_{i=1}^{n_{inputs}} \Delta_o = (n_{categories}) .$$ +$$ \nabla \hat{b}_{L} = \sum_{i=1}^{n_{inputs}} \delta_L = (n_{categories}) .$$

    The error in the hidden layer is -$$ \Delta_h = \Delta_o W_{o}^T \circ f'(Z_{h}) = \Delta_o W_{o}^T \circ A_{h} \circ (1 - A_{h}) = (n_{inputs}, n_{hidden}) ,$$ +$$ \Delta_h = \delta_L W_{L}^T \circ f'(z_{h}) = \delta_L W_{L}^T \circ a_{h} \circ (1 - a_{h}) = (n_{inputs}, n_{hidden}) ,$$

    -where \( f'(A_{h}) \) is the derivative of the activation in the hidden layer. The matrix products mean +where \( f'(a_{h}) \) is the derivative of the activation in the hidden layer. The matrix products mean that we are summing up the products for each neuron in the output layer. The symbol \( \circ \) denotes the Hadamard product, meaning element-wise multiplication.

    This again gives us the gradients in the hidden layer: -$$ \nabla W_{h} = X^T \Delta_h = (n_{features}, n_{hidden}) ,$$ +$$ \nabla W_{h} = X^T \delta_h = (n_{features}, n_{hidden}) ,$$ -$$ \nabla B_{h} = \sum_{i=1}^{n_{inputs}} \Delta_h = (n_{hidden}) .$$ +$$ \nabla b_{h} = \sum_{i=1}^{n_{inputs}} \delta_h = (n_{hidden}) .$$

    @@ -371,7 +372,7 @@ lmbd = 0.0153

  • 54
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs045.html b/doc/pub/NeuralNet/html/._NeuralNet-bs045.html index 356ce9e6d..bc2f47b22 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs045.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs045.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -274,7 +275,7 @@ Andrew Ng goes through some of these considerations in this 54
  • 55
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs046.html b/doc/pub/NeuralNet/html/._NeuralNet-bs046.html index c77fbd648..93155b891 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs046.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs046.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -366,6 +367,8 @@ being realizations of this object with different hyperparameters. An implementat
  • 54
  • 55
  • 56
  • +
  • ...
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs047.html b/doc/pub/NeuralNet/html/._NeuralNet-bs047.html index 74fd9059d..ffd6faefc 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs047.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs047.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -287,6 +288,9 @@ test_predict = dnn54
  • 55
  • 56
  • +
  • 57
  • +
  • ...
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs048.html b/doc/pub/NeuralNet/html/._NeuralNet-bs048.html index aa1b1245a..ac3919327 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs048.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs048.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -231,22 +232,18 @@ MathJax.Hub.Config({ -

    Adjust hyperparameters (if necessary, network architecture

    +

    Adjust hyperparameters

    We now perform a grid search to find the optimal hyperparameters for the network. -Note that we are only using 1 layer with 50 neurons, and human performance is estimated to be around \( 98 \% \) (\( 2 \% \) error rate). +Note that we are only using 1 layer with 50 neurons, and human performance is estimated to be around \( 98\% \) (\( 2\% \) error rate).

    eta_vals = np.logspace(-5, 1, 7)
     lmbd_vals = np.logspace(-5, 1, 7)
    -
    -

    - - -

    # store the models for later use
    +# store the models for later use
     DNN_numpy = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)
     
     # grid search
    @@ -266,44 +263,6 @@ DNN_numpy = np.
             print()
     

    - - -

    # optional
    -# visual representation of grid search
    -# uses seaborn heatmap, I believe you can also do this with matplotlib imshow
    -import seaborn as sns
    -
    -sns.set()
    -
    -train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))
    -test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))
    -
    -for i in range(len(eta_vals)):
    -    for j in range(len(lmbd_vals)):
    -        dnn = DNN_numpy[i][j]
    -        
    -        train_pred = dnn.predict(X_train) 
    -        test_pred = dnn.predict(X_test)
    -
    -        train_accuracy[i][j] = accuracy_score(Y_train, train_pred)
    -        test_accuracy[i][j] = accuracy_score(Y_test, test_pred)
    -
    -        
    -fig, ax = plt.subplots(figsize = (10, 10))
    -sns.heatmap(train_accuracy, annot=True, ax=ax, cmap="viridis")
    -ax.set_title("Training Accuracy")
    -ax.set_ylabel("$\eta$")
    -ax.set_xlabel("$\lambda$")
    -plt.show()
    -
    -fig, ax = plt.subplots(figsize = (10, 10))
    -sns.heatmap(test_accuracy, annot=True, ax=ax, cmap="viridis")
    -ax.set_title("Test Accuracy")
    -ax.set_ylabel("$\eta$")
    -ax.set_xlabel("$\lambda$")
    -plt.show()
    -
    -

    diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs049.html b/doc/pub/NeuralNet/html/._NeuralNet-bs049.html index 83a22456f..02140c4d7 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs049.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs049.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -231,41 +232,13 @@ MathJax.Hub.Config({ -

    scikit-learn implementation

    - -

    -scikit-learn is a machine learning library for Python. It focuses more on traditional machine learning methods, such as regression, clustering, decision trees, etc. As such, it has only two types of neural networks: Multi Layer Perceptron outputting continuous values, MPLRegressor, and Multi Layer Perceptron outputting labels, MLPClassifier. We will see how simple it is to use these classes. - -

    -scikit-learn implements a few improvements from our neural network, such as early stopping, a varying learning rate, different optimization methods, etc. We would therefore expect a better performance overall. +

    Visualization

    -

    from sklearn.neural_network import MLPClassifier
    -
    -# store models for later use
    -DNN_scikit = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)
    -
    -for i, eta in enumerate(eta_vals):
    -    for j, lmbd in enumerate(lmbd_vals):
    -        dnn = MLPClassifier(hidden_layer_sizes=(n_hidden_neurons), activation='logistic',
    -                            alpha=lmbd, learning_rate_init=eta, max_iter=epochs)
    -        dnn.fit(X_train, Y_train)
    -        
    -        DNN_scikit[i][j] = dnn
    -        
    -        print("Learning rate  = ", eta)
    -        print("Lambda = ", lmbd)
    -        print("Accuracy score on test set: ", dnn.score(X_test, Y_test))
    -        print()
    -
    -

    - - -

    # optional
    -# visual representation of grid search
    -# uses seaborn heatmap, could probably do this in matplotlib
    +
    # visual representation of grid search
    +# uses seaborn heatmap, you can also do this with matplotlib imshow
     import seaborn as sns
     
     sns.set()
    @@ -275,7 +248,7 @@ test_accuracy = npfor i in range(len(eta_vals)):
         for j in range(len(lmbd_vals)):
    -        dnn = DNN_scikit[i][j]
    +        dnn = DNN_numpy[i][j]
             
             train_pred = dnn.predict(X_train) 
             test_pred = dnn.predict(X_test)
    @@ -320,6 +293,8 @@ plt.show()
       
  • 54
  • 55
  • 56
  • +
  • 57
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs050.html b/doc/pub/NeuralNet/html/._NeuralNet-bs050.html index aaded931c..8e9176256 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs050.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs050.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -231,18 +232,42 @@ MathJax.Hub.Config({ -

    Building neural networks in Tensorflow and Keras

    +

    scikit-learn implementation

    -Now we want to build on the experience gained from our neural network implementation in NumPy and scikit-learn -and use it to construct a neural network in Tensorflow. Once we have constructed a neural network in NumPy -and Tensorflow, building one in Keras is really quite trivial, though the performance may suffer. +scikit-learn focuses more +on traditional machine learning methods, such as regression, +clustering, decision trees, etc. As such, it has only two types of +neural networks: Multi Layer Perceptron outputting continuous values, +MPLRegressor, and Multi Layer Perceptron outputting labels, +MLPClassifier. We will see how simple it is to use these classes.

    -In our previous example we used only one hidden layer, and in this we will use two. From this it should be quite -clear how to build one using an arbitrary number of hidden layers, using data structures such as Python lists or -NumPy arrays. +scikit-learn implements a few improvements from our neural network, +such as early stopping, a varying learning rate, different +optimization methods, etc. We would therefore expect a better +performance overall. +

    + + +

    from sklearn.neural_network import MLPClassifier
    +# store models for later use
    +DNN_scikit = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)
    +
    +for i, eta in enumerate(eta_vals):
    +    for j, lmbd in enumerate(lmbd_vals):
    +        dnn = MLPClassifier(hidden_layer_sizes=(n_hidden_neurons), activation='logistic',
    +                            alpha=lmbd, learning_rate_init=eta, max_iter=epochs)
    +        dnn.fit(X_train, Y_train)
    +        
    +        DNN_scikit[i][j] = dnn
    +        
    +        print("Learning rate  = ", eta)
    +        print("Lambda = ", lmbd)
    +        print("Accuracy score on test set: ", dnn.score(X_test, Y_test))
    +        print()
    +

    @@ -264,6 +289,8 @@ NumPy arrays.

  • 54
  • 55
  • 56
  • +
  • 57
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs051.html b/doc/pub/NeuralNet/html/._NeuralNet-bs051.html index 41244e26b..81ea96519 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs051.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs051.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -231,47 +232,44 @@ MathJax.Hub.Config({ -

    Tensorflow

    - -

    -Tensorflow is an open source library machine learning library -developed by the Google Brain team for internal use. It was released -under the Apache 2.0 open source license in November 9, 2015. - -

    -Tensorflow is a computational framework that allows you to construct -machine learning models at different levels of abstraction, from -high-level, object-oriented APIs like Keras, down to the C++ kernels -that Tensorflow is built upon. The higher levels of abstraction are -simpler to use, but less flexible, and our choice of implementation -should reflect the problems we are trying to solve. - -

    -Tensorflow uses so-called graphs to represent your computation -in terms of the dependencies between individual operations, such that you first build a Tensorflow graph -to represent your model, and then create a Tensorflow session to run the graph. - -

    -In this guide we will analyze the same data as we did in our NumPy and -scikit-learn tutorial, gathered from the MNIST database of images. We -will give an introduction to the lower level Python Application -Program Interfaces (APIs), and see how we use them to build our graph. -Then we will build (effectively) the same graph in Keras, to see just -how simple solving a machine learning problem can be. - -

    -To install tensorflow on Unix/Linux systems, use pip as +

    Visualization

    -

    pip3 install tensorflow
    -
    -

    -and/or if you use anaconda, just write (or install from the graphical user interface) -

    +

    # optional
    +# visual representation of grid search
    +# uses seaborn heatmap, could probably do this in matplotlib
    +import seaborn as sns
     
    -
    -
    conda install tensorflow
    +sns.set()
    +
    +train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))
    +test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))
    +
    +for i in range(len(eta_vals)):
    +    for j in range(len(lmbd_vals)):
    +        dnn = DNN_scikit[i][j]
    +        
    +        train_pred = dnn.predict(X_train) 
    +        test_pred = dnn.predict(X_test)
    +
    +        train_accuracy[i][j] = accuracy_score(Y_train, train_pred)
    +        test_accuracy[i][j] = accuracy_score(Y_test, test_pred)
    +
    +        
    +fig, ax = plt.subplots(figsize = (10, 10))
    +sns.heatmap(train_accuracy, annot=True, ax=ax, cmap="viridis")
    +ax.set_title("Training Accuracy")
    +ax.set_ylabel("$\eta$")
    +ax.set_xlabel("$\lambda$")
    +plt.show()
    +
    +fig, ax = plt.subplots(figsize = (10, 10))
    +sns.heatmap(test_accuracy, annot=True, ax=ax, cmap="viridis")
    +ax.set_title("Test Accuracy")
    +ax.set_ylabel("$\eta$")
    +ax.set_xlabel("$\lambda$")
    +plt.show()
     

    @@ -293,6 +291,8 @@ and/or if you use anaconda, just write (or install from the graphical use

  • 54
  • 55
  • 56
  • +
  • 57
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs052.html b/doc/pub/NeuralNet/html/._NeuralNet-bs052.html index 7e4e010f9..09f13e7a4 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs052.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs052.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -231,69 +232,18 @@ MathJax.Hub.Config({ -

    Collect and pre-process data

    +

    Building neural networks in Tensorflow and Keras

    +Now we want to build on the experience gained from our neural network implementation in NumPy and scikit-learn +and use it to construct a neural network in Tensorflow. Once we have constructed a neural network in NumPy +and Tensorflow, building one in Keras is really quite trivial, though the performance may suffer. - -

    # import necessary packages
    -import numpy as np
    -import matplotlib.pyplot as plt
    -from sklearn import datasets
    -
    -
    -# ensure the same random numbers appear every time
    -np.random.seed(0)
    -
    -# display images in notebook
    -%matplotlib inline
    -plt.rcParams['figure.figsize'] = (12,12)
    -
    -
    -# download MNIST dataset
    -digits = datasets.load_digits()
    -
    -# define inputs and labels
    -inputs = digits.images
    -labels = digits.target
    -
    -print("inputs = (n_inputs, pixel_width, pixel_height) = " + str(inputs.shape))
    -print("labels = (n_inputs) = " + str(labels.shape))
    -
    -
    -# flatten the image
    -# the value -1 means dimension is inferred from the remaining dimensions: 8x8 = 64
    -n_inputs = len(inputs)
    -inputs = inputs.reshape(n_inputs, -1)
    -print("X = (n_inputs, n_features) = " + str(inputs.shape))
    -
    -
    -# choose some random images to display
    -indices = np.arange(n_inputs)
    -random_indices = np.random.choice(indices, size=5)
    -
    -for i, image in enumerate(digits.images[random_indices]):
    -    plt.subplot(1, 5, i+1)
    -    plt.axis('off')
    -    plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
    -    plt.title("Label: %d" % digits.target[random_indices[i]])
    -plt.show()
    -

    +In our previous example we used only one hidden layer, and in this we will use two. From this it should be quite +clear how to build one using an arbitrary number of hidden layers, using data structures such as Python lists or +NumPy arrays. - -

    from keras.utils import to_categorical
    -from sklearn.model_selection import train_test_split
    -
    -# one-hot representation of labels
    -labels = to_categorical(labels)
    -
    -# split into train and test data
    -train_size = 0.8
    -test_size = 1 - train_size
    -X_train, X_test, Y_train, Y_test = train_test_split(inputs, labels, train_size=train_size,
    -                                                    test_size=test_size)
    -

    @@ -313,6 +263,8 @@ X_train, X_test, Y_train, Y_test = train_tes

  • 54
  • 55
  • 56
  • +
  • 57
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs053.html b/doc/pub/NeuralNet/html/._NeuralNet-bs053.html index 8a497167e..bad315f66 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs053.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs053.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -231,147 +232,47 @@ MathJax.Hub.Config({ -

    Using TensorFlow backend

    +

    Tensorflow

    -
      -
    1. Define model and architecture
    2. -
    3. Choose cost function and optimizer
    4. -
    +

    +Tensorflow is an open source library machine learning library +developed by the Google Brain team for internal use. It was released +under the Apache 2.0 open source license in November 9, 2015. +

    +Tensorflow is a computational framework that allows you to construct +machine learning models at different levels of abstraction, from +high-level, object-oriented APIs like Keras, down to the C++ kernels +that Tensorflow is built upon. The higher levels of abstraction are +simpler to use, but less flexible, and our choice of implementation +should reflect the problems we are trying to solve. + +

    +Tensorflow uses so-called graphs to represent your computation +in terms of the dependencies between individual operations, such that you first build a Tensorflow graph +to represent your model, and then create a Tensorflow session to run the graph. + +

    +In this guide we will analyze the same data as we did in our NumPy and +scikit-learn tutorial, gathered from the MNIST database of images. We +will give an introduction to the lower level Python Application +Program Interfaces (APIs), and see how we use them to build our graph. +Then we will build (effectively) the same graph in Keras, to see just +how simple solving a machine learning problem can be. + +

    +To install tensorflow on Unix/Linux systems, use pip as

    -

    import tensorflow as tf
    +
    pip3 install tensorflow
    +
    +

    +and/or if you use anaconda, just write (or install from the graphical user interface) +

    -class NeuralNetworkTensorflow: - def __init__( - self, - X_train, - Y_train, - X_test, - Y_test, - n_neurons_layer1=100, - n_neurons_layer2=50, - n_categories=2, - epochs=10, - batch_size=100, - eta=0.1, - lmbd=0.0, - ): - - # keep track of number of steps - self.global_step = tf.Variable(0, dtype=tf.int32, trainable=False, name='global_step') - - self.X_train = X_train - self.Y_train = Y_train - self.X_test = X_test - self.Y_test = Y_test - - self.n_inputs = X_train.shape[0] - self.n_features = X_train.shape[1] - self.n_neurons_layer1 = n_neurons_layer1 - self.n_neurons_layer2 = n_neurons_layer2 - self.n_categories = n_categories - - self.epochs = epochs - self.batch_size = batch_size - self.iterations = self.n_inputs // self.batch_size - self.eta = eta - self.lmbd = lmbd - - # build network piece by piece - # name scopes (with) are used to enforce creation of new variables - # https://www.tensorflow.org/guide/variables - self.create_placeholders() - self.create_DNN() - self.create_loss() - self.create_optimiser() - self.create_accuracy() - - def create_placeholders(self): - # placeholders are fine here, but "Datasets" are the preferred method - # of streaming data into a model - with tf.name_scope('data'): - self.X = tf.placeholder(tf.float32, shape=(None, self.n_features), name='X_data') - self.Y = tf.placeholder(tf.float32, shape=(None, self.n_categories), name='Y_data') - - def create_DNN(self): - with tf.name_scope('DNN'): - # the weights are stored to calculate regularization loss later - - # Fully connected layer 1 - self.W_fc1 = self.weight_variable([self.n_features, self.n_neurons_layer1], name='fc1', dtype=tf.float32) - b_fc1 = self.bias_variable([self.n_neurons_layer1], name='fc1', dtype=tf.float32) - a_fc1 = tf.nn.sigmoid(tf.matmul(self.X, self.W_fc1) + b_fc1) - - # Fully connected layer 2 - self.W_fc2 = self.weight_variable([self.n_neurons_layer1, self.n_neurons_layer2], name='fc2', dtype=tf.float32) - b_fc2 = self.bias_variable([self.n_neurons_layer2], name='fc2', dtype=tf.float32) - a_fc2 = tf.nn.sigmoid(tf.matmul(a_fc1, self.W_fc2) + b_fc2) - - # Output layer - self.W_out = self.weight_variable([self.n_neurons_layer2, self.n_categories], name='out', dtype=tf.float32) - b_out = self.bias_variable([self.n_categories], name='out', dtype=tf.float32) - self.z_out = tf.matmul(a_fc2, self.W_out) + b_out - - def create_loss(self): - with tf.name_scope('loss'): - softmax_loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=self.Y, logits=self.z_out)) - - regularizer_loss_fc1 = tf.nn.l2_loss(self.W_fc1) - regularizer_loss_fc2 = tf.nn.l2_loss(self.W_fc2) - regularizer_loss_out = tf.nn.l2_loss(self.W_out) - regularizer_loss = self.lmbd*(regularizer_loss_fc1 + regularizer_loss_fc2 + regularizer_loss_out) - - self.loss = softmax_loss + regularizer_loss - - def create_accuracy(self): - with tf.name_scope('accuracy'): - probabilities = tf.nn.softmax(self.z_out) - predictions = tf.argmax(probabilities, axis=1) - labels = tf.argmax(self.Y, axis=1) - - correct_predictions = tf.equal(predictions, labels) - correct_predictions = tf.cast(correct_predictions, tf.float32) - self.accuracy = tf.reduce_mean(correct_predictions) - - def create_optimiser(self): - with tf.name_scope('optimizer'): - self.optimizer = tf.train.GradientDescentOptimizer(learning_rate=self.eta).minimize(self.loss, global_step=self.global_step) - - def weight_variable(self, shape, name='', dtype=tf.float32): - initial = tf.truncated_normal(shape, stddev=0.1) - return tf.Variable(initial, name=name, dtype=dtype) - - def bias_variable(self, shape, name='', dtype=tf.float32): - initial = tf.constant(0.1, shape=shape) - return tf.Variable(initial, name=name, dtype=dtype) - - def fit(self): - data_indices = np.arange(self.n_inputs) - - with tf.Session() as sess: - sess.run(tf.global_variables_initializer()) - for i in range(self.epochs): - for j in range(self.iterations): - chosen_datapoints = np.random.choice(data_indices, size=self.batch_size, replace=False) - batch_X, batch_Y = self.X_train[chosen_datapoints], self.Y_train[chosen_datapoints] - - sess.run([DNN.loss, DNN.optimizer], - feed_dict={DNN.X: batch_X, - DNN.Y: batch_Y}) - accuracy = sess.run(DNN.accuracy, - feed_dict={DNN.X: batch_X, - DNN.Y: batch_Y}) - step = sess.run(DNN.global_step) - - self.train_loss, self.train_accuracy = sess.run([DNN.loss, DNN.accuracy], - feed_dict={DNN.X: self.X_train, - DNN.Y: self.Y_train}) - - self.test_loss, self.test_accuracy = sess.run([DNN.loss, DNN.accuracy], - feed_dict={DNN.X: self.X_test, - DNN.Y: self.Y_test}) + +

    conda install tensorflow
     

    @@ -391,6 +292,8 @@ MathJax.Hub.Config({

  • 54
  • 55
  • 56
  • +
  • 57
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs054.html b/doc/pub/NeuralNet/html/._NeuralNet-bs054.html index 7922ab7ba..97b28b0f7 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs054.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs054.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -231,82 +232,68 @@ MathJax.Hub.Config({ -

    Optimizing and using gradient descent

    +

    Collect and pre-process data

    -

    epochs = 100
    -batch_size = 100
    -n_neurons_layer1 = 100
    -n_neurons_layer2 = 50
    -n_categories = 10
    +
    # import necessary packages
    +import numpy as np
    +import matplotlib.pyplot as plt
    +from sklearn import datasets
     
    -eta_vals = np.logspace(-5, 1, 7)
    -lmbd_vals = np.logspace(-5, 1, 7)
    -
    -

    - -

    DNN_tf = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)
    -        
    -for i, eta in enumerate(eta_vals):
    -    for j, lmbd in enumerate(lmbd_vals):
    -        DNN = NeuralNetworkTensorflow(X_train, Y_train, X_test, Y_test,
    -                                      n_neurons_layer1, n_neurons_layer2, n_categories,
    -                                      epochs=epochs, batch_size=batch_size, eta=eta, lmbd=lmbd)
    -        DNN.fit()
    -        
    -        DNN_tf[i][j] = DNN
    -        
    -        print("Learning rate = ", eta)
    -        print("Lambda = ", lmbd)
    -        print("Test accuracy: %.3f" % DNN.test_accuracy)
    -        print()
    -        
    -
    -

    +# ensure the same random numbers appear every time +np.random.seed(0) - -

    # optional
    -# visual representation of grid search
    -# uses seaborn heatmap, could probably do this in matplotlib
    -import seaborn as sns
    +# display images in notebook
    +%matplotlib inline
    +plt.rcParams['figure.figsize'] = (12,12)
     
    -sns.set()
     
    -train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))
    -test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))
    +# download MNIST dataset
    +digits = datasets.load_digits()
     
    -for i in range(len(eta_vals)):
    -    for j in range(len(lmbd_vals)):
    -        DNN = DNN_tf[i][j]
    +# define inputs and labels
    +inputs = digits.images
    +labels = digits.target
     
    -        train_accuracy[i][j] = DNN.train_accuracy
    -        test_accuracy[i][j] = DNN.test_accuracy
    +print("inputs = (n_inputs, pixel_width, pixel_height) = " + str(inputs.shape))
    +print("labels = (n_inputs) = " + str(labels.shape))
     
    -        
    -fig, ax = plt.subplots(figsize = (10, 10))
    -sns.heatmap(train_accuracy, annot=True, ax=ax, cmap="viridis")
    -ax.set_title("Training Accuracy")
    -ax.set_ylabel("$\eta$")
    -ax.set_xlabel("$\lambda$")
    -plt.show()
     
    -fig, ax = plt.subplots(figsize = (10, 10))
    -sns.heatmap(test_accuracy, annot=True, ax=ax, cmap="viridis")
    -ax.set_title("Test Accuracy")
    -ax.set_ylabel("$\eta$")
    -ax.set_xlabel("$\lambda$")
    +# flatten the image
    +# the value -1 means dimension is inferred from the remaining dimensions: 8x8 = 64
    +n_inputs = len(inputs)
    +inputs = inputs.reshape(n_inputs, -1)
    +print("X = (n_inputs, n_features) = " + str(inputs.shape))
    +
    +
    +# choose some random images to display
    +indices = np.arange(n_inputs)
    +random_indices = np.random.choice(indices, size=5)
    +
    +for i, image in enumerate(digits.images[random_indices]):
    +    plt.subplot(1, 5, i+1)
    +    plt.axis('off')
    +    plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
    +    plt.title("Label: %d" % digits.target[random_indices[i]])
     plt.show()
     

    -

    # optional
    -# we can use log files to visualize our graph in Tensorboard
    -writer = tf.summary.FileWriter('logs/')
    -writer.add_graph(tf.get_default_graph())
    +
    from keras.utils import to_categorical
    +from sklearn.model_selection import train_test_split
    +
    +# one-hot representation of labels
    +labels = to_categorical(labels)
    +
    +# split into train and test data
    +train_size = 0.8
    +test_size = 1 - train_size
    +X_train, X_test, Y_train, Y_test = train_test_split(inputs, labels, train_size=train_size,
    +                                                    test_size=test_size)
     

    @@ -325,6 +312,8 @@ writer.add_graph(tf54

  • 55
  • 56
  • +
  • 57
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs055.html b/doc/pub/NeuralNet/html/._NeuralNet-bs055.html index b08124b41..9d7845b64 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs055.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs055.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -231,104 +232,149 @@ MathJax.Hub.Config({ -

    Using Keras

    +

    Using TensorFlow backend

    -

    -Keras is a high level neural network -that supports Tensorflow, CTNK and Theano as backends. -If you have Tensorflow installed Keras is available through the tf.keras module. -If you have Anaconda installed you may run the following command -

    - - -

    conda install keras
    -
    -

    -Alternatively, if you have Tensorflow or one of the other supported backends install you may use the pip package manager: +

      +
    1. Define model and architecture
    2. +
    3. Choose cost function and optimizer
    4. +

    -

    pip3 install keras
    -
    -

    -or look up the instructions here. +

    import tensorflow as tf
     
    -

    - - -

    from keras.models import Sequential
    -from keras.layers import Dense
    -from keras.regularizers import l2
    -from keras.optimizers import SGD
    -
    -def create_neural_network_keras(n_neurons_layer1, n_neurons_layer2, n_categories, eta, lmbd):
    -    model = Sequential()
    -    model.add(Dense(n_neurons_layer1, activation='sigmoid', kernel_regularizer=l2(lmbd)))
    -    model.add(Dense(n_neurons_layer2, activation='sigmoid', kernel_regularizer=l2(lmbd)))
    -    model.add(Dense(n_categories, activation='softmax'))
    +class NeuralNetworkTensorflow:
    +    def __init__(
    +        self,
    +        X_train,
    +        Y_train,
    +        X_test,
    +        Y_test,
    +        n_neurons_layer1=100,
    +        n_neurons_layer2=50,
    +        n_categories=2,
    +        epochs=10,
    +        batch_size=100,
    +        eta=0.1,
    +        lmbd=0.0,
    +    ):
    +        
    +        # keep track of number of steps
    +        self.global_step = tf.Variable(0, dtype=tf.int32, trainable=False, name='global_step')
    +        
    +        self.X_train = X_train
    +        self.Y_train = Y_train
    +        self.X_test = X_test
    +        self.Y_test = Y_test
    +        
    +        self.n_inputs = X_train.shape[0]
    +        self.n_features = X_train.shape[1]
    +        self.n_neurons_layer1 = n_neurons_layer1
    +        self.n_neurons_layer2 = n_neurons_layer2
    +        self.n_categories = n_categories
    +        
    +        self.epochs = epochs
    +        self.batch_size = batch_size
    +        self.iterations = self.n_inputs // self.batch_size
    +        self.eta = eta
    +        self.lmbd = lmbd
    +        
    +        # build network piece by piece
    +        # name scopes (with) are used to enforce creation of new variables
    +        # https://www.tensorflow.org/guide/variables
    +        self.create_placeholders()
    +        self.create_DNN()
    +        self.create_loss()
    +        self.create_optimiser()
    +        self.create_accuracy()
         
    -    sgd = SGD(lr=eta)
    -    model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
    +    def create_placeholders(self):
    +        # placeholders are fine here, but "Datasets" are the preferred method
    +        # of streaming data into a model
    +        with tf.name_scope('data'):
    +            self.X = tf.placeholder(tf.float32, shape=(None, self.n_features), name='X_data')
    +            self.Y = tf.placeholder(tf.float32, shape=(None, self.n_categories), name='Y_data')
         
    -    return model
    +    def create_DNN(self):
    +        with tf.name_scope('DNN'):
    +            # the weights are stored to calculate regularization loss later
    +            
    +            # Fully connected layer 1
    +            self.W_fc1 = self.weight_variable([self.n_features, self.n_neurons_layer1], name='fc1', dtype=tf.float32)
    +            b_fc1 = self.bias_variable([self.n_neurons_layer1], name='fc1', dtype=tf.float32)
    +            a_fc1 = tf.nn.sigmoid(tf.matmul(self.X, self.W_fc1) + b_fc1)
    +            
    +            # Fully connected layer 2
    +            self.W_fc2 = self.weight_variable([self.n_neurons_layer1, self.n_neurons_layer2], name='fc2', dtype=tf.float32)
    +            b_fc2 = self.bias_variable([self.n_neurons_layer2], name='fc2', dtype=tf.float32)
    +            a_fc2 = tf.nn.sigmoid(tf.matmul(a_fc1, self.W_fc2) + b_fc2)
    +            
    +            # Output layer
    +            self.W_out = self.weight_variable([self.n_neurons_layer2, self.n_categories], name='out', dtype=tf.float32)
    +            b_out = self.bias_variable([self.n_categories], name='out', dtype=tf.float32)
    +            self.z_out = tf.matmul(a_fc2, self.W_out) + b_out
    +    
    +    def create_loss(self):
    +        with tf.name_scope('loss'):
    +            softmax_loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=self.Y, logits=self.z_out))
    +            
    +            regularizer_loss_fc1 = tf.nn.l2_loss(self.W_fc1)
    +            regularizer_loss_fc2 = tf.nn.l2_loss(self.W_fc2)
    +            regularizer_loss_out = tf.nn.l2_loss(self.W_out)
    +            regularizer_loss = self.lmbd*(regularizer_loss_fc1 + regularizer_loss_fc2 + regularizer_loss_out)
    +            
    +            self.loss = softmax_loss + regularizer_loss
    +
    +    def create_accuracy(self):
    +        with tf.name_scope('accuracy'):
    +            probabilities = tf.nn.softmax(self.z_out)
    +            predictions = tf.argmax(probabilities, axis=1)
    +            labels = tf.argmax(self.Y, axis=1)
    +            
    +            correct_predictions = tf.equal(predictions, labels)
    +            correct_predictions = tf.cast(correct_predictions, tf.float32)
    +            self.accuracy = tf.reduce_mean(correct_predictions)
    +    
    +    def create_optimiser(self):
    +        with tf.name_scope('optimizer'):
    +            self.optimizer = tf.train.GradientDescentOptimizer(learning_rate=self.eta).minimize(self.loss, global_step=self.global_step)
    +            
    +    def weight_variable(self, shape, name='', dtype=tf.float32):
    +        initial = tf.truncated_normal(shape, stddev=0.1)
    +        return tf.Variable(initial, name=name, dtype=dtype)
    +    
    +    def bias_variable(self, shape, name='', dtype=tf.float32):
    +        initial = tf.constant(0.1, shape=shape)
    +        return tf.Variable(initial, name=name, dtype=dtype)
    +    
    +    def fit(self):
    +        data_indices = np.arange(self.n_inputs)
    +
    +        with tf.Session() as sess:
    +            sess.run(tf.global_variables_initializer())
    +            for i in range(self.epochs):
    +                for j in range(self.iterations):
    +                    chosen_datapoints = np.random.choice(data_indices, size=self.batch_size, replace=False)
    +                    batch_X, batch_Y = self.X_train[chosen_datapoints], self.Y_train[chosen_datapoints]
    +            
    +                    sess.run([DNN.loss, DNN.optimizer],
    +                        feed_dict={DNN.X: batch_X,
    +                                   DNN.Y: batch_Y})
    +                    accuracy = sess.run(DNN.accuracy,
    +                        feed_dict={DNN.X: batch_X,
    +                                   DNN.Y: batch_Y})
    +                    step = sess.run(DNN.global_step)
    +    
    +            self.train_loss, self.train_accuracy = sess.run([DNN.loss, DNN.accuracy],
    +                feed_dict={DNN.X: self.X_train,
    +                           DNN.Y: self.Y_train})
    +        
    +            self.test_loss, self.test_accuracy = sess.run([DNN.loss, DNN.accuracy],
    +                feed_dict={DNN.X: self.X_test,
    +                           DNN.Y: self.Y_test})
     

    - - -

    DNN_keras = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)
    -        
    -for i, eta in enumerate(eta_vals):
    -    for j, lmbd in enumerate(lmbd_vals):
    -        DNN = create_neural_network_keras(n_neurons_layer1, n_neurons_layer2, n_categories,
    -                                         eta=eta, lmbd=lmbd)
    -        DNN.fit(X_train, Y_train, epochs=epochs, batch_size=batch_size, verbose=0)
    -        scores = DNN.evaluate(X_test, Y_test)
    -        
    -        DNN_keras[i][j] = DNN
    -        
    -        print("Learning rate = ", eta)
    -        print("Lambda = ", lmbd)
    -        print("Test accuracy: %.3f" % scores[1])
    -        print()
    -
    -

    - - -

    # optional
    -# visual representation of grid search
    -# uses seaborn heatmap, could probably do this in matplotlib
    -import seaborn as sns
    -
    -sns.set()
    -
    -train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))
    -test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))
    -
    -for i in range(len(eta_vals)):
    -    for j in range(len(lmbd_vals)):
    -        DNN = DNN_keras[i][j]
    -
    -        train_accuracy[i][j] = DNN.evaluate(X_train, Y_train)[1]
    -        test_accuracy[i][j] = DNN.evaluate(X_test, Y_test)[1]
    -
    -        
    -fig, ax = plt.subplots(figsize = (10, 10))
    -sns.heatmap(train_accuracy, annot=True, ax=ax, cmap="viridis")
    -ax.set_title("Training Accuracy")
    -ax.set_ylabel("$\eta$")
    -ax.set_xlabel("$\lambda$")
    -plt.show()
    -
    -fig, ax = plt.subplots(figsize = (10, 10))
    -sns.heatmap(test_accuracy, annot=True, ax=ax, cmap="viridis")
    -ax.set_title("Test Accuracy")
    -ax.set_ylabel("$\eta$")
    -ax.set_xlabel("$\lambda$")
    -plt.show()
    -
    -

    -

    diff --git a/doc/pub/NeuralNet/html/NeuralNet-bs.html b/doc/pub/NeuralNet/html/NeuralNet-bs.html index da168971c..ed51ffa10 100644 --- a/doc/pub/NeuralNet/html/NeuralNet-bs.html +++ b/doc/pub/NeuralNet/html/NeuralNet-bs.html @@ -110,20 +110,19 @@ Automatically generated HTML file from DocOnce source ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -208,14 +207,16 @@ MathJax.Hub.Config({
  • Improving performance
  • Full object-oriented implementation
  • Evaluate model performance on test data
  • -
  • Adjust hyperparameters (if necessary, network architecture
  • -
  • scikit-learn implementation
  • -
  • Building neural networks in Tensorflow and Keras
  • -
  • Tensorflow
  • -
  • Collect and pre-process data
  • -
  • Using TensorFlow backend
  • -
  • Optimizing and using gradient descent
  • -
  • Using Keras
  • +
  • Adjust hyperparameters
  • +
  • Visualization
  • +
  • scikit-learn implementation
  • +
  • Visualization
  • +
  • Building neural networks in Tensorflow and Keras
  • +
  • Tensorflow
  • +
  • Collect and pre-process data
  • +
  • Using TensorFlow backend
  • +
  • Optimizing and using gradient descent
  • +
  • Using Keras
  • @@ -250,7 +251,7 @@ MathJax.Hub.Config({
    [2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University

    -

    Oct 2, 2018

    +

    Oct 4, 2018


    @@ -274,7 +275,7 @@ MathJax.Hub.Config({

  • 9
  • 10
  • ...
  • -
  • 56
  • +
  • 58
  • »
  • diff --git a/doc/pub/NeuralNet/html/NeuralNet-reveal.html b/doc/pub/NeuralNet/html/NeuralNet-reveal.html index a689e890e..e8b822e47 100644 --- a/doc/pub/NeuralNet/html/NeuralNet-reveal.html +++ b/doc/pub/NeuralNet/html/NeuralNet-reveal.html @@ -148,7 +148,7 @@ MathJax.Hub.Config({
    [2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University

     
    -

    Oct 2, 2018

    +

    Oct 4, 2018


    @@ -387,7 +387,7 @@ $$

     
    This function receives \( x_i \) as inputs. -Here the activation \( z=\sum_{i=1}^n w_ix_i \). +Here the activation \( z=(\sum_{i=1}^n w_ix_i+b_i) \). In an FFNN of such neurons, the inputs \( x_i \) are the outputs of the neurons in the preceding layer. Furthermore, an MLP is fully-connected, which means that each neuron receives a weighted sum @@ -549,7 +549,7 @@ is the bias \( b_i^l \) and activation \( y_i^l \) of node \( i \) in layer \( l

    We have that \( \mathrm{W}_l \) is an \( N_{l-1} \times N_l \) matrix, while \( \hat{b}_l \) and \( \hat{y}_l \) are \( N_l \times 1 \) column vectors. With this notation, the sum becomes a matrix-vector multiplication, and we can write -the equation for the activations of hidden layer 2 as +the equation for the activations of hidden layer 2 (assuming three nodes for simplicity) as

     
    $$ \begin{equation} @@ -761,7 +761,7 @@ As a convention it is normal to call a network with one layer of input units, units and one layer of output units as a two-layer network. A network with two layers of hidden units is called a three-layer network etc etc.

    -For an MLP there is no direct connection between the output nodes/neurons/units and the input nodes/neurons/units. +For an MLP network there is no direct connection between the output nodes/neurons/units and the input nodes/neurons/units. Hereafter we will call the various entities of a layer for nodes. There are also no connections within a single layer. @@ -877,11 +877,10 @@ $$

     

    -With the activation function \( \hat{z}^l \) we can in turn define the +With the activation values \( \hat{z}^l \) we can in turn define the output of layer \( l \) as \( \hat{a}^l = f(\hat{z}^l) \) where \( f \) is our activation function. In the examples here we will use the sigmoid -function discussed in our logistic regression lectures and here as -well. We will also use the same activation function \( f \) for all layers +function discussed in our logistic regression lectures. We will also use the same activation function \( f \) for all layers and their nodes. It means we have

     
    @@ -979,7 +978,7 @@ $$

    This is an important expression. The second term on the right handside -measures how fast the cost is changing as a function of the $j$th +measures how fast the cost function is changing as a function of the $j$th output activation. If, for example, the cost function doesn't depend much on a particular output node \( j \), then \( \delta_j^L \) will be small, which is what we would expect. The first term on the right, measures @@ -991,9 +990,9 @@ Notice that everything in the above equations is easily computed. In particular, we compute \( z_j^L \) while computing the behaviour of the network, and it is only a small additional overhead to compute \( f'(z^L_j) \). The exact form of the derivative with respect to the -outpuwill, of course, depend on the form of the cost function. +output depends on the form of the cost function. However, provided the cost function is known there should be little -trouble computing +trouble in calculating

     
    $$ @@ -1039,6 +1038,8 @@ That is, the error \( \delta_j^L \) is exactly equal to the rate of change of th

    We have now three equations that are essential for the computations of the derivatives of the cost function at the output layer. These equations are needed to start the algorithm and they are + +

    The starting equations.

     
    @@ -1082,7 +1083,7 @@ descent. In this case we say the system learns slowly.

    Another interesting feature is that is when the activation function, -represented by the sigmoid function here, is rather flat when towards +represented by the sigmoid function here, is rather flat when we move towards its end values \( 0 \) and \( 1 \) (see the above Python codes). In these cases, the derivatives of the activation function will also be close to zero, meaning again that the gradients will be small and the @@ -1205,7 +1206,7 @@ $$

    The parameter \( \eta \) is the learning parameter discussed in connection with the gradient descent methods. -Here it is convenient to use stochastic radient descent with mini-batches with an outer loop that steps through multiple epochs of training. +Here it is convenient to use stochastic gradient descent (see the examples below) with mini-batches with an outer loop that steps through multiple epochs of training. @@ -1230,11 +1231,11 @@ calculate.

    For an input \( \boldsymbol{a} \) from the hidden layer, the probability that the input \( \boldsymbol{x} \) -is in class 0 or 1 is just: - +is in class 0 or 1 is just. We let \( \theta \) represent the unknown weights and biases to be adjusted by our equations). The variable \( x \) +represents our activation values \( z \). We have

     
    $$ -P(y = 0 \mid \boldsymbol{x}, \boldsymbol{\theta}) = \frac{1}{1 + \exp (- \boldsymbol{a}^T \boldsymbol{w}_{out})} , +P(y = 0 \mid \boldsymbol{x}, \boldsymbol{\theta}) = \frac{1}{1 + \exp (- \boldsymbol{x}} , $$

     
    @@ -1589,7 +1590,7 @@ The denominator is a normalization factor to ensure the outputs (probabilities) The exponent is just the weighted sum of inputs as before:

     
    -$$ z_j = \sum_{i=1}^n w_ {ij} a_i = \boldsymbol{a}^T \boldsymbol{w}_j .$$ +$$ z_j = \sum_{i=1}^n w_ {ij} a_i+b_j.$$

     

    @@ -1610,7 +1611,7 @@ Adding a bias value to the weighted sum of inputs allows the neural network to r of values. Without it, any input with the value 0 will be mapped to zero (before being passed through the activation). The bias unit has an output of 1, and a weight to each neuron \( j \), \( b_j \):

     
    -$$ z_j = \sum_{i=1}^n w_ {ij} a_i + 1\cdot b_j = \boldsymbol{a}^T \boldsymbol{w}_j + b_j .$$ +$$ z_j = \sum_{i=1}^n w_ {ij} a_i + 1\cdot b_j.$$

     

    @@ -1642,32 +1643,32 @@ output_bias = np.zeros(n_categories) + 0.01

    Denote \( F \) the number of features, \( H \) the number of hidden neurons and \( C \) the number of categories. -For each input image we calculate a weighted sum of input features (pixel values) to each neuron \( j \) in the hidden layer: +For each input image we calculate a weighted sum of input features (pixel values) to each neuron \( j \) in the hidden layer \( l \):

     
    -$$ z_{j}^{h} = \sum_{i=1}^{F} w_{ij}^{h} x_i + b_{j}^{h} = \boldsymbol{x}^T \boldsymbol{w}_{j}^{h} + b_{j}^{h} ,$$ +$$ z_{j}^{l} = \sum_{i=1}^{F} w_{ij}^{l} x_i + b_{j}^{l},$$

     

    this is then passed through our activation function

     
    -$$ a_{j}^{h} = f(z_{j}^{h}) .$$ +$$ a_{j}^{l} = f(z_{j}^{l}) .$$

     

    We calculate a weighted sum of inputs (activations in the hidden layer) to each neuron \( j \) in the output layer:

     
    -$$ z_{j}^{o} = \sum_{i=1}^{H} w_{ij}^{o} a_{i}^{h} + b_{j}^{o} = (\boldsymbol{a}^{h})^T \boldsymbol{w}_{j}^{o} + b_{j}^{o} .$$ +$$ z_{j}^{L} = \sum_{i=1}^{H} w_{ij}^{L} a_{i}^{l} + b_{j}^{L}.$$

     

    Finally we calculate the output of neuron \( j \) in the output layer using the softmax function:

     
    -$$ a_{j}^{o} = \frac{\exp{(z_j^{o})}} -{\sum_{c=0}^{C-1} \exp{(z_c^{o})}} .$$ +$$ a_{j}^{L} = \frac{\exp{(z_j^{L})}} +{\sum_{c=0}^{C-1} \exp{(z_c^{L})}} .$$

     
    @@ -1691,7 +1692,7 @@ for each input image and each hidden neuron. We also add the bias to obtain a matrix of weighted sums to the hidden layer \( Z^{h} \):

     
    -$$ Z^{h} = X W^{h} + B^{h} ,$$ +$$ \hat{z}^{l} = \hat{X} \hat{W}^{l} + \hat{b}^{l} ,$$

     

    @@ -1699,27 +1700,27 @@ meaning the same bias (1D array with size equal number of hidden neurons) is add This is then passed through the activation:

     
    -$$ A^{h} = f(Z^h) .$$ +$$ \hat{a}^{l} = f(\hat{z}^l) .$$

     

    This is fed to the output layer:

     
    -$$ Z^{o} = A^{h} W^{o} + B^{o} .$$ +$$ \hat{z}^{L} = \hat{a}^{L} \hat{W}^{L} + \hat{b}^{L} .$$

     

    Finally we receive our output values for each image and each category by passing it through the softmax function:

     
    -$$ output = softmax (Z^{o}) = (n_{inputs}, n_{categories}) .$$ +$$ output = softmax (\hat{z}^{L}) = (n_{inputs}, n_{categories}) .$$

     

    -

    # setup the feed-forward pass
    +
    # setup the feed-forward pass, subscript h = hidden layer
     
     def sigmoid(x):
         return 1/(1 + np.exp(-x))
    @@ -1892,36 +1893,36 @@ To more efficently train our network these equations are implemented using matri
     The error in the output layer is calculated simply as
     
     

     
    -$$ \Delta_o = \hat{y} - y = (n_{inputs}, n_{categories}) .$$ +$$ \delta_L = \hat{y} - y = (n_{inputs}, n_{categories}) .$$

     

    The gradient for the output weights is calculated as

     
    -$$ \nabla W_{o} = A^T \Delta_o = (n_{hidden}, n_{categories}) ,$$ +$$ \nabla W_{L} = \hat{a}^T \delta_L = (n_{hidden}, n_{categories}) ,$$

     

    -where \( A = (n_{inputs}, n_{hidden}) \). This simply means that we are summing up the gradients for each input. +where \( \hat{a} = (n_{inputs}, n_{hidden}) \). This simply means that we are summing up the gradients for each input. Since we are going backwards we have to transpose the activation matrix.

    The gradient with respect to the output bias is then

     
    -$$ \nabla B_{o} = \sum_{i=1}^{n_{inputs}} \Delta_o = (n_{categories}) .$$ +$$ \nabla \hat{b}_{L} = \sum_{i=1}^{n_{inputs}} \delta_L = (n_{categories}) .$$

     

    The error in the hidden layer is

     
    -$$ \Delta_h = \Delta_o W_{o}^T \circ f'(Z_{h}) = \Delta_o W_{o}^T \circ A_{h} \circ (1 - A_{h}) = (n_{inputs}, n_{hidden}) ,$$ +$$ \Delta_h = \delta_L W_{L}^T \circ f'(z_{h}) = \delta_L W_{L}^T \circ a_{h} \circ (1 - a_{h}) = (n_{inputs}, n_{hidden}) ,$$

     

    -where \( f'(A_{h}) \) is the derivative of the activation in the hidden layer. The matrix products mean +where \( f'(a_{h}) \) is the derivative of the activation in the hidden layer. The matrix products mean that we are summing up the products for each neuron in the output layer. The symbol \( \circ \) denotes the Hadamard product, meaning element-wise multiplication. @@ -1929,11 +1930,11 @@ the Hadamard product, meaning element-wise multiplication. This again gives us the gradients in the hidden layer:

     
    -$$ \nabla W_{h} = X^T \Delta_h = (n_{features}, n_{hidden}) ,$$ +$$ \nabla W_{h} = X^T \delta_h = (n_{features}, n_{hidden}) ,$$

     

     
    -$$ \nabla B_{h} = \sum_{i=1}^{n_{inputs}} \Delta_h = (n_{hidden}) .$$ +$$ \nabla b_{h} = \sum_{i=1}^{n_{inputs}} \delta_h = (n_{hidden}) .$$

     

    @@ -2187,22 +2188,18 @@ test_predict = dnn.predict(X_test)

    -

    Adjust hyperparameters (if necessary, network architecture

    +

    Adjust hyperparameters

    We now perform a grid search to find the optimal hyperparameters for the network. -Note that we are only using 1 layer with 50 neurons, and human performance is estimated to be around \( 98 \% \) (\( 2 \% \) error rate). +Note that we are only using 1 layer with 50 neurons, and human performance is estimated to be around \( 98\% \) (\( 2\% \) error rate).

    eta_vals = np.logspace(-5, 1, 7)
     lmbd_vals = np.logspace(-5, 1, 7)
    -
    -

    - - -

    # store the models for later use
    +# store the models for later use
     DNN_numpy = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)
     
     # grid search
    @@ -2221,12 +2218,17 @@ DNN_numpy = np.zeros((len(eta_vals), print("Accuracy score on test set: ", accuracy_score(Y_test, test_predict))
             print()
     
    +
    + + +
    +

    Visualization

    +

    -

    # optional
    -# visual representation of grid search
    -# uses seaborn heatmap, I believe you can also do this with matplotlib imshow
    +
    # visual representation of grid search
    +# uses seaborn heatmap, you can also do this with matplotlib imshow
     import seaborn as sns
     
     sns.set()
    @@ -2263,19 +2265,26 @@ plt.show()
     
     
     
    -

    scikit-learn implementation

    +

    scikit-learn implementation

    -scikit-learn is a machine learning library for Python. It focuses more on traditional machine learning methods, such as regression, clustering, decision trees, etc. As such, it has only two types of neural networks: Multi Layer Perceptron outputting continuous values, MPLRegressor, and Multi Layer Perceptron outputting labels, MLPClassifier. We will see how simple it is to use these classes. +scikit-learn focuses more +on traditional machine learning methods, such as regression, +clustering, decision trees, etc. As such, it has only two types of +neural networks: Multi Layer Perceptron outputting continuous values, +MPLRegressor, and Multi Layer Perceptron outputting labels, +MLPClassifier. We will see how simple it is to use these classes.

    -scikit-learn implements a few improvements from our neural network, such as early stopping, a varying learning rate, different optimization methods, etc. We would therefore expect a better performance overall. +scikit-learn implements a few improvements from our neural network, +such as early stopping, a varying learning rate, different +optimization methods, etc. We would therefore expect a better +performance overall.

    from sklearn.neural_network import MLPClassifier
    -
     # store models for later use
     DNN_scikit = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)
     
    @@ -2292,6 +2301,11 @@ DNN_scikit = np.zeros((len(eta_vals), print("Accuracy score on test set: ", dnn.score(X_test, Y_test))
             print()
     
    +
    + + +
    +

    Visualization

    @@ -2334,7 +2348,7 @@ plt.show()

    -

    Building neural networks in Tensorflow and Keras

    +

    Building neural networks in Tensorflow and Keras

    Now we want to build on the experience gained from our neural network implementation in NumPy and scikit-learn @@ -2349,7 +2363,7 @@ NumPy arrays.

    -

    Tensorflow

    +

    Tensorflow

    Tensorflow is an open source library machine learning library @@ -2395,7 +2409,7 @@ and/or if you use anaconda, just write (or install from the graphical use

    -

    Collect and pre-process data

    +

    Collect and pre-process data

    @@ -2462,7 +2476,7 @@ X_train, X_test, Y_train, Y_test = train_test_split(inputs, labels, train_size=t

    -

    Using TensorFlow backend

    +

    Using TensorFlow backend

    1. Define model and architecture
    2. @@ -2607,7 +2621,7 @@ X_train, X_test, Y_train, Y_test = train_test_split(inputs, labels, train_size=t
      -

      Optimizing and using gradient descent

      +

      Optimizing and using gradient descent

      @@ -2617,7 +2631,6 @@ batch_size = 100 n_neurons_layer1 = 100 n_neurons_layer2 = 50 n_categories = 10 - eta_vals = np.logspace(-5, 1, 7) lmbd_vals = np.logspace(-5, 1, 7)

    @@ -2639,7 +2652,6 @@ lmbd_vals = np.logspace(-5, print("Lambda = ", lmbd) print("Test accuracy: %.3f" % DNN.test_accuracy) print() -

    @@ -2688,7 +2700,7 @@ writer.add_graph(tf.get_default_graph())

    -

    Using Keras

    +

    Using Keras

    Keras is a high level neural network diff --git a/doc/pub/NeuralNet/html/NeuralNet-solarized.html b/doc/pub/NeuralNet/html/NeuralNet-solarized.html index 34459708f..ce4283891 100644 --- a/doc/pub/NeuralNet/html/NeuralNet-solarized.html +++ b/doc/pub/NeuralNet/html/NeuralNet-solarized.html @@ -130,20 +130,19 @@ div { text-align: justify; text-justify: inter-word; } ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -185,7 +184,7 @@ MathJax.Hub.Config({

    [2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University

    -

    Oct 2, 2018

    +

    Oct 4, 2018












    @@ -413,7 +412,7 @@ $$ $$ This function receives \( x_i \) as inputs. -Here the activation \( z=\sum_{i=1}^n w_ix_i \). +Here the activation \( z=(\sum_{i=1}^n w_ix_i+b_i) \). In an FFNN of such neurons, the inputs \( x_i \) are the outputs of the neurons in the preceding layer. Furthermore, an MLP is fully-connected, which means that each neuron receives a weighted sum @@ -560,7 +559,7 @@ is the bias \( b_i^l \) and activation \( y_i^l \) of node \( i \) in layer \( l

    We have that \( \mathrm{W}_l \) is an \( N_{l-1} \times N_l \) matrix, while \( \hat{b}_l \) and \( \hat{y}_l \) are \( N_l \times 1 \) column vectors. With this notation, the sum becomes a matrix-vector multiplication, and we can write -the equation for the activations of hidden layer 2 as +the equation for the activations of hidden layer 2 (assuming three nodes for simplicity) as $$ \begin{equation} \hat{y}_2 = f_2(\mathrm{W}_2 \hat{y}_{1} + \hat{b}_{2}) = @@ -753,7 +752,7 @@ As a convention it is normal to call a network with one layer of input units, units and one layer of output units as a two-layer network. A network with two layers of hidden units is called a three-layer network etc etc.

    -For an MLP there is no direct connection between the output nodes/neurons/units and the input nodes/neurons/units. +For an MLP network there is no direct connection between the output nodes/neurons/units and the input nodes/neurons/units. Hereafter we will call the various entities of a layer for nodes. There are also no connections within a single layer. @@ -863,11 +862,10 @@ $$ $$

    -With the activation function \( \hat{z}^l \) we can in turn define the +With the activation values \( \hat{z}^l \) we can in turn define the output of layer \( l \) as \( \hat{a}^l = f(\hat{z}^l) \) where \( f \) is our activation function. In the examples here we will use the sigmoid -function discussed in our logistic regression lectures and here as -well. We will also use the same activation function \( f \) for all layers +function discussed in our logistic regression lectures. We will also use the same activation function \( f \) for all layers and their nodes. It means we have $$ @@ -945,7 +943,7 @@ $$

    This is an important expression. The second term on the right handside -measures how fast the cost is changing as a function of the $j$th +measures how fast the cost function is changing as a function of the $j$th output activation. If, for example, the cost function doesn't depend much on a particular output node \( j \), then \( \delta_j^L \) will be small, which is what we would expect. The first term on the right, measures @@ -957,9 +955,9 @@ Notice that everything in the above equations is easily computed. In particular, we compute \( z_j^L \) while computing the behaviour of the network, and it is only a small additional overhead to compute \( f'(z^L_j) \). The exact form of the derivative with respect to the -outpuwill, of course, depend on the form of the cost function. +output depends on the form of the cost function. However, provided the cost function is known there should be little -trouble computing +trouble in calculating $$ \frac{\partial {\cal C}}{\partial (a_j^L)} @@ -995,6 +993,8 @@ That is, the error \( \delta_j^L \) is exactly equal to the rate of change of th

    We have now three equations that are essential for the computations of the derivatives of the cost function at the output layer. These equations are needed to start the algorithm and they are + +

    The starting equations.

    @@ -1035,7 +1035,7 @@ descent. In this case we say the system learns slowly.

    Another interesting feature is that is when the activation function, -represented by the sigmoid function here, is rather flat when towards +represented by the sigmoid function here, is rather flat when we move towards its end values \( 0 \) and \( 1 \) (see the above Python codes). In these cases, the derivatives of the activation function will also be close to zero, meaning again that the gradients will be small and the @@ -1148,7 +1148,7 @@ $$

    The parameter \( \eta \) is the learning parameter discussed in connection with the gradient descent methods. -Here it is convenient to use stochastic radient descent with mini-batches with an outer loop that steps through multiple epochs of training. +Here it is convenient to use stochastic gradient descent (see the examples below) with mini-batches with an outer loop that steps through multiple epochs of training.

    @@ -1173,10 +1173,10 @@ calculate.

    For an input \( \boldsymbol{a} \) from the hidden layer, the probability that the input \( \boldsymbol{x} \) -is in class 0 or 1 is just: - +is in class 0 or 1 is just. We let \( \theta \) represent the unknown weights and biases to be adjusted by our equations). The variable \( x \) +represents our activation values \( z \). We have $$ -P(y = 0 \mid \boldsymbol{x}, \boldsymbol{\theta}) = \frac{1}{1 + \exp (- \boldsymbol{a}^T \boldsymbol{w}_{out})} , +P(y = 0 \mid \boldsymbol{x}, \boldsymbol{\theta}) = \frac{1}{1 + \exp (- \boldsymbol{x}} , $$ and @@ -1494,7 +1494,7 @@ i.e. each neuron \( j \) outputs the probability of being in class \( j \) given The denominator is a normalization factor to ensure the outputs (probabilities) sum up to 1. The exponent is just the weighted sum of inputs as before: -$$ z_j = \sum_{i=1}^n w_ {ij} a_i = \boldsymbol{a}^T \boldsymbol{w}_j .$$ +$$ z_j = \sum_{i=1}^n w_ {ij} a_i+b_j.$$

    Since each neuron in the output layer is connected to the 50 inputs from the hidden layer we have 50x10 = 500 @@ -1513,7 +1513,7 @@ or normal distribution. Setting all weights to zero means all neurons give the s Adding a bias value to the weighted sum of inputs allows the neural network to represent a greater range of values. Without it, any input with the value 0 will be mapped to zero (before being passed through the activation). The bias unit has an output of 1, and a weight to each neuron \( j \), \( b_j \): -$$ z_j = \sum_{i=1}^n w_ {ij} a_i + 1\cdot b_j = \boldsymbol{a}^T \boldsymbol{w}_j + b_j .$$ +$$ z_j = \sum_{i=1}^n w_ {ij} a_i + 1\cdot b_j.$$

    The bias weights \( \boldsymbol{b} \) are often initialized to zero, but a small value like \( 0.01 \) ensures all neurons have some output which can be backpropagated in the first training cycle. @@ -1543,25 +1543,25 @@ output_bias = np.zeros(n_categories) + 0.01

    Denote \( F \) the number of features, \( H \) the number of hidden neurons and \( C \) the number of categories. -For each input image we calculate a weighted sum of input features (pixel values) to each neuron \( j \) in the hidden layer: +For each input image we calculate a weighted sum of input features (pixel values) to each neuron \( j \) in the hidden layer \( l \): -$$ z_{j}^{h} = \sum_{i=1}^{F} w_{ij}^{h} x_i + b_{j}^{h} = \boldsymbol{x}^T \boldsymbol{w}_{j}^{h} + b_{j}^{h} ,$$ +$$ z_{j}^{l} = \sum_{i=1}^{F} w_{ij}^{l} x_i + b_{j}^{l},$$

    this is then passed through our activation function -$$ a_{j}^{h} = f(z_{j}^{h}) .$$ +$$ a_{j}^{l} = f(z_{j}^{l}) .$$

    We calculate a weighted sum of inputs (activations in the hidden layer) to each neuron \( j \) in the output layer: -$$ z_{j}^{o} = \sum_{i=1}^{H} w_{ij}^{o} a_{i}^{h} + b_{j}^{o} = (\boldsymbol{a}^{h})^T \boldsymbol{w}_{j}^{o} + b_{j}^{o} .$$ +$$ z_{j}^{L} = \sum_{i=1}^{H} w_{ij}^{L} a_{i}^{l} + b_{j}^{L}.$$

    Finally we calculate the output of neuron \( j \) in the output layer using the softmax function: -$$ a_{j}^{o} = \frac{\exp{(z_j^{o})}} -{\sum_{c=0}^{C-1} \exp{(z_c^{o})}} .$$ +$$ a_{j}^{L} = \frac{\exp{(z_j^{L})}} +{\sum_{c=0}^{C-1} \exp{(z_c^{L})}} .$$

    @@ -1581,28 +1581,28 @@ and obtain a matrix that holds the weighted sum of inputs to the hidden layer for each input image and each hidden neuron. We also add the bias to obtain a matrix of weighted sums to the hidden layer \( Z^{h} \): -$$ Z^{h} = X W^{h} + B^{h} ,$$ +$$ \hat{z}^{l} = \hat{X} \hat{W}^{l} + \hat{b}^{l} ,$$

    meaning the same bias (1D array with size equal number of hidden neurons) is added to each input image. This is then passed through the activation: -$$ A^{h} = f(Z^h) .$$ +$$ \hat{a}^{l} = f(\hat{z}^l) .$$

    This is fed to the output layer: -$$ Z^{o} = A^{h} W^{o} + B^{o} .$$ +$$ \hat{z}^{L} = \hat{a}^{L} \hat{W}^{L} + \hat{b}^{L} .$$

    Finally we receive our output values for each image and each category by passing it through the softmax function: -$$ output = softmax (Z^{o}) = (n_{inputs}, n_{categories}) .$$ +$$ output = softmax (\hat{z}^{L}) = (n_{inputs}, n_{categories}) .$$

    -

    # setup the feed-forward pass
    +
    # setup the feed-forward pass, subscript h = hidden layer
     
     def sigmoid(x):
         return 1/(1 + np.exp(-x))
    @@ -1759,38 +1759,38 @@ calculate the gradient efficently.
     To more efficently train our network these equations are implemented using matrix operations.  
     The error in the output layer is calculated simply as  
     
    -$$ \Delta_o = \hat{y} - y = (n_{inputs}, n_{categories}) .$$
    +$$ \delta_L = \hat{y} - y = (n_{inputs}, n_{categories}) .$$
     
     

    The gradient for the output weights is calculated as -$$ \nabla W_{o} = A^T \Delta_o = (n_{hidden}, n_{categories}) ,$$ +$$ \nabla W_{L} = \hat{a}^T \delta_L = (n_{hidden}, n_{categories}) ,$$

    -where \( A = (n_{inputs}, n_{hidden}) \). This simply means that we are summing up the gradients for each input. +where \( \hat{a} = (n_{inputs}, n_{hidden}) \). This simply means that we are summing up the gradients for each input. Since we are going backwards we have to transpose the activation matrix.

    The gradient with respect to the output bias is then -$$ \nabla B_{o} = \sum_{i=1}^{n_{inputs}} \Delta_o = (n_{categories}) .$$ +$$ \nabla \hat{b}_{L} = \sum_{i=1}^{n_{inputs}} \delta_L = (n_{categories}) .$$

    The error in the hidden layer is -$$ \Delta_h = \Delta_o W_{o}^T \circ f'(Z_{h}) = \Delta_o W_{o}^T \circ A_{h} \circ (1 - A_{h}) = (n_{inputs}, n_{hidden}) ,$$ +$$ \Delta_h = \delta_L W_{L}^T \circ f'(z_{h}) = \delta_L W_{L}^T \circ a_{h} \circ (1 - a_{h}) = (n_{inputs}, n_{hidden}) ,$$

    -where \( f'(A_{h}) \) is the derivative of the activation in the hidden layer. The matrix products mean +where \( f'(a_{h}) \) is the derivative of the activation in the hidden layer. The matrix products mean that we are summing up the products for each neuron in the output layer. The symbol \( \circ \) denotes the Hadamard product, meaning element-wise multiplication.

    This again gives us the gradients in the hidden layer: -$$ \nabla W_{h} = X^T \Delta_h = (n_{features}, n_{hidden}) ,$$ +$$ \nabla W_{h} = X^T \delta_h = (n_{features}, n_{hidden}) ,$$ -$$ \nabla B_{h} = \sum_{i=1}^{n_{inputs}} \Delta_h = (n_{hidden}) .$$ +$$ \nabla b_{h} = \sum_{i=1}^{n_{inputs}} \delta_h = (n_{hidden}) .$$

    @@ -2038,22 +2038,18 @@ test_predict = dnn.predict(X_test)











    -

    Adjust hyperparameters (if necessary, network architecture

    +

    Adjust hyperparameters

    We now perform a grid search to find the optimal hyperparameters for the network. -Note that we are only using 1 layer with 50 neurons, and human performance is estimated to be around \( 98 \% \) (\( 2 \% \) error rate). +Note that we are only using 1 layer with 50 neurons, and human performance is estimated to be around \( 98\% \) (\( 2\% \) error rate).

    eta_vals = np.logspace(-5, 1, 7)
     lmbd_vals = np.logspace(-5, 1, 7)
    -
    -

    - - -

    # store the models for later use
    +# store the models for later use
     DNN_numpy = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)
     
     # grid search
    @@ -2072,12 +2068,16 @@ DNN_numpy = np.zeros((len(eta_vals), print("Accuracy score on test set: ", accuracy_score(Y_test, test_predict))
             print()
     
    +

    +









    + +

    Visualization

    +

    -

    # optional
    -# visual representation of grid search
    -# uses seaborn heatmap, I believe you can also do this with matplotlib imshow
    +
    # visual representation of grid search
    +# uses seaborn heatmap, you can also do this with matplotlib imshow
     import seaborn as sns
     
     sns.set()
    @@ -2113,19 +2113,26 @@ plt.show()
     











    -

    scikit-learn implementation

    +

    scikit-learn implementation

    -scikit-learn is a machine learning library for Python. It focuses more on traditional machine learning methods, such as regression, clustering, decision trees, etc. As such, it has only two types of neural networks: Multi Layer Perceptron outputting continuous values, MPLRegressor, and Multi Layer Perceptron outputting labels, MLPClassifier. We will see how simple it is to use these classes. +scikit-learn focuses more +on traditional machine learning methods, such as regression, +clustering, decision trees, etc. As such, it has only two types of +neural networks: Multi Layer Perceptron outputting continuous values, +MPLRegressor, and Multi Layer Perceptron outputting labels, +MLPClassifier. We will see how simple it is to use these classes.

    -scikit-learn implements a few improvements from our neural network, such as early stopping, a varying learning rate, different optimization methods, etc. We would therefore expect a better performance overall. +scikit-learn implements a few improvements from our neural network, +such as early stopping, a varying learning rate, different +optimization methods, etc. We would therefore expect a better +performance overall.

    from sklearn.neural_network import MLPClassifier
    -
     # store models for later use
     DNN_scikit = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)
     
    @@ -2143,6 +2150,10 @@ DNN_scikit = np.zeros((len(eta_vals), print()
     

    +









    + +

    Visualization

    +

    # optional
    @@ -2183,7 +2194,7 @@ plt.show()
     











    -

    Building neural networks in Tensorflow and Keras

    +

    Building neural networks in Tensorflow and Keras

    Now we want to build on the experience gained from our neural network implementation in NumPy and scikit-learn @@ -2198,7 +2209,7 @@ NumPy arrays.











    -

    Tensorflow

    +

    Tensorflow

    Tensorflow is an open source library machine learning library @@ -2243,7 +2254,7 @@ and/or if you use anaconda, just write (or install from the graphical use











    -

    Collect and pre-process data

    +

    Collect and pre-process data

    @@ -2309,7 +2320,7 @@ X_train, X_test, Y_train, Y_test = train_test_split(inputs, labels, train_size=t











    -

    Using TensorFlow backend

    +

    Using TensorFlow backend

    1. Define model and architecture
    2. @@ -2454,7 +2465,7 @@ X_train, X_test, Y_train, Y_test = train_test_split(inputs, labels, train_size=t











      -

      Optimizing and using gradient descent

      +

      Optimizing and using gradient descent

      @@ -2464,7 +2475,6 @@ batch_size = 100 n_neurons_layer1 = 100 n_neurons_layer2 = 50 n_categories = 10 - eta_vals = np.logspace(-5, 1, 7) lmbd_vals = np.logspace(-5, 1, 7)

    @@ -2486,7 +2496,6 @@ lmbd_vals = np.logspace(-5, print("Lambda = ", lmbd) print("Test accuracy: %.3f" % DNN.test_accuracy) print() -

    @@ -2534,7 +2543,7 @@ writer.add_graph(tf.get_default_graph())











    -

    Using Keras

    +

    Using Keras

    Keras is a high level neural network diff --git a/doc/pub/NeuralNet/html/NeuralNet.html b/doc/pub/NeuralNet/html/NeuralNet.html index cfb13c6ce..5a2aaa6cc 100644 --- a/doc/pub/NeuralNet/html/NeuralNet.html +++ b/doc/pub/NeuralNet/html/NeuralNet.html @@ -135,20 +135,19 @@ div { text-align: justify; text-justify: inter-word; } ('Improving performance', 2, None, '___sec44'), ('Full object-oriented implementation', 2, None, '___sec45'), ('Evaluate model performance on test data', 2, None, '___sec46'), - ('Adjust hyperparameters (if necessary, network architecture', - 2, - None, - '___sec47'), - ('scikit-learn implementation', 2, None, '___sec48'), + ('Adjust hyperparameters', 2, None, '___sec47'), + ('Visualization', 2, None, '___sec48'), + ('scikit-learn implementation', 2, None, '___sec49'), + ('Visualization', 2, None, '___sec50'), ('Building neural networks in Tensorflow and Keras', 2, None, - '___sec49'), - ('Tensorflow', 2, None, '___sec50'), - ('Collect and pre-process data', 2, None, '___sec51'), - ('Using TensorFlow backend', 2, None, '___sec52'), - ('Optimizing and using gradient descent', 2, None, '___sec53'), - ('Using Keras', 2, None, '___sec54')]} + '___sec51'), + ('Tensorflow', 2, None, '___sec52'), + ('Collect and pre-process data', 2, None, '___sec53'), + ('Using TensorFlow backend', 2, None, '___sec54'), + ('Optimizing and using gradient descent', 2, None, '___sec55'), + ('Using Keras', 2, None, '___sec56')]} end of tocinfo --> @@ -190,7 +189,7 @@ MathJax.Hub.Config({

    [2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University

    -

    Oct 2, 2018

    +

    Oct 4, 2018












    @@ -418,7 +417,7 @@ $$ $$ This function receives \( x_i \) as inputs. -Here the activation \( z=\sum_{i=1}^n w_ix_i \). +Here the activation \( z=(\sum_{i=1}^n w_ix_i+b_i) \). In an FFNN of such neurons, the inputs \( x_i \) are the outputs of the neurons in the preceding layer. Furthermore, an MLP is fully-connected, which means that each neuron receives a weighted sum @@ -565,7 +564,7 @@ is the bias \( b_i^l \) and activation \( y_i^l \) of node \( i \) in layer \( l

    We have that \( \mathrm{W}_l \) is an \( N_{l-1} \times N_l \) matrix, while \( \hat{b}_l \) and \( \hat{y}_l \) are \( N_l \times 1 \) column vectors. With this notation, the sum becomes a matrix-vector multiplication, and we can write -the equation for the activations of hidden layer 2 as +the equation for the activations of hidden layer 2 (assuming three nodes for simplicity) as $$ \begin{equation} \hat{y}_2 = f_2(\mathrm{W}_2 \hat{y}_{1} + \hat{b}_{2}) = @@ -758,7 +757,7 @@ As a convention it is normal to call a network with one layer of input units, units and one layer of output units as a two-layer network. A network with two layers of hidden units is called a three-layer network etc etc.

    -For an MLP there is no direct connection between the output nodes/neurons/units and the input nodes/neurons/units. +For an MLP network there is no direct connection between the output nodes/neurons/units and the input nodes/neurons/units. Hereafter we will call the various entities of a layer for nodes. There are also no connections within a single layer. @@ -868,11 +867,10 @@ $$ $$

    -With the activation function \( \hat{z}^l \) we can in turn define the +With the activation values \( \hat{z}^l \) we can in turn define the output of layer \( l \) as \( \hat{a}^l = f(\hat{z}^l) \) where \( f \) is our activation function. In the examples here we will use the sigmoid -function discussed in our logistic regression lectures and here as -well. We will also use the same activation function \( f \) for all layers +function discussed in our logistic regression lectures. We will also use the same activation function \( f \) for all layers and their nodes. It means we have $$ @@ -950,7 +948,7 @@ $$

    This is an important expression. The second term on the right handside -measures how fast the cost is changing as a function of the $j$th +measures how fast the cost function is changing as a function of the $j$th output activation. If, for example, the cost function doesn't depend much on a particular output node \( j \), then \( \delta_j^L \) will be small, which is what we would expect. The first term on the right, measures @@ -962,9 +960,9 @@ Notice that everything in the above equations is easily computed. In particular, we compute \( z_j^L \) while computing the behaviour of the network, and it is only a small additional overhead to compute \( f'(z^L_j) \). The exact form of the derivative with respect to the -outpuwill, of course, depend on the form of the cost function. +output depends on the form of the cost function. However, provided the cost function is known there should be little -trouble computing +trouble in calculating $$ \frac{\partial {\cal C}}{\partial (a_j^L)} @@ -1000,6 +998,8 @@ That is, the error \( \delta_j^L \) is exactly equal to the rate of change of th

    We have now three equations that are essential for the computations of the derivatives of the cost function at the output layer. These equations are needed to start the algorithm and they are + +

    The starting equations.

    @@ -1040,7 +1040,7 @@ descent. In this case we say the system learns slowly.

    Another interesting feature is that is when the activation function, -represented by the sigmoid function here, is rather flat when towards +represented by the sigmoid function here, is rather flat when we move towards its end values \( 0 \) and \( 1 \) (see the above Python codes). In these cases, the derivatives of the activation function will also be close to zero, meaning again that the gradients will be small and the @@ -1153,7 +1153,7 @@ $$

    The parameter \( \eta \) is the learning parameter discussed in connection with the gradient descent methods. -Here it is convenient to use stochastic radient descent with mini-batches with an outer loop that steps through multiple epochs of training. +Here it is convenient to use stochastic gradient descent (see the examples below) with mini-batches with an outer loop that steps through multiple epochs of training.

    @@ -1178,10 +1178,10 @@ calculate.

    For an input \( \boldsymbol{a} \) from the hidden layer, the probability that the input \( \boldsymbol{x} \) -is in class 0 or 1 is just: - +is in class 0 or 1 is just. We let \( \theta \) represent the unknown weights and biases to be adjusted by our equations). The variable \( x \) +represents our activation values \( z \). We have $$ -P(y = 0 \mid \boldsymbol{x}, \boldsymbol{\theta}) = \frac{1}{1 + \exp (- \boldsymbol{a}^T \boldsymbol{w}_{out})} , +P(y = 0 \mid \boldsymbol{x}, \boldsymbol{\theta}) = \frac{1}{1 + \exp (- \boldsymbol{x}} , $$ and @@ -1499,7 +1499,7 @@ i.e. each neuron \( j \) outputs the probability of being in class \( j \) given The denominator is a normalization factor to ensure the outputs (probabilities) sum up to 1. The exponent is just the weighted sum of inputs as before: -$$ z_j = \sum_{i=1}^n w_ {ij} a_i = \boldsymbol{a}^T \boldsymbol{w}_j .$$ +$$ z_j = \sum_{i=1}^n w_ {ij} a_i+b_j.$$

    Since each neuron in the output layer is connected to the 50 inputs from the hidden layer we have 50x10 = 500 @@ -1518,7 +1518,7 @@ or normal distribution. Setting all weights to zero means all neurons give the s Adding a bias value to the weighted sum of inputs allows the neural network to represent a greater range of values. Without it, any input with the value 0 will be mapped to zero (before being passed through the activation). The bias unit has an output of 1, and a weight to each neuron \( j \), \( b_j \): -$$ z_j = \sum_{i=1}^n w_ {ij} a_i + 1\cdot b_j = \boldsymbol{a}^T \boldsymbol{w}_j + b_j .$$ +$$ z_j = \sum_{i=1}^n w_ {ij} a_i + 1\cdot b_j.$$

    The bias weights \( \boldsymbol{b} \) are often initialized to zero, but a small value like \( 0.01 \) ensures all neurons have some output which can be backpropagated in the first training cycle. @@ -1548,25 +1548,25 @@ output_bias = np Denote \( F \) the number of features, \( H \) the number of hidden neurons and \( C \) the number of categories. -For each input image we calculate a weighted sum of input features (pixel values) to each neuron \( j \) in the hidden layer: +For each input image we calculate a weighted sum of input features (pixel values) to each neuron \( j \) in the hidden layer \( l \): -$$ z_{j}^{h} = \sum_{i=1}^{F} w_{ij}^{h} x_i + b_{j}^{h} = \boldsymbol{x}^T \boldsymbol{w}_{j}^{h} + b_{j}^{h} ,$$ +$$ z_{j}^{l} = \sum_{i=1}^{F} w_{ij}^{l} x_i + b_{j}^{l},$$

    this is then passed through our activation function -$$ a_{j}^{h} = f(z_{j}^{h}) .$$ +$$ a_{j}^{l} = f(z_{j}^{l}) .$$

    We calculate a weighted sum of inputs (activations in the hidden layer) to each neuron \( j \) in the output layer: -$$ z_{j}^{o} = \sum_{i=1}^{H} w_{ij}^{o} a_{i}^{h} + b_{j}^{o} = (\boldsymbol{a}^{h})^T \boldsymbol{w}_{j}^{o} + b_{j}^{o} .$$ +$$ z_{j}^{L} = \sum_{i=1}^{H} w_{ij}^{L} a_{i}^{l} + b_{j}^{L}.$$

    Finally we calculate the output of neuron \( j \) in the output layer using the softmax function: -$$ a_{j}^{o} = \frac{\exp{(z_j^{o})}} -{\sum_{c=0}^{C-1} \exp{(z_c^{o})}} .$$ +$$ a_{j}^{L} = \frac{\exp{(z_j^{L})}} +{\sum_{c=0}^{C-1} \exp{(z_c^{L})}} .$$

    @@ -1586,28 +1586,28 @@ and obtain a matrix that holds the weighted sum of inputs to the hidden layer for each input image and each hidden neuron. We also add the bias to obtain a matrix of weighted sums to the hidden layer \( Z^{h} \): -$$ Z^{h} = X W^{h} + B^{h} ,$$ +$$ \hat{z}^{l} = \hat{X} \hat{W}^{l} + \hat{b}^{l} ,$$

    meaning the same bias (1D array with size equal number of hidden neurons) is added to each input image. This is then passed through the activation: -$$ A^{h} = f(Z^h) .$$ +$$ \hat{a}^{l} = f(\hat{z}^l) .$$

    This is fed to the output layer: -$$ Z^{o} = A^{h} W^{o} + B^{o} .$$ +$$ \hat{z}^{L} = \hat{a}^{L} \hat{W}^{L} + \hat{b}^{L} .$$

    Finally we receive our output values for each image and each category by passing it through the softmax function: -$$ output = softmax (Z^{o}) = (n_{inputs}, n_{categories}) .$$ +$$ output = softmax (\hat{z}^{L}) = (n_{inputs}, n_{categories}) .$$

    -

    # setup the feed-forward pass
    +
    # setup the feed-forward pass, subscript h = hidden layer
     
     def sigmoid(x):
         return 1/(1 + np.exp(-x))
    @@ -1764,38 +1764,38 @@ calculate the gradient efficently.
     To more efficently train our network these equations are implemented using matrix operations.  
     The error in the output layer is calculated simply as  
     
    -$$ \Delta_o = \hat{y} - y = (n_{inputs}, n_{categories}) .$$
    +$$ \delta_L = \hat{y} - y = (n_{inputs}, n_{categories}) .$$
     
     

    The gradient for the output weights is calculated as -$$ \nabla W_{o} = A^T \Delta_o = (n_{hidden}, n_{categories}) ,$$ +$$ \nabla W_{L} = \hat{a}^T \delta_L = (n_{hidden}, n_{categories}) ,$$

    -where \( A = (n_{inputs}, n_{hidden}) \). This simply means that we are summing up the gradients for each input. +where \( \hat{a} = (n_{inputs}, n_{hidden}) \). This simply means that we are summing up the gradients for each input. Since we are going backwards we have to transpose the activation matrix.

    The gradient with respect to the output bias is then -$$ \nabla B_{o} = \sum_{i=1}^{n_{inputs}} \Delta_o = (n_{categories}) .$$ +$$ \nabla \hat{b}_{L} = \sum_{i=1}^{n_{inputs}} \delta_L = (n_{categories}) .$$

    The error in the hidden layer is -$$ \Delta_h = \Delta_o W_{o}^T \circ f'(Z_{h}) = \Delta_o W_{o}^T \circ A_{h} \circ (1 - A_{h}) = (n_{inputs}, n_{hidden}) ,$$ +$$ \Delta_h = \delta_L W_{L}^T \circ f'(z_{h}) = \delta_L W_{L}^T \circ a_{h} \circ (1 - a_{h}) = (n_{inputs}, n_{hidden}) ,$$

    -where \( f'(A_{h}) \) is the derivative of the activation in the hidden layer. The matrix products mean +where \( f'(a_{h}) \) is the derivative of the activation in the hidden layer. The matrix products mean that we are summing up the products for each neuron in the output layer. The symbol \( \circ \) denotes the Hadamard product, meaning element-wise multiplication.

    This again gives us the gradients in the hidden layer: -$$ \nabla W_{h} = X^T \Delta_h = (n_{features}, n_{hidden}) ,$$ +$$ \nabla W_{h} = X^T \delta_h = (n_{features}, n_{hidden}) ,$$ -$$ \nabla B_{h} = \sum_{i=1}^{n_{inputs}} \Delta_h = (n_{hidden}) .$$ +$$ \nabla b_{h} = \sum_{i=1}^{n_{inputs}} \delta_h = (n_{hidden}) .$$

    @@ -2043,22 +2043,18 @@ test_predict = dnnAdjust hyperparameters (if necessary, network architecture +

    Adjust hyperparameters

    We now perform a grid search to find the optimal hyperparameters for the network. -Note that we are only using 1 layer with 50 neurons, and human performance is estimated to be around \( 98 \% \) (\( 2 \% \) error rate). +Note that we are only using 1 layer with 50 neurons, and human performance is estimated to be around \( 98\% \) (\( 2\% \) error rate).

    eta_vals = np.logspace(-5, 1, 7)
     lmbd_vals = np.logspace(-5, 1, 7)
    -
    -

    - - -

    # store the models for later use
    +# store the models for later use
     DNN_numpy = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)
     
     # grid search
    @@ -2077,12 +2073,16 @@ DNN_numpy = np.
             print("Accuracy score on test set: ", accuracy_score(Y_test, test_predict))
             print()
     
    +

    +









    + +

    Visualization

    +

    -

    # optional
    -# visual representation of grid search
    -# uses seaborn heatmap, I believe you can also do this with matplotlib imshow
    +
    # visual representation of grid search
    +# uses seaborn heatmap, you can also do this with matplotlib imshow
     import seaborn as sns
     
     sns.set()
    @@ -2118,19 +2118,26 @@ plt.show()
     











    -

    scikit-learn implementation

    +

    scikit-learn implementation

    -scikit-learn is a machine learning library for Python. It focuses more on traditional machine learning methods, such as regression, clustering, decision trees, etc. As such, it has only two types of neural networks: Multi Layer Perceptron outputting continuous values, MPLRegressor, and Multi Layer Perceptron outputting labels, MLPClassifier. We will see how simple it is to use these classes. +scikit-learn focuses more +on traditional machine learning methods, such as regression, +clustering, decision trees, etc. As such, it has only two types of +neural networks: Multi Layer Perceptron outputting continuous values, +MPLRegressor, and Multi Layer Perceptron outputting labels, +MLPClassifier. We will see how simple it is to use these classes.

    -scikit-learn implements a few improvements from our neural network, such as early stopping, a varying learning rate, different optimization methods, etc. We would therefore expect a better performance overall. +scikit-learn implements a few improvements from our neural network, +such as early stopping, a varying learning rate, different +optimization methods, etc. We would therefore expect a better +performance overall.

    from sklearn.neural_network import MLPClassifier
    -
     # store models for later use
     DNN_scikit = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)
     
    @@ -2148,6 +2155,10 @@ DNN_scikit = np
             print()
     

    +









    + +

    Visualization

    +

    # optional
    @@ -2188,7 +2199,7 @@ plt.show()
     











    -

    Building neural networks in Tensorflow and Keras

    +

    Building neural networks in Tensorflow and Keras

    Now we want to build on the experience gained from our neural network implementation in NumPy and scikit-learn @@ -2203,7 +2214,7 @@ NumPy arrays.











    -

    Tensorflow

    +

    Tensorflow

    Tensorflow is an open source library machine learning library @@ -2248,7 +2259,7 @@ and/or if you use anaconda, just write (or install from the graphical use











    -

    Collect and pre-process data

    +

    Collect and pre-process data

    @@ -2314,7 +2325,7 @@ X_train, X_test, Y_train, Y_test = train_tes











    -

    Using TensorFlow backend

    +

    Using TensorFlow backend

    1. Define model and architecture
    2. @@ -2459,7 +2470,7 @@ X_train, X_test, Y_train, Y_test = train_tes











      -

      Optimizing and using gradient descent

      +

      Optimizing and using gradient descent

      @@ -2469,7 +2480,6 @@ batch_size = 10 n_neurons_layer1 = 100 n_neurons_layer2 = 50 n_categories = 10 - eta_vals = np.logspace(-5, 1, 7) lmbd_vals = np.logspace(-5, 1, 7)

    @@ -2491,7 +2501,6 @@ lmbd_vals = np. print("Lambda = ", lmbd) print("Test accuracy: %.3f" % DNN.test_accuracy) print() -

    @@ -2539,7 +2548,7 @@ writer.add_graph(tfUsing Keras +

    Using Keras

    Keras is a high level neural network diff --git a/doc/pub/NeuralNet/ipynb/NeuralNet.ipynb b/doc/pub/NeuralNet/ipynb/NeuralNet.ipynb index fd6d5ee07..6d7b7115e 100644 --- a/doc/pub/NeuralNet/ipynb/NeuralNet.ipynb +++ b/doc/pub/NeuralNet/ipynb/NeuralNet.ipynb @@ -10,7 +10,7 @@ " \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 2, 2018**\n", + "Date: **Oct 4, 2018**\n", "\n", "Copyright 1999-2018, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license\n", "\n", @@ -222,7 +222,7 @@ "metadata": {}, "source": [ "This function receives $x_i$ as inputs.\n", - "Here the activation $z=\\sum_{i=1}^n w_ix_i$. \n", + "Here the activation $z=(\\sum_{i=1}^n w_ix_i+b_i)$. \n", "In an FFNN of such neurons, the *inputs* $x_i$ are the *outputs* of\n", "the neurons in the preceding layer. Furthermore, an MLP is\n", "fully-connected, which means that each neuron receives a weighted sum\n", @@ -460,7 +460,7 @@ "\n", "We have that $\\mathrm{W}_l$ is an $N_{l-1} \\times N_l$ matrix, while $\\hat{b}_l$ and $\\hat{y}_l$ are $N_l \\times 1$ column vectors. \n", "With this notation, the sum becomes a matrix-vector multiplication, and we can write\n", - "the equation for the activations of hidden layer 2 as" + "the equation for the activations of hidden layer 2 (assuming three nodes for simplicity) as" ] }, { @@ -693,7 +693,7 @@ "As a convention it is normal to call a network with one layer of input units, one layer of hidden\n", "units and one layer of output units as a two-layer network. A network with two layers of hidden units is called a three-layer network etc etc.\n", "\n", - "For an MLP there is no direct connection between the output nodes/neurons/units and the input nodes/neurons/units.\n", + "For an MLP network there is no direct connection between the output nodes/neurons/units and the input nodes/neurons/units.\n", "Hereafter we will call the various entities of a layer for nodes.\n", "There are also no connections within a single layer.\n", "\n", @@ -815,11 +815,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "With the activation function $\\hat{z}^l$ we can in turn define the\n", + "With the activation values $\\hat{z}^l$ we can in turn define the\n", "output of layer $l$ as $\\hat{a}^l = f(\\hat{z}^l)$ where $f$ is our\n", "activation function. In the examples here we will use the sigmoid\n", - "function discussed in our logistic regression lectures and here as\n", - "well. We will also use the same activation function $f$ for all layers\n", + "function discussed in our logistic regression lectures. We will also use the same activation function $f$ for all layers\n", "and their nodes. It means we have" ] }, @@ -989,7 +988,7 @@ "metadata": {}, "source": [ "This is an important expression. The second term on the right handside\n", - "measures how fast the cost is changing as a function of the $j$th\n", + "measures how fast the cost function is changing as a function of the $j$th\n", "output activation. If, for example, the cost function doesn't depend\n", "much on a particular output node $j$, then $\\delta_j^L$ will be small,\n", "which is what we would expect. The first term on the right, measures\n", @@ -1000,9 +999,9 @@ "particular, we compute $z_j^L$ while computing the behaviour of the\n", "network, and it is only a small additional overhead to compute\n", "$f'(z^L_j)$. The exact form of the derivative with respect to the\n", - "outpuwill, of course, depend on the form of the cost function.\n", + "output depends on the form of the cost function.\n", "However, provided the cost function is known there should be little\n", - "trouble computing" + "trouble in calculating" ] }, { @@ -1072,6 +1071,7 @@ "## Bringing it together\n", "\n", "We have now three equations that are essential for the computations of the derivatives of the cost function at the output layer. These equations are needed to start the algorithm and they are\n", + "\n", "**The starting equations.**" ] }, @@ -1146,7 +1146,7 @@ "descent. In this case we say the system learns slowly.\n", "\n", "Another interesting feature is that is when the activation function,\n", - "represented by the sigmoid function here, is rather flat when towards\n", + "represented by the sigmoid function here, is rather flat when we move towards\n", "its end values $0$ and $1$ (see the above Python codes). In these\n", "cases, the derivatives of the activation function will also be close\n", "to zero, meaning again that the gradients will be small and the\n", @@ -1306,7 +1306,7 @@ "metadata": {}, "source": [ "The parameter $\\eta$ is the learning parameter discussed in connection with the gradient descent methods.\n", - "Here it is convenient to use stochastic radient descent with mini-batches with an outer loop that steps through multiple epochs of training.\n", + "Here it is convenient to use stochastic gradient descent (see the examples below) with mini-batches with an outer loop that steps through multiple epochs of training.\n", "\n", "\n", "\n", @@ -1327,7 +1327,8 @@ "calculate.\n", "\n", "For an input $\\boldsymbol{a}$ from the hidden layer, the probability that the input $\\boldsymbol{x}$\n", - "is in class 0 or 1 is just:" + "is in class 0 or 1 is just. We let $\\theta$ represent the unknown weights and biases to be adjusted by our equations). The variable $x$\n", + "represents our activation values $z$. We have" ] }, { @@ -1335,7 +1336,7 @@ "metadata": {}, "source": [ "$$\n", - "P(y = 0 \\mid \\boldsymbol{x}, \\boldsymbol{\\theta}) = \\frac{1}{1 + \\exp (- \\boldsymbol{a}^T \\boldsymbol{w}_{out})} ,\n", + "P(y = 0 \\mid \\boldsymbol{x}, \\boldsymbol{\\theta}) = \\frac{1}{1 + \\exp (- \\boldsymbol{x}} ,\n", "$$" ] }, @@ -1690,7 +1691,7 @@ "The denominator is a normalization factor to ensure the outputs (probabilities) sum up to 1. \n", "The exponent is just the weighted sum of inputs as before: \n", "\n", - "$$ z_j = \\sum_{i=1}^n w_ {ij} a_i = \\boldsymbol{a}^T \\boldsymbol{w}_j .$$ \n", + "$$ z_j = \\sum_{i=1}^n w_ {ij} a_i+b_j.$$ \n", "\n", "Since each neuron in the output layer is connected to the 50 inputs from the hidden layer we have 50x10 = 500\n", "weights to the output layer.\n", @@ -1704,7 +1705,7 @@ "Adding a bias value to the weighted sum of inputs allows the neural network to represent a greater range\n", "of values. Without it, any input with the value 0 will be mapped to zero (before being passed through the activation). The bias unit has an output of 1, and a weight to each neuron $j$, $b_j$: \n", "\n", - "$$ z_j = \\sum_{i=1}^n w_ {ij} a_i + 1\\cdot b_j = \\boldsymbol{a}^T \\boldsymbol{w}_j + b_j .$$ \n", + "$$ z_j = \\sum_{i=1}^n w_ {ij} a_i + 1\\cdot b_j.$$ \n", "\n", "The bias weights $\\boldsymbol{b}$ are often initialized to zero, but a small value like $0.01$ ensures all neurons have some output which can be backpropagated in the first training cycle." ] @@ -1741,22 +1742,22 @@ "## Feed-forward pass\n", "\n", "Denote $F$ the number of features, $H$ the number of hidden neurons and $C$ the number of categories. \n", - "For each input image we calculate a weighted sum of input features (pixel values) to each neuron $j$ in the hidden layer: \n", + "For each input image we calculate a weighted sum of input features (pixel values) to each neuron $j$ in the hidden layer $l$: \n", "\n", - "$$ z_{j}^{h} = \\sum_{i=1}^{F} w_{ij}^{h} x_i + b_{j}^{h} = \\boldsymbol{x}^T \\boldsymbol{w}_{j}^{h} + b_{j}^{h} ,$$\n", + "$$ z_{j}^{l} = \\sum_{i=1}^{F} w_{ij}^{l} x_i + b_{j}^{l},$$\n", "\n", "this is then passed through our activation function \n", "\n", - "$$ a_{j}^{h} = f(z_{j}^{h}) .$$ \n", + "$$ a_{j}^{l} = f(z_{j}^{l}) .$$ \n", "\n", "We calculate a weighted sum of inputs (activations in the hidden layer) to each neuron $j$ in the output layer: \n", "\n", - "$$ z_{j}^{o} = \\sum_{i=1}^{H} w_{ij}^{o} a_{i}^{h} + b_{j}^{o} = (\\boldsymbol{a}^{h})^T \\boldsymbol{w}_{j}^{o} + b_{j}^{o} .$$ \n", + "$$ z_{j}^{L} = \\sum_{i=1}^{H} w_{ij}^{L} a_{i}^{l} + b_{j}^{L}.$$ \n", "\n", "Finally we calculate the output of neuron $j$ in the output layer using the softmax function: \n", "\n", - "$$ a_{j}^{o} = \\frac{\\exp{(z_j^{o})}}\n", - "{\\sum_{c=0}^{C-1} \\exp{(z_c^{o})}} .$$ \n", + "$$ a_{j}^{L} = \\frac{\\exp{(z_j^{L})}}\n", + "{\\sum_{c=0}^{C-1} \\exp{(z_c^{L})}} .$$ \n", "\n", "\n", "## Matrix multiplication\n", @@ -1772,20 +1773,20 @@ "for each input image and each hidden neuron. \n", "We also add the bias to obtain a matrix of weighted sums to the hidden layer $Z^{h}$: \n", "\n", - "$$ Z^{h} = X W^{h} + B^{h} ,$$\n", + "$$ \\hat{z}^{l} = \\hat{X} \\hat{W}^{l} + \\hat{b}^{l} ,$$\n", "\n", "meaning the same bias (1D array with size equal number of hidden neurons) is added to each input image. \n", "This is then passed through the activation: \n", "\n", - "$$ A^{h} = f(Z^h) .$$ \n", + "$$ \\hat{a}^{l} = f(\\hat{z}^l) .$$ \n", "\n", "This is fed to the output layer: \n", "\n", - "$$ Z^{o} = A^{h} W^{o} + B^{o} .$$\n", + "$$ \\hat{z}^{L} = \\hat{a}^{L} \\hat{W}^{L} + \\hat{b}^{L} .$$\n", "\n", "Finally we receive our output values for each image and each category by passing it through the softmax function: \n", "\n", - "$$ output = softmax (Z^{o}) = (n_{inputs}, n_{categories}) .$$" + "$$ output = softmax (\\hat{z}^{L}) = (n_{inputs}, n_{categories}) .$$" ] }, { @@ -1796,7 +1797,7 @@ }, "outputs": [], "source": [ - "# setup the feed-forward pass\n", + "# setup the feed-forward pass, subscript h = hidden layer\n", "\n", "def sigmoid(x):\n", " return 1/(1 + np.exp(-x))\n", @@ -1960,32 +1961,32 @@ "To more efficently train our network these equations are implemented using matrix operations. \n", "The error in the output layer is calculated simply as \n", "\n", - "$$ \\Delta_o = \\hat{y} - y = (n_{inputs}, n_{categories}) .$$ \n", + "$$ \\delta_L = \\hat{y} - y = (n_{inputs}, n_{categories}) .$$ \n", "\n", "The gradient for the output weights is calculated as \n", "\n", - "$$ \\nabla W_{o} = A^T \\Delta_o = (n_{hidden}, n_{categories}) ,$$\n", + "$$ \\nabla W_{L} = \\hat{a}^T \\delta_L = (n_{hidden}, n_{categories}) ,$$\n", "\n", - "where $A = (n_{inputs}, n_{hidden})$. This simply means that we are summing up the gradients for each input. \n", + "where $\\hat{a} = (n_{inputs}, n_{hidden})$. This simply means that we are summing up the gradients for each input. \n", "Since we are going backwards we have to transpose the activation matrix. \n", "\n", "The gradient with respect to the output bias is then \n", "\n", - "$$ \\nabla B_{o} = \\sum_{i=1}^{n_{inputs}} \\Delta_o = (n_{categories}) .$$ \n", + "$$ \\nabla \\hat{b}_{L} = \\sum_{i=1}^{n_{inputs}} \\delta_L = (n_{categories}) .$$ \n", "\n", "The error in the hidden layer is \n", "\n", - "$$ \\Delta_h = \\Delta_o W_{o}^T \\circ f'(Z_{h}) = \\Delta_o W_{o}^T \\circ A_{h} \\circ (1 - A_{h}) = (n_{inputs}, n_{hidden}) ,$$ \n", + "$$ \\Delta_h = \\delta_L W_{L}^T \\circ f'(z_{h}) = \\delta_L W_{L}^T \\circ a_{h} \\circ (1 - a_{h}) = (n_{inputs}, n_{hidden}) ,$$ \n", "\n", - "where $f'(A_{h})$ is the derivative of the activation in the hidden layer. The matrix products mean\n", + "where $f'(a_{h})$ is the derivative of the activation in the hidden layer. The matrix products mean\n", "that we are summing up the products for each neuron in the output layer. The symbol $\\circ$ denotes\n", "the *Hadamard product*, meaning element-wise multiplication. \n", "\n", "This again gives us the gradients in the hidden layer: \n", "\n", - "$$ \\nabla W_{h} = X^T \\Delta_h = (n_{features}, n_{hidden}) ,$$ \n", + "$$ \\nabla W_{h} = X^T \\delta_h = (n_{features}, n_{hidden}) ,$$ \n", "\n", - "$$ \\nabla B_{h} = \\sum_{i=1}^{n_{inputs}} \\Delta_h = (n_{hidden}) .$$" + "$$ \\nabla b_{h} = \\sum_{i=1}^{n_{inputs}} \\delta_h = (n_{hidden}) .$$" ] }, { @@ -2247,70 +2248,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Adjust hyperparameters (if necessary, network architecture\n", + "## Adjust hyperparameters\n", "\n", "We now perform a grid search to find the optimal hyperparameters for the network. \n", - "Note that we are only using 1 layer with 50 neurons, and human performance is estimated to be around $98 \\%$ ($2 \\%$ error rate)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "8\n", - " \n", - "<\n", - "<\n", - "<\n", - "!\n", - "!\n", - "C\n", - "O\n", - "D\n", - "E\n", - "_\n", - "B\n", - "L\n", - "O\n", - "C\n", - "K\n", - " \n", - " \n", - "p\n", - "y\n", - "c\n", - "o\n", - "d" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "9\n", - " \n", - "<\n", - "<\n", - "<\n", - "!\n", - "!\n", - "C\n", - "O\n", - "D\n", - "E\n", - "_\n", - "B\n", - "L\n", - "O\n", - "C\n", - "K\n", - " \n", - " \n", - "p\n", - "y\n", - "c\n", - "o\n", - "d" + "Note that we are only using 1 layer with 50 neurons, and human performance is estimated to be around $98\\%$ ($2\\%$ error rate)." ] }, { @@ -2321,9 +2262,45 @@ }, "outputs": [], "source": [ - "# optional\n", + "eta_vals = np.logspace(-5, 1, 7)\n", + "lmbd_vals = np.logspace(-5, 1, 7)\n", + "# store the models for later use\n", + "DNN_numpy = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)\n", + "\n", + "# grid search\n", + "for i, eta in enumerate(eta_vals):\n", + " for j, lmbd in enumerate(lmbd_vals):\n", + " dnn = NeuralNetwork(X_train, Y_train_onehot, eta=eta, lmbd=lmbd, epochs=epochs, batch_size=batch_size,\n", + " n_hidden_neurons=n_hidden_neurons, n_categories=n_categories)\n", + " dnn.train()\n", + " \n", + " DNN_numpy[i][j] = dnn\n", + " \n", + " test_predict = dnn.predict(X_test)\n", + " \n", + " print(\"Learning rate = \", eta)\n", + " print(\"Lambda = \", lmbd)\n", + " print(\"Accuracy score on test set: \", accuracy_score(Y_test, test_predict))\n", + " print()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Visualization" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ "# visual representation of grid search\n", - "# uses seaborn heatmap, I believe you can also do this with matplotlib imshow\n", + "# uses seaborn heatmap, you can also do this with matplotlib imshow\n", "import seaborn as sns\n", "\n", "sns.set()\n", @@ -2363,45 +2340,55 @@ "source": [ "## scikit-learn implementation\n", "\n", - "scikit-learn is a machine learning library for Python. It focuses more on traditional machine learning methods, such as regression, clustering, decision trees, etc. As such, it has only two types of neural networks: Multi Layer Perceptron outputting continuous values, *MPLRegressor*, and Multi Layer Perceptron outputting labels, *MLPClassifier*. We will see how simple it is to use these classes. \n", + "**scikit-learn** focuses more\n", + "on traditional machine learning methods, such as regression,\n", + "clustering, decision trees, etc. As such, it has only two types of\n", + "neural networks: Multi Layer Perceptron outputting continuous values,\n", + "*MPLRegressor*, and Multi Layer Perceptron outputting labels,\n", + "*MLPClassifier*. We will see how simple it is to use these classes.\n", "\n", - "scikit-learn implements a few improvements from our neural network, such as early stopping, a varying learning rate, different optimization methods, etc. We would therefore expect a better performance overall." + "**scikit-learn** implements a few improvements from our neural network,\n", + "such as early stopping, a varying learning rate, different\n", + "optimization methods, etc. We would therefore expect a better\n", + "performance overall." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from sklearn.neural_network import MLPClassifier\n", + "# store models for later use\n", + "DNN_scikit = 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", + " dnn = MLPClassifier(hidden_layer_sizes=(n_hidden_neurons), activation='logistic',\n", + " alpha=lmbd, learning_rate_init=eta, max_iter=epochs)\n", + " dnn.fit(X_train, Y_train)\n", + " \n", + " DNN_scikit[i][j] = dnn\n", + " \n", + " print(\"Learning rate = \", eta)\n", + " print(\"Lambda = \", lmbd)\n", + " print(\"Accuracy score on test set: \", dnn.score(X_test, Y_test))\n", + " print()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "1\n", - "1\n", - " \n", - "<\n", - "<\n", - "<\n", - "!\n", - "!\n", - "C\n", - "O\n", - "D\n", - "E\n", - "_\n", - "B\n", - "L\n", - "O\n", - "C\n", - "K\n", - " \n", - " \n", - "p\n", - "y\n", - "c\n", - "o\n", - "d" + "## Visualization" ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 12, "metadata": { "collapsed": false }, @@ -2486,7 +2473,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 13, "metadata": { "collapsed": false }, @@ -2504,7 +2491,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 14, "metadata": { "collapsed": false }, @@ -2522,7 +2509,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 15, "metadata": { "collapsed": false }, @@ -2574,7 +2561,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 16, "metadata": { "collapsed": false }, @@ -2606,7 +2593,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 17, "metadata": { "collapsed": false }, @@ -2754,7 +2741,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 18, "metadata": { "collapsed": false }, @@ -2765,14 +2752,13 @@ "n_neurons_layer1 = 100\n", "n_neurons_layer2 = 50\n", "n_categories = 10\n", - "\n", "eta_vals = np.logspace(-5, 1, 7)\n", "lmbd_vals = np.logspace(-5, 1, 7)" ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 19, "metadata": { "collapsed": false }, @@ -2797,7 +2783,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 20, "metadata": { "collapsed": false }, @@ -2838,7 +2824,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 21, "metadata": { "collapsed": false }, @@ -2864,7 +2850,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 22, "metadata": { "collapsed": false }, @@ -2882,7 +2868,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 23, "metadata": { "collapsed": false }, @@ -2900,7 +2886,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 24, "metadata": { "collapsed": false }, @@ -2925,7 +2911,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 25, "metadata": { "collapsed": false }, @@ -2950,7 +2936,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 26, "metadata": { "collapsed": false }, diff --git a/doc/pub/NeuralNet/ipynb/ipynb-NeuralNet-src.tar.gz b/doc/pub/NeuralNet/ipynb/ipynb-NeuralNet-src.tar.gz index df4a2068cac0e7fc7899a1a4b105bf4a9df1f9bb..e5b6f060dd79f35ab6345fc57ef2990ccc97005f 100644 GIT binary patch literal 211 zcmV;^04)C>iwFSXiM3k*1MSaEY63wJhGEy9qE0ZB^P}s4F0zP(;00Qy&2*yOrn?6+ zx7SffR>@96@O?HPMHNNW%j#kIv?}svp4^P8&g)vnT+EwGYI&_MW~Iuks+y+KdQq36 zW1$n#+nw~SPuaxtDczg($@(AX&SSgXFMF=9$XEUoo6aS9d>(Qay!epqHiUOs+di88 z+UCL?2fvjz*fe$}+K=8vE5;9E+SX+kyxC8WF}y}|NX7K8{{a910000000000004k{ NaRM5+zmWha004vSXkq{W literal 211 zcmV;^04)C>iwFS8(X(3s1MSbjYQjJe#&OR+#XLcnXkyNVdg!52iZ8H|wb@p8?d}Ge zx7R4>sl7=l{r@f>!wkdB>+<38d0FJIJh>ZHT~w8f*(~aF>g-aVl{1xcKCi2$)}|~) z$3iEf_dDsPPuaxNDc!sE$@*{SPGj5c4|^`J$Tk0nb?1^iy$rbvUVO-Q6T*kAY#+^T zWpm*UgWpISY#O@~?Pu?z72^jnZR@fN-t4A_7~Z1Ur(*is{{R300000000000006*$ NaRi>1U!?#j0061dX~+No diff --git a/doc/pub/NeuralNet/pdf/NeuralNet-minted.pdf b/doc/pub/NeuralNet/pdf/NeuralNet-minted.pdf index 1f58cbc2a9d3e602807774ef5fd91f86805cbea5..2e8f8335690c736fb3e5a7f65f470810a0c8a76b 100644 GIT binary patch delta 122239 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 delta 122990 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 IPu{NSX?J0B9sy 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 diff --git a/doc/src/NeuralNet/NeuralNet.do.txt b/doc/src/NeuralNet/NeuralNet.do.txt index 03bb895d7..23cb51eea 100644 --- a/doc/src/NeuralNet/NeuralNet.do.txt +++ b/doc/src/NeuralNet/NeuralNet.do.txt @@ -192,7 +192,7 @@ The output $y$ is produced via the activation function $f$ \] !et This function receives $x_i$ as inputs. -Here the activation $z=\sum_{i=1}^n w_ix_i$. +Here the activation $z=(\sum_{i=1}^n w_ix_i+b_i)$. In an FFNN of such neurons, the *inputs* $x_i$ are the *outputs* of the neurons in the preceding layer. Furthermore, an MLP is fully-connected, which means that each neuron receives a weighted sum @@ -312,7 +312,7 @@ is the bias $b_i^l$ and activation $y_i^l$ of node $i$ in layer $l$ respectively We have that $\mathrm{W}_l$ is an $N_{l-1} \times N_l$ matrix, while $\hat{b}_l$ and $\hat{y}_l$ are $N_l \times 1$ column vectors. With this notation, the sum becomes a matrix-vector multiplication, and we can write -the equation for the activations of hidden layer 2 as +the equation for the activations of hidden layer 2 (assuming three nodes for simplicity) as !bt \begin{equation} \hat{y}_2 = f_2(\mathrm{W}_2 \hat{y}_{1} + \hat{b}_{2}) = @@ -489,7 +489,7 @@ o The input nodes pass values to the first hidden layer, its nodes pass the info As a convention it is normal to call a network with one layer of input units, one layer of hidden units and one layer of output units as a two-layer network. A network with two layers of hidden units is called a three-layer network etc etc. -For an MLP there is no direct connection between the output nodes/neurons/units and the input nodes/neurons/units. +For an MLP network there is no direct connection between the output nodes/neurons/units and the input nodes/neurons/units. Hereafter we will call the various entities of a layer for nodes. There are also no connections within a single layer. @@ -591,11 +591,10 @@ compact form as the matrix-vector products we discussed earlier, \] !et -With the activation function $\hat{z}^l$ we can in turn define the +With the activation values $\hat{z}^l$ we can in turn define the output of layer $l$ as $\hat{a}^l = f(\hat{z}^l)$ where $f$ is our activation function. In the examples here we will use the sigmoid -function discussed in our logistic regression lectures and here as -well. We will also use the same activation function $f$ for all layers +function discussed in our logistic regression lectures. We will also use the same activation function $f$ for all layers and their nodes. It means we have !bt @@ -680,7 +679,7 @@ and using the Hadamard product of two vectors we can write this as !et This is an important expression. The second term on the right handside -measures how fast the cost is changing as a function of the $j$th +measures how fast the cost function is changing as a function of the $j$th output activation. If, for example, the cost function doesn't depend much on a particular output node $j$, then $\delta_j^L$ will be small, which is what we would expect. The first term on the right, measures @@ -691,9 +690,9 @@ Notice that everything in the above equations is easily computed. In particular, we compute $z_j^L$ while computing the behaviour of the network, and it is only a small additional overhead to compute $f'(z^L_j)$. The exact form of the derivative with respect to the -outpuwill, of course, depend on the form of the cost function. +output depends on the form of the cost function. However, provided the cost function is known there should be little -trouble computing +trouble in calculating !bt \[ @@ -729,6 +728,7 @@ That is, the error $\delta_j^L$ is exactly equal to the rate of change of the co ===== Bringing it together ===== We have now three equations that are essential for the computations of the derivatives of the cost function at the output layer. These equations are needed to start the algorithm and they are + !bblock The starting equations !bt @@ -760,7 +760,7 @@ that it changes slowly when we minimize the weights via say gradient descent. In this case we say the system learns slowly. Another interesting feature is that is when the activation function, -represented by the sigmoid function here, is rather flat when towards +represented by the sigmoid function here, is rather flat when we move towards its end values $0$ and $1$ (see the above Python codes). In these cases, the derivatives of the activation function will also be close to zero, meaning again that the gradients will be small and the @@ -859,7 +859,7 @@ b_j^l \leftarrow b_j^l-\eta \frac{\partial {\cal C}}{\partial b_j^L}, !eblock The parameter $\eta$ is the learning parameter discussed in connection with the gradient descent methods. -Here it is convenient to use stochastic radient descent with mini-batches with an outer loop that steps through multiple epochs of training. +Here it is convenient to use stochastic gradient descent (see the examples below) with mini-batches with an outer loop that steps through multiple epochs of training. !split @@ -880,11 +880,11 @@ also has other nice properties, such as a derivative that is simple to calculate. For an input $\boldsymbol{a}$ from the hidden layer, the probability that the input $\boldsymbol{x}$ -is in class 0 or 1 is just: - +is in class 0 or 1 is just. We let $\theta$ represent the unknown weights and biases to be adjusted by our equations). The variable $x$ +represents our activation values $z$. We have !bt \[ -P(y = 0 \mid \boldsymbol{x}, \boldsymbol{\theta}) = \frac{1}{1 + \exp (- \boldsymbol{a}^T \boldsymbol{w}_{out})} , +P(y = 0 \mid \boldsymbol{x}, \boldsymbol{\theta}) = \frac{1}{1 + \exp (- \boldsymbol{x}} , \] !et and @@ -1165,7 +1165,7 @@ i.e. each neuron $j$ outputs the probability of being in class $j$ given an inpu The denominator is a normalization factor to ensure the outputs (probabilities) sum up to 1. The exponent is just the weighted sum of inputs as before: -$$ z_j = \sum_{i=1}^n w_ {ij} a_i = \boldsymbol{a}^T \boldsymbol{w}_j .$$ +$$ z_j = \sum_{i=1}^n w_ {ij} a_i+b_j.$$ Since each neuron in the output layer is connected to the 50 inputs from the hidden layer we have 50x10 = 500 weights to the output layer. @@ -1179,7 +1179,7 @@ or normal distribution. Setting all weights to zero means all neurons give the s Adding a bias value to the weighted sum of inputs allows the neural network to represent a greater range of values. Without it, any input with the value 0 will be mapped to zero (before being passed through the activation). The bias unit has an output of 1, and a weight to each neuron $j$, $b_j$: -$$ z_j = \sum_{i=1}^n w_ {ij} a_i + 1\cdot b_j = \boldsymbol{a}^T \boldsymbol{w}_j + b_j .$$ +$$ z_j = \sum_{i=1}^n w_ {ij} a_i + 1\cdot b_j.$$ The bias weights $\boldsymbol{b}$ are often initialized to zero, but a small value like $0.01$ ensures all neurons have some output which can be backpropagated in the first training cycle. !bc pycod @@ -1204,22 +1204,22 @@ output_bias = np.zeros(n_categories) + 0.01 ===== Feed-forward pass ===== Denote $F$ the number of features, $H$ the number of hidden neurons and $C$ the number of categories. -For each input image we calculate a weighted sum of input features (pixel values) to each neuron $j$ in the hidden layer: +For each input image we calculate a weighted sum of input features (pixel values) to each neuron $j$ in the hidden layer $l$: -$$ z_{j}^{h} = \sum_{i=1}^{F} w_{ij}^{h} x_i + b_{j}^{h} = \boldsymbol{x}^T \boldsymbol{w}_{j}^{h} + b_{j}^{h} ,$$ +$$ z_{j}^{l} = \sum_{i=1}^{F} w_{ij}^{l} x_i + b_{j}^{l},$$ this is then passed through our activation function -$$ a_{j}^{h} = f(z_{j}^{h}) .$$ +$$ a_{j}^{l} = f(z_{j}^{l}) .$$ We calculate a weighted sum of inputs (activations in the hidden layer) to each neuron $j$ in the output layer: -$$ z_{j}^{o} = \sum_{i=1}^{H} w_{ij}^{o} a_{i}^{h} + b_{j}^{o} = (\boldsymbol{a}^{h})^T \boldsymbol{w}_{j}^{o} + b_{j}^{o} .$$ +$$ z_{j}^{L} = \sum_{i=1}^{H} w_{ij}^{L} a_{i}^{l} + b_{j}^{L}.$$ Finally we calculate the output of neuron $j$ in the output layer using the softmax function: -$$ a_{j}^{o} = \frac{\exp{(z_j^{o})}} -{\sum_{c=0}^{C-1} \exp{(z_c^{o})}} .$$ +$$ a_{j}^{L} = \frac{\exp{(z_j^{L})}} +{\sum_{c=0}^{C-1} \exp{(z_c^{L})}} .$$ !split ===== Matrix multiplication ===== @@ -1235,24 +1235,24 @@ and obtain a matrix that holds the weighted sum of inputs to the hidden layer for each input image and each hidden neuron. We also add the bias to obtain a matrix of weighted sums to the hidden layer $Z^{h}$: -$$ Z^{h} = X W^{h} + B^{h} ,$$ +$$ \hat{z}^{l} = \hat{X} \hat{W}^{l} + \hat{b}^{l} ,$$ meaning the same bias (1D array with size equal number of hidden neurons) is added to each input image. This is then passed through the activation: -$$ A^{h} = f(Z^h) .$$ +$$ \hat{a}^{l} = f(\hat{z}^l) .$$ This is fed to the output layer: -$$ Z^{o} = A^{h} W^{o} + B^{o} .$$ +$$ \hat{z}^{L} = \hat{a}^{L} \hat{W}^{L} + \hat{b}^{L} .$$ Finally we receive our output values for each image and each category by passing it through the softmax function: -$$ output = softmax (Z^{o}) = (n_{inputs}, n_{categories}) .$$ +$$ output = softmax (\hat{z}^{L}) = (n_{inputs}, n_{categories}) .$$ !bc pycod -# setup the feed-forward pass +# setup the feed-forward pass, subscript h = hidden layer def sigmoid(x): return 1/(1 + np.exp(-x)) @@ -1386,32 +1386,32 @@ calculate the gradient efficently. To more efficently train our network these equations are implemented using matrix operations. The error in the output layer is calculated simply as -$$ \Delta_o = \hat{y} - y = (n_{inputs}, n_{categories}) .$$ +$$ \delta_L = \hat{y} - y = (n_{inputs}, n_{categories}) .$$ The gradient for the output weights is calculated as -$$ \nabla W_{o} = A^T \Delta_o = (n_{hidden}, n_{categories}) ,$$ +$$ \nabla W_{L} = \hat{a}^T \delta_L = (n_{hidden}, n_{categories}) ,$$ -where $A = (n_{inputs}, n_{hidden})$. This simply means that we are summing up the gradients for each input. +where $\hat{a} = (n_{inputs}, n_{hidden})$. This simply means that we are summing up the gradients for each input. Since we are going backwards we have to transpose the activation matrix. The gradient with respect to the output bias is then -$$ \nabla B_{o} = \sum_{i=1}^{n_{inputs}} \Delta_o = (n_{categories}) .$$ +$$ \nabla \hat{b}_{L} = \sum_{i=1}^{n_{inputs}} \delta_L = (n_{categories}) .$$ The error in the hidden layer is -$$ \Delta_h = \Delta_o W_{o}^T \circ f'(Z_{h}) = \Delta_o W_{o}^T \circ A_{h} \circ (1 - A_{h}) = (n_{inputs}, n_{hidden}) ,$$ +$$ \Delta_h = \delta_L W_{L}^T \circ f'(z_{h}) = \delta_L W_{L}^T \circ a_{h} \circ (1 - a_{h}) = (n_{inputs}, n_{hidden}) ,$$ -where $f'(A_{h})$ is the derivative of the activation in the hidden layer. The matrix products mean +where $f'(a_{h})$ is the derivative of the activation in the hidden layer. The matrix products mean that we are summing up the products for each neuron in the output layer. The symbol $\circ$ denotes the *Hadamard product*, meaning element-wise multiplication. This again gives us the gradients in the hidden layer: -$$ \nabla W_{h} = X^T \Delta_h = (n_{features}, n_{hidden}) ,$$ +$$ \nabla W_{h} = X^T \delta_h = (n_{features}, n_{hidden}) ,$$ -$$ \nabla B_{h} = \sum_{i=1}^{n_{inputs}} \Delta_h = (n_{hidden}) .$$ +$$ \nabla b_{h} = \sum_{i=1}^{n_{inputs}} \delta_h = (n_{hidden}) .$$ !bc pycod @@ -1644,17 +1644,14 @@ def accuracy_score_numpy(Y_test, Y_pred): !ec !split -===== Adjust hyperparameters (if necessary, network architecture ===== +===== Adjust hyperparameters ===== We now perform a grid search to find the optimal hyperparameters for the network. -Note that we are only using 1 layer with 50 neurons, and human performance is estimated to be around $98 \%$ ($2 \%$ error rate). - +Note that we are only using 1 layer with 50 neurons, and human performance is estimated to be around $98\%$ ($2\%$ error rate). !bc pycod eta_vals = np.logspace(-5, 1, 7) lmbd_vals = np.logspace(-5, 1, 7) -!ec -!bc pycod # store the models for later use DNN_numpy = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object) @@ -1674,10 +1671,13 @@ for i, eta in enumerate(eta_vals): print("Accuracy score on test set: ", accuracy_score(Y_test, test_predict)) print() !ec + +!split +===== Visualization ===== + !bc pycod -# optional # visual representation of grid search -# uses seaborn heatmap, I believe you can also do this with matplotlib imshow +# uses seaborn heatmap, you can also do this with matplotlib imshow import seaborn as sns sns.set() @@ -1714,14 +1714,20 @@ plt.show() !split ===== scikit-learn implementation ===== -scikit-learn is a machine learning library for Python. It focuses more on traditional machine learning methods, such as regression, clustering, decision trees, etc. As such, it has only two types of neural networks: Multi Layer Perceptron outputting continuous values, *MPLRegressor*, and Multi Layer Perceptron outputting labels, *MLPClassifier*. We will see how simple it is to use these classes. +_scikit-learn_ focuses more +on traditional machine learning methods, such as regression, +clustering, decision trees, etc. As such, it has only two types of +neural networks: Multi Layer Perceptron outputting continuous values, +*MPLRegressor*, and Multi Layer Perceptron outputting labels, +*MLPClassifier*. We will see how simple it is to use these classes. -scikit-learn implements a few improvements from our neural network, such as early stopping, a varying learning rate, different optimization methods, etc. We would therefore expect a better performance overall. - +_scikit-learn_ implements a few improvements from our neural network, +such as early stopping, a varying learning rate, different +optimization methods, etc. We would therefore expect a better +performance overall. !bc pycod from sklearn.neural_network import MLPClassifier - # store models for later use DNN_scikit = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object) @@ -1738,6 +1744,10 @@ for i, eta in enumerate(eta_vals): print("Accuracy score on test set: ", dnn.score(X_test, Y_test)) print() !ec + + +!split +===== Visualization ===== !bc pycod # optional # visual representation of grid search @@ -2033,7 +2043,6 @@ batch_size = 100 n_neurons_layer1 = 100 n_neurons_layer2 = 50 n_categories = 10 - eta_vals = np.logspace(-5, 1, 7) lmbd_vals = np.logspace(-5, 1, 7) !ec @@ -2055,7 +2064,6 @@ for i, eta in enumerate(eta_vals): print("Lambda = ", lmbd) print("Test accuracy: %.3f" % DNN.test_accuracy) print() - !ec !bc pycod