PaddlePaddle使用心得

PaddlePaddle使用心得

本次是我第一次使用Paddle深度学习框架,虽然以前也对别的深度学习框架有过简单的使用,但是这次的飞桨深度学习的课程中我用到的paddle是我认为非常好用的一款,在下面我将简单介绍一个小白在为期7天的学习中,对于panddle的使用心得:
1、Paddle的安装
百度飞桨深度学习框架的安装也是非常的简单,我们打开网站Paddle快速安装:
PaddlePaddle使用心得_第1张图片
选择自己的版本,我是windows10+CPU的版本,如果不知道自己电脑的python的版本,则可以在命令行键入python --version查看自己的版本信息,以确保安装的版本正确。然后我们如果是通过像楼主一样的pip安装,需要保证自己的pip版本大于9.0.1.然后推荐使用百度源进行安装python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple,然后使用python进入python解析器,输入import paddle.fluid,再输入paddle.fluid.install_check.run_check()。如果出现
Your Paddle Fluid is installed successfully!,说明已成功安装!
2、Paddle的简单实践
因为我是第一次使用panddle深度学习框架,所以选择使用官方的AIstudio平台进行实践,不得不说,百度的AIstudio平台还是非常好用的,除了免费的GPU算力之外。notebook的开发也是非常符合我自己jupyter的风格。参与的第一个实践是手势识别的例子,使用的训练数据和测试数据都是官方提供的各种手势图片,这里列出简单的一些代码供大家参考,详细的可以去百度AIStudio的官网查看项目的详细数据集以及代码实践。
1>解压数据集
2>生成训练所用的图像列表,这里按序取出,每10张我们选取一张作为测试放入测试集列表。

# 生成图像列表
data_path = '/home/aistudio/data/data23668/Dataset'
character_folders = os.listdir(data_path)
# print(character_folders)
if(os.path.exists('./train_data.list')):
    os.remove('./train_data.list')
if(os.path.exists('./test_data.list')):
    os.remove('./test_data.list')
    
for character_folder in character_folders:
    
    with open('./train_data.list', 'a') as f_train:
        with open('./test_data.list', 'a') as f_test:
            character_imgs = os.listdir(os.path.join(data_path,character_folder))
            count = 0 
            for img in character_imgs:
                if img =='.DS_Store':
                    continue
                if count%10 == 0:
                    f_test.write(os.path.join(data_path,character_folder,img) + '\t' + character_folder + '\n')
                else:
                    f_train.write(os.path.join(data_path,character_folder,img) + '\t' + character_folder + '\n')
                count +=1
print('列表已生成')

3>定义训练集和测试集的reader,通过reader的方式传入数据给模型,在data_mapper函数里,我门对图片进行了resize以及通道转换的操作:

# 定义训练集和测试集的reader
def data_mapper(sample):
    img, label = sample
    img = Image.open(img)
    img = img.resize((100, 100), Image.ANTIALIAS)
    img = np.array(img).astype('float32')
    img = img.transpose((2, 0, 1))
    img = img/255.0
    return img, label

def data_reader(data_list_path):
    def reader():
        with open(data_list_path, 'r') as f:
            lines = f.readlines()
            for line in lines:
                img, label = line.split('\t')
                yield img, int(label)
    return paddle.reader.xmap_readers(data_mapper, reader, cpu_count(), 512)
# 用于训练的数据提供器
train_reader = paddle.batch(reader=paddle.reader.shuffle(reader=data_reader('./train_data.list'), buf_size=256), batch_size=32)
# 用于测试的数据提供器
test_reader = paddle.batch(reader=data_reader('./test_data.list'), batch_size=32) 

4>接下来是模型的部分,我简单使用了简单的卷积核池化的网络进行简单的训练,其中paddle1.7之后用Linear代替了fc的使用,具体的函数API可以参考百度飞桨官方使用文档:


