系统:CentOS 7 64位
处理器:Intel(R) Core(TM) i7-6700 CPU
内存:16G
在CentOS系统下安装PaddlePaddle,确保计算机处理器支持AVX指令集,否证需要选择no_avx的版本。可以用下面命令检查处理器是否支持AVX指令。
cat /proc/cpuinfo | grep avx
PaddlePaddle分为仅支持CPU和支持GPU两个版本,由于GPU版本需要对CUDA进行安装配置,在此选择CPU版本的paddlepaddle处理实验。
在CentOS的系统下提供4种安装方式:
使用Docker进行安装(最保险的安装方式),因为我们在把工具和配置都安装在一个 Docker image 里,这样如果遇到问题,其他人可以复现问题以便帮助。另外,对于习惯使用Windows和MacOS的开发者来说,使用Docker就不用配置交叉编译环境了。需要强调的是:Docker 不会虚拟任何硬件,Docker container 里运行的编译工具实际上都是在本机的 CPU 和操作系统上直接运行的,性能和把编译工具安装在本机运行一样。
首先确保卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
在新主机上首次安装Docker CE之前,需要设置Docker存储库。
安装所需的包
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
设置稳定的存储库
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
启用边缘和测试存储库。
sudo yum-config-manager --enable docker-ce-edge
sudo yum-config-manager --enable docker-ce-test
安装最新版的Docker
sudo yum install docker-ce
启动Docker
sudo systemctl start docker
docker pull hub.baidubce.com/paddlepaddle/paddle
用docker images命令查看镜像
创建3个python文件,命名及代码如下
cnn.py代码
# coding=utf-8
import paddle.v2 as paddle
# 卷积神经网络LeNet-5,获取分类器
def convolutional_neural_network():
# 定义数据模型,数据大小是28*28,即784
img = paddle.layer.data(name="pixel",
type=paddle.data_type.dense_vector(784))
# 第一个卷积--池化层
conv_pool_1 = paddle.networks.simple_img_conv_pool(input=img,
filter_size=5,
num_filters=20,
num_channel=1,
pool_size=2,
pool_stride=2,
act=paddle.activation.Relu())
# 第二个卷积--池化层
conv_pool_2 = paddle.networks.simple_img_conv_pool(input=conv_pool_1,
filter_size=5,
num_filters=50,
num_channel=20,
pool_size=2,
pool_stride=2,
act=paddle.activation.Relu())
# 以softmax为激活函数的全连接输出层,输出层的大小必须为数字的个数10
predict = paddle.layer.fc(input=conv_pool_2,
size=10,
act=paddle.activation.Softmax())
return predict
train.py代码
# encoding:utf-8
import os
import sys
import paddle.v2 as paddle
from cnn import convolutional_neural_network
class TestMNIST:
def __init__(self):
# 该模型运行在CUP上,CUP的数量为2
paddle.init(use_gpu=False, trainer_count=2)
# *****************获取训练器********************************
def get_trainer(self):
# 获取分类器
out = convolutional_neural_network()
# 定义标签
label = paddle.layer.data(name="label",
type=paddle.data_type.integer_value(10))
# 获取损失函数
cost = paddle.layer.classification_cost(input=out, label=label)
# 获取参数
parameters = paddle.parameters.create(layers=cost)
"""
定义优化方法
learning_rate 迭代的速度
momentum 跟前面动量优化的比例
regularzation 正则化,防止过拟合
:leng re
"""
optimizer = paddle.optimizer.Momentum(learning_rate=0.1 / 128.0,
momentum=0.9,
regularization=paddle.optimizer.L2Regularization(rate=0.0005 * 128))
'''
创建训练器
cost 分类器
parameters 训练参数,可以通过创建,也可以使用之前训练好的参数
update_equation 优化方法
'''
trainer = paddle.trainer.SGD(cost=cost,
parameters=parameters,
update_equation=optimizer)
return trainer
# *****************开始训练********************************
def start_trainer(self):
# 获取训练器
trainer = self.get_trainer()
# 定义训练事件
def event_handler(event):
lists = []
if isinstance(event, paddle.event.EndIteration):
if event.batch_id % 100 == 0:
print "\nPass %d, Batch %d, Cost %f, %s" % (
event.pass_id, event.batch_id, event.cost, event.metrics)
else:
sys.stdout.write('.')
sys.stdout.flush()
if isinstance(event, paddle.event.EndPass):
# 保存训练好的参数
model_path = '../model'
if not os.path.exists(model_path):
os.makedirs(model_path)
with open(model_path + "/model.tar", 'w') as f:
trainer.save_parameter_to_tar(f=f)
# 使用测试进行测试
result = trainer.test(reader=paddle.batch(paddle.dataset.mnist.test(), batch_size=128))
print "\nTest with Pass %d, Cost %f, %s\n" % (event.pass_id, result.cost, result.metrics)
lists.append((event.pass_id, result.cost, result.metrics['classification_error_evaluator']))
# 获取数据
reader = paddle.batch(paddle.reader.shuffle(paddle.dataset.mnist.train(), buf_size=20000),
batch_size=128)
'''
开始训练
reader 训练数据
num_passes 训练的轮数
event_handler 训练的事件,比如在训练的时候要做一些什么事情
'''
trainer.train(reader=reader,
num_passes=100,
event_handler=event_handler)
if __name__ == "__main__":
testMNIST = TestMNIST()
# 开始训练
testMNIST.start_trainer()
infer.py代码
# encoding:utf-8
import numpy as np
import paddle.v2 as paddle
from PIL import Image
from cnn import convolutional_neural_network
class TestMNIST:
def __init__(self):
# 该模型运行在CUP上,CUP的数量为2
paddle.init(use_gpu=False, trainer_count=2)
# *****************获取参数********************************
def get_parameters(self):
with open("../model/model.tar", 'r') as f:
parameters = paddle.parameters.Parameters.from_tar(f)
return parameters
# *****************获取你要预测的参数********************************
def get_TestData(self ,path):
def load_images(file):
# 对图进行灰度化处理
im = Image.open(file).convert('L')
# 缩小到跟训练数据一样大小
im = im.resize((28, 28), Image.ANTIALIAS)
im = np.array(im).astype(np.float32).flatten()
im = im / 255.0
return im
test_data = []
test_data.append((load_images(path),))
return test_data
# *****************使用训练好的参数进行预测********************************
def to_prediction(self, out, parameters, test_data):
# 开始预测
probs = paddle.infer(output_layer=out,
parameters=parameters,
input=test_data)
# 处理预测结果并打印
lab = np.argsort(-probs)
print "预测结果为: %d" % lab[0][0]
if __name__ == "__main__":
testMNIST = TestMNIST()
# 开始预测
out = convolutional_neural_network()
parameters = testMNIST.get_parameters()
test_data = testMNIST.get_TestData('../images/infer_3.png')
testMNIST.to_prediction(out=out, parameters=parameters, test_data=test_data)
在CentOS 7的/home目录下新建一个work文件夹,并在work文件夹下新建两个文件夹命名为code和images
将三个.py文件放在code文件夹中,将待识别的手写字体图片放在images文件夹中,以infer_3.png为例
执行train.py
docker run -it -v $PWD:/work hub.baidubce.com/paddlepaddle/paddle /bin/bash
cd /work/code
python train.py
执行infer.py,得到识别结果
python infer.py