使用Logistic Regression方法对MNIST 数据集进行数字识别

使用 Logistic Regression 识别手写数字-PyTorch 现在,我们将了解如何在 PyTorch 中实现这一点,PyTorch 是由 Facebook 开发的一个非常流行的深度学习库。假设您正确执行了所有步骤,您将获得 82% 的准确率,这与当今使用特殊类型的神经网络架构的最先进的模型相去甚远。在这里,我们将使用交叉熵损失,对于优化器,我们将使用学习率为 0.001 的随机梯度下降算法,如上面的超参数中所定义。在我们编写的代码中,softmax 是在每次前向传递期间在内部计算的,因此我们不需要在 forward() 函数中指定它。现在,我们将定义我们的超参数。 阅读详情

使用Logistic Regression方法对MNIST 数据集进行数字识别

问题描述

请设计下述算法,求解 MNIST 数据集上的Logistic Regression问题:

  1. 梯度下降法
  2. 随机梯度法

对于每种算法,请给出每步计算结果与最优解的距离以及每步计算结果在测试集上所对应的分类精度。此外,请讨论随机梯度法中Mini Batch大小对计算结果的影响。可参考:
http://deeplearning.net/tutorial/logreg.html

任务描述

MINIST数据集:

MNIST数据集由Yann LeCun搜集,是一个大型的手写体数字数据库,通常用于训练各种图像处理系统,也被广泛用于机器学习领域的训练和测试,是简单的灰色图像手写数字数据集。MNIST 是一个经典的手写数字数据集,其原始数据集包含 60000 个训练数据和 10000 个测试数据。每个数据的样本特征为 28×28 像素的灰度图(784 维向量),表示一个手写数字;标签为 0~9 中的一个数字。

任务分析:

读取数据后分析数据,并建立相关的预测模型,该模型读取一个样本数据后输出预测的标签。模型通过训练数据进行训练,并在测试数据上进行测试。训练期间采用梯度下降法、随机梯度法以及不同大小的mini batch进行训练,通过调整不同的参数达到较为理想的预测准确度,并根据实验结果分析不同算法的特征。

准备工作:数据读取与分析

首先下载对应的数据集到代码同一文件夹:

数据下载地址: http://yann.lecun.com/exdb/mnist/

将4个gz文件下载并移动到代码同一文件夹,在该网站可以看到该数据集的详细介绍,重点如下:

train-images-idx3-ubyte:训练集图像
train-labels-idx1-ubyte:训练集标签
t10k-images-idx3-ubyte:测试集图像
t10k-labels-idx1-ubyte:测试集标签 

数据下载的网站里有数据的简单介绍,idx3和idx1数据略有不同,故读取时需要分类考虑:

# -*- coding: utf-8 -*-
"""
Created on Mon Dec 16 10:22:12 2019
@author: Ding
"""
import numpy as np
import matplotlib.pyplot as plt
import gzip as gz
#--------------------读取数据----------
#filename为文件名,kind为'data'或'lable'
def load_data(filename,kind):
    with gz.open(filename, 'rb') as fo:
        buf = fo.read()
        index=0
        if kind=='data':
        #因为数据结构中前4行的数据类型都是32位整型,所以采用i格式,需要读取前4行数据,所以需要4个i
            header = np.frombuffer(buf, '>i', 4, index)
            index += header.size * header.itemsize
            data = np.frombuffer(buf, '>B', header[1] * header[2] * header[3], index).reshape(header[1], -1)
        elif kind=='lable':
        #因为数据结构中前2行的数据类型都是32位整型,所以采用i格式,需要读取前2行数据,所以需要2个i
            header=np.frombuffer(buf,'>i',2,0)
            index+=header.size*header.itemsize
            data = np.frombuffer(buf, '>B', header[1], index)
    return data
#--------------------加载数据-------------------                
X_train = load_data('train-images-idx3-ubyte.gz','data')  # 训练数据集的样本特征
y_train = load_data('train-labels-idx1-ubyte.gz','lable')  # 训练数据集的标签
X_test = load_data('t10k-images-idx3-ubyte.gz','data')  # 测试数据集的样本特征
y_test = load_data('t10k-labels-idx1-ubyte.gz','lable')  # 测试数据集的标签
#---------查看数据的格式-------------
print('Train data shape:')
print(X_train.shape, y_train.shape)
print('Test data shape:')
print(X_test.shape, y_test.shape)
#--------------查看几个数据-----------
index_1 = 1024
plt.imshow(np.reshape(X_train[index_1], (28, 28)), cmap='gray')
plt.title('Index:{}'.format(index_1))
plt.show()
print('Label: {}'.format(y_train[index_1]))