#定义DNN网络
class MyDNN(fluid.dygraph.Layer):
    def __init__(self):
        super(MyDNN,self).__init__()
 self.conv2d_1=Conv2D(num_channels=3,num_filters=6,filter_size=3,stride=2,act='relu',)
        self.pool=Pool2D(pool_size=3,pool_type='max',pool_stride=2)
        self.conv2d_2=Conv2D(num_channels=6,num_filters=16,filter_size=3,stride=2,padding=1,act='relu')
        self.hidden = Linear(400,100,bias_attr=True,act='relu') 
        self.hidden1 = Linear(100,10,bias_attr=True,act='softmax') 
    def forward(self,input):
        x=self.conv2d_1(input)
        x=self.pool(x)
        x=self.conv2d_2(x)
        x=self.pool(x)  
        x=fluid.layers.reshape(x,shape=[-1,400])
        x=self.hidden(x)
        y=self.hidden1(x)
        return y

5>用动态图进行训练,paddle1.7引入了动态图的机制,对于动态图的使用我感觉比静态图要更加的灵活方便,具体的情况同时可以参考百度飞桨官方文档:

#用动态图进行训练
with fluid.dygraph.guard():
    model=MyDNN() #模型实例化
    model.train() #训练模式
    opt=fluid.optimizer.SGDOptimizer(learning_rate=0.01, parameter_list=model.parameters())#优化器选用SGD随机梯度下降,学习率为0.001.
    epochs_num=300 #迭代次数
    
    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)
#             print(images.shape)
            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)#预测

            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_2')#保存模型

6>进行模型的校验:

#模型校验
with fluid.dygraph.guard():
    accs = []
    model_dict, _ = fluid.load_dygraph('MyDNN_2')
    model = MyDNN()
    model.load_dict(model_dict) #加载模型参数
    model.eval() #训练模式
    for batch_id,data in enumerate(test_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]

        image=fluid.dygraph.to_variable(images)
        label=fluid.dygraph.to_variable(labels)
        
        predict=model(image)       
        acc=fluid.layers.accuracy(predict,label)
        accs.append(acc.numpy()[0])
        avg_acc = np.mean(accs)
    print(avg_acc)

7>最后就是做简单的预测,预测图片的时候,我们需要对待预测的图片进行同样的修改,然后扔给我们训练好的模型里面:

#读取预测图像,进行预测

def load_image(path):
    img = Image.open(path)
    img = img.resize((100, 100), Image.ANTIALIAS)
    img = np.array(img).astype('float32')
    img = img.transpose((2, 0, 1))
    img = img/255.0
    print(img.shape)
    return img

#构建预测动态图过程
with fluid.dygraph.guard():
    infer_path = '手势.JPG'
    model=MyDNN()#模型实例化
    model_dict,_=fluid.load_dygraph('MyDNN_2')
    model.load_dict(model_dict)#加载模型参数
    model.eval()#评估模式
    infer_img = load_image(infer_path)
    infer_img=np.array(infer_img).astype('float32')
    infer_img=infer_img[np.newaxis,:, : ,:]
    infer_img = fluid.dygraph.to_variable(infer_img)
    result=model(infer_img)
    display(Image.open('手势.JPG'))
    print(np.argmax(result.numpy()))

简单展示一下预测结果:
PaddlePaddle使用心得_第2张图片
以上就是我参与的第一个小例子。
3、总结
可以看到基于Paddle1.7的深度学习框架代码结构还是非常好理解的,非常适合像我一样的小白来使用,同时这7天的作业还有做车牌识别、口罩分类、以及人群密检测的例子,可以说内容非常的丰富,为这种义务的有趣的学习活动点赞,同时希望更多人能参与到以后的学习中,大家一起进步,一起学习!最后祝飞桨越办越好,祝班班、GT哥哥各位老师工作顺利!!!!

你可能感兴趣的:(PaddlePaddle使用心得)