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

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

输出结果


更新……



代码设计


import mnist_loader

import network

training_data, validation_data, test_data = mnist_loader.load_data_wrapper()  

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

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.

   """

   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)

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


相关文章
|
3月前
|
机器学习/深度学习 数据可视化 测试技术
YOLO11实战:新颖的多尺度卷积注意力(MSCA)加在网络不同位置的涨点情况 | 创新点如何在自己数据集上高效涨点,解决不涨点掉点等问题
本文探讨了创新点在自定义数据集上表现不稳定的问题,分析了不同数据集和网络位置对创新效果的影响。通过在YOLO11的不同位置引入MSCAAttention模块,展示了三种不同的改进方案及其效果。实验结果显示,改进方案在mAP50指标上分别提升了至0.788、0.792和0.775。建议多尝试不同配置,找到最适合特定数据集的解决方案。
877 0
|
3月前
|
Docker 容器
docker中创建自定义网络
【10月更文挑战第7天】
73 6
|
3月前
|
安全 NoSQL Redis
Docker自定义网络
Docker自定义网络
45 11
|
3月前
|
Docker 容器
docker中自定义网络
【10月更文挑战第5天】
49 3
|
4月前
|
Shell Linux Docker
自定义Docker网络
这篇文章介绍了如何使用Docker命令自定义网络,并通过创建和配置网络来实现容器间的通信。
46 6
自定义Docker网络
|
4月前
|
机器学习/深度学习 数据采集 数据可视化
深度学习实践:构建并训练卷积神经网络(CNN)对CIFAR-10数据集进行分类
本文详细介绍如何使用PyTorch构建并训练卷积神经网络(CNN)对CIFAR-10数据集进行图像分类。从数据预处理、模型定义到训练过程及结果可视化,文章全面展示了深度学习项目的全流程。通过实际操作,读者可以深入了解CNN在图像分类任务中的应用,并掌握PyTorch的基本使用方法。希望本文为您的深度学习项目提供有价值的参考与启示。
|
5月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
【Tensorflow+Keras】keras实现条件生成对抗网络DCGAN--以Minis和fashion_mnist数据集为例
如何使用TensorFlow和Keras实现条件生成对抗网络(CGAN)并以MNIST和Fashion MNIST数据集为例进行演示。
64 3
|
5月前
|
机器学习/深度学习 安全 网络协议
网络安全公开数据集Maple-IDS,恶意流量检测数据集开放使用!
【8月更文挑战第29天】Maple-IDS 是东北林业大学网络安全实验室发布的网络入侵检测评估数据集,旨在提升异常基础入侵检测和预防系统的性能与可靠性。该数据集包含多种最新攻击类型,如 DDoS 和 N-day 漏洞,覆盖多种服务和网络行为,兼容 CIC-IDS 格式,便于直接使用或生成 csv 文件,适用于多种现代协议。
250 0
|
5月前
|
SQL 网络协议 安全
【Azure API 管理】APIM集成内网虚拟网络后,启用自定义路由管理外出流量经过防火墙(Firewall),遇见APIs加载不出来问题
【Azure API 管理】APIM集成内网虚拟网络后,启用自定义路由管理外出流量经过防火墙(Firewall),遇见APIs加载不出来问题
|
5月前
|
网络协议 微服务
【Azure 微服务】基于已经存在的虚拟网络(VNET)及子网创建新的Service Fabric并且为所有节点配置自定义DNS服务
【Azure 微服务】基于已经存在的虚拟网络(VNET)及子网创建新的Service Fabric并且为所有节点配置自定义DNS服务