2021年人工神经网络第四次作业-第一题:LeNet对于水果与动物进行分类

简 介: 对于有五种动物和五中水果组成的FAMNIST数据集合的图像分类问题进行了测试。本文主要是集中在前期的数据库的准备和网络的构建方面。对于网络的详细测试参见在 对于FAMNIST中的十种动物和水果进行识别测试 中的测试结果。

关键词 FAMNISTLENET人工神经网络

作业准备
目 录
Contents
作业要求
数据预处理
数据文件整理
FAMNIST数据库
构建CNN
LeNet识别
作业总结
程序代码

 

§01 业准备


1.1 作业要求

  根据 2021年人工神经网络第四次作业要求 对于第一题的要求:设计一个卷积神经网络(CNN)完成对于给定水果(五类)和动物(五类)总共十类物体的识别。

1.1.1 数据库

  数据是 第十六届智能视觉组 中的比赛数据库。五种动物和五种水果彩色图片,大小为283×283,分别存储在是个目录中:

├─FruitAnimal
│ ├─动物
│ │ └─动物
│ │ ├─牛
│ │ ├─狗
│ │ ├─猪
│ │ ├─猫
│ │ └─马
│ └─水果
│ └─水果
│ ├─榴莲
│ ├─橙子
│ ├─苹果
│ ├─葡萄
│ └─香蕉

  数据库可以在 AI Studio 数据库下载

▲ 图1.1.1 AI Studio 中的数据库

▲ 图1.1.1 AI Studio 中的数据库

 

§02 据预处理


  将原始的图片转换成一定尺寸的彩色、灰度图片,用于网络的训练。

2.1 数据文件整理

2.1.1 Studio项目

  在AI Stdio中建立基于BML CodeLab工作环境的训练项目,添加“五种动物和水果数据库”。进入环境之后,可以在环境中找到数据库:

▲ 图2.1.1 建立AI Studio工程项目

▲ 图2.1.1 建立AI Studio工程项目

data/data120001/FruitAnimal.zip

2.1.2 下载数据文件

  由于原来给定的数据文件存在目录是汉字,在AI studio环境操作有一定的困难。

▲ 图2.1.2 原始的压缩包中的目录是汉字

▲ 图2.1.2 原始的压缩包中的目录是汉字

  因此将该压缩包下载到本地,经过解压缩之后,将所有的子目录的名称修改成对应的英文。然后在重新压缩上载到AI Studio中的 “/data” 字母中。

├─animal
│ ├─cat
│ ├─cow
│ ├─dog
│ ├─horse
│ └─pig
└─fruit
    ├─apple
    ├─banana
    ├─durian
    ├─grape
    └─orange

2.1.3 加压缩文件

  可以利用AI Studio中的“抽取压缩文件” 鼠标右键功能对于上载数据文件 FruitAnimal.zip文件进行解压缩。也可以通过 Python中读取ZIP文件 ,对于压缩文件进行解压缩。

2.1.4 整理成faMNIST数据库

  总共有十种图片(五种动物,五种水果),下面将这些图片整理成不同规格图片数据库。

(1)文件命名规范
 Ⅰ.动物水果排序

  十种动物和水果的种类按照下面的 dict中的定义顺序:

afname = {'cat':0, 'cow':1, 'dog':2, 'horse':3, 'pig':4,
          'apple':5, 'banana':6, 'durian':7, 'grape':8, 'orange':9}
 Ⅱ.文件名结构

  文件名称包括有:排序号,原文件名称信息,如下所示:

排序_01.png

  下面是经过处理之后,FAMNIST目录中部分文件名称:

