numpy简单神经网络学习mnist

本文介绍了如何使用numpy构建最简单的前馈神经网络,针对MNIST数据集进行分析和训练。通过理解输入和输出,选择合适的激活函数,以及利用梯度下降法优化损失函数,实现了神经网络的初步构建。虽然正向传播计算梯度较慢,但反向传播将显著提高训练效率。
摘要由CSDN通过智能技术生成

numpy实现最简单的前馈神经网络——正向网络建立篇

根据上一篇文章,来构建神经网络吧

  1. 明确输入和输出
  2. 选择合适的各种函数
  3. 矩阵激活函数建立起从输入到输出的拟合函数
  4. 正向传播或反向传播获得损失函数的偏导数(注意对一定的数据集来说自变量为 W \bold{W} W A \bold{A} A固定)
  5. 梯度下降法努力使损失函数最小

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)) -
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值