机器学习

感知器实现

先用表格来表示与门、或门、与非门的真值表,然后代码实现三种逻辑门

P23,2.2.1 真值表

P27,2.2.3

异或门真值表与代码实现:基于两层感知器结构,用代码验证其可行性

P28,2.4.1

P33,2.5.2

激活函数实现

数学表达式(sigmoid、relu与softmax)

P42,3.2

使用Matplotlib绘制函数图像(可视化)

P42,3.2

3.代码实现(5分)

P42,3.2

计算图实现

先在PPT中绘制图形,然后依据计算图写代码:

基础运算层(加、减、乘、除)正向/反向传播(5分)

P130,5.3(计算图)

P135,5.4(代码)

激活函数层实现(5分)

P139,5.5.1(relu)

P141,5.5.2(Sigmoid)

3.全连接层实现(5分) p144,5.6.2

4.Softmax-with-loss层(10分)

P150,5.6.3(Softmax-with-loss的计算图和代码)

P91,4.2.4(cross_entropy_error的代码)

手写数字识别系统设计

网络结构设计(结构图形与训练参数,如64-64-10)

P62,图3-20

损失函数实现(用到的激活函数)

cross_entropy_error

‌数值微分训练神经网络(基于数值微分的手写数字识别)

P110,4.5.1(实现类)

P114,4.5.2(训练代码,从#超参数开始复制)

导入训练集代码:

from sklearn.datasets import load_digits

from sklearn.model_selection import train_test_split

导入数据

mydata = load_digits() x = mydata.data y = mydata.target

将数据集分为训练和测试两类

x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.3)

误差反向训练神经网络(基于误差反向的手写数字识别)

P156,(复制TwoLayerNet类)

需要把t_onehot添加到cross_entropy_error中,改变t的维度

def t_onehot(y,t):
    t_one_hot = np.zeros_like(y)
    for i in range(t_one_hot.shape[0]):
        for j in range(t_one_hot.shape[1]):
            if t[i] == j:
                t_one_hot[i][j] = 1
    return t_one_hot

P160训练代码

5.准确率统计

Accuracy(TwoLayerNet类中实现)

卷积神经网络

输出尺寸计算公式推导:输入特征大小(H,W),卷积核大小(FH,FW),输出大小为(OH,OW),填充为P,步幅为S,计算OH和OW(数学公式)

P208

2.基于LeNet的手写数字识别系统设计

(1)分析LeNet网络结构,包括两个卷积层、两个池化层和三个全连接层

(1)第一层:卷积层

这一层的输入就是原始的图像像素,LeNet-5模型接受的输入层大小为32*32*1。第一个卷积层过滤器的尺寸为5*5,深度为6,不使用全0填充,步长为1。因为没有使用全0填充,所以这一层的输出的尺寸为32-5+1=28,深度为6。这一个卷积层总共有 5*5*1*6+6=156个参数,其中6个为偏置项参数。

(2)第二层:池化层

这一层的输入为第一层的输出,是一个28x28x6的节点矩阵。本层采用的过滤器大小为2x2,长和宽的步长均为2,所以本层的输出矩阵的大小为14*14*6。

(3)第三层:卷积层

本层的输入矩阵大小为14*14*6,使用的过滤器大小为5*5,深度为16。本层不使用全0填充,步长为1。本层的输出矩阵大小为10*10*16。。

(4)第四层:池化层

本层的输入矩阵大小为10*10*16,采用的过滤器大小为2x2,步长为2。本层的输出矩阵大小为5*5*16。

(5)第五层:全连接层

本层的输入矩阵大小为5x5x16,本层的输出节点个数为120

(6)第六层:全连接层

本层的输入节点个数为120个,输出节点个数为84个。

(7)第七层:全连接层

本层的输入节点个数为84个,输出节点个数为10个。

(2)手写数字识别代码实现