DataFeedDesc_cn.rst 5.9 KB
Newer Older
H
Hao Wang 已提交
1 2 3 4 5
.. _cn_api_fluid_DataFeedDesc:

DataFeedDesc
-------------------------------

6

H
Hao Wang 已提交
7 8
.. py:class:: paddle.fluid.DataFeedDesc(proto_file)

S
swtkiwi 已提交
9 10 11 12
:api_attr: 声明式编程模式(静态图)



13
描述训练数据的格式。输入是一个文件路径名,其内容是protobuf message。
H
Hao Wang 已提交
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

可以参考 :code:`paddle/fluid/framework/data_feed.proto` 查看我们如何定义message

一段典型的message可能是这样的:

.. code-block:: python

    import paddle.fluid as fluid
    f = open("data.proto", "w")
    print >> f, 'name: "MultiSlotDataFeed"'
    print >> f, 'batch_size: 2'
    print >> f, 'multi_slot_desc {'
    print >> f, '    slots {'
    print >> f, '         name: "words"'
    print >> f, '         type: "uint64"'
    print >> f, '         is_dense: false'
    print >> f, '         is_used: true'
    print >> f, '     }'
    print >> f, '     slots {'
    print >> f, '         name: "label"'
    print >> f, '         type: "uint64"'
    print >> f, '         is_dense: false'
    print >> f, '         is_used: true'
    print >> f, '    }'
    print >> f, '}'
    f.close()
    data_feed = fluid.DataFeedDesc('data.proto')

42
用户需要了解DataFeedDesc中每个字段的含义,以便自定义字段的值。例如:
H
Hao Wang 已提交
43 44 45 46 47 48

.. code-block:: python

    import paddle.fluid as fluid
    data_feed = fluid.DataFeedDesc('data.proto')
    data_feed.set_batch_size(128)
49 50
    data_feed.set_dense_slots('words')  # 名为'words'的slot将被设置为密集的
    data_feed.set_use_slots('words')    # 名为'words'的slot将被用于训练
H
Hao Wang 已提交
51

52
    # 最后,可以打印变量详细信息便于排查错误
H
Hao Wang 已提交
53 54 55 56
    print(data_feed.desc())


参数:
57
  - **proto_file** (string) : 包含数据描述的protobuf message的磁盘文件
H
Hao Wang 已提交
58 59 60 61


.. py:method:: set_batch_size(batch_size)

62
该接口用于设置DataFeedDesc中的 :code:`batch_size` 。可以在训练期间调用修改 :code:`batch_size` 。
H
Hao Wang 已提交
63

64
**代码示例**
H
Hao Wang 已提交
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

.. code-block:: python

    import paddle.fluid as fluid
    f = open("data.proto", "w")
    print >> f, 'name: "MultiSlotDataFeed"'
    print >> f, 'batch_size: 2'
    print >> f, 'multi_slot_desc {'
    print >> f, '    slots {'
    print >> f, '         name: "words"'
    print >> f, '         type: "uint64"'
    print >> f, '         is_dense: false'
    print >> f, '         is_used: true'
    print >> f, '     }'
    print >> f, '     slots {'
    print >> f, '         name: "label"'
    print >> f, '         type: "uint64"'
    print >> f, '         is_dense: false'
    print >> f, '         is_used: true'
    print >> f, '    }'
    print >> f, '}'
    f.close()
    data_feed = fluid.DataFeedDesc('data.proto')
    data_feed.set_batch_size(128)

90 91
参数:
  - **batch_size** (int) - 新的批尺寸。
H
Hao Wang 已提交
92

93
返回:无
H
Hao Wang 已提交
94

95
.. py:method:: set_dense_slots(dense_slots_name)
H
Hao Wang 已提交
96

97
将 :code:`dense_slots_name` 指定的slots设置为密集的slot。**注意:默认情况下,所有slots都是稀疏的。**
H
Hao Wang 已提交
98

99
密集slot的特征将被输入一个Tensor,而稀疏slot的特征将被输入一个LoDTensor。
H
Hao Wang 已提交
100

101
**代码示例**
H
Hao Wang 已提交
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

.. code-block:: python

    import paddle.fluid as fluid
    f = open("data.proto", "w")
    print >> f, 'name: "MultiSlotDataFeed"'
    print >> f, 'batch_size: 2'
    print >> f, 'multi_slot_desc {'
    print >> f, '    slots {'
    print >> f, '         name: "words"'
    print >> f, '         type: "uint64"'
    print >> f, '         is_dense: false'
    print >> f, '         is_used: true'
    print >> f, '     }'
    print >> f, '     slots {'
    print >> f, '         name: "label"'
    print >> f, '         type: "uint64"'
    print >> f, '         is_dense: false'
    print >> f, '         is_used: true'
    print >> f, '    }'
    print >> f, '}'
    f.close()
    data_feed = fluid.DataFeedDesc('data.proto')
    data_feed.set_dense_slots(['words'])

127 128
参数:
  - **dense_slots_name** (list(str)) - slot名称的列表,这些slot将被设置为密集的。
H
Hao Wang 已提交
129

130
返回:无
H
Hao Wang 已提交
131 132 133 134 135 136 137

.. py:method:: set_use_slots(use_slots_name)


设置一个特定的slot是否用于训练。一个数据集包含了很多特征,通过这个函数可以选择哪些特征将用于指定的模型。

参数:
138
  - **use_slots_name** (list) : 将在训练中使用的slot名列表,类型为list,其中每个元素为一个字符串
H
Hao Wang 已提交
139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167

**代码示例:**

.. code-block:: python
    
    import paddle.fluid as fluid
    f = open("data.proto", "w")
    print >> f, 'name: "MultiSlotDataFeed"'
    print >> f, 'batch_size: 2'
    print >> f, 'multi_slot_desc {'
    print >> f, '    slots {'
    print >> f, '         name: "words"'
    print >> f, '         type: "uint64"'
    print >> f, '         is_dense: false'
    print >> f, '         is_used: true'
    print >> f, '     }'
    print >> f, '     slots {'
    print >> f, '         name: "label"'
    print >> f, '         type: "uint64"'
    print >> f, '         is_dense: false'
    print >> f, '         is_used: true'
    print >> f, '    }'
    print >> f, '}'
    f.close()
    data_feed = fluid.DataFeedDesc('data.proto')
    data_feed.set_use_slots(['words'])

.. note::

168
  默认值是不使用所有slot
H
Hao Wang 已提交
169 170 171 172


.. py:method:: desc()

173
返回此DataFeedDesc的protobuf message
H
Hao Wang 已提交
174

175
返回:一个protobuf message字符串
H
Hao Wang 已提交
176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207

**代码示例:**

.. code-block:: python
    
    import paddle.fluid as fluid
    f = open("data.proto", "w")
    print >> f, 'name: "MultiSlotDataFeed"'
    print >> f, 'batch_size: 2'
    print >> f, 'multi_slot_desc {'
    print >> f, '    slots {'
    print >> f, '         name: "words"'
    print >> f, '         type: "uint64"'
    print >> f, '         is_dense: false'
    print >> f, '         is_used: true'
    print >> f, '     }'
    print >> f, '     slots {'
    print >> f, '         name: "label"'
    print >> f, '         type: "uint64"'
    print >> f, '         is_dense: false'
    print >> f, '         is_used: true'
    print >> f, '    }'
    print >> f, '}'
    f.close()
    data_feed = fluid.DataFeedDesc('data.proto')
    print(data_feed.desc())