百度 AIStudio 最详细教程 paddlepaddle 数字识别官网文档
自己学习 逐行代码解析
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Usage : recognize_digits
任务描述:使用paddlepaddle训练手写字识别模型
1、使用数据MNIST;
2、paddlepaddle平台;
3、时间 2周
验收:MNIST训练模型及其效果、CNN原理串讲
PaddlePaddle训练一次模型完整的过程可以如下几个步骤:
定义网络结构-->导入数据---->调用模型---->训练模型---->保存模型---->测试结果
Time : 2019/7/14 16:36
Author : feng
email : xx@baidu.com
File : train.py
"""
# 将python3中的print特性导入当前版本
from __future__ import print_function
import os
# argparse 是python自带的命令行参数解析包,可以用来方便地读取命令行参数
import argparse
# PIL: Python Imaging Library,是Python平台的图像处理标准库
from PIL import Image
# NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
import numpy
# 导入paddle模块
import paddle
import paddle.fluid as fluid
# 可视化
from visualdl import LogWriter
def parse_args():
"""
:desc: 解析命令行参数
:return:返回参数列表
"""
parser = argparse.ArgumentParser("mnist")
# 是否连续评估日志
parser.add_argument('--enable_ce', action='store_true', help="if set,run the task with continuous evaluation logs.")
# 是否使用gpu
parser.add_argument('--use_gpu', type=bool, default=False, help="Whether to use GPU or not.")
# epochs数量
parser.add_argument('--num_epochs', type=int, default=5, help="number of epochs")
# batch size
parser.add_argument('--batch_size', type=int, default=64, help="size of batch")
args = parser.parse_args()
return args
def loss_net(hidden, label):
"""
:desc: 定义交叉熵代价损失函数,分类问题一般使用这个
:param hidden: 隐藏层
:param label: 标签
:return:
"""
# 预测函数,对输入全连接后激活输出
# input为输入,size为节点个数,cct激活函数为softmax
prediction = fluid.layers.fc(input=hidden, size=10, act='softmax')
# 交叉熵损失函数:使用预测值和实际标签计算损失
loss = fluid.layers.cross_entropy(input=prediction, label=label)
# 平均损失
avg_loss = fluid.layers.mean(loss)
# 使用预测值作为输入和标签计算准确率
acc = fluid.layers.accuracy(input=prediction, label=label)
return prediction, avg_loss, acc
def softmax_regression(img, label):
"""
:desc: softmax回归模型,对输入进行全连接方式获取特征,然后直接通过softmax函数计算多个类别的概率
所以img作为模型的输入,既是损失函数的输入
:param img: 输入层 图片
:param label: 标签
:return: 损失函数结果
"""
return loss_net(img, label)
def multilayer_perceptron(img, label):
"""
:desc: 多次感知模型,采用最简单的两层神经网络,只有输入和输出层,为了达到更好的拟合效果,在中间加两个隐藏层
:param img: 输入层图片
:param label: 图片标签
:return: 损失函数结果
"""
# 输入层+2个隐藏层
hidden1 = fluid.layers.fc(input=img, size=200, act='tanh')
hidden2 = fluid.layers.fc(input=hidden1, size=200, act='tanh')
return loss_net(hidden2, label)
def convolutional_neural_network(img, label):
"""
:desc: 卷积神经网络CNN,LeNet-5,输入的二维图像,先经过两次卷积层到池化层,再经过全连接,最后使用softmax函数分类最为输出
:param img: 输入图像
:param label: 图像标签
:return: 损失函数结果
"""
# 第1次卷积+池化
conv_pool_1 = fluid.nets.simple_i