动态图
动态图对应的是命令式编程:
可以不用事先定义神经网络的结构,将神经网络的定义和执行同步进行
与之相反的便是静态图,静态图和声明式编程相关:
需要事先定义好神经网络的结构,然后再执行整个图结构。
对比
如果想要实现如下功能。
如果inp1各元素之和小于inp2各元素之和,那么执行inp1与 inp2各元素对应相加。
如果inp1各元素之和大于等于inp2各元素之和,那么执行inp1与 inp2各元素对应相减。
使用动态图进行训练
import paddle.fluid asfluid
import numpy as np
inp1 = np.random.rand(4, 3, 3)
inp2 = np.random.rand(4, 3, 3)
# dynamic graph
with fluid.dygraph.guard():
if np.sum(inp1) <np.sum(inp2):
x =fluid.layers.elementwise_add(inp1, inp2)
else:
x =fluid.layers.elementwise_sub(inp1, inp2)
dygraph_result = x.numpy()
核心代码只有6行,而如果使用静态图的话便至少需要20行的核心代码,
So
优势
- 动态图与静态图的最大区别是采用了命令式的编程方式,任务不用在区分组网阶段和执行阶段。代码运行完成之后,可以立马获取结果。由于采用与我们书写大部分Python和c++的方式是一致的命令式编程方式,程序的编写和调试会非常的容易。
- 能够使用Python的控制流,例如for,if else, switch等,对于rnn等任务的支持更方便。
- 动态图能够与numpy更好的交互。
一句话总结
思想简单,代码量少!
使用方法
import paddle.fluid as fluid
import numpy as np
x = np.ones([10, 2, 2], np.float32)
with fluid.dygraph.guard():
inputs = []
seq_len = x.shape[0]
for i in range(seq_len):
inputs.append(fluid.dygraph.to_variable(x[i]))
ret =fluid.layers.sums(inputs)
print(ret.numpy())
output
[[10. 10.]
[10. 10.]]
loss =fluid.layers.reduce_sum(ret)
loss.backward()
print(loss.gradient())
output
[1.]
本次项目的实战代码:
用动态图进行模型训练
use_cuda = True
place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()
with fluid.dygraph.guard():
model=MyDNN()
model.train()
opt=fluid.optimizer.SGDOptimizer(learning_rate=0.005, parameter_list=model.parameters())
epochs_num=20 #迭代次数
for pass_num in range(epochs_num):
for batch_id,data in enumerate(train_reader()):
images=np.array([x[0].reshape(3,100,100) for x in data],np.float32)
labels = np.array([x[1] for x in data]).astype('int64')
labels = labels[:, np.newaxis]
# print(images.shape)
image=fluid.dygraph.to_variable(images)
label=fluid.dygraph.to_variable(labels)
predict=model(image)#预测
# print(predict)
loss=fluid.layers.cross_entropy(predict,label)
avg_loss=fluid.layers.mean(loss)#获取loss值
acc=fluid.layers.accuracy(predict,label)#计算精度
if batch_id!=0 and batch_id%50==0:
print("train_pass:{},batch_id:{},train_loss:{},train_acc:{}".format(pass_num,batch_id,avg_loss.numpy(),acc.numpy()))
avg_loss.backward()
opt.minimize(avg_loss)
model.clear_gradients()
fluid.save_dygraph(model.state_dict(),'MyDNN')#保存模型
如果想了解图像识别实战的全过程,请务必点击博主名字,进入主页查看全部。
别忘了留下,你的点赞、评论和关注偶~