ANN MNIST手写数字识别总结

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

由于第十四周除了正常上课外,其余时间在整理机器学习的笔记,做中特社会调查报告,然后就是元旦放假,故第十四周没提交周报。

本周正常上课,继续完成老师都布置的课业任务,总结通信系统仿真结果,并且完成报告的撰写,分析社会调查结果,做好报告,查阅物理层安全方面的资料,翻译和整理论文。其余时间是开始学习深度学习理论和编程实践,人工神经网络(ANN)和卷积神经网络,了解深度学习几个框架(Caffe 、Torch、TensorFlow、MxNet),最主要还是TensorFlow,学习和查找了一下深度学习优化算法,并且利用人工神经网络做手写数字识别。

心得体会:第一个感受是时间过得很快,已然是15周了,要加快各方面进程。神经网络从线性分类器开始,线性分类器是产生一个超平面将两类物体分开。一层神经网络叫做感知器,线性映射加激励输出,每个神经元对输入信号利用激励函数选择输出,就像大脑神经元的兴奋或抑制,增加神经元数量、隐层数量,就可以无限逼近位置函数分布的形态,过多会出现过拟合算法。ANN的学习方法是BP后向传播算法,其主要思想是每一层的带来的预测误差是由前一层造成的,通过链式求导法则将误差对每一层的权重和偏置进行求导更新权重和偏置,以达到最优结果。因为ANN每一层神经元是全连接的,对于图像这种数据就需要非常大数量的参数,所以就出现了卷积神经网路CNN,利用一些神经元以各种模版在图像上滑动做卷积形成几张特征图,每个神经元的滑动窗口值不一样代表其关注点不一样,单个神经元对整张图的窗口权重是一样的即权值共享(这就是减少参数和神经元数量的原因),这么做的依据是像素局部关联性。CNN主要有数据数据输入层、卷积计算层、激励层、池化层(下采样层)、全连接层、Batch Normalization层(可能有)CNN学习方法也是BP算法迭代更新权重w和偏置b。CNN优点是共享卷积核,对高维数据处理无压力,无需手动选取特征,训练好权重,即得特征,深层次的网络抽取,信息丰富,表达效果好,缺点是需要调参,需要大样本量,训练最好要GPU,物理含义不明确。主要采用随机失活的方法解决过拟合问题,因为CNN网络学习能力强,如果样本量小,容易让网络将样本的所有细节记忆下来而不是学习到样本的共性规律,所以随机失活神经元让部分神经元工作就可以缓解过拟合问题。个人觉得深度学习理论不是很难,就是对硬件的要求很高,GPU真是其必备工具。深度学习学习最主要的学习框架觉得是TensorFlow,因为Google大力支持,社区很庞大,就是依赖硬件能力强。

以下是ANN MNIST手写数字识别程序和结果,数据集是经典的Yann LeCun(人工智能界大佬)MNIST数据集,每张照片大小是28 * 28的灰度图,训练集5000张图片,验证集1000张图片,测试集10000张:

构建ANN代码:

import random

import numpy as np #导入numpy计算库

class Network(object):

'''初始化参数'''

def __init__(self, sizes):

"""列表“sizes”包含网络各层中的神经元数量。

例如,如果列表是[2,3,1],那么它将是三层网络,第一层包含2个神经元,第二层3个神经元和第三层1个神经元。

使用均值为0,方差为1的高斯分布随机地初始化网络的偏置和权重。

注意,第一层被假定为输入层,并且按照惯例,我们不会为这些神经元设置任何偏置,因为偏置仅用于计算后一层的输出。"""

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

"""使用小批量随机梯度下降算法训练神经网络。

training_data是表示训练输入和所需输出的元组列表“(x,y)”。

epochs表示迭代次数,mini_batch_size表示批量样本尺寸,eta 表示学习率。

如果提供了`test_data`,那么网络将在每次迭代后利用测试数据对网络进行评估,并打印出部分进度。

这对跟踪进度很有帮助,但却大大降低了速度。"""

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

"""通过反向传播算法应用梯度下降到一个小批量,更新网络的权重和偏置。

“mini_batch”是元组列表“`(x,y)”,“eta”是学习率。"""

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

相关文档
最新文档