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


宝贝烂漫
宝贝烂漫 2022-09-20 10:08:28 48937
分类专栏: 资讯

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

目录

输出结果

代码设计


输出结果

更新……

代码设计

  1. import mnist_loader
  2. import network
  3. training_data, validation_data, test_data = mnist_loader.load_data_wrapper()
  4. print("training_data")
  5. print(type(training_data))
  6. print(list(training_data))
  7. print(training_data[0][0].shape)
  8. print(training_data[0][1].shape)
  9. net = network.Network([784, 30, 10])
  10. net.SGD(training_data, 30, 10, 3.0, test_data=test_data)
  1. import random
  2. import numpy as np
  3. class Network(object):
  4. def __init__(self, sizes):
  5. """The list ``sizes`` contains the number of neurons in the
  6. respective layers of the network. For example, if the list
  7. was [2, 3, 1] then it would be a three-layer network, with the
  8. first layer containing 2 neurons, the second layer 3 neurons,
  9. and the third layer 1 neuron. The biases and weights for the
  10. network are initialized randomly, using a Gaussian
  11. distribution with mean 0, and variance 1. Note that the first
  12. layer is assumed to be an input layer, and by convention we
  13. won't set any biases for those neurons, since biases are only
  14. ever used in computing the outputs from later layers."""
  15. self.num_layers = len(sizes)
  16. self.sizes = sizes
  17. self.biases = [np.random.randn(y, 1) for y in sizes[1:]]
  18. self.weights = [np.random.randn(y, x) for x, y in zip(sizes[:-1], sizes[1:])]
  19. def feedforward(self, a):
  20. """Return the output of the network if ``a`` is input."""
  21. for b, w in zip(self.biases, self.weights):
  22. a = sigmoid(np.dot(w, a)+b)
  23. return a
  24. def SGD(self, training_data, epochs, mini_batch_size, eta, test_data=None):
  25. """Train the neural network using mini-batch stochastic
  26. gradient descent. The ``training_data`` is a list of tuples
  27. ``(x, y)`` representing the training inputs and the desired
  28. outputs. The other non-optional parameters are
  29. self-explanatory. If ``test_data`` is provided then the
  30. network will be evaluated against the test data after each
  31. epoch, and partial progress printed out. This is useful for
  32. tracking progress, but slows things down substantially."""
  33. if test_data:
  34. n_test = len(test_data)
  35. n = len(training_data)
  36. for j in xrange(epochs):
  37. random.shuffle(training_data)
  38. mini_batches = [training_data[k:k+mini_batch_size]
  39. for k in xrange(0, n, mini_batch_size)]
  40. for mini_batch in mini_batches:
  41. self.update_mini_batch(mini_batch, eta)
  42. if test_data:
  43. print ("Epoch {0}: {1} / {2}".format(j, self.evaluate(test_data), n_test))
  44. else:
  45. print ("Epoch {0} complete".format(j))
  46. def update_mini_batch(self, mini_batch, eta):
  47. """Update the network's weights and biases by applying
  48. gradient descent using backpropagation to a single mini batch.
  49. The ``mini_batch`` is a list of tuples ``(x, y)``, and ``eta``
  50. is the learning rate."""
  51. nabla_b = [np.zeros(b.shape) for b in self.biases]
  52. nabla_w = [np.zeros(w.shape) for w in self.weights]
  53. for x, y in mini_batch:
  54. delta_nabla_b, delta_nabla_w = self.backprop(x, y)
  55. nabla_b = [nb+dnb for nb, dnb in zip(nabla_b, delta_nabla_b)]
  56. nabla_w = [nw+dnw for nw, dnw in zip(nabla_w, delta_nabla_w)]
  57. self.weights = [w-(eta/len(mini_batch))*nw for w, nw in zip(self.weights, nabla_w)]
  58. self.biases = [b-(eta/len(mini_batch))*nb for b, nb in zip(self.biases, nabla_b)]
  59. def backprop(self, x, y):
  60. """Return a tuple ``(nabla_b, nabla_w)`` representing the
  61. gradient for the cost function C_x. ``nabla_b`` and
  62. ``nabla_w`` are layer-by-layer lists of numpy arrays, similar
  63. to ``self.biases`` and ``self.weights``."""
  64. nabla_b = [np.zeros(b.shape) for b in self.biases]
  65. nabla_w = [np.zeros(w.shape) for w in self.weights]
  66. feedforward
  67. activation = x
  68. activations = [x] list to store all the activations, layer by layer
  69. zs = [] list to store all the z vectors, layer by layer
  70. for b, w in zip(self.biases, self.weights):
  71. z = np.dot(w, activation)+b
  72. zs.append(z)
  73. activation = sigmoid(z)
  74. activations.append(activation)
  75. backward pass
  76. delta = self.cost_derivative(activations[-1], y) * \
  77. sigmoid_prime(zs[-1])
  78. nabla_b[-1] = delta
  79. nabla_w[-1] = np.dot(delta, activations[-2].transpose())
  80. Note that the variable l in the loop below is used a little
  81. differently to the notation in Chapter 2 of the book. Here,
  82. l = 1 means the last layer of neurons, l = 2 is the
  83. second-last layer, and so on. It's a renumbering of the
  84. scheme in the book, used here to take advantage of the fact
  85. that Python can use negative indices in lists.
  86. for l in xrange(2, self.num_layers):
  87. z = zs[-l]
  88. sp = sigmoid_prime(z)
  89. delta = np.dot(self.weights[-l+1].transpose(), delta) * sp
  90. nabla_b[-l] = delta
  91. nabla_w[-l] = np.dot(delta, activations[-l-1].transpose())
  92. return (nabla_b, nabla_w)
  93. def evaluate(self, test_data):评估,
  94. """Return the number of test inputs for which the neural
  95. network outputs the correct result. Note that the neural
  96. network's output is assumed to be the index of whichever
  97. neuron in the final layer has the highest activation."""
  98. test_results = [(np.argmax(self.feedforward(x)), y)
  99. for (x, y) in test_data]
  100. return sum(int(x == y) for (x, y) in test_results)
  101. def cost_derivative(self, output_activations, y):
  102. """Return the vector of partial derivatives \partial C_x /
  103. \partial a for the output activations."""
  104. return (output_activations-y)
  105. def sigmoid(z):
  106. """The sigmoid function."""
  107. return 1.0/(1.0+np.exp(-z))
  108. def sigmoid_prime(z):
  109. """Derivative of the sigmoid function."""
  110. return sigmoid(z)*(1-sigmoid(z))
  1. import pickle as cPickle
  2. import gzip
  3. import numpy as np
  4. def load_data():
  5. """Return the MNIST data as a tuple containing the training data,
  6. the validation data, and the test data.
  7. The ``training_data`` is returned as a tuple with two entries.
  8. The first entry contains the actual training images. This is a
  9. numpy ndarray with 50,000 entries. Each entry is, in turn, a
  10. numpy ndarray with 784 values, representing the 28 * 28 = 784
  11. pixels in a single MNIST image.
  12. The second entry in the ``training_data`` tuple is a numpy ndarray
  13. containing 50,000 entries. Those entries are just the digit
  14. values (0...9) for the corresponding images contained in the first
  15. entry of the tuple.
  16. The ``validation_data`` and ``test_data`` are similar, except
  17. each contains only 10,000 images.
  18. This is a nice data format, but for use in neural networks it's
  19. helpful to modify the format of the ``training_data`` a little.
  20. That's done in the wrapper function ``load_data_wrapper()``, see
  21. below.
  22. """
  23. f = gzip.open('../data/mnist.pkl.gz', 'rb')
  24. training_data, validation_data, test_data = cPickle.load(f,encoding='bytes') (f,encoding='bytes')
  25. f.close()
  26. return (training_data, validation_data, test_data)
  27. def load_data_wrapper():
  28. """Return a tuple containing ``(training_data, validation_data,
  29. test_data)``. Based on ``load_data``, but the format is more
  30. convenient for use in our implementation of neural networks.
  31. In particular, ``training_data`` is a list containing 50,000
  32. 2-tuples ``(x, y)``. ``x`` is a 784-dimensional numpy.ndarray
  33. containing the input image. ``y`` is a 10-dimensional
  34. numpy.ndarray representing the unit vector corresponding to the
  35. correct digit for ``x``.
  36. ``validation_data`` and ``test_data`` are lists containing 10,000
  37. 2-tuples ``(x, y)``. In each case, ``x`` is a 784-dimensional
  38. numpy.ndarry containing the input image, and ``y`` is the
  39. corresponding classification, i.e., the digit values (integers)
  40. corresponding to ``x``.
  41. Obviously, this means we're using slightly different formats for
  42. the training data and the validation / test data. These formats
  43. turn out to be the most convenient for use in our neural network
  44. code."""
  45. tr_d, va_d, te_d = load_data()
  46. training_inputs = [np.reshape(x, (784, 1)) for x in tr_d[0]]
  47. training_results = [vectorized_result(y) for y in tr_d[1]]
  48. training_data = zip(training_inputs, training_results)
  49. validation_inputs = [np.reshape(x, (784, 1)) for x in va_d[0]]
  50. validation_data = zip(validation_inputs, va_d[1])
  51. test_inputs = [np.reshape(x, (784, 1)) for x in te_d[0]]
  52. test_data = zip(test_inputs, te_d[1])
  53. return (training_data, validation_data, test_data)
  54. def vectorized_result(j):
  55. """Return a 10-dimensional unit vector with a 1.0 in the jth
  56. position and zeroes elsewhere. This is used to convert a digit
  57. (0...9) into a corresponding desired output from the neural
  58. network."""
  59. e = np.zeros((10, 1))
  60. e[j] = 1.0
  61. return e

 

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