0_01.png 1_39.png 2_67.png 4_03.png 5_45.png 6_87.png 8_49.png
0_02.png 1_3.png 2_68.png 4_04.png 5_46.png 6_88.png 8_50.png
0_03.png 1_40.png 2_69.png 4_05.png 5_47.png 6_89.png 8_51.png
0_04.png 1_41.png 2_70.png 4_06.png 5_48.png 6_90.png 8_52.png
0_05.png 1_42.png 2_71.png 4_07.png 5_49.png 6_91.png 8_53.png
0_06.png 1_43.png 2_72.png 4_08.png 5_50.png 6_92.png 8_54.png
0_07.png 1_44.png 2_73.png 4_09.png 5_51.png 6_93.png 8_55.png
0_08.png 1_45.png 2_74.png 4_10.png 5_52.png 7_01.png 8_56.png
0_09.png 1_46.png 2_75.png 4_11.png 5_53.png 7_02.png 8_57.png
0_10.png 1_47.png 2_76.png 4_12.png 5_54.png 7_03.png 8_58.png
0_11.png 1_48.png 2_77.png 4_13.png 5_55.png 7_04.png 8_59.png
0_12.png 1_49.png 2_78.png 4_14.png 5_56.png 7_05.png 8_60.png
0_13.png 1_4.png 2_79.png 4_15.png 5_57.png 7_06.png 8_61.png
0_14.png 1_50.png 2_80.png 4_16.png 5_58.png 7_07.png 8_62.png
0_15.png 1_51.png 2_81.png 4_17.png 5_59.png 7_08.png 8_63.png
0_16.png 1_52.png 2_82.png 4_18.png 5_60.png 7_09.png 8_64.png
0_17.png 1_53.png 2_83.png 4_19.png 5_61.png 7_10.png 8_65.png

  十种动物水果每个小类的数量如下:

1.cow:93
2.pig:88
3.cat:99
4.horse:95
5.dog:101
6.apple:88
7.durian:75
8.orange:86
9.grape:89
10.banana:93
All file: 907

  • 文件数量: 907
(2)处理程序

  下面是将原有的文件进行拷贝,重新命名的程序:

import sys,os,math,time
import matplotlib.pyplot as plt
from numpy import *
import shutil

homepath = '/home/aistudio'
originpath = 'data/afmnist'

fapath = os.path.join(homepath, originpath)
def scanallpath(fpath):
    subpath = []

    fs1 = os.listdir(fpath)
    for p in fs1[:2]:
        scanfs = os.listdir(os.path.join(fpath,p))
        sp = os.path.join(fpath, p)
        for s in scanfs:
            subpath.append(os.path.join(sp, s))

    return subpath

allpath = scanallpath(fapath)

afname = {'cat':0, 'cow':1, 'dog':2, 'horse':3, 'pig':4,
          'apple':5, 'banana':6, 'durian':7, 'grape':8, 'orange':9}

outpath = os.path.join(homepath, 'data/FAMNIST/FAMNIST-ALL')
allcount = 0
passid = 0

for p in allpath:
    passid += 1
    fdim = os.listdir(p)
    pname = afname[p.split('/')[-1]]
    subcount = 0
    for fn in fdim:
        if fn.find('png') < 0: continue
        fname = os.path.join(p, fn)
        newname = '%d_%s'%(pname, fn)
        outname = os.path.join(outpath, newname)

        shutil.copy(fname, outname)
        allcount += 1
        subcount += 1

    print('{}.{}:{}'.format(passid, p.split('/')[-1], subcount))

print('All file: {}'.format(allcount))

2.2 FAMNIST数据库

  为了作业中的实验,将动物水果数据集合进行整理:

  • 将图片Resize成不同尺寸的小图;
  • 将图片进行增强;

2.2.1 原始图片库

  这是最初时的图片数据库。

数据库参数:
种类:10类
色彩:彩色图片
尺寸:283×283

▲ 图2.2.1 原始数据中集中典型物品

▲ 图2.2.1 原始数据中集中典型物品

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# SHOWPIC.PY                   -- by Dr. ZhuoQing 2021-12-16
#
#   Show some pictures in the FAMNIST directory in shuffle order.
#
#   Usage : showpic directory
#
# Note:
#============================================================

from headm import *                 # =*
import cv2

famnist = '/home/aistudio/data/famnist'
dirstr = 'famnist-all'

#------------------------------------------------------------
dirall = os.path.join(famnist, dirstr)
filedim = os.listdir(dirall)
random.shuffle(filedim)

#------------------------------------------------------------
ROW_NUM = 3
COL_NUM = 5

plt.figure(figsize=(10,6))

for j in range(ROW_NUM):
    for i in range(COL_NUM):
        id = j*COL_NUM + i
        fn = os.path.join(dirall, filedim[id])
        img = cv2.imread(fn).T[::-1].T
        plt.subplot(ROW_NUM, COL_NUM, id+1)
        plt.imshow(img)
        plt.axis('off')
        plt.title(filedim[id])
        plt.show

#------------------------------------------------------------
#        END OF FILE : SHOWPIC.PY
#============================================================

