2021年人工神经网络第四次作业 - 第三题Cifar10

Posted 卓晴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021年人工神经网络第四次作业 - 第三题Cifar10相关的知识,希望对你有一定的参考价值。

简 介: 在Paddle下使用最基本的BP网络以及LeNet网络结构,测试了Cifar10数据集合。但实际运行在测试集合上的效果始终没有突破0.3,具体原因还需要进行查找。
后来经过测试,发现问题出现在数据加载上,后面的实验中实际上只是使用了1000个训练数据进行的训练。使得模型的预测精度始终上不去。

关键词 Cifar10LeNet

作业要求
文章目录
作业要求
数据库准备
网络训练
BP网络
Lenet网络
改进LeNet网络
总 结

 

§01 业要求


  2021年人工神经网络第四次作业要求 中的第四题,是基于 The CIFAR-10 dataset 数据集的验证实验。

▲ 图1.1 CIFAR-10数据库部分样本

1.1 作业要求

  ① 建立一个用于识别图像的相对较小的卷积神经网络,完成CIFAR-10数据集合的识别问题。

  • 建立一个规范的网络结构,训练并进行评估;
  • 为建立更大规模更加复杂的模型提供一个范例

  选择CIFAR-10是因为它的复杂程度足以用来检验TensorFlow中的大部分功能,并可将其扩展为更大的模型。与此同时由于模型较小所以训练速度很快,比较适合用来测试新的想法,检验新的技术。

  ② 大家可以参见网络上的“CIFAR-10 教程”来讨论卷积神经网络中如下各部分参数对于卷积神经网络训练的影响“

  • 相关核心数学对象,如卷积、修正线性激活、最大池化以及局部响应归一化;
  • 训练过程中一些网络行为的可视化,这些行为包括输入图像、损失情况、网络行为的分布情况以及梯度;
  • 算法学习参数的移动平均值的计算函数,以及在评估阶段使用这些平均值提高预测性能;
  • 实现了一种机制,使得学习率随着时间的推移而递减;
  • 如果有条件,可以讨论网络在多个GPU上并行训练,多个GPU之间实现参数共享和更新变量值。

  ③ 讨论数据增强对于网络性能的改善。

  讨论DROP-OUT机制对于网络训练和泛华能力的影响。

  CIFAR-10数据库部分样本:

1.2 数据库准备

  实验所需要的数据库可以直接从 CIFAR-10 Dataset 下载,也可以在 Paddle中的Cifar10自带数据库 中直接读取。

1.2.1 下载数据库

(1)Paddle中代码

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

from paddle.vision.datasets import Cifar10
from paddle.vision.transforms import Normalize

normalize = Normalize(mean=[0.5,0.5,0.5], std=[0.5,0.5,0.5], data_format='HWC')
cifar10 = Cifar10(mode='train', transform=normalize)

  运行程序之后触发Paddle notebook环境自动下载Cifar数据库:

▲ 图1.2.1 运行程序之后触发Paddle notebook环境自动下载Cifar数据库

  下载的数据库存储在:"/home/aistudio/.cache/paddle/dataset/cifar 中:

cifar-10-python.tar.gz
aistudio@jupyter-262579-3253281:~/.cache/paddle/dataset/cifar$ 

(2)Cifar10变量结构

  观察 cifar10的内部数据结构:

print(type(cifar10), dir(cifar10))

<class 'paddle.vision.datasets.cifar.Cifar10'>
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__len__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_init_url_md5_flag', '_load_data', 'backend', 'data', 'data_file', 'data_md5', 'data_url', 'dtype', 'flag', 'mode', 'transform']

  可以看到在读入的Cifar10的数据中,包含有很多内部变量:

print(cifar10.backend, type(cifar10.data))
print(shape(cifar10.data))
print(cifar10.mode, cifar10.transform)

pil
<class 'list'>
(50000, 2)
train
<paddle.vision.transforms.transforms.Normalize object at 0x7fef3a1ec250>

  其中 "cifar10.data包含有数据库中的图片和标签。

Cifar10.data结构:
结构:list
形状:(50000,2)

  对于每一个 Cifar10.data[n],它 是一个tuple:

image0 = cifar10.data[0][0]
label0 = cifar10.data[0][1]

print(type(cifar10.data[0]), type(image0), shape(image0), label0)

<class 'tuple'>
<class 'numpy.ndarray'>
(3072,)
6

  包含一个 长度为3072=32×32×3的图片以及对应的标号 “6”。

cifarname = 0:'airplane', 1:'automobile', 2:'bird', 3:'cat',
             4:'deear', 5:'dog', 6:'frog', 7:'horse', 8:'ship', 9:'truck'

