Keras自定義Layer使用說明


自定義 Layer

自定義激活函數

函數形式比較簡單的時候可以用lambda函數:

clipped_relu = lambda x: K.activations.relu(x, max_value=4000)

Layer類

class MLPBlock(Layer):

	def __init__(self):
		super(MLPBlock, self).__init__()
		self.dense_1 = K.layers.Dense(500, kernel_regularizer=regularizers.l2(0.0))
		self.dense_2 = K.layers.Dense(500, kernel_regularizer=regularizers.l2(0.0))
		self.dense_3 = K.layers.Dense(500, kernel_regularizer=regularizers.l2(0.0))
		self.dense_4 = K.layers.Dense(500, kernel_regularizer=regularizers.l2(0.0))
		self.dense_5 = K.layers.Dense(60)

	def call(self, inputs):
		x = self.dense_1(inputs)
		x = tf.nn.relu(x)

		x = self.dense_2(x)
		x = tf.nn.relu(x)

		x = self.dense_3(x)
		x = tf.nn.relu(x)

		x = self.dense_4(x)
		x = tf.nn.relu(x)

		x = self.dense_5(x)
		return clipped_relu(x)

建立模型

這一步比較關鍵, 之前不成功主要是因為沒有理解def call(self, inputs)這個類方法. 以下代碼會報錯:

input_layer = K.Input(shape=(8,))
output_layer = MLPBlock()
mdl = K.Model(input_layer, output_layer)
mdl.summary()

這是因為output_layer未被初始化, 不含input_shape這個重要信息, 只有當我們把input_layer作為參數傳入自定義的output_layer時, output_layer才會被實際地初始化. 因此

input_layer = K.Input(shape=(8,))
output_layer = MLPBlock()(input_layer)
mdl = K.Model(input_layer, output_layer)
mdl.summary()

可以看到, 我們自定義的由多層Dense Layer疊加(stack)起來的新的Layer, 在形式上被作為一個新的Layer.

Model: "model_5"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_8 (InputLayer)         [(None, 8)]               0         
_________________________________________________________________
mlp_block_17 (MLPBlock)      (None, 60)                786060    
=================================================================
Total params: 786,060
Trainable params: 786,060
Non-trainable params: 0
_________________________________________________________________

以上自定義Layer的方法適用於tf.keras, 但不適用於Keras, 兩者的API在自定義Layer方面有所不同. 根據我對官方說明的理解, tf.keras可以像前面的代碼那樣, 把許多現有的Layer疊加在一起, 形成一個新的自定義Layer, 而Keras中自定義Layer的時候似乎不能用這種方式來自定義Layer, 但可以用自定義Model的形式來實現, 如下面這段官方教程的代碼

import keras

class SimpleMLP(keras.Model):

    def __init__(self, use_bn=False, use_dp=False, num_classes=10):
        super(SimpleMLP, self).__init__(name='mlp')
        self.use_bn = use_bn
        self.use_dp = use_dp
        self.num_classes = num_classes

        self.dense1 = keras.layers.Dense(32, activation='relu')
        self.dense2 = keras.layers.Dense(num_classes, activation='softmax')
        if self.use_dp:
            self.dp = keras.layers.Dropout(0.5)
        if self.use_bn:
            self.bn = keras.layers.BatchNormalization(axis=-1)

    def call(self, inputs):
        x = self.dense1(inputs)
        if self.use_dp:
            x = self.dp(x)
        if self.use_bn:
            x = self.bn(x)
        return self.dense2(x)

model = SimpleMLP()
model.compile(...)
model.fit(...)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM