• 网络搭建及训练
    • 模型介绍
      • Q: sigmoid中num_classes意义?
      • Q:proto信息解释文档?
  • 模型调用
    • Q: 如何不训练某层的权重?
    • Q: 根据输出结束模型运行?
    • Q: 遍历每一个时间布?
    • Q: NumPy读取出fc层W矩阵?
    • Q: stop_gradient=True影响范围?
    • Q: 如何获取accuracy?
    • Q: 图片小数量大数据集处理方法
    • Q: Libnccl.so报错如何解决?
  • 模型保存
    • Q: 保存模型API选择
    • Q: 保存模型报错
  • 参数相关
    • Q: 手动输入参数并改变?
    • Q: fluid.unique_name.guard()影响范围
    • Q: 2fc层共享参数?
  • LoD-Tensor数据结构相关
    • Q: 拓展tensor纬度
    • Q: 多维变长tensor?
    • Q: vector -> LodTensor
    • Q: 报错holder should not be null
  • pyreader
    • Q: 加载模型时pyreader使用
    • Q: 变量取名

    网络搭建及训练

    模型介绍

    Q: sigmoid中num_classes意义?
    • 问题描述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:proto信息解释文档?
    • 问题描述PaddlePaddle的proto信息相关的解释文档?

    • 问题解答proto信息可以打印出来,然后参考Github framework.prot文件进行解释。

    模型调用

    Q: 如何不训练某层的权重?
    • 问题解答ParamAttr里配置learning_rate=0
    Q: 根据输出结束模型运行?
    • 问题描述PaddlePaddle可以像tf一样根据输出,只执行模型的一部分么?

    • 问题解答目前的executor会执行整个program。建议做法是,在定义program的时候提前clone出一个子program,如当前inference_program = fluid.default_main_program().clone(for_test=True)的做法。

    Q: 遍历每一个时间布?
    • 问题描述在RNN模型中如何遍历序列数据里每一个时间步?

    • 问题解答对于LodTensor数据,分步处理每一个时间步数据的需求,大部分情况可以使用DynamicRNN,参考示例 ,其中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,用法与上面类似,参考语言模型示例。

    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例子改写了一个脚本,主要在train的同时增加test过程,方便选择模型轮次,整体训练测试过程跑通,不过无法获取accuracy?

    • 问题解答AUC中带有LOD 信息,需要设置return_numpy=False来获得返回值。

    Q: 图片小数量大数据集处理方法
    • 问题描述对于图片小但数量很大的数据集有什么好的处理方法?

    • 问题解答multiprocess_reader可以解决该问题。参考Github示例。

    Q: Libnccl.so报错如何解决?
    • 报错信息
    1. Failed to find dynamic library: libnccl.so ( libnccl.so: cannot open shared object file: No such file or directory
    • 问题解答按照以下步骤做检查:

    1、先确定是否安装libnccl.so

    2、确定环境变量是否配置正确

    1. export LD_LIBRARY_PATH=`pwd`/nccl_2.1.4-1+cuda8.0_x86_64/lib:$LD_LIBRARY_PATH

    3、确定是否要配置软链

    1. cd /usr/lib/x86_64-linux-gnu
    2. ln -s libnccl.so.2 libnccl.so

    模型保存

    Q: 保存模型API选择
    • 问题描述请说明一下如下两个接口的适用场景,现在保存模型都不知用哪个:save_inference_modelsave_params

    • 问题解答save_inference_model主要是用于预测的,该API除了会保存预测时所需的模型参数,还会保存预测使用的模型结构。而save_params会保存一个program中的所有参数,但是不保存该program对应的模型结构。参考模型保存与加载

    Q: 保存模型报错
    • 问题描述CTR模型保存模型时报错

    • 代码文件:network_conf.py只修改了最后一行:

    1. accuracy = fluid.layers.accuracy(input=predict, label=words[-1])
    2. auc_var, batch_auc_var, auc_states = \
    3. fluid.layers.auc(input=predict, label=words[-1], num_thresholds=2 ** 12, slide_steps=20)
    4. return accuracy, avg_cost, auc_var, batch_auc_var, py_reader
    • 问题解答保存模型时需指定program 才能正确保存。请使用executor = Executor(place), 你的train_program, 以及给layers.data指定的名称作为save_inference_model 的输入。

    参数相关

    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: fluid.unique_name.guard()影响范围
    • 问题描述batch norm 里面的两个参数:moving_mean_name、moving_variance_name应该是两个var,但是他们却没有受到 with fluid.unique_name.guard() 的影响,导致名字重复?

    • 问题解答用户指定的name的优先级高于unique_name生成器,所以名字不会被改变。

    Q: 2fc层共享参数?
    • 问题描述怎么配置让两个fc层共享参数?

    • 问题解答只要指定param_attr相同名字即可,是param_attr = fluid.ParamAttr(name='fc_share'),然后把param_attr传到fc里去。

    LoD-Tensor数据结构相关

    Q: 拓展tensor纬度
    • 问题描述PaddlePaddle有拓展tensor维度的op吗?

    • 问题解答请参unsqueeze op,例如[1,2]拓展为[1,2,1]

    Q: 多维变长tensor?
    • 问题描述PaddlePaddle是否支持两维以上的变长tensor,如shape[-1, -1, 128]?

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

    Q: vector -> LodTensor
    • 问题描述C++ 如何把std::vector转换成LodTensor的方法?

    • 问题解答如下示例

    1. std::vector<int64_t> ids{1918, 117, 55, 97, 1352, 4272, 1656, 903};
    2. framework::LoDTensor words;
    3. auto size = static_cast<int>(ids.size());
    4. framework::LoD lod{{0, ids.size()}};
    5. DDim dims{size, 1};
    6. words.Resize(dims);
    7. words.set_lod(lod);
    8. auto *pdata = words.mutable_data<int64_t>();
    9. size_t n = words.numel() * sizeof(int64_t);
    10. memcpy(pdata, ids.data(), n);
    Q: 报错holder should not be null
    • 错误信息
    1. C++ Callstacks:
    2. holder should not be null
    3. Tensor not initialized yet when Tensor::type() is called. at [/paddle/paddle/fluid/framework/tensor.h:145]
    4. PaddlePaddle Call Stacks:
    • 问题解答错误提示是某个tensor为空。建议运行时加上环境变量GLOG_vmodule=operator=4 , GLOG_logtostderr=1看看运行到哪个op,哪个tensor为空。

    pyreader

    Q: 加载模型时pyreader使用
    • 问题描述调用save_inference_model后,load_inference_model加载预测模型的时候用py_reader读取,feeded_var_names为空也无法通过feed输入了。py_reader此刻应该如何声明?

    • 问题解答目前load_inference_model加载进行的模型还不支持py_reader输入。

    Q: 变量取名
    • 问题描述使用py_reader读取数据的时候,怎么给读取的变量指定名字呢?

    • 问题解答参考create_py_reader_by_data