[Khóa học tensorflow] Bài 3 – Xây dựng mô hình linear regression

This entry is part 4 of 6 in the series Thư viện Tensorflow

Chào tất cả các bạn, trong bài viết này Nguyễn Văn Hiếu Blog tiếp tục trình bày series về khóa học Tensorflow. Nếu bạn chưa nắm được thông tin tutorial này, bạn hãy xem bài viết giới thiệu trước tiên nhé. Bài đầu tiên sẽ mô tả chi tiết thông tin về khóa học này, các yêu cầu với người học, cài đặt môi trường và danh sách các bài học từ đầu đến cuối.

Bài học trước: Các toán tử cơ bản trong Tensorflow

Trong bài viết này, các nội dung sẽ được trình bày trong ví dụ xây dựng model linear regression với tensorflow

Toàn bộ source code của bài này các bạn có thể xem tại đây

Mình xin 5 phút quảng cáo nha =))

Xây dựng mô hình Linear regression sử dụng Tensorflow

Để các bạn dễ hình dung với bài toán, ta có thể xét bài toán thực tế như sau: Bạn có một tập dữ liệu thể hiện giá của căn hộ(y) và diện tích của căn hộ đó(x). Và công việc chúng ta cần làm là làm sao ta có thể dự đoán giá của một căn hộ bất kỳ khi biết diện tích của nó.

Trong phần này, để cho đơn giản mình sẽ sử dụng một tập dữ liệu mà trong đó mỗi điểm dữ liệu gồm 2 giá trị x và y. Ta cần đi tìm hàm y = W * x + b biểu diễn mối liên hệ giữa x và y dựa trên tệp dữ liệu này. Mục tiêu là khi có x mới, chúng ta có thể tìm/dự đoán y thông qua biểu diễn này.

Đây là biểu diễn của dữ liệu huấn luyện trên không gian 2 chiều.

Biểu diễn của dữ liệu trên hệ tọa độ
Biểu diễn của dữ liệu trên hệ tọa độ

Nào, hãy cùng bắt tay vào bước thứ nhất: xây dựng/định nghĩa Graph.

Xây dựng Graph

Việc đầu tiên cần làm là import các thư viện cần thiết

Tập dữ liệu của chúng ta, bạn có thể dùng dữ liệu của riêng bạn nhé ^^.

Ok, bây giờ chúng ta cần tạo hai cái thùng rỗng sử dụng tf.placeholder trong đó X là dữ liệu và Y là nhãn của dữ liệu. Lát nữa sẽ truyền vào X_train và Y_train tương ứng trong session.

Việc sử dụng placeholder ở đây sẽ giúp ta có thể truyền vào các mẫu dữ liệu huấn luyện khác nhau. Các bạn có thể hình dung nó giống như việc truyền tham số vào hàm, viết 1 lần và dùng được nhiều lần

Linear model của chúng ta sẽ có dạng y = w * x + b. Trong đó w và b là 2 tham số ta cần tìm. Hai tham số này sẽ thay đổi để tối ưu mất mát trong quá trình huấn luyện. Do đó, chúng ta sẽ khai báo chúng sử dụng tf.Variable và khởi tạo hai biến này bằng 0.

Khi đó, ta sẽ có model dự đoán như sau

Để biết w và b của chúng ta đã thực sự tốt chưa? Chúng ta cần đánh giá thông qua một hàm được gọi là loss/cost function – hàm mất mát. Hàm mất mát của chúng ta sẽ được đánh giá bằng bình phương độ chênh lệch giữa kết quả thực tế và kết quả dự đoán

Mục tiêu của chúng ta là tìm w và b sao cho loss cực tiểu. Ở đây, tôi sẽ dùng GradientDescentOptimizer của TF để cực tiểu hóa hàm loss.

Nếu bạn muốn ghi lại đồ thị của TF vừa xây dựng và xem trên tensorboard. Hãy thêm dòng lệnh này trước session

Thực thi trên Graph

Việc định nghĩa Graph tới đây coi như là hoàn thành, bước thứ 2 là thực thi tính toán trên graph vừa xây dựng.

