|
| 1 | + |
| 2 | +.. _cn_api_fluid_Program: |
| 3 | + |
| 4 | +Program |
| 5 | +>>>>>>>>>>>> |
| 6 | + |
| 7 | +class paddle.fluid.Program |
| 8 | +"""""""""""""""""""""""""""""""""""""""""" |
| 9 | + |
| 10 | +创建python program, 在paddleFluid内部会被转换为ProgramDesc描述语言,是被用来创建c++ Program。Program像容器一样也是一种独立的程序语言。Program包括至少一个块(Block),控制流比如conditional_block包括while_op,该Program将会含有嵌套块(nested block)。详情请参阅framework.proto。 |
| 11 | + |
| 12 | +注意:默认情况下,paddleFluid内部默认含有default_startup_program和default_main_program,它们将共享参数。default_startup_program只运行一次来初始化参数,default_main_program在每个mini batch中运行并调整权重。 |
| 13 | + |
| 14 | +返回: empty program |
| 15 | + |
| 16 | +**代码示例** |
| 17 | + |
| 18 | +.. code-block:: python |
| 19 | +
|
| 20 | + main_program = fluid.Program() |
| 21 | + startup_program = fluid.Program() |
| 22 | + with fluid.program_guard(main_program=main_program, startup_program=startup_program): |
| 23 | + fluid.layers.data(name="x", shape=[-1, 784], dtype='float32') |
| 24 | + fluid.layers.data(name="y", shape=[-1, 1], dtype='int32') |
| 25 | + fluid.layers.fc(name="fc", shape=[10], dtype='float32', act="relu") |
| 26 | +
|
| 27 | +op_role |
| 28 | +"""""""""""""""""""""""""""""""""""""""""" |
| 29 | +operator的角色,值只能是枚举变量{Forward, Backward, Optimize}。 |
| 30 | + |
| 31 | +注意:这是一个底层API。它仅用于ParallelExecutor复制或调度operator到设备。 |
| 32 | + |
| 33 | +例如,Forward operator应该在每个设备上执行。Backward operator在每个设备上执行,并将后向传播的参数梯度(使用op_role_var获得该变量)合并到一个设备上。Optimize operator只在一个设备上执行,并向其他设备广播新的参数, |
| 34 | + |
| 35 | +set_op_role |
| 36 | +"""""""""""""""""""""""""""""""""""""""""" |
| 37 | +operator的角色,值只能是枚举变量{Forward, Backward, Optimize}。 |
| 38 | + |
| 39 | +注意:这是一个底层API。它仅用于ParallelExecutor复制或调度operator到设备上执行。 |
| 40 | + |
| 41 | +例如,Forward operator应该在每个设备上执行。Backward operato应该在每个设备上执行,并将后向传播的参数梯度(使用op_role_var获得该变量)合并到一个设备上。Optimize operator只在一个设备上执行,并向其他设备广播新的参数 |
| 42 | + |
| 43 | +op_role_var |
| 44 | +"""""""""""""""""""""""""""""""""""""""""" |
| 45 | +op_role的辅助变量。 |
| 46 | + |
| 47 | +参考:Program.op_role 文档。 |
| 48 | + |
| 49 | +注意:这是一个底层API,用户不应该直接使用它。 |
| 50 | + |
| 51 | +set_op_role_var |
| 52 | +"""""""""""""""""""""""""""""""""""""""""" |
| 53 | +op_role的辅助变量。 |
| 54 | + |
| 55 | +参考:Program.op_role 文档。 |
| 56 | + |
| 57 | +注意:这是一个底层API。用户不应该直接使用它。 |
| 58 | + |
| 59 | +to_string(throw_on_error, with_details=False) |
| 60 | +"""""""""""""""""""""""""""""""""""""""""" |
| 61 | + |
| 62 | +用于debug |
| 63 | + |
| 64 | +参数: |
| 65 | + |
| 66 | + - throw_on_error(bool): 没有设置任何必需的字段时,抛出值错误。 |
| 67 | + - with_details(bool): 值为true时,打印更多关于变量和参数的信息,如trainable, optimize_attr等 |
| 68 | + |
| 69 | +返回: |
| 70 | + |
| 71 | +(str): debug 字符串 |
| 72 | + |
| 73 | +抛出异常: |
| 74 | + |
| 75 | +ValueError:当throw_on_error = true时,但没有设置任何必需的字段时,抛出ValueError。 |
| 76 | + |
| 77 | +clone(for_test=False) |
| 78 | +"""""""""""""""""""""""""""""""""""""""""" |
| 79 | +创建一个新的、相同的Program。 |
| 80 | + |
| 81 | +有些operator,在训练和测试之间的行为是不同的,比如batch_norm。它们有一个属性is_test来控制行为。当for_test=True时,此方法将把它们的is_test属性更改为True。 |
| 82 | + |
| 83 | +- 克隆Program,该Program用于训练时,将for_test设置为False。 |
| 84 | +- 克隆Program,该Program用于测试时,将for_test设置为True。 |
| 85 | + |
| 86 | +注意:此API不会删除任何操作符。请在backward和optimization之前使用clone(for_test=True)。 |
| 87 | + |
| 88 | +**代码示例** |
| 89 | + |
| 90 | +.. code-block:: python |
| 91 | +
|
| 92 | + test_program = fluid.default_main_program().clone(for_test=True) |
| 93 | + optimizer = fluid.optimizer.Momentum(learning_rate=0.01, momentum=0.9) |
| 94 | + optimizer.minimize() |
| 95 | +
|
| 96 | +参数:for_test (bool) – 取值为True时,clone方法内部会把operator的属性is_test设置为true. |
| 97 | + |
| 98 | +返回:一个新的、相同的Program. |
| 99 | + |
| 100 | +返回类型:Program |
| 101 | + |
| 102 | +**代码示例** |
| 103 | + |
| 104 | +1. 克隆一个Program,示例代码如下: |
| 105 | + |
| 106 | +.. code-block:: python |
| 107 | +
|
| 108 | + train_program = fluid.Program() |
| 109 | + startup_program = fluid.Program() |
| 110 | + with fluid.program_guard(train_program, startup_program): |
| 111 | + img = fluid.layers.data(name='image', shape=[784]) |
| 112 | + hidden = fluid.layers.fc(input=img, size=200, act='relu') |
| 113 | + hidden = fluid.layers.dropout(hidden, dropout_prob=0.5) |
| 114 | + loss = fluid.layers.cross_entropy( |
| 115 | + input=fluid.layers.fc(hidden, size=10, act='softmax'), |
| 116 | + label=fluid.layers.data(name='label', shape=[1], dtype='int64')) |
| 117 | + test_program = train_program.clone(for_test=True) |
| 118 | + sgd = fluid.optimizer.SGD(learning_rate=1e-3) |
| 119 | + with fluid.program_guard(train_program, startup_program): |
| 120 | + sgd.minimize(loss) |
| 121 | + |
| 122 | +2.如果分别运行train Program 和 test Program,则可以不使用clone。 |
| 123 | + |
| 124 | +.. code-block:: python |
| 125 | +
|
| 126 | + import paddle.fluid as fluid |
| 127 | +
|
| 128 | + def network(is_test): |
| 129 | + img = fluid.layers.data(name='image', shape=[784]) |
| 130 | + hidden = fluid.layers.fc(input=img, size=200, act='relu') |
| 131 | + hidden = fluid.layers.dropout(hidden, dropout_prob=0.5, is_test=is_test) |
| 132 | + loss = fluid.layers.cross_entropy( |
| 133 | + input=fluid.layers.fc(hidden, size=10, act='softmax'), |
| 134 | + label=fluid.layers.data(name='label', shape=[1], dtype='int64')) |
| 135 | + return loss |
| 136 | +
|
| 137 | + train_program = fluid.Program() |
| 138 | + startup_program = fluid.Program() |
| 139 | + test_program = fluid.Program() |
| 140 | +
|
| 141 | + with fluid.program_guard(train_program, startup_program): |
| 142 | + with fluid.unique_name.guard(): |
| 143 | + loss = network(is_test=False) |
| 144 | + sgd = fluid.optimizer.SGD(learning_rate=1e-3) |
| 145 | + sgd.minimize(loss) |
| 146 | +
|
| 147 | + # the test startup program is not used. |
| 148 | + with fluid.program_guard(test_program, fluid.Program()): |
| 149 | + with fluid.unique_name.guard(): |
| 150 | + loss = network(is_test=True) |
| 151 | +
|
| 152 | +上边两个代码片段生成的Program是一样的。 |
| 153 | + |
| 154 | +static parse_from_string(binary_str) |
| 155 | +"""""""""""""""""""""""""""""""""""""""""" |
| 156 | +反序列化protobuf,转换成program |
| 157 | + |
| 158 | +注意:在序列化和反序列化之后,所有关于参数的信息都会丢失。 |
| 159 | + |
| 160 | +参数: binary_str_type (str) – prootbuf二进制字符串 |
| 161 | + |
| 162 | +返回: 反序列化后的ProgramDesc |
| 163 | + |
| 164 | +返回类型:Program |
| 165 | + |
| 166 | +num_blocks |
| 167 | +"""""""""""""""""""""""""""""""""""""""""" |
| 168 | +该program中的block的个数 |
| 169 | + |
| 170 | +random_seed |
| 171 | +"""""""""""""""""""""""""""""""""""""""""" |
| 172 | + |
| 173 | +程序中随机运算符的默认随机种子。0意味着从随机设备中获取随机种子。 |
| 174 | + |
| 175 | +注意:必须在operator被添加之前设置。 |
| 176 | + |
| 177 | +global_block() |
| 178 | +"""""""""""""""""""""""""""""""""""""""""" |
| 179 | +获取该program的第一个block。 |
| 180 | + |
| 181 | +block(index) |
| 182 | +"""""""""""""""""""""""""""""""""""""""""" |
| 183 | +返回该program中 ,index指定的block。index类型为int |
| 184 | + |
| 185 | +返回:index对应的block |
| 186 | + |
| 187 | +返回类型:Block |
| 188 | + |
| 189 | +current_block() |
| 190 | +"""""""""""""""""""""""""""""""""""""""""" |
| 191 | +获取当前block。当前block是用来添加operators。 |
| 192 | + |
| 193 | +list_vars() |
| 194 | +"""""""""""""""""""""""""""""""""""""""""" |
| 195 | +获取当前program中所有变量。返回值是一个可迭代对象(iterable object)。 |
| 196 | + |
| 197 | +返回:generator 会yield每个Program中的变量 |
| 198 | + |
| 199 | +返回类型:iterable |
| 200 | + |
| 201 | + |
| 202 | +.. _cn_api_fluid_name_scope: |
| 203 | + |
| 204 | +name_scope |
| 205 | +>>>>>>>>>>>> |
| 206 | + |
| 207 | +paddle.fluid.name_scope(*args, **kwds) |
| 208 | +"""""""""""""""""""""""""""""""""""""""""" |
| 209 | +
|
| 210 | +为operators生成层次名称前缀 |
| 211 | + |
| 212 | +注意: 这个函数只能用于调试和可视化。不要将其用于分析,比如graph/program转换。 |
| 213 | + |
| 214 | +.. _cn_api_fluid_global_scope: |
| 215 | + |
| 216 | +global_scope |
| 217 | +>>>>>>>>>>>> |
| 218 | + |
| 219 | +paddle.fluid.global_scope() |
| 220 | +"""""""""""""""""""""""""""""""""""""""""" |
| 221 | + |
| 222 | +获取全局/默认作用域实例。很多api使用默认global_scope,例如Executor.run |
| 223 | + |
| 224 | +返回:全局/默认作用域实例 |
| 225 | + |
| 226 | +返回类型:Scope |
| 227 | + |
| 228 | +.. _cn_api_fluid_scope_guard: |
| 229 | + |
| 230 | +scope_guard |
| 231 | +>>>>>>>>>>>> |
| 232 | + |
| 233 | +paddle.fluid.scope_guard(*args, **kwds)() |
| 234 | +"""""""""""""""""""""""""""""""""""""""""" |
| 235 | +
|
| 236 | +修改全局/默认作用scope, 运行时中的所有变量都将分配给新的scope。 |
| 237 | + |
| 238 | +参数:scope -新的全局/默认 scope。 |
| 239 | + |
| 240 | +**代码示例** |
| 241 | + |
| 242 | +.. code-block:: python |
| 243 | +
|
| 244 | + import paddle.fluid as fluid |
| 245 | + |
| 246 | + new_scope = fluid.Scope() |
| 247 | + with fluid.scope_guard(new_scope): |
| 248 | + ... |
| 249 | +
|
| 250 | +
|
| 251 | +.. _cn_api_fluid_memory_optimize: |
| 252 | + |
| 253 | +memory_optimize |
| 254 | +>>>>>>>>>>>> |
| 255 | + |
| 256 | +paddle.fluid.memory_optimize(input_program, skip_opt_set=None, print_log=False, level=0, skip_grads=False) |
| 257 | +"""""""""""""""""""""""""""""""""""""""""" |
| 258 | + |
| 259 | +通过重用var内存来优化内存。 |
| 260 | + |
| 261 | +注意:它不支持block中嵌套子block。 |
| 262 | + |
| 263 | +参数: |
| 264 | + |
| 265 | + - input_program (str) – 输入Program。 |
| 266 | + - skip_opt_set (set) – set中的vars将不被内存优化。 |
| 267 | + - print_log (bool) – 是否打印debug日志。 |
| 268 | + - level (int) 如果 level=0 并且shape是完全相等,则重用。 |
| 269 | + |
| 270 | +返回: None |
| 271 | + |
| 272 | + |
| 273 | +.. _cn_api_fluid_DistributeTranspilerConfig: |
| 274 | + |
| 275 | +DistributeTranspilerConfig |
| 276 | +>>>>>>>>>>>> |
| 277 | + |
| 278 | +class paddle.fluid.DistributeTranspilerConfig |
| 279 | +"""""""""""""""""""""""""""""""""""""""""" |
| 280 | + |
| 281 | +slice_var_up (bool): 使用Tensor切片保存, 默认为True |
| 282 | + |
| 283 | +split_method (PSDispatcher): 可使用 RoundRobin 或者 HashName |
| 284 | + |
| 285 | +注意: 尝试选择最佳方法来达到负载均衡。 |
| 286 | + |
| 287 | +min_block_size (int): 最小数据块的大小 |
| 288 | + |
| 289 | +注意: 根据:https://github.com/PaddlePaddle/Paddle/issues/8638#issuecomment-369912156, 当数据块大小超过2MB时,我们可以有效地使用带宽。如果你想更改它,请详细查看slice_variable函数。 |
| 290 | + |
| 291 | +.. _cn_api_fluid_LoDTensor: |
| 292 | + |
| 293 | +LoDTensor |
| 294 | +>>>>>>>>>>>> |
| 295 | + |
| 296 | +class paddle.fluid.LoDTensor |
| 297 | +"""""""""""""""""""""""""""""""""""""""""" |
| 298 | + |
| 299 | +LoDTensor是一个具有LoD信息的张量(Tensor) |
| 300 | + |
| 301 | +np.array(lod_tensor)可以将LoDTensor转换为numpy array。lod_tensor.lod()可以获得LoD信息。 |
| 302 | +LoD是多层序列(Level of Details)的缩写,通常用于不同长度的序列。如果您不需要了解LoD信息,可以跳过下面的注解。 |
| 303 | + |
| 304 | +举例: |
| 305 | + |
| 306 | +X 为 LoDTensor,它包含两个序列。第一个长度是2,第二个长度是3。 |
| 307 | + |
| 308 | +从Lod中可以计算出X的第一维度为5, 因为5=2+3, 说明X中有5个序列。在X中的每个序列中的每个元素有2列,因此X的shape为[5,2]。 |
| 309 | + |
| 310 | +:: |
| 311 | + |
| 312 | + x.lod = [[2, 3]] x.data = [[1, 2], [3, 4], // seq 1 |
| 313 | + |
| 314 | + [5, 6], [7, 8], [9, 10]] // seq 2 |
| 315 | + |
| 316 | + x.shape = [5, 2] |
| 317 | + |
| 318 | + |
| 319 | +LoD可以有多个level(例如,一个段落可以有多个句子,一个句子可以有多个单词)。下面的例子中,Y为LoDTensor ,lod_level为2。表示有2个序列,第一个序列的长度是2(有2个子序列),其中第二个序列的长度是1。第一序列的两个子序列长度分别为2和2。第二个序列的子序列的长度是3。 |
| 320 | + |
| 321 | + |
| 322 | +:: |
| 323 | + |
| 324 | + y.lod = [[2 1], [2 2 3]] y.shape = [2+2+3, ...] |
| 325 | + |
| 326 | + |
| 327 | +.. note:: |
| 328 | + |
| 329 | + 在上面的描述中,LoD是基于长度的。在paddle内部实现中,lod是基于偏移的。因此,在内部,y.lod表示为[[0,2,3],[0,2,4,7]](基于长度的Lod表示为为[[2-0,3-2],[2-0,4-2,7-4]])。 |
| 330 | + |
| 331 | + 可以将LoD理解为recursive_sequence_length(递归序列长度)。此时,LoD必须是基于长度的。由于历史原因。当LoD在API中被称为lod时,它可能是基于偏移的。用户应该注意。 |
| 332 | + |
| 333 | + |
| 334 | +:: |
| 335 | + |
| 336 | + has_valid_recursive_sequence_lengths(self: paddle.fluid.core.LoDTensor) → bool |
| 337 | + |
| 338 | + |
| 339 | +:: |
| 340 | + |
| 341 | + lod(self: paddle.fluid.core.LoDTensor) → List[List[int]] |
| 342 | + |
| 343 | + |
| 344 | +:: |
| 345 | + |
| 346 | + recursive_sequence_lengths(self: paddle.fluid.core.LoDTensor) → List[List[int]] |
| 347 | + |
| 348 | + |
| 349 | +:: |
| 350 | + |
| 351 | + set_lod(self: paddle.fluid.core.LoDTensor, arg0: List[List[int]]) → None |
| 352 | + |
| 353 | + |
| 354 | +:: |
| 355 | + |
| 356 | + set_recursive_sequence_lengths(self: paddle.fluid.core.LoDTensor, arg0: List[List[int]]) → None |
| 357 | + |
| 358 | + |
| 359 | + |
| 360 | + |
| 361 | + |
| 362 | +.. _cn_api_fluid_WeightNormParamAttr: |
| 363 | + |
| 364 | +WeightNormParamAttr |
| 365 | +>>>>>>>>>>>> |
| 366 | + |
| 367 | +class paddle.fluid.WeightNormParamAttr(dim=None, name=None, initializer=None, learning_rate=1.0, regularizer=None, trainable=True, gradient_clip=None, do_model_average=False) |
| 368 | +"""""""""""""""""""""""""""""""""""""""""" |
| 369 | + |
| 370 | +权重归一化。权重归一化是将权重向量的长度与其方向解耦。`Weight Normalization: A Simple Reparameterization to Accelerate Training of Deep Neural Networks <https://arxiv.org/pdf/1602.07868.pdf>`_ 这篇paper中讨论了权重归一化的实现 |
| 371 | + |
| 372 | +参数: |
| 373 | + |
| 374 | + - dim(list) : 参数的名称。默认None。 |
| 375 | + - name (str): 参数的名称。默认None。 |
| 376 | + - initializer(initializer): 初始化参数的方法。默认None。 |
| 377 | + - learning_rate (float): 学习率。优化时学习速率global_lr∗parameter_lr∗scheduler_factor。默认1.0。 |
| 378 | + - regularizer (WeightDecayRegularizer): 正则化因子。默认None。 |
| 379 | + - trainable(bool) : 参数是否可训练。默认True。 |
| 380 | + - gradient_clip (BaseGradientClipAttr): 梯度下降裁剪(Gradient Clipping)的方法。默认None。 |
| 381 | + - do_model_average (bool): 参数是否应该model average。默认False。 |
| 382 | + |
| 383 | +返回: empty program |
| 384 | + |
| 385 | +**代码示例** |
| 386 | + |
| 387 | +.. code-block:: python |
| 388 | +
|
| 389 | + data = fluid.layers.data(name="data", shape=[3, 32, 32], dtype="float32") |
| 390 | + fc = fluid.layers.fc(input=data, |
| 391 | + size=1000, |
| 392 | + param_attr=WeightNormParamAttr( |
| 393 | + dim=None, |
| 394 | + name='weight_norm_param')) |
| 395 | +
|
0 commit comments