# DL之NN：利用(本地数据集50000张数据集)调用自定义神经网络network.py实现手写数字图片识别94%准确率

+关注继续查看

## 代码设计

import network

print("training_data")

print(type(training_data))

print(list(training_data))

print(training_data[0][0].shape)

print(training_data[0][1].shape)

net = network.Network([784, 30, 10])

net.SGD(training_data, 30, 10, 3.0, test_data=test_data)

import random

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."""

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):

a = sigmoid(np.dot(w, a)+b)

return a

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."""

if test_data:

n_test = len(test_data)

n = len(training_data)

for j in xrange(epochs):

random.shuffle(training_data)

mini_batches = [training_data[k:k+mini_batch_size]

for k in xrange(0, n, mini_batch_size)]

for mini_batch in mini_batches:

self.update_mini_batch(mini_batch, eta)

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."""

nabla_b = [np.zeros(b.shape) for b in self.biases]

nabla_w = [np.zeros(w.shape) for w in self.weights]

for x, y in mini_batch:

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)]

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)]

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."""

nabla_b = [np.zeros(b.shape) for b in self.biases]

nabla_w = [np.zeros(w.shape) for w in self.weights]

# feedforward

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)

# backward pass

delta = self.cost_derivative(activations[-1], y) * \

sigmoid_prime(zs[-1])

nabla_b[-1] = delta

nabla_w[-1] = np.dot(delta, activations[-2].transpose())

# 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 xrange(2, self.num_layers):

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())

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)

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))

import pickle as cPickle

import gzip

import numpy as np

"""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.

"""

f = gzip.open('../data/mnist.pkl.gz', 'rb')

training_data, validation_data, test_data = cPickle.load(f,encoding='bytes')  #(f,encoding='bytes')

f.close()

return (training_data, validation_data, test_data)

"""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."""

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 = zip(training_inputs, training_results)

validation_inputs = [np.reshape(x, (784, 1)) for x in va_d[0]]

validation_data = zip(validation_inputs, va_d[1])

test_inputs = [np.reshape(x, (784, 1)) for x in te_d[0]]

test_data = zip(test_inputs, te_d[1])

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

9499 0
Qt之处理QNetworkAccessManager网络连接超时

3817 0
django rest_framework比较完整的自定义实现样例

1480 0

1099 0
[unity3d]网络文件本地存储的四种方式
840 0

9493 0
Netflix开源面向稀疏数据优化的轻量级神经网络库Vectorflow

4174 0
TensorFlow 卷积神经网络手写数字识别数据集介绍

1461 0
+关注

1701

0

《SaaS模式云原生数据仓库应用场景实践》

《看见新力量：二》电子书