train_cn.md 9.1 KB
Newer Older
A
adaxi123 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
# 网络搭建及训练

## Q:在RNN模型中如何遍历序列数据里每一个时间步?
+ 问题解答
对于LodTensor数据,分步处理每一个时间步数据的需求,大部分情况可以使用`DynamicRNN`[参考示例](https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/fluid/tests/book/test_machine_translation.py#L69) ,其中`rnn.step_input`即是每一个时间步的数据,`rnn.memory`是需要更新的rnn的hidden state,另外还有个`rnn.static_input`是rnn外部的数据在DynamicRNN内的表示(如encoder的output),可以利用这三种数据完成所需操作。
rank_table记录了每个sequence的长度,DynamicRNN中调用了lod_tensor_to_array在产生array时按照rank_table做了特殊处理(sequence从长到短排序后从前到后进行slice),每个时间步数据的batch size可能会缩小(短的sequence结束时),这是Fluid DynamicRNN的一些特殊之处。 
对于非LoDTensor数据,可以使用StaticRNN,用法与上面类似,参考[语言模型示例]( https://github.com/PaddlePaddle/models/blob/develop/fluid/PaddleNLP/language_model/lstm/lm_model.py#L261)

## Q:batch norm 里面的两个参数:moving_mean_name、moving_variance_name应该是两个var,但是他们却没有受到 `with fluid.unique_name.guard()` 的影响,导致名字重复?
+ 问题解答
用户指定的name的优先级高于unique_name生成器,所以名字不会被改变。

## Q:怎么配置让两个fc层共享参数?
+ 问题解答
只要指定param_attr相同名字即可,是`param_attr = fluid.ParamAttr(name='fc_share')`,然后把param_attr传到fc里去。


## Q:调用`save_inference_model`后,`load_inference_model`加载预测模型的时候用py_reader读取,`feeded_var_names`为空也无法通过feed输入了。py_reader此刻应该如何声明?
+ 问题解答
目前`load_inference_model`加载进行的模型还不支持py_reader输入。

## Q:根据models里面的[ctr例子](https://github.com/PaddlePaddle/models/blob/develop/fluid/PaddleRec/ctr/infer.py)改写了一个脚本,主要在train的同时增加test过程,方便选择模型轮次,整体训练测试过程跑通,不过无法获取accuracy?
+ 问题解答
AUC中带有LOD 信息,需要设置`return_numpy=False `来获得返回值。

## Q:CTR模型保存模型时报错
```
Traceback (most recent call last):
  File "train.py", line 610, in <module>
    train_test()
  File "train.py", line 553, in train_test
    fluid.io.save_inference_model(model_dir, data_name_list, [loss, auc_var], pe)
  File "/home/kangjianfeng/paddlepaddle/paddle_release_home/python/lib/python2.7/site-packages/paddle/fluid/io.py", line 681, in save_inference_model
    main_program = main_program._prune(targets=target_vars)
  File "/home/kangjianfeng/paddlepaddle/paddle_release_home/python/lib/python2.7/site-packages/paddle/fluid/framework.py", line 1741, in _prune
    "The target variable must have an "
ValueError: The target variable must have an associated operator that generates it.
```
+ 代码文件:[network_conf.py](https://github.com/PaddlePaddle/models/blob/develop/fluid/PaddleRec/ctr/network_conf.py)只修改了最后一行:
```
accuracy = fluid.layers.accuracy(input=predict, label=words[-1])
auc_var, batch_auc_var, auc_states = \
    fluid.layers.auc(input=predict, label=words[-1], num_thresholds=2 ** 12, slide_steps=20)
return accuracy, avg_cost, auc_var, batch_auc_var, py_reader
```
+ 问题解答
保存模型时需指定program 才能正确保存。请使用` executor = Executor(place)`, 你的train_program, 以及给` layers.data `指定的名称作为` save_inference_model` 的输入。

## Q:holder_ should not be null Tensor not initialized yet when Tensor::type() is called
+ 错误信息
```
C++ Callstacks:
holder should not be null
Tensor not initialized yet when Tensor::type() is called. at [/paddle/paddle/fluid/framework/tensor.h:145]
PaddlePaddle Call Stacks:
```
+ 问题解答
错误提示是某个tensor为空。建议运行时加上环境变量GLOG_vmodule=operator=4 , GLOG_logtostderr=1看看运行到哪个op,哪个tensor为空。


## Q:使用py_reader读取数据的时候,怎么给读取的变量指定名字呢?
+ 问题解答
参考[create_py_reader_by_data](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#create-py-reader-by-data)


## Q:PaddlePaddle是否支持两维以上的变长tensor,如shape[-1, -1, 128]?
+ 问题解答
配置网络的时候可以将shape写成[-1,任意正数,128],然后输入的时候shape可以为[任意正数,任意正数,128]。维度只是个占位,运行网络的时候的实际维度是从输入数据推导出来的。两个"任意整数" 在输入和配置的时候可以不相等。配置网络的时候第一维度必须为-1。


## Q:请说明一下如下两个接口的适用场景,现在保存模型都不知用哪个:`save_inference_model`、`save_params`?
+ 问题解答
`save_inference_model`主要是用于预测的,该API除了会保存预测时所需的模型参数,还会保存预测使用的模型结构。而`save_params`会保存一个program中的所有参数,但是不保存该program对应的模型结构。参考[模型保存与加载](http://paddlepaddle.org/documentation/docs/zh/1.4/api_guides/low_level/model_save_reader.html)

## Q:PaddlePaddle的proto信息相关的解释文档?
+ 问题解答
proto信息可以打印出来,然后参考Github [framework.prot](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/framework/framework.proto)文件进行解释。

## Q:C++ 如何把std::vector转换成 lodtensor的方法?
+ 问题解答
如下示例
```cpp

std::vector<int64_t> ids{1918, 117, 55, 97, 1352, 4272, 1656, 903};

framework::LoDTensor words;

auto size = static_cast<int>(ids.size());

framework::LoD lod{{0, ids.size()}};

DDim dims{size, 1};

words.Resize(dims);

words.set_lod(lod);

auto *pdata = words.mutable_data<int64_t>();

size_t n = words.numel() * sizeof(int64_t);

memcpy(pdata, ids.data(), n);

```

## Q:PaddlePaddle可以像tf一样根据输出,只执行模型的一部分么?
+ 问题解答
目前的executor会执行整个program。建议做法是,在定义program的时候提前clone出一个子program,如当前`inference_program = fluid.default_main_program().clone(for_test=True)`的做法。

## Q:PaddlePaddle的全连接层,可不可以手动输入参数比如weights和bias并禁止优化器比如optimizer.SGD在模型训练的时候改变它?
+ 问题解答
可以通过ParamAttr设置参数的属性,`fluid.ParamAttr( initializer=fluid.initializer.Normal(0.0, 0.02), learning_rate=2.0)`,其中learning_rate设置为0,就不会修改。手动输入参数也可以实现,但是会比较麻烦。

## Q:PaddlePaddle中训练好的fc层参数,有没有直接用numpy 读取出fc层的W矩阵的示例代码呢?
+ 问题解答
weight名字在构建网络的时候可以通过param_attr指定,然后用`fluid.global_scope().find_var("weight_name").get_tensor()`

## Q:请问fluid 里面如果某一层使用`stop_gradient=True`,那么是不是这一层之前的层都会自动 `stop_gradient=True`?
+ 问题解答
是的,梯度不回传了。

## Q:如何不训练某层的权重?
+ 问题解答
ParamAttr里配置`learning_rate=0`

## Q:PaddlePaddle有拓展tensor维度的op吗?
+ 问题解答
请参[unsqueeze op](http://paddlepaddle.org/documentation/docs/zh/1.3/api/layers.html#unsqueeze),例如[1,2]拓展为[1,2,1]

## Q:sigmoid二分类,`sigmoid_cross_entropy_with_logits`,其中num_classes的意义?
+ 问题解答
`sigmoid_cross_entropy_with_logits`里面的num_classes是指有多个分类标签,而且这些标签之间相互独立,这样对每个分类都会有一个预测概率。举个例子,假如我们要做一个视频动作分类,有如下几个标签(吃饭,聊天,走路,打球),那么num_classes = 4。一个视频可以同时有多个ground truth标签是1,比如这里可能是(1, 1, 0, 0),也就是一边吃饭一边聊天的场景。而一个可能的预测概率是(0.8, 0.9, 0.1, 0.3),那么计算损失函数的时候,要对每个分类标签分别计算`sigmoid cross entropy`

## Q:对于图片小但数量很大的数据集有什么好的处理方法?
+ 问题解答
`multiprocess_reader`可以解决该问题。参考[Github示例](https://github.com/PaddlePaddle/Paddle/issues/16592)

## Q:fluid1.3, cpu训练如何使用多线程?
+ 问题解答
使用`ParallelExecutor`的话默认是多线程所有核数的,设置CPU_NUM可以指定线程数,另外可以试下在创建`ParallelExecutor`时传入设置了num_threads 的exec_strategy。

## Q:Libnccl.so报错如何解决?
+ 报错信息
```
Failed to find dynamic library: libnccl.so ( libnccl.so: cannot open shared object file: No such file or directory )
```
+ 问题解答
按照以下步骤做检查:
1、先确定是否安装libnccl.so
2、确定环境变量是否配置正确
```
export LD_LIBRARY_PATH=`pwd`/nccl_2.1.4-1+cuda8.0_x86_64/lib:$LD_LIBRARY_PATH
```
3、确定是否要配置软链
```
cd /usr/lib/x86_64-linux-gnu
ln -s libnccl.so.2 libnccl.so
```