A Handson Analysis
of  a Backpropagation Example
Ali Rıza SARAL
I analized
an MNIST number recognition program written in Python.  It uses backpropagation.
The code is
written for Python 2.6 or 2.7. Michal Daniel Dobrzanski has a repository for
Python 3
[here](https://github.com/MichalDanielDobrzanski/DeepLearningPython35).
 I found this code from # Code samples for
"Neural Networks and Deep Learning".
This
repository contains code samples for Nielsen’s book on ["Neural Networks
and Deep
Learning"](http://neuralnetworksanddeeplearning.com).
MIT License
Copyright
(c) 2012-2018 Michael Nielsen
It can
easily be found on the internet...
I put
sys.exit(1) commands in order to stop and check various variables.  I added the outputs at these points so that
the flow of the program can easily be viewed.
I also added
a full output of print statements that I added for the first epoche.
Cheers.
Ali R+
Runner.py--------------------------------------------------------------------------------------------
# -*-
coding: utf-8 -*-
"""
Created on
Sat Mar 23 17:38:51 2024
@author: ars
"""
import
mnist_loader 
     
training_data,
validation_data, test_data = mnist_loader.load_data_wrapper()
training_data
= list(training_data)  # Convert zip
object to list
validation_data
= list(validation_data)  # Convert zip
object to list
test_data =
list(test_data)  # Convert zip object to
list
     
import
network
net =
network.Network([784, 30, 10])
     #%%
net.SGD(training_data,30,
10, 3.0, test_data=test_data)
"""
runfile('C:/Users/ars/ARStensorflow/00vbt/ex1/runner.py',
wdir='C:/Users/ars/ARStensorflow/00vbt/ex1')
Reloaded
modules: mnist_loader, network
Epoch 0:
8076 / 10000
Epoch 1:
8277 / 10000
Epoch 2:
8734 / 10000
Epoch 3:
9251 / 10000
Epoch 4:
9336 / 10000
Epoch 5:
9383 / 10000
Epoch 6:
9385 / 10000
Epoch 7:
9407 / 10000
Epoch 8:
9426 / 10000
Epoch 9:
9429 / 10000
Epoch 10:
9444 / 10000
Epoch 11:
9442 / 10000
Epoch 12:
9422 / 10000
Epoch 13:
9482 / 10000
Epoch 14:
9464 / 10000
Epoch 15:
9445 / 10000
Epoch 16:
9465 / 10000
Epoch 17:
9470 / 10000
Epoch 18:
9496 / 10000
Epoch 19:
9490 / 10000
Epoch 20:
9477 / 10000
Epoch 21:
9481 / 10000
Epoch 22:
9486 / 10000
Epoch 23:
9508 / 10000
Epoch 24:
9462 / 10000
Epoch 25:
9477 / 10000
Epoch 26:
9477 / 10000
Epoch 27:
9470 / 10000
Epoch 28:
9478 / 10000
Epoch 29:
9463 / 10000
"""
Network.py------------------------------------------------------------------------------------------
"""
network.py
~~~~~~~~~~
A module to
implement the stochastic gradient descent learning
algorithm
for a feedforward neural network. 
Gradients are calculated
using
backpropagation.  Note that I have
focused on making the code
simple,
easily readable, and easily modifiable. 
It is not optimized,
and omits
many desirable features.
"""
####
Libraries
# Standard
library
import
random
import sys
#
Third-party libraries
import numpy
as np
class
Network(object):
    def __init__(self, sizes):
        """The list ``sizes``
contains the number of neurons in the
        respective layers of the network.  For example, if the list
        was [2, 3, 1] then it would be a
three-layer network, with the
        first layer containing 2 neurons, the
second layer 3 neurons,
        and the third layer 1 neuron.  The biases and weights for the
        network are initialized randomly, using
a Gaussian
        distribution with mean 0, and variance
1.  Note that the first
        layer is assumed to be an input layer,
and by convention we
        won't set any biases for those neurons,
since biases are only
        ever used in computing the outputs from
later layers."""
        print("Sizes:", sizes)
        self.num_layers = len(sizes)
        self.sizes = sizes
        self.biases = [np.random.randn(y, 1)
for y in sizes[1:]]
        for bias in self.biases:
           
print("bias.shape=",bias.shape)       
        
        print("Sizes[1:]:", sizes[1:])
           
        self.weights = [np.random.randn(y, x)
                        for x, y in
zip(sizes[:-1], sizes[1:])] 
        
        print("\nSizes[:-1]:",
sizes[:-1])
        print("Sizes[1:]:",
sizes[1:])
        for weight in self.weights:
           
print("weight.shape=",weight.shape)
            
        """
        runcell(0,
'C:/Users/ars/ARStensorflow/00vbt/ex1/runner.py')
        Sizes: [784, 30, 10]
        bias.shape= (30, 1)
        bias.shape= (10, 1)
        Sizes[1:]: [30, 10]
       
Sizes[:-1]: [784, 30]
        Sizes[1:]: [30, 10]
        weight.shape= (30, 784)
        weight.shape= (10, 30)
        """
            
    def feedforward(self, a):
        """Return the output of
the network if ``a`` is input."""
        print("Input Layer Activation
(a):")
        print("shape(a)=",
np.shape(a))
        for i, (b, w) in
enumerate(zip(self.biases, self.weights), 1):
             print("\nProcessing
Layer:", i)
             print("shape Biases=",
np.shape(b))
             print("shape Weights=",
np.shape(w))
 
             z = np.dot(w, a) + b
             print("shape Weighted
Input(z)=", np.shape(z))
 
             a = sigmoid(z)
             print("shape Output
Activation (a)=", np.shape(a))
        
        #sys.exit(1)
        return a
    """
    runcell(1,
'C:/Users/ars/ARStensorflow/00vbt/ex1/runner.py')
    Input Layer Activation (a):
    shape(a)= (784, 1)
    Processing Layer: 1
    shape Biases= (30, 1)
    shape Weights= (30, 784)
    shape Weighted Input(z)= (30, 1)
    shape Output Activation (a)= (30, 1)
    Processing Layer: 2
    shape Biases= (10, 1)
    shape Weights= (10, 30)
    shape Weighted Input(z)= (10, 1)
    shape Output Activation (a)= (10, 1)
    An exception has occurred, use %tb to see
the full traceback.
    SystemExit: 1
    """
    def SGD(self, training_data, epochs,
mini_batch_size, eta,
        test_data=None):
        """Train the neural
network using mini-batch stochastic
        gradient descent.  The ``training_data`` is a list of tuples
        ``(x, y)`` representing the training
inputs and the desired
        outputs.  The other non-optional parameters are
        self-explanatory.  If ``test_data`` is provided then the
        network will be evaluated against the
test data after each
        epoch, and partial progress printed
out.  This is useful for
        tracking progress, but slows things
down substantially."""
        
       
print("\nSGD***************************************************")
       
print("mini_batch_size=",mini_batch_size)
        
        if test_data: 
            n_test = len(test_data)
            
        n = len(training_data)
       
print("len(training_data)=",n)
        for j in range(epochs):  # Changed xrange to range
            random.shuffle(training_data)
            mini_batches = [
               
training_data[k:k+mini_batch_size]
                for k in range(0, n,
mini_batch_size)]  # Changed xrange to
range
            
           
print("shape(mini_batches)=", np.shape(mini_batches))
            #sys.exit(1)
            """
            SGD---------------
            mini_batch_size= 10
            len(training_data)= 50000
            shape(mini_batches)= (5000, 10, 2)
2-> x,y
            An exception has occurred, use %tb
to see the full traceback.
            """
            ars2=0
            for mini_batch in mini_batches:
                ars2+=1
                print("ars2=",ars2)
                self.update_mini_batch(mini_batch,
eta)
                sys.exit(1)
            
            if test_data:
                print("Epoch {0}: {1} /
{2}".format(
                    j,
self.evaluate(test_data), n_test))
            else:
                print("Epoch {0}
complete".format(j))
                
                
    def update_mini_batch(self, mini_batch,
eta):
        """Update the network's
weights and biases by applying
        gradient descent using backpropagation
to a single mini batch.
        The ``mini_batch`` is a list of tuples
``(x, y)``, and ``eta``
        is the learning rate."""
       
print("\nupdate_mini_batch////////////////////////////////////")
        nabla_b = [np.zeros(b.shape) for b in
self.biases]
        nabla_w = [np.zeros(w.shape) for w in
self.weights]
        print("shape
nabla_b=",np.shape(nabla_b))
        print("shape
nabla_w=",np.shape(nabla_w))
        
        ars=0
        for x, y in mini_batch:
            ars+=1
            print("\ncalling backprop
#=",ars)
            delta_nabla_b, delta_nabla_w =
self.backprop(x, y)
            nabla_b = [nb+dnb for nb, dnb in
zip(nabla_b, delta_nabla_b)]
            nabla_w = [nw+dnw for nw, dnw in
zip(nabla_w, delta_nabla_w)]
            
        print("nabla_b[0]=",nabla_b[0])
       
print("nabla_b[1]=",nabla_b[1])
       
print("nabla_w[0]=",nabla_w[0])
       
print("nabla_w[1]=",nabla_w[1])
        
        self.weights =
[w-(eta/len(mini_batch))*nw
                        for w, nw in
zip(self.weights, nabla_w)]
        self.biases =
[b-(eta/len(mini_batch))*nb
                       for b, nb in
zip(self.biases, nabla_b)]
        #sys.exit(1)
        
    def backprop(self, x, y):
        """Return a tuple
``(nabla_b, nabla_w)`` representing the
        gradient for the cost function
C_x.  ``nabla_b`` and
        ``nabla_w`` are layer-by-layer lists of
numpy arrays, similar
        to ``self.biases`` and
``self.weights``."""
        print("\nbackprop=====================================")
        nabla_b = [np.zeros(b.shape) for b in
self.biases]
        nabla_w = [np.zeros(w.shape) for w in
self.weights]
       
print("xxxxxxxxxxxnabla_b=",nabla_b[:-3])
       
print("nabla_w=",nabla_w[:-3])
        # feedforward
       
print("\nfeedforward---------------------")
        activation = x
        activations = [x] # list to store all
the activations, layer by layer
        zs = [] # list to store all the z
vectors, layer by layer
        for b, w in zip(self.biases,
self.weights):
            z = np.dot(w, activation)+b
            zs.append(z)
            activation = sigmoid(z)
            activations.append(activation)
        print("shape(zs)=",
np.shape(zs))
        print("shape(activation)=",
np.shape(activation))
        print("shape(activations)=",
np.shape(activations))
        # backward pass
       
print("\nbackward---------------------")
        delta =
self.cost_derivative(activations[-1], y) * \
            sigmoid_prime(zs[-1])
        nabla_b[-1] = delta
        nabla_w[-1] = np.dot(delta,
activations[-2].transpose())
       
print("shape(delta)=",np.shape(delta))
       
print("shape(nabla_b)=",np.shape(nabla_b))
        print("shape(nabla_w)=",np.shape(nabla_w))
        # Note that the variable l in the loop
below is used a little
        # differently to the notation in
Chapter 2 of the book.  Here,
        # l = 1 means the last layer of
neurons, l = 2 is the
        # second-last layer, and so on.  It's a renumbering of the
        # scheme in the book, used here to take
advantage of the fact
        # that Python can use negative indices
in lists.
        for l in range(2,
self.num_layers):  # Changed xrange to
range
            print("-l=",-l)
            z = zs[-l]
            sp = sigmoid_prime(z)
            delta =
np.dot(self.weights[-l+1].transpose(), delta) * sp
            nabla_b[-l] = delta
            nabla_w[-l] = np.dot(delta,
activations[-l-1].transpose())
            if l<4 :              
                print("delta[{}] =
{}".format(l, delta[-l]))
                #print("nabla_b[{}] =
{}".format(l, nabla_b[-l][:-3]))
                #print("nabla_w[{}] =
{}".format(l, nabla_w[-l][:-3]))
                
        return (nabla_b, nabla_w)
    def evaluate(self, test_data):
        """Return the number of
test inputs for which the neural
        network outputs the correct result.
Note that the neural
        network's output is assumed to be the
index of whichever
        neuron in the final layer has the
highest activation."""
        test_results =
[(np.argmax(self.feedforward(x)), y)
                        for (x, y) in
test_data]
        return sum(int(x == y) for (x, y) in
test_results)
    def cost_derivative(self,
output_activations, y):
        """Return the vector of
partial derivatives \partial C_x /
        \partial a for the output
activations."""
        return (output_activations-y)
####
Miscellaneous functions
def
sigmoid(z):
    """The sigmoid
function."""
    return 1.0/(1.0+np.exp(-z))
def
sigmoid_prime(z):
    """Derivative of the sigmoid
function."""
    return sigmoid(z)*(1-sigmoid(z))
"""
runfile('C:/Users/ars/ARStensorflow/00vbt/ex1/runner.py',
wdir='C:/Users/ars/ARStensorflow/00vbt/ex1')
Reloaded
modules: mnist_loader, network
Sizes: [784,
30, 10]
bias.shape=
(30, 1)
bias.shape=
(10, 1)
Sizes[1:]:
[30, 10]
Sizes[:-1]:
[784, 30]
Sizes[1:]:
[30, 10]
weight.shape=
(30, 784)
weight.shape=
(10, 30)
SGD***************************************************
mini_batch_size=
10
len(training_data)=
50000
shape(mini_batches)=
(5000, 10, 2)
ars2= 1
update_mini_batch////////////////////////////////////
shape
nabla_b= (2,)
shape
nabla_w= (2,)
calling
backprop #= 1
backprop=====================================
xxxxxxxxxxxnabla_b=
[]
nabla_w= []
feedforward---------------------
shape(zs)=
(2,)
shape(activation)=
(10, 1)
shape(activations)=
(3,)
backward---------------------
shape(delta)=
(10, 1)
shape(nabla_b)=
(2,)
shape(nabla_w)=
(2,)
-l= -2
delta[2] =
[-1.42634488e-10]
calling
backprop #= 2
backprop=====================================
xxxxxxxxxxxnabla_b=
[]
nabla_w= []
feedforward---------------------
shape(zs)=
(2,)
shape(activation)=
(10, 1)
shape(activations)=
(3,)
backward---------------------
shape(delta)=
(10, 1)
shape(nabla_b)=
(2,)
shape(nabla_w)=
(2,)
-l= -2
delta[2] =
[-1.6675494e-07]
calling
backprop #= 3
backprop=====================================
xxxxxxxxxxxnabla_b=
[]
nabla_w= []
feedforward---------------------
shape(zs)=
(2,)
shape(activation)=
(10, 1)
shape(activations)=
(3,)
backward---------------------
shape(delta)=
(10, 1)
shape(nabla_b)=
(2,)
shape(nabla_w)=
(2,)
-l= -2
delta[2] =
[-6.69058141e-06]
calling backprop
#= 4
backprop=====================================
xxxxxxxxxxxnabla_b=
[]
nabla_w= []
feedforward---------------------
shape(zs)=
(2,)
shape(activation)=
(10, 1)
shape(activations)=
(3,)
backward---------------------
shape(delta)=
(10, 1)
shape(nabla_b)=
(2,)
shape(nabla_w)=
(2,)
-l= -2
delta[2] =
[-0.00990081]
calling
backprop #= 5
backprop=====================================
xxxxxxxxxxxnabla_b=
[]
nabla_w= []
feedforward---------------------
shape(zs)=
(2,)
shape(activation)=
(10, 1)
shape(activations)=
(3,)
backward---------------------
shape(delta)=
(10, 1)
shape(nabla_b)=
(2,)
shape(nabla_w)=
(2,)
-l= -2
delta[2] =
[-2.21166674e-13]
calling
backprop #= 6
backprop=====================================
xxxxxxxxxxxnabla_b=
[]
nabla_w= []
feedforward---------------------
shape(zs)=
(2,)
shape(activation)=
(10, 1)
shape(activations)=
(3,)
backward---------------------
shape(delta)=
(10, 1)
shape(nabla_b)=
(2,)
shape(nabla_w)=
(2,)
-l= -2
delta[2] =
[5.21994737e-06]
calling backprop
#= 7
backprop=====================================
xxxxxxxxxxxnabla_b=
[]
nabla_w= []
feedforward---------------------
shape(zs)=
(2,)
shape(activation)=
(10, 1)
shape(activations)=
(3,)
backward---------------------
shape(delta)=
(10, 1)
shape(nabla_b)=
(2,)
shape(nabla_w)=
(2,)
-l= -2
delta[2] =
[-1.46279172e-09]
calling
backprop #= 8
backprop=====================================
xxxxxxxxxxxnabla_b=
[]
nabla_w= []
feedforward---------------------
shape(zs)=
(2,)
shape(activation)=
(10, 1)
shape(activations)=
(3,)
backward---------------------
shape(delta)=
(10, 1)
shape(nabla_b)=
(2,)
shape(nabla_w)=
(2,)
-l= -2
delta[2] =
[7.47492242e-08]
calling
backprop #= 9
backprop=====================================
xxxxxxxxxxxnabla_b=
[]
nabla_w= []
feedforward---------------------
shape(zs)=
(2,)
shape(activation)=
(10, 1)
shape(activations)=
(3,)
backward---------------------
shape(delta)=
(10, 1)
shape(nabla_b)=
(2,)
shape(nabla_w)=
(2,)
-l= -2
delta[2] =
[-1.09874347e-09]
calling backprop
#= 10
backprop=====================================
xxxxxxxxxxxnabla_b=
[]
nabla_w= []
feedforward---------------------
shape(zs)=
(2,)
shape(activation)=
(10, 1)
shape(activations)=
(3,)
backward---------------------
shape(delta)=
(10, 1)
shape(nabla_b)=
(2,)
shape(nabla_w)=
(2,)
-l= -2
delta[2] =
[-0.00207019]
nabla_b[0]=
[[-0.01325782]
 [-0.03262269]
 [-0.03594767]
 [ 0.00368335]
 [ 0.09522265]
 [-0.09147546]
 [-0.01036631]
 [ 0.16768215]
 [-0.09533466]
 [ 0.00056786]
 [-0.01581537]
 [ 0.01267168]
 [-0.00257171]
 [ 0.09161304]
 [-0.00379968]
 [ 0.02993509]
 [-0.01039408]
 [-0.053856 
]
 [-0.02370034]
 [-0.03059559]
 [-0.11553744]
 [ 0.00219626]
 [ 0.20589038]
 [-0.01510159]
 [ 0.01420204]
 [ 0.06503109]
 [-0.17590391]
 [-0.03317643]
 [-0.01197257]
 [-0.08747135]]
nabla_b[1]=
[[0.36830155]
 [0.62675642]
 [0.68100886]
 [0.00181689]
 [0.04951175]
 [0.47319558]
 [0.85981884]
 [0.33877696]
 [0.31558633]
 [0.3640103 ]]
nabla_w[0]=
[[0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]
 ...
 [0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]]
nabla_w[1]=
[[ 4.10015805e-01  3.22926842e-01  2.23404037e-01  2.18877662e-01
   2.70085532e-01  3.18373857e-02  3.52924774e-01  9.47840951e-02
   1.59868586e-01  4.77892724e-02  2.20288346e-01  2.20205925e-01
  -1.68261942e-02  3.00148440e-01  1.92237370e-02  1.42144195e-01
   2.30670517e-01  3.03449621e-01  1.52493627e-02  1.50987158e-01
   1.68088798e-01  1.42725187e-01  5.07676562e-02 -6.74804386e-05
   1.97445388e-02  2.00607563e-01  1.18179665e-01  3.81606047e-01
   1.72484435e-01 -7.02472066e-02]
 [ 5.53954755e-01  5.63129601e-01  4.63566614e-01  4.35228659e-01
   5.00773768e-01  3.55405686e-02  4.50396288e-01  2.81969035e-01
   1.52322864e-01  2.96873425e-01  2.81555015e-01  4.58461317e-01
   2.73101931e-01  4.73329622e-01  4.81376679e-02  4.52391721e-01
   2.15350865e-01  2.63431582e-01  1.71456348e-02  3.71569920e-01
   2.47275902e-01  3.13953178e-02  1.61893015e-01  9.59780389e-03
   3.23937381e-02  3.90550915e-01  2.13925323e-01  5.54998773e-01
   4.92759817e-01  1.43993109e-01]
 [ 6.16086888e-01  6.02604002e-01  5.37537213e-01  5.47739625e-01
   6.00823224e-01  7.10742376e-02  7.70878436e-01  2.10498456e-01
   1.97151373e-01  3.52736622e-01  4.84395298e-01  5.00352136e-01
   1.55482741e-01  5.81145995e-01 -1.08148860e-01  3.38641639e-01
   2.76317801e-01  3.50592185e-01  2.40462361e-02  4.66033878e-01
   2.64761425e-01  1.56685705e-01  1.56309513e-01 -1.06681221e-01
  -1.06243615e-01  3.48106487e-01  1.20492110e-01  6.84493280e-01
   4.54685392e-01  1.51535600e-01]
 [ 1.81767698e-03  1.63954575e-03  8.45787544e-04  1.50209055e-03
   7.12282995e-04  7.36863064e-05  1.42559910e-03  1.18807871e-03
   4.01618226e-04  2.33191992e-04  5.47004368e-04  1.43919597e-03
   1.23651581e-03  1.48510588e-03  7.55718779e-05  6.77655758e-04
   5.66081161e-04  9.58860915e-04  4.96835894e-05  3.02563859e-04
   3.98767564e-04 -3.57741365e-05  3.63975742e-04  1.87809475e-06
   4.43689259e-05  5.56522250e-04  8.41395617e-04  1.81339297e-03
   1.85298963e-03  2.47101392e-04]
 [ 1.94439021e-02  4.89760463e-02  1.24454742e-01 -7.92407401e-02
   6.08570458e-02 -2.11839865e-03  4.01604278e-02  1.25026192e-01
   1.32171376e-01 -8.82951231e-02  1.36229311e-01 -1.02288539e-01
  -3.32739987e-03 -2.49987223e-02
-1.49643101e-03 -8.03672884e-02
  -6.31984296e-03  3.65717561e-02 -1.46002147e-03  2.60672916e-02
  -7.76295902e-02  1.42819964e-01 -5.78882657e-02  8.88275228e-05
  -6.01227529e-03  4.38541440e-02  2.73708990e-04  3.35288397e-03
  -2.77810688e-02  4.60318291e-04]
 [ 4.54299849e-01  3.99142986e-01  2.35076136e-01  3.96136952e-01
   3.29510653e-01  1.04237984e-02  4.20897166e-01  2.49798459e-01
   8.93637190e-02  1.64013704e-01  1.67286863e-01  4.13558945e-01
   1.75480476e-01  4.31321943e-01  2.97122732e-02  2.00977999e-01
   1.60210728e-01  3.38856419e-01  1.29250425e-02  1.86653617e-01
   1.92044382e-01  2.01207009e-02  1.60278587e-01  1.14329229e-02
   2.50601189e-02  3.43704920e-01  1.72189596e-01  4.43404704e-01
   3.53722686e-01  3.30965866e-02]
 [ 7.26438390e-01  8.06274286e-01  4.86621269e-01  6.70054704e-01
   5.74081103e-01  5.56085447e-02  7.62946744e-01  4.06732950e-01
   2.03630890e-01  3.34200326e-01  4.28793400e-01  6.86806677e-01
   3.39252118e-01  7.67125687e-01  8.05907230e-02  5.05392890e-01
   3.79526873e-01  5.61154707e-01  2.25712780e-02  4.32248073e-01
   2.81019759e-01  1.43847117e-01  1.88166354e-01  2.41122918e-02
   6.44215402e-02  5.01391555e-01  2.48282226e-01  7.21868789e-01
   6.18708125e-01  1.09112722e-01]
 [ 1.14430196e-01  3.32483412e-01  6.14609665e-02  3.98638790e-01
   2.38280250e-01  4.47666721e-02  3.70386318e-01  1.56943973e-01
  -4.48693372e-02  2.53068353e-01  1.69090010e-01  4.36377888e-01
   1.93474746e-01  4.53510581e-01  1.01570738e-01  2.75188231e-01
   2.94291190e-01  3.45084058e-01  5.12236008e-03  2.18546578e-01
   6.94532403e-02  4.68230011e-02  7.51438959e-02  6.34173176e-02
   9.61252736e-02  2.85222148e-01  1.19664159e-01  1.25720761e-01
   2.59277421e-01  9.03950354e-02]
 [ 2.88058370e-01  3.03812804e-01  1.99450118e-01  1.55420516e-01
   2.11262547e-01  2.65573576e-02  1.83563674e-01  2.20535146e-01
   1.43914304e-01  9.17437533e-02  6.47602450e-02  1.47915954e-01
   2.51352124e-01  1.72069697e-01  7.58256310e-03  1.63989432e-01
   1.74382007e-02  1.58236675e-01  1.64225561e-03  1.65530666e-01
   3.89096521e-02  3.22221605e-02  5.88510658e-02  1.52274825e-04
   2.27319868e-03  1.08819243e-01  1.65643861e-01  2.88621521e-01
   2.72827422e-01  9.84375373e-02]
 [ 9.40141076e-02  4.36210985e-01  8.63798720e-02  2.28816776e-01
   2.99960206e-01  6.51496851e-02  8.56031711e-02  3.06853771e-01
   6.24451582e-02  4.43259288e-01 -9.20583316e-02  3.01430208e-01
   4.94280184e-01  2.98448455e-01  2.19879497e-01  4.72259197e-01
   5.00616961e-02  3.36038311e-01 -1.99755570e-02  4.71118109e-01
  -2.53260615e-02  1.17042481e-02  1.32364766e-01  1.04075860e-01
   1.29992669e-01  3.04113306e-01  1.89165779e-01  9.19560428e-02
   2.56775068e-01  2.17348900e-01]]
C:\ProgramData\anaconda3\lib\site-packages\numpy\core\fromnumeric.py:2009:
VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences
(which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths
or shapes) is deprecated. If you meant to do this, you must specify
'dtype=object' when creating the ndarray.
  result = asarray(a).shape
An exception
has occurred, use %tb to see the full traceback.
SystemExit:
1
"""
mnist_loader.py------------------------------------------------------------------------------------
"""
mnist_loader
~~~~~~~~~~~~
A library to
load the MNIST image data.  For details
of the data
structures
that are returned, see the doc strings for ``load_data``
and
``load_data_wrapper``.  In practice,
``load_data_wrapper`` is the
function
usually called by our neural network code.
"""
####
Libraries
# Standard
library
import
pickle
import gzip
#
Third-party libraries
import numpy
as np
def
load_data():
    """Return the MNIST data as
a tuple containing the training data,
    the validation data, and the test data.
    The ``training_data`` is returned as a
tuple with two entries.
    The first entry contains the actual
training images.  This is a
    numpy ndarray with 50,000 entries.  Each entry is, in turn, a
    numpy ndarray with 784 values, representing
the 28 * 28 = 784
    pixels in a single MNIST image.
    The second entry in the ``training_data``
tuple is a numpy ndarray
    containing 50,000 entries.  Those entries are just the digit
    values (0...9) for the corresponding images
contained in the first
    entry of the tuple.
    The ``validation_data`` and ``test_data``
are similar, except
    each contains only 10,000 images.
    This is a nice data format, but for use in
neural networks it's
    helpful to modify the format of the
``training_data`` a little.
    That's done in the wrapper function
``load_data_wrapper()``, see
    below.
    """
    with gzip.open('./data/mnist.pkl.gz', 'rb')
as f:
        training_data, validation_data,
test_data = pickle.load(f, encoding='latin1')
    return (training_data, validation_data,
test_data)
def
load_data_wrapper():
    """Return a tuple containing
``(training_data, validation_data,
    test_data)``. Based on ``load_data``, but
the format is more
    convenient for use in our implementation of
neural networks.
    In particular, ``training_data`` is a list
containing 50,000
    2-tuples ``(x, y)``.  ``x`` is a 784-dimensional numpy.ndarray
    containing the input image.  ``y`` is a 10-dimensional
    numpy.ndarray representing the unit vector
corresponding to the
    correct digit for ``x``.
    ``validation_data`` and ``test_data`` are
lists containing 10,000
    2-tuples ``(x, y)``.  In each case, ``x`` is a 784-dimensional
    numpy.ndarry containing the input image,
and ``y`` is the
    corresponding classification, i.e., the
digit values (integers)
    corresponding to ``x``.
    Obviously, this means we're using slightly
different formats for
    the training data and the validation / test
data.  These formats
    turn out to be the most convenient for use
in our neural network
    code."""
    tr_d, va_d, te_d = load_data()
    training_inputs = [np.reshape(x, (784, 1))
for x in tr_d[0]]
    training_results = [vectorized_result(y)
for y in tr_d[1]]
    training_data = list(zip(training_inputs,
training_results))  # Convert zip object
to list
    validation_inputs = [np.reshape(x, (784,
1)) for x in va_d[0]]
    validation_data =
list(zip(validation_inputs, va_d[1]))  #
Convert zip object to list
    test_inputs = [np.reshape(x, (784, 1)) for
x in te_d[0]]
    test_data = list(zip(test_inputs,
te_d[1]))  # Convert zip object to list
    return (training_data, validation_data,
test_data)
def
vectorized_result(j):
    """Return a 10-dimensional
unit vector with a 1.0 in the jth
    position and zeroes elsewhere.  This is used to convert a digit
    (0...9) into a corresponding desired output
from the neural
    network."""
    e = np.zeros((10, 1))
    e[j] = 1.0
    return e
exploreNetwork.py -------------------------------------------------------------------------------
# -*-
coding: utf-8 -*-
"""
Created on
Wed Apr 24 21:51:30 2024
@author: ars
To play and
test the network.py ????????????????
"""
import numpy
as np
"""Return
a 10-dimensional unit vector with a 1.0 in the jth
    position and zeroes elsewhere.  This is used to convert a digit
    (0...9) into a corresponding desired output
from the neural
    network."""
def
vectorized_result(j):
    """Return a 10-dimensional
unit vector with a 1.0 in the jth
    position and zeroes elsewhere.  This is used to convert a digit
    (0...9) into a corresponding desired output
from the neural
    network."""
    e = np.zeros((3, 1))
    e[j] = 1.0
    return e
print(vectorized_result(2))
#%%
a = [1, 2,
3, 4, 5, 6]
print(a[-1:])
print(a[1])
for x, y in
zip(a[:-1], a[1:]):
    print('x=%d y=%d' % (x, y))
#%%
sizes = [3,
2, 1]
biases = [y
for y in sizes[1:]]
print("---------",biases)
weights =
[(x, y) for x, y in zip(sizes[:-1], sizes[1:])]
print("sizes[:-1]=",sizes[:-1],"
sizes[1:]", sizes[1:])
print("--------",weights)
    
#%%
import numpy
as np
# Define the
sigmoid function
def
sigmoid(z):
    return 1 / (1 + np.exp(-z))
class
NeuralNetwork:
    def __init__(self, sizes):
        self.num_layers = len(sizes)
        self.sizes = sizes
        self.biases = [np.random.randn(y, 1)
for y in sizes[1:]]
        self.weights = [np.random.randn(y, x)
for x, y in zip(sizes[:-1], sizes[1:])]
    def feedforward(self, a):
        """Return the output of
the network if ``a`` is input."""
        for b, w in zip(self.biases,
self.weights):
            z = np.dot(w, a) + b
            a = sigmoid(z)
        return a
# Assuming
the example sizes and input data
sizes = [3,
2, 1]
a =
np.array([[0.5], [0.5], [0.5]])
# Create the
neural network
net = NeuralNetwork(sizes)
# Perform
forward propagation
output =
net.feedforward(a)
print("Output
after forward propagation:")
print(output)
#%%
class
NeuralNetwork:
    def __init__(self, sizes):
        self.num_layers = len(sizes)
        self.sizes = sizes
        self.biases = [np.random.randn(y, 1)
for y in sizes[1:]]
        self.weights = [np.random.randn(y, x)
for x, y in zip(sizes[:-1], sizes[1:])]
    def feedforward(self, a):
        """Return the output of
the network if ``a`` is input."""
        print("Input Layer Activation (a):")
        print(a)
        for i, (b, w) in
enumerate(zip(self.biases, self.weights), 1):
            print("\nProcessing
Layer:", i)
            print("Biases (b) for
Layer", i, ":")
            print(b)
            print("Weights (w) for
Layer", i, ":")
            print(w)
            z = np.dot(w, a) + b
            print("Weighted Input (z) for
Layer", i, ":")
            print(z)
            a = sigmoid(z)
            print("Output Activation (a)
after applying activation function for Layer", i, ":")
            print(a)
        return a
# Example
sizes and input data
sizes = [3,
2, 1]
a =
np.array([[0.5], [0.5], [0.5]])
# Create the
neural network
net =
NeuralNetwork(sizes)
# Perform
forward propagation
output =
net.feedforward(a)
print("\nFinal
Output after forward propagation:")
print(output)
"""
runcell(3,
'C:/Users/ars/ARStensorflow/00vbt/anamolyTransformer/convertNumOneOfALL.py')
Input Layer
Activation (a):
[[0.5]
 [0.5]
 [0.5]]
Processing
Layer: 1
Biases (b)
for Layer 1 :
[[-0.34238311]
 [-0.31615907]]
Weights (w)
for Layer 1 :
[[-0.84184229
-0.06860264 -0.35556292]
 [ 0.18949908 
1.41720536  0.52521287]]
Weighted
Input (z) for Layer 1 :
[[-0.97538703]
 [ 0.74979958]]
Output
Activation (a) after applying activation function for Layer 1 :
[[0.27380806]
 [0.67913503]]
Processing
Layer: 2
Biases (b)
for Layer 2 :
[[0.06311896]]
Weights (w)
for Layer 2 :
[[-1.74024052
-1.10110167]]
Weighted
Input (z) for Layer 2 :
[[-1.16116963]]
Output
Activation (a) after applying activation function for Layer 2 :
[[0.23845482]]
Final Output
after forward propagation:
[[0.23845482]]
"""

 
