Bài 9: Tuỳ chỉnh Layer - Keras cơ bản

Đăng bởi: Admin | Lượt xem: 2495 | Chuyên mục: AI


Keras cho phép tạo layer tùy chỉnh riêng. Khi một layer mới được tạo, nó có thể được sử dụng trong bất kỳ mô hình nào mà không có bất kỳ hạn chế nào. Ta sẽ tìm hiểu cách tạo layer trong bài hôm nay.
Keras cung cấp một lớp layer cơ sở. Layer có thể phân lớp để tạo layer tùy chỉnh riêng. Ta hãy tạo một layer đơn giản và tìm trọng số(weight) dựa trên phân phối chuẩn , sau đó thực hiện phép tính cơ bản để tìm tổng của tích đầu vào và trọng số của nó trong quá trình luyện tập.
Bước 1 : Import các thư viện cần thiết :
from keras import backend as K 
from keras.layers import Layer
Trong đó :
  • backend được sử dụng để truy cập hàm dot.
  • Layer là lớp cơ sở sẽ phân lớp nó để tạo lớp riêng
Bước 2: Xác định lớp layer :
Tạo lớp mới MyCustomLayer
class MyCustomLayer(Layer): 
   ...
Bước 3 : Khởi tạo lớp layer
def __init__(self, output_dim, **kwargs):    
   self.output_dim = output_dim 
   super(MyCustomLayer, self).__init__(**kwargs)
Trong đó :
  • Dòng 2 đặt số chiều đầu ra.
  • Line 3 cgọi hàm init .
Bước 4: Xây dựng phương thức
xây dựng(build) là phương pháp chính và mục đích duy nhất của nó là xây dựng layer đúng cách. Nó có thể làm bất cứ điều gì liên quan đến hoạt động bên trong của layer. Khi hàm tuỳ chỉnh được thực hiện xong, ta có thể gọi hàm xây dựng layer cơ sở. Hàm xây dựng tùy chỉnh của chúng tôi như sau:
def build(self, input_shape): 
   self.kernel = self.add_weight(name = 'kernel', 
      shape = (input_shape[1], self.output_dim), 
      initializer = 'normal', trainable = True) 
   super(MyCustomLayer, self).build(input_shape)
Trong đó :
  • Dòng 1 xác định phương thức xây dựng với một đối số, input_shape. Hình dạng của dữ liệu đầu vào được tham chiếu bởi input_shape.
  • Dòng 2 tạo ra trọng số tương ứng với hình dạng đầu vào và đặt trong kernal. Nó tạo ra trọng số bằng cách sử dụng bộ khởi tạo ‘normal’.
  • Dòng 6 gọi lớp cơ sở, phương thức xây dựng.
Bước 5: Phương thức call :
Call là phương pháp làm việc chính xác của layer trong quá trình đào tạo.
def call(self, input_data): 
   return K.dot(input_data, self.kernel)
Trong đó :
  • Dòng 1 xác định phương thức gọi với một đối số, input_data. input_data là dữ liệu đầu vào cho layer.
  • Dòng 2 trả về dot của dữ liệu đầu vào, input_data và kernal ,self.kernel
Bước 6: Phương thức compute_output_shape:
def compute_output_shape(self, input_shape): return (input_shape[0], self.output_dim)
Trong đó :
  • Dòng 1 xác định phương thức compute_output_shape với một đối số input_shape
  • Line 2 tính toán shape output bằng cách sử dụng shape của dữ liệu đầu vào và kích thước đầu ra được đặt trong khi khởi tạo lớp.
Việc triển khai built, call và compute_output_shape hoàn tất việc tạo một layer tùy chỉnh.Đoạn code mẫu như sau:
from keras import backend as K from keras.layers import Layer
class MyCustomLayer(Layer): 
   def __init__(self, output_dim, **kwargs): 
      self.output_dim = output_dim 
      super(MyCustomLayer, self).__init__(**kwargs) 
   def build(self, input_shape): self.kernel = 
      self.add_weight(name = 'kernel', 
      shape = (input_shape[1], self.output_dim), 
      initializer = 'normal', trainable = True) 
      super(MyCustomLayer, self).build(input_shape) # 
      Be sure to call this at the end 
   def call(self, input_data): return K.dot(input_data, self.kernel) 
   def compute_output_shape(self, input_shape): return (input_shape[0], self.output_dim)

Sử dụng layer tuỳ chỉnh :

Tạo một mô hình đơn giản bằng cách sử dụng layer tùy chỉnh như sau:
from keras.models import Sequential 
from keras.layers import Dense 

model = Sequential() 
model.add(MyCustomLayer(32, input_shape = (16,))) 
model.add(Dense(8, activation = 'softmax')) model.summary()
Trong đó :
MyCustomLayer được thêm vào mô hình bằng cách sử dụng 32 units và (16,) làm shape input
Kết quả sau khi chạy mô hình như sau :
Model: "sequential_1" 
_________________________________________________________________ 
Layer (type) Output Shape Param 
#================================================================ 
my_custom_layer_1 (MyCustomL (None, 32) 512 
_________________________________________________________________
dense_1 (Dense) (None, 8) 264 
================================================================= 
Total params: 776 
Trainable params: 776 
Non-trainable params: 0 
__________________________
Bài tiếp theo: Models >>
vncoder logo

Theo dõi VnCoder trên Facebook, để cập nhật những bài viết, tin tức và khoá học mới nhất!