1 # 1、导包
2 import paddle.fluid as fluid
3 import paddle
4 import time
5
6 start = time.time()
7
8
9 def test_program(exe, feeder, program, fetch_list, reader):
10 """
11 测试进程
12 :param exe:执行器
13 :param feeder: 数据与网络关系
14 :param program: 测试主进程
15 :param fetch_list: 需要执行之后返回的损失与准确率
16 :param reader: 测试reader
17 :return:
18 """
19 # 训练次数
20 count = 0
21 # 整个测试集的总损失
22 sum_loss = 0
23 # 整个训练集的准确率
24 sum_acc = 0
25 for test_data in reader():
26 test_avg_loss_value, test_acc_values = exe.run(
27 program=program, # 测试主进程
28 feed=feeder.feed(test_data), # 给测试喂数据
29 fetch_list=fetch_list # 需要执行之后返回的值
30 )
31
32 sum_loss += test_avg_loss_value
33 sum_acc += test_acc_values
34 count += 1
35 # 得到整个训练集的平均损失,与整个训练集的准确率
36 test_avg_loss = sum_loss / count
37 test_acc = sum_acc / count
38
39 return test_avg_loss, test_acc
40
41
42 # 2、数据处理---paddlepaddle 自带的mnist数据已经经过了数据处理
43
44 # 3、定义reader
45 # paddlepaddle给我们已经定义好了reader,只需要去调用
46
47 # 4、指定训练场所
48 place = fluid.CPUPlace()
49
50 # 5、配置网络
51 # 特征数据层
52 image = fluid.layers.data(name="image", shape=[1, 28, 28], append_batch_size=True, dtype="float64")
53 # 目标数据层
54 label = fluid.layers.data(name="label", shape=[1], append_batch_size=True, dtype="int64")
55 # 设计两个卷积、激活、池化 之后 + fc的卷积神经网络
56 conv1 = fluid.nets.simple_img_conv_pool(
57 input=image, # 输入
58 num_filters=20, # 卷积核个数
59 filter_size=3, # 卷积核大小
60 pool_size=2, # 池化大小
61 pool_stride=2, # 池化步长
62 act="relu", # 激活函数
63 )
64 conv2 = fluid.nets.simple_img_conv_pool(
65 input=conv1, # 输入
66 num_filters=10, # 卷积核个数
67 filter_size=5, # 卷积核大小
68 pool_size=2, # 池化大小
69 pool_stride=2, # 池化步长
70 act="relu", # 激活函数
71 )
72 y_predict = fluid.layers.fc(input=conv2, size=10, act="softmax", name="output_layer")
73
74 # 6、损失
75 # 交叉熵损失
76 loss = fluid.layers.cross_entropy(input=y_predict, label=label)
77 # 计算平均损失
78 avg_loss = fluid.layers.mean(loss)
79
80 # 计算准确率
81 acc = fluid.layers.accuracy(input=y_predict, label=label)
82
83 # 7、指定优化---sgd随机梯度下降优化算法
84 sgd_optimizer = fluid.optimizer.SGD(learning_rate=0.1)
85 # 指定去优化损失
86 sgd_optimizer.minimize(avg_loss)
87
88 # 8、指定网络与数据层的关系
89 feeder = fluid.DataFeeder(feed_list=[image, label], place=place)
90
91 # 9、构建执行器
92 # 训练执行器
93 exe_train = fluid.Executor(place=place)
94 # 测试执行器
95 exe_test = fluid.Executor(place=place)
96
97 # 10、初始化网络参数
98 # 初始化参数进程
99 startup_program = fluid.default_startup_program()
100 exe_train.run(startup_program)
101 # 主进程
102 # 训练主进程
103 train_main_program = fluid.default_main_program()
104 # 测试主进程
105 test_main_program = train_main_program.clone(for_test=True)
106
107 # 11、获取图片数据
108 # 并不是直接拿到数据就往网络里面送
109 # 构建一个缓冲区,--打乱顺序,--再往网络里面送
110 # paddle.dataset.mnist.train() ----paddlepaddle的训练reader
111 # 缓冲区大小buf_size与批次大小batch_size 并没有多大的关系
112 # 一般设计的时候注意:buf_size 略微需要比batch_size 大一点就可以
113 # 而且batch_size 不能过大
114 # 训练reader 与测试reader 的batch_size数量必须一致
115 train_reader = paddle.batch(
116 paddle.reader.shuffle(paddle.dataset.mnist.train(), buf_size=50),
117 batch_size=10
118 )
119 test_reader = paddle.batch(
120 paddle.reader.shuffle(paddle.dataset.mnist.test(), buf_size=50),
121 batch_size=10
122 )
123
124 # 12、训练
125 # 指定训练轮数
126 loop_num = 2
127 # 定义的执行次数
128 step = 0
129
130 flag = False
131
132 for loop in range(loop_num):
133 print("第%d轮训练" % loop)
134 # train_data 每批次的数据
135 for train_data in train_reader():
136 # 执行器运行训练主进程
137 train_avg_loss_value, train_acc_value = exe_train.run(
138 program=train_main_program, # 训练主进程
139 feed=feeder.feed(train_data), # 利用数据层与网络构建好的关系,将真实的数据喂给网络
140 fetch_list=[avg_loss, acc] # 执行之后需要返回的结果的值
141 )
142 # 每隔10步来打印一下损失与准确率
143 if step % 10 == 0 and step != 0:
144 print("第%d次训练的损失为%f,准确率为%f" % (step, train_avg_loss_value, train_acc_value))
145
146 step += 1
147
148 # 每隔100步 去测试集中测试一下训练效果
149 if step % 100 == 0 and step != 0:
150 test_avg_loss, test_acc = test_program(exe_test,
151 feeder,
152 test_main_program,
153 fetch_list=[avg_loss, acc],
154 reader=test_reader
155 )
156 print("*" * 100)
157 print("测试集的损失为:%f,准确率为:%f" % (test_avg_loss, test_acc))
158 print("*" * 100)
159 if test_avg_loss <= 0.1 and test_acc >= 0.98:
160 flag = True
161
162 print("最终测试集的损失为:%f,准确率为:%f" % (test_avg_loss, test_acc))
163 end = time.time()
164
165 print("运行总时长为:", end - start)
166 break
167 if flag:
168 break
来源:https://www.cnblogs.com/Tree0108/p/12116316.html