编程作业3.2:前馈神经网络

摘要:
在本练习中,您将使用前馈神经网络来识别手写数字。以前,我们使用logistic回归进行多元分类,这次我们使用前馈神经网络进行预测。神经网络可以实现非常复杂的非线性模型。首先选择网络框架用于编程实现。这里,框架在作业中给出,即包括输入层、隐藏层和输出层的三层框架。所以我们可以读取强大的神经网络。参考Wu Enda |机器学习任务3.1前馈神经网络Wu EndaPython机器学习任务的实现(3):多类别分类和前馈神经网

题目

  • 上周使用了多类logistic回归,然而logistic回归不能形成更复杂的假设,因为它只是一个线性分类器。
  • 在本次练习中,将使用前馈神经网络来识别手写数字(从0到9)。数据依然是MNIST手写体数据集,这里包含了5000个训练样本。
  • 之前用了逻辑回归进行多元分类,这次用前馈神经网络进行预测。神经网络可以实现非常复杂的非线性的模型。我们将利用已经训练好了的权重进行预测。

编程实现

  • 首先选择网络框架,这里作业中给出了框架,即包含输入层、隐藏层和输出层的3层框架。
  • 由于x的维度是5000乘400,即有400个特征,因此输入层的神经元数量为400(不包含偏置单元,即常数项1),隐藏层的神经元数量作业中给出为25(不包含偏置单元),输出层的神经元数量由分类的类数所决定,因此是10。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.io import loadmat

def load_weight(path):
    data = loadmat(path)
    return data['Theta1'], data['Theta2']

theta1, theta2 = load_weight('D:BaiduNetdiskDownloaddata_setsex3weights.mat')

theta1.shape, theta2.shape

编程作业3.2:前馈神经网络第1张

def load_data(path):
    data = loadmat(path)
    X = data['X']
    y = data['y']
    return X,y

X, y = load_data('D:BaiduNetdiskDownloaddata_setsex3data1.mat')

y = y.flatten() # 这里消除了一个维度,方便后面的计算 (5000,)
X = np.insert(X, 0, values=np.ones(X.shape[0]), axis=1)  # 为X添加了一列常数项 1,(5000, 401)

X.shape, y.shape

编程作业3.2:前馈神经网络第2张

a1 = X
z2 = a1 @ theta1.T
z2.shape

编程作业3.2:前馈神经网络第3张

def sigmoid(z):
    return 1 / (1 + np.exp(-z))

a2 = sigmoid(z2)
a2.shape

编程作业3.2:前馈神经网络第4张

a2 = np.insert(a2, 0, 1, axis=1) #  为a2 添加了一列常数项1(偏置单元),(5000, 26)
a2.shape

编程作业3.2:前馈神经网络第5张

z3 = a2 @ theta2.T
a3 = sigmoid(z3)
a3.shape

编程作业3.2:前馈神经网络第6张


# np.argmax返回array中数值最大数的下标,默认将输入array视作一维,出现相同的最大,返回第一次出现的。
y_pred = np.argmax(a3, axis=1) + 1  #  np.argmax(a, axis=None, out=None),a—-输入array,axis—-为0代表列方向,为1代表行方向,out—-结果写到这个array里面。y_pred.shape  (5000,)

accuracy = np.mean(y_pred == y)
print ('accuracy = {0}%'.format(accuracy * 100))  # accuracy = 97.52%

编程作业3.2:前馈神经网络第7张

前馈函数时大概流程:

编程作业3.2:前馈神经网络第8张

总结

  • 在解决非线性假设问题中,当特征很多时如果还是利用logistic回归,那多项式的特征数目将会以初始特征数目的指数级速度产生,这样会造成算法运算量过大,甚至过拟合。
  • 神经网络在解决非线性假设问题特征数很大的情况下一种非常好的算法。在数学上已经证明,只需一个包含足够多神经元的隐层,多层前馈网络就可以以任意精度逼近任意复杂度的连续函数。因此可以看书神经网络之强大。
  • 类似于神经元细胞体,通过类似于树突的输入通道传递给神经元信息让它工作,再通过类似于轴突的输出通道输出结果。
    • h在这里称为激活函数(activation function)(指代非线性函数(g(z)=frac{1}{1+e^{-z}})的另一个术语)
    • 称逻辑单元(logistic unit)是一个带激活函数的人工神经元(artificial neuron)。
    • 在激活函数中的参数又叫模型的权重
  • 第一层叫输入层(input layer),在这一层输入特征;最后一层叫输出层(output layer)输出最后的结果;中间层叫隐层(hidden layer)看不到输入或者输出的值。
  • 此外有时还可以设置一个值为1的偏置单元(bias unit)。

参考资料

吴恩达|机器学习作业3.1前馈神经网络

吴恩达机器学习作业Python实现(三):多类分类和前馈神经网络

免责声明:文章转载自《编程作业3.2:前馈神经网络》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇raid5硬盘硬件修复;条带分析方法;阵列重组向QTP脚本中添加步骤下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

G2使用中的一些坑:自定义图例、混合图形、label 默认隐藏等问题

一、自定义图例 legend 一般自定义图例较多的使用在混合图形里,以 G2 官网的这个 chart 为例,通过定制 legend 来显示自己定义的图例。 注意:legend 的配置项里一定要设置 custom: true ,自己在写的时候过多关注多个图形叠加使用,没有注意设置 custom,结果图表显示一直有问题,图例也显示不出来,折腾到怀疑人生。 二...

matlab绘图方法汇总

Matlab画图 强大的画图功能是Matlab的特点之中的一个,Matlab提供了一系列的画图函数,用户不须要过多的考虑画图的细节,仅仅须要给出一些基本參数就能得到所需图形,这类函数称为高层画图函数。此外,Matlab还提供了直接对图形句柄进行操作的低层画图操作。这类操作将图形的每个图形元素(如坐标轴、曲线、文字等)看做一个独立的对象,系统给每个对象分配一...

matlab函数——shading函数

函数说明: 是阴影函数控制曲面和图形对象的颜色着色,即用来处理色彩效果的,包括以下三种形式: shading faceted:默认模式,在曲面或图形对象上叠加黑色的网格线; shading flat:是在shading faceted的基础上去掉图上的网格线; shading interp:对曲面或图形对象的颜色着色进行色彩的插值处理,使色彩平滑过渡 ;...

《Graph Neural Networks: A Review of Methods and Applications》阅读笔记

本文是对文献 《Graph Neural Networks: A Review of Methods and Applications》 的内容总结,详细内容请参照原文。 引言 大量的学习任务都要求能处理包含丰富的元素间关联关系的图数据,例如物理系统建模、疾病分类以及文本和图像等非结构数据的学习等。图形神经网络(GNNs)是一种连接模型,通过图形节点之间的...

数字识别,神经网络

来源:https://www.numpy.org.cn/deep/basics/fit_a_line.html 数字识别 本教程源代码目录在book/recognize_digits,初次使用请您参考Book文档使用说明。 #说明: 硬件环境要求: 本文可支持在CPU、GPU下运行 Docker镜像支持的CUDA/cuDNN版本: 如果使用了Docke...

MATLAB绘图

Matlab绘图 强大的绘图功能是Matlab的特点之一,Matlab提供了一系列的绘图函数,用户不需要过多的考虑绘图的细节,只需要给出一些基本参数就能得到所需图形,这类函数称为高层绘图函数。此外,Matlab还提供了直接对图形句柄进行操作的低层绘图操作。这类操作将图形的每个图形元素(如坐标轴、曲线、文字等)看做一个独立的对象,系统给每个对象分配一个句柄,...