2021年人工神经网络第四次作业-第五题:危险品识别
简 介: 通过对于物品X射线数据集合的整理,挑选出15类体积比较大的物品,训练LeNet网络进行识别。
关键词
: X射线,危险品识别,LeNet,Paddle
Contents
§01 作业准备
1.1 作业要求
由 2021年人工神经网络第四次作业 对于第五题的要求:
① 构造合适的神经网络,对于数据库中物品X射线图片进行识别分类。可以根据物品不同的大小,在训练网络之前对于图片进行预处理。
② 讨论实验结果中,造成识别错误的因素包括哪些。
③ 探讨如何利用图频的序列信息完成物品的识别的方法。根据自己的时间和经验,选做是否可以通过LSTM网络来利用图频的不同角度序列信息提高识别的精度。
④ 可以根据自己的时间和经验,选做一些目标定位的神经网络:比如YOLO3,SSD等来进行实验。
1.2 数据库准备
1.2.1 原始数据文件下载
从网络学堂下载第四次作业的附加数据文件“ANN-DATASET”下载到自己电脑本地目录。将ZIP文件加压缩之后,形成如下数据目录:
├─CIFAR-10
├─FORBIDDEN
├─FruitAnimal
│ ├─动物
│ │ └─动物
│ └─水果
│ └─水果
├─MNIST
└─ROTATEDIGIT
在FORBIDDEN 子目录中存在如下三个MATLAT数据文件。
xraydata-120-100.matxraydata-240-200.matxraydata-96-80.mat
这三个数据文件承载的都是相同的常见物品的X射线图片,只是相应的尺寸不同。在文件名称后面的两个数字表示这些数据图片的尺寸分别为:(120,100)、(240,200)、(96,80)。下面介绍对于xraydata-96-80.mat的操作,对于另外两个数据文件操作是相同的。
1.2.2 Studio中加载数据文件
在AI Studio的 BML CodeLab环境下,领用界面左边管理界面,通过上载文件将xraydata-96-80.mat加载到工程的主目录下。
注意,只有文件存储在项目主目录(/home/aistudio)下,下次启动的时候,该文件还是存在的。如果将文件存储在 data,work中,这两个目录都是临时目录,下次启动之后,其中的临时文件都会被清除。
▲ 图1.2.1 利用文件上载功能,将数据库文件上传到主目录下
1.2.3 安装mat4py
根据 在Python中读取MATLAB的数据文件 介绍,通过mat4py 可以读取MATLAB的数据文件。在使用改软件包之前需要在当前的AI Studio中安装mat4py。
在Notebook中执行下面的命令,安装mat4py软件包。
! pip install mat4py
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting mat4pyDownloading 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
1.2.4 加载数据
执行下面代码片段,将xraydata-96-80.mat加载到Notebook环境中。
import sys,os,math,time
import matplotlib.pyplot as plt
from numpy import *
from mat4py import loadmatdatazipfile = '/home/aistudio/xraydata-96-80.mat'
data = loadmat(datazipfile)
printf(data.keys())
dict_keys(['images', 'labels', 'labeldir', 'imagesize'])
在读入的data中包括有四个数据表格:
- images : 物品X射线数据,个数:6401,数据长度 7680=98×80
- labels:物品标签,个数:6401
- labeldir :标签对于的字符形态;
- imagesize:图片大小:98×80
将图片数据和标号分别加载到数据 imgdata,labels中。
imgdata = data['images']
labels = data['labels']print(type(imgdata), shape(imgdata))
print(type(labels), shape(labels))
<class 'list'> (6401, 7680)
<class 'list'> (6401,)
(1)图片种类
在 labels 给出了图片的种类。
print(set(labels), "\n\n", 'Tatal Item :%d'%len(set(labels)))
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 600, 601, 602, 603, 604, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 500, 501, 502, 503, 504, 505, 506} Tatal Item :145
总共有145个物品的图片。
1.2.5 显示数据图片
(1)随机挑选图片
随机挑选6401个数据中24图片进行显示。
imgindex = list(range(len(labels)))
random.shuffle(imgindex)PIC_ROW = 4
PIC_COL = 6plt.figure(figsize=(12,8))for j in range(PIC_ROW):for i in range(PIC_COL):id = i + j*PIC_COLimg = array(imgdata[imgindex[id]]).reshape(80,96)plt.subplot(PIC_ROW, PIC_COL, id+1)plt.imshow(img, cmap=plt.cm.gray)
▲ 图1.2.2 数据库中的24个随机挑选图片
(2)显示特定种类物品
itemlabels = list(set(labels))
imgid = where(array(labels) == itemlabels[0])[0]print(imgid)PIC_ROW = 7
PIC_COL = 10
plt.figure(figsize=(12,8))
for j in range(PIC_ROW):for i in range(PIC_COL):id = i + j*PIC_COLif id >= len(imgid): breakimg = array(imgdata[imgid[id]]).reshape(80,96)plt.subplot(PIC_ROW, PIC_COL, id+1)plt.imshow(img, cmap=plt.cm.gray)plt.title('[%d]'%labels[imgid[id]])
Ⅰ.第0号物品:锤子
第0号物品:锤子。
▲ 图1.2.3 第0号物品:锤子。
Ⅱ.第2号物品:尖嘴钳
第2号物品:尖嘴钳。
▲ 图1.2.4 第2号物品:尖嘴钳
1.2.6 数据库物品
(1)挑选数据库物品
数据路中物品有相同物品拍摄了两次,占用了两个编号的情况。其中有些物品非常小,在98×80分辨率下人眼也无法辨析其属性,下面挑选一些比较大的物品用于实验。
序号 | 物品名称 | 标号 | 总数 |
---|---|---|---|
1 | 锤子 | 0 | 72 |
3 | 老虎嘴钳 | 3 | 54 |
3 | 圆把改锥 | 11 | 54 |
4 | 大砍刀 | 16 | 33 |
5 | 仿真手枪 | 22 | 53 |
6 | 水瓶 | 30 | 40 |
7 | 喷水壶 | 36 | 40 |
8 | 玻璃饭盒 | 42 | 40 |
9 | 方便面 | 69 | 40 |
10 | 拖鞋 | 92 | 40 |
11 | 耳机 | 107 | 40 |
12 | 手电筒 | 117 | 40 |
13 | 眼镜 | 113 | 60 |
14 | 塑料盒包含杂物 | 129 | 40 |
15 | 电动剃须刀 | 127 | 40 |
▲ 图1.2.5 不同标号对应的物品图片
▲ 图1.2.6 不同标号对应的物品图片
id = 13
itemlabels = list(set(labels))
imgid = where(array(labels) == itemlabels[id])[0]print(len(imgid))PIC_ROW = 6
PIC_COL = 6
StartID = 108plt.figure(figsize=(15,15))
for j in range(PIC_ROW):for i in range(PIC_COL):id = i + j*PIC_COLimgid = where(array(labels) == itemlabels[id+StartID])[0]img = array(imgdata[imgid[len(imgid)//2]]).reshape(80,96)plt.subplot(PIC_ROW, PIC_COL, id+1)plt.imshow(img, cmap=plt.cm.gray)plt.title('[%d]:%d'%(id+StartID, len(imgid)))
将上面15中物品挑选出来作为作业分类问题的数据库。
▲ 图1.2.7 挑选出来用于实验的15种物品
selectdict = {0:'Hammer', 3:'Pliers', 11:'Screwdriver', 16:'Chopper', 22:'Pistol',30:'Bottle', 36:'Spray', 42:'LunchBox', 69:'Noodle', 92:'Slipper',107:'Earphone', 117:'Flashlight', 113:'Glassese', 129:'Boxes', 127:'Shaver'}PIC_ROW = 3
PIC_COL = 5
StartID = 108selkeys = list(selectdict.keys())plt.figure(figsize=(15,10))
for j in range(PIC_ROW):for i in range(PIC_COL):id = i + j*PIC_COLselid = selkeys[id]imgid = where(array(labels) == itemlabels[selid])[0]img = array(imgdata[imgid[len(imgid)//2]]).reshape(80,96)plt.subplot(PIC_ROW, PIC_COL, id+1)plt.imshow(img, cmap=plt.cm.gray)plt.title('[%s]:%d'%(selectdict[selid], len(imgid)))
(2)存储挑选出的物品
将上面挑选15种,共686张,98×80图片数据存储在 numpy数据文件:xray96_80_15.npz中。
selectimage = []
selectlabels = []
for k in selkeys:imglabels = itemlabels[k]imgid = where(array(labels) == imglabels)[0]for id in imgid:selectlabels.append(imglabels)selectimage.append(imgdata[id])print(selectlabels)
print(shape(selectimage))#------------------------------------------------------------
savez('xray96_80_15', labels=selectlabels, images=selectimage)
1.3 测试数据库
1.3.1 调入数据
调入numpy数据文件,可以看到其中包括有labels, images。
import sys,os,math,time
import matplotlib.pyplot as plt
from numpy import *datafile = 'xray96_80_15.npz'
loaddata = load(datafile)print(loaddata.files)
['labels', 'images']
查看labels, images的数据类型以及尺寸。
labels = loaddata['labels']
images = loaddata['images']print(type(labels), shape(labels))
print(type(images), shape(images))
<class 'numpy.ndarray'> (686,)
<class 'numpy.ndarray'> (686, 7680)
1.3.2 显示数据图片
显示15中用于训练和学习的物品图片。
▲ 图1.3.1 15种用于识别的物品
from headm import * # =datafile = 'xray96_80_15.npz'
loaddata = load(datafile)printf(loaddata.files)labels = loaddata['labels']
images = loaddata['images']print(type(labels), shape(labels))
print(type(images), shape(images))selectdict = {0:'Hammer', 3:'Pliers', 11:'Screwdriver', 16:'Chopper', 22:'Pistol',30:'Bottle', 36:'Spray', 42:'LunchBox', 69:'Noodle', 92:'Slipper',107:'Earphone', 117:'Flashlight', 113:'Glassese', 129:'Boxes', 127:'Shaver'}selkeys = list(selectdict.keys())
printf(selkeys)minnum = min([len(where(labels==k)[0]) for k in selkeys])
maxnum = max([len(where(labels==k)[0]) for k in selkeys])PIC_ROW = 3
PIC_COL = 5gifdir = '/home/aistudio/GIF'for drawid in range(maxnum):plt.figure(figsize=(15, 10))for j in range(PIC_ROW):for i in range(PIC_COL):id = i+j*PIC_COLplt.subplot(PIC_ROW, PIC_COL, id+1);k = selkeys[id]imgwhere = where(labels==k)[0]idid = drawid % len(imgwhere)imgid = imgwhere[idid]imgdata = images[imgid].reshape(80, 96)plt.imshow(imgdata, cmap=plt.cm.gray)plt.axis('off')plt.title(selectdict[k])plt.savefig(os.path.join(gifdir, '%02d.jpg'%drawid))print('\r%d'%drawid)plt.show()
§02 构建网络
2.1 构建数据加载函数
2.1.1 数据加载功能
作为网络分类数据,需要把数据修改成以下格式:
image的数据由原来的 (7680,) 修改成(1,80,96),也就是变成单通道(灰白图像)的数据;
labels的数据都归一化到(0,1,2,…,14)
image的数据修改使用的命令:
img.reshape(80,96)[newaxis,:]
- labels修改命令:
selectdict = {0:'Hammer', 3:'Pliers', 11:'Screwdriver', 16:'Chopper', 22:'Pistol',30:'Bottle', 36:'Spray', 42:'LunchBox', 69:'Noodle', 92:'Slipper',107:'Earphone', 117:'Flashlight', 113:'Glassese', 129:'Boxes', 127:'Shaver'}selkeys = list(selectdict.keys())
labels = [selkeys.index(d) for d in labels]
2.1.2 数据导入与预处理
import sys,os,math,time
import matplotlib.pyplot as plt
from numpy import *import paddle
from paddle.vision.transforms import Resizedatafile = 'xray96_80_15.npz'
loaddata = load(datafile)labels = loaddata['labels']
images = loaddata['images']images = array([img.reshape(80,96)[newaxis,:] for img in images])selectdict = {0:'Hammer', 3:'Pliers', 11:'Screwdriver', 16:'Chopper', 22:'Pistol',30:'Bottle', 36:'Spray', 42:'LunchBox', 69:'Noodle', 92:'Slipper',107:'Earphone', 117:'Flashlight', 113:'Glassese', 129:'Boxes', 127:'Shaver'}selkeys = list(selectdict.keys())
labels = [selkeys.index(d) for d in labels]
2.2 训练数据加载
构建训练数据加载函数。设置批训练大小为100, 数据打乱处理。
class Dataset(paddle.io.Dataset):def __init__(self, num_samples):super(Dataset, self).__init__()self.num_samples = num_samplesdef __getitem__(self, index):data = images[index]label = labels[index]return paddle.to_tensor(data,dtype='float32'), paddle.to_tensor(label,dtype='int64')def __len__(self):return self.num_samples_dataset = Dataset(len(labels))
train_loader = paddle.io.DataLoader(_dataset, batch_size=100, shuffle=True)
2.3 构建LeNet网络
网络结构与LeNet相同。
imgwidth = 96
imgheight = 80
inputchannel =1
kernelsize = 5
featurewidth = ((imgwidth-kernelsize+1)//2-kernelsize+1)//2
featureheight = ((imgheight - kernelsize+1)//2-kernelsize+1)//2class lenet(paddle.nn.Layer):def __init__(self, ):super(lenet, self).__init__()self.conv1 = paddle.nn.Conv2D(in_channels=inputchannel, out_channels=6, kernel_size=kernelsize, stride=1, padding=0)self.conv2 = paddle.nn.Conv2D(in_channels=6, out_channels=16, kernel_size=kernelsize, stride=1, padding=0)self.mp1 = paddle.nn.MaxPool2D(kernel_size=2, stride=2)self.mp2 = paddle.nn.MaxPool2D(kernel_size=2, stride=2)self.L1 = paddle.nn.Linear(in_features=featurewidth*featureheight*16, out_features=120)self.L2 = paddle.nn.Linear(in_features=120, out_features=86)self.L3 = paddle.nn.Linear(in_features=86, out_features=15)def forward(self, x):x = self.conv1(x)x = paddle.nn.functional.relu(x)x = self.mp1(x)x = self.conv2(x)x = paddle.nn.functional.relu(x)x = self.mp2(x)x = paddle.flatten(x, start_axis=1, stop_axis=-1)x = self.L1(x)x = paddle.nn.functional.relu(x)x = self.L2(x)x = paddle.nn.functional.relu(x)x = self.L3(x)return x
使用 paddle.summary()可以显示网络的基本结构。
paddle.summary(lenet(), (100,1,80,96))
---------------------------------------------------------------------------Layer (type) Input Shape Output Shape Param #
===========================================================================Conv2D-39 [[100, 1, 80, 96]] [100, 6, 76, 92] 156 MaxPool2D-39 [[100, 6, 76, 92]] [100, 6, 38, 46] 0 Conv2D-40 [[100, 6, 38, 46]] [100, 16, 34, 42] 2,416 MaxPool2D-40 [[100, 16, 34, 42]] [100, 16, 17, 21] 0 Linear-55 [[100, 5712]] [100, 120] 685,560 Linear-56 [[100, 120]] [100, 86] 10,406 Linear-57 [[100, 86]] [100, 15] 1,305
===========================================================================
Total params: 699,843
Trainable params: 699,843
Non-trainable params: 0
---------------------------------------------------------------------------
Input size (MB): 2.93
Forward/backward pass size (MB): 61.97
Params size (MB): 2.67
Estimated Total Size (MB): 67.57
---------------------------------------------------------------------------{'total_params': 699843, 'trainable_params': 699843}
2.4 构建训练过程
model = lenet()
optimizer = paddle.optimizer.Adam(learning_rate=0.001, parameters=model.parameters())accdim = []
def train(model):model.train()epochs = 20for epoch in range(epochs):for batch, data in enumerate(train_loader()):out = model(data[0])loss = paddle.nn.functional.cross_entropy(out, data[1])acc = paddle.metric.accuracy(out, data[1])loss.backward()optimizer.step()optimizer.clear_grad()accdim.append(acc.numpy())print('Epoch:{}, Loss:{}, Accuracys:{}'.format(epoch, loss.numpy(), acc.numpy()))#------------------------------------------------------------
train(model)plt.figure(figsize=(10, 6))
plt.plot(accdim)
plt.xlabel("Step")
plt.ylabel("Accuracy")
plt.grid(True)
plt.tight_layout()
plt.show()
2.5 存储
model = lenet()
optimizer = paddle.optimizer.Adam(learning_rate=0.001, parameters=model.parameters())accdim = []
def train(model):model.train()epochs = 20for epoch in range(epochs):for batch, data in enumerate(train_loader()):out = model(data[0])loss = paddle.nn.functional.cross_entropy(out, data[1])acc = paddle.metric.accuracy(out, data[1])loss.backward()optimizer.step()optimizer.clear_grad()accdim.append(acc.numpy())print('Epoch:{}, Loss:{}, Accuracys:{}'.format(epoch, loss.numpy(), acc.numpy()))#------------------------------------------------------------
train(model)plt.figure(figsize=(10, 6))
plt.plot(accdim)
plt.xlabel("Step")
plt.ylabel("Accuracy")
plt.grid(True)
plt.tight_layout()
plt.show()
paddle.save(model.state_dict(), './work/model.pdparams')
§03 网络训练
3.1 基本训练过程
把所有的数据都用于网络的训练,训练过程识别准确性的变化为。
训练的参数
- LeNet训练参数:
-
学习速率
:0.01
训练批次
:20
批次样本
:100
训练精度变化曲线
进行了两次训练,在AI Studio CPU环境下,训练时间为33秒。
下面是两次训练识别精度的变化曲线。
▲ 图3.1.1 网络训练过程精度变化过程
▲ 图3.1.2 网络训练过程识别精度变化
§04 作业总结
通过对于物品X射线数据集合的整理,挑选出15类体积比较大的物品,训练LeNet网络进行识别。
4.1 附录
4.1.1 数据库处理程序
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST1.PY -- by Dr. ZhuoQing 2021-12-17
#
# Note:
#============================================================from headm import * # =
from mat4py import loadmatdatazipfile = '/home/aistudio/xraydata-96-80.mat'
data = loadmat(datazipfile)printf(data.keys())#------------------------------------------------------------imgdata = data['images']
labels = data['labels']print(type(imgdata), shape(imgdata))
print(type(labels), shape(labels))#------------------------------------------------------------
imgindex = list(range(len(labels)))
random.shuffle(imgindex)PIC_ROW = 4
PIC_COL = 6plt.figure(figsize=(12,8))for j in range(PIC_ROW):for i in range(PIC_COL):id = i + j*PIC_COLimg = array(imgdata[imgindex[id]]).reshape(80,96)plt.subplot(PIC_ROW, PIC_COL, id+1)plt.imshow(img, cmap=plt.cm.gray)plt.title('[%d]'%labels[imgindex[id]])#------------------------------------------------------------
printf(set(labels),, 'Tatal Item :%d'%len(set(labels)))
itemlabels = list(set(labels))#------------------------------------------------------------
id = 13
imgid = where(array(labels) == itemlabels[id])[0]print(len(imgid))PIC_ROW = 6
PIC_COL = 6
StartID = 108plt.figure(figsize=(15,15))
for j in range(PIC_ROW):for i in range(PIC_COL):id = i + j*PIC_COLimgid = where(array(labels) == itemlabels[id+StartID])[0]img = array(imgdata[imgid[len(imgid)//2]]).reshape(80,96)plt.subplot(PIC_ROW, PIC_COL, id+1)plt.imshow(img, cmap=plt.cm.gray)plt.title('[%d]:%d'%(id+StartID, len(imgid)))#------------------------------------------------------------selectdict = {0:'Hammer', 3:'Pliers', 11:'Screwdriver', 16:'Chopper', 22:'Pistol',30:'Bottle', 36:'Spray', 42:'LunchBox', 69:'Noodle', 92:'Slipper',107:'Earphone', 117:'Flashlight', 113:'Glassese', 129:'Boxes', 127:'Shaver'}PIC_ROW = 3
PIC_COL = 5
StartID = 108selkeys = list(selectdict.keys())plt.figure(figsize=(15,10))
for j in range(PIC_ROW):for i in range(PIC_COL):id = i + j*PIC_COLselid = selkeys[id]imgid = where(array(labels) == itemlabels[selid])[0]img = array(imgdata[imgid[len(imgid)//2]]).reshape(80,96)plt.subplot(PIC_ROW, PIC_COL, id+1)plt.imshow(img, cmap=plt.cm.gray)plt.title('[%s]:%d'%(selectdict[selid], len(imgid)))#------------------------------------------------------------selectimage = []
selectlabels = []
for k in selkeys:imglabels = itemlabels[k]imgid = where(array(labels) == imglabels)[0]for id in imgid:selectlabels.append(k)selectimage.append(imgdata[id])printf(selectlabels)
printf(shape(selectimage))#------------------------------------------------------------
savez('xray96_80_15', labels=selectlabels, images=selectimage)#------------------------------------------------------------
# END OF FILE : TEST1.PY
#============================================================
4.2 数据库验证程序
import sys,os,math,time
import matplotlib.pyplot as plt
from numpy import *datafile = 'xray96_80_15.npz'
loaddata = load(datafile)print(loaddata.files)labels = loaddata['labels']
images = loaddata['images']print(type(labels), shape(labels))
print(type(images), shape(images))selectdict = {0:'Hammer', 3:'Pliers', 11:'Screwdriver', 16:'Chopper', 22:'Pistol',30:'Bottle', 36:'Spray', 42:'LunchBox', 69:'Noodle', 92:'Slipper',107:'Earphone', 117:'Flashlight', 113:'Glassese', 129:'Boxes', 127:'Shaver'}selkeys = list(selectdict.keys())
print(selkeys)minnum = min([len(where(labels==k)[0]) for k in selkeys])
maxnum = max([len(where(labels==k)[0]) for k in selkeys])PIC_ROW = 3
PIC_COL = 5gifdir = '/home/aistudio/GIF'for drawid in range(maxnum):plt.figure(figsize=(15, 10))for j in range(PIC_ROW):for i in range(PIC_COL):id = i+j*PIC_COLplt.subplot(PIC_ROW, PIC_COL, id+1);k = selkeys[id]imgwhere = where(labels==k)[0]idid = drawid % len(imgwhere)imgid = imgwhere[idid]imgdata = images[imgid].reshape(80, 96)plt.imshow(imgdata, cmap=plt.cm.gray)plt.axis('off')plt.title(selectdict[k])plt.savefig(os.path.join(gifdir, '%02d.jpg'%drawid))print('\r%d'%drawid)plt.show()
4.3 LeNet网络与训练程序
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST3.PY -- by Dr. ZhuoQing 2021-12-18
#
# Note:
#============================================================from headm import * # =import paddle
from paddle.vision.transforms import Resizedatafile = 'xray96_80_15.npz'
loaddata = load(datafile)labels = loaddata['labels']
images = loaddata['images']images = array([img.reshape(80,96)[newaxis,:] for img in images])selectdict = {0:'Hammer', 3:'Pliers', 11:'Screwdriver', 16:'Chopper', 22:'Pistol',30:'Bottle', 36:'Spray', 42:'LunchBox', 69:'Noodle', 92:'Slipper',107:'Earphone', 117:'Flashlight', 113:'Glassese', 129:'Boxes', 127:'Shaver'}selkeys = list(selectdict.keys())
labels = [selkeys.index(d) for d in labels]#printf(shape(images))
#printf(labels)#------------------------------------------------------------class Dataset(paddle.io.Dataset):def __init__(self, num_samples):super(Dataset, self).__init__()self.num_samples = num_samplesdef __getitem__(self, index):data = images[index]label = labels[index]return paddle.to_tensor(data,dtype='float32'), paddle.to_tensor(label,dtype='int64')def __len__(self):return self.num_samples_dataset = Dataset(len(labels))
train_loader = paddle.io.DataLoader(_dataset, batch_size=100, shuffle=True)#------------------------------------------------------------imgwidth = 96
imgheight = 80
inputchannel = 1
kernelsize = 5
targetsize = 15
ftwidth = ((imgwidth-kernelsize+1)//2-kernelsize+1)//2
ftheight = ((imgheight-kernelsize+1)//2-kernelsize+1)//2class lenet(paddle.nn.Layer):def __init__(self, ):super(lenet, self).__init__()self.conv1 = paddle.nn.Conv2D(in_channels=inputchannel, out_channels=6, kernel_size=kernelsize, stride=1, padding=0)self.conv2 = paddle.nn.Conv2D(in_channels=6, out_channels=16, kernel_size=kernelsize, stride=1, padding=0)self.mp1 = paddle.nn.MaxPool2D(kernel_size=2, stride=2)self.mp2 = paddle.nn.MaxPool2D(kernel_size=2, stride=2)self.L1 = paddle.nn.Linear(in_features=ftwidth*ftheight*16, out_features=120)self.L2 = paddle.nn.Linear(in_features=120, out_features=86)self.L3 = paddle.nn.Linear(in_features=86, out_features=targetsize)def forward(self, x):x = self.conv1(x)x = paddle.nn.functional.relu(x)x = self.mp1(x)x = self.conv2(x)x = paddle.nn.functional.relu(x)x = self.mp2(x)x = paddle.flatten(x, start_axis=1, stop_axis=-1)x = self.L1(x)x = paddle.nn.functional.relu(x)x = self.L2(x)x = paddle.nn.functional.relu(x)x = self.L3(x)return xmodel = lenet()#------------------------------------------------------------paddle.summary(model, input_size=(100,1,80,96))
#paddle.flops(model, input_size=(100,1,86,96), print_detail=True)#-----------------------------------------------------------
optimizer = paddle.optimizer.Adam(learning_rate=0.001, parameters=model.parameters())accdim = []
def train(model):model.train()epochs = 20for epoch in range(epochs):for batch, data in enumerate(train_loader()):out = model(data[0])loss = paddle.nn.functional.cross_entropy(out, data[1])acc = paddle.metric.accuracy(out, data[1])loss.backward()optimizer.step()optimizer.clear_grad()accdim.append(acc.numpy())# if batch%2 == 0:
# print('Epoch:{}, Loss:{}, Accuracys:{}'.format(epoch, loss.numpy(), acc.numpy()))print('Epoch:{}, Loss:{}, Accuracys:{}'.format(epoch, loss.numpy(), acc.numpy()))#------------------------------------------------------------
train(model)plt.figure(figsize=(10, 6))
plt.plot(accdim)
plt.xlabel("Step")
plt.ylabel("Accuracy")
plt.grid(True)
plt.tight_layout()
plt.show()#------------------------------------------------------------
paddle.save(model.state_dict(), './work/model.pdparams')#------------------------------------------------------------
# END OF FILE : TEST3.PY
#============================================================
■ 相关文献链接:
- 2021年人工神经网络第四次作业要求
- 在Python中读取MATLAB的数据文件
● 相关图表链接:
- 图1.2.1 利用文件上载功能,将数据库文件上传到主目录下
- 图1.2.2 数据库中的24个随机挑选图片
- 图1.2.3 第0号物品:锤子。
- 图1.2.4 第2号物品:尖嘴钳
- 图1.2.5 不同标号对应的物品图片
- 图1.2.6 不同标号对应的物品图片
- 图1.2.7 挑选出来用于实验的15种物品
- 图1.3.1 15种用于识别的物品
- 图3.1.1 网络训练过程精度变化过程
2021年人工神经网络第四次作业-第五题:危险品识别相关推荐
- 2021年人工神经网络第四次作业 - 第三题Cifar10
简 介: 在Paddle下使用最基本的BP网络以及LeNet网络结构,测试了Cifar10数据集合.但实际运行在测试集合上的效果始终没有突破0.3,具体原因还需要进行查找. 后来经过测试,发现问题出现 ...
- 2021年人工神经网络第四次作业:基于MATLAB的求解
简 介: 本文选取了2021年人工神经网络第四次作业学生提交的作业.供交流使用. 关键词: 人工神经网络 #mermaid-svg-ATqdYQemfmABj2Hj {font-family:&quo ...
- 2021年人工神经网络第四次作业要求:第七题
简 介: 对于MATLAB中的SimpleClass数据集合,对比了BP,RBF,SVM,SOFM,DHNN 等方法分类结果,可以看到BP,RBF,SVM,SOFM都具有非常好的分类效果.DHNN对于 ...
- 2021年人工神经网络第四次作业 - 第二题MNIST手写体识别
简 介: ※MNIST数据集合是深度学习基础训练数据集合.改数据集合可以使用稠密前馈神经网络训练,也可以使用CNN.本文采用了单隐层BP网络和LeNet网络对于MNIST数据集合进行测试.实验结果标明 ...
- 2021年人工神经网络第四次作业-第四题:旋转的数字
简 介: 本文对于作业中给定的机械数字字符识别问题进行了实验研究.通过对于采样1000样本的数据集合进行训练,经过增加DropOut的可以增加网络的泛化性能.对于网络规模的增加对训练精度没有明显的改进 ...
- 2021年人工神经网络第四次作业-第一题:LeNet对于水果与动物进行分类
简 介: 对于有五种动物和五中水果组成的FAMNIST数据集合的图像分类问题进行了测试.本文主要是集中在前期的数据库的准备和网络的构建方面.对于网络的详细测试参见在 对于FAMNIST中的十种动物和水 ...
- 2021年人工神经网络第三次作业-第二题:遗传算法与人工神经网络-参考答案
简 介: 给出了对于BP网络求解异或问题过程中,利用遗传算法完成网络演变的过程.所使用的遗传算法是最基本的遗传算法.利用遗传算法对于网络的系数进行演变,可以对网络系数初始化过程进行优化.对于不同的遗传 ...
- 2022年秋季学期人工神经网络第四次作业
说明: 本次作业是针对这学期经典神经网络中的内容,主要涵盖竞争神经网络课程内容相关的算法. 完成作业可以使用你所熟悉的编程语言和平台,比如 C,C++.MATLAB.Python等. 作业要求链接: ...
- 合工大Java第四次作业第五题
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 题目描述 一.题目分析 二.难点及解决方案 1.文件读取出的字符串是一整行的数据,包含了学生的姓名.学号和成绩,如何处理数据 ...
最新文章
- ID--HANDLE--HWND三者之间的互相转换(转)
- php版 v2.0,KangPHP v2.0 正式版
- linux 虚拟机挂载本地,CentOS 在VMWare中挂载本地yum源
- 怎么配置 Oracle 侦听器来使用SQL操作ST_Geometry
- mongodb数据库显示obj_Mongodb使用
- intellij idea主题
- ArcEngine在个人地理数据库下创建要素类
- python自动化测试-五大自动化测试的Python框架
- No space left on device 磁盘空间提示不足解决办法
- PyRobot开辟 AI 机器人框架
- 好想看故乡夏夜的天空
- LintCode: Combination Sum
- Oracle 11g R2 RAC上配置TAF和Load balance
- GmId设计方法介绍及曲线仿真
- 解决删除文件时出现“无法读取源文件或磁盘”的办法
- 怎样快速修改论文格式-使用人工智能技术助手
- 随机分组c语言,用C/C++进行随机分组的实现教程,分组教程
- 一个Sqrt函数引发的血案
- Flutter 时间戳转换成时间 时间字符串转换成时间戳
- Google URL Shorter
热门文章
- 画原型时需要注意什么?
- 调用webservice 的时候没法输入参数
- 与用户登录有关的命令w who whoami last lastb lastlog
- 记一次数据库查询语句的优化
- 手机QQ会员H5加速方案——sonic技术内幕
- TYVJ P1053 字符串的展开 Label:字符 水
- intellij (org.jdom.input.JDOMParseException) Error on line 1: 前言中不允许有内容。
- linux下磁盘分区
- cidaemon.exe进程cpu占用率高及关闭cidaemon.exe进程方法
- java基础--集合Connection/Map