自定义激活函数、初始化、正则化和约束¶
Note
很简单,直接用函数自定义即可,当然也可以子类定义。
函数定义¶
分别举例说明
import tensorflow as tf
from tensorflow import keras
def my_softplus(z):
# 自定义激活函数
return tf.math.log(tf.exp(z) + 1.0)
def my_glorot_initializer(shape, dtype=tf.float32):
# 自定义初始化
# glorot初始化就是xavier初始化
stddev = tf.sqrt(2. / (shape[0] + shape[1]))
return tf.random.normal(shape, stddev=stddev, dtype=dtype)
def my_l1_regularizer(weights):
# 自定义正则化
return tf.reduce_sum(tf.abs(0.01 * weights))
def my_positive_weights(weights):
# 自定义约束
# 效果等同于 tf.nn.relu(weights)
return tf.where(weights < 0., tf.zeros_like(weights), weights)
# 用起来没有什么不同
layer = keras.layers.Dense(1, activation=my_softplus,
kernel_initializer=my_glorot_initializer,
kernel_regularizer=my_l1_regularizer,
kernel_constraint=my_positive_weights)
子类定义¶
以正则化为例进行说明,它继承自 keras.regularizers.Regularizer
class MyL1Regularizer(keras.regularizers.Regularizer):
def __init__(self, factor):
self.factor = factor
def __call__(self, weights):
# 正则化、初始化和约束实现 __call__() 方法
# 层、损失函数和激活函数实现 call() 方法
return tf.reduce_sum(tf.abs(self.factor * weights))
def get_config(self):
return {"factor": self.factor}