Javascript 在tensorflow js中编写自定义InstantLayer规范化
我试图在浏览器中实现一个深度学习模型,这需要移植一些自定义层,其中之一就是即时层规范化。下面是一段应该可以工作但有点旧的代码。 我得到这个错误: 未捕获(承诺中)引用错误:未定义初始值设定项 在InstantLayerNormalization.buildJavascript 在tensorflow js中编写自定义InstantLayer规范化,javascript,tensorflow,machine-learning,tensorflow.js,Javascript,Tensorflow,Machine Learning,Tensorflow.js,我试图在浏览器中实现一个深度学习模型,这需要移植一些自定义层,其中之一就是即时层规范化。下面是一段应该可以工作但有点旧的代码。 我得到这个错误: 未捕获(承诺中)引用错误:未定义初始值设定项 在InstantLayerNormalization.build 类InstantLayerNormalization扩展了tf.layers.Layer { 静态类名称='InstantLayerNormalization'; ε=1e-7 伽马射线; 贝塔; 构造函数(配置) { 超级(配置); }
类InstantLayerNormalization扩展了tf.layers.Layer
{
静态类名称='InstantLayerNormalization';
ε=1e-7
伽马射线;
贝塔;
构造函数(配置)
{
超级(配置);
}
getConfig()
{
const config=super.getConfig();
返回配置;
}
构建(输入形状)
{
let shape=tf.张量(输入_shape);
//初始化伽马射线
self.gamma=self.add_权重(形状=形状,
初始值设定项='ones',
可训练的,
name='gamma')
//初始化测试版
self.beta=self.add_重量(形状=形状,
初始值设定项='零',
可训练的,
name='beta')
}
呼叫(输入){
平均值=tf.math.reduce_平均值(输入,轴=[-1],keepdims=True)
方差=tf.math.reduce_-mean(tf.math.square(输入-平均值),轴=[-1],keepdims=True)
std=tf.math.sqrt(方差+自身ε)
输出=(输入-平均值)/std
输出=输出*self.gamma
输出=输出+自测试
返回输出
}
静态获取类名(){
log(类名);
返回类名;
}
}
registerClass(InstantLayerNormalization);
继承类tf.layers.Layer
的方法调用不正确
- python中的
在js中是self
this
相当于add_weight
addWeight
- 是
方法的签名。请注意,js中没有函数参数解构赋值的格式addWeight
variable=value
//而不是这个
self.gamma=self.add_weight(shape=shape,初始值设定项='one',trainable=true,name='gamma')
//应该是这样
this.gamma=this.addWeight('gamma',shape,未定义,'one',未定义,true)
<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>