在PaddlePaddle中的Notebook代码片段

Posted 卓晴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在PaddlePaddle中的Notebook代码片段相关的知识,希望对你有一定的参考价值。

简 介: ※利用Python编写的aisi辅助程序,可以在一定程度上缓解简单性与灵活性之间的矛盾。这以个人搭建网络的习惯进行固定,在平时以更小的代码量,更灵活的方式构建深度学习程序。提高程序开发效率。

关键词 AI studioPaddlePaddleasis

代码片段
文章目录
背景介绍
公共代码片段
辅助程序
辅助程序功能
辅助程序应用实例
总 结

 

§01 码片段


1.1 背景介绍

借助于Python语言的精简特性,很多 深度学习平台 在构建深度神经网络方面都进行了高度的封装。很多情况下,一些介绍性的文章都在强调仅需10句话就可以构成深度学习网络,云云。

尽管如此,精简性与灵活性之间的矛盾一直是横亘在网络编程之间障碍。为此,在paddlepaddle的AI Studio环境中(BML CodeLab)下,集成了一些代码片段库,在一定程度上可以减少输入代码的繁琐性。

1.2 公共代码片段

在BML CodeLab环境下,在左面有公共代码片段工作页,其中包含了很多代码片段。

▲ 图1.2.1 BML CodeLab中的代码片段

1.2.1 代码片段种类

代码片段包含有一下代码片段种类:

  • paddle 2.0
  • Blackhole DataFrame
  • Blackhole ML
  • 描述性统计信息
  • 新建列
  • 缺失值处理
  • Seaborn基本操作
  • Bokeh基本操作
  • Matplotlib基本操作
  • Numpy基本操作
  • seaborn可视化
  • 线性回归
  • DASK DATAFRAMES

在 paddle 2.0 种类中,包含有:

▲ 图1.2.2 paddle 2.0中的代码片段

点击其中一个代码片段,可以打开对应的编辑框:

▲ 图1.2.3 paddle 2.0 快速开始代码片段

将这些代码片段进行拷贝,编可以运行。因此可以实现 0 输入代码的编程。如果想进一步改进,可以在这些代码基础上进行修改编辑即可。

1.2.2 代码片段代码

下面对于Paddle 2.0 中的各个代码片段进行摘录:

(1)快速开始

import paddle
from paddle.vision.transforms import ToTensor

# 加载数据集
train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=ToTensor())
val_dataset =  paddle.vision.datasets.MNIST(mode='test', transform=ToTensor())

# 模型组网
mnist = paddle.nn.Sequential(
    paddle.nn.Flatten(),
    paddle.nn.Linear(784, 512),
    paddle.nn.ReLU(),
    paddle.nn.Dropout(0.2),
    paddle.nn.Linear(512, 10)
)

# 封装模型
model = paddle.Model(mnist)

# 配置训练模型
model.prepare(paddle.optimizer.Adam(parameters=model.parameters()),
              paddle.nn.CrossEntropyLoss(),
              paddle.metric.Accuracy())

# 模型训练
model.fit(train_dataset,
          epochs=5,
          batch_size=64,
          verbose=1)
# 模型评估
model.evaluate(val_dataset, verbose=0)

# 模型测试
model.predict(val_dataset)

# 模型保存
model.save('./model')

(2)数据集定义与加载

import paddle

# 方法一:飞桨框架自带数据集
print('视觉相关数据集:', paddle.vision.datasets.__all__)
print('自然语言相关数据集:', paddle.text.__all__)

# 使用飞桨框架自带数据集
from paddle.vision.transforms import ToTensor
# 训练数据集 用ToTensor将数据格式转为Tensor
train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=ToTensor())

# 验证数据集
val_dataset = paddle.vision.datasets.MNIST(mode='test', transform=ToTensor())

# 方法二:自定义数据集
from paddle.io import Dataset

BATCH_SIZE = 64
BATCH_NUM = 20

IMAGE_SIZE = (28, 28)
CLASS_NUM = 10

class MyDataset(Dataset):
    """
    步骤一:继承paddle.io.Dataset类
    """
    def __init__(self, num_samples):
        """
        步骤二:实现构造函数,定义数据集大小
        """
        super(MyDataset, self).__init__()
        self.num_samples = num_samples

    def __getitem__(self, index):
        """
        步骤三:实现__getitem__方法,定义指定index时如何获取数据,并返回单条数据(训练数据,对应的标签)
        """
        data = paddle.uniform(IMAGE_SIZE, dtype='float32')
        label = paddle.randint(0, CLASS_NUM-1, dtype='int64')

        return data, label

    def __len__(self):
        """
        步骤四:实现__len__方法,返回数据集总数目
        """
        return self.num_samples

# 测试定义的数据集
custom_dataset = MyDataset(BATCH_SIZE * BATCH_NUM)

print('=============custom dataset=============')
for data, label in custom_dataset:
    print(data.shape, label.shape)
    break

