手写数字识别mnist,手动完成,不利用框架

本文是作者个人学习过程的记录,主要介绍了如何不依赖框架,手动完成MNIST手写数字识别的训练样本获取及识别过程。
摘要由CSDN通过智能技术生成

个人学习,仅供参考

获取训练样本

# -*- coding: utf-8 -*-
import os
import math
import gzip
import pickle
import requests
import numpy as np

url_base = 'http://yann.lecun.com/exdb/mnist_learn/'
key_file = {
    'train_img': 'train-images-idx3-ubyte.gz',
    'train_label': 'train-labels-idx1-ubyte.gz',
    'test_img': 't10k-images-idx3-ubyte.gz',
    'test_label': 't10k-labels-idx1-ubyte.gz',
}

dataset_dir = os.path.dirname(os.path.abspath(__file__))
save_file = dataset_dir + '/mnist.pkl'

train_num = 60000
test_num = 10000
img_size = 784


def down_data():
    for value in key_file.values():
        file_name = dataset_dir + '/' + value
        if os.path.exists(file_name):
            continue
        context = requests.get(url_base + '/' + value)
        with open(file_name, 'wb') as f:
            f.write(context.content)


def load_data(file_name):
    file_path = dataset_dir + '/' + file_name
    print('transform ' + file_name + 'to NumPy Array ')

    with gzip.open(file_path, 'rb') as f:
        # 将缓存中的数据解释为numpy数组,offset设置偏移量
        data = np.frombuffer(f.read(), np.uint8, offset=8)
        print("Well Done")

    return data


def reload_data_pkl():
    data = {
        'train_img': load_data(key_file['train_img']),
        'train_label': load_data(key_file['train_label']),
        'test_img': load_data(key_file['test_img']),
        'test_label': load_data(key_file['test_label'])
    }

    with open('mnist.pkl', 'wb') as f:
        # 参数-1,选择最新版本的协议,对大型数据进行了存储优化,可以使用4代替
        pickle.dump(data, f, -1)


def convert_to_one_hot(Y, C):
    """

    :param Y: 索引,Y的大小为6000*1,标记
    :param C: 对角矩阵的大小
    :return:Y:10*6000
    """
    # eye返回对角矩阵
    # 将标记矩阵Y返回
    Y = np.eye(C)[Y.reshape(-1)].T
    return Y


def random_mini_batches(x, y, mini_batch_size=64, seed=0):
    np.random.seed(seed)
    m = x.shape[1]
    mini_batches = []
    permutation = lis
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
利用CNN(卷积神经网络)可以实现手写数字识别。首先,我们需要一个包含手写数字图像和对应标签的数据集,例如MNIST数据集。然后,我们可以使用Python编程语言和深度学习框架,如Tensorflow或Keras来构建CNN模型。 首先,我们通过卷积层提取图像的特征。卷积层使用滤波器来对图像进行卷积运算,以便捕捉不同特征,如边缘、纹理等。接着,我们使用激活函数(如ReLU)对卷积输出进行非线性变换以增强模型的表达能力。池化层会对卷积层输出进行降采样,减少输入参数的数量,并保持特征的空间信息。重复连续的卷积层和池化层,可以提取出越来越抽象的特征。 然后,通过全连接层将特征映射到目标类别。全连接层将卷积层的输出展平成一维向量,并通过全连接的神经元进行分类。最后,通过softmax函数对输出进行归一化得到每个类别的概率。 接下来是模型的训练阶段。我们使用交叉熵作为损失函数来度量模型输出与真实标签之间的差异。优化算法,如随机梯度下降,用于更新网络参数,以最小化损失函数。我们将数据集分成训练集和验证集,用训练集来训练模型,并使用验证集来选择模型的最佳参数设置。 在模型训练完成后,我们可以使用测试集来评估模型的性能。我们将输入手写数字图像传递给训练好的CNN模型,以获得对该图像的预测结果。最终,我们可以将预测结果与真实标签进行比较,以计算模型的准确率。 利用CNN网络实现手写数字识别具有较高的准确性和稳定性。CNN是一种强大的深度学习模型,因为它能够自动学习图像中的特征,而无需手动设计特征提取器。这使得CNN成为处理图像任务的首选模型之一。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值