train_cn.md 10.6 KB
Newer Older
A
adaxi123 已提交
1 2
# 网络搭建及训练

R
RaindragonD 已提交
3 4 5 6 7 8 9 10 11 12


## 模型介绍

##### Q: sigmoid中num_classes意义?

+ 问题描述

sigmoid二分类,`sigmoid_cross_entropy_with_logits`,其中num_classes的意义是什么?

A
adaxi123 已提交
13 14
+ 问题解答

R
RaindragonD 已提交
15 16 17 18 19 20 21 22
`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:proto信息解释文档?

+ 问题描述

PaddlePaddle的proto信息相关的解释文档?

A
adaxi123 已提交
23 24
+ 问题解答

R
RaindragonD 已提交
25 26 27 28 29 30 31
proto信息可以打印出来,然后参考Github [framework.prot](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/framework/framework.proto)文件进行解释。


## 模型调用

##### Q: 如何不训练某层的权重?

A
adaxi123 已提交
32 33
+ 问题解答

R
RaindragonD 已提交
34 35 36 37 38 39 40
ParamAttr里配置`learning_rate=0`

##### Q: 根据输出结束模型运行?

+ 问题描述

PaddlePaddle可以像tf一样根据输出,只执行模型的一部分么?
A
adaxi123 已提交
41 42 43

+ 问题解答

R
RaindragonD 已提交
44 45 46 47 48 49 50 51 52 53 54 55 56
目前的executor会执行整个program。建议做法是,在定义program的时候提前clone出一个子program,如当前`inference_program = fluid.default_main_program().clone(for_test=True)`的做法。

##### 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的一些特殊之处。
57
对于非LoDTensor数据,可以使用StaticRNN,用法与上面类似,参考[语言模型示例]( https://github.com/PaddlePaddle/models/blob/develop/PaddleNLP/shared_modules/models/language_model/lm_model.py#L261)
R
RaindragonD 已提交
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

##### Q: NumPy读取出fc层W矩阵?

+ 问题描述

PaddlePaddle中训练好的fc层参数,有没有直接用numpy 读取出fc层的W矩阵的示例代码呢?

+ 问题解答

weight名字在构建网络的时候可以通过param_attr指定,然后用`fluid.global_scope().find_var("weight_name").get_tensor()`

##### Q: `stop_gradient=True`影响范围?

+ 问题描述

请问fluid里面如果某一层使用`stop_gradient=True`,那么是不是这一层之前的层都会自动 `stop_gradient=True`?

+ 问题解答

是的,梯度不回传了。

##### Q: 如何获取accuracy?

+ 问题描述

83
根据models里面的[ctr例子](https://github.com/PaddlePaddle/models/blob/develop/PaddleRec/ctr/dnn/infer.py)改写了一个脚本,主要在train的同时增加test过程,方便选择模型轮次,整体训练测试过程跑通,不过无法获取accuracy?
R
RaindragonD 已提交
84

A
adaxi123 已提交
85
+ 问题解答
R
RaindragonD 已提交
86

A
adaxi123 已提交
87 88
AUC中带有LOD 信息,需要设置`return_numpy=False `来获得返回值。

C
chengduo 已提交
89 90 91 92 93 94 95 96 97 98
##### Q: 模型运行过程中如何获取某个变量的值?

+ 问题描述

在使用Executor运行模型时,如何获取模型中某个变量的值。

+ 问题解答

Executor的run方法提供了`fetch_list`参数,如果用户想获取运行模型中某个变量的值,只需要该变量添加到`fetch_list`中即可,详细用法可参考[Executor的示例](https://www.paddlepaddle.org.cn/documentation/docs/zh/1.5/api_cn/executor_cn.html#executor)

R
RaindragonD 已提交
99 100 101 102 103 104 105 106 107 108 109 110 111 112
##### Q: 图片小数量大数据集处理方法

+ 问题描述

对于图片小但数量很大的数据集有什么好的处理方法?

+ 问题解答

`multiprocess_reader`可以解决该问题。参考[Github示例](https://github.com/PaddlePaddle/Paddle/issues/16592)

##### Q: Libnccl.so报错如何解决?

+ 报错信息

A
adaxi123 已提交
113
```
R
RaindragonD 已提交
114
Failed to find dynamic library: libnccl.so ( libnccl.so: cannot open shared object file: No such file or directory )
A
adaxi123 已提交
115
```
A
adaxi123 已提交
116

R
RaindragonD 已提交
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
+ 问题解答

按照以下步骤做检查:

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
```


## 模型保存

##### Q: 保存模型API选择

+ 问题描述

