diff --git a/docs/zh_cn/quick_start/nas_tutorial.md b/docs/zh_cn/quick_start/nas_tutorial.md index 8fc0d6d084770c65a13f66932239bf65810a44fc..7037187e178a2f8014a093a93792e16a99aae196 100644 --- a/docs/zh_cn/quick_start/nas_tutorial.md +++ b/docs/zh_cn/quick_start/nas_tutorial.md @@ -25,7 +25,9 @@ 请确认已正确安装Paddle,导入需要的依赖包。 ```python import paddle -import paddle.fluid as fluid +import paddle.nn as nn +import paddle.nn.functional as F +import paddle.static as static import paddleslim as slim import numpy as np ``` @@ -38,60 +40,78 @@ sanas = slim.nas.SANAS(configs=[('MobileNetV2Space')], server_addr=("", 8337), s ## 3. 构建网络 根据传入的网络结构构造训练program和测试program。 ```python +paddle.enable_static() def build_program(archs): - train_program = fluid.Program() - startup_program = fluid.Program() - with fluid.program_guard(train_program, startup_program): - data = fluid.data(name='data', shape=[None, 3, 32, 32], dtype='float32') - label = fluid.data(name='label', shape=[None, 1], dtype='int64') + train_program = static.Program() + startup_program = static.Program() + with static.program_guard(train_program, startup_program): + data = static.data(name='data', shape=[None, 3, 32, 32], dtype='float32') + label = static.data(name='label', shape=[None, 1], dtype='int64') + gt = paddle.reshape(label, [-1, 1]) output = archs(data) - output = fluid.layers.fc(input=output, size=10) + output = static.nn.fc(output, size=10) - softmax_out = fluid.layers.softmax(input=output, use_cudnn=False) - cost = fluid.layers.cross_entropy(input=softmax_out, label=label) - avg_cost = fluid.layers.mean(cost) - acc_top1 = fluid.layers.accuracy(input=softmax_out, label=label, k=1) - acc_top5 = fluid.layers.accuracy(input=softmax_out, label=label, k=5) - test_program = fluid.default_main_program().clone(for_test=True) + softmax_out = F.softmax(output) + cost = F.cross_entropy(softmax_out, label=label) + avg_cost = paddle.mean(cost) + acc_top1 = paddle.metric.accuracy(input=softmax_out, label=gt, k=1) + acc_top5 = paddle.metric.accuracy(input=softmax_out, label=gt, k=5) + test_program = static.default_main_program().clone(for_test=True) - optimizer = fluid.optimizer.Adam(learning_rate=0.1) + optimizer = paddle.optimizer.Adam(learning_rate=0.1) optimizer.minimize(avg_cost) - place = fluid.CPUPlace() - exe = fluid.Executor(place) + place = paddle.CPUPlace() + exe = static.Executor(place) exe.run(startup_program) return exe, train_program, test_program, (data, label), avg_cost, acc_top1, acc_top5 ``` ## 4. 定义输入数据函数 -使用的数据集为cifar10,paddle框架中`paddle.dataset.cifar`包括了cifar数据集的下载和读取,代码如下: +为了快速执行该示例,我们使用的数据集为CIFAR10,Paddle框架的`paddle.vision.datasets.Cifar10`包定义了CIFAR10数据的下载和读取。 代码如下: + ```python -def input_data(inputs): - train_reader = paddle.fluid.io.batch(paddle.reader.shuffle(paddle.dataset.cifar.train10(cycle=False), buf_size=1024),batch_size=256) - train_feeder = fluid.DataFeeder(inputs, fluid.CPUPlace()) - eval_reader = paddle.fluid.io.batch(paddle.dataset.cifar.test10(cycle=False), batch_size=256) - eval_feeder = fluid.DataFeeder(inputs, fluid.CPUPlace()) - return train_reader, train_feeder, eval_reader, eval_feeder +import paddle.vision.transforms as T + +def input_data(image, label): + transform = T.Compose([T.Normalize([127.5], [127.5])]) + train_dataset = paddle.vision.datasets.Cifar10(mode="train", transform=transform) + train_loader = paddle.io.DataLoader(train_dataset, + places=paddle.CPUPlace(), + feed_list=[image, label], + drop_last=True, + batch_size=64, + return_list=False, + shuffle=True) + eval_dataset = paddle.vision.datasets.Cifar10(mode="test", transform=transform) + eval_loader = paddle.io.DataLoader(eval_dataset, + places=paddle.CPUPlace(), + feed_list=[image, label], + drop_last=False, + batch_size=64, + return_list=False, + shuffle=False) + return train_loader, eval_loader ``` ## 5. 定义训练函数 根据训练program和训练数据进行训练。 ```python -def start_train(program, data_reader, data_feeder): +def start_train(program, data_loader): outputs = [avg_cost.name, acc_top1.name, acc_top5.name] - for data in data_reader(): - batch_reward = exe.run(program, feed=data_feeder.feed(data), fetch_list = outputs) + for data in data_loader(): + batch_reward = exe.run(program, feed=data, fetch_list = outputs) print("TRAIN: loss: {}, acc1: {}, acc5:{}".format(batch_reward[0], batch_reward[1], batch_reward[2])) ``` ## 6. 定义评估函数 根据评估program和评估数据进行评估。 ```python -def start_eval(program, data_reader, data_feeder): +def start_eval(program, data_loader): reward = [] outputs = [avg_cost.name, acc_top1.name, acc_top5.name] - for data in data_reader(): - batch_reward = exe.run(program, feed=data_feeder.feed(data), fetch_list = outputs) + for data in data_loader(): + batch_reward = exe.run(program, feed=data, fetch_list = outputs) reward_avg = np.mean(np.array(batch_reward), axis=1) reward.append(reward_avg) print("TEST: loss: {}, acc1: {}, acc5:{}".format(batch_reward[0], batch_reward[1], batch_reward[2])) @@ -112,23 +132,23 @@ archs = sanas.next_archs()[0] ### 7.2 构造program 调用步骤3中的函数,根据4.1中的模型结构构造相应的program。 ```python -exe, train_program, eval_program, inputs, avg_cost, acc_top1, acc_top5 = build_program(archs) +exe, train_program, eval_program, (image, label), avg_cost, acc_top1, acc_top5 = build_program(archs) ``` ### 7.3 定义输入数据 ```python -train_reader, train_feeder, eval_reader, eval_feeder = input_data(inputs) +train_loader, eval_loader = input_data(image, label) ``` ### 7.4 训练模型 根据上面得到的训练program和评估数据启动训练。 ```python -start_train(train_program, train_reader, train_feeder) +start_train(train_program, train_loader) ``` ### 7.5 评估模型 根据上面得到的评估program和评估数据启动评估。 ```python -finally_reward = start_eval(eval_program, eval_reader, eval_feeder) +finally_reward = start_eval(eval_program, eval_loader) ``` ### 7.6 回传当前模型的得分 ``` @@ -141,16 +161,16 @@ sanas.reward(float(finally_reward[1])) for step in range(3): archs = sanas.next_archs()[0] exe, train_program, eval_program, inputs, avg_cost, acc_top1, acc_top5 = build_program(archs) - train_reader, train_feeder, eval_reader, eval_feeder = input_data(inputs) + train_loader, eval_loader = input_data(inputs) current_flops = slim.analysis.flops(train_program) if current_flops > 321208544: continue for epoch in range(7): - start_train(train_program, train_reader, train_feeder) + start_train(train_program, train_loader) - finally_reward = start_eval(eval_program, eval_reader, eval_feeder) + finally_reward = start_eval(eval_program, eval_loader) sanas.reward(float(finally_reward[1])) ```