Như đã tìm hiểu ở bài trước, các lớp Keras là khối xây dựng chính của các mô hình Keras. Mỗi lớp nhận thông tin đầu vào, thực hiện một số tính toán và cuối cùng xuất ra thông tin đã được biến đổi. Đầu ra của một lớp sẽ chảy vào lớp tiếp theo làm đầu vào của nó. Ta sẽ tìm hiểu kỹ càng hơn trong bài này nhé
1. Giới thiệu :
Một lớp Keras yêu cầu shape(hình dạng) đầu vào (input_shape) để hiểu cấu trúc của dữ liệu đầu vào, bộ khởi tạo để đặt trọng số(weight) cho mỗi đầu vào và cuối cùng là các bộ kích hoạt(activation funtion) để biến đổi đầu ra để làm cho nó phi tuyến tính. Ở giữa, các ràng buộc hạn chế và chỉ định phạm vi mà trọng số của dữ liệu đầu vào sẽ được tạo ra và bộ điều chỉnh sẽ cố gắng tối ưu hóa lớp (và mô hình) bằng cách áp dụng động các hình phạt đối với các trọng số trong quá trình tối ưu hóa.
Tóm lại, lớp Keras yêu cầu các chi tiết tối thiểu dưới đây để tạo một lớp hoàn chỉnh.
- Hình dạng dữ liệu đầu vào
- Số lượng neurons / đơn vị trong lớp
- Khởi tạo
- Regularizers(Bộ điều chỉnh)
- Constraints(Ràng buộc)
- Activations (Kích hoạt)
Ta cùng tìm hiểu khái niệm cơ bản trong bài tiếp theo. Trước khi hiểu khái niệm cơ bản, ta hãy tạo một lớp Keras đơn giản bằng cách sử dụng API mô hình tuần tự để có ý tưởng về cách hoạt động của mô hình và lớp Keras.
from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers
from keras import regularizers
from keras import constraints
model = Sequential()
model.add(Dense(32, input_shape=(16,), kernel_initializer = 'he_uniform',
kernel_regularizer = None, kernel_constraint = 'MaxNorm', activation = 'relu'))
model.add(Dense(16, activation = 'relu'))
model.add(Dense(8))
Giải thích code :
- Dòng 1-5 imports các mô đun cần thiết.
- Dòng 7 Tạo model mới sử dụng Sequential API.
- Dòng 9 Tạo lớp Dense mới và thêm vào model. Dense là một lớp mức đầu vào do Keras cung cấp, lớp này chấp nhận số lượng nơron hoặc đơn vị (32) làm tham số bắt buộc của nó. Nếu lớp là lớp đầu tiên, thì ta cũng cần cung cấp Hình dạng đầu vào, (16,). Nếu không, đầu ra của lớp trước sẽ được sử dụng làm đầu vào của lớp tiếp theo. Tất cả các thông số khác là tùy chọn.Tham số đầu tiên đại diện cho số lượng đơn vị (nơ-ron).input_shape : hình dạng của dữ liệu đầu vào.kernel_initializer :trình khởi tạo sẽ được sử dụng. hàm he_uniform được đặt làm giá trị.kernel_regularizer Không có giá trị nào được đặt làm giá trị.kernel_constraint đại diện cho ràng buộc được sử dụng. Hàm MaxNorm được đặt làm giá trị.activation : hàm relu được đặt thành giá trị.
- Dòng 10 Tạo lớp Dense thứ 2 với 16 đơn vị và đặ relu như là hàm activation.
- Dòng 11 Tạo lớp Dense cuối cùng với 8 đơn vị
2. Khái niệm cơ bản về Layers :
Ta sẽ cùng tìm hiểu khái niệm cơ bản về lớp cũng như cách Keras hỗ trợ với các khái niệm
Input shape
Trong học máy, tất cả các loại dữ liệu đầu vào như văn bản, hình ảnh hoặc video sẽ được chuyển đổi đầu tiên thành mảng số và sau đó đưa vào thuật toán. Số đầu vào có thể là mảng một chiều, mảng hai chiều (ma trận) hoặc mảng nhiều chiều. Ta có thể chỉ định thông tin về chiều bằng cách sử dụng hình dạng, một bộ số nguyên. Ví dụ, (4,2) đại diện cho ma trận có bốn hàng và hai cột.
>>> import numpy as np
>>> shape = (4, 2)
>>> input = np.zeros(shape)
>>> print(input)
[
[0. 0.]
[0. 0.]
[0. 0.]
[0. 0.]
]
>>>
Tương tự, (3,4,2) ma trận ba chiều có ba tập hợp ma trận 4×2 (hai hàng và bốn cột).
>>> import numpy as np
>>> shape = (3, 4, 2)
>>> input = np.zeros(shape)
>>> print(input)
[
[[0. 0.] [0. 0.] [0. 0.] [0. 0.]]
[[0. 0.] [0. 0.] [0. 0.] [0. 0.]]
[[0. 0.] [0. 0.] [0. 0.] [0. 0.]]
]
>>>
Để tạo lớp đầu tiên của mô hình (hoặc lớp đầu vào của mô hình), hình dạng của dữ liệu đầu vào phải được chỉ định.
3. Khởi tạo :
Trong ML, trọng số(weight) sẽ được gán cho tất cả dữ liệu đầu vào. Mô-đun khởi tạo cung cấp các chức năng khác nhau để thiết lập các trọng số ban đầu này. Một số hàm Keras Initializer như sau:
a. Zeros
Tạo dữ liệu đầu vào có giá trị bằng 0
from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers
my_init = initializers.Zeros()
model = Sequential()
model.add(Dense(512, activation = 'relu', input_shape = (784,),
kernel_initializer = my_init))
Trong đó, kernel_initializer đại diện cho trình khởi tạo cho kernal của model.
b. Ones
Tạo dữ liệu đầu vào với tất cả giá trị bằng 1
from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers
my_init = initializers.Ones()
model.add(Dense(512, activation = 'relu', input_shape = (784,),
kernel_initializer = my_init))
c. Constant
Tạo một giá trị không đổi (giả sử, 5) do người dùng chỉ định cho tất cả dữ liệu đầu vào.
from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers
my_init = initializers.Constant(value = 0) model.add(
Dense(512, activation = 'relu', input_shape = (784,), kernel_initializer = my_init)
)
Trong đó value đại diện cho giá trị không đổi
d. RandomNormal
Tạo dữ liệu đầu vào với giá trị sử dụng phân phối chuẩn
from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers
my_init = initializers.RandomNormal(mean=0.0,
stddev = 0.05, seed = None)
model.add(Dense(512, activation = 'relu', input_shape = (784,),
kernel_initializer = my_init))
Trong đó :
- mean đại diện cho giá trị trung bình của các giá trị ngẫu nhiên để tạo
- stddev đại diện cho độ lệch chuẩn của các giá trị ngẫu nhiên để tạo
- seed đại diện cho các giá trị để tạo ra số ngẫu nhiên
e. RandomUniform
Khởi tạo giá trị đầu vào sử dụng phân phối đồng nhất
from keras import initializers
my_init = initializers.RandomUniform(minval = -0.05, maxval = 0.05, seed = None)
model.add(Dense(512, activation = 'relu', input_shape = (784,),
kernel_initializer = my_init))
Trong đó :
- minval đại diện cho giới hạn dưới của các giá trị ngẫu nhiên để tạo
- maxval đại diện cho giới hạn trên của các giá trị ngẫu nhiên để tạo
f. TruncatedNormal
Tạo giá trị bằng cách sử dụng phân phối chuẩn bị cắt ngắn của dữ liệu đầu vào.
from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers
my_init = initializers.TruncatedNormal(mean = 0.0, stddev = 0.05, seed = None
model.add(Dense(512, activation = 'relu', input_shape = (784,),
kernel_initializer = my_init))
g. VarianceScaling
Tạo giá trị dựa trên hình dạng đầu vào và hình dạng đầu ra của lớp cùng với tỷ lệ được chỉ định
from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers
my_init = initializers.VarianceScaling(
scale = 1.0, mode = 'fan_in', distribution = 'normal', seed = None)
model.add(Dense(512, activation = 'relu', input_shape = (784,),
skernel_initializer = my_init))
Trong đó :
- scale đại diện cho hệ số tỷ lệ
- mode đại diện cho bất kỳ một trong các giá trị fan_in, fan_out và fan_avg
- distribution ại diện cho normal hoặc uniform
h. lecun_normal
Tạo giá trị đầu vào sử dụng phân phối chuẩn lecun
from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers
my_init = initializers.RandomUniform(minval = -0.05, maxval = 0.05, seed = None)
model.add(Dense(512, activation = 'relu', input_shape = (784,),
kernel_initializer = my_init))
Tìm stddev bằng cách sử dụng công thức dưới đây và sau đó áp dụng phân phối chuẩn
stddev = sqrt(1 / fan_in)
Trong đó, fan_in đại diện cho số lượng đơn vị đầu vào.
i. lecun_uniform
Giá trị đầu vào được tạo bằng cách sử dụng phân phối đồng nhất lecun
from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers
my_init = initializers.lecun_uniform(seed = None)
model.add(Dense(512, activation = 'relu', input_shape = (784,),
kernel_initializer = my_init))
Để tìm limit sử dụng công thức sau và sau đó áp dụng công thức đồng nhất :
limit = sqrt(3 / fan_in)
Trong đó :
- fan_in đại diện cho số lượng đơn vị đầu vào
- fan_out đại diện cho số lượng đơn vị đầu ra
k. glorot_normal
Tạo giá trị đầu vào sử dụng phân phối chuẩn glorot
from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers
my_init = initializers.glorot_normal(seed=None) model.add(
Dense(512, activation = 'relu', input_shape = (784,), kernel_initializer = my_init)
)
Để tìm stddev ta sử dụng công thức dưới đây , sau đó áp dụng phân phối chuẩn
stddev = sqrt(2 / (fan_in + fan_out))
l. glorot_uniform
Giá trị đầu vào được tạo bằng cách sử dụng phân phối đồng nhất glorot
from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers
my_init = initializers.glorot_uniform(seed = None)
model.add(Dense(512, activation = 'relu', input_shape = (784,),
kernel_initializer = my_init))
Tìm giá trị limit sử dụng công thức dưới đây, sau đó áp dụng phân phối chuẩn :
limit = sqrt(6 / (fan_in + fan_out))