Numpy实现神经网络

numpy实现神经网络

参考教程

弱鸡才用tensorflow,强者一个numpy就够:从零开始神经网络第一期_哔哩哔哩_bilibili

实现

模型示意图:

image.png

此处给的模型参数:b0 b1 = 0,w1为图片中的范围

激活函数

tanh

image.png

[!bug] 注意
因为激活函数tanh只有在激活区域为[-2,2]的范围内才不为1,当超过这个范围取值都会无限接近于1,而只有在接近于0的时候值才为0,这样在图片数据集取值为[0,255]的无符号8位整型时,==会造成图片二值化的问题,==,即对于一些似黑似白的像素就会全部变成白色,则会更明显的显示图形,训练会出现问题,所以需要在每个图片数据除以255,

softmax

构建模型

读取数据集

数据集网站:
MNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burges

下载数据集

在文件夹下新建MNIST文件夹,下载数据集并解压

读取数据集函数

[!failure] 特别傻的错误
要直接把文件解压出来,而不是解压成文件夹,这个是直接读取的文件,而不是文件夹
image.png

读取头部数据

  • struct.unpack('>4i', train_f.read(16)):这是一行代码,它执行以下操作:
    • train_f.read(16):从打开的二进制文件对象train_f中读取16个字节的数据。这表示它尝试读取16个字节的二进制数据。
    • struct.unpack('>4i', ...):使用struct模块的unpack函数来解析读取的二进制数据。具体解释如下:
      • '>4i':这是格式字符串,指定了如何解析数据。在这里:
        • >:表示使用大端字节序(big-endian),即高位字节在前,低位字节在后。
        • 4i:表示要解析的数据包含4个整数(i表示整数)。因此,struct.unpack会尝试将16个字节的数据解析为4个整数。

把数据集分为训练集和验证集

==防止过拟合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#把训练集分为两个部分
train_num = 50000
valid_num = 10000
test_num = 10000
# 首先解析文件头部的4个整数,然后将剩余的数据解释为一个包含图像像素值的NumPy数组
with open(train_img_path,'rb') as f:
struct.unpack('>4i',f.read(16))
tmp_img = np.fromfile(f,dtype=np.uint8).reshape(-1,28*28)
train_img = tmp_img[:train_num]
valid_img = tmp_img[train_num:]
with open(test_img_path,'rb') as f:
struct.unpack('>4i',f.read(16))
test_img = np.fromfile(f,dtype=np.uint8).reshape(-1,28*28)
with open(train_lab_path,'rb') as f:
struct.unpack('>2i',f.read(8))
tmp_lab = np.fromfile(f,dtype=np.uint8)
train_lab = tmp_lab[:train_num]
valid_lab = tmp_lab[train_num:]
with open(test_lab_path,'rb') as f:
struct.unpack('>2i',f.read(8))
test_lab = np.fromfile(f,dtype=np.uint8)

训练

损失函数

image.png