Trong bài tutorial Sử dụng Low-level APIs trong TensorFlow, chúng ta đã cùng làm quen với các khái niệm cơ bản trong TensorFlow và thực hành viết chương trình định nghĩa một TensorFlow Graph rồi chạy Graph này với tf.Session(). Trong bài tutorial này, chúng ta sẽ tiếp tục tìm hiểu về TensorFlow Layers (Mid-level APIs) và sử dụng chúng để xây dựng một mạng Neural network trong bài toán phân loại (Classification).

Như chúng ta đã biết, một mạng Neural Network thông thường gồm có Input Layer, Output Layer và các Hidden Layers. Mỗi một Layer lại có các thông số riêng (số lượng Node, activation function, weight matrix,..). Các thông số như Activation function (sigmoid function, tanh function, softmax, relu,..), số lượng Node, learning rates,.. của từng layer được thiết lập bởi người dùng (các thông số này được gọi là hyper-parameters) còn giá trị của weight matrix, bias sẽ được cập nhật trong quá trình huấn luyện (các thông số này gọi là parameters). Ở đây các bạn có thể hiểu đơn giản rằng hyper-parameters khác với parameters ở chỗ các parameters là do Model tự học còn hyper-parameters là do người dùng thiết lập. Giá trị của hyper-parameters quyết định giá trị của parameters cũng như độ chính xác của Model được huấn luyện. Thông thường chúng ta lựa chọn giá trị của hyper-parameters thông qua quá trình Hyper-parameters tuning ( ví dụ như Grid search, Random search, Bayesian optimization, Gradient-based optimization,..)

Trong TensorFlow việc xây dựng một mạng Neural Network có thể được thực hiện bằng cách sử dụng tf.layers. tf.layers cung cấp cho người dùng các loại Layers khác nhau như Conv1D, Conv2D (dùng trong Convolution Neural Network), Dense (thường dùng trong các dạng Neural Network thông thường như hình vẽ trên) , Flattern,…

Trong bài tutorial này, chúng ta sẽ sử dụng tf.layers.Dense để xây dựng một Neural Network với 4 layers (input layer, 2 hiden layer và output layer) và sử dụng Wine Dataset (sklearn) cho bài toán phân loại.

Trước hết, chúng ta sử dụng dòng lệnh sau để liệt kê các thông tin về Wine dataset:

Chúng ta có thể biết được một số thông tin cơ bản về dataset trong phần ‘DESCR’ như số lượng dữ liệu (178), số lượng và tên features (13), số lượng class (3), summary statistics (min, max, mean, SD). Ở đây, chúng ta sẽ trích xuất dữ liệu từ phần ‘data’ và giá trị của từng class ở phần ‘target’ (các classes này có giá trị là 0, 1 hoặc 2).

Để hiển thị dữ liệu một các trực quan hơn, ta có thể chuyển wine_data thành Pandas DataFrame với dòng code sau:

Như vây, ta thấy rằng giá trị của từng feature dao động trong các khoảng khác nhau (như mô tả trong phần summary statistics ở trên). Do đó ta cần phải thực hiện Data Normalization trước khi huấn luyện mô hình Deep learning để đảm bảo giá trị của tất cả các Features đều dao động trong một khoảng nhất định (ở đây cho chọn là khoảng [0, 1]). Công việc này được thực hiện bởi hàm preprocessing.MinMaxScaler() như sau: (Lưu ý: một số thuật toán Machine Learning như Decision Tree hoặc Random Forest không cần thực hiện Data Normalization):

Tiếp theo, chúng ta sẽ chia dataset ban đầu thành train set và test set bằng cách sử dụng hàm train_test_split() của sklearn với tỷ lệ train_set=80% và testset=20%.

Bây giờ, ta sẽ tiến hành việc xây dựng và huấn luyện Model. Trước hết chúng ta định nghĩa số lượng của từng Node tại mỗi hidden layer và xây dựng một mạng Neural Net với bốn layers như sau:

Lưu ý:

– Số lượng hidden layer và số lượng node trong mỗi hidden layer ở đây chỉ là một ví dụ minh họa. Thông thường, chúng ta cần phải thực hiện Hyper-parameters tunning để tìm giá trị tôt nhất cho các thông số này.

– float64 sẽ cho kết quả chính xác hơn float32 nhưng cần nhiều dung lượng và bộ nhớ hơn. Ở đây, chúng ta sử dụng float64 do dataset của chúng ta chỉ là 142 x 13.

Tiếp theo chúng ta cần tiến hành định nghĩa một hàm loss function. Hàm loss function giúp đánh giá độ chính xác giữa kết quả thực tế và kết quả do mô hình dự đoán, từ đó cập nhật các parameters (thông qua Optimization algorithms) của Model nhằm tạo ra Model tốt hơn. Trong ví dụ này chúng ta sẽ sử dụng cross entropy để định nghĩa hàm loss và sử dụng AdamOpimizer để cập nhật các parameters (nhằm giảm thiểu giá trị loss):

Sau khi xây dựng mô hình huấn luyện xong, chúng ta thực hiện việc tính độ chính xác của mô hình bằng cách so sánh giá trị dự đoán của mô hình với giá trị thực tế như sau:

Cuối cùng, ta tiến hành huấn luyện Model và tính độ chính xác của tưng Model trong quá trình huấn luyện như sau:

Ngoài ra, chúng ta có thể hiển thị giá trị của train_accuracy và test_accuracy dưới dạng biểu đồ như sau:

Lưu ý:

– Do train set của chúng ta chỉ có 142 samples nên trong quá trình huấn luyện, chúng ta không chia thành các batch với size nhỏ hơn.

– Thông thường với trainset và testset lớn thì khi epoch đạt đến một giá trị nhất định, train_accuracy sẽ gần đạt giá trị 1 nhưng test_accuracy lại giảm dần (do overfitting)

Như vậy, chúng ta đã hoàn thành việc xây dựng và huấn luyện một mô hình Deep learning sử dụng tf.Layers để giải quyết bài toán phân loại với Wine Dataset. Các bạn có thể tham khảo notebook của tutorial này tại đây.

Tháng Ba 25, 2019
ITechSeeker