[Bài dịch] Tự tạo 1 mạng neural đơn giản

Mục lục

  1. Mục tiêu
  2. Tạo bộ dữ liệu ngẫu nhiên
  3. Xây dựng mạng neural đơn giản
  4. Huấn luyện mô hình
  5. Test độ chính xác
  6. Save và load mô hình
  7. Download Jupyter Notebook

Nguồn: https://pythontutorials.eu/deep-learning/basics/

Mục tiêu

Để xây dựng 1 mạng neural đơn giản thì mục tiêu cũng phải thật đơn giản: chúng ta xây dựng 1 mạng có khả năng phân loại các số trong khoảng [0:1], nếu nhỏ hơn 0.5 thì thuộc class 0 (category 0), ngược lại là class 1 (category 1).

Nói cách khác, chúng ta huấn luyện nó làm tròn các số thực trong khoảng [0:1].

Tạo bộ dữ liệu ngẫu nhiên

Chúng ta cần tạo trainset là mảng 2 chiều có 10.000 phần tử là số ngẫu nhiên trong khoảng [0:1]. Hàm np.random.random(10000) cho chúng ta mảng 1 chiều, do đó cần phải chuyển thành mảng 2 chiều.

Tiếp theo, chúng ta tạo 1 mảng 2 chiều chứa label bằng cách làm tròn số, label sẽ là 0 hoặc 1:

Xây dựng mạng neural đơn giản

Chúng ta cần xây dựng 1 mạng neural gồm 3 layer: 2 layer phải có là inputoutput, ở giữa là layer hidden nối giữa input và output. Input là 1 mảng chứa 1 số thực, output có thể là class 0 hoặc 1.

Hidden layer chúng ta chọn Dense (dày đặc) vì tất cả các nút (node) của layer này đều nối với các layer liền kề.

Bỏ qua layer input chúng ta có 2 layer Dense

units bạn có thể chọn là bội số của 2: 4, 8, 16,… Số càng cao thì càng chính xác nhưng training và predict sẽ chậm hơn do số kết nối giữa các layer sẽ nhiều hơn.

ReLU có công thức là f(x)=max(0,x), nếu input nhỏ hơn 0 thì trả về 0, nếu input lớn hơn hoặc bằng 0 thì trả về input.

Softmax tính toán xác suất xảy ra của một sự kiện, trong bài này là số input chỉ có thể thuộc class 0 hoặc 1. Tổng của các xác suất luôn bằng 1 và luôn dương, trong bài này xác suất số input thuộc class 0 là 50%, class 1 là 50%.

Với chức năng của ReLU và Softmax như vậy thì layer hidden có nhiệm vụ đảm bảo input sẽ là số luôn lớn hơn hoặc bằng 0. Layer Output sẽ tính toán xác suất số input thuộc về class nào.

Các tham số compile sẽ được viết ở 1 bài khác vì bài này cũng khá dài.

Huấn luyện mô hình (Training model)

Gọi hàm model.fit() để huấn luyện mạng neural vừa tạo

model.fit(x=data, y=labels, epochs=10, verbose=1)

10 epochs nghĩa là chạy 10 lần với cùng bộ dữ liệu. Verbose nhận vào 3 giá trị: 0, 1, 2. Verbose bằng 0 sẽ không in log khi huấn luyện, verbose bằng 1 sẽ in ra progress bar và đầy đủ thông tin, verbose bằng 2 sẽ in ra số epoch đã training được.

Test độ chính xác

Chúng ta tạo mảng 10 số từ 0 => 0.9 với bước nhảy là 0.1: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]. Kết quả mong muốn là 5 số đầu tiên thuộc class 0, 5 số cuối là class 1. Kết quả ra đúng 100% vì bài toán quá đơn giản.

Giải thích: kết quả là 10 mảng 2 chiều tương ứng với 10 số trong tập test. Trong mỗi phần tử thì số đầu tiên chỉ ra xác suất thuộc class 0 và số thứ 2 là xác suất thuộc class 1.

Save và load mô hình

Download Jupyter Notebook

https://github.com/thigiacmaytinh/TGMTpython/blob/main/basic_neural_network/basic_neural_network.ipynb