1111
1212使用paddle框架实现逻辑回归识别猫案例,关键步骤如下: 
13131.载入数据和预处理:load_data() 
14- 2.初始化 
15- 3.配置网络结构 
16- 4.定义成本函数cost 
17- 5.定义优化器optimizer 
18- 6.定义两个reader()分别用于读取训练数据和测试数据 
19- 7.预测并测试准确率train_accuracy和test_accuracy 
14+ 2.定义train()和test()用于读取训练数据和测试数据,分别返回一个reader 
15+ 3.初始化 
16+ 4.配置网络结构和设置参数: 
17+  - 定义成本函数cost 
18+  - 创建parameters 
19+  - 定义优化器optimizer 
20+ 5.定义event_handler 
21+ 6.定义trainer 
22+ 7.开始训练 
23+ 8.预测infer()并输出准确率train_accuracy和test_accuracy 
24+ 9.展示学习曲线plot_costs() 
2025""" 
2126
2227import  matplotlib 
@@ -67,6 +72,7 @@ def load_data():
6772 TRAINING_SET  =  np .hstack ((train_set_x , train_set_y .T ))
6873 TEST_SET  =  np .hstack ((test_set_x , test_set_y .T ))
6974
75+ 
7076# 读取训练数据或测试数据,服务于train()和test() 
7177def  read_data (data_set ):
7278 """ 
@@ -117,7 +123,55 @@ def test():
117123 return  read_data (TEST_SET )
118124
119125
120- # 获取data,服务于get_train_data()和get_test_data() 
126+ # 配置网络结构和设置参数 
127+ def  netconfig ():
128+  """ 
129+  配置网络结构和设置参数 
130+  Args: 
131+  Return: 
132+  image -- 输入层,DATADIM维稠密向量 
133+  y_predict -- 输出层,Sigmoid作为激活函数 
134+  y_label -- 标签数据,1维稠密向量 
135+  cost -- 损失函数 
136+  parameters -- 模型参数 
137+  optimizer -- 优化器 
138+  feeding -- 数据映射,python字典 
139+  """ 
140+  # 输入层,paddle.layer.data表示数据层,name=’image’:名称为image, 
141+  # type=paddle.data_type.dense_vector(DATADIM):数据类型为DATADIM维稠密向量 
142+  image  =  paddle .layer .data (
143+  name = 'image' , type = paddle .data_type .dense_vector (DATADIM ))
144+ 
145+  # 输出层,paddle.layer.fc表示全连接层,input=image: 该层输入数据为image 
146+  # size=1:神经元个数,act=paddle.activation.Sigmoid():激活函数为Sigmoid() 
147+  y_predict  =  paddle .layer .fc (
148+  input = image , size = 1 , act = paddle .activation .Sigmoid ())
149+ 
150+  # 标签数据,paddle.layer.data表示数据层,name=’label’:名称为label 
151+  # type=paddle.data_type.dense_vector(1):数据类型为1维稠密向量 
152+  y_label  =  paddle .layer .data (
153+  name = 'label' , type = paddle .data_type .dense_vector (1 ))
154+ 
155+  # 定义成本函数为交叉熵损失函数multi_binary_label_cross_entropy_cost 
156+  cost  =  paddle .layer .multi_binary_label_cross_entropy_cost (input = y_predict , label = y_label )
157+ 
158+  # 利用cost创建parameters 
159+  parameters  =  paddle .parameters .create (cost )
160+ 
161+  # 创建optimizer,并初始化momentum和learning_rate 
162+  optimizer  =  paddle .optimizer .Momentum (momentum = 0 , learning_rate = 0.00002 )
163+ 
164+  # 数据层和数组索引映射,用于trainer训练时喂数据 
165+  feeding  =  {
166+  'image' : 0 ,
167+  'label' : 1 }
168+ 
169+  data  =  [image , y_predict , y_label , cost , parameters , optimizer , feeding ]
170+ 
171+  return  data 
172+ 
173+ 
174+ # 获取data 
121175def  get_data (data_creator ):
122176 """ 
123177 使用参数data_creator来获取测试数据 
@@ -143,31 +197,7 @@ def get_data(data_creator):
143197 return  result 
144198
145199
146- # 获取train_data 
147- def  get_train_data ():
148-  """ 
149-  使用train()来获取训练数据 
150- 
151-  Args: 
152-  Return: 
153-  get_data(train()) -- 包含训练数据(image)和标签(label)的python字典 
154-  """ 
155-  return  get_data (train ())
156- 
157- 
158- # 获取test_data 
159- def  get_test_data ():
160-  """ 
161-  使用test()来获取测试数据 
162- 
163-  Args: 
164-  Return: 
165-  get_data(test()) -- 包含测试数据(image)和标签(label)的python字典 
166-  """ 
167-  return  get_data (test ())
168- 
169- 
170- # 计算准确度,服务于train_accuracy()和test_accuracy() 
200+ # 计算准确度 
171201def  calc_accuracy (probs , data ):
172202 """ 
173203 根据数据集来计算准确度accuracy 
@@ -190,37 +220,6 @@ def calc_accuracy(probs, data):
190220 return  accuracy 
191221
192222
193- # 训练集准确度 
194- def  train_accuracy (probs_train , train_data ):
195-  """ 
196-  根据训练数据集来计算训练准确度train_accuracy 
197- 
198-  Args: 
199-  probs_train -- 训练数据集的预测结果,调用paddle.infer()来获取 
200-  train_data -- 训练数据集 
201- 
202-  Return: 
203-  calc_accuracy -- 训练准确度 
204-  """ 
205-  return  calc_accuracy (probs_train , train_data )
206- 
207- 
208- # 测试集准确度 
209- def  test_accuracy (probs_test , test_data ):
210-  """ 
211-  根据测试数据集来计算测试准确度test_accuracy 
212- 
213-  Args: 
214-  probs_test -- 测试数据集的预测结果,调用paddle.infer()来获取 
215-  test_data -- 测试数据集 
216- 
217-  Return: 
218-  calc_accuracy -- 测试准确度 
219-  """ 
220- 
221-  return  calc_accuracy (probs_test , test_data )
222- 
223- 
224223# 预测 
225224def  infer (y_predict , parameters ):
226225 """ 
@@ -233,8 +232,8 @@ def infer(y_predict, parameters):
233232 Return: 
234233 """ 
235234 # 获取测试数据和训练数据,用来验证模型准确度 
236-  train_data  =  get_train_data ( )
237-  test_data  =  get_test_data ( )
235+  train_data  =  get_data ( train () )
236+  test_data  =  get_data ( test () )
238237
239238 # 根据train_data和test_data预测结果,output_layer表示输出层,parameters表示模型参数,input表示输入的测试数据 
240239 probs_train  =  paddle .infer (
@@ -245,8 +244,8 @@ def infer(y_predict, parameters):
245244 )
246245
247246 # 计算train_accuracy和test_accuracy 
248-  print ("train_accuracy: {} %" .format (train_accuracy (probs_train , train_data )))
249-  print ("test_accuracy: {} %" .format (test_accuracy (probs_test , test_data )))
247+  print ("train_accuracy: {} %" .format (calc_accuracy (probs_train , train_data )))
248+  print ("test_accuracy: {} %" .format (calc_accuracy (probs_test , test_data )))
250249
251250
252251# 展示模型训练曲线 
@@ -263,58 +262,10 @@ def plot_costs(costs):
263262 plt .ylabel ('cost' )
264263 plt .xlabel ('iterations (per hundreds)' )
265264 plt .title ("Learning rate = 0.00002" )
266-  plt .show ()
265+  #  plt.show()
267266 plt .savefig ('costs.png' )
268267
269268
270- # 配置网络结构 
271- def  netconfig ():
272-  """ 
273-  配置网络结构 
274-  Args: 
275-  Return: 
276-  image -- 输入层,DATADIM维稠密向量 
277-  y_predict -- 输出层,Sigmoid作为激活函数 
278-  y_label -- 标签数据,1维稠密向量 
279-  cost -- 损失函数 
280-  parameters -- 模型参数 
281-  optimizer -- 优化器 
282-  feeding -- 数据映射,python字典 
283-  """ 
284-  # 输入层,paddle.layer.data表示数据层,name=’image’:名称为image, 
285-  # type=paddle.data_type.dense_vector(DATADIM):数据类型为DATADIM维稠密向量 
286-  image  =  paddle .layer .data (
287-  name = 'image' , type = paddle .data_type .dense_vector (DATADIM ))
288- 
289-  # 输出层,paddle.layer.fc表示全连接层,input=image: 该层输入数据为image 
290-  # size=1:神经元个数,act=paddle.activation.Sigmoid():激活函数为Sigmoid() 
291-  y_predict  =  paddle .layer .fc (
292-  input = image , size = 1 , act = paddle .activation .Sigmoid ())
293- 
294-  # 标签数据,paddle.layer.data表示数据层,name=’label’:名称为label 
295-  # type=paddle.data_type.dense_vector(1):数据类型为1维稠密向量 
296-  y_label  =  paddle .layer .data (
297-  name = 'label' , type = paddle .data_type .dense_vector (1 ))
298- 
299-  # 定义成本函数为交叉熵损失函数multi_binary_label_cross_entropy_cost 
300-  cost  =  paddle .layer .multi_binary_label_cross_entropy_cost (input = y_predict , label = y_label )
301- 
302-  # 利用cost创建parameters 
303-  parameters  =  paddle .parameters .create (cost )
304- 
305-  # 创建optimizer,并初始化momentum和learning_rate 
306-  optimizer  =  paddle .optimizer .Momentum (momentum = 0 , learning_rate = 0.00002 )
307- 
308-  # 数据层和数组索引映射,用于trainer训练时喂数据 
309-  feeding  =  {
310-  'image' : 0 ,
311-  'label' : 1 }
312- 
313-  data  =  [image , y_predict , y_label , cost , parameters , optimizer , feeding ]
314- 
315-  return  data 
316- 
317- 
318269def  main ():
319270 """ 
320271 定义神经网络结构,训练、预测、检验准确率并打印学习曲线 
@@ -323,13 +274,13 @@ def main():
323274 """ 
324275 global  DATADIM 
325276
326-  # 初始化,设置是否使用gpu,trainer数量 
327-  paddle .init (use_gpu = False , trainer_count = 1 )
328- 
329277 # 载入数据 
330278 load_data ()
331279
332-  # 配置网络结构 
280+  # 初始化,设置是否使用gpu,trainer数量 
281+  paddle .init (use_gpu = False , trainer_count = 1 )
282+ 
283+  # 配置网络结构和设置参数 
333284 image , y_predict , y_label , cost , parameters , optimizer , feeding  =  netconfig ()
334285
335286 # 记录成本cost 
0 commit comments