2.2.2 FAMNIST10

  这是将原来的图片都变成32×32大小的彩色图片。

图片库参数:
存储目录:FAMNIST10
色彩:彩色图片
尺寸:32×32
(1)转换程序
import sys,os,math,time
import matplotlib.pyplot as plt
from numpy import *
import cv2

famnist = '/home/aistudio/data/famnist'

alldir = 'famnist-all'
outdir = 'famnist10'

allpath = os.path.join(famnist, alldir)
filedim = os.listdir(allpath)

outdir = os.path.join(famnist, outdir)
imgWidth = 32
imgHeight = 32

for id, f in enumerate(filedim):
    infile = os.path.join(allpath, f)
    outfile = os.path.join(outdir, f)

    img = cv2.imread(infile)
    imgsize = cv2.resize(img, (imgWidth, imgHeight), cv2.INTER_LINEAR)

    cv2.imwrite(outfile, imgsize)

    print("Process %d, %s"%(id, f))
(2)图片样例

▲ 图2.2.2 FAMNIST10 32×32彩色图片

▲ 图2.2.2 FAMNIST10 32×32彩色图片

2.2.3 FAMNIST10-gray

  这是将上面的FAMNIST10转换成灰度图片。

图片库参数:
存储目录:FAMNIST10-gray
色彩:灰度图片
尺寸:32×32
imgWidth = 32
imgHeight = 32

for id, f in enumerate(filedim):
    infile = os.path.join(allpath, f)
    outfile = os.path.join(outdir, f)

    img = cv2.imread(infile, cv2.IMREAD_GRAYSCALE)
    imgsize = cv2.resize(img, (imgWidth, imgHeight), cv2.INTER_LINEAR)

▲ 图2.2.3 famnist10-gray 数据库

▲ 图2.2.3 famnist10-gray 数据库

2.2.4 FAMNIST10-64

  这是尺寸为64×64的图片库。

图片库参数:
存储目录:famnist10-64
色彩:彩色图片
尺寸:64×64

▲ 图2.2.4 famnist10-64 图片样例

▲ 图2.2.4 famnist10-64 图片样例

2.2.5 FAMNIST10-64-gray

  这是上面famnist10-64图片存储成灰度图片。
图片库参数:
: 存储目录:famnist10-64-gray
色彩:灰度图片
尺寸:64×64

▲ 图2.2.5 famnist10-64-gray

▲ 图2.2.5 famnist10-64-gray

 

§03 建CNN


3.1 LeNet识别

3.1.1 构建训练数据

  将图片数据从存储目录读入内存,用于网络的训练。

(1)读入图片数据和标签

  根据【2.1.4.1:文件命名规范】中对于文件名的定义,在读入图片数据的过程中,也可以获得图片的种类标签。

 Ⅰ.读取程序
import sys,os,math,time
import matplotlib.pyplot as plt
from numpy import *
import cv2

 #------------------------------------------------------------
famnist = '/home/aistudio/data/famnist'
imgdir = 'famnist10-gray'

 #------------------------------------------------------------
def loadimgdata(imgdir):
    '''
    loadimgdata: Load test image data into RAM
    Param imgdir: Directory for storing the image picture .
    Return: imgdata,imglabel
    '''

    imgfile = os.listdir(imgdir)

    imgdata = []
    imglabel = []
    for f in imgfile:
        img = cv2.imread(os.path.join(imgdir, f))
        imgdata.append(img.T)
        imglabel.append(int(f[:1]))

    return array(imgdata), array(imglabel)

imgdata,imglabel = loadimgdata(os.path.join(famnist,imgdir))
 Ⅱ.数据结果
