keras 高階技巧 重寫Layer

2021-09-13 03:55:52 字數 3070 閱讀 5478

在使用keras快速建模時,會遇到現有的庫無法實現,需要自己做一些定製,有兩種方式:

不涉及引數weights的優化訓練,可以使用keras.layers.lambda()

使用類支出keras.layers.layer

使用lambda

from keras.models import sequential

from keras.backend import concatenate

from keras.layers import input, lambda

from keras.layers import dense

import tensorflow as tf

import keras.backend as k

model = sequential(

)model.add(dense(

32, input_dim=32)

)# now: model.output_shape == (none, 32)

# note: `none` is the batch dimension

model.add(repeatvector(3)

)# now: model.output_shape == (none, 3, 32)

model.add(lambda(

lambda x: x **2)

)def

antirectifier

(x):

gamma=tf.variable(

10.0

, trainable=

true

) x -= k.mean(x, axis=

1, keepdims=

true

) x = k.l2_normalize(x, axis=1)

pos = k.relu(x)

neg = k.relu(

-x)return tf.multiply(gamma,k.concatenate(

[pos, neg]

, axis=1)

)def

antirectifier_output_shape

(input_shape)

: shape =

list

(input_shape)

assert

len(shape)==2

# only valid for 2d tensors

shape[-1

]*=2return

tuple

(shape)

model.add(lambda(antirectifier,

output_shape=antirectifier_output_shape)

)model.summary(

)

輸出:

使用自定義layer

from keras import backend as k

from keras.layers import layer

from keras.models import sequential

from keras.layers import input

from keras.layers import dense

import tensorflow as tf

import keras.backend as k

class

mylayer

(layer)

:def

__init__

(self, output_dim,

**kwargs)

: self.output_dim = output_dim

super

(mylayer, self)

.__init__(

**kwargs)

defbuild

(self, input_shape)

:# create a trainable weight variable for this layer.

self.kernel = self.add_weight(name=

'kernel'

, shape=

(input_shape[1]

, self.output_dim)

, initializer=

'uniform'

, trainable=

true

)super

(mylayer, self)

.build(input_shape)

# be sure to call this at the end

defcall

(self, x)

:return k.dot(x, self.kernel)

defcompute_output_shape

(self, input_shape)

:return

(input_shape[0]

, self.output_dim)

model = sequential(

)model.add(dense(

32, input_dim=32)

)model.add(mylayer(

100)

)model.summary(

)

輸出:

[3]: 使用keras編寫自定義網路層(layer)

C 高階高階 重寫函式

c 高階高階 重寫函式 這裡要說一下,重寫是繼承時發生,在子類中重新定義父類中的方法。例如 基類方法宣告為virtual方法,派生類中使用override宣告此方法的重寫。基類中的訪問修飾符在子類中是不能被修改的。比如說基類中的訪問修飾符為protected,那麼子類中的訪問修飾符也必須是這個。而且...

小技巧 python print方法重寫

print方法的引數 在python3的命令列執行help print 就可以看到 print value,sep end n file sys.stdout,flush false 將 value 列印到乙個輸出流,預設的輸出流為 sys.stdout。可選引數有 file 使用乙個檔案物件作為輸...

GDB高階技巧

本文主要示例一些平常較少使用到的gdb功能,掌握這些用法有助於提高gdb除錯和解決問題的能力。1 檢視巨集 預設情況下,在gdb中是不能檢視巨集的值及定義的,但通過如下方法,則可以達到目的 編譯源 時,加上 g3 gdwarf 2 選項,請注意不是 g 必須為 g3 檢視巨集的值使用命令p,這和檢視...