plt.figure(figsize=(5,5))
plt.imshow(image0.reshape(3,32,32).T.swapaxes(0,1)
plt.title(cifarname[label0], fontsize=16, color='blue')

  对于Cifar10的数据,需要经过如下的转换才能够形成matplotlib可以显示的结构(32,32,3):

data.reshape(3,32,32).T.swapaxes(0,1)

  Cifar10 第0号图片:frog:6 :

▲ 图1.2.2 Cifar10的第一号图片:frog:6

``▲ 图1.2.2 Cifar10 第0号图片:frog:6 ``
index = list(range(len(cifar10.data)))
random.shuffle(index)

PIC_ROW         = 6
PIC_COL         = 12
plt.figure(figsize=(15,10))
for j in range(PIC_ROW):
    for i in range(PIC_COL):
        id = i+j*PIC_COL
        plt.subplot(PIC_ROW, PIC_COL, id+1)
        plt.axis('off')

        rid = index[id]
        img = cifar10.data[rid][0].reshape(3,32,32).T.swapaxes(0,1)
        lbl = cifar10.data[rid][1]
        plt.imshow(img, cmap=plt.cm.gray)
        plt.title(cifarname[cifar10.data[rid][1]], fontsize=12, color='darkgreen')

  Cifar10中的图片:

▲ 图1.2.3 Cifar10中的图片

 

§02 络训练


2.1 BP网络

2.1.1 数据加载与预处理

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

import paddle
from paddle.vision.transforms import Normalize
normalize = Normalize(mean=[0.5,0.5,0.5], std=[0.5,0.5,0.5], data_format='HWC')

from paddle.vision.datasets import Cifar10
cifar10_train = Cifar10(mode='train', transform=normalize)
cifar10_test = Cifar10(mode='test', transform=normalize)

2.1.2 建立BP网络

import paddle
bpnet = paddle.nn.Sequential(
            paddle.nn.Flatten(),
            paddle.nn.Linear(32*32*3, 512),
            paddle.nn.ReLU(),
            paddle.nn.Dropout(0.2),
            paddle.nn.Linear(512, 10))

model = paddle.Model(bpnet)
model.prepare(paddle.optimizer.Adam(parameters=model.parameters()),
              paddle.nn.CrossEntropyLoss(),
              paddle.metric.Accuracy())

2.1.3 训练网络模型

model.fit(cifar10_train, epochs=5, verbose=1)

▲ 图2.1.1 训练过程

  使用BP网络训练Cifar10的数据过程中,网络的精度始终维持在0.1左右。

  在此过程中:*

  • 将隐层ReLU传递函数修改成Sigmoid;
  • 设置学习速率:Lr为0.1;

  dvyu 训练过程中的精度没有改善。

2.2 Lenet网络

2.2.1 数据加载与预处理

  由于使用CNN,所以需要将输入的数据整理成(3,32,32)的格式,用于LeNet网络的输入。

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

import paddle
from paddle.vision.transforms import Normalize
normalize = Normalize(mean=[0.5,0.5,0.5], std=[0.5,0.5,0.5], data_format='HWC')

from paddle.vision.datasets import Cifar10
cifar10_train = Cifar10(mode='train', transform=normalize)
cifar10_test = Cifar10(mode='test', transform=normalize)

 #------------------------------------------------------------
train_dataset = [cifar10_train.data[id][0].reshape(3,32,32) for id in range(len(cifar10_train.data))]
train_labels = [cifar10_train.data[id][1] for id in range(len(cifar10_train.data))]

2.2.2 构建训练加载函数

  将Cifar10的数据构建成训练LeNet的批处理数据。

class Dataset(paddle.io.Dataset):
    def __init__(self, num_samples):
        super(Dataset, self).__init__()
        self.num_samples = num_samples

    def __getitem__(self, index):
        data = train_dataset[index]
        label = train_labels[index]
        return paddle.to_tensor(data,dtype='float32'), paddle.to_tensor(label,dtype='int64')

    def __len__(self):
        return self.num_samples

_dataset = Dataset(1000)
train_loader = paddle.io.DataLoader(_dataset, batch_size=100, shuffle=True)

  设置数据加载形式:

数据加载形式:
批次大型:100
Shuffer:Yes

2.2.3 构建LeNet网络

imgwidth = 32
imgheight = 32
inputchannel = 3
kernelsize   = 5
targetsize = 10
ftwidth = ((imgwidth-kernelsize+1)//2-kernelsize+1)//2
ftheight = ((imgheight-kernelsize+1)//2-kernelsize+1)//2

class 以上是关于2021年人工神经网络第四次作业 - 第三题Cifar10的主要内容,如果未能解决你的问题,请参考以下文章

2021年人工神经网络第四次作业要求

2021年人工神经网络第四次作业-第四题:旋转的数字

2021年人工神经网络第四次作业要求:第七题

2021年人工神经网络第四次作业-第五题:危险品识别

2021年人工神经网络第四次作业 - 第二题MNIST手写体识别

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