print(imgdata.shape)
print(imglabel)
(906, 3, 32, 32)
[6 6 3 4 9 6 0 6 3 2 2 3 2 0 4 3 8 9 2 9 9 9 0 4 0 3 9 4 1 3 8 4 0 4 2 8 6
 4 9 0 0 4 9 2 3 7 8 7 9 5 6 0 7 2 3 6 5 3 0 9 8 6 0 0 3 0 4 0 9 4 0 4 3 6
 0 5 7 9 3 3 1 8 2 4 6 4 6 5 2 9 9 2 3 0 5 8 3 7 6 0 2 4 5 7 8 5 6 9 3 4 8
 4 8 1 8 9 2 4 8 7 3 2 6 8 9 0 5 1 8 3 5 4 3 6 8 1 6 9 0 0 9 0 5 5 8 9 9 7
 7 5 4 7 1 3 8 9 5 2 2 6 6 1 6 6 7 7 6 4 4 5 4 0 1 3 5 3 6 9 1 6 2 0 6 2 3
 9 8 2 8 5 5 9 5 2 0 2 4 1 5 6 1 7 2 0 0 5 7 8 1 4 0 1 3 4 9 1 6 8 8 9 1 9
 9 8 2 4 8 3 9 6 7 6 2 6 5 4 4 0 4 2 3 3 3 1 3 1 1 8 0 2 8 4 8 3 3 6 9 0 8
 7 2 7 7 9 0 3 2 2 3 2 2 0 4 5 5 3 7 0 7 0 9 4 4 5 6 2 2 0 9 7 3 6 4 0 4 1
 0 0 1 2 5 6 6 3 5 6 6 1 3 0 5 3 2 6 9 2 0 7 5 2 2 0 4 3 5 4 7 0 5 2 1 3 4
 2 5 2 9 4 9 4 2 1 7 6 2 5 1 0 6 0 0 4 9 6 4 7 3 4 9 4 8 2 7 8 2 3 8 6 6 6
 4 0 3 3 7 8 8 4 9 6 9 7 3 8 5 2 1 8 8 4 9 2 0 8 6 5 1 4 8 1 7 6 1 5 8 8 0
 0 0 1 1 3 5 0 8 3 3 6 8 7 6 7 4 8 6 7 8 7 3 0 3 1 8 5 5 4 2 8 4 0 2 9 6 2
 0 2 1 7 4 8 5 1 4 2 6 9 3 1 1 2 1 1 1 5 4 9 5 0 1 7 5 8 0 3 3 0 2 1 5 7 1
 7 0 8 3 9 6 8 0 2 9 8 1 6 3 7 7 2 3 3 1 2 2 9 5 4 3 9 3 1 5 2 6 2 5 2 8 0
 3 9 7 1 7 7 7 7 4 6 1 3 9 4 0 3 7 0 5 8 8 9 7 1 1 9 8 1 1 0 7 3 8 3 2 0 9
 1 7 7 8 4 1 1 0 8 2 5 5 2 7 1 9 2 8 6 1 9 6 6 6 9 2 5 4 1 9 5 2 3 8 6 5 2
 8 9 1 6 6 5 0 2 5 7 1 6 0 1 6 7 6 5 8 0 9 6 0 3 0 4 2 9 3 1 2 7 3 6 1 4 3
 4 7 2 6 5 4 8 0 6 2 5 8 8 2 6 1 8 0 4 6 4 9 0 4 8 7 1 6 9 4 8 1 3 5 5 5 1
 2 9 4 2 1 5 6 4 0 0 3 1 1 9 8 4 1 2 7 2 5 5 3 7 6 0 4 0 1 0 7 1 4 5 3 8 6
 5 9 1 6 4 7 1 9 7 3 1 7 5 7 7 1 5 6 9 2 6 5 7 3 9 3 5 5 4 8 5 6 9 0 3 2 8
 0 1 0 6 9 2 4 2 3 8 4 0 5 8 0 7 9 5 9 0 6 7 4 2 6 6 9 1 8 1 0 7 0 9 9 2 3
 0 2 3 9 8 8 3 3 3 8 7 5 2 8 2 1 0 2 2 0 9 3 3 0 1 9 8 2 0 4 1 6 5 3 6 0 8
 3 9 5 1 4 1 8 5 2 2 8 1 1 1 4 6 0 4 8 5 4 0 6 2 1 5 6 0 2 5 7 5 6 8 9 5 0
 0 1 8 4 1 3 4 1 7 8 6 5 7 9 4 5 3 3 3 2 9 6 3 5 3 5 5 2 7 0 1 2 9 2 6 9 4
 7 0 2 8 6 9 4 8 0 7 7 2 2 4 3 2 5 1]

  在数据读入过程中,通过矩阵转置操作,将数据转换成了RGB分层的数据结构。

(2)构建Dataset
class famnist(paddle.io.Dataset):
    def __init__(self, num_samples):
        super(famnist, self).__init__()
        self.num_samples = num_samples

    def __getitem__(self, index):
        data = TT(imgdata[index].astype('float64'))
        label = TT(imglabel[index].astype('int64'))
        return data, label

    def __len__(self):
        return self.num_samples

