Keras - Lớp tùy chỉnh

Keras cho phép tạo lớp tùy chỉnh của riêng chúng tôi. Khi một lớp mới được tạo, nó có thể được sử dụng trong bất kỳ mô hình nào mà không bị hạn chế. Hãy để chúng tôi tìm hiểu cách tạo lớp mới trong chương này.

Keras cung cấp một cơ sở layerlớp, Lớp có thể phân lớp để tạo lớp tùy chỉnh của riêng chúng ta. Chúng ta hãy tạo một lớp đơn giản sẽ tìm trọng lượng dựa trên phân phối chuẩn và 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 lượng của nó trong quá trình luyện tập.

Bước 1: Nhập mô-đun cần thiết

Trước tiên, hãy để chúng tôi nhập các mô-đun cần thiết -

from keras import backend as K 
from keras.layers import Layer

Đây,

  • backend được sử dụng để truy cập dot chức năng.

  • Layer là lớp cơ sở và chúng tôi sẽ phân lớp nó để tạo lớp của chúng tôi

Bước 2: Xác định một lớp lớp

Hãy để chúng tôi tạo một lớp học mới, MyCustomLayer bằng cách phân loại phụ Layer class -

class MyCustomLayer(Layer): 
   ...

Bước 3: Khởi tạo lớp lớp

Hãy để chúng tôi khởi tạo lớp mới của chúng tôi như được chỉ định bên dưới:

def __init__(self, output_dim, **kwargs):    
   self.output_dim = output_dim 
   super(MyCustomLayer, self).__init__(**kwargs)

Đây,

  • Line 2 đặt thứ nguyên đầu ra.

  • Line 3 gọi cơ sở hoặc siêu lớp của init chức năng.

Bước 4: Thực hiện phương pháp xây dựng

buildlà phương thức chính và mục đích duy nhất của nó là xây dựng lớp đú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 lớp. Khi chức năng tùy chỉnh được thực hiện xong, chúng ta có thể gọi lớp cơ sởbuildchức năng. Tùy chỉnh của chúng tôibuild chức năng 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)

Đây,

  • Line 1 xác định build phương pháp 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.

  • Line 2tạo trọng số tương ứng với hình dạng đầu vào và đặt nó trong nhân. Đây là chức năng tùy chỉnh của chúng tôi về lớp. Nó tạo ra trọng số bằng cách sử dụng bộ khởi tạo 'bình thường'.

  • Line 6 gọi lớp cơ sở, build phương pháp.

Bước 5: Triển khai phương thức gọi

call phương pháp làm việc chính xác của lớp trong quá trình đào tạo.

Tùy chỉnh của chúng tôi call phương pháp như sau

def call(self, input_data): 
   return K.dot(input_data, self.kernel)

Đây,

  • Line 1 xác định call phương pháp với một đối số, input_data. input_data là dữ liệu đầu vào cho lớp của chúng ta.

  • Line 2 trả về sản phẩm dấu chấm của dữ liệu đầu vào, input_data và hạt nhân của lớp của chúng tôi, self.kernel

Bước 6: Triển khai phương thức compute_output_shape

def compute_output_shape(self, input_shape): return (input_shape[0], self.output_dim)

Đây,

  • Line 1 xác định compute_output_shape phương pháp với một đối số input_shape

  • Line 2 tính toán hình dạng đầu ra bằng cách sử dụng hình dạng 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.

Thực hiện build, callcompute_output_shapehoàn thành việc tạo một lớp tùy chỉnh. Mã cuối cùng và hoàn chỉnh 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 lớp tùy chỉnh của chúng tôi

Hãy để chúng tôi tạo một mô hình đơn giản bằng cách sử dụng lớp tùy chỉnh của chúng tôi như được chỉ định bên dưới -

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()

Đây,

  • Của chúng tôi MyCustomLayer được thêm vào mô hình bằng cách sử dụng 32 đơn vị và (16,) như hình dạng đầu vào

Chạy ứng dụng sẽ in tóm tắt mô hình như dưới đây:

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 
_________________________________________________________________