0. 网络结构如图:
该网络有3层:隐藏层1,隐藏层2和输出层,两个隐藏层都有100各节点
现在使用该网络来回归y=2*x+1这样一个函数
1. 定义网络结构
from paddle import fluid # 使用2.0.0a0 版本的paddlepaddle
import numpy as np
# pp(paddlepaddle)中搭建网络,定义的网络结构、损失函数和优化器等,都会被自动默认加入到主程序(default_main_program),所以当我们定义好网络结构后(定义损失函数和优化器之前),就将仅包含了网络结构的主程序复制一份给infer_program ,用infer_program 来进行模型的推理(因为推理是不需要损失函数和优化器的)
## 网络结构
x = fluid.data(name="x", shape=[None, 1], dtype="float32") # 输入层不参与计算,仅定义数据
hidden = fluid.layers.fc(input=x, size=100, act="relu")
hidden = fluid.layers.fc(input=hidden, size=100, act="relu")
net = fluid.layers.fc(input=hidden, size=1, act=None)
infer_program = fluid.default_main_program().clone(for_test=True) # 复制网络,用来进行预测
2. 损失函数
# 损失函数
y=fluid.data(name='y',shape=[None,1],dtype="float32") # 输入层,虽然是label,也是数据
cost=fluid.layers.square_error_cost(input=net,label=y) # 计算net变量和y的loss
avg_cost=fluid.layers.mean(cost) # 计算batch的均值loss
3. 优化器
# 优化器
optimizer=fluid.optimizer.SGDOptimizer(learning_rate=0.01)
opts=optimizer.minimize(avg_cost) # minize:降低; 贬低; 降低avg_cost的值就是优化?
4. 生成数据
# y=x*2+1
x_data=np.array([[1.0],[2.0],[3.0],[4.0],[5.0]]).astype("float32")
y_data=np.array([[3.0],[5.0],[7.0],[9.0],[11.0]]).astype("float32")
5. 训练
# 创建执行器
place=fluid.CPUPlace() # 设备描述符,Tensor和模型将被自动分配在该设备上
exe=fluid.Executor(place) # 传入执行器中
exe.run(fluid.default_startup_program()) # 初始化参数
# 训练
for pass_id in range(100):
train_cost=exe.run(fluid.default_main_program(),feed={x.name:x_data,y.name:y_data},fetch_list=[avg_cost])
# x.name是名字为"x"的节点,给该节点喂x_data这个数据
print("Pass:%d,Cost:%0.5f"%(pass_id,train_cost[0]))
# run(program=None, feed=None, fetch_list=None)
# - program:被执行的Program
# - feed: 该参数表示模型的输入变量。单卡训练feed为dict类型,多卡训练feed可以是dict或者list类型变量
# - fetch_list:该参数表示模型运行之后需要返回的变量
# (个人理解为变量的值,训练时为“avg_cost”意为返回avg_cost的值,下方测试时为"net",意为输出net的值,也就是模型的输出量)
6. 测试
test_data=np.array([[6.0]]).astype("float32")
result=exe.run(infer_program,feed={x.name:test_data},fetch_list=[net])
print(result)
附
训练截图:
测试截图(输入=6.0时):