Skip to content

Commit 4db41f0

Browse files
Star WeStar We
authored andcommitted
修改2,3,4,5,8章节结构和头文件描述
1 parent 9271179 commit 4db41f0

File tree

10 files changed

+269
-414
lines changed

10 files changed

+269
-414
lines changed

lesson2/costs.png

15 KB
Loading

lesson2/train_with_paddle.py

Lines changed: 39 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,17 @@
1111
1212
使用paddlepaddle来做线性回归,拟合房屋价格与房屋面积的线性关系,具体步骤如下:
1313
1.载入数据和预处理:load_data()
14-
2.定义两个reader()分别用于读取训练数据和测试数据
14+
2.定义train()和test()用于读取训练数据和测试数据,分别返回一个reader
1515
3.初始化
16-
4.配置网络结构
17-
5.定义成本函数cost
18-
6.定义优化器optimizer
19-
7.定义trainer并开始训练,获得训练结果参数a,b
16+
4.配置网络结构和设置参数:
17+
- 定义成本函数cost
18+
- 创建parameters
19+
- 定义优化器optimizer
20+
5.定义event_handler
21+
6.定义trainer
22+
7.开始训练
23+
8.打印参数和结果print_parameters()
24+
9.展示学习曲线plot_costs()
2025
"""
2126
import numpy as np
2227
import paddle.v2 as paddle
@@ -40,23 +45,24 @@ def load_data(filename, feature_num=2, ratio=0.8):
4045
ratio -- 训练集占总数据集比例
4146
Return:
4247
"""
43-
#如果测试数据集和训练数据集都不为空,就不再载入数据load_data
48+
# 如果测试数据集和训练数据集都不为空,就不再载入数据load_data
4449
global CODEMASTER_TRAIN_DATA, CODEMASTER_TEST_DATA, X_RAW
4550
if CODEMASTER_TRAIN_DATA is not None and CODEMASTER_TEST_DATA is not None:
4651
return
47-
#data = np.loadtxt()表示将数据载入后以矩阵或向量的形式存储在data中
48-
#delimiter=',' 表示以','为分隔符
52+
# data = np.loadtxt()表示将数据载入后以矩阵或向量的形式存储在data中
53+
# delimiter=',' 表示以','为分隔符
4954
data = np.loadtxt(filename, delimiter=',')
5055
X_RAW = data.T[0].copy()
51-
#axis=0 表示按列计算
52-
#data.shape[0]表示data中一共多少列
56+
# axis=0 表示按列计算
57+
# data.shape[0]表示data中一共多少列
5358
maximums, minimums, avgs = data.max(axis=0), data.min(axis=0), data.sum(
5459
axis=0) / data.shape[0]
5560

56-
#归一化,data[:, i] 表示第i列的元素
61+
# 归一化,data[:, i] 表示第i列的元素
5762
for i in xrange(feature_num - 1):
5863
data[:, i] = (data[:, i] - avgs[i]) / (maximums[i] - minimums[i])
59-
#offset用于划分训练数据集和测试数据集,例如0.8表示训练集占80%
64+
65+
# offset用于划分训练数据集和测试数据集,例如0.8表示训练集占80%
6066
offset = int(data.shape[0] * ratio)
6167
CODEMASTER_TRAIN_DATA = data[:offset].copy()
6268
CODEMASTER_TEST_DATA = data[offset:].copy()
@@ -114,24 +120,6 @@ def test():
114120
return read_data(CODEMASTER_TEST_DATA)
115121

116122

117-
# 展示模型训练曲线
118-
def plot_costs(costs):
119-
"""
120-
利用costs展示模型的训练曲线
121-
122-
Args:
123-
costs -- 记录了训练过程的cost变化的list,每一百次迭代记录一次
124-
Return:
125-
"""
126-
costs = np.squeeze(costs)
127-
plt.plot(costs)
128-
plt.ylabel('cost')
129-
plt.xlabel('iterations (per hundreds)')
130-
plt.title("House Price Distributions of Beijing Beiyuan Area")
131-
plt.show()
132-
plt.savefig('costs.png')
133-
134-
135123
#配置网络结构
136124
def netconfig():
137125
"""
@@ -159,7 +147,7 @@ def netconfig():
159147
y = paddle.layer.data(name='y', type=paddle.data_type.dense_vector(1))
160148

161149
# 定义成本函数为均方差损失函数square_error_cost
162-
cost = paddle.layer.square_error_cost(input=y_predict, label=y)
150+
cost = paddle.layer.mse_cost(input=y_predict, label=y)
163151

164152
# 利用cost创建parameters
165153
parameters = paddle.parameters.create(cost)
@@ -175,6 +163,24 @@ def netconfig():
175163
return data
176164

177165

166+
# 展示模型训练曲线
167+
def plot_costs(costs):
168+
"""
169+
利用costs展示模型的训练曲线
170+
171+
Args:
172+
costs -- 记录了训练过程的cost变化的list,每一百次迭代记录一次
173+
Return:
174+
"""
175+
costs = np.squeeze(costs)
176+
plt.plot(costs)
177+
plt.ylabel('cost')
178+
plt.xlabel('iterations (per hundreds)')
179+
plt.title("House Price Distributions of Beijing Beiyuan Area")
180+
plt.show()
181+
plt.savefig('costs.png')
182+
183+
178184
# 输出参数结果
179185
def print_parameters(parameters):
180186
"""
@@ -210,9 +216,7 @@ def main():
210216
# 初始化,设置是否使用gpu,trainer数量
211217
paddle.init(use_gpu=False, trainer_count=1)
212218

213-
214-
215-
# 配置网络结构
219+
# 配置网络结构和设置参数
216220
x, y_predict, y, cost, parameters, optimizer, feeding = netconfig()
217221

218222
# 记录成本cost
@@ -263,7 +267,7 @@ def event_handler(event):
263267
# 打印参数结果
264268
print_parameters(parameters)
265269

266-
#展示学习曲线
270+
# 展示学习曲线
267271
plot_costs(costs)
268272

269273
if __name__ == '__main__':

lesson3/costs.png

-766 Bytes
Loading

lesson3/train_with_paddle.py

Lines changed: 71 additions & 120 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,17 @@
1111
1212
使用paddle框架实现逻辑回归识别猫案例,关键步骤如下:
1313
1.载入数据和预处理: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

2227
import 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()
7177
def 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
121175
def 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+
# 计算准确度
171201
def 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
# 预测
225224
def 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-
318269
def 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

lesson4/costs.png

-4.03 KB
Loading

0 commit comments

Comments
 (0)