作业布置
¶作者:欧新宇(Xinyu OU)
开发平台:Paddle 1.8, Paddle 2.1
运行环境:Intel Core i7-7700K CPU 4.2GHz, nVidia GeForce GTX 1080 Ti
本教案所涉及的数据集仅用于教学和交流使用,请勿用作商用。
最后更新:2021-10-24
网络参数配置表
(Q1, Q4)(每个模型20分)网络拓扑结构结构图
和参数配置表
,完成MNIST神经网络类Class MNIST()
Q2和CIFAR神经网络类Class CIFAR10
Q5的定义(每个模型20分)网络结构测试代码
和前向传输测试代码
(Q3, Q6)(每个模型10分)LeNet-5模型的原始输入尺寸是32×32,但是由于MNIST数据集的样本为28×28,因此需要对LeNet-5进行一定的调整。此次我们暂定调整后的模型命名为MNIST。
Layer | Input | Kernels_num | Kernels_size | Stride | Padding | PoolingType | Output | Parameters |
---|---|---|---|---|---|---|---|---|
Input | 1×28×28 | 1×28×28 | ||||||
Conv1 | ||||||||
Pool1 | ||||||||
Conv2 | ||||||||
Pool2 | ||||||||
Conv3 | ||||||||
FC1 | - | - | - | - | - | |||
FC2 | - | - | - | - | - | |||
Output | 84×1 | 10×1 | ||||||
Total = 44426 |
# 载入基础库
import numpy as np
import paddle
import paddle.fluid as fluid # 载入基于fluid框架的paddle
from paddle.fluid.dygraph import Linear, Conv2D, Pool2D
use_cuda = True # True, False 如果设备有GPU,怎么我们可以启用GPU进行快速训练
PLACE = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()
# 定义卷积神经网络MNIST
class MNIST(fluid.dygraph.Layer):
name_scope = 'MNIST'
def __init__(self, num_classes=10): # 初始化CIFAR类,并为CIFAR增加对象self.x
super(MNIST, self).__init__()
# Q2-1: 根据LeNet-5拓扑结构图和Q1中完成的网络参数配置表完成下列MNIST模型的类定义
# 各层超参数定义: [Your codes 1]
def forward(self,input): # 为CNN类增加forward方法
# Q2-2: 根据LeNet-5拓扑结构图和Q1中完成的网络参数配置表完成下列MNIST模型的类定义
# 定义前向传输过程: [Your codes 2]
return y
# Q3: 完善下列网络结构测试代码 [Your codes 3]
CIFAR-10 是由 Hinton 的学生 Alex Krizhevsky 和 Ilya Sutskever 整理的一个用于识别普适物体的小型数据集,该数据集的所有样本均从 80 million tiny images 数据中获取。一共包含10 个类别的RGB彩色图片:飞机( airplane )、汽车( automobile )、鸟类( bird )、猫( cat )、鹿( deer )、狗( dog )、蛙类( frog )、马( horse )、船( ship )和卡车( truck )。每个图片的尺寸为32 × 32,每个类别有6000个图像,数据集中一共有50000 张训练图片和10000 张测试图片。此外还有一个与CIFAR-10类似的CIFAR-100数据集,也由Alex和Ilya收集,该数据包含100个类,每个类100个样本,其中500个用于训练,100个用于测试。
下图是一个经典的用于CIFAR-10识别的卷积神经网络结构图。
Layer | Input | Kernels_num | Kernels_size | Stride | Padding | PoolingType | Output | Parameters |
---|---|---|---|---|---|---|---|---|
Input | 3×32×32 | 3×32×32 | ||||||
Conv1 | ||||||||
Pool1 | ||||||||
Conv2 | ||||||||
Pool2 | ||||||||
Conv3 | ||||||||
Pool3 | ||||||||
FC1 | - | - | - | - | - | |||
FC2 | - | - | - | - | - | |||
Output | 10×1 | |||||||
Total = 65706 |
# 载入基础库
import paddle
from paddle.nn import Sequential, Conv2D, MaxPool2D, AvgPool2D, Linear, Dropout, ReLU
class Cifar10(paddle.nn.Layer):
def __init__(self, num_classes=10):
super(Cifar10, self).__init__()
self.num_classes = num_classes
# Q5-1: 根据Cifar10拓扑结构图和Q4中完成的网络参数配置表完成下列Cifar10模型的类定义
# 各层超参数定义: [Your codes 4]
self.features =
)
self.fc = Sequential(
)
def forward(self, inputs):
# Q5-2: 根据Cifar10拓扑结构图和Q4中完成的网络参数配置表完成下列Cifar10模型的类定义
# 定义前向传输过程: [Your codes 5]
return x
#### 网络测试
if __name__ == '__main__':
# 1. 输出网络结构
# Q6-1: 完善下列网络结构测试代码: [Your codes 6]
# 2. 测试前向传输
# Q6-2: 完善前向传输测试代码: [Your codes 7]
print('测试前向传输:')
print(outs)
print('输出张量的形态为:{}'.format(outs.shape))