用numpy
实现最简单的前馈神经网络——正向网络建立篇
根据上一篇文章,来构建神经网络吧
- 明确输入和输出
- 选择合适的各种函数
- 用矩阵和激活函数建立起从输入到输出的拟合函数
- 用正向传播或反向传播获得损失函数的偏导数(注意对一定的数据集来说自变量为 W \bold{W} W, A \bold{A} A固定)
- 用梯度下降法努力使损失函数最小
mnist分析(输入分析)
下载
在这里下载mnist数据集
关于mnist的详细说明在其他人的文章里有
说明
images
前16个字节包含了数据的说明,之后的所有字节以 784 784 784字节为一组,是一个个 28 × 28 28\times28 28×28像素的图像,像素为一字节的灰度像素
labels
前8个字节包含了数据的说明,之后的所有字节以 1 1 1字节为一组,是一个个对应着images
中图像的数字
加载
以下函数的关键点在于np.fromfile()
以及dtype, offset
参数
import numpy as np
from os import listdir
from typing import Dict, NoReturn
S = 784 # area of image
C = 28 # edge length of image
def load_data(dir_path: str) -> Dict[str, np.ndarray]:
"""
加载图像和标签
load images and labels
:param dir_path: directory that contains training files and test files
"""
resource = {
}
file_names = listdir(dir_path)
for file_name in file_names:
full_path = path.join(dir_path, file_name)
name, _ = path.splitext(file_name)
if "images" in name:
images = np.fromfile(full_path, dtype=np.uint8, offset=16)
resource[name] = images.reshape(images.size // S, S)
elif "labels" in name:
labels = np.fromfile(full_path, dtype=np.uint8, offset=8)
resource[name] = labels
return resource
# images.shape == (60000, 784)
# labels.shape == (10000, )
显示
from PIL import Image
def display_images(resource, row: int, column: int,
interval: slice = slice(None, None, None)) -