_dataset = famnist(800)
train_loader = paddle.io.DataLoader(_dataset, batch_size=20, shuffle=True)
 Ⅰ.测试Dataloader

  对train_loader获得数据的结构以及显示图片,验证上述程序工作正常。

data = train_loader().next()
print(data)
[Tensor(shape=[20, 3, 32, 32], dtype=float64, place=CPUPlace, stop_gradient=True,
       [[[[69. , 19. , 79. , ..., 178., 140., 173.],
          [16. , 13. , 54. , ..., 214., 194., 153.],
          [30. , 29. , 28. , ..., 201., 179., 191.],
          ...,
          [254., 254., 254., ..., 254., 254., 254.],
          [253., 253., 253., ..., 253., 253., 253.],
          [253., 253., 253., ..., 253., 253., 253.]]]]), Tensor(shape=[20, 1], dtype=int64, place=CPUPlace, stop_gradient=True,
       [[1],
        [6],
        [9],
        [7],
        [0],
        [4],
        [5],
        [4],
        [5],
        [9],
        [5],
        [3],
        [0],
        [4],
        [6],
        [0],
        [9],
        [9],
        [8],
        [0]])]

  使用图形显示train_loader所获得图片。

data = train_loader().next()

ROW_NUM = 3
COL_NUM = 5

plt.figure(figsize=(10,6))

for j in range(ROW_NUM):
    for i in range(COL_NUM):
        id = j*COL_NUM + i
        img = data[0].numpy()[id].T

        print(img.shape)
        plt.subplot(ROW_NUM, COL_NUM, id+1)
        plt.imshow(img, cmap='gray')
        plt.axis('off')

▲ 图3.1.1 通过Database Loader获得的图片数据

▲ 图3.1.1 通过Database Loader获得的图片数据

  从上面结果可以看到,所构造的训练数据加载函数是出正确的。

3.1.2 构建LeNet网络

