神经网络模型实现手写字分类求解思路

《实例》阐述算法，通俗易懂，助您对算法的理解达到一个新高度。包含但不限于：经典算法，机器学习，深度学习，LeetCode 题解，Kaggle 实战。期待您的到来！

01

SGD 的实现原理（包括代码）

02

2.1 手写字分类问题解决步骤

2.2 训练神经网络

2.3 梯度下降求权重参数和偏置量

2.4 代码实现

import random

import numpy as np

classNetwork(object):

def__init__(self, sizes):

"""

biases：隐含层，输出层的偏置量

weights：各个神经元的权重参数，[[15 by 784],[10 by 15]]

"""

self.num_layers = len(sizes)

self.sizes = sizes

for x, y in zip(sizes[:-1], sizes[1:])]

deffeedforward(self, a):

"""

a 是输入

"""

for b, w in zip(self.biases, self.weights):

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

return a

defSGD(self, training_data, epochs, mini_batch_size, eta,

test_data=None):

"""

training_data : [(x,y)]，x 代表训练的输入， y 代表输出

epochs：比如，迭代100次为一波

mini_batch_size：批梯度下降，一次迭代，采用的样本个数，比如为10个样本

eta : 学习率

"""

if test_data: n_test = len(test_data)

n = len(training_data)

for j in range(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 : / ".format(

j, self.evaluate(test_data), n_test))

else:

print ("Epoch complete".format(j))

defupdate_mini_batch(self, mini_batch, eta):

"""

mini_batch：[(x,y)]，x是输入，y是输出

"""

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

defbackprop(self, x, y):

"""

weights：每层神经元的权重参数

"""

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

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

# 前向传播

activation = x

activations = [x]# 分层存储每层的激活节点

zs = []# 分层存储每层的 Z 向量

for b, w in zip(self.biases, self.weights):

z = np.dot(w, activation)+b

zs.append(z)

activation = sigmoid(z)

activations.append(activation)

# 后向传播

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

sigmoid_prime(zs[-1])

nabla_b[-1] = delta

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

# L = 1 表示最后一层神经元， L = 2 倒数第二层神经元

for layer in range(2, self.num_layers):

z = zs[-layer]

sp = sigmoid_prime(z)

delta = np.dot(self.weights[-layer+1].transpose(), delta) * sp

nabla_b[-layer] = delta

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

return (nabla_b, nabla_w)

defevaluate(self, test_data):

"""

"""

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)

defcost_derivative(self, output_activations, y):

"""

"""

return (output_activations-y)

defsigmoid(z):

"""The sigmoid 函数."""

return 1.0/(1.0+np.exp(-z))

defsigmoid_prime(z):

"""sigmoid 函数的导数"""

return sigmoid(z)*(1-sigmoid(z))

03

http://yann.lecun.com/exdb/mnist/

《实例》阐述算法，通俗易懂，助您对算法的理解达到一个新高度。包含但不限于：经典算法，机器学习，深度学习，LeetCode 题解，Kaggle 实战。期待您的到来！

0 条评论

• Python多线程（四）

如何使用线程本地数据 实际案例： 实现了一个web视频监控服务器，服务端采集摄像头数据，客户端使用浏览器通过http请求接收数据，服务器使用推送的方式（mult...

• Python面向对象1：基础介绍＋封装特征

目前有三种编程方式： 面向过程：根据业务逻辑从上到下写垒代码 函数式：将某功能代码封装到函数中，日后便无需重复编写，仅调用函数即可 面向对象：对函数进行分类和封...

• 数据中心机柜系统成功部署的关键要素分析

前言。 随着数据中心变得越来越复杂，对于其信息机房面积(White Space，即设置机柜的高架地板区域)的管理日渐变得越来越重要。故而您企业将必须要对贵公司数...

• 神经网络模型解决分类问题的思考方式

昨天介绍了神经网络的基本模型结构，可分类为前向传播神经网络，循环神经网络（RNN）；介绍了神经网络中，梯度下降的原理推导，以小球下坡作为实例阐述梯度下降；分析了...

• 深度学习|神经网络模型实现手写字分类求解思路

请点击上面公众号，免费订阅。 《实例》阐述算法，通俗易懂，助您对算法的理解达到一个新高度。包含但不限于：经典算法，机器学习，深度学习，LeetCode 题解，...

• Python操作腾讯云CVM

客户有需求在非工作时间将腾讯云CVM停机，工作时间又开起来，停止可以在系统内写定时任务来，但启动需要在腾讯云平台，就需要使用腾讯云的API来进行操作，还好腾讯云...

• DQN 的代码实现

算法来自：Volodymyr Mnih，Playing Atari with Deep Reinforcement Learning

• minigui/mgncs:解决Spinbox字体设置无效问题

版权声明：本文为博主原创文章，转载请注明源地址。 https://blog.csdn.net...