在使用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,這和檢視...