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
_________________________________________________________________