类似于kears的组网过程,需要搭建5个步骤
1、model = keras.Sequential() #命名组件网络类型
2、model.add(layers.Dense(3, input_dim=4, activation='softmax')) #组件一层的多分类,指定输入和输出的维度,以及采用激活的函数 3、model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc'] ) # 进行模型编译,指定选用的优化器,用 categorical_crossentropy 来计算softmax交叉熵 4、history = model.fit(x, y, epochs=500) #对模型进行训练,x,y 是训练集的对应数据
模型中可学习参数的设置方法
在模型设置中,诸如像网络权重、偏置等可学习参数在网络设置的整个周期中存在,会接受优化算法的更新,在Fluid中以Variable中的子类Parameter表示,在Fluid中以fluid.layers.create_parameter来创建可学习参数:
w=fluid.layers.create_parameter(name="w",shape=[1],dtype="int32")
1
在神经网络的搭建过程中,由于Fluid对大部分常见的神经网络提供了封装,所以一般不需要使用者再去创建网络中的可学习参数。比如下面的例子,代码会直接为全连接层创建连接权值(w)和偏置(bias) 两个可学习参数,无需显式调用Parameter相关接口来创建。
import paddle.fluid as fluid
y=fluid.layers.fc(input=x,size=128,bias_attr=True)
#bias_attr参数设置为True,就默认会创建一个偏置
2、Tensor的基本设置
在fluid
中使用fluid.layers.data
来接收输入数据,fluid.layers.data
需要提供输入Tensor的形状信息,当遇到无法确定的维度时,相应的维度指定为None。
整个神经网络的输入数据是一个特殊的Tensor,在这个Tensor中,一些维度的大小在定义模型时无法直接确定(通常包括:batchsize,如果mini-batch之间的数据可变,也会包括图片的宽度和高度等),需要在定义模型时进行占位。个人理解,fluid.layers.data就是建立了一个空的容器,之后进行数据赋值就可以参与神经网络的各种计算。
例子:
import paddle.fluid as fluid
#定义x的维度为[3,None],其实我们只能确定x的第一维度为3,第二维度未知,要在程序执行中才能确定
x=fluid.layer.data(name="x",shape=[3,None],dtype='int64')
#batch_size无需显示指定,框架会自动补全第0维为batch size,并在运行时填充正确的数值
a=fluid.layers.data(name="a",shape=[3,4],dtype='int64')
#若图片的宽度和高度在运行时可变,将宽度和高度定义为None。
#shape的三个维度含义分别是:channel、图片的宽度、图片的高度
b=fluid.layers.data(name="image",shape=[3,None,None],dtype="float32")
3、常量Tensor的设置
Fluid中使用fluid.layers.fill_constant来实现常量Tensor,用户可以指定Tensor的形状,数值类型和常量值。
import paddle.fluid as fluid
data=fluid.layers.fill_constant(shape=[1],value=0,dtype='int64'
二、数据传入 有2个方式,分别是同步feed和异步py_reader ,一般用异步方式
异步py_reader接口方式
用户需要先使用fluid.layers.py_reader配置数据输入层,然后使用py_reader的decorate_paddle_reader或decorate_tensor_provider方法配置数据源,再通过fluid.layers.read_file读取数据。
数据传入与模型训练/预测过程是异步进行的,效率较高。
三、数据操作
在Fluid中,所有对数据的操作都由Operator表示,您可以使用内置指令来描述他们的神经网络。
为了便于用户使用,在Python端,Fluid中的Operator被一步封装入paddle.fluid.layers,paddle.fluid.nets 等模块。
这是因为一些常见的对Tensor的操作可能是由更多基础操作构成,为了提高使用的便利性,框架内部对基础Operator 进行了一些封装,包括创建 Operator依赖可学习参数,可学习参数的初始化细节等,减少用户重复开发的成本。
定义执行器的操作
#定义一个Exector
cpu=fluid.core.CPUPlace()#定义运算场所,这里选择在CPU下训练
exe=fluid.Executor(cpu)#创建执行器
exe.run(fluid.default_satrtup_program())#网络参数初始化
2.综合案例-定义一个加法器
#导入依赖库
import paddle.fluid as fluid
import paddle
import numpy as np
#设置a,b两个容器,用来存储加法输入的变量
a=fluid.layers.data(name='a',shape=[1],dtype='float32')
b=fluid.layers.data(name='b',shape=[1],dtype='float32')
#定义计算过程
result=fluid.layers.sum([a,b])
#定义执行器
cpu=fluid.core.CPUPlace()#定义运算场所,这里选择在CPU下进行训练
exe=fluid.Executor(cpu)#创建执行器
exe.run(fluid.default_startup_program())#网络参数初始化
#准备数据
data_1=float(input("Please enter an num: a="))
data_2=float(input("Please enter an num: a="))
x=np.array([data_1])
y=np.array([data_2])
#执行计算
outs=exe.run(feed={'a':x,'b':y},fetch_list=[result.name])#fetch_list控制输出的结果,可以加入其他变量输出
#验证结果
print("%d+%d=%d" %(data_1,data_2,outs[0][0]