运行环境:Spyder (python 3.7.6)
可执行代码:
import paddle.fluid as fluid
import paddle
import numpy as np
import os
import matplotlib.pyplot as plt
BUF_SIZE=500
BATCH_SIZE=20
#用于训练的数据提供器,每次从缓存中随机读取批次大小的数据
train_reader = paddle.batch(
paddle.reader.shuffle(paddle.dataset.uci_housing.train(),
buf_size=BUF_SIZE),
batch_size=BATCH_SIZE)
#用于测试的数据提供器,每次从缓存中随机读取批次大小的数据
test_reader = paddle.batch(
paddle.reader.shuffle(paddle.dataset.uci_housing.test(),
buf_size=BUF_SIZE),
batch_size=BATCH_SIZE)
train_data=paddle.dataset.uci_housing.train();
sampledata=next(train_data())
print(sampledata)
#定义张量变量x,表示13维的特征值
x = fluid.layers.data(name='x', shape=[13], dtype='float32')
#定义张量y,表示目标值
y = fluid.layers.data(name='y', shape=[1], dtype='float32')
#定义一个简单的线性网络,连接输入和输出的全连接层
#input:输入tensor;
#size:该层输出单元的数目
#act:激活函数
y_predict=fluid.layers.fc(input=x,size=1,act=None)
cost = fluid.layers.square_error_cost(input=y_predict, label=y) #求一个batch的损失值
avg_cost = fluid.layers.mean(cost) #对损失值求平均值
test_program = fluid.default_main_program().clone(for_test=True)
optimizer = fluid.optimizer.SGDOptimizer(learning_rate=0.001)
opts = optimizer.minimize(avg_cost)
use_cuda = False #use_cuda为False,表示运算场所为CPU;use_cuda为True,表示运算场所为GPU
place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()
exe = fluid.Executor(place) #创建一个Executor实例exe
exe.run(fluid.default_startup_program()) #Executor的run()方法执行startup_program(),进行参数初始化
# 定义输入数据维度
feeder = fluid.DataFeeder(place=place, feed_list=[x, y])#feed_list:向模型输入的变量表或变量表名
iter=0;
iters=[]
train_costs=[]
def draw_train_process(iters,train_costs):
title="training cost"
plt.title(title, fontsize=24)
plt.xlabel("iter", fontsize=14)
plt.ylabel("cost", fontsize=14)
plt.plot(iters, train_costs,color='red',label='training cost')
plt.grid()
plt.show()
EPOCH_NUM=50
model_save_dir = "/home/aistudio/work/fit_a_line.inference.model"
for pass_id in range(EPOCH_NUM): #训练EPOCH_NUM轮
# 开始训练并输出最后一个batch的损失值
train_cost = 0
for batch_id, data in enumerate(train_reader()): #遍历train_reader迭代器
train_cost = exe.run(program=fluid.default_main_program(),#运行主程序
feed=feeder.feed(data), #喂入一个batch的训练数据,根据feed_list和data提供的信息,将输入数据转成一种特殊的数据结构
fetch_list=[avg_cost])
if batch_id % 40 == 0:
print("Pass:%d, Cost:%0.5f" % (pass_id, train_cost[0][0])) #打印最后一个batch的损失值
iter=iter+BATCH_SIZE
iters.append(iter)
train_costs.append(train_cost[0][0])
# 开始测试并输出最后一个batch的损失值
test_cost = 0
for batch_id, data in enumerate(test_reader()): #遍历test_reader迭代器
test_cost= exe.run(program=test_program, #运行测试cheng
feed=feeder.feed(data), #喂入一个batch的测试数据
fetch_list=[avg_cost]) #fetch均方误差
print('Test:%d, Cost:%0.5f' % (pass_id, test_cost[0][0])) #打印最后一个batch的损失值
#保存模型
# 如果保存路径不存在就创建
if not os.path.exists(model_save_dir):
os.makedirs(model_save_dir)
print ('save models to %s' % (model_save_dir))
#保存训练参数到指定路径中,构建一个专门用预测的program
fluid.io.save_inference_model(model_save_dir, #保存推理model的路径
['x'], #推理(inference)需要 feed 的数据
[y_predict], #保存推理(inference)结果的 Variables
exe) #exe 保存 inference model
draw_train_process(iters,train_costs)
运行结果:
(array([-0.0405441 , 0.06636364, -0.32356227, -0.06916996, -0.03435197,
0.05563625, -0.03475696, 0.02682186, -0.37171335, -0.21419304,
-0.33569506, 0.10143217, -0.21172912]), array([24.]))
Pass:0, Cost:594.97675
Test:0, Cost:252.35065
Pass:1, Cost:561.83167
Test:1, Cost:246.09416
Pass:2, Cost:459.74844
Test:2, Cost:232.91687
Pass:3, Cost:509.07635
Test:3, Cost:495.48148
Pass:4, Cost:472.40460
Test:4, Cost:194.80412
Pass:5, Cost:240.92383
Test:5, Cost:66.57917
Pass:6, Cost:440.24042
Test:6, Cost:84.65546
Pass:7, Cost:634.61072
Test:7, Cost:182.83545
Pass:8, Cost:341.25592
Test:8, Cost:45.64724
Pass:9, Cost:239.61629
Test:9, Cost:38.21730
Pass:10, Cost:416.92545
Test:10, Cost:13.68345
Pass:11, Cost:313.31342
Test:11, Cost:137.43176
Pass:12, Cost:193.87694
Test:12, Cost:47.85563
Pass:13, Cost:201.06247
Test:13, Cost:82.04956
Pass:14, Cost:303.68903
Test:14, Cost:93.72757
Pass:15, Cost:271.42902
Test:15, Cost:68.27122
Pass:16, Cost:147.85150
Test:16, Cost:31.66114
Pass:17, Cost:163.93301
Test:17, Cost:34.30592
Pass:18, Cost:217.68208
Test:18, Cost:159.02216
Pass:19, Cost:198.56328
Test:19, Cost:11.23554
Pass:20, Cost:151.04672
Test:20, Cost:156.35715
Pass:21, Cost:228.13264
Test:21, Cost:19.72987
Pass:22, Cost:135.02721
Test:22, Cost:28.90829
Pass:23, Cost:139.20348
Test:23, Cost:43.64440
Pass:24, Cost:106.02905
Test:24, Cost:37.60497
Pass:25, Cost:234.56519
Test:25, Cost:4.32913
Pass:26, Cost:88.99309
Test:26, Cost:28.61305
Pass:27, Cost:90.94614
Test:27, Cost:5.81786
Pass:28, Cost:108.04978
Test:28, Cost:1.58353
Pass:29, Cost:72.39711
Test:29, Cost:10.82204
Pass:30, Cost:114.94093
Test:30, Cost:0.34398
Pass:31, Cost:80.49113
Test:31, Cost:21.12144
Pass:32, Cost:52.95084
Test:32, Cost:20.68388
Pass:33, Cost:132.29752
Test:33, Cost:5.25918
Pass:34, Cost:148.28853
Test:34, Cost:17.86463
Pass:35, Cost:104.56012
Test:35, Cost:22.85536
Pass:36, Cost:160.09470
Test:36, Cost:31.46528
Pass:37, Cost:55.97822
Test:37, Cost:44.90407
Pass:38, Cost:74.20323
Test:38, Cost:5.53818
Pass:39, Cost:185.96228
Test:39, Cost:14.48831
Pass:40, Cost:19.58599
Test:40, Cost:11.97766
Pass:41, Cost:54.85631
Test:41, Cost:23.13018
Pass:42, Cost:71.04317
Test:42, Cost:13.37346
Pass:43, Cost:119.49823
Test:43, Cost:13.66442
Pass:44, Cost:183.30392
Test:44, Cost:34.38294
Pass:45, Cost:29.84375
Test:45, Cost:15.30897
Pass:46, Cost:13.55676
Test:46, Cost:4.49575
Pass:47, Cost:35.73510
Test:47, Cost:29.71836
Pass:48, Cost:182.10692
Test:48, Cost:9.02156
Pass:49, Cost:91.14111
Test:49, Cost:16.10660
save models to /home/aistudio/work/fit_a_line.inference.model
写在后面:paddlepaddle是一个框架,类似一个包,在使用时需要import导入
目前测试在python自带IDE不可执行,需要使用第三方代码平台进行导入使用,目前测试通过。