2021年人工神经网络第四次作业-第四题:旋转的数字
Posted 卓晴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021年人工神经网络第四次作业-第四题:旋转的数字相关的知识,希望对你有一定的参考价值。
简 介: 本文对于作业中给定的机械数字字符识别问题进行了实验研究。通过对于采样1000样本的数据集合进行训练,经过增加DropOut的可以增加网络的泛化性能。对于网络规模的增加对训练精度没有明显的改进。由于数据集合比较小,因此作业中的一些结论并不具有代表特性。
关键词
: 旋转数字,Dropout,LeNet
§01 作业准备
1.1 作业要求
根据 2021年人工神经网络第四次作业要求 对于第四次作业的要求,将作业条件整理如下:
1.1.1 数据库
ROTATEDIGIT数据集合是采集到机械电能表显示的数字。这类数字中包含有数字滚轮在不同角度下数字的图片。这些数字不同角度除了对应了数字本身,还代表了整数之间的小数分量。
▲ 图1.1.1 机械电能表上的旋转数字
在ROTATEDIGIT目录下包括有如下六个数据文件:
▲ 图1.1.2 六个数据文件
将数据库使用MATLAB命令LOAD调入之后,会产生以下数据变量:
1. digitsize: 表示数字图像的尺寸
2. digit:1000×2128×3,数字图片。前面是数字图片的个数,中间是宽×高,后面是RGB三维。
3. labels:数字标签:0~9
4. fraction:表示数字整数之后的小数。即反映了数字旋转的程度。fraction部分,有的数据集合存在,有的不存在。
1.1.2 实验要求
① 选择合适的神经网络,完成对数据集合的字符识别。
② 讨论使用某一类数字集合训练之后的网络,在另外数字集合上的泛化性能。
③ 讨论网络正则化的方法对于网络泛化能力的影响:
1. 对于网络权系数范数约束;
2. 对输入样本增加噪声;
3. 对输入样板进行变形增强;
4. 使用Drop-out技术训练网络
④ 对于有Fraction标签的数据集合,构造一个具有输出带有小数点数字输出的回归网络。并讨论它与前面分类网络在网络结构,训练方法等方面的特点。
1.2 数据准备
1.2.1 下载并解压缩数据文件
从网络学堂下载第四次作业数据文件,ANN-DATA.ZIP,经过解压缩之后,可以获得如下子目录。
├─CIFAR-10
├─FORBIDDEN
├─FruitAnimal
│ ├─动物
│ │ └─动物
│ └─水果
│ └─水果
├─MNIST
└─ROTATEDIGIT
在ROTATEDEGIT目录中,具有如下六个MATLAB 的.MAT文件。
black_10.mat
black_11.mat
black_1_1.mat
red_10.mat
red_20.mat
red_21.mat
1.2.2 Studio环境
将上述数据文件上载到AI Studio的的work目录中。
- 注意: 不要在data目录中存储数据文件。这个目录只是用于存储临时生成的数据文件。在下次启动的时候,该目录中除了项目一开始添加的数据文件之外,其它的数据和子目录将会被清除。
上载到AI Studio work 子目录 rotatedigit子目录中的数据文件:
▲ 图1.2.1 上载到AI Studio work 子目录 rotatedigit子目录中的数据文件:
1.2.3 读取和分析数据
(1)安装mat4py
根据 在Python读取MATLAB数据文件 介绍,利用mat4py读取MATLAB的数据文件的方法,所以需要在notebook环境下安装mat4py软件包。
! pip install mat4py
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting mat4py
Downloading https://pypi.tuna.tsinghua.edu.cn/packages/e8/56/41b3ffd7b5f3eb3056979e0dc37de184c6e5dacd1a353e5de42323e7d138/mat4py-0.5.0-py2.py3-none-any.whl
Installing collected packages: mat4py
Successfully installed mat4py-0.5.0
(2)读取分析数据文件
读取 black_10.mat 数据文件并显示其中的内容。
由于在原来的数据存在彩色数字图片数据,这是三维的数据。
MATLAB的数据文件中存在三维度的数组,在使用 mat4py 的 loadmat 函数读取该文件的时候,会出现错误。
▲ 图1.2.2 MATLAB的数据文件中存在三维度的数组
import sys,os,math,time
import matplotlib.pyplot as plt
from numpy import *
import mat4py
datafile = '/home/aistudio/work/rotatedigit/black_10.mat'
data = mat4py.loadmat(datafile)
print(data.keys())
---------------------------------------------------------------------------
ParseError Traceback (most recent call last)
/tmp/ipykernel_250/1524074423.py in <module>
6 datafile = '/home/aistudio/work/rotatedigit/black_10.mat'
7
----> 8 data = mat4py.loadmat(datafile)
9
10 print(data.keys())
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/mat4py/loadmat.py in loadmat(filename, meta)
458 # read data elements
459 while not eof(fd):
--> 460 hdr, next_position, fd_var = read_var_header(fd, endian)
461 name = hdr['name']
462 if name in mdict:
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/mat4py/loadmat.py in read_var_header(fd, endian)
254 'got '.format(etypes['miMATRIX']['n'], mtpn))
255 # read the header
--> 256 header = read_header(fd, endian)
257 return header, next_pos, fd
258
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/mat4py/loadmat.py in read_header(fd, endian)
222 header['n_dims'] = len(header['dims'])
223 if header['n_dims'] != 2:
--> 224 raise ParseError('Only matrices with dimension 2 are supported.')
225 header['name'] = read_elements(fd, endian, ['miINT8'], is_name=True)
226 return header
ParseError: Only matrices with dimension 2 are supported.
(3)解决方法
在MATLAB中将原来存储数字的图片矩阵修改成二维的数组,将原有的存储数字图片数组尺寸:(120×1776×3)修改成(120×5328)。然后重新存储这些数据文件,再上载AI Studio环境进行读取。
Ⅰ.在MATLAB修改数组并存储
>>> digit2 = reshape(digit, 120, 5328)
>>> save('d:\\temp\\black_10_mod', 'digit2', 'labels')
Ⅱ.上载读取测试
import sys,os,math,time
import matplotlib.pyplot as plt
from numpy import *
import mat4py
datafile = '/home/aistudio/work/rotatedigit/black_10_mod.mat'
data = mat4py.loadmat(datafile)
print(data.keys())
dict_keys(['digit2', 'labels'])
可以看到在将原有的MATLAB数据文件中的三维数组修改成二维之后,便可以使用mat4py的loadmat函数正常读取了。
labels = data['labels']
images = data['digit2']
print(type(labels), "\\n", shape(labels))
print(type(images), "\\n", shape(images))
<class 'list'>
(120,)
<class 'list'>
(120, 5328)
print(labels)
['4', '4', '4', '4', '4', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '8', '8', '8', '8', '8', '8', '8', '8', '8', '8', '8', '8', '9', '9', '9', '9', '9', '9', '9', '0', '0', '0', '0', '0', '1', '1', '1', '1', '1', '1', '1', '9', '9', '9', '9', '9', '1', '1', '1', '1', '1', '0', '2', '2', '2', '2', '2', '2', '2', '0', '0', '0', '0', '0', '0', '2', '2', '2', '2', '2', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '4', '4', '4', '4', '4', '4', '4']
1.2.4 显示图片
(1)显示单张图片
imagewidth = 37
imageheight = 48
imgdata = array(images[10]).reshape(3, imageheight, imagewidth).swapaxes(1,2).T
print(shape(imgdata))
plt.figure(figsize=(5, 7))
plt.imshow(imgdata)
(48, 37, 3)
<matplotlib.image.AxesImage at 0x7f769d4ce350>
第10张图片对应的数字图片:
▲ 图1.2.3 第10张图片对应的数字图片:
(2)顺序显示所有图片
顺序显示所有的图片,这是所有采集到的旋转移动的数字图片。
▲ 图1.2.4 顺序显示所有的图片
gifpath = '/home/aistudio/GIF'
filedim = os.listdir(gifpath)
for f in filedim:
fn = os.path.join(gifpath, f)
if os.path.isfile(fn):
os.remove(fn)
for i in range(len(labels)):
imgdata = array(images[i]).reshape(3,imageheight, imagewidth).swapaxes(1,2).T
plt.figure(figsize=(5,7))
plt.imshow(imgdata)
savefile = os.path.join(gifpath, '%03d.jpg'%i)
plt.savefig(savefile)
print('Save figure:%d'%i)
1.2.5 数据全部处理
以上是关于2021年人工神经网络第四次作业-第四题:旋转的数字的主要内容,如果未能解决你的问题,请参考以下文章