如何使用百度深度学习框架paddlepaddle快速搭建深度神经网络?

HeiSeDiWei 2019-11-22

人工智能专栏推荐

人工智能的分类

弱人工智能(ANI):特定任务与人类智力或者效率持平

通用人工智能(AGI):具有人类智力水平,解决通用问题

超人工智能(ASI):超越人类智力水平,可以在创造力上超越常人

机器学习类型

监督学习:数据集中样本具有标签,比如人脸识别

无监督学习:数据集中样本没有标签,比如文本聚类

增强学习:通过反馈或者惩罚机制学习,比如游戏

人工智能包含机器学习包含深度学习

如何使用百度深度学习框架paddlepaddle快速搭建深度神经网络?

深度学习框架paddlepaddle

Paddlepaddle框架,要想使用paddle,需要遵循以下几步:

1引用库

2数据预处理

3构造reader

4训练过程

4.1训练场所

4.2网络优化器

4.2.1配置网络结构

4.2.2定义损失函数

4.2.3定义优化器

4.3训练准备

4.3.1定义输入数据与网络的映射关系

4.3.2定义文件路径

4.3.3定义执行器

4.3.4初始化网络参数

4.3.5事件处理函数

4.4模型训练

4.4.1定义reader

4.4.2定义trainer(双层for循环)

4.4.3开始训练

5测试过程

5.1设置预测程序

5.2设置预测器

5.3预测

详细解析

第2步:

数据预处理就是将数据从源文件中读取出来,然后进行一系列操作(归一化,flatten等),将数据分为训练集和测试集两部分

第3步:

def read_data(data_set):

def reader():

for data in data_set:

yield data[:-1],data[-1:]

return reader

第4步

use_cuda = False

place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()

x = fluid.layers.data(name='x', shape=[DATA_DIM], dtype='float32')

x1 = fluid.layers.fc(input=x, size=10, act='relu')

y_predict = fluid.layers.fc(input=x1, size=2, act='softmax')

y = fluid.layers.data(name='y', shape=[1], dtype='int64')

cost = fluid.layers.cross_entropy(input=y_predict, label=y)

avg_loss = fluid.layers.mean(cost)

acc = fluid.layers.accuracy(input=y_predict, label=y)

optimizer = fluid.optimizer.Adam(learning_rate=0.001)

optimizer.minimize(avg_loss)

feeder = fluid.DataFeeder(place=place, feed_list=[x, y])

save_dirname="recognize_cat_inference.model"

exe = fluid.Executor(place)

startup_program = fluid.default_startup_program()

main_program = fluid.default_main_program()#训练模型

exe.run(startup_program)

test_program = fluid.default_main_program().clone(for_test=True)#测试模型

train_prompt = "Train cost"

cost_ploter = Ploter(train_prompt)

# 将训练过程绘图表示

def event_handler_plot(ploter_title, step, cost):

cost_ploter.append(ploter_title, step, cost)

cost_ploter.plot()

def train_test(train_test_program, train_test_feed, train_test_reader):

# 将分类准确率存储在acc_set中

acc_set = []

# 将平均损失存储在avg_loss_set中

avg_loss_set = []

# 将测试 reader yield 出的每一个数据传入网络中进行训练

for test_data in train_test_reader():

acc_np, avg_loss_np = exe.run(

program=train_test_program,

feed=train_test_feed.feed(test_data),

fetch_list=[acc, avg_loss])

acc_set.append(float(acc_np))

avg_loss_set.append(float(avg_loss_np))

# get test acc and loss

# 获得测试数据上的准确率和损失值

acc_val_mean = np.array(acc_set).mean()

avg_loss_val_mean = np.array(avg_loss_set).mean()

# 返回平均损失值,平均准确率

return avg_loss_val_mean, acc_val_mean

BATCH_SIZE=8

# 设置训练reader

train_reader = paddle.batch(

paddle.reader.shuffle(

read_data(train_set), buf_size=500),

batch_size=BATCH_SIZE)

#设置测试 reader

