Mục lục
- Mục tiêu
- Tạo bộ dữ liệu ngẫu nhiên
- Xây dựng mạng neural đơn giản
- Huấn luyện mô hình
- Test độ chính xác
- Save và load mô hình
- 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.
1 2 3 4 5 |
import numpy as np data = np.random.random(10000) data.shape = 10000, 1 print(data[:5]) # Look at the first five observations |
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:
1 2 |
labels = np.array(data >= .5, dtype=int) print(labels[:5]) # Look at the first five labels |
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à input và output, ở 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
from keras import Sequential from keras.layers import Dense model = Sequential([ Dense(units=8, input_shape=(1,), activation='relu'), Dense(units=2, activation='softmax'), ]) model.compile( optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'] ) model.summary() |
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
1 2 3 |
import keras model.save('simple_model.keras') model = keras.models.load_model('simple_model.keras') |