未验证 提交 10e7c2da 编写于 作者: C Chang Xu 提交者: GitHub

Fix docs nas (#830)

* fix_docs_nas

* fix_again

* fix_again_
Co-authored-by: Nceci3 <ceci3@users.noreply.github.com>
上级 47913354
...@@ -24,7 +24,9 @@ The following chapter describes each steps in order. ...@@ -24,7 +24,9 @@ The following chapter describes each steps in order.
Please make sure that you haved installed Paddle correctly, then do the necessary imports. Please make sure that you haved installed Paddle correctly, then do the necessary imports.
```python ```python
import paddle 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 paddleslim as slim
import numpy as np import numpy as np
``` ```
...@@ -33,33 +35,35 @@ import numpy as np ...@@ -33,33 +35,35 @@ import numpy as np
Please set a unused port when build instance of SANAS. Please set a unused port when build instance of SANAS.
```python ```python
sanas = slim.nas.SANAS(configs=[('MobileNetV2Space')], server_addr=("", 8911), save_checkpoint=None) port = np.random.randint(8337, 8773)
sanas = slim.nas.SANAS(configs=[('MobileNetV2Space')], server_addr=("", port), save_checkpoint=None)
``` ```
## 3. define function about building program ## 3. define function about building program
Build program about training and evaluation according to the model architecture. Build program about training and evaluation according to the model architecture.
```python ```python
paddle.enable_static()
def build_program(archs): def build_program(archs):
train_program = fluid.Program() train_program = static.Program()
startup_program = fluid.Program() startup_program = static.Program()
with fluid.program_guard(train_program, startup_program): with static.program_guard(train_program, startup_program):
data = fluid.data(name='data', shape=[None, 3, 32, 32], dtype='float32') data = static.data(name='data', shape=[None, 3, 32, 32], dtype='float32')
label = fluid.data(name='label', shape=[None, 1], dtype='int64') label = static.data(name='label', shape=[None, 1], dtype='int64')
gt = paddle.reshape(label, [-1, 1])
output = archs(data) 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) softmax_out = F.softmax(output)
cost = fluid.layers.cross_entropy(input=softmax_out, label=label) cost = F.cross_entropy(softmax_out, label=gt)
avg_cost = fluid.layers.mean(cost) avg_cost = paddle.mean(cost)
acc_top1 = fluid.layers.accuracy(input=softmax_out, label=label, k=1) acc_top1 = paddle.metric.accuracy(input=softmax_out, label=gt, k=1)
acc_top5 = fluid.layers.accuracy(input=softmax_out, label=label, k=5) acc_top5 = paddle.metric.accuracy(input=softmax_out, label=gt, k=5)
test_program = fluid.default_main_program().clone(for_test=True) 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) optimizer.minimize(avg_cost)
place = paddle.CPUPlace()
place = fluid.CPUPlace() exe = static.Executor(place)
exe = fluid.Executor(place)
exe.run(startup_program) exe.run(startup_program)
return exe, train_program, test_program, (data, label), avg_cost, acc_top1, acc_top5 return exe, train_program, test_program, (data, label), avg_cost, acc_top1, acc_top5
``` ```
...@@ -67,32 +71,47 @@ def build_program(archs): ...@@ -67,32 +71,47 @@ def build_program(archs):
## 4. define function about input data ## 4. define function about input data
The dataset we used is cifar10, and `paddle.dataset.cifar` in Paddle including the download and pre-read about cifar. The dataset we used is cifar10, and `paddle.dataset.cifar` in Paddle including the download and pre-read about cifar.
```python ```python
def input_data(inputs): import paddle.vision.transforms as T
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()) def input_data(image, label):
eval_reader = paddle.fluid.io.batch(paddle.dataset.cifar.test10(cycle=False), batch_size=256) transform = T.Compose([T.Transpose(), T.Normalize([127.5], [127.5])])
eval_feeder = fluid.DataFeeder(inputs, fluid.CPUPlace()) train_dataset = paddle.vision.datasets.Cifar10(mode="train", transform=transform, backend='cv2')
return train_reader, train_feeder, eval_reader, eval_feeder 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, backend='cv2')
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. define function about training ## 5. define function about training
Start training. Start training.
```python ```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] outputs = [avg_cost.name, acc_top1.name, acc_top5.name]
for data in data_reader(): for data in data_loader():
batch_reward = exe.run(program, feed=data_feeder.feed(data), fetch_list = outputs) 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])) print("TRAIN: loss: {}, acc1: {}, acc5:{}".format(batch_reward[0], batch_reward[1], batch_reward[2]))
``` ```
## 6. define funciton about evaluation ## 6. define funciton about evaluation
Start evaluating. Start evaluating.
```python ```python
def start_eval(program, data_reader, data_feeder): def start_eval(program, data_loader):
reward = [] reward = []
outputs = [avg_cost.name, acc_top1.name, acc_top5.name] outputs = [avg_cost.name, acc_top1.name, acc_top5.name]
for data in data_reader(): for data in data_loader():
batch_reward = exe.run(program, feed=data_feeder.feed(data), fetch_list = outputs) batch_reward = exe.run(program, feed=data, fetch_list = outputs)
reward_avg = np.mean(np.array(batch_reward), axis=1) reward_avg = np.mean(np.array(batch_reward), axis=1)
reward.append(reward_avg) reward.append(reward_avg)
print("TEST: loss: {}, acc1: {}, acc5:{}".format(batch_reward[0], batch_reward[1], batch_reward[2])) print("TEST: loss: {}, acc1: {}, acc5:{}".format(batch_reward[0], batch_reward[1], batch_reward[2]))
...@@ -114,23 +133,23 @@ archs = sanas.next_archs()[0] ...@@ -114,23 +133,23 @@ archs = sanas.next_archs()[0]
Get program according to the function in Step3 and model architecture from Step 7.1. Get program according to the function in Step3 and model architecture from Step 7.1.
```python ```python
paddle.enable_static() paddle.enable_static()
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 define input data ### 7.3 define input data
```python ```python
train_reader, train_feeder, eval_reader, eval_feeder = input_data(inputs) train_loader, eval_loader = input_data(image, label)
``` ```
### 7.4 train model ### 7.4 train model
Start training according to train program and data. Start training according to train program and data.
```python ```python
start_train(train_program, train_reader, train_feeder) start_train(train_program, train_loader)
``` ```
### 7.5 evaluate model ### 7.5 evaluate model
Start evaluation according to evaluation program and data. Start evaluation according to evaluation program and data.
```python ```python
finally_reward = start_eval(eval_program, eval_reader, eval_feeder) finally_reward = start_eval(eval_program, eval_loader)
``` ```
### 7.6 reture score ### 7.6 reture score
``` ```
...@@ -142,17 +161,17 @@ The following is a full example about neural architecture search, it uses FLOPs ...@@ -142,17 +161,17 @@ The following is a full example about neural architecture search, it uses FLOPs
```python ```python
for step in range(3): for step in range(3):
archs = sanas.next_archs()[0] archs = sanas.next_archs()[0]
exe, train_program, eval_progarm, inputs, avg_cost, acc_top1, acc_top5 = build_program(archs) exe, train_program, eval_program, (images,label), 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(images, label)
current_flops = slim.analysis.flops(train_program) current_flops = slim.analysis.flops(train_program)
if current_flops > 321208544: if current_flops > 321208544:
continue continue
for epoch in range(7): 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])) sanas.reward(float(finally_reward[1]))
``` ```
...@@ -49,7 +49,7 @@ SANAS(Simulated Annealing Neural Architecture Search)是基于模拟退火 ...@@ -49,7 +49,7 @@ SANAS(Simulated Annealing Neural Architecture Search)是基于模拟退火
from paddleslim.nas import SANAS from paddleslim.nas import SANAS
config = [('MobileNetV2Space')] config = [('MobileNetV2Space')]
paddle.enable_static() paddle.enable_static()
sanas = SANAS(configs=config, , server_addr=("",8821)) sanas = SANAS(configs=config, server_addr=("",8821))
.. note:: .. note::
...@@ -94,6 +94,7 @@ SANAS(Simulated Annealing Neural Architecture Search)是基于模拟退火 ...@@ -94,6 +94,7 @@ SANAS(Simulated Annealing Neural Architecture Search)是基于模拟退火
for arch in archs: for arch in archs:
output = arch(input) output = arch(input)
input = output input = output
print(output) print(output)
.. py:method:: reward(score) .. py:method:: reward(score)
......
...@@ -34,7 +34,8 @@ import numpy as np ...@@ -34,7 +34,8 @@ import numpy as np
## 2. 初始化SANAS搜索实例 ## 2. 初始化SANAS搜索实例
```python ```python
sanas = slim.nas.SANAS(configs=[('MobileNetV2Space')], server_addr=("", 8337), save_checkpoint=None) port = np.random.randint(8337, 8773)
sanas = slim.nas.SANAS(configs=[('MobileNetV2Space')], server_addr=("", port), save_checkpoint=None)
``` ```
## 3. 构建网络 ## 3. 构建网络
...@@ -60,7 +61,6 @@ def build_program(archs): ...@@ -60,7 +61,6 @@ def build_program(archs):
optimizer = paddle.optimizer.Adam(learning_rate=0.1) optimizer = paddle.optimizer.Adam(learning_rate=0.1)
optimizer.minimize(avg_cost) optimizer.minimize(avg_cost)
place = paddle.CPUPlace() place = paddle.CPUPlace()
exe = static.Executor(place) exe = static.Executor(place)
exe.run(startup_program) exe.run(startup_program)
......
...@@ -44,7 +44,7 @@ from paddleslim.nas import SANAS ...@@ -44,7 +44,7 @@ from paddleslim.nas import SANAS
BATCH_SIZE=96 BATCH_SIZE=96
SERVER_ADDRESS = "" SERVER_ADDRESS = ""
PORT = 8377 PORT = np.random.randint(8337, 8773)
SEARCH_STEPS = 300 SEARCH_STEPS = 300
RETAIN_EPOCH=30 RETAIN_EPOCH=30
MAX_PARAMS=3.77 MAX_PARAMS=3.77
...@@ -208,6 +208,7 @@ archs = sa_nas.next_archs()[0] ...@@ -208,6 +208,7 @@ archs = sa_nas.next_archs()[0]
#### 9.2 构造训练和预测program #### 9.2 构造训练和预测program
根据上一步中获得的模型结构分别构造训练program和预测program。 根据上一步中获得的模型结构分别构造训练program和预测program。
```python ```python
paddle.enable_static()
train_program = fluid.Program() train_program = fluid.Program()
test_program = fluid.Program() test_program = fluid.Program()
startup_program = fluid.Program() startup_program = fluid.Program()
...@@ -244,6 +245,7 @@ test_loader.set_sample_list_generator(test_reader, places=place) ...@@ -244,6 +245,7 @@ test_loader.set_sample_list_generator(test_reader, places=place)
#### 9.6 启动训练和评估 #### 9.6 启动训练和评估
```python ```python
valid_top1_list = []
for epoch_id in range(RETAIN_EPOCH): for epoch_id in range(RETAIN_EPOCH):
train_top1 = train(train_program, exe, epoch_id, train_loader, train_fetch_list) train_top1 = train(train_program, exe, epoch_id, train_loader, train_fetch_list)
print("TRAIN: Epoch {}, train_acc {:.6f}".format(epoch_id, train_top1)) print("TRAIN: Epoch {}, train_acc {:.6f}".format(epoch_id, train_top1))
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册