From 80f1d86b812a0d880816fb9d4a13c66a423a39da Mon Sep 17 00:00:00 2001 From: ceci Date: Fri, 15 Feb 2019 11:22:36 +0000 Subject: [PATCH] update fit a line --- 01.fit_a_line/README.cn.md | 41 +++++++++++++++++++++----- 01.fit_a_line/image/prediction_gt.png | Bin 43431 -> 43694 bytes 01.fit_a_line/image/ranges.png | Bin 6737 -> 8763 bytes 01.fit_a_line/index.cn.html | 41 +++++++++++++++++++++----- 4 files changed, 66 insertions(+), 16 deletions(-) diff --git a/01.fit_a_line/README.cn.md b/01.fit_a_line/README.cn.md index cab8eb7..bcc7589 100644 --- a/01.fit_a_line/README.cn.md +++ b/01.fit_a_line/README.cn.md @@ -155,6 +155,16 @@ ratio = 0.8 # 训练集和验证集的划分比例 offset = int(data.shape[0]*ratio) train_data = data[:offset] test_data = data[offset:] + +train_reader = paddle.batch( + paddle.reader.shuffle( + train_data, buf_size=500), + batch_size=BATCH_SIZE) + +test_reader = paddle.batch( + paddle.reader.shuffle( + test_data, buf_size=500), + batch_size=BATCH_SIZE) ``` ### 配置训练程序 @@ -242,7 +252,7 @@ plot_prompt = ploter(train_prompt, test_prompt) ### 训练主循环 -首先给出需要存储的目录名,并初始化一个执行器。 +给出需要存储的目录名,并初始化一个执行器。 ```python %matplotlib inline @@ -257,7 +267,7 @@ exe_test = fluid.Executor(place) paddlepaddle提供了reader机制来读取训练数据。reader会一次提供多列数据,因此我们需要一个python的列表来定义读取顺序。我们构建一个循环来进行训练,直到训练结果足够好或者循环次数足够多。 如果训练迭代次数满足参数保存的迭代次数,可以把训练参数保存到`params_dirname`。 -其次设置训练主循环 +设置训练主循环 ```python for pass_id in range(num_epochs): for data_train in train_reader(): @@ -282,12 +292,10 @@ for pass_id in range(num_epochs): if math.isnan(float(avg_loss_value[0])): sys.exit("got NaN loss, training failed.") -``` -保存训练参数到之前给定的路径中 -```python -if params_dirname is not None: - fluid.io.save_inference_model(params_dirname, ['x'], [y_predict], exe) + #保存训练参数到之前给定的路径中 + if params_dirname is not None: + fluid.io.save_inference_model(params_dirname, ['x'], [y_predict], exe) ``` ## 预测 @@ -325,6 +333,23 @@ with fluid.scope_guard(inference_scope): fetch_list=fetch_targets) # 进行预测 ``` +保存图片 +```python +def save_result(points1, points2): + import matplotlib + matplotlib.use('Agg') + import matplotlib.pyplot as plt + x1 = [idx for idx in range(len(points1))] + y1 = points1 + y2 = points2 + l1 = plt.plot(x1, y1, 'r--', label='predictions') + l2 = plt.plot(x1, y2, 'g--', label='GT') + plt.plot(x1, y1, 'ro-', x1, y2, 'g+-') + plt.title('predictions VS GT') + plt.legend() + plt.savefig('./image/prediction_gt.png') +``` + 打印预测结果和标签并可视化结果 ```python print("infer results: (House Price)") @@ -335,7 +360,7 @@ with fluid.scope_guard(inference_scope): for idx, val in enumerate(infer_label): print("%d: %.2f" % (idx, val)) # 打印标签值 -save_result(results[0], infer_label) # 保存图片,该函数实现在train.py中 +save_result(results[0], infer_label) # 保存图片 ``` ## 总结 diff --git a/01.fit_a_line/image/prediction_gt.png b/01.fit_a_line/image/prediction_gt.png index 72f46c750d119004f16fbc79f583883fc37da22e..69dee8cb479aa878a4ff10b0bbeb97a4774aa2ac 100644 GIT binary patch delta 26787 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 R{zjiDe^dEJ*0uZo{{eT{fc5|Y diff --git a/01.fit_a_line/image/ranges.png b/01.fit_a_line/image/ranges.png index 916337f0720ef221851e89456c5c295e2e13445f..c6a9e182df89a905a922de63dccaeec028616d42 100644 GIT binary patch literal 8763 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 C(;o-` literal 6737 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 diff --git a/01.fit_a_line/index.cn.html b/01.fit_a_line/index.cn.html index 09d8138..9d935ac 100644 --- a/01.fit_a_line/index.cn.html +++ b/01.fit_a_line/index.cn.html @@ -197,6 +197,16 @@ ratio = 0.8 # 训练集和验证集的划分比例 offset = int(data.shape[0]*ratio) train_data = data[:offset] test_data = data[offset:] + +train_reader = paddle.batch( + paddle.reader.shuffle( + train_data, buf_size=500), + batch_size=BATCH_SIZE) + +test_reader = paddle.batch( + paddle.reader.shuffle( + test_data, buf_size=500), + batch_size=BATCH_SIZE) ``` ### 配置训练程序 @@ -284,7 +294,7 @@ plot_prompt = ploter(train_prompt, test_prompt) ### 训练主循环 -首先给出需要存储的目录名,并初始化一个执行器。 +给出需要存储的目录名,并初始化一个执行器。 ```python %matplotlib inline @@ -299,7 +309,7 @@ exe_test = fluid.Executor(place) paddlepaddle提供了reader机制来读取训练数据。reader会一次提供多列数据,因此我们需要一个python的列表来定义读取顺序。我们构建一个循环来进行训练,直到训练结果足够好或者循环次数足够多。 如果训练迭代次数满足参数保存的迭代次数,可以把训练参数保存到`params_dirname`。 -其次设置训练主循环 +设置训练主循环 ```python for pass_id in range(num_epochs): for data_train in train_reader(): @@ -324,12 +334,10 @@ for pass_id in range(num_epochs): if math.isnan(float(avg_loss_value[0])): sys.exit("got NaN loss, training failed.") -``` -保存训练参数到之前给定的路径中 -```python -if params_dirname is not None: - fluid.io.save_inference_model(params_dirname, ['x'], [y_predict], exe) + #保存训练参数到之前给定的路径中 + if params_dirname is not None: + fluid.io.save_inference_model(params_dirname, ['x'], [y_predict], exe) ``` ## 预测 @@ -367,6 +375,23 @@ with fluid.scope_guard(inference_scope): fetch_list=fetch_targets) # 进行预测 ``` +保存图片 +```python +def save_result(points1, points2): + import matplotlib + matplotlib.use('Agg') + import matplotlib.pyplot as plt + x1 = [idx for idx in range(len(points1))] + y1 = points1 + y2 = points2 + l1 = plt.plot(x1, y1, 'r--', label='predictions') + l2 = plt.plot(x1, y2, 'g--', label='GT') + plt.plot(x1, y1, 'ro-', x1, y2, 'g+-') + plt.title('predictions VS GT') + plt.legend() + plt.savefig('./image/prediction_gt.png') +``` + 打印预测结果和标签并可视化结果 ```python print("infer results: (House Price)") @@ -377,7 +402,7 @@ with fluid.scope_guard(inference_scope): for idx, val in enumerate(infer_label): print("%d: %.2f" % (idx, val)) # 打印标签值 -save_result(results[0], infer_label) # 保存图片,该函数实现在train.py中 +save_result(results[0], infer_label) # 保存图片 ``` ## 总结 -- GitLab