如何在Keras中更改传播函数?Keras默认使用哪种传播函数?
关于Keras中传播函数的疑问解答
嘿,这个问题问到点子上了,我来给你一步步说清楚:
1. 能不能在Keras中更改传播函数或相关参数?
当然可以!Keras(尤其是现在的TensorFlow Keras)设计的核心就是灵活可扩展,完全支持自定义传播逻辑和参数。你只需要通过**自定义层(Custom Layer)**来实现自己想要的计算规则——不管是修改权重与输入的运算方式、调整偏置的使用,还是实现文献里那些特殊的传播函数,都能做到。
举个简单的例子,如果你想实现一个不带偏置、且权重做L2归一化的传播层,可以这么写:
import tensorflow as tf from tensorflow.keras.layers import Layer class CustomDense(Layer): def __init__(self, units, activation=None): super(CustomDense, self).__init__() self.units = units self.activation = tf.keras.activations.get(activation) def build(self, input_shape): # 初始化权重 self.kernel = self.add_weight( shape=(input_shape[-1], self.units), initializer="glorot_uniform", trainable=True, ) def call(self, inputs): # 对权重做L2归一化的自定义传播逻辑 normalized_kernel = tf.nn.l2_normalize(self.kernel, axis=0) outputs = tf.matmul(inputs, normalized_kernel) if self.activation is not None: outputs = self.activation(outputs) return outputs
用这个自定义层替换默认的Dense层,就能实现你想要的特殊传播逻辑了。
2. Keras默认是不是用最简单的Input ij = aj*wij形式?
其实不完全是。Keras默认的Dense(全连接)层的核心计算是加权求和加偏置,公式是:z = dot(input, kernel) + bias
这里的dot(input, kernel)本质就是对aj*wij做求和(矩阵乘法的行乘列求和),然后再加上偏置项bias。如果你不需要偏置,可以在初始化Dense层时设置use_bias=False,这时候就变成纯加权求和,但也不是单个aj*wij,而是求和后的结果。
3. Keras实际使用的是哪一种传播函数?
结合你提到的文献里的几种传播函数(比如带激活的加权求和、权重归一化后的计算等),Keras默认的Dense层对应的是基础的加权求和+可选激活函数的形式:
- 如果不指定激活函数,输出就是
Σw_ij x_j + b_i; - 如果指定了激活函数(比如
sigmoid、relu),输出就是activation(Σw_ij x_j + b_i)。
至于文献里那些更复杂的传播函数(比如权重做归一化、加入其他正则项、特殊的求和规则等),Keras没有直接内置,但你可以通过自定义层轻松实现,就像上面的例子那样。
内容的提问来源于stack exchange,提问作者InfoEngi
相关产品推荐
相关产品推荐

