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

##### 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?

+ 问题描述

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

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

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

R
RaindragonD 已提交
89 90 91 92 93 94 95 96 97 98 99 100 101 102
##### Q: 图片小数量大数据集处理方法

+ 问题描述

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

+ 问题解答

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

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

+ 报错信息

A
adaxi123 已提交
103
```
R
RaindragonD 已提交
104
Failed to find dynamic library: libnccl.so ( libnccl.so: cannot open shared object file: No such file or directory )
A
adaxi123 已提交
105
```
A
adaxi123 已提交
106

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

按照以下步骤做检查:

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模型保存模型时报错

+ 代码文件:[network_conf.py](https://github.com/PaddlePaddle/models/blob/develop/PaddleRec/ctr/network_conf.py)只修改了最后一行:

A
adaxi123 已提交
147 148 149 150 151 152
```
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 已提交
153

A
adaxi123 已提交
154 155
+ 问题解答

R
RaindragonD 已提交
156 157 158 159 160 161 162 163 164 165 166
保存模型时需指定program 才能正确保存。请使用`executor = Executor(place)`, 你的train_program, 以及给`layers.data`指定的名称作为`save_inference_model` 的输入。


## 参数相关

##### Q: 手动输入参数并改变?

+ 问题描述

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

A
adaxi123 已提交
167 168
+ 问题解答

R
RaindragonD 已提交
169 170 171 172 173 174 175
可以通过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 已提交
176 177 178

+ 问题解答

R
RaindragonD 已提交
179 180 181 182 183 184 185
用户指定的name的优先级高于unique_name生成器,所以名字不会被改变。

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

+ 问题描述

怎么配置让两个fc层共享参数?
A
adaxi123 已提交
186 187 188

+ 问题解答

R
RaindragonD 已提交
189 190 191 192 193 194 195 196 197 198
只要指定param_attr相同名字即可,是`param_attr = fluid.ParamAttr(name='fc_share')`,然后把param_attr传到fc里去。


## LoD-Tensor数据结构相关

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

+ 问题描述

PaddlePaddle有拓展tensor维度的op吗?
A
adaxi123 已提交
199 200 201

+ 问题解答

R
RaindragonD 已提交
202 203 204 205 206 207 208 209
请参[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 已提交
210 211
+ 问题解答

R
RaindragonD 已提交
212 213 214 215 216 217 218 219
配置网络的时候可以将shape写成[-1,任意正数,128],然后输入的时候shape可以为[任意正数,任意正数,128]。维度只是个占位,运行网络的时候的实际维度是从输入数据推导出来的。两个"任意整数" 在输入和配置的时候可以不相等。配置网络的时候第一维度必须为-1。

##### Q: vector -> LodTensor

+ 问题描述

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

A
adaxi123 已提交
220
+ 问题解答
R
RaindragonD 已提交
221

A
adaxi123 已提交
222 223
如下示例

R
RaindragonD 已提交
224
```cpp
A
adaxi123 已提交
225 226 227 228 229 230 231 232 233 234
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 已提交
235 236 237 238 239
```

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

+ 错误信息
A
adaxi123 已提交
240

R
RaindragonD 已提交
241 242 243 244 245
```
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 已提交
246 247 248 249
```

+ 问题解答

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


R
RaindragonD 已提交
253
## pyreader
A
adaxi123 已提交
254

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

R
RaindragonD 已提交
257
+ 问题描述
A
adaxi123 已提交
258

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

+ 问题解答

R
RaindragonD 已提交
263 264 265 266 267 268 269
目前`load_inference_model`加载进行的模型还不支持py_reader输入。

##### Q: 变量取名

+ 问题描述

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

+ 问题解答
R
RaindragonD 已提交
272 273

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