网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。

本文链接:https://www.xckfsq.com/news/show.html?id=4047
赞同 0
评论 0 条
宝贝烂漫L1
粉丝 0 发表 8 + 关注 私信
上周热门
如何使用 StarRocks 管理和优化数据湖中的数据?  2944
【软件正版化】软件正版化工作要点  2863
统信UOS试玩黑神话:悟空  2823
信刻光盘安全隔离与信息交换系统  2718
镜舟科技与中启乘数科技达成战略合作,共筑数据服务新生态  1251
grub引导程序无法找到指定设备和分区  1217
华为全联接大会2024丨软通动力分论坛精彩议程抢先看!  163
点击报名 | 京东2025校招进校行程预告  162
2024海洋能源产业融合发展论坛暨博览会同期活动-海洋能源与数字化智能化论坛成功举办  160
华为纯血鸿蒙正式版9月底见!但Mate 70的内情还得接着挖...  157
本周热议
我的信创开放社区兼职赚钱历程 40
今天你签到了吗? 27
信创开放社区邀请他人注册的具体步骤如下 15
如何玩转信创开放社区—从小白进阶到专家 15
方德桌面操作系统 14
我有15积分有什么用? 13
用抖音玩法闯信创开放社区——用平台宣传企业产品服务 13
如何让你先人一步获得悬赏问题信息?(创作者必看) 12
2024中国信创产业发展大会暨中国信息科技创新与应用博览会 9
中央国家机关政府采购中心:应当将CPU、操作系统符合安全可靠测评要求纳入采购需求 8

加入交流群

请使用微信扫一扫!