index_2=2048
plt.imshow(np.reshape(X_train[index_2], (28, 28)), cmap='gray')
plt.title('Index:{}'.format(index_2))
plt.show()
print('Label: {}'.format(y_train[index_2]))

读取数据后存储在x_train,y_train,x_test,y_test中,查看了其中的两个数据,看一下数据的情况:

所以可以看出train数据中有60000个,test数据中有10000,data中数据为手写数字图像,在示例中我们可以看到图像还是较易识别的。

建立Logistic Regression模型

该问题是一个多分类问题,因此使用Logistic Regression时激活函数选用Softmax函数:
S i ( x ) = e x i ∑ j e x j S_i(x)=\dfrac{e^{x_i}}{\sum_{j} e^{x_j}} Si​(x)=∑j​exj​exi​​该函数可以将输入映射为 0 − 1 0-1 0−1之间的实数,同时具有归一化的特征,因此与概率可以对应,易与分类任务对应。
故根据这个思路,建立Logistic Regression模型。
定义损失函数:

在使用softmax函数时,我们普遍采用交叉熵作为损失函数:
L = − ∑ i K p ( x i ) l o g ( q ( x i ) ) L =-\sum_i^K p(x_i)log(q(x_i)) L=−i∑K​p(xi​)log(q(xi​))其中 p p p 表示期望的概率分布, q q q 表示实际的概率分布, L L L 表示交叉熵。

交叉熵刻画的是实际输出概率和期望输出概率的距离,交叉熵的值越小,则两个概率分布越接近,即实际与期望差距越小 。交叉熵可以反映出隐藏在输出结果背后的更深的错误率表现出来。

因此,在softmax模型中,用交叉熵函数表示的损失函数为:
J = − ∑ i = 1 K y i l o g ( p i ) J=-\sum_{i=1}^Ky_ilog(p_i) J=−i=1∑

sklearn之分类算法与手写数字识别 sklearn之分类算法与手写数字识别 sklearn是Python的一个机器学习的库,它有比较完整的监督学习与非监督学习的模型。本文将使用sklearn库里的分类模型来对手写数字(MNIST)做分类实践。 数据获取 数据读取与存储形式 sklearn分类模型 代码实现与结果 数据获取 MNIST 数据集来自美国国家标准与技术研究所, National Institute of... 阅读详情

相关推荐

利用简单逻辑回归(Logistic Regression)学习MNIST手写数字集

一动机:想学习深度学习算法,之前已经看过Andrew NG的课程,听完之后感觉原理也不是很难,于是萌生了上手试一把的冲动,最开始用了TensorFlow,感觉很神奇的几段代码就达成了,然而用TensorFlow感觉还是很黑盒的感觉,还是想用Python手动撸一把,于是就上手试一下。 二方法:基本原理其实不是很复杂,照着线性回归,改成sigmoid的函数就可以了,超过两个用softmax,Cost...

spiderman888的专栏 4426

Deep Learning(Logistic Regression)学习之MNIST C++实现

DeepLearning Logistic Regression的MNIST例子的C++实现

puretech_的专栏 1万+

scikit-learn/logistic regression识别mnist

逻辑回归的对数似然损失函数cost function: 当y=1时,假定这个样本为正类。如果此时hθ(x)=1,则单对这个样本而言的cost=0,表示这个样本的预测完全准确。那如果所有样本都预测准确,总的cost=0 但是如果此时预测的概率hθ(x)=0,那么cost趋向于无穷大,那么此时就要对损失函数加一个很大的惩罚项。 logistic cost定义为: logistic回归主

szj_huhu的博客 2656

pytorch手动实现梯度下降法,随机梯度法--基于logistic Regression并探索Mini batch作用

简述 基于这次凸优化的大项目作业。 下面会围绕着通过logistic Regression来做MNIST集上的手写数字识别~ 以此来探索logistic Regression,梯度下降法,随机梯度法,以及Mini batch的作用。 核心任务是实现梯度下降法和随机梯度法。但是其他的准备工作也得做的较为好~ 导入的包 import os import torch import torch.nn as...

gc.collect() 4651

Python利用逻辑回归模型解决MNIST手写数字识别问题详解

本文实例讲述了Python利用逻辑回归模型解决MNIST手写数字识别问题。分享给大家供大家参考,具体如下: 1、MNIST手写识别问题 MNIST手写数字识别问题:输入黑白的手写阿拉伯数字,通过机器学习判断输入的是几。可以通过TensorFLow下载MNIST手写数据集,通过import引入MNIST数据集并进行读取,会自动从网上下载所需文件。 %matplotlib inline import tensorflow as tf import tensorflow.examples.tutorials.mnist.input_data as input_data mnist=input_da

使用逻辑回归进行MNIST数据集分类

