直接上代码,把所有文件存放在一个根目录CifarLenet5文件夹里面
右键打开运行终端,输入python train.py进行训练;输入python infer.py进行测试,测试数据为一张图像,可以自行下载
文件train.py
# encoding:utf-8
import os
import sys
import paddle.v2 as paddle
from cnn import convolutional_neural_network
class TestCIFAR:
def __init__(self):
# 该模型运行在CPU上,CPU的数量为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):
# 保存模型
with open("modelCifar.tar", 'w') as f:
trainer.save_parameter_to_tar(f=f)
# 使用测试进行测试
result = trainer.test(reader=paddle.batch(paddle.dataset.cifar.test10(), batch_size=128))# 应为test10
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 = paddle.batch(reader=paddle.reader.shuffle(reader=paddle.dataset.cifar.train10(),# 注意为train10
buf_size=20000),
batch_size=128)
'''
开始训练
reader 训练数据
num_passes 训练的轮数
event_handler 训练的事件,比如在训练的时候要做一些什么事情
'''
trainer.train(reader=reader,
num_passes=1,
event_handler=event_handler)
if __name__ == "__main__":
testCIFAR = TestCIFAR()
# 开始训练
testCIFAR.start_trainer()
文件cnn.py
# coding=utf-8 windows默认的编码方式是GBK,python文件保存时使用了utf-8
import paddle.v2 as paddle# import A as B,给予A库一个B的别称,帮助记忆
# 定义卷积神经网络LeNet-5
def convolutional_neural_network():
# 定义数据模型
img = paddle.layer.data(name="pixel",
type=paddle.data_type.dense_vector(3072))# 数据大小是32*32*3,即3072
# 第一个卷积与池化层
conv_pool_1 = paddle.networks.simple_img_conv_pool(input=img,
filter_size=5,# 卷积核的尺寸
num_filters=20,# 卷积核的个数
num_channel=3,# channel也叫depth,1代表灰色图像,3代表彩色图像
pool_size=2,# 池化大小
pool_stride=2,# 池化步长
act=paddle.activation.Relu())# 激活函数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())
# 全连接输出层
predict = paddle.layer.fc(input=conv_pool_2,
size=10,# 以softmax为激活函数的全连接输出层,输出层的大小必须为类别的个数10
act=paddle.activation.Softmax())
return predict
文件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 TestCIFAR:
def __init__(self):
# 该模型运行在CPU上,CPU的数量为2
paddle.init(use_gpu=False, trainer_count=2)
# *****************获取参数********************************
def get_parameters(self):
with open("modelCifar.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)
# 缩小到跟训练数据一样大小
im = im.resize((32, 32), 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__":
testCIFAR = TestCIFAR()
# 开始预测
out = convolutional_neural_network()
parameters = testCIFAR.get_parameters()
test_data = testCIFAR.get_TestData('deer4.jpg')
testCIFAR.to_prediction(out=out, parameters=parameters, test_data=test_data)