(三)深度學習計算 3 自定義層

2021-10-06 17:45:14 字數 3553 閱讀 3639

本節將介紹如何自定義乙個層,從而可以被重複呼叫。

import tensorflow as tf

import numpy as np

定義乙個不含模型引數的自定義層:

class

centeredlayer

(tf.keras.layers.layer)

:def

__init__

(self)

:super()

.__init__(

)def

call

(self,inputs)

:return inputs - tf.reduce_mean(inputs)

其中,centeredlayer類通過繼承tf.keras.layers.layer類,自定義了乙個將輸入減掉均值後輸出的層,並將層的計算定義在了call函式裡。

該層的例項化及前向計算:

layer = centeredlayer(

)layer(np.array([1

,2,3

,4,5

]))

輸出:

利用該層構造模型:

net = tf.keras.sequential(

)net.add(tf.keras.layers.flatten())

net.add(tf.keras.layers.dense(20)

)net.add(centeredlayer())

y = net(x)

y

輸出:

自定義層輸出的均值:

tf.reduce_mean(y)
輸出:

此外,支援自定義含模型引數的自定義層。

模型引數可通過訓練學得:

class

mydense

(tf.keras.layers.layer)

:def

__init__

(self, units)

:super()

.__init__(

) self.units = units

defbuild

(self, input_shape)

:"""

input_shape: 第一次執行call()時,引數inputs的形狀。

tf.keras.layers.layer.add_weight: adds a new variable to the layer.

"""self.w = self.add_weight(name=

'w',

shape=

(input_shape[-1

], self.units)

, initializer=tf.random_normal_initializer())

self.b = self.add_weight(name=

'b',

shape=

(self.units)

, initializer=tf.zeros_initializer())

defcall

(self, inputs)

: y_pred = tf.matmul(inputs, self.w)

+ self.b

return y_pred

例項化及前向計算:

dense = mydense(3)

y = dense(x)

y

輸出:

訪問模型引數:

dense.get_weights(

)

輸出:

[array([[ 0.03788483,  0.05446365, -0.00342109],

[ 0.01979028, 0.07090656, -0.00471796],

[-0.00542502, 0.07547017, -0.07470261],

[ 0.00170084, -0.00170659, -0.07881869],

[ 0.02729396, 0.07794935, -0.01462456],

[-0.01458358, -0.01152581, 0.0183306 ],

[-0.05630199, 0.0834111 , 0.05665946],

[-0.03011301, -0.01305497, 0.01113685],

[ 0.07111349, 0.04045207, -0.00295244],

[ 0.06290419, -0.02640768, -0.04089865],

[ 0.02854273, 0.04196091, -0.01317766],

[-0.01049933, -0.04766244, -0.04543113],

[-0.05666549, 0.06246523, -0.06552341],

[ 0.02021227, 0.0038689 , 0.11742865],

[ 0.06721621, 0.00784351, -0.00665099],

[-0.04588777, -0.02955816, -0.01156068],

[-0.0953302 , -0.04818133, 0.01506012],

[-0.02355155, -0.03037887, -0.09637806],

[-0.04718609, 0.02179381, 0.02490507],

[ 0.02174933, -0.01841915, -0.00988414]], dtype=float32),

array([0., 0., 0.], dtype=float32)]

檢視模型引數shape:

dense.get_weights()[

0].shape

輸出:

(20,

3)

模型構造及例項化:

net = tf.keras.models.sequential(

)net.add(mydense(8)

)net.add(mydense(1)

)y = net(x)

y

輸出:

參考《動手學深度學習》(tf2.0版)

CALayer自定義層

自定義層,其實就是在層上繪圖,一共有2種方法,下面詳細介紹一下。方法描述 建立乙個calayer的子類,然後覆蓋drawincontext 方法,使用quartz2d api進行繪圖 pragma mark 繪製乙個實心三角形 4 void drawincontext cgcontextref ct...

自定義載入層

這裡我給最外面的盒子設定了跟視窗一樣的寬跟高為了結束不讓載入層顯示出來之後還可以點到按鈕。function window.onresize function function sethw 外面的盒子就遮住了所有的內容只有載入層了。這裡我還寫了如何去觸發這個載入層,由於一開始載入層是不需要去呼叫的我吧...

Keras 自定義層

keras自定義或者重寫層,需要實現三個方法 問題 參考 keras 自定義層 最後舉乙個conditional layer normalization的例子 基於conditional layer normalization的條件文字生成 自定義層需要實現三個方法 class layernorma...