图像识别实战(四)------动态图&模型训练

图像识别实战(四)------动态图&模型训练

动态图

动态图对应的是命令式编程

可以不用事先定义神经网络的结构,将神经网络的定义和执行同步进行

与之相反的便是静态图,静态图和声明式编程相关:

需要事先定义好神经网络的结构,然后再执行整个图结构。

对比

如果想要实现如下功能。

  1. 如果inp1各元素之和小于inp2各元素之和,那么执行inp1与 inp2各元素对应相加。

  2. 如果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')#保存模型

如果想了解图像识别实战的全过程,请务必点击博主名字,进入主页查看全部。
别忘了留下,你的点赞、评论和关注偶~

你可能感兴趣的:(机器学习,算法,paddle)