Chúng ta cần khởi tạo 1 Session và khởi tạo các Variable trước khi thực thi. Chúng ta sẽ run operation optimizer đồng thời tính toán giá trị loss để theo dõi sự thay đổi. Do việc run optimizer phụ thuộc vào 2 placeholder là XY nên ta cần truyền vào trong quá trình run: sess.run([optimizer, loss], feed_dict={X: x, Y: y})

Ở đây, chúng ta sẽ chạy trong 100 epoch với batch_size là 1(đưa lần lượt từng mẫu huấn luyện vào)

Chúng ta có thể thấy giá trị loss có xu hướng giảm dần sau mỗi epoch

Như chúng ta thấy, giá trị mất mát là tương đối nhỏ. Chứng tỏ model của chúng ta hoạt động không tồi. Sau khi train xong bạn có thể lấy giá trị w và b bằng cách sau:

Lưu ý: Vẫn thực thi lệnh này trong session nhé.

Lấy kết quả dự đoán của tất cả các mẫu huấn luyện

Bạn có thể so sánh kết quả dự đoán(bên trái) và kết quả thực tế(bên phải):

Biểu diễn của model sử dụng thư viện matplotlib

Biểu diễn kết quả dự đoán của mô hình
Biểu diễn kết quả dự đoán của mô hình

Còn đây là hình ảnh model của chúng ta trên tensorboard.

Biểu diễn graph trên tensorboard
Biểu diễn graph trên tensorboard

Để xem được thì bạn chỉ cần chạy lệnh này trên Terminal, Powershell. Sau khi chạy xong thì truy cập vào địa chỉ được in ra trên terminal.

Bài tiếp theo: Xây dựng mô hình logistic regression sử dụng Tensorflow

 

Series Navigation<< [Khóa học tensorflow] Bài 2 – Các toán tử cơ bản trong Tensorflow[Khóa học tensorflow] Bài 4 – Xây dựng mô hình logistic regression >>
avatar
4 Comment threads
4 Thread replies
1 Followers
 
Most reacted comment
Hottest comment thread
5 Comment authors
Huỳnh HuyNguyễn Văn HiếuLê Quang ThànhQuốc SơnHiếu Nguyễn Recent comment authors
  Subscribe  
newest oldest most voted
Notify of
Quốc Sơn
Guest
Quốc Sơn

kết quả dự đoán lệch khá nhiều so với dữ liệu thực, vậy có cách nào tối ưu hơn model linear regression trong bài toán này không Hiếu 😀

Hiếu Nguyễn
Guest
Hiếu Nguyễn

Mô hình này rất nhạy cảm với nhiễu. Hình cuối của bài viết cho thấy model hoạt động khá là tốt đó bạn.
Lưu ý: linear regression chỉ output ra một đường linear(thẳng) thôi ạ

Quốc Sơn
Guest
Quốc Sơn

tks hiếu!

Guest
Guest
Guest
Lê Quang Thành
Guest
Lê Quang Thành

“Trong phần này, để cho đơn giản mình sẽ sử dụng một tập dữ liệu mà trong đó mỗi điểm dữ liệu gồm 2 giá trị x và y. Ta cần đi tìm hàm y = W * x + b biểu diễn mối liên hệ giữa x và y dựa trên tệp dữ liệu này. Mục tiêu là khi có x mới, chúng ta có thể tìm/dự đoán y thông qua biểu diễn này.”

Sao bạn biết quan hệ của 2 dữ liệu này là tuyến tính mà chọn ngay y = W * x + b ???

Huỳnh Huy
Guest
Huỳnh Huy

Chào anh,
Em đã thử debug các kiểu nhưng ví dụ em muốn xuất ra giá trị Y_predicted mỗi lần tính thì không có cách nào hết? Xin anh chỉ giáo ạ!

Huỳnh Huy
Guest
Huỳnh Huy

Ý em là Y_predicted của mỗi dòng này _, _loss = sess.run([optimizer, loss], feed_dict={X: x, Y: y})
Nếu tính lại như anh ghi ở đoạn cuối thì nó sẽ tốn thêm chi phí (vì nó đã tính rồi trong loss) (nhưng em không pk cách xuất nó ra)