Keras - เลเยอร์ที่กำหนดเอง

Keras อนุญาตให้สร้างเลเยอร์ที่กำหนดเองของเราเอง เมื่อสร้างเลเยอร์ใหม่แล้วจะสามารถใช้งานในรุ่นใดก็ได้โดยไม่มีข้อ จำกัด ให้เราเรียนรู้วิธีสร้างเลเยอร์ใหม่ในบทนี้

Keras เป็นฐาน layerclass, Layer ซึ่งสามารถย่อยเพื่อสร้าง Layer ที่เรากำหนดเองได้ ให้เราสร้างเลเยอร์ง่ายๆซึ่งจะหาน้ำหนักตามการแจกแจงปกติจากนั้นทำการคำนวณพื้นฐานเพื่อหาผลรวมของผลคูณของข้อมูลเข้าและน้ำหนักระหว่างการฝึก

ขั้นตอนที่ 1: นำเข้าโมดูลที่จำเป็น

ขั้นแรกให้เรานำเข้าโมดูลที่จำเป็น -

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

ที่นี่

  • backend ใช้เพื่อเข้าถึงไฟล์ dot ฟังก์ชัน

  • Layer เป็นคลาสพื้นฐานและเราจะแบ่งคลาสย่อยเพื่อสร้างเลเยอร์ของเรา

ขั้นตอนที่ 2: กำหนดคลาสเลเยอร์

ให้เราสร้างคลาสใหม่ MyCustomLayer โดยการแบ่งประเภทย่อย Layer class -

class MyCustomLayer(Layer): 
   ...

ขั้นตอนที่ 3: เริ่มต้นคลาสเลเยอร์

เริ่มต้นคลาสใหม่ของเราตามที่ระบุด้านล่าง -

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

ที่นี่

  • Line 2 ตั้งค่ามิติข้อมูลเอาต์พุต

  • Line 3 เรียกฐานหรือชั้นซุปเปอร์ init ฟังก์ชัน

ขั้นตอนที่ 4: ใช้วิธีการสร้าง

buildเป็นวิธีการหลักและมีจุดประสงค์เดียวคือการสร้างเลเยอร์อย่างถูกต้อง มันสามารถทำอะไรก็ได้ที่เกี่ยวข้องกับการทำงานภายในของเลเยอร์ เมื่อฟังก์ชันที่กำหนดเองเสร็จสิ้นเราสามารถเรียกใช้คลาสพื้นฐานได้buildฟังก์ชัน ประเพณีของเราbuild ฟังก์ชั่นมีดังนี้ -

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)

ที่นี่

  • Line 1 กำหนด build วิธีการด้วยอาร์กิวเมนต์เดียว input_shape. รูปร่างของข้อมูลอินพุตถูกอ้างอิงโดย input_shape

  • Line 2สร้างน้ำหนักที่สอดคล้องกับรูปร่างอินพุตและตั้งค่าในเคอร์เนล เป็นฟังก์ชันการทำงานที่กำหนดเองของเลเยอร์ สร้างน้ำหนักโดยใช้ตัวเริ่มต้น 'ปกติ'

  • Line 6 เรียกคลาสพื้นฐาน build วิธี.

ขั้นตอนที่ 5: ใช้วิธีการโทร

call วิธีการทำงานที่แน่นอนของเลเยอร์ในระหว่างกระบวนการฝึกอบรม

ประเพณีของเรา call วิธีการมีดังนี้

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

ที่นี่

  • Line 1 กำหนด call วิธีการด้วยอาร์กิวเมนต์เดียว input_data. input_data คือข้อมูลอินพุตสำหรับเลเยอร์ของเรา

  • Line 2 ส่งคืนผลิตภัณฑ์ดอทของข้อมูลอินพุต input_data และเคอร์เนลของเลเยอร์ของเรา self.kernel

ขั้นตอนที่ 6: ใช้เมธอด compute_output_shape

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

ที่นี่

  • Line 1 กำหนด compute_output_shape วิธีการด้วยอาร์กิวเมนต์เดียว input_shape

  • Line 2 คำนวณรูปร่างเอาต์พุตโดยใช้รูปร่างของข้อมูลอินพุตและชุดมิติข้อมูลเอาต์พุตขณะเริ่มต้นเลเยอร์

การใช้งาน build, call และ compute_output_shapeเสร็จสิ้นการสร้างเลเยอร์ที่กำหนดเอง รหัสสุดท้ายและสมบูรณ์มีดังนี้

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)

ใช้เลเยอร์ที่กำหนดเองของเรา

ให้เราสร้างโมเดลง่ายๆโดยใช้เลเยอร์ที่กำหนดเองตามที่ระบุด้านล่าง -

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

ที่นี่

  • ของเรา MyCustomLayer ถูกเพิ่มเข้าไปในโมเดลโดยใช้ 32 หน่วยและ (16,) เป็นรูปทรงอินพุต

การเรียกใช้แอปพลิเคชันจะพิมพ์สรุปโมเดลดังต่อไปนี้ -

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 
_________________________________________________________________