精华内容
下载资源
问答
  • 一组数字转换机按下面的程序计算
    千次阅读
    2018-06-18 10:38:45

    前言

    图灵机和计算理论是人工智能乃至整个计算机科学的理论基础,邱奇-图灵论题告诉我们一切可计算过程都可以用图灵机模拟。

    图灵机

    图灵机,又称图灵计算、图灵计算机,是由数学家艾伦·麦席森·图灵(1912~1954)提出的一种抽象计算模型,即将人们使用纸笔进行数学运算的过程进行抽象,由一个虚拟的机器替代人们进行数学运算。

    这里写图片描述

    图灵机指一个抽象的机器,它有一条无限长的纸带,纸带分成了一个一个的小方格,每个方格有不同的颜色。有一个机器头在纸带上移来移去。机器头有一组内部状态,还有一些固定的程序。在每个时刻,机器头都要从当前纸带上读入一个方格信息,然后结合自己的内部状态查找程序表,根据程序输出信息到纸带方格上,并转换自己的内部状态,然后进行移动。

    每一个会决策、会思考的人都可以被抽象地看成一台图灵机。该模型主要有四要素:输入集合、输出集合、内部状态和固定的程序。如果把人进行抽象,那么输入集合就是所处环境中所看到、听到、闻到、感觉到的一切;输出集合就是人的每一言每一行,还有表情动作;内部状态集合则可以把神经细胞的状态组合看成一个内部状态,所有可能的状态集合将是天文数字。

    人有记忆,图灵机有没有?有,它有了内部状态就可以看成有记忆

    更多相关内容
  • 计算机组成原理实验:微程序控制实验

    万次阅读 多人点赞 2021-02-07 15:20:32
    学生实验报告 实验课名称:计算机组成原理 实验项目名称:微程序...微程序控制器的基本任务是完成当前指令的翻译和执行,即将当前指令的功能转换成可以控制的硬件逻辑部件工作的微命令序列,完成数据传送和各种处理操

    学生实验报告

    实验课名称:计算机组成原理
    实验项目名称:微程序控制实验

    一、实验名称:

    微程序控制实验

    二、实验目的:

    (1)掌握微程序控制器的组成原理。
    (2)掌握微程序的编制、写入,观察微程序的运行过程。

    三、实验要求:

    通过一个微程序控制程序实验,了解微程序控制的的组成原理、工作原理,同时掌握微程序的编制、写入,观察微程序的翻译机器指令的运行过程。

    四、实验内容:

    微程序控制器的基本任务是完成当前指令的翻译和执行,即将当前指令的功能转换成可以控制的硬件逻辑部件工作的微命令序列,完成数据传送和各种处理操作。它的执行方法就是将控制各部件动作的微命令的集合进行编码,即将微命令的集合仿照机器指令一样,用数字代码的形式表示,这种表示称为微指令。这样就可以用一个微指令序列表示一条机器 指令,这种微指令序列称为微程序。微程序存储在-种专用的存储器中,称为控制存储器微程序控制器原理框图如图3-2-1所示。
    在这里插入图片描述

    控制器是严格按照系统时序来工作的,因而时序控制对于控制器的设计是非常重要的,从前面的实验可以很清楚地了解时序电路的工作原理,本实验所用的时序由时序单元来提供,分为四拍TS1、TS2、TS3、 TS4, 时序单元的介绍见附录2。微程序控制器的组成见图3-2-2,其中控制存储器采用3片2816 的E’PROM,具有掉电保护功能,微命令寄存器18位,用两片8D触发器(273) 和一片4D (175) 触发器组成。微地址寄存器6位,用三片正沿触发的双D触发器(74) 组成,它们带有清“0”端和预置端。在不判别测试的情况下,T2时刻打入微地址寄存器的内容即为下–条微指令地址。当T4时刻进行测试判别时,转移逻辑满足条件后输出的负脉冲通过强置端将某一触发器置为“1”状态,完成地址修改。
    在实验平台中设有一组编程控制开关KK3、KK4、KK5 (位于时序与操作台单元),可实现对存储器(包括存储器和控制存储器)的三种操作:编程、校验、运行。考虑到对于存储器(包括存储器和控制存储器)的操作大多集中在一个地址连续的存储空间中,实验平台提供了便利的手动操作方式。以向00H单元中写入332211为例,对于控制存储器进行编辑的具体操作步骤如下:首先将KK1拨至‘停止’档、KK3拨至‘编程’档、KK4拨至‘控存’档、KK5拨至‘置数’档,由CON单元的SD05一SD00开关给出需要编辑的控存单元首地址000000),IN单元开关给出该控存单元数据的低8位(00010001),连续两次按动时序与操作台单元的开关ST (第一次按动后MC单元低8位显示该单元以前存储的数据,第二次按动后显示当前改动的数据),此时MC单元的指示灯MA5- MA0 显示当前地址(000000), M7- M0 显示当前数据(00010001)。然后将KK5拨至‘加1’档,IN单元开关给出该控存单元数据的中8位(00100010),连续两次按动开关ST,完成对该控存单元中8位数据的修改,此时MC单元的指示灯MA5- -MA0显示当前地址000000), M15—M8 显示当前数据(00100010); 再由IN单元开关给出该控存单元数据的高8位(00110011), 连续两次按动开关ST,完成对该控存单元高8位数据的修改此时MC单元的指示灯MA5一MA0 显示当前地址000000), M23—M16 显示当前数据(00110011)。 此时被编辑的控存单元地址会自动加1 (01H), 由IN单元开关依次给出该控存单元数据的低8位、中8位和高8位配合每次开关ST的两次按动,即可完成对后续单元的编辑。
    在这里插入图片描述

    编辑完成后需进行校验,以确保编辑的正确。以校验00H单元为例,对于控制存储器进行校验的具体操作步骤如下:首先将KK1拨至‘停止’档、KK3拨至‘校验’档、KK4拨至‘控存’档、KK5拨至‘置数’档。由CON单元的SD05一SD0O 开关给出需要校验的控存单元地址(000000), 连续两次按动开关ST,MC单元指示灯M7–M0显示该单元低8位数据(00010001); KK5拨至‘加1’档,再连续两次按动开关ST, MC单元指示灯M15- -M8 显示该单元高8位数据(00110011)。 再连续两次按动开关ST,地址加1, MC单元指示灯M7-编辑完成后需进行校验,以确保编辑的正确。以校验00H单元为例,对于控制存储器进行校验的具体操作步骤如下:首先将KK1拨至‘停止’档、KK3拨至‘校验’档、KK4拨至‘控
    存’档、KK5拨至‘置数’档。由CON单元的SD05一SD0O 开关给出需要校验的控存单元地址(000000), 连续两次按动开关ST,MC单元指示灯M7–M0显示该单元低8位数据(00010001); KK5拨至‘加1’档,再连续两次按动开关ST, MC单元指示灯M15- -M8 显示该单元中8位数据(00100010); 再连续两次按动开关ST, MC单元指示灯M23–M16 显
    示该单元高8位数据(00110011)。 再连续两次按动开关ST,地址加1, MC单元指示灯M7—M0显尿01H单元低8位数据。如校验的微指令出错,则返回输入操作,修改该单元的数据后再进行校验,直至确认输入的微代码全部准确无误为止,完成对微指令的输入。
    在这里插入图片描述

    位于实验平台MC单元左上角一列三个指示灯MC2、MC1、MC0用来指示当前操作的微程序字段,分别对应M23–M16、M15一M8、M7一-M0。实验平台提供了比较灵活的手动操作方式,比如在上述操作中在对地址置数后将开关KK4拨至‘减1’档,则每次随着开关ST的两次拨动操作,字节数依次从高8位到低8位递减,减至低8位后,再按动两次开关ST,微地址会自动减一,继续对下一个单元的操作。
    微指令字长共24位,控制位顺序如表3-2-1:
    在这里插入图片描述

    其中MA…MA0为6位的后续微地址,A、B、C为三个译码字段,分别由三个控制位译码出多位。C字段中的P为测试字位。其功能是根据机器指令及相应微代码进行译码,使微程序转入相应的微地址入口,从而实现完成对指令的识别,并实现微程序的分支,本系统上的指令译码原理如图3-2-3所示,图中17…2为指令寄存器的第7…2 位输出SE…SEO 为微控器单元微地址锁存器的强置端输出,指令译码逻辑在IR单元的INS_DEC(GAL20V8)中实现。从图3-2-2中也可以看出,微控器产生的控制信号比表3-2-1中的要多,这是因为实验的不同,所需的控制信号也不- -样,本实验只用了部分的控制信号。本实验除了用到指令寄存器(IR) 和通用寄存器R0外,还要用到IN和OUT单元,从微控器出来的信号中只有IOM、WR和RD三个信号,所以对这两个单元的读写信号还应先经过译
    码,其译码原理如图3-2-4所示。IR单元的原理图如图3-2-5所示,R0单元原理如图3-2-7所示,IN单元的原理图见图2-1-3所示,OUT单元的原理图见图3-2-6所示。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    本实验安排了四条机器指令,分别为ADD (0000 0000)、IN (0010 0000)、OUT (0011 0000)和HLT (0101 0000),括号中为各指令的二进制代码,指令格式如下:
    在这里插入图片描述

    实验中机器指令由CON单元的二进制开关手动给出,其余单元的控制信号均由微程序控制器自动产生,为此可以设计出相应的数据通路图,见图3-2-8所示。几条机器指令对应的参考微程序流程图如图3-2-9所示。图中-一个矩形方框表示一条微指令,方框中的内容为该指令执行的微操作,右上角的数字是该条指令的微地址,右下角的数字是该条指令的后续微地址,所有微地址均用16进制表示。向下的箭头指出了下–条要执行的指令。P<1>为测试字,根据条件使微程序产生分支。
    在这里插入图片描述
    在这里插入图片描述

    五、实验设备及工具:

    PC机一台,TD-CMA实验系统一套

    六、实验过程详述:

    1.按图3-2- 10所示连接实验线路,仔细查线无误后接通电源。如果有‘滴’报警声,说明总线有竞争现象,应关闭电源,检查接线,直到错误排除。
    在这里插入图片描述

    2.对微控器进行读写操作,分两种情况:手动读写和联机读写。
    1)手动读写
    (1)手动对微控器进行编程(写)
    ①将时序与操作台单元的开关KK1置为‘停止’档, KK3置为‘编程’档,KK4置为‘控存’档,KK5置为‘置数’档。
    ②使用CON单元的SD05一SD00 给出微地址,IN单元给出低8位应写入的数据,连续两次按动时序与操作台的开关ST,将IN单元的数据写到该单元的低8位。
    ③将时序与操作台单元的开关KK5置为‘加1’档。
    ④IN单元给出中8位应写入的数据,连续两次按动时序与操作台的开关ST,将IN单元的数据写到该单元的中8位。IN单元给出高8位应写入的数据,连续两次按动时序与操作台的开关ST,将IN单元的数据写到该单元的高8位。
    ⑤重复①、②、③、④四步,将表3-2-2的微代码写入2816芯片中。
    (2)手动对微控器进行校验(读)
    ①将时序与操作台单元的开关KK1置为‘停止’档, KK3置为‘校验’档, KK4置为‘控存’档,KK5置为‘置数’档。
    ②使用CON单元的SD05-SD00给出微地址,连续两次按动时序与操作台的开关ST,MC单元的指数据指示灯M7—M0显示该单元的低8位。
    ③将时序与操作台单元的开关KK5置为‘加1’档。
    ④连续两次按动时序与操作台的开关ST,MC单元的指数据指示灯M15—M8显示该单元的中8位,MC单元的指数据指示灯M23—M16 显示该单元的高8位。
    ⑤重复①、②、③、④四步,完成对微代码的校验。如果校验出微代码写入错误,重新写入、校验,直至确认微指令的输入无误为止。
    2)联机读写
    (1)将微程序写入文件联机软件提供了微程序下载功能,以代替手动读写微控器,但微程序得以指定的格式写入到以TXT为后缀的文件中,微程序的格式如下:
    在这里插入图片描述

    如$M 1F 112233, 表示微指令的地址为1FH,微指令值为11H (高)、22H (中)、33H (低),本次实验的微程序如下,其中分号‘;’为注释符,分号后面的内容在下载时将被忽略掉。
    (2)写入微程序
    用联机软件的“[转储]一[装载]”功能将该格式(*.TXT) 文件装载入实验系统。装入过程中,在软件的输出区的‘结果’栏会显示装载信息,如当前正在装载的是机器指令还是微指令,还剩多少条指令等。
    (3)校验微程序
    选择联机软件的“[转储] - [ 刷新指令区]”可以读出下位机所有的机器指令和微指令,并在指令区显示。检查微控器相应地址单元的数据是否和表3-2-2中的十六进制数据相同,如果不同,则说明写入操作失败,应重新写入,可以通过联机软件单独修改某个单元的微指令,先用鼠标左键单击指令区的‘ 微存’TAB按钮,然后再单击需修改单元的数据,此时该单元变为编辑框,输入6位数据并回车,编辑框消失,并以红色显示写入的数据。
    在这里插入图片描述

    3.运行微程序
    运行时也分两种情况:本机运行和联机运行。
    1)本机运行
    ①将时序与操作台单元的开关KK1、KK3置为‘运行’档,按动CON单元的CLR按钮,将微地址寄存器(MAR) 清零,同时也将指令寄存器(IR)、 ALU单元的暂存器A和暂存器B清零。
    ②将时序与操作台单元的开关KK2置为‘单拍’档,然后按动ST按钮,体会系统在T1、T2、T3、T4节拍中各做的工作。T2节拍微控器将后续微地址(下条执行的微指令的地址)打入微地址寄存器,当前微指令打入微指令寄存器,并产生执行部件相应的控制信号; T3、T4节拍根据T2节拍产生的控制信号做出相应的执行动作,如果测试位有效,还要根据机器指令及当前微地址寄存器中的内容进行译码,使微程序转入相应的微地址入口,实现微程序的分支。
    ③按动CON单元的CLR按钮,清微地址寄存器(MAR)等,并将时序与单元的开关KK2置为‘单步’ 档。
    ④置IN单元数据为00100011,按动ST按钮,当MC单元后续微地址显示为000001时,在CON单元的SD27…SD20模拟给出IN指令00100000并继续单步执行,当MC单元后续微地址显示为000001 时,说明当前指令已执行完;在CON单元的SD27…SD20给出ADD指令0000000,该指令将会在下个T3被打入指令寄存器(IR),它将RO中的数据和其自身相加后送R0;接下来在CON单元的SD27…SD20给出OUT指令001 10000并继续单步执行,在MC单.元后续微地址显示为000001时,观查OUT单元的显示值是否为01000110。
    2)联机运行
    联机运行时,进入软件界面,在菜单上选择[实验]一[微控器实验],打开本实验的数据通路图,也可以通过工具栏上的下拉框打开数据通路图,数据通路图如图3-2-8 所示。将时序与操作台单元的开关KK1、KK3置为‘运行’档,按动CON单元的总清开关后,按动软件中单节拍按钮,当后续微地址(通路图中的MAR)为000001 时,置CON单元SD27…SD20,产生相应的机器指令,该指令将会在下个T3被打入指令寄存器(IR), 在后面的节拍中将执行这条机器指令。仔细观察每条机器指令的执行过程,体会后续微地址被强置转换的过程,这是计算机识别和执行指令的根基。也可以打开微程序流程图,跟踪显示每条机器指令的执行过程。
    按本机运行的顺序给出数据和指令,观查最后的运算结果是否正确。

    七、实验结果与分析:

    结果
             手动操作时,系统按照程序编写方式,逐一执行代码:提取机器指令、放入指令寄存器、测试、执行所需操作…执行上述操作的同时,也需要手动的操作IN单元、开关单元、WR、RD等,从而完成一系列的指令操作。最后程序正确的执行,并得出最后正确结果。联机操作时,通过写入需要执行的程序、微程序命令,在CMA软件中进行仿真实验,在实验模型中,可以看到执行每一条指令所进行的一系列操作,同时观察出数据的流向、各个门的开闭。运行到最后,得出正确结果。

    分析
             无论是手动操作还是联机操作,都可以正确的执行写入的程序指令,得出正确的结果。通过两次不同实验的对比,我们可以发现,其实微程序起的作用就是将所有指令需要执行的操作编写成一条条的微操作,形成一个微程序库。当执行不同的指令时,同时调出对应的微操作,完成指令操作。

    八、心得体会:

             通过这次的微程序控制实验,自己深有体会。原来计算机处理程序指令是通过先提取指令、送往指令寄存器,然后利用判断电路对指令类型进行测试,再进行相应的指令操作。在判断数据的流向、存储器的打开等选择上,这时就靠微程序起作用了。在手动操作运行程序时,我们通过逐步手动的控制输入输出流、WR、RD等控制信号,从而进行一系列的指令操作,完成所需运算。而微程序起的作用就是人为的把需要执行指令所需的“人为动作”,全部以微指令的方式存储起来,当需要执行相应的微指令时,直接从微存中调出微程序即可。所以,微程序起的作用简而言之就是替代手工的操作,使得计算机可以按照一定的逻辑关系运行,这同样也是计算机可以在没有人的操作下独立运行人们所编写的原因,同时也保持了绝对的准确性。刚开始的时候,自己对微程序的了解也不是很深,其主要原因就是不知道微程序到底有什么用?为什么需要微程序呢?后面通过手动操作运行程序和联机运行程序的对比,自己才慢慢的明白了原来微程序是以程序命令的方式模拟手动操作。这样计算机的准确性也就同时上了一个新的台阶。

    展开全文
  • 1.微程序控制器的基本任务是完成当前指令的翻译和执行,即将当前指令的功能转换成可以控制的硬件逻辑部件工作的微命令序列,完成数据传送和各种处理操作。它的执行方法就是将控制各部件动作的微命令的集合进行编码...

    一、实验目的

    (1)掌握微程序控制器的组成原理
    (2)掌握微程序的编制写入,观察微程序的运行过程

    二、实验设备

    PC 机一台,TD-CMA 实验系统一套

    三、实验原理

    1.微程序控制器的基本任务是完成当前指令的翻译和执行,即将当前指令的功能转换成可以控制的硬件逻辑部件工作的微命令序列,完成数据传送和各种处理操作。它的执行方法就是将控制各部件动作的微命令的集合进行编码,即将微命令的集合仿照机器指令一样,用数字代码的形式表示,这种表示称为微指令。这样就可以用一个微指令序列表示一条机器指令,这种微指令序列称为微程序。微程序存储在一种专用的存储器中,称为控制存储器,微程序控制器原理框如下图所示。
    在这里插入图片描述

    四、实验步骤

    1. 按实验帮助的图连接实验线路,仔细查线无误后接通电源。如果有‘滴’报警声,说明总线有竞争现象,应关闭电源,检查接线,直到错误排除。
      2.写入微程序
      用联机软件的“【转储】—【装载】”功能将该格式(*.TXT)文件装载入实验系统。装入过程中,在软件的输出区的‘结果’栏会显示装载信息,如当前正在装载的是机器指令还是微指令,还剩多少条指令等。
    2. 运行微程序 (本机运行 )
      ① 将MC单元的编程开关置为‘运行’档,MEM单元的编程开关也置为‘运行’档,按动CON单元的CLR按钮,将微地址寄存器(MAR)清零,同时也将指令寄存器(IR)、ALU单元的暂存器A和暂存器B清零。
      ② 将时序单元的状态开关置为‘单拍’档,然后按动TS按钮,体会系统在T1和T2节拍中各做的工作。T1节拍微控器将后续微地址(下条执行的微指令的地址)打入微地址寄存器,当前微指令打入微指令寄存器,并产生执行部件相应的控制信号;T2节拍根据T1节拍产生的控制信号做出相应的执行动作,如果测试位有效,还要根据机器指令及当前微地址寄存器中的内容进行译码,使微程序转入相应的微地址入口,实现微程序的分支。
      ③ 按动CON单元的CLR按钮,清零微地址寄存器(MAR)等,并将时序单元的状态开关置为‘单步’档。
      ④ 置IN单元数据为00100011,按动TS按钮,当MC单元后续微地址显示为000001时,在CON单元的SD27…SD20模拟给出IN指令00100000并继续单步执行,当MC单元后续微地址显示为000001时,说明当前指令已执行完;在CON单元的SD27…SD20给出ADD指令00000000,该指令将会在下个T2被打入指令寄存器(IR),它将R0中的数据和其自身相加后送R0;接下来在CON单元的SD27…SD20给出OUT指令00110000并继续单步执行,在MC单元后续微地址显示为000001时,观查OUT单元的显示值是否为01000110。

    五、实验结论

    通过此次的微程序控制器的实验,我们通过实际操作基本掌握微程序控制器的功能、组成知识。以及程序的编制、写入、观察微程序的运行等功能。了解到了理论知识与实际操作的差别,增加了我对模拟电路实验的兴趣爱好。

    展开全文
  • 摘要:本文详细介绍如何利用MATLAB实现手写数字的识别,其中特征提取过程采用方向梯度直方图(HOG)特征,分类过程采用性能优异的支持向量(SVM)算法,训练测试数据集为学术及工程上常用的MNIST手写数字数据集,...

    演示动图

    摘要:本文详细介绍如何利用MATLAB实现手写数字的识别,其中特征提取过程采用方向梯度直方图(HOG)特征,分类过程采用性能优异的支持向量机(SVM)算法,训练测试数据集为学术及工程上常用的MNIST手写数字数据集,博主为SVM设置了合适的核函数,最终的测试准确率达99%的较高水平。根据训练得到的模型,利用MATLAB GUI工具设计了可以手写输入或读取图片进行识别的系统界面,同时可视化图片处理过程及识别结果。本套代码集成了众多机器学习的基础技术,适用性极强(用户可修改图片文件夹实现自定义数据集训练),相信会是一个非常好的学习Demo。本博文目录如下:

    ➷点击跳转至文末所有涉及的完整代码文件下载页☇

    代码介绍及演示视频链接:https://www.bilibili.com/video/BV1km4y1R7qf/(正在更新中,欢迎关注博主B站视频)


    前言

        机器学习中支持向量机(SVM)算法可谓是个超级经典,也许很多人倾向于使用深度神经网络解决问题,但在博主看来选择何种算法应该取决于具体的机器学习任务,对于复杂程度不高、数据量较少的任务,也许经典的机器学习算法能够更好地解决问题。手写数字识别这一任务要求正确分类出0-9的手写数字图片,最常用的数据集是MNIST,该数据集也是众多论文中经常用来测试对比算法的对象。博主想说的是其实SVM也可以很好地解决这一问题,本文介绍的代码就可以实现99%的测试准确率,所以想借此为大家提供一个学习的Demo共同交流。

        博主之前也曾写过两篇利用SVM进行分类的博文:基于支持向量机的图像分类(上篇)基于支持向量机的图像分类(下篇:MATLAB实现),详细介绍了特征提取的基本技术和支持向量机的原理,亦可供大家参考。本文给出了MATLAB实现的完整代码供大家参考,有基础的读者可按照文中的介绍复现出完整程序;对于想获取全部数据集及程序文件的朋友,可以点击提供的下载链接获取可直接运行的代码,原创不易,还请多多支持了。如本文对您有所帮助,敬请点赞、收藏、关注!


    1. 效果演示

        找资料的大伙时间宝贵,为了方便大家了解项目,我们老规矩先上效果演示,GUI界面有几个主要功能:通过手写板写入数字进行识别;利用文件浏览器选取一张手写数字的图片进行识别;同步可视化处理过程中的图像,显示最终识别结果。GUI界面如下:

    GUI界面展示图
        在手写板中写入数字后可点击下方保存按钮保存为图片文件,手写输入及读图输入及保存功能的演示动图如下图所示。右侧为图像原图、灰度化处理、二值化处理及特征提取后的图像,方便了解识别的处理过程:

    动图演示
        本项目所有功能均已在MATLAB R2020b中测试通过,更多演示细节敬请前往博主B站观看演示视频,视频具体演示程序运行效果并介绍如何使用代码,欢迎关注!


    2. MNIST数据集

        MNIST数据集来自美国国家标准与技术研究所(National Institute of Standards and Technology, NIST)。训练集 (Training Set) 由来自250个不同人手写的数字构成,其中50%是高中学生,50%来自人口普查局的工作人员;测试集(Test Set) 也是同样比例的手写数字数据。

    MNIST数据集
        MNIST数据集可在 http://yann.lecun.com/exdb/mnist/获取,但由于访问外网下载速度很慢,博主已将该数据集打包上传至百度网盘,大家可以通过博主前面发布的博文:深度学习常用数据集介绍与下载(附网盘链接)进行下载。MNIST数据集包含了四个部分:

    • Training set images:train-images-idx3-ubyte.gz (9.9MB,解压后47MB,包含60000个样本)
    • Training set labels:train-labels-idx1-ubyte.gz(29KB,解压后60KB,包含60000个标签)
    • Test set images:t10k-images-idx3-ubyte.gz (1.6MB,解压后7.8MB,包含10000个样本)
    • Test set labels: t10k-labels-idx1-ubyte.gz(5KB,解压后10KB,包含10000个标签)

        将下载后的数据集文件放在一个文件夹下,用于后续处理,MNIST数据集文件如下图所示:

    数据集文件
        由于MNIST的原始文件并非常见的图片格式,因此为了方便后续处理,我们先将这几个文件转化为mat文件,然后逐个读取转换为图像矩阵并保存为图片文件。值得注意的是,我们需按照每条样本数据的标签将其分别放置在不同的文件夹中,如下方式在train文件夹中创建0-9的文件夹用来存放要写入的对应标签的图片:

    子文件夹
        这里写一个小脚本将数据集图片按标签存入对应文件夹中,其中的mat文件为读取原始数据并转存后的数据集,MNIST每张图片的尺寸均为28×28,所以可以先通过reshape恢复数据尺寸,然后利用imwrite函数写入文件中(路径为对应标签的子文件夹),该部分代码如下:

    clear
    clc
    % P = loadMNISTImages('mnist/train-images.idx3-ubyte');
    % T = loadMNISTLabels('mnist/train-labels.idx1-ubyte');
    load('test_data.mat', 'test_X')
    load('test_label.mat', 'test_Y')
    load('train_data.mat', 'train_X')
    load('train_label.mat', 'train_Y')
    load('validation_data.mat', 'validation_X')
    load('validation_label.mat', 'validation_Y')
    % 遍历每张图片
    disp('现在将训练数据保存为图片文件格式')
    for i = 1:length(train_X)
        img = reshape(train_X(i, :), 28, 28); % 转换成28*28的图片
        img = img';
        imwrite(img, ['./mnist/train/', int2str(train_Y(i)), '/', int2str(i), '.jpg']);
        disp(i);
    end
    % 遍历每张图片
    disp('现在将测试数据保存为图片文件格式')
    for i = 1:length(test_X)
        img = reshape(test_X(i, :), 28, 28); % 转换成28*28的图片
        img = img';
        imwrite(img, ['./mnist/test/', int2str(test_Y(i)), '/', int2str(i), '.jpg']);
        disp(i);
    end
    

        处理后的子文件夹中将存放对应的图片文件,其中两个子文件夹的截图如下图所示:

    子文件夹详情
        数据集准备完毕,现在可以通过文件夹读取图片了。在MATLAB中可使用imageDatastore函数方便地批量读取图片集,它通过递归扫描文件夹目录,将每个文件夹名称自动作为图像的标签,该部分代码如下:

    % 给出训练和测试数据路径,利用imageDatastore载入数据集
    syntheticDir   = fullfile('data','mnist', 'train');
    handwrittenDir = fullfile('data','mnist', 'test');
    
    % imageDatastore递归扫描目录,将每个文件夹名称自动作为图像的标签
    trainSet = imageDatastore(syntheticDir,   'IncludeSubfolders', true, 'LabelSource', 'foldernames');
    testSet  = imageDatastore(handwrittenDir, 'IncludeSubfolders', true, 'LabelSource', 'foldernames');
    

        至此训练和测试数据集分别被存放在trainSettestSet变量中,可以简单查看训练和测试集每类标签的样本个数,显示代码如下:

    trainSetDetail = countEachLabel(trainSet) % 训练数据
    testSetDetail = countEachLabel(testSet) % 测试数据
    

        执行以上代码运行结果如下:

    查看各类文件个数
        下面读取几张训练和测试集的图片,显示原始图片帮助我们清楚该数据集的实际情况,按照两行显示:第一行为训练图片,第二行为测试图片,该部分代码如下:

    figure;
    % 显示训练、测试图片(第一行是训练图片、第二行是测试图片)
    subplot(2,5,1);imshow(trainSet.Files{4417});
    subplot(2,5,2);imshow(trainSet.Files{23696});
    subplot(2,5,3);imshow(trainSet.Files{31739});
    subplot(2,5,4);imshow(trainSet.Files{46740});
    subplot(2,5,5);imshow(trainSet.Files{54784});
    subplot(2,5,6);imshow(testSet.Files{53});
    subplot(2,5,7);imshow(testSet.Files{4572});
    subplot(2,5,8);imshow(testSet.Files{5163});
    subplot(2,5,9);imshow(testSet.Files{8381});
    subplot(2,5,10);imshow(testSet.Files{9549});
    

        执行该代码可以看到如下的运行结果:

    数据集显示
        在提取特征前我们对图片进行一些必要的预处理操作,首先读取图片后进行灰度化,然后进行二值化处理,以方便后续的特征提取。这里我们将原始图片和二值化后的图像显示在一个窗口中,其代码如下:

    exampleImage = readimage(trainSet, 31739);
    if numel(size(exampleImage))==3
            exampleImage = rgb2gray(exampleImage);   % 灰度化图片
    end
    
    processedImage = imbinarize(exampleImage);
    
    figure;
    subplot(1,2,1)
    imshow(exampleImage)
    title('原始图像')
    
    subplot(1,2,2)
    imshow(processedImage)
    title('二值化后图像')
    

        执行该代码可以看到如下的原始图像与二值化后的对比结果:
    二值化对比结果


    3. HOG特征提取

        真正用于训练分类器的数据并不是原始图片数据,而是先经过特征提取后得到的特征向量,这里使用的特征类型是HOG,也就是方向梯度直方图。所以这里重要的一点是正确提取出HOG特征,extractHOGFeaturesMATLAB自带的HOG特征提取函数,该函数不仅可以有效提取特征,还可以返回特征的可视化结果以方便展示。这里通过调整每个细胞单元的尺寸大小实现不同尺寸的特征提取,可以通过可视化的结果看到细胞单元的尺寸对图像的形状信息量的影响:

    img = readimage(trainSet, 31739);
    
    % 提取HOG特征,并进行HOG可视化
    [hog_2x2, vis2x2] = extractHOGFeatures(img,'CellSize',[2 2]);
    [hog_4x4, vis4x4] = extractHOGFeatures(img,'CellSize',[4 4]);
    [hog_8x8, vis8x8] = extractHOGFeatures(img,'CellSize',[8 8]);
    
    % 显示原始图片
    figure; 
    subplot(2,3,1:3); imshow(img);
    title('原始图片');
    
    % 可视化HOG特征
    subplot(2,3,4);  
    plot(vis2x2); 
    title({'CellSize = [2 2]'; ['Length = ' num2str(length(hog_2x2))]});
    
    subplot(2,3,5);
    plot(vis4x4); 
    title({'CellSize = [4 4]'; ['Length = ' num2str(length(hog_4x4))]});
    
    subplot(2,3,6);
    plot(vis8x8); 
    title({'CellSize = [8 8]'; ['Length = ' num2str(length(hog_8x8))]});
    

        通过以上代码我们分别提取了2×24×48×8三种尺寸的HOG特征,其运行的可视化结果如下:
    不同尺寸HOG特征
        从以上结果可以看出2×2的细胞尺寸会编码更多的形状信息,这会显著增加HOG特征向量的维数,相反8×8的细胞尺寸得到的特征量最少。这其实是一个需要调试的参数,一方面应该对足够的空间信息进行编码,另一方面需要减少HOG特征向量的维数,为此可以选择4×4的细胞大小。当然读者还可以通过反复根据分类器训练和测试的效果来调整HOG特征的相关参数,以实现最佳参数设置。


    3. 训练和评估SVM分类器

        下面我们使用以上提取的HOG特征训练支持向量机,以上的代码只是提取了一张图片的特征,训练前我们对整个训练数据集提取HOG特征并组合,为了方便后面的性能评估,这里对测试数据集也进行特征提取:

    cellSize = [4 4];
    hogFeatureSize = length(hog_4x4);
    
    % 提取HOG特征
    tStart = tic; 
    [trainFeatures, trainLabels] = extractHogFromImageSet(trainSet, hogFeatureSize, cellSize); % 训练集特征提取
    [testFeatures, testLabels] = extractHogFromImageSet(testSet, hogFeatureSize, cellSize);    % 测试集特征提取
    
    tEnd = toc(tStart);
    fprintf('提取特征所用时间:%.2f秒\n', tEnd);
    

        由于图片数量众多,提取特征过程尚需一定时间,这里对训练集、测试集提取过程进行计时,因计算机算力不同,执行时间可能会不一致。以下代码中extractHogFromImageSet函数为自定义函数,封装了前面所提到的图像灰度化、二值化和HOG特征提取的代码,可以方便我们复用代码,使得程序更加简洁。

    cellSize = [4 4];
    hogFeatureSize = length(hog_4x4);
    
    % 提取HOG特征
    tStart = tic; 
    [trainFeatures, trainLabels] = extractHogFromImageSet(trainSet, hogFeatureSize, cellSize); % 训练集特征提取
    [testFeatures, testLabels] = extractHogFromImageSet(testSet, hogFeatureSize, cellSize);    % 测试集特征提取
    
    tEnd = toc(tStart);
    fprintf('提取特征所用时间:%.2f秒\n', tEnd);
    

        运行以上代码结果如下:

    提取特征所用时间:181.59秒
    

        构建支持向量机模型,利用提取的训练集特征进行训练。首先利用templateSVM函数构建支持向量机模板参数,选择polynomial核函数,执行标准化处理数据,显示训练过程;利用fitcecoc函数执行训练过程,其代码如下:

    % 训练支持向量机
    
    t = templateSVM('SaveSupportVectors',true, 'Standardize', true, 'KernelFunction','polynomial', ...
        'KernelScale', 'auto','Verbose', 1);      % 利用polynomial核函数, 标准化处理数据,显示训练过程(verbose取0时取消显示)
    
    tStart = tic; % 计时开始
    classifier = fitcecoc(trainFeatures, trainLabels, 'Learner', t); % 训练SVM模型
    tEnd = toc(tStart);
    fprintf('训练模型所用时间:%.2f秒\n', tEnd);
    

        以上代码开启了训练过程信息显示,训练过程中显示信息如下:

    训练过程展示

    训练模型所用时间:104.96秒
    

        等待训练完成,我们可以使用训练好的分类器进行预测,这里先利用测试集评估模型并计算分类评价指标,对测试集进行预测的代码如下:

    tStart = tic;
    
    % 对测试数据集进行预测
    predictedLabels = predict(classifier, testFeatures);
    
    tEnd = toc(tStart);
    fprintf('模型对测试集进行预测所用时间:%.2f秒\n', tEnd);
    

        运行结果如下:

    模型对测试集进行预测所用时间:5.18秒
    

        得到了预测结果,可以使用混淆矩阵评估结果,以下代码首先计算混淆矩阵结果,然后将结果打印出来:

    % 使用混淆矩阵评估结果
    confMat = confusionmat(testLabels, predictedLabels);
    dispConfusionMatrix(confMat); % 显示混淆矩阵
    

        运行结果如下:

    混淆矩阵打印结果
        以上代码显示了混淆矩阵的结果,但可能还不够直观,下面绘制混淆矩阵图帮助更好了解模型性能:

    % 绘制混淆矩阵图
    plotconfusion(testLabels, predictedLabels);
    

        运行代码后显示混淆矩阵图如下图所示,每行对角线上的网格(绿色网格)处显示了某类样本预测正确的数目及其占比。右下角网格表示分类的准确率,可以看出该分类器具有98.9%的总体分类准确率。
    混淆矩阵图
        分类准确率还可以通过以下代码进行计算:

    accuracy = sum(predictedLabels == testLabels) / numel(testLabels);
    fprintf('模型在测试集上的准确率:%.0f%%\n', accuracy*100);
    

        同样可以计算出预测的准确率,这里四舍五入取整可得以下结果:

    模型在测试集上的准确率:99%
    

        通过测试集评估结果,可以看出采用核函数的支持向量机准确率为99%,其性能已逼近深度卷积神经网络。得到了一个性能优良的分类器,接下来便可以利用模型设计一些有意思的东西了。为此我将该模型用于实际的手写数字识别中,以下是在MATLAB GUI工具中设计的界面,如若读者反响热烈,后期将很快更GUI的设计介绍,还请关注了!

    GUI界面


    下载链接

        若您想获得博文中涉及的实现完整全部程序文件(包括数据集,m, UI文件等,如下图),这里已打包上传至博主的面包多平台和CSDN下载资源。本资源已上传至面包多网站和CSDN下载资源频道,可以点击以下链接获取,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:

    文件夹详情

    注意:本资源已经过调试通过,下载后可通过MATLAB R2020b运行;训练主程序为main_showData.mlxDigitClassify_HOG_SVM.m文件,测试程序可运行testImage.mlx,要使用GUI界面请运行DigitClassifyUI.m文件(脚本文件可直接运行);其它程序文件大部分为函数而非可直接运行的脚本,使用时请勿直接点击运行!➷➷➷

    完整资源下载链接1博主在面包多网站上的完整资源下载页

    完整资源下载链接2https://mianbaoduo.com/o/bread/YZeUkplu

    注:以上两个链接为面包多平台下载链接,CSDN下载资源频道下载链接稍后上传。

    代码使用介绍及演示视频链接:https://space.bilibili.com/456667721/(尚在更新中,欢迎关注博主B站视频)


    结束语

        由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。如果本博文反响较好,其界面部分也将在下篇博文中介绍,所有涉及的GUI界面程序也会作细致讲解,敬请期待!

    展开全文
  • 【简答题】编写程序,用户输入个 列表 ,输出 列表元素之和 。例如用户输入 [ 1 , 2 , 3 , 4 ] ,则程序输出1 0 。( 注意:至少给出三种方法 ) ,提示可以考虑用 sum、 eval 、 reduce 函数及 for 循环【判断题】二层...
  • 计算机的本质是什么?逻辑?数学?

    千次阅读 多人点赞 2019-07-01 08:00:00
    虽然在今天看来ENIAC计算能力连手机,甚至是十几块钱的计算器都比不上,但它在当时却是相当强大。ENIAC的体积非常庞大,得好几个大房间才能放下它,耗电也相当恐怖,开机全城家家户户电灯都要变暗。 之所以称...
  • 本文目录、考研大纲1. 计算机发展的历程2.计算机的层次结构计算机系统的基本组成计算机硬件的基本组成计算机的软件与硬件的关系计算机的工作过程(指令执行的过程)3.计算机的性能指标 ==(重点)==二、计算机发展...
  • 计算,是个研究比图灵机计算能力更强的计算能力的计算机器的理论计算机科学分支。 主要有以下部分模型:   A.谕示. (Oracle Machine) 带“黑箱”的图灵。由图灵本人亲自提出,“黑箱”就是个谕示...
  • 计算机组成原理:最详细笔记

    万次阅读 多人点赞 2021-01-21 14:26:44
    章 计算机系统概述 1.1 计算机发展历程 1.1.1 计算机硬件的发展 计算机系统=硬件+软件 计算机硬件的发展: 第代计算机:(使用电子管), 第二代计算机:(使用晶体管), 第三代计算机:(使用较小规模的集成),...
  • 的,加个vip什么的,故而以下是博主整理的有关java面试题的以下内容,我想以种幽默风趣????的风格来给大家分享和探讨。另外附加有一些公司的面试真题(内部分享)下面我就开启????耳机模式。并且⭐是重要部分,要...
  • 这里分ios系统和安卓系统分开说,起来看看吧iOS系统:上拉底部菜单,快捷开启计算器这个功能简单又高效,许多有“强迫症”的小伙伴喜欢把APP、尤其是很少用到的应用软件,拖放到文件夹里,但是一旦需要用到,就得...
  • 计算机组成原理(哈工大)学习笔记

    万次阅读 多人点赞 2020-07-08 08:10:46
    文章目录计算机组成原理、计算机系统概论1.1计算机系统简介、计算机的软硬件概念二、计算机系统的层次结构三、计算机体系结构和计算机组成1.2计算机的基本组成1.3计算机硬件的主要技术指标、机器字长二、运算...
  • 数字媒体技术考点整理

    千次阅读 多人点赞 2021-12-12 16:12:51
    北京化工大学数字媒体技术期末复习
  • 计算机组成原理(白中英) 第章 课后题答案

    千次阅读 多人点赞 2020-03-05 19:30:29
    冯诺依曼计算机体系结构核心思想...程序或指令的顺序执行,即预先编好程序,然后交给计算机按照程序中预先定义好的顺序进行数值计算。 为什么冯诺依曼体系结构选择二进制? 答:①两个状态的系统在物理上容易实现...
  • 并发计算中的串行思考

    千次阅读 2022-03-07 00:08:29
    软件系统性能的提升的重要方法之是支持并发性编程,尤其是采用多核体系结构的时候。在全局数据库、云计算和区块链应用程序中,并发性对于实现容错和分布式服务也是至关重要的。然而,对并发性的掌握...
  • 企业数字化转型战略权威指南

    千次阅读 2020-03-05 03:35:27
    企业数字化转型战略权威指南 企业数字化转型 数字化转型是推动企业界数十亿投资重塑业务方式的大趋势。CIOPages.com的数字化转型最终指南是针对企业高管和企业家的全面而深入的见解,他们对如何思考,规划...
  • 计算机三级网络技术考过指南

    万次阅读 多人点赞 2018-03-10 19:18:36
    下面记忆一下,做题时会比较方便(不要畏难,做题见多了就记住了) 二进制 十进制 1000 0000 128 1100 0000 192 1110 0000 224 1111 0000 240 1111 1111 ...
  • 200个经典C程序【源码】

    千次下载 热门讨论 2013-08-08 10:48:40
    026 阿拉伯数字转换为罗马数字 027 字符替换 028 从键盘读入实数 029 字符行排版 030 字符排列 031 判断字符串是否回文 032 通讯录的输入输出 033 扑克牌的结构表示 034 用“结构”统计学生成绩 035 报数...
  • Cloud Computing:云计算的简介、必要性以及安全上云与企业数字化转型(从陈坤/辛芷蕾主演电视剧《输赢》看云计算的未来)的关系 目录 云计算的简介、必要性以及安全上云与企业数字化转型(从陈坤/辛芷蕾主演...
  • 超硬核!操作系统学霸笔记,考试复习面试全靠它

    万次阅读 多人点赞 2021-03-22 18:43:49
    进程基础 进程的基本概念 程序顺序执行的特征: 1)顺序性:处理严格按照程序所规定的顺序执行,每一步操作必须在下一步操作开始前执行 2)封闭性:程序在封闭的环境下运行,程序独占资源,资源的状态由程序决定...
  • 计算机组成原理总结及知识网图

    万次阅读 多人点赞 2021-01-19 23:52:03
    目录 相关链接 第章 计算机系统概述 知识网图 冯诺依曼的特点: 不同级别的语言: 计算机的工作过程: 计算机的性能指标: 第二章 数据的表示和运算 知识网图 在计算机系统内部,所有信息都用二进制进行编码的...
  • 计算机组成原理---期末复习题

    千次阅读 多人点赞 2021-01-13 12:58:59
    2.第台存储程序式计算机-EDSAC,1949 3.数据校验码主要有奇偶校验码、海明校验码和循环冗余校验码 4.磁表面存储器记录信息是利用磁性材料的磁滞回归线特性 5.计算机的字长取决于运算器次运算二进制数的位数...
  • 计算机组成原理常考大题合集

    千次阅读 多人点赞 2020-08-15 14:22:21
    程序开始执行前,将程序指令序列的起始地址,即程序的第条指令所在的内存单元地址送入PC,CPU按照 PC的指示从内存读取第条指令(取指)。当执行指令时,CPU自动地修改PC的内容,即每执行条指令PC增加个量...
  • 系统性学习计算机(

    万次阅读 2018-10-13 16:53:20
    计算机(computer)俗称电脑,是种能够接收和存储信息,并按照存储在其内部的程序(这些程序是人们意志的体现)对输入的信息进行加工,处理,并且把处理结果输出到高度自动化的电子设备。计算机由硬件设备及软件...
  • 【轻聊前端】JavaScript中的数字游戏

    千次阅读 2022-03-10 16:51:12
    数字,即本篇的主角Number,在程序的世界里能代表很多东西——状态、年龄、价格、计数器等,但由于存储机制的原因,Number并不能很健壮地适应所有场景,就会有一些细节问题,此篇文章,我们沿着Number的属性和方法...
  • 计算机应用基础作业-答案

    千次阅读 2021-07-15 06:28:00
    1、作业一一、单选题( 40 1分)1、一般认为,世界上第台电子数字计算机诞生于 。A : 1946年 B :1952年 C : 1959年 D : 1962年 答案: A2、既可以接收、处理和输出模拟量,也可以接收、处理和输出数字量的是 。A...
  • 计算机组成期末复习

    千次阅读 2020-11-22 19:03:12
    计算机是种信息处理 D.计算机可实现高速运算 ( c )2、计算机硬件能直接执行的只能是下面哪项。 A.符号语言 B.汇编语言 C.机器语言 D.机器语言和汇编语言 ( c )3、运算器的核心部件是下面哪项。 A.数据...
  • 计算机组成原理

    万次阅读 多人点赞 2019-06-02 14:13:55
    1.第台电子计算机何时何地诞生?英文全称? 1946年2月14日 美国宾夕法尼亚大学 ENIAC:电子数字积分计算机 Electronic(电子的) Numerical(数字的) Integrator(综合者) And Calculator(计算器) 2.冯·...
  • 从今天开始就来带领大家学习微信小程序了,只要你跟着我步步来,相信你也可以上线款属于自己的微信小程序 ,认识小程序 微信⼩程序,简称⼩程序,英⽂名 Mini Program Mini Program ,是⼀种不需要下载安装...
  • 期待未来十年计算机程序技术继续进步,为人类开启更加美好的生活和体验。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 132,433
精华内容 52,973
关键字:

一组数字转换机按下面的程序计算