MNIST数据集是机器学习领域中非常经典的一个数据集,由60000个训练样本和10000个测试样本组成,每个样本都是一张28 * 28像素的灰度手写数字图片。 import time import numpy as np import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn import datasets from sklearn.preproces

无人机飞控算法开发实战:从零到一构建企业级飞控系统

本文系统介绍了无人机飞控算法开发的完整流程,包括飞行动力学模型建立、传感器校准与数据融合、主流控制算法实现(PID、ADRC、EKF)以及企业级飞控系统架构设计。通过结合开源飞控框架(如PX4)和实际工程经验,提供了完整的代码实现示例,帮助学者从零开始掌握无人机飞控开发的核心技术。文中详细讲解了四旋翼无人机的动力学模型、传感器校准方法、EKF状态估计算法、PID和ADRC控制算法的实现,以及MAVLink通信协议的集成。最后,总结了完整的飞控系统开发流程和未来发展趋势。

全栈 3402

LangChain开发避坑指南:为什么Pylance总提示‘无法解析导入‘?实测7种修复方案

本文深入解析了在VS Code中使用LangChain开发时,Pylance频繁提示‘无法解析导入’的根本原因——Python解释器与语言服务器的环境路径不一致。文章提供了从基础排查到深度配置的7种实测修复方案,包括切换解释器、配置extraPaths、使用pyrightconfig.json等,旨在帮助开发者彻底解决此问题,提升AI应用开发效率。

weixin_28826521的博客 444

FPGA编译加速实战:6大可落地的Vivado优化策略

FPGA编译本质上是NP-hard约束满足问题求解,而非传统软件编译;Vivado作为时序驱动的硬件实现工具链,其耗时瓶颈集中在Implementation阶段的布局布线(PnR)与逻辑优化。理解这一原理,才能跳出‘加线程’‘升版本’等表面优化,转向精准时序约束、增量编译、物理锚点控制、IP配置精简等工程级干预。这些技术手段直接作用于Vivado的Tcl执行流与底层求解空间,显著压缩搜索范围、减少无效迭代——尤其适用于Zynq/UltraScale等中大型项目(LUT > 80K、多时钟域、DDR/PCIe

weixin_34226182的博客 413

利用gprMax与Matlab实现SFCW雷达信号的高效仿真与优化

本文详细介绍了如何结合gprMax与Matlab实现SFCW雷达信号的高效仿真与优化。通过利用gprMax获取地下场景的冲激响应,并在Matlab中运用卷积与信号处理技术,可大幅提升SFCW雷达系统仿真的效率与灵活性,为探地雷达研究与设计提供强大工具。

book8的博客 705

笔试题-2023-星宸-数字IC设计【纯净题目版】

4 笔试题-2023-星宸-数字IC设计【纯净题目版】

w0shishabi的博客 1172

【四足机器人项目实战】四足机器人弹簧倒立摆(SLIP)动力学模型

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言1.动力学建模构型方法2.四足机器人动力学模型(1)多体动力学模型【针对躯干+脚建模】方法一:VMC(VirtualModelController)模型方法二:SLIP模型(2)浮基单体动力学模型【针对躯干建模】【用于MPC】 前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对四足机器人动力学模型-VMC、SLIP和浮动机体模型做个简

qq_35635374的博客 7311

STM32+ESP8266+MQTT协议连接阿里云物联网平台

一、环境介绍 单片机采用:STM32F103C8T6 上网方式:采用ESP8266,也可以使用其他设备代替,只要支持TCP协议即可。比如:GSM模块、有线网卡等。 开发软件:keil5 二、实现功能 通过阿里云物联网服务器实现设备数据远程上传、下发,实现数据交互。 在当前使用的开发板上有4盏LED灯、一个蜂鸣器、4个按键。 三、阿里云物联网服务器创建步骤 说明:如果没有账号的话,先点击网页右上角,注册一个账号,并完成实名认证再继续下一步。 产品名称根据自己情况填...

6万+

TC3XX - MCAL知识点(二十七):SENT Mcal配置及代码实战(单边半字节传输协议)

SENT协议只有一根线,异步传输!Sent协议的全称为Single Edge Nibble Trans .isson,单边半字节传输协议,是一种单线异步串行通信协议。Sent报文包含8个Nibble和一个校准位如图1所示,每一个Nibble数据被编码成PWM方式。设计这种协议的目的是用在与汽车ECU快速交互信息的传感器上,以此来取代低精确度的10bit AD和PWM。Sent是一种点对点的单方向从传感器到控制端的协议,控制器不需要同步信号。

梦想技术家 2271

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

上一篇: 用python画cdf图和直方图
下一篇: 一文搞定并查集
coding丁
博客等级 码龄9年 383粉丝 147原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值