https://aistudio.baidu.com/aistudio/course/introduce/11939?directly=1&shared=1
#导入需要的包
import numpy as np #两种方式都是引入numpy库中的所有函数、函数、对象、变量等,两者的区别在于调用其中内容时不同。
from PIL import Image
import matplotlib.pyplot as plt
import os #os 模块提供了非常丰富的方法用来处理文件和目录
import paddle
print("本教程基于Paddle的版本号为:"+paddle.__version__)
#导入数据集Compose的作用是将用于数据集预处理的接口以列表的方式进行组合。
#导入数据集Normalize的作用是图像归一化处理, 支持两种方式: 1. 用统一的均值和标准差值对图像的每个通道进行归一化处理; 2. 对每个通道指定不同的均值和标准差值进行归一化处理。
from paddle.vision.transforms import Compose, Normalize
transform = Compose([Normalize(mean=[127.5],std=[127.5],data_format='CHW')])#???????
# 使用transform对数据集做归一化
print('下载并加载训练数据')
train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=transform)#????
test_dataset = paddle.vision.datasets.MNIST(mode='test', transform=transform)#????
print('加载完成')
注:
A
Normalize
class paddle.vision.transforms.Normalize(mean=0.0, std=1.0, data_format=‘CHW’, to_rgb=False, keys=None)
图像归一化处理,支持两种方式:
用统一的均值和标准差值对图像的每个通道进行归一化处理;
对每个通道指定不同的均值和标准差值进行归一化处理。
output[channel] = (input[channel] - mean[channel]) / std[channel]
mean (int|float|list) - 用于每个通道归一化的均值。
std (int|float|list) - 用于每个通道归一化的标准差值。
data_format (str, optional): 数据的格式,必须为 ‘HWC’ 或 ‘CHW’。 默认值: ‘CHW’。
to_rgb (bool, optional) - 是否转换为 rgb 的格式。默认值:False。
keys (list[str]|tuple[str], optional) - 与 BaseTransform. 默认值: None。
B
数据预处理,这里用到了随机调整亮度、对比度和饱和度
transform = Normalize(mean=[127.5], std=[127.5], data_format=‘CHW’)
数据加载,在训练集上应用数据预处理的操作
可以看到自动下载了数据集,并完成train、test数据集实例化
train_dataset = MNIST(mode=‘train’, transform=transform)
test_dataset = MNIST(mode=‘test’, transform=transform)
#数据可视化
#让我们一起看看数据集中的图片是什么样子的
train_data0, train_label_0 = train_dataset[0][0],train_dataset[0][1]
train_data0 = train_data0.reshape([28,28])
plt.figure(figsize=(2,2))
print(plt.imshow(train_data0, cmap=plt.cm.binary))
print('train_data0 的标签为: ' + str(train_label_0))
注:
A准备数据与数据可视化
#让我们再来看看数据样子是什么样的吧
print(train_data0)
#请在这里定义卷积网络的代码
import paddle.nn.functional as F#导入函数
class LeNetModel(paddle.nn.Layer):
def __init__(self):
super(LeNetModel, self).__init__()
# 创建卷积和池化层块,每个卷积层后面接着2x2的池化层
#卷积层L1
#class paddle.nn.Conv2D(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1,groups=1, padding_mode='zeros', weight_attr=None, bias_attr=None, data_format='NCHW')
#该OP是二维卷积层(convolution2d layer),根据输入、卷积核、步长(stride)、填充(padding)、空洞大小(dilations)一组参数计算输出特征层大小。输入和输出是NCHW或NHWC格式,其中N是批尺寸,C是通道数,H是特征高度,W是特征宽度。卷积核是MCHW格式,M是输出图像通道数,C是输入图像通道数,H是卷积核高度,W是卷积核宽度。如果组数(groups)大于1,C等于输入图像通道数除以组数的结果。详情请参考UFLDL's : 卷积 。如果bias_attr不为False,卷积计算会添加偏置项。
self.conv1 = paddle.nn.Conv2D(in_channels=1,
out_channels=6,
kernel_size=5,
stride=1)
#池化层L2
self.pool1 = paddle.nn.MaxPool2D(kernel_size=2,
stride=2)
#卷积层L3
self.conv2 = paddle.nn.Conv2D(in_channels=6,
out_channels=16,
kernel_size=5,
stride=1)
#池化层L4
self.pool2 = paddle.nn.MaxPool2D(kernel_size=2,
stride=2)
#线性层L5
self.fc1=paddle.nn.Linear(256,120)
#线性层L6
self.fc2=paddle.nn.Linear(120,84)
#线性层L7
self.fc3=paddle.nn.Linear(84,10)
#正向传播过程
def forward(self, x):
x = self.conv1(x)
x = F.relu(x)
x = self.pool1(x)
x = F.relu(x)
x = self.conv2(x)
x = self.pool2(x)
x = paddle.flatten(x, start_axis=1,stop_axis=-1)
x = self.fc1(x)
x = F.relu(x)
x = self.fc2(x)
x = F.relu(x)
out = self.fc3(x)
return out
#注意:定义完成卷积的代码后,后面的代码是需要修改的!
from paddle.metric import Accuracy
# 用Model封装模型
model = paddle.Model(LeNetModel())
# 定义损失函数
optim = paddle.optimizer.Adam(learning_rate=0.001, parameters=model.parameters())
# 配置模型
model.prepare(optim,paddle.nn.CrossEntropyLoss(),Accuracy())
# 训练保存并验证模型
model.fit(train_dataset,test_dataset,epochs=2,batch_size=64,save_dir='multilayer_perceptron',verbose=1)
# 训练保存并验证模型
model.fit(train_dataset,test_dataset,epochs=2,batch_size=64,save_dir='multilayer_perceptron',verbose=1)
#获取测试集的第一个图片
#获取测试集的第一个图片
test_data0, test_label_0 = test_dataset[0][0],test_dataset[0][1]
test_data0 = test_data0.reshape([28,28])
plt.figure(figsize=(2,2))
#展示测试集中的第一个图片
print(plt.imshow(test_data0, cmap=plt.cm.binary))
print('test_data0 的标签为: ' + str(test_label_0))
#模型预测
result = model.predict(test_dataset, batch_size=1)
#打印模型预测的结果
print('test_data0 预测的数值为:%d' % np.argsort(result[0][0])[0][-1])