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

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

6 7
**注意:该API仅支持【静态图】模式**

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

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

可以参考 :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')

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

.. code-block:: python

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

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


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


.. py:method:: set_batch_size(batch_size)

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

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

.. 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)

87 88
参数:
  - **batch_size** (int) - 新的批尺寸。
H
Hao Wang 已提交
89

90
返回:无
H
Hao Wang 已提交
91

92
.. py:method:: set_dense_slots(dense_slots_name)
H
Hao Wang 已提交
93

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

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

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

.. 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'])

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

127
返回:无
H
Hao Wang 已提交
128 129 130 131 132 133 134

.. py:method:: set_use_slots(use_slots_name)


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

参数:
135
  - **use_slots_name** (list) : 将在训练中使用的slot名列表,类型为list,其中每个元素为一个字符串
H
Hao Wang 已提交
136 137 138 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

**代码示例:**

.. 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::

165
  默认值是不使用所有slot
H
Hao Wang 已提交
166 167 168 169


.. py:method:: desc()

170
返回此DataFeedDesc的protobuf message
H
Hao Wang 已提交
171

172
返回:一个protobuf message字符串
H
Hao Wang 已提交
173 174 175 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

**代码示例:**

.. 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())