-
Tuần 1 - Ngày 10 tháng 7 năm 2019
- Giới thiệu về khóa học
- Hướng dẫn viết chương trình Python trên web
- Hướng dẫn sử dụng PyCharm
- Tổng quan về Python
- Kỹ năng sử dụng Google search
- Viết tài liệu kỹ thuật dùng Markdown
- Hàm xây dựng sẵn trong Python – math và random
- Cài đặt các công thức toán cơ bản
- Xây dựng hàm trong python
- Điều kiện if-else
- Những lỗi thường gặp trong Python
- Reading assignment
-
Tuần 2 - Ngày 17 tháng 7 năm 2019
-
Tuần 3 - Ngày 24 tháng 7 năm 2019
-
Tuần 4 - Ngày 31 tháng 7 năm 2019
-
Tuần 5 - Ngày 7 tháng 8 năm 2019
-
Advanced Python
-
Tuần 6 - Ngày 14 tháng 8 năm 2019
-
Tuần 7 - Ngày 28 tháng 8 năm 2019
-
Tuần 8
-
Tuần 9
Dùng tf.keras cho bài toán regression
Trong bài này, chúng ta sẽ dùng tf.keras để huấn luyện các mô hình regression và classification. Ở bài trước, chúng ta đã biết cách đọc dữ liệu và xây dựng các mô hình trong Tensorflow. Các bước quan trọng khác như tính loss, tính đạo hàm và cập nhập giá trị trọng số dùng backpropagation và stochastic gradient descent chúng ta sẽ thảo luận trong bài học này.
Trong Tensorflow, thực hiện các bước trên chỉ bằng dòng lệnh sau
model.compile(optimizer=?, loss=?)
Hàm compile() khai báo loại optimizer muốn sử dụng và cách thức tính giá trị loss. Dấu ? ở code trên là chỗ để chúng ta xác đinh loại optimizer và các tính loss cụ thể nào đó. Các bạn vào 2 đường link sau để biết các loại optimizer và loss mà Tensorflow hỗ trợ.
https://www.tensorflow.org/api_docs/python/tf/keras/optimizers/
https://www.tensorflow.org/api_docs/python/tf/keras/losses
Ví dụ chúng ta muốn dùng stochastic gradient descent và mean squared error, chúng ta khai báo như sau
model.compile(optimizer=tf.keras.optimizers.SGD(), loss=tf.keras.losses.MeanAbsoluteError())
Để huấn luyện một mô hình, chúng ta dùng hàm model.fit() nhận vào dữ liệu đặc trưngX, label y, và số epoch. Ví dụ, dòng code để huấn luyện mô hình với 100 epoch như sau
model.fit(X, y, epochs=100)
Ngoài ra, tham số verbose được dùng để xem thông tin loss và accuracy trong quá trình huấn luyện.
Áp dụng cho bài toán dự đoán doanh thu
Dữ liệu dự đoán doanh thu dựa vào số tiền cho quảng cáo được thể hiện ở bảng sau
TV | Radio | Newspaper | Sales |
---|---|---|---|
230.1 | 37.8 | 69.2 | 22.1 |
44.5 | 39.3 | 45.1 | 10.4 |
17.2 | 45.9 | 69.3 | 12 |
151.5 | 41.3 | 58.5 | 16.5 |
180.8 | 10.8 | 58.4 | 17.9 |
8.7 | 48.9 | 75 | 7.2 |
57.5 | 32.8 | 23.5 | 11.8 |
120.2 | 19.6 | 11.6 | 13.2 |
8.6 | 2.1 | 1 | 4.8 |
199.8 | 2.6 | 21.2 | 15.6 |
66.1 | 5.8 | 24.2 | 12.6 |
214.7 | 24 | 4 | 17.4 |
23.8 | 35.1 | 65.9 | 9.2 |
97.5 | 7.6 | 7.2 | 13.7 |
204.1 | 32.9 | 46 | 19 |
195.4 | 47.7 | 52.9 | 22.4 |
67.8 | 36.6 | 114 | 12.5 |
281.4 | 39.6 | 55.8 | 24.4 |
69.2 | 20.5 | 18.3 | 11.3 |
147.3 | 23.9 | 19.1 | 14.6 |
218.4 | 27.7 | 53.4 | 18 |
237.4 | 5.1 | 23.5 | 17.5 |
13.2 | 15.9 | 49.6 | 5.6 |
228.3 | 16.9 | 26.2 | 20.5 |
62.3 | 12.6 | 18.3 | 9.7 |
262.9 | 3.5 | 19.5 | 17 |
142.9 | 29.3 | 12.6 | 15 |
240.1 | 16.7 | 22.9 | 20.9 |
248.8 | 27.1 | 22.9 | 18.9 |
70.6 | 16 | 40.8 | 10.5 |
292.9 | 28.3 | 43.2 | 21.4 |
112.9 | 17.4 | 38.6 | 11.9 |
97.2 | 1.5 | 30 | 13.2 |
265.6 | 20 | 0.3 | 17.4 |
95.7 | 1.4 | 7.4 | 11.9 |
290.7 | 4.1 | 8.5 | 17.8 |
266.9 | 43.8 | 5 | 25.4 |
74.7 | 49.4 | 45.7 | 14.7 |
43.1 | 26.7 | 35.1 | 10.1 |
228 | 37.7 | 32 | 21.5 |
202.5 | 22.3 | 31.6 | 16.6 |
177 | 33.4 | 38.7 | 17.1 |
293.6 | 27.7 | 1.8 | 20.7 |
206.9 | 8.4 | 26.4 | 17.9 |
25.1 | 25.7 | 43.3 | 8.5 |
175.1 | 22.5 | 31.5 | 16.1 |
89.7 | 9.9 | 35.7 | 10.6 |
239.9 | 41.5 | 18.5 | 23.2 |
227.2 | 15.8 | 49.9 | 19.8 |
66.9 | 11.7 | 36.8 | 9.7 |
199.8 | 3.1 | 34.6 | 16.4 |
100.4 | 9.6 | 3.6 | 10.7 |
216.4 | 41.7 | 39.6 | 22.6 |
182.6 | 46.2 | 58.7 | 21.2 |
262.7 | 28.8 | 15.9 | 20.2 |
198.9 | 49.4 | 60 | 23.7 |
7.3 | 28.1 | 41.4 | 5.5 |
136.2 | 19.2 | 16.6 | 13.2 |
210.8 | 49.6 | 37.7 | 23.8 |
210.7 | 29.5 | 9.3 | 18.4 |
53.5 | 2 | 21.4 | 8.1 |
261.3 | 42.7 | 54.7 | 24.2 |
239.3 | 15.5 | 27.3 | 20.7 |
102.7 | 29.6 | 8.4 | 14 |
131.1 | 42.8 | 28.9 | 16 |
69 | 9.3 | 0.9 | 11.3 |
31.5 | 24.6 | 2.2 | 11 |
139.3 | 14.5 | 10.2 | 13.4 |
237.4 | 27.5 | 11 | 18.9 |
216.8 | 43.9 | 27.2 | 22.3 |
199.1 | 30.6 | 38.7 | 18.3 |
109.8 | 14.3 | 31.7 | 12.4 |
26.8 | 33 | 19.3 | 8.8 |
129.4 | 5.7 | 31.3 | 11 |
213.4 | 24.6 | 13.1 | 17 |
16.9 | 43.7 | 89.4 | 8.7 |
27.5 | 1.6 | 20.7 | 6.9 |
120.5 | 28.5 | 14.2 | 14.2 |
5.4 | 29.9 | 9.4 | 5.3 |
116 | 7.7 | 23.1 | 11 |
76.4 | 26.7 | 22.3 | 11.8 |
239.8 | 4.1 | 36.9 | 17.3 |
75.3 | 20.3 | 32.5 | 11.3 |
68.4 | 44.5 | 35.6 | 13.6 |
213.5 | 43 | 33.8 | 21.7 |
193.2 | 18.4 | 65.7 | 20.2 |
76.3 | 27.5 | 16 | 12 |
110.7 | 40.6 | 63.2 | 16 |
88.3 | 25.5 | 73.4 | 12.9 |
109.8 | 47.8 | 51.4 | 16.7 |
134.3 | 4.9 | 9.3 | 14 |
28.6 | 1.5 | 33 | 7.3 |
217.7 | 33.5 | 59 | 19.4 |
250.9 | 36.5 | 72.3 | 22.2 |
107.4 | 14 | 10.9 | 11.5 |
163.3 | 31.6 | 52.9 | 16.9 |
197.6 | 3.5 | 5.9 | 16.7 |
184.9 | 21 | 22 | 20.5 |
289.7 | 42.3 | 51.2 | 25.4 |
135.2 | 41.7 | 45.9 | 17.2 |
222.4 | 4.3 | 49.8 | 16.7 |
296.4 | 36.3 | 100.9 | 23.8 |
280.2 | 10.1 | 21.4 | 19.8 |
187.9 | 17.2 | 17.9 | 19.7 |
238.2 | 34.3 | 5.3 | 20.7 |
137.9 | 46.4 | 59 | 15 |
25 | 11 | 29.7 | 7.2 |
90.4 | 0.3 | 23.2 | 12 |
13.1 | 0.4 | 25.6 | 5.3 |
255.4 | 26.9 | 5.5 | 19.8 |
225.8 | 8.2 | 56.5 | 18.4 |
241.7 | 38 | 23.2 | 21.8 |
175.7 | 15.4 | 2.4 | 17.1 |
209.6 | 20.6 | 10.7 | 20.9 |
78.2 | 46.8 | 34.5 | 14.6 |
75.1 | 35 | 52.7 | 12.6 |
139.2 | 14.3 | 25.6 | 12.2 |
76.4 | 0.8 | 14.8 | 9.4 |
125.7 | 36.9 | 79.2 | 15.9 |
19.4 | 16 | 22.3 | 6.6 |
141.3 | 26.8 | 46.2 | 15.5 |
18.8 | 21.7 | 50.4 | 7 |
224 | 2.4 | 15.6 | 16.6 |
123.1 | 34.6 | 12.4 | 15.2 |
229.5 | 32.3 | 74.2 | 19.7 |
87.2 | 11.8 | 25.9 | 10.6 |
7.8 | 38.9 | 50.6 | 6.6 |
80.2 | 0 | 9.2 | 11.9 |
220.3 | 49 | 3.2 | 24.7 |
59.6 | 12 | 43.1 | 9.7 |
0.7 | 39.6 | 8.7 | 1.6 |
265.2 | 2.9 | 43 | 17.7 |
8.4 | 27.2 | 2.1 | 5.7 |
219.8 | 33.5 | 45.1 | 19.6 |
36.9 | 38.6 | 65.6 | 10.8 |
48.3 | 47 | 8.5 | 11.6 |
25.6 | 39 | 9.3 | 9.5 |
273.7 | 28.9 | 59.7 | 20.8 |
43 | 25.9 | 20.5 | 9.6 |
184.9 | 43.9 | 1.7 | 20.7 |
73.4 | 17 | 12.9 | 10.9 |
193.7 | 35.4 | 75.6 | 19.2 |
220.5 | 33.2 | 37.9 | 20.1 |
104.6 | 5.7 | 34.4 | 10.4 |
96.2 | 14.8 | 38.9 | 12.3 |
140.3 | 1.9 | 9 | 10.3 |
240.1 | 7.3 | 8.7 | 18.2 |
243.2 | 49 | 44.3 | 25.4 |
38 | 40.3 | 11.9 | 10.9 |
44.7 | 25.8 | 20.6 | 10.1 |
280.7 | 13.9 | 37 | 16.1 |
121 | 8.4 | 48.7 | 11.6 |
197.6 | 23.3 | 14.2 | 16.6 |
171.3 | 39.7 | 37.7 | 16 |
187.8 | 21.1 | 9.5 | 20.6 |
4.1 | 11.6 | 5.7 | 3.2 |
93.9 | 43.5 | 50.5 | 15.3 |
149.8 | 1.3 | 24.3 | 10.1 |
11.7 | 36.9 | 45.2 | 7.3 |
131.7 | 18.4 | 34.6 | 12.9 |
172.5 | 18.1 | 30.7 | 16.4 |
85.7 | 35.8 | 49.3 | 13.3 |
188.4 | 18.1 | 25.6 | 19.9 |
163.5 | 36.8 | 7.4 | 18 |
117.2 | 14.7 | 5.4 | 11.9 |
234.5 | 3.4 | 84.8 | 16.9 |
17.9 | 37.6 | 21.6 | 8 |
206.8 | 5.2 | 19.4 | 17.2 |
215.4 | 23.6 | 57.6 | 17.1 |
284.3 | 10.6 | 6.4 | 20 |
50 | 11.6 | 18.4 | 8.4 |
164.5 | 20.9 | 47.4 | 17.5 |
19.6 | 20.1 | 17 | 7.6 |
168.4 | 7.1 | 12.8 | 16.7 |
222.4 | 3.4 | 13.1 | 16.5 |
276.9 | 48.9 | 41.8 | 27 |
248.4 | 30.2 | 20.3 | 20.2 |
170.2 | 7.8 | 35.2 | 16.7 |
276.7 | 2.3 | 23.7 | 16.8 |
165.6 | 10 | 17.6 | 17.6 |
156.6 | 2.6 | 8.3 | 15.5 |
218.5 | 5.4 | 27.4 | 17.2 |
56.2 | 5.7 | 29.7 | 8.7 |
287.6 | 43 | 71.8 | 26.2 |
253.8 | 21.3 | 30 | 17.6 |
205 | 45.1 | 19.6 | 22.6 |
139.5 | 2.1 | 26.6 | 10.3 |
191.1 | 28.7 | 18.2 | 17.3 |
286 | 13.9 | 3.7 | 20.9 |
18.7 | 12.1 | 23.4 | 6.7 |
39.5 | 41.1 | 5.8 | 10.8 |
75.5 | 10.8 | 6 | 11.9 |
17.2 | 4.1 | 31.6 | 5.9 |
166.8 | 42 | 3.6 | 19.6 |
149.7 | 35.6 | 6 | 17.3 |
38.2 | 3.7 | 13.8 | 7.6 |
94.2 | 4.9 | 8.1 | 14 |
177 | 9.3 | 6.4 | 14.8 |
283.6 | 42 | 66.2 | 25.5 |
232.1 | 8.6 | 8.7 | 18.4 |
Ba cột đầu là đặc trưng và cột cuối là label. Đọc dữ liệu và chuẩn hóa được thực hiện như sau
# dataset import numpy as np from numpy import genfromtxt import matplotlib.pyplot as plt data = genfromtxt('advertising.csv', delimiter=',', skip_header=1) m = data.shape[0] X = data[:,:3] y = data[:,3] maxi = np.max(X) mini = np.min(X) avg = np.mean(X) X = (X-avg) / (maxi-mini)
Thiết kế mô hình và khai báo optimizer và loss như sau
import tensorflow as tf model = tf.keras.Sequential([ tf.keras.layers.Dense(units=1, input_shape=[3]) ]) model.compile(optimizer=tf.keras.optimizers.SGD(0.05), loss=tf.keras.losses.MeanAbsoluteError()) # model model.summary()
Ở đây, chúng ta sử dùng SGD với learning_rate = 0.05
, và tính loss theo mean absolute error. Mọi thứ đã sẵn sàng cho việc huấn luyện mô hình. Chúng ta sẽ huấn luyện với số epoch=1000 và cho verbose=0 (không in gì ra trong quá trình huấn luyện) như sau
history = model.fit(X, y, epochs=1000, verbose=0) print(type(history.history)) print(model.layers[0].weights) import matplotlib.pyplot as plt plt.plot(history.history['loss'], color="r") plt.show()
Output của hàm model.fit()
là đối tượng history, trong đó biến history.history
là một dictionary
có key là 'loss'
, chứa các giá trị loss trong quá trình huấn luyện. Ngoài ra, chúng ta có thể lấy ra được các giá trị trọng số của layer với dòng lệnh model.layers[0].weights
.
Kết quả giá trị loss cho 1000 epoch như sau
Áp dụng cho bài toán dự đoán giá nhà
Bộ dữ liệu giá nhà Boston có 13 đặc trưng với 506 mẫu dữ liệu, được đọc từ hàm xây dựng sẵn trong Tensorflow như sau
import tensorflow as tf from tensorflow import keras import numpy as np boston_housing = keras.datasets.boston_housing (train_data, train_labels), (test_data, test_labels) = boston_housing.load_data() # Shuffle the training set order = np.argsort(np.random.random(train_labels.shape)) train_data = train_data[order] train_labels = train_labels[order] #Training set: (404, 13) print("Training set: {}".format(train_data.shape)) #Testing set: (102, 13) print("Testing set: {}".format(test_data.shape)) # calculating the mean and std. mean = train_data.mean(axis=0) std = train_data.std(axis=0) # normalize data train_data = (train_data - mean) / std test_data = (test_data - mean) / std
Dữ liệu ban đầu được đọc từ hàm load_data()
. Sau đó, các mẫu dữ liệu được hoán đổi vị trí một cách ngẫu nhiên và cuối cùng được chuẩn hóa.
Tiếp theo chúng ta cần xây dựng model cho bài toán dự đoán giá nhà. Đây là bài toán regression, nên layer cuối cùng không dùng thêm hàm sigmoid hay softmax. Ở phần này, chúng ta sẽ thiết kế một mô hình nhiều layer cho bài toán regression. Chúng sẽ sẽ tạo mô hình MLP với 2 hidden layer và mỗi hidden layer có 64 node. Hàm activation ReLU được dùng ở 2 hidden layer. Code cho xây dựng model và hàm compile như sau
# model model = keras.Sequential([ keras.layers.Dense(64, activation=tf.nn.relu, input_shape=(train_data.shape[1],)), keras.layers.Dense(64, activation=tf.nn.relu), keras.layers.Dense(1) ]) # compile loss = tf.keras.losses.MeanSquaredError() optimizer=tf.keras.optimizers.RMSprop() metric = tf.keras.losses.MeanAbsoluteError() model.compile(loss=loss, optimizer=optimizer, metrics=[metric]) model.summary()
Ở đây, hàm compile dùng thêm tham số metrics để xác định các tính độ chính xác của mô hình. Tham số metrics khác với loss, cái được dùng để tính đạo hàm trong backpropagation. Đôi khi loss và metrics cùng có chung cách tính, tùy thuộc vào bài toán regression hay classification. Optimizer RMSprop được dùng để cập nhật các trọng số trong quá trình huấn luyện.
Bài tập: Các bạn hãy tìm hiểu cách thức hoạt động của RMSprop và điểm cải tiến so với SGD. Các bạn có thể tìm hiểu chi tiết hơn về RMSprop ở link sau https://www.tensorflow.org/api_docs/python/tf/keras/optimizers/RMSprop
Bước kế tiếp là huấn luyện mô hình đã được xây dựng ở trên. Hàm model.fit() cho phép chúng ta chia dữ liệu training thành 2 phần (dữ liệu training và validation). Điều này giúp chúng ta hiểu sâu hơn quá trình huấn luyện mô hình. Chúng ta sẽ dùng 20% dữ liệu training cho phần validation như sau
# train model history = model.fit(train_data, train_labels, epochs=100, validation_split=0.2, verbose=0) import matplotlib.pyplot as plt plt.figure() plt.xlabel('Epoch') plt.ylabel('Mean Abs Error [1000$]') plt.plot(history.epoch, np.array(history.history['loss']), label='Train Loss') plt.plot(history.epoch, np.array(history.history['val_loss']), label = 'Val loss') plt.legend()
Giá trị loss của dữ liệu training và validation trong quá trình huấn luyện được trình bày ở hình sau
Sau khi huấn luyện mô hình xong, chúng ta có thể dùng mô hình này để tính giá nhà dự đoán cho dữ liệu testing như sau
Biến test_predictions
là mảng numpy, và bạn có thể dùng dữ liệu này để trình bày hay so sánh với label data.