# 数据加载

train_loader = paddle.io.DataLoader(custom_dataset, batch_size=BATCH_SIZE, shuffle=True)
# 如果要加载内置数据集,将 custom_dataset 换为 train_dataset 即可

for batch_id, data in enumerate(train_loader()):
    x_data = data[0]
    y_data = data[1]

    print(x_data.shape)
    print(y_data.shape)
    break

(3)数据预处理

import paddle
print('数据处理方法:', paddle.vision.transforms.__all__)

# 场景一:飞桨框架内置数据集 + 数据预处理
from paddle.vision.transforms import Compose, Resize, ColorJitter

# 定义想要使用的数据增强方式,这里包括随机调整亮度、对比度和饱和度,改变图片大小
transform = Compose([ColorJitter(), Resize(size=32)])

# 通过transform参数传递定义好的数据增强方法即可完成对自带数据集的增强
train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=transform)

# 场景二:自定义数据集 + 数据预处理

from paddle.io import Dataset

BATCH_SIZE = 64
BATCH_NUM = 20

IMAGE_SIZE = (28, 28)
CLASS_NUM = 10

class MyDataset(Dataset):
    def __init__(self, num_samples):
        super(MyDataset, self).__init__()
        self.num_samples = num_samples
        # 在 `__init__` 中定义数据增强方法,此处为调整图像大小
        self.transform = Compose([Resize(size=32)])

    def __getitem__(self, index):
        data = paddle.uniform(IMAGE_SIZE, dtype='float32')
        # 在 `__getitem__` 中对数据集使用数据增强方法
        data = self.transform(data.numpy())

        label = paddle.randint(0, CLASS_NUM-1, dtype='int64')

        return data, label

    def __len__(self):
        return self.num_samples

# 测试定义的数据集
custom_dataset = MyDataset(BATCH_SIZE * BATCH_NUM)

print('=============custom dataset=============')
for data, label in custom_dataset:
    print(data.shape, label.shape)
    break

(4)模型组网

import paddle

# 方法一:使用飞桨框架内置模型
print('飞桨框架内置模型:', paddle.vision.models.__all__)
lenet = paddle.vision.models.LeNet()
paddle.summary(lenet, (64, 1, 28, 28))

# 方法二:Sequential 组网

mnist = paddle.nn.Sequential(
    paddle.nn.Flatten(),
    paddle.nn.Linear(784, 512),
    paddle.nn.ReLU(),
    paddle.nn.Dropout(0.2),
    paddle.nn.Linear(512, 10)
)

# 方法三:SubClass 组网
class Mnist(paddle.nn.Layer):
    def __init__(self):
        super(Mnist, self).__init__()

        self.flatten = paddle.nn.Flatten()
        self.linear_1 = paddle.nn.Linear(784, 512)
        self.linear_2 = paddle.nn.Linear(512, 10)
        self.relu = paddle.nn.ReLU()
        self.dropout = paddle.nn.Dropout(0.2)

    def forward(self, inputs):
        y = self.flatten(inputs)
        y = self.linear_1(y)
        y = self.relu(y)
        y = self.dropout(y)
        y = self.linear_2(y)

        return y

(5)与测试

import paddle
from paddle.vision.transforms import ToTensor

# 加载数据集
train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=ToTensor())
val_dataset =  paddle.vision.datasets.MNIST(mode='test', transform=ToTensor())

# 模型组网
mnist = paddle.nn.Sequential(
    paddle.nn.Flatten(),
    paddle.nn.Linear(784, 512),
    paddle.nn.ReLU(),
    paddle.nn.Dropout(0.2),
    paddle.nn.Linear(512, 10)
)

# 封装模型
model = paddle.Model(mnist)

# 配置训练模型
model.prepare(paddle.optimizer.Adam(parameters=model.parameters()),
              paddle.nn.CrossEntropyLoss(),
              paddle.metric.Accuracy())

# 模型训练
model.fit(train_dataset,
          epochs=5,
          batch_size=64,
          verbose=1)
# 模型评估
model.evaluate(val_dataset, verbose=0)

# 模型测试
model.predict(val_dataset)

(6)保存预加载

import paddle
from paddle.vision.transforms import ToTensor

# 加载数据集
train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=ToTensor())
val_dataset =  paddle.vision.datasets.MNIST(mode='test', transform=ToTensor())

# 模型组网
mnist = paddle.nn.Sequential(
    paddle.nn.Flatten(),
    paddle.nn.Linear(784, 512),
    paddle.nn.ReLU()从 Jupyter Notebook 中的文件“main.py”传输代码

Jupyter Notebook ipynb 中的图像未显示在 GitHub 私有存储库中,但相同的代码适用于公共存储库

在 jupyter/iPython notebook 脚本和类方法之间同步代码

百度PaddlePaddle:

Jupyter Notebook 中的内核死机和重启问题

jupyter notebook 安装代码提示功能