我正在尝试在浏览器中实现一个深度学习模型,这需要移植一些自定义层,其中一个是即时层归一化。下面是一段应该能工作的代码,但它有点旧。我遇到了这个错误:
Uncaught (in promise) ReferenceError: initializer is not definedat InstantLayerNormalization.build
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs/dist/tf.min.js"> </script><script>class InstantLayerNormalization extends tf.layers.Layer{ static className = 'InstantLayerNormalization'; epsilon = 1e-7 gamma; beta; constructor(config) { super(config); } getConfig() { const config = super.getConfig(); return config; } build(input_shape) { let shape = tf.tensor(input_shape); // initialize gamma self.gamma = self.add_weight(shape=shape, initializer='ones', trainable=true, name='gamma') // initialize beta self.beta = self.add_weight(shape=shape, initializer='zeros', trainable=true, name='beta') } call(inputs){ mean = tf.math.reduce_mean(inputs, axis=[-1], keepdims=True) variance = tf.math.reduce_mean(tf.math.square(inputs - mean), axis=[-1], keepdims=True) std = tf.math.sqrt(variance + self.epsilon) outputs = (inputs - mean) / std outputs = outputs * self.gamma outputs = outputs + self.beta return outputs } static get className() { console.log(className); return className; }}tf.serialization.registerClass(InstantLayerNormalization);</script>
回答:
继承类tf.layers.Layer
的方法没有被正确调用。
- Python中的
self
在JavaScript中是this
add_weight
在JavaScript中应为addWeight
- 这里是
addWeight
方法的签名。请注意,在JavaScript中,函数参数的解构赋值没有variable=value
的格式
// 而不是这样self.gamma = self.add_weight(shape=shape, initializer='ones', trainable=true, name='gamma')// 应该是这样this.gamma = this.addWeight('gamma', shape, undefined, 'ones', undefined, true)