def get_trainer(self, datadim, type_size, parameters_path): # 获得图片对于的信息标签 label = paddle.layer.data(name="label", type=paddle.data_type.integer_value(type_size)) # 获取全连接层,也就是分类器 out = vgg_bn_drop(datadim=datadim, type_size=type_size) # out = convolutional_neural_network(datadim=datadim, type_size=type_size) # 获得损失函数 cost = paddle.layer.classification_cost(input=out, label=label) # 获得参数 if not parameters_path: parameters = self.get_parameters(cost=cost) else: parameters = self.get_parameters(parameters_path=parameters_path) ''' 定义优化方法 learning_rate 迭代的速度 momentum 跟前面动量优化的比例 regularzation 正则化,防止过拟合 ''' # ********************如果使用VGG网络模型就用这个优化方法****************** optimizer = paddle.optimizer.Momentum( momentum=0.9, regularization=paddle.optimizer.L2Regularization(rate=0.0005 * 128), learning_rate=0.0001 / 128, learning_rate_decay_a=0.1, learning_rate_decay_b=128000 * 35, learning_rate_schedule="discexp", ) # ********************如果使用LeNet-5网络模型就用这个优化方法****************** # optimizer = paddle.optimizer.Momentum(learning_rate=0.00001 / 128.0, # momentum=0.9, # regularization=paddle.optimizer.L2Regularization(rate=0.005 * 128)) ''' 创建训练器 cost 分类器 parameters 训练参数,可以通过创建,也可以使用之前训练好的参数 update_equation 优化方法 ''' trainer = paddle.trainer.SGD(cost=cost, parameters=parameters, update_equation=optimizer) return trainer
def get_trainer(self): # 数据大小 datadim = 3 * 32 * 32 # 获得图片对于的信息标签 lbl = paddle.layer.data(name="label", type=paddle.data_type.integer_value(10)) # 获取全连接层,也就是分类器 # out = vgg_bn_drop(datadim=datadim) # out = resnet_cifar10(datadim=datadim) # 获得损失函数 cost = paddle.layer.classification_cost(input=out, label=lbl) # 使用之前保存好的参数文件获得参数 # parameters = self.get_parameters(parameters_path="../model/model.tar") # 使用损失函数生成参数 parameters = self.get_parameters(cost=cost) ''' 定义优化方法 learning_rate 学习率 momentum 跟前面动量优化的比例 regularzation 正则化,防止过拟合 ''' momentum_optimizer = paddle.optimizer.Momentum( momentum=0.9, regularization=paddle.optimizer.L2Regularization(rate=0.0002 * 128), learning_rate=0.1 / 128.0, learning_rate_decay_a=0.1, learning_rate_decay_b=50000 * 100, learning_rate_schedule="discexp") ''' 创建训练器 cost 分类器 parameters 训练参数,可以通过创建,也可以使用之前训练好的参数 update_equation 优化方法 ''' trainer = paddle.trainer.SGD(cost=cost, parameters=parameters, update_equation=momentum_optimizer) return trainer
def main(): datadim = 3 * 32 * 32 classdim = 10 # PaddlePaddle init paddle.init(use_gpu=with_gpu, trainer_count=1) image = paddle.layer.data(name="image", type=paddle.data_type.dense_vector(datadim)) # Add neural network config # option 1. resnet # net = resnet_cifar10(image, depth=32) # option 2. vgg net = vgg_bn_drop(image) out = paddle.layer.fc(input=net, size=classdim, act=paddle.activation.Softmax()) lbl = paddle.layer.data(name="label", type=paddle.data_type.integer_value(classdim)) cost = paddle.layer.classification_cost(input=out, label=lbl) # Create parameters parameters = paddle.parameters.create(cost) # Create optimizer momentum_optimizer = paddle.optimizer.Momentum( momentum=0.9, regularization=paddle.optimizer.L2Regularization(rate=0.0002 * 128), learning_rate=0.1 / 128.0, learning_rate_decay_a=0.1, learning_rate_decay_b=50000 * 100, learning_rate_schedule='discexp') # Create trainer trainer = paddle.trainer.SGD(cost=cost, parameters=parameters, update_equation=momentum_optimizer) # End batch and end pass event handler def event_handler(event): 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): # save parameters with open('params_pass_%d.tar' % event.pass_id, 'w') as f: trainer.save_parameter_to_tar(f) result = trainer.test(reader=paddle.batch( paddle.dataset.cifar.test10(), batch_size=128), feeding={ 'image': 0, 'label': 1 }) print "\nTest with Pass %d, %s" % (event.pass_id, result.metrics) # Save the inference topology to protobuf. inference_topology = paddle.topology.Topology(layers=out) with open("inference_topology.pkl", 'wb') as f: inference_topology.serialize_for_inference(f) trainer.train(reader=paddle.batch(paddle.reader.shuffle( paddle.dataset.cifar.train10(), buf_size=50000), batch_size=128), num_passes=200, event_handler=event_handler, feeding={ 'image': 0, 'label': 1 }) # inference from PIL import Image import numpy as np import os def load_image(file): im = Image.open(file) im = im.resize((32, 32), Image.ANTIALIAS) im = np.array(im).astype(np.float32) # The storage order of the loaded image is W(widht), # H(height), C(channel). PaddlePaddle requires # the CHW order, so transpose them. im = im.transpose((2, 0, 1)) # CHW # In the training phase, the channel order of CIFAR # image is B(Blue), G(green), R(Red). But PIL open # image in RGB mode. It must swap the channel order. im = im[(2, 1, 0), :, :] # BGR im = im.flatten() im = im / 255.0 return im test_data = [] cur_dir = os.path.dirname(os.path.realpath(__file__)) test_data.append((load_image(cur_dir + '/image/dog.png'), )) # users can remove the comments and change the model name # with open('params_pass_50.tar', 'r') as f: # parameters = paddle.parameters.Parameters.from_tar(f) probs = paddle.infer(output_layer=out, parameters=parameters, input=test_data) lab = np.argsort(-probs) # probs and lab are the results of one batch data print "Label of image/dog.png is: %d" % lab[0][0]
if __name__ == '__main__': paddle.init(use_gpu=False, trainer_count=2) # 类别总数 type_size = 5 # 图片大小 imageSize = 200 # 保存的model路径 parameters_path = "../model/model.tar" # 数据的大小 datadim = 3 * imageSize * imageSize # *******************************开始预测************************************** # 添加数据 image_path = [] image_path.append( "../images/vegetables/loofah/71070c44-4dd7-11e8-8192-3c970e769528.jpg") image_path.append( "../images/vegetables/pumpkin/d9fcc518-4dd7-11e8-8192-3c970e769528.jpg" ) image_path.append( "../images/vegetables/baby_cabbage/45cad792-4dd5-11e8-8192-3c970e769528.jpg" ) out = vgg_bn_drop(datadim=datadim, type_size=type_size) parameters = get_parameters(parameters_path=parameters_path) all_result = to_prediction(image_paths=image_path, parameters=parameters, out=out, imageSize=imageSize) for i in range(0, all_result.__len__()): print '预测结果为:%d,可信度为:%f' % (all_result[i][0], all_result[i][1])
datadim = 3 * 32 * 32 # 分类的维度 classdim = 10 # PaddlePaddle init paddle.init(use_gpu=with_gpu, trainer_count=1) image = paddle.layer.data( name="image", type=paddle.data_type.dense_vector(datadim)) # Add neural network config # option 1. resnet # net = resnet_cifar10(image, depth=32) # option 2. vgg net = vgg_bn_drop(image) # 预测分类输出值 out = paddle.layer.fc( input=net, size=classdim, act=paddle.activation.Softmax()) # 真实标签值 lbl = paddle.layer.data( name="label", type=paddle.data_type.integer_value(classdim)) # 输出值和真实值之间的损失 cost = paddle.layer.classification_cost(input=out, label=lbl) # create parameters parameters = paddle.parameters.create(cost) # create optimizer momentum_optimizer = paddle.optimizer.Momentum( momentum=0.9,
# CIFAR训练图片通道顺序为B(蓝),G(绿),R(红), # 而PIL打开图片默认通道顺序为RGB,因为需要交换通道。 im = im[(2, 1, 0), :, :] # BGR im = im.flatten() im = im / 255.0 return im # 获得要预测的图片 test_data = [] test_data.append((load_image(image_path), )) # 获得预测结果 probs = paddle.infer(output_layer=out, parameters=parameters, input=test_data) # 处理预测结果 lab = np.argsort(-probs) # 返回概率最大的值和其对应的概率值 return lab[0][0], probs[0][(lab[0][0])] if __name__ == '__main__': testCIFAR = TestCIFAR() # 开始预测 out = vgg_bn_drop(3 * 32 * 32) parameters = testCIFAR.get_parameters("../model/model.tar") image_path = "../images/airplane1.png" result, probability = testCIFAR.to_prediction(image_path=image_path, out=out, parameters=parameters) print '预测结果为:%d,可信度为:%f' % (result, probability)