test_reader = paddle.batch(

paddle.reader.shuffle(

read_data(test_set), buf_size=500),

batch_size=BATCH_SIZE)

lists = []

step = 0

for epoch_id in epochs:

for step_id, data in enumerate(train_reader()):

metrics = exe.run(

main_program,

feed=feeder.feed(data),

fetch_list=[avg_loss,acc])

#我们可以把训练结果打印输出,也可以用画图展示出来

if step % 10 == 0: #每训练100次 打印一次log,或者添加一个绘图点

event_handler_plot(train_prompt, step, metrics[0])

step += 1

# test for epoch

# 测试每个epoch的分类效果

avg_loss_val, acc_val = train_test(

train_test_program=test_program,

train_test_reader=test_reader,

train_test_feed=feeder)

print("Test with Epoch %d, avg_cost: %s, acc: %s" %

(epoch_id, avg_loss_val, acc_val))

lists.append((epoch_id, avg_loss_val, acc_val))

# 保存训练好的模型参数用于预测

if save_dirname is not None:

fluid.io.save_inference_model(

save_dirname, ["x"], [y_predict],

exe)

# find the best pass

# 选择效果最好的pass

best = sorted(lists, key=lambda list: float(list[1]))[0]

print('Best pass is %s, testing Avgcost is %s' % (best[0], best[1]))

print('The classification accuracy is %.2f%%' % (float(best[2]) * 100))

#指定预测的作用域

inference_scope = fluid.core.Scope()

with fluid.scope_guard(inference_scope):

# 使用 fluid.io.load_inference_model 获取 inference program desc,

# feed_target_names 用于指定需要传入网络的变量名

# fetch_targets 指定希望从网络中fetch出的变量名

[inference_program, feed_target_names,

fetch_targets] = fluid.io.load_inference_model(

save_dirname, exe)

# 将feed构建成字典 {feed_target_name: feed_target_data}

# 结果将包含一个与fetch_targets对应的数据列表

# 我们可以实现批量预测,通过一个循环,每次预测一个mini_batch

for mini_batch in test_reader():

test_x = np.array([data[0] for data in mini_batch]).astype("float32")

test_y = np.array([data[1] for data in mini_batch]).astype("int64")

# 真实进行预测

mini_batch_result = exe.run(

inference_program,

feed={feed_target_names[0]: test_x},

fetch_list=fetch_targets)

# 打印预测结果

print(mini_batch_result)

mini_batch_result = np.argsort(mini_batch_result) #找出可能性最大的列标,升序排列

mini_batch_result = mini_batch_result[0][:, -1] #把这些列标拿出来

print('预测结果:%s'%mini_batch_result)

# 打印真实结果

label = np.array(test_y) # 转化为 label

print('真实结果:%s'%label)

break

训练阶段

metrics = exe.run(

main_program,

feed=feeder.feed(data),

fetch_list=[avg_loss,acc])

main_program表示训练的网络

feed表示输入数据

fetch_list表示将本次训练的avg_loss(平均损失),以及acc(准确率)返回给metrics

运行exe.run表示神经网络完成了一次前向传播、反向传播、以及梯度下降

保存模型

fluid.io.save_inference_model(save_dirname, ["x"], [y_predict],exe)

save_dirname表示模型的保存路径

[“x”]表示模型的输入层

[y_predict]表示模型的预测值

加载模型

[inference_program, feed_target_names,fetch_targets]

= fluid.io.load_inference_model(save_dirname,infer_exe)

其中inferce_program表示模型,也就是神经网络

feed_target_names表示神经网络的输入层

fetch_targets表示神经网络的预测值y_predict

使用模型进行预测

mini_batch_result = exe.run(

inference_program,

feed={feed_target_names[0]: test_x},

fetch_list=fetch_targets)

其中inference_program表示模型

feed表示喂入的数据,然后值为字典{输入层:数据}

fetch_list表示神经网络运行完成之后然后fetch_targets给mini_batch_result,这表示神经网络的预测值

相关推荐