数字识别
1.初始化环境
from __future__ import print_function # 将python3中的print特性导入当前版本 import os from PIL import Image # 导入图像处理模块 import matplotlib.pyplot as plt import numpy import paddle # 导入paddle模块 import paddle.fluid as fluid
2.定义网络
def conv_pool(input, num_filters, filter_size, pool_size, pool_stride, act="relu"): conv_out = fluid.layers.conv2d( input=input, num_filters=num_filters, filter_size=filter_size, act=act) out = fluid.layers.pool2d( input=conv_out, pool_size=pool_size, pool_stride=pool_stride) return out def convolutional_neural_network(): # 输入的原始图像数据,大小为28*28*1 img = fluid.data(name='img', shape=[None, 1, 28, 28], dtype='float32') # 第一个卷积-池化层 # 使用20个5*5的滤波器,池化大小为2,池化步长为2,激活函数为Relu conv_pool_1 = conv_pool( input=img, filter_size=5, num_filters=20, pool_size=2, pool_stride=2, act="relu") conv_pool_1 = fluid.layers.batch_norm(conv_pool_1) # 第二个卷积-池化层 # 使用50个5*5的滤波器,池化大小为2,池化步长为2,激活函数为Relu conv_pool_2 = conv_pool( input=conv_pool_1, filter_size=5, num_filters=50, pool_size=2, pool_stride=2, act="relu") # 以softmax为激活函数的全连接输出层,输出层的大小必须为数字的个数10 prediction = fluid.layers.fc(input=conv_pool_2, size=10, act='softmax') return prediction label = fluid.data(name='label', shape=[None, 1], dtype='int64') # predict = softmax_regression() # 取消注释将使用 Softmax回归 # predict = multilayer_perceptron() # 取消注释将使用 多层感知器 predict = convolutional_neural_network() # 取消注释将使用 LeNet5卷积神经网络 # 使用类交叉熵函数计算predict和label之间的损失函数 cost = fluid.layers.cross_entropy(input=predict, label=label) # 计算平均损失 avg_cost = fluid.layers.mean(cost) # 计算分类准确率 acc = fluid.layers.accuracy(input=predict, label=label)
fluid.optimizer.Adam(learning_rate=0.001)
optimizer = optimizer_program()
optimizer.minimize(avg_loss)
3.定义数据源
BATCH_SIZE = 64 # 每次读取训练集中的500个数据并随机打乱,传入batched reader中,batched reader 每次 yield 64个数据 train_reader = paddle.batch( paddle.reader.shuffle( paddle.dataset.mnist.train(), buf_size=500), batch_size=BATCH_SIZE) # 读取测试集的数据,每次 yield 64个数据 test_reader = paddle.batch( paddle.dataset.mnist.test(), batch_size=BATCH_SIZE)
4.训练数据
use_cuda = False # 如想使用GPU,请设置为 True place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() feeder = fluid.DataFeeder(feed_list=['img', 'label'], place=place) exe = fluid.Executor(place) exe.run(fluid.default_startup_program()) main_program = fluid.default_main_program() for epoch_id in epochs: for step_id, data in enumerate(train_reader()): metrics = exe.run(main_program, feed=feeder.feed(data), fetch_list=[avg_loss, acc])