From 120103b604e981adee8bd0d57cf93bcd61070e83 Mon Sep 17 00:00:00 2001 From: ceci Date: Fri, 15 Feb 2019 04:23:29 +0000 Subject: [PATCH] fit a line --- 01.fit_a_line/README.cn.md | 135 +++++++++++++++++--------- 01.fit_a_line/image/prediction_gt.png | Bin 0 -> 43431 bytes 01.fit_a_line/index.cn.html | 135 +++++++++++++++++--------- 01.fit_a_line/train.py | 17 ++++ 4 files changed, 197 insertions(+), 90 deletions(-) create mode 100644 01.fit_a_line/image/prediction_gt.png diff --git a/01.fit_a_line/README.cn.md b/01.fit_a_line/README.cn.md index b028c2f..2bf57d7 100644 --- a/01.fit_a_line/README.cn.md +++ b/01.fit_a_line/README.cn.md @@ -37,6 +37,12 @@ $$MSE=\frac{1}{n}\sum_{i=1}^{n}{(\hat{Y_i}-Y_i)}^2$$ 即对于一个大小为$n$的测试集,$MSE$是$n$个数据预测结果误差平方的均值。 +对损失函数进行优化所采用的方法一般为梯度下降法。梯度下降法是一种一阶最优化算法。如果$f(x)$在点$x_n$有定义且可微,则认为$f(x)$在点$x_n$沿着梯度的负方向$-▽f(x_n)$下降的是最快的。反复调节$x$,使得$f(x)$接近最小值或者极小值,调节的方式为: + +$$x_n+1=x_n-λ▽f(x), n≧0$$ + +其中λ代表学习率。这种调节的方法称为梯度下降法。 + ### 训练过程 定义好模型结构之后,我们要通过以下几个步骤进行模型训练 @@ -131,30 +137,50 @@ test_reader = paddle.batch( batch_size=BATCH_SIZE) ``` +如果想直接从txt文件中读取数据的话,可以参考以下代码。 + +```python +filename = 'housing.data' +feature_name = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', + 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'convert'] +feature_num = len(feature_name) +data = numpy.fromfile(filename, sep=' ') # 读取原始数据 +data = data.reshape(data.shape[0] // feature_num, feature_num) +maximums, minimums, avgs = data.max(axis=0), data.min(axis=0), data.sum(axis=0)/data.shape[0] + +for i in six.moves.range(feature_num-1): + data[:, i] = (data[:, i] - avgs[i]) / (maximums[i] - minimums[i]) + +ratio = 0.8 # 训练集和验证集的划分比例 +offset = int(data.shape[0]*ratio) +train_data = data[:offset] +test_data = data[offset:] +``` + ### 配置训练程序 训练程序的目的是定义一个训练模型的网络结构。对于线性回归来讲,它就是一个从输入到输出的简单的全连接层。更加复杂的结果,比如卷积神经网络,递归神经网络等会在随后的章节中介绍。训练程序必须返回`平均损失`作为第一个返回值,因为它会被后面反向传播算法所用到。 ```python -x = fluid.layers.data(name='x', shape=[13], dtype='float32') -y = fluid.layers.data(name='y', shape=[1], dtype='float32') -y_predict = fluid.layers.fc(input=x, size=1, act=None) +x = fluid.layers.data(name='x', shape=[13], dtype='float32') # 定义输入的形状和数据类型 +y = fluid.layers.data(name='y', shape=[1], dtype='float32') # 定义输出的形状和数据类型 +y_predict = fluid.layers.fc(input=x, size=1, act=None) # 连接输入和输出的全连接层 -main_program = fluid.default_main_program() -startup_program = fluid.default_startup_program() +main_program = fluid.[default_main_program](http://www.paddlepaddle.org/documentation/docs/zh/develop/api_cn/fluid_cn.html#default-main-program)() +startup_program = fluid.[default_startup_program](http://www.paddlepaddle.org/documentation/docs/zh/develop/api_cn/fluid_cn.html#default-startup-program)() -cost = fluid.layers.square_error_cost(input=y_predict, label=y) -avg_loss = fluid.layers.mean(cost) +cost = fluid.layers.square_error_cost(input=y_predict, label=y) # 利用标签数据和输出的预测数据估计方差 +avg_loss = fluid.layers.mean(cost) # 对方差求均值,得到平均损失 ``` ### Optimizer Function 配置 -在下面的 `SGD optimizer`,`learning_rate` 是训练的速度,与网络的训练收敛速度有关系。 +在下面的 `SGD optimizer`,`learning_rate` 是学习率,与网络的训练收敛速度有关系。 ```python sgd_optimizer = fluid.optimizer.SGD(learning_rate=0.001) sgd_optimizer.minimize(avg_loss) -#clone a test_program +#克隆main_program得到test_program,有些operator在训练和测试之间的操作是不同的,例如batch_norm,使用参数for_test来区分该程序是用来训练还是用来测试,该api不会删除任何操作符,请在backward和optimization之前使用。 test_program = main_program.clone(for_test=True) ``` @@ -163,26 +189,15 @@ test_program = main_program.clone(for_test=True) ```python use_cuda = False -place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() +place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() # 指明executor的执行场所 +###executor可以接受传入的program,并根据feed map(输入映射表)和fetch list(结果获取表)向program中添加数据输入算子和结果获取算子。使用close()关闭该executor,调用run(...)执行program,更多使用详情请参考[fluid.executor](http://www.paddlepaddle.org/documentation/docs/zh/develop/api_cn/fluid_cn.html#permalink-15-executor) exe = fluid.Executor(place) ``` -除此之外,还可以通过画图,来展现`训练进程`: - -```python -# Plot data -from paddle.utils.plot import Ploter - -train_prompt = "Train cost" -test_prompt = "Test cost" -plot_prompt = Ploter(train_prompt, test_prompt) - -``` - ### 创建训练过程 -训练需要有一个训练程序和一些必要参数,并构建了一个获取训练过程中测试误差的函数。 +训练需要有一个训练程序和一些必要参数,并构建了一个获取训练过程中测试误差的函数。必要参数有executor,program,reader,feeder,fetch_list,executor表示之前创建的执行器,program表示执行器所执行的program,是之前创建的program,如果该项参数没有给定的话则默认使用defalut_main_program,reader表示读取到的数据,feeder表示前向输入的变量,fetch_list表示用户想得到的变量或者命名的结果。 ```python num_epochs = 100 @@ -195,15 +210,34 @@ def train_test(executor, program, reader, feeder, fetch_list): outs = executor.run(program=program, feed=feeder.feed(data_test), fetch_list=fetch_list) - accumulated = [x_c[0] + x_c[1][0] for x_c in zip(accumulated, outs)] - count += 1 - return [x_d / count for x_d in accumulated] + accumulated = [x_c[0] + x_c[1][0] for x_c in zip(accumulated, outs)] # 累加测试过程中的损失值 + count += 1 # 累加测试集中的样本数量 + return [x_d / count for x_d in accumulated] # 计算平均损失 + +``` +可以直接输出损失值来观察`训练进程`: + +```python +train_prompt = "train cost" +test_prompt = "test cost" +print("%s', out %f" % (train_prompt, out)) +print("%s', out %f" % (test_prompt, out)) + +``` + +除此之外,还可以通过画图,来展现`训练进程`: + +```python +# plot data +from paddle.utils.plot import ploter + +plot_prompt = ploter(train_prompt, test_prompt) ``` ### 训练主循环 -PaddlePaddle提供了读取数据者发生器机制来读取训练数据。读取数据者会一次提供多列数据,因此我们需要一个Python的list来定义读取顺序。我们构建一个循环来进行训练,直到训练结果足够好或者循环次数足够多。 -如果训练顺利,可以把训练参数保存到`params_dirname`。 + +首先给出需要存储的目录名,并初始化一个执行器。 ```python %matplotlib inline @@ -215,8 +249,12 @@ naive_exe.run(startup_program) step = 0 exe_test = fluid.Executor(place) +``` -# main train loop. +paddlepaddle提供了reader机制来读取训练数据。reader会一次提供多列数据,因此我们需要一个python的列表来定义读取顺序。我们构建一个循环来进行训练,直到训练结果足够好或者循环次数足够多。 +如果训练迭代次数满足参数保存的迭代次数,可以把训练参数保存到`params_dirname`。 +其次设置训练主循环 +```python for pass_id in range(num_epochs): for data_train in train_reader(): avg_loss_value, = exe.run(main_program, @@ -234,17 +272,19 @@ for pass_id in range(num_epochs): plot_prompt.append(test_prompt, step, test_metics[0]) plot_prompt.plot() # If the accuracy is good enough, we can stop the training. - if test_metics[0] < 10.0: + if test_metics[0] < 10.0: # 如果准确率达到要求,则停止训练 break step += 1 if math.isnan(float(avg_loss_value[0])): sys.exit("got NaN loss, training failed.") - if params_dirname is not None: - # We can save the trained parameters for the inferences later - fluid.io.save_inference_model(params_dirname, ['x'], - [y_predict], exe) +``` + +保存训练参数到之前给定的路径中 +```python +if params_dirname is not None: + fluid.io.save_inference_model(params_dirname, ['x'], [y_predict], exe) ``` ## 预测 @@ -264,30 +304,35 @@ inference_scope = fluid.core.Scope() ```python with fluid.scope_guard(inference_scope): [inference_program, feed_target_names, - fetch_targets] = fluid.io.load_inference_model(params_dirname, infer_exe) + fetch_targets] = fluid.io.load_inference_model(params_dirname, infer_exe) # 载入预训练模型 batch_size = 10 infer_reader = paddle.batch( - paddle.dataset.uci_housing.test(), batch_size=batch_size) + paddle.dataset.uci_housing.test(), batch_size=batch_size) # 准备测试集 infer_data = next(infer_reader()) infer_feat = numpy.array( - [data[0] for data in infer_data]).astype("float32") + [data[0] for data in infer_data]).astype("float32") # 提取测试集中的数据 infer_label = numpy.array( - [data[1] for data in infer_data]).astype("float32") + [data[1] for data in infer_data]).astype("float32") # 提取测试集中的标签 assert feed_target_names[0] == 'x' results = infer_exe.run(inference_program, feed={feed_target_names[0]: numpy.array(infer_feat)}, - fetch_list=fetch_targets) + fetch_list=fetch_targets) # 进行预测 +``` + +打印预测结果和标签并可视化结果 +```python + print("infer results: (House Price)") + for idx, val in enumerate(results[0]): + print("%d: %.2f" % (idx, val)) # 打印预测结果 - print("infer results: (House Price)") - for idx, val in enumerate(results[0]): - print("%d: %.2f" % (idx, val)) + print("\nground truth:") + for idx, val in enumerate(infer_label): + print("%d: %.2f" % (idx, val)) # 打印标签值 - print("\nground truth:") - for idx, val in enumerate(infer_label): - print("%d: %.2f" % (idx, val)) +save_result(results[0], infer_label) # 保存图片,该函数实现在train.py中 ``` ## 总结 diff --git a/01.fit_a_line/image/prediction_gt.png b/01.fit_a_line/image/prediction_gt.png new file mode 100644 index 0000000000000000000000000000000000000000..72f46c750d119004f16fbc79f583883fc37da22e GIT binary patch literal 43431 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