yangyang12138

导航

paddle(三)

一、数据源

InMemoryDataset,QueueDataset

加载数据并在训练前缓冲数据。此类由DatasetFactory创建。

import paddle.fluid as fluid
dataset = fluid.DatasetFactory().create_dataset("InMemoryDataset")
filelist = ["a.txt", "b.txt"]
dataset.set_filelist(filelist)
dataset.load_into_memory()
View Code

PyReader

在python中为数据输入创建一个reader对象。将使用python线程预取数据,并将其异步插入队列。当调用Executor.run时,将自动提取队列中的数据。

feed_list (list(Variable)|tuple(Variable)) - feed变量列表,由 fluid.layers.data() 创建。
capacity (int) - PyReader对象内部维护队列的容量大小。单位是batch数量。若reader读取速度较快,建议设置较大的capacity值。
use_double_buffer (bool) - 是否使用 double_buffer_reader 。若use_double_buffer=True,PyReader会异步地预读取下一个batch的数据,可加速数据读取过程,但同时会占用少量的CPU/GPU存储,即一个batch输入数据的存储空间。
iterable (bool) - 所创建的DataLoader对象是否可迭代。
return_list (bool) - 每个设备上的数据是否以list形式返回。仅在iterable = True模式下有效。若return_list = False,每个设备上的返回数据均是str -> LoDTensor的映射表,其中映射表的key是每个输入变量的名称。若return_list = True,则每个设备上的返回数据均是list(LoDTensor)。推荐在静态图模式下使用return_list = False,在动态图模式下使用return_list = True。

import paddle
import paddle.fluid as fluid
import numpy as np

BATCH_SIZE = 10

def generator():
  for i in range(5):
     yield np.random.uniform(low=0, high=255, size=[784, 784]),

image = fluid.layers.data(name='image', shape=[784, 784], dtype='float32')
reader = fluid.io.PyReader(feed_list=[image], capacity=4, iterable=False)
reader.decorate_sample_list_generator(
  paddle.batch(generator, batch_size=BATCH_SIZE))

executor = fluid.Executor(fluid.CPUPlace())
executor.run(fluid.default_startup_program())
for i in range(3):
  reader.start()
  while True:
      try:
          executor.run(feed=None)
      except fluid.core.EOFException:
          reader.reset()
          break
View Code

数据加载通过paddle.fluid.io下的buffered,cache,chain用于批量导入数据

paddle.fluid.io下的first,map_readers,xmap_readers 用于变换数据。

二、神经网络参数

fluid.ParamAttr初始化神经网络的一个参数

BilinearInitializer:该接口为参数初始化函数,用于转置卷积函数中,对输入进行上采样。用户通过任意整型因子放大shape为(B,C,H,W)的特征图。
ConstantInitializer:该接口为常量初始化函数,用于权重初始化,通过输入的value值初始化输入变量;
force_init_on_cpu:
init_on_cpu
NormalInitializer:随机正态(高斯)分布初始化函数
NumpyArrayInitializer:该OP使用Numpy型数组来初始化参数变量。
UniformInitializer随机均匀分布初始化器
XavierInitializer

import paddle.fluid as fluid
import math
factor = 2
C = 2
H = W = 32
w_attr = fluid.ParamAttr(
    learning_rate=0.,
    regularizer=fluid.regularizer.L2Decay(0.),
    initializer=fluid.initializer.BilinearInitializer())
x = fluid.layers.data(name="data", shape=[4, H, W],
                      dtype="float32")
conv_up = fluid.layers.conv2d_transpose(
    input=x,
    num_filters=C,
    output_size=None,
    filter_size=2 * factor - factor % 2,
    padding=int(math.ceil((factor - 1) / 2.)),
    stride=factor,
    groups=C,
    param_attr=w_attr,
    bias_attr=False)
View Code

三、作用域

paddle.fluid.executor.scope_guard(scope)

该接口通过 python 的 with 语句切换作用域(scope)。 作用域记录了变量名和变量 ( Variable ) 之间的映射关系,类似于编程语言中的大括号。 如果未调用此接口,所有的变量和变量名都会被记录在默认的全局作用域中。 当用户需要创建同名的变量时,如果不希望同名的变量映射关系被覆盖,则需要通过该接口切换作用域。 通过 with 语句切换后,with 语句块中所有创建的变量都将分配给新的作用域。

global_scope:获取全局/默认作用域实例。很多API使用默认 global_scope 

import paddle.fluid as fluid
import numpy

new_scope = fluid.Scope()
with fluid.scope_guard(new_scope):
     fluid.global_scope().var("data").get_tensor().set(numpy.ones((1, 2)), fluid.CPUPlace())
data = numpy.array(new_scope.find_var("data").get_tensor())
print(data) 
View Code

四、动态图机制

PaddlePaddle的DyGraph模式是一种动态的图执行机制,可以立即执行结果,无需构建整个图。同时,和以往静态的执行计算图不同,DyGraph模式下您的所有操作可以立即获得执行结果,而不必等待所构建的计算图全部执行完成,这样可以让您更加直观地构建PaddlePaddle下的深度学习任务,以及进行模型的调试,同时还减少了大量用于构建静态计算图的代码,使得您编写、调试网络的过程变得更加便捷。

PaddlePaddle DyGraph是一个更加灵活易用的模式,可提供:

更加灵活便捷的代码组织结构:使用python的执行控制流程和面向对象的模型设计
更加便捷的调试功能:直接使用python的打印方法即时打印所需要的结果,从而检查正在运行的模型结果便于测试更改
和静态执行图通用的模型代码:同样的模型代码可以使用更加便捷的DyGraph调试,执行,同时也支持使用原有的静态图模式执行

fluid.dygraph下包括

Conv2D,Conv3D,Conv2DTranspose,Conv3DTranspose,FC,Pool2D

load_dygraph,save_graph

Layer对象用于存储一个动态图层

import paddle.fluid as fluid
import numpy as np

with fluid.dygraph.guard():
    value = np.arange(26).reshape(2, 13).astype("float32")
    a = fluid.dygraph.to_variable(value)
    linear = fluid.Linear(13, 5, dtype="float32")
    adam = fluid.optimizer.Adam(learning_rate=0.01,
                                parameter_list=linear.parameters())
    out = linear(a)
    out.backward()
    adam.minimize(out)
    linear.clear_gradients()

import paddle.fluid as fluid
with fluid.dygraph.guard():
    emb = fluid.dygraph.Embedding([10, 10])
    state_dict = emb.state_dict()
    fluid.save_dygraph(state_dict, "paddle_dy")
View Code

create_parameter,full_name,sublayers,named_parameters,add_sublayer

五、模型

glu

门控线性单元 Gated Linear Units (GLU) 由 split ,sigmoid 和 elementwise_mul 组成。特定的,沿着给定维度将输入拆分成两个大小相同的部分,aa 和 bb ,按如下方式计算:

GLU(a,b)=aσ(b)

scaled_dot_product_attention

该接口实现了的基于点积(并进行了缩放)的多头注意力(Multi-Head Attention)机制。attention可以表述为将一个查询(query)和一组键值对(key-value pair)映射为一个输出;Multi-Head Attention则是使用多路进行attention,而且对attention的输入进行了线性变换。公式如下:

 

 


 

 

posted on 2020-03-01 02:58  杨杨09265  阅读(473)  评论(0编辑  收藏  举报