imageSize = 64
ks = 5
L = ((imageSize-ks+1)//2-ks+1)//2

class mnist(paddle.nn.Layer):
    def __init__(self, ):
        super(mnist, self).__init__()
        self.conv1 = paddle.nn.Conv2D(in_channels=1, out_channels=6, kernel_size=ks, stride=1, padding=0)
        self.conv2 = paddle.nn.Conv2D(in_channels=6, out_channels=16, kernel_size=ks, 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=16*L*L, out_features=120)
        self.L2     = paddle.nn.Linear(in_features=120, out_features=86)
        self.L3     = paddle.nn.Linear(in_features=86, out_features=10)

    def forward(self, x):
        x = self.conv1(x)
        x = F.relu(x)
        x = self.mp1(x)
        x = self.conv2(x)
        x = F.relu(x)
        x = self.mp2(x)
        x = paddle.flatten(x, start_axis=1, stop_axis=-1)
        x = self.L1(x)
        x = F.relu(x)
        x = self.L2(x)
        x = F.relu(x)
        x = self.L3(x)
        return x

3.1.3 训练LeNet网络

net = mnist()

EPOCH_NUM = 100
optimizer = paddle.optimizer.Adam(learning_rate=0.001, parameters=net.parameters())

for epoch in range(EPOCH_NUM):
    for batchid, data in enumerate(train_loader()):
        out = net(data[0])
        loss = F.cross_entropy(out, data[1])
        acc = paddle.metric.accuracy(out, data[1])

        loss.backward()
        optimizer.step()
        optimizer.clear_grad()

        if batchid %100==0:
            print("Pass:{}, Loss:{}, Acc:{}".format(epoch,loss.numpy(), acc.numpy()))

▲ 图3.1.2 训练过程中精度变化曲线

▲ 图3.1.2 训练过程中精度变化曲线

from headm import *

strid = 12
tspgetdopstring(-strid)
strall = clipboard.paste().split('\r\n')

accdim = []
for s in strall:
    ss = s.split(',')
    acc = ss[-1].replace('Acc:[','').replace(']','')

    accdim.append(float(acc.strip(' ')))

printf(accdim)

plt.plot(accdim)
plt.xlabel("Step")
plt.ylabel("Accuracy")
plt.grid(True)
plt.title("Train Accuracy")
plt.tight_layout()
plt.show()

 

§04 业总结


  对于有五种动物和五中水果组成的FAMNIST数据集合的图像分类问题进行了测试。本文主要是集中在前期的数据库的准备和网络的构建方面。对于网络的详细测试参见在 对于FAMNIST中的十种动物和水果进行识别测试 中的测试结果。

▲ 图4.1 对于FAMNIST中的始终动物和水果进行分类测试

▲ 图4.1 对于FAMNIST中的始终动物和水果进行分类测试

4.1 程序代码

4.1.1 LENET程序

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# LENET.PY                     -- by Dr. ZhuoQing 2021-12-16
#
# Note:
#============================================================

from headm import *                 # =
import cv2

import paddle
import paddle.nn.functional as F
from paddle import to_tensor as TT
from paddle.nn.functional import square_error_cost as sqrc


#------------------------------------------------------------
famnist = '/home/aistudio/data/famnist'
imgdir = 'famnist10-64-gray'

 #------------------------------------------------------------
def loadimgdata(imgdir):
    '''
    loadimgdata: Load test image data into RAM
    Param imgdir: Directory for storing the image picture .
    Return: imgdata,imglabel
    '''

    imgfile = os.listdir(imgdir)

    imgdata = []
    imglabel = []
    for f in imgfile:
        img = cv2.imread(os.path.join(imgdir, f))
        imgdata.append(img.T[0][newaxis,:])
        imglabel.append(int(f[:1]))

    return array(imgdata), array(imglabel)

imgdata,imglabel = loadimgdata(os.path.join(famnist,imgdir))

print(len(imglabel))
print(imgdata.shape)

#------------------------------------------------------------
'''
printf(imgdata.shape)
printf(imglabel)
'''
#------------------------------------------------------------
class famnist(paddle.io.Dataset):
    def __init__(self, num_samples):
        super(famnist, self).__init__()
        self.num_samples = num_samples

    def __getitem__(self, index):
        data = imgdata[index]/255
        label = imglabel[index]
        return TT(data, dtype='float32'), TT(label, dtype='int64')

    def __len__(self):
        return self.num_samples

_dataset = famnist(800)
train_loader = paddle.io.DataLoader(_dataset, batch_size=100, shuffle=True)

#------------------------------------------------------------

#data = train_loader().next()
#print(data[0].numpy())

'''

ROW_NUM = 3
COL_NUM = 5

plt.figure(figsize=(10,6))

for j in range(ROW_NUM):
    for i in range(COL_NUM):
        id = j*COL_NUM + i
        img = data[0].numpy()[id][0].T

#        print(img.shape)
        plt.subplot(ROW_NUM, COL_NUM, id+1)
        plt.imshow(img, cmap='gray')
        plt.axis('off')

'''
#------------------------------------------------------------
imageSize = 64
ks = 5
L = ((imageSize-ks+1)//2-ks+1)//2

class mnist(paddle.nn.Layer):
    def __init__(self, ):
        super(mnist, self).__init__()
        self.conv1 = paddle.nn.Conv2D(in_channels=1, out_channels=6, kernel_size=ks, stride=1, padding=0)
        self.conv2 = paddle.nn.Conv2D(in_channels=6, out_channels=16, kernel_size=ks, 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=16*L*L, out_features=120)
        self.L2     = paddle.nn.Linear(in_features=120, out_features=86)
        self.L3     = paddle.nn.Linear(in_features=86, out_features=10)

    def forward(self, x):
        x = self.conv1(x)
        x = F.relu(x)
        x = self.mp1(x)
        x = self.conv2(x)
        x = F.relu(x)
        x = self.mp2(x)
        x = paddle.flatten(x, start_axis=1, stop_axis=-1)
        x = self.L1(x)
        x = F.relu(x)
        x = self.L2(x)
        x = F.relu(x)
        x = self.L3(x)
        return x

#------------------------------------------------------------
net = mnist()

EPOCH_NUM = 100
optimizer = paddle.optimizer.Adam(learning_rate=0.001, parameters=net.parameters())

for epoch in range(EPOCH_NUM):
    for batchid, data in enumerate(train_loader()):
        out = net(data[0])
        loss = F.cross_entropy(out, data[1])
        acc = paddle.metric.accuracy(out, data[1])

        loss.backward()
        optimizer.step()
        optimizer.clear_grad()

        if batchid %100==0:
            print("Pass:{}, Loss:{}, Acc:{}".format(epoch,loss.numpy(), acc.numpy()))

#------------------------------------------------------------
#        END OF FILE : LENET.PY
#============================================================

4.1.2 图片处理程序

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# FAMNIST10.PY                 -- by Dr. ZhuoQing 2021-12-16
#
# Note:
#============================================================

from headm import *                 # =*
import cv2

famnist = '/home/aistudio/data/famnist'

alldir = 'famnist-all'
outdir = 'famnist10-64-gray'

#------------------------------------------------------------
allpath = os.path.join(famnist, alldir)
filedim = os.listdir(allpath)

#print(filedim)

#------------------------------------------------------------
outdir = os.path.join(famnist, outdir)
imgWidth = 64
imgHeight = 64

for id, f in enumerate(filedim):
    infile = os.path.join(allpath, f)
    outfile = os.path.join(outdir, f)

    img = cv2.imread(infile, cv2.IMREAD_GRAYSCALE)
#    img = cv2.imread(infile, cv2.IMREAD_COLOR)
    imgsize = cv2.resize(img, (imgWidth, imgHeight), cv2.INTER_LINEAR)

#    printf(imgsize.shape)
#    break

    cv2.imwrite(outfile, imgsize)

    print("Process %d, %s"%(id, f))

#------------------------------------------------------------
#        END OF FILE : FAMNIST10.PY
#============================================================

4.1.3 显示目录照片

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# SHOWPIC.PY                   -- by Dr. ZhuoQing 2021-12-16
#
#   Show some pictures in the FAMNIST directory in shuffle order.
#
#   Usage : showpic directory
#
# Note:
#============================================================

from headm import *                 # =*
import cv2

famnist = '/home/aistudio/data/famnist'
dirstr = 'famnist10-64-gray'

#------------------------------------------------------------
dirall = os.path.join(famnist, dirstr)
filedim = os.listdir(dirall)
random.shuffle(filedim)

#------------------------------------------------------------
ROW_NUM = 3
COL_NUM = 5

plt.figure(figsize=(10,6))

for j in range(ROW_NUM):
    for i in range(COL_NUM):
        id = j*COL_NUM + i
        fn = os.path.join(dirall, filedim[id])
        img = cv2.imread(fn).T[::-1].T
        plt.subplot(ROW_NUM, COL_NUM, id+1)
        plt.imshow(img)
        plt.axis('off')
        plt.title(filedim[id])
        plt.show


#------------------------------------------------------------
#        END OF FILE : SHOWPIC.PY
#============================================================

4.1.4 生成原始图片集合

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# FAMNIST.PY                   -- by Dr. ZhuoQing 2021-12-16
#
# Note:
#============================================================

from headm import *                 # =*
import shutil

homepath = '/home/aistudio'
originpath = 'data/afmnist'

fapath = os.path.join(homepath, originpath)
#------------------------------------------------------------
def scanallpath(fpath):
    subpath = []

    fs1 = os.listdir(fpath)
    for p in fs1[:2]:
        scanfs = os.listdir(os.path.join(fpath,p))
        sp = os.path.join(fpath, p)
        for s in scanfs:
            subpath.append(os.path.join(sp, s))

    return subpath

#------------------------------------------------------------
allpath = scanallpath(fapath)
#printf(allpath)

#------------------------------------------------------------
afname = {'cat':0, 'cow':1, 'dog':2, 'horse':3, 'pig':4,
          'apple':5, 'banana':6, 'durian':7, 'grape':8, 'orange':9}

outpath = os.path.join(homepath, 'data/FAMNIST/FAMNIST-ALL')
allcount = 0
passid = 0

for p in allpath:
    passid += 1
    fdim = os.listdir(p)
    pname = afname[p.split('/')[-1]]
    subcount = 0
    for fn in fdim:
        if fn.find('png') < 0: continue
        fname = os.path.join(p, fn)
        newname = '%d_%s'%(pname, fn)
        outname = os.path.join(outpath, newname)

        shutil.copy(fname, outname)
        allcount += 1
        subcount += 1

#        printf(outname)

    printf('{}.{}:{}'.format(passid, p.split('/')[-1], subcount))

printf('All file: {}'.format(allcount))


#------------------------------------------------------------
#        END OF FILE : FAMNIST.PY
#============================================================


■ 相关文献链接:

● 相关图表链接:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卓晴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值