请说明一下如下两个接口的适用场景,现在保存模型都不知用哪个:`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: 保存模型报错

+ 问题描述

CTR模型保存模型时报错

155
+ 代码文件:[network_conf.py](https://github.com/PaddlePaddle/models/blob/develop/PaddleRec/ctr/dnn/network_conf.py)只修改了最后一行:
R
RaindragonD 已提交
156

A
adaxi123 已提交
157 158 159 160 161 162
```
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
```
A
adaxi123 已提交
163

A
adaxi123 已提交
164 165
+ 问题解答

R
RaindragonD 已提交
166 167 168 169 170
保存模型时需指定program 才能正确保存。请使用`executor = Executor(place)`, 你的train_program, 以及给`layers.data`指定的名称作为`save_inference_model` 的输入。


## 参数相关

X
xsrobin 已提交
171 172 173 174 175 176 177 178 179 180
##### Q: 本地数据传入embedding的参数矩阵

+ 问题描述

如何将本地数据传入embedding的参数矩阵中?

+ 问题解答

需将本地词典向量读取为numpy数据格式,然后使用fluid.initializer.NumpyArrayInitializer这个op初始化fluid.layers.embedding里的param_attr参数。即可实现加载用户自定义(或预训练)的embedding向量。

A
adaxiadaxi 已提交
181 182 183 184 185 186 187 188 189 190
##### Q: 如何查看w和b的值

+ 问题描述

如何查看paddle.fluid.layers.fc生成的w和b的值?

+ 问题解答

可以通过param_t = fluid.global_scope().find_var(param_name).get_tensor()查看,
param_name可以自己指定,如果不知道的话,可以通过 param_list = fluid.framework.default_main_program().block(0).all_parameters() 看一下。
191

X
xsrobin 已提交
192 193 194 195 196 197 198 199 200 201
##### Q: 共享向量权重

+ 问题描述

fluid.layers.embedding中如何实现多个feature间共享该层的向量权重?

+ 问题解答

将所有embedding层中param_attr参数里的name设置为同一个,即可实现共享向量权重。如`param_attr=fluid.ParamAttr(name="word_embedding")`

R
RaindragonD 已提交
202 203 204 205 206 207
##### Q: 手动输入参数并改变?

+ 问题描述

PaddlePaddle的全连接层,可不可以手动输入参数比如weights和bias并禁止优化器比如optimizer.SGD在模型训练的时候改变它?

A
adaxi123 已提交
208 209
+ 问题解答

R
RaindragonD 已提交
210 211 212 213 214 215 216
可以通过ParamAttr设置参数的属性,`fluid.ParamAttr( initializer=fluid.initializer.Normal(0.0, 0.02), learning_rate=2.0)`,其中learning_rate设置为0,就不会修改。手动输入参数也可以实现,但是会比较麻烦。

##### Q: `fluid.unique_name.guard()`影响范围

+ 问题描述

batch norm 里面的两个参数:moving_mean_name、moving_variance_name应该是两个var,但是他们却没有受到 `with fluid.unique_name.guard()` 的影响,导致名字重复?
A
adaxi123 已提交
217 218 219

+ 问题解答

R
RaindragonD 已提交
220 221 222 223 224 225 226
用户指定的name的优先级高于unique_name生成器,所以名字不会被改变。

##### Q: 2fc层共享参数?

+ 问题描述

怎么配置让两个fc层共享参数?
A
adaxi123 已提交
227 228 229

+ 问题解答

R
RaindragonD 已提交
230 231 232 233 234 235 236 237 238 239
只要指定param_attr相同名字即可,是`param_attr = fluid.ParamAttr(name='fc_share')`,然后把param_attr传到fc里去。


## LoD-Tensor数据结构相关

##### Q: 拓展tensor纬度

+ 问题描述

PaddlePaddle有拓展tensor维度的op吗?
A
adaxi123 已提交
240 241 242

+ 问题解答

R
RaindragonD 已提交
243 244 245 246 247 248 249 250
请参[unsqueeze op](http://paddlepaddle.org/documentation/docs/zh/1.3/api/layers.html#unsqueeze),例如[1,2]拓展为[1,2,1]

##### Q: 多维变长tensor?

+ 问题描述

PaddlePaddle是否支持两维以上的变长tensor,如shape[-1, -1, 128]?

A
adaxi123 已提交
251 252
+ 问题解答

R
RaindragonD 已提交
253 254 255 256 257 258 259 260
配置网络的时候可以将shape写成[-1,任意正数,128],然后输入的时候shape可以为[任意正数,任意正数,128]。维度只是个占位,运行网络的时候的实际维度是从输入数据推导出来的。两个"任意整数" 在输入和配置的时候可以不相等。配置网络的时候第一维度必须为-1。

##### Q: vector -> LodTensor

+ 问题描述

C++ 如何把std::vector转换成LodTensor的方法?

A
adaxi123 已提交
261
+ 问题解答
R
RaindragonD 已提交
262

A
adaxi123 已提交
263 264
如下示例

R
RaindragonD 已提交
265
```cpp
A
adaxi123 已提交
266 267 268 269 270 271 272 273 274 275
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);
R
RaindragonD 已提交
276 277 278 279 280
```

##### Q: 报错holder should not be null

+ 错误信息
A
adaxi123 已提交
281

R
RaindragonD 已提交
282 283 284 285 286
```
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:
A
adaxi123 已提交
287 288 289 290
```

+ 问题解答

R
RaindragonD 已提交
291
错误提示是某个tensor为空。建议运行时加上环境变量GLOG_vmodule=operator=4 , GLOG_logtostderr=1看看运行到哪个op,哪个tensor为空。
A
adaxi123 已提交
292 293


R
RaindragonD 已提交
294
## pyreader
A
adaxi123 已提交
295

R
RaindragonD 已提交
296
##### Q: 加载模型时pyreader使用
A
adaxi123 已提交
297

R
RaindragonD 已提交
298
+ 问题描述
A
adaxi123 已提交
299

R
RaindragonD 已提交
300
调用`save_inference_model`后,`load_inference_model`加载预测模型的时候用py_reader读取,`feeded_var_names`为空也无法通过feed输入了。py_reader此刻应该如何声明?
A
adaxi123 已提交
301 302 303

+ 问题解答

R
RaindragonD 已提交
304 305 306 307 308 309 310
目前`load_inference_model`加载进行的模型还不支持py_reader输入。

##### Q: 变量取名

+ 问题描述

使用py_reader读取数据的时候,怎么给读取的变量指定名字呢?
A
adaxi123 已提交
311 312

+ 问题解答
R
RaindragonD 已提交
313 314

参考[create_py_reader_by_data](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#create-py-reader-by-data)