Javascript 未知正则化器:tensorflowjs中的L2

Javascript 未知正则化器:tensorflowjs中的L2,javascript,tensorflow,machine-learning,tensorflow.js,Javascript,Tensorflow,Machine Learning,Tensorflow.js,我已经使用model在python中训练了一个模型 reg = 0.000001 model = Sequential() model.add(Dense(24, activation='tanh', name='input_dense', input_shape=input_shape)) model.add(GRU(24, activation='tanh', recurrent_activation='sigmoid', return_sequences=True, kernel_regu

我已经使用model在python中训练了一个模型

reg = 0.000001
model = Sequential()
model.add(Dense(24, activation='tanh', name='input_dense', input_shape=input_shape))
model.add(GRU(24, activation='tanh', recurrent_activation='sigmoid', return_sequences=True, kernel_regularizer=regularizers.l2(reg), recurrent_regularizer=regularizers.l2(reg), reset_after=False))
model.add(Flatten())
model.add(Dense(2, activation='softmax'))
但当我使用“tensorflowjs_转换器——输入格式keras”转换这个模型并加载到浏览器中时,出现了错误

未处理的拒绝(错误):未知正则化器:L2。这可能是应得的 由于下列原因之一:

  • 正则化器是在Python中定义的,在这种情况下,它需要移植到TensorFlow.js或您的JavaScript代码中
  • 自定义正则化器是在JavaScript中定义的,但未在tf.serialization.registerClass()中正确注册
  • model.json文件内容为

    {
    “格式”:“图层模型”,
    “生成者”:“keras v2.4.0”,
    “convertedBy”:“TensorFlow.js Converter v2.3.0”,
    “模型拓扑”:{
    “keras_版本”:“2.4.0”,
    “后端”:“tensorflow”,
    “模型配置”:{
    “类别名称”:“顺序”,
    “配置”:{
    “名称”:“顺序”,
    “层”:[
    {
    “类名称”:“输入层”,
    “配置”:{
    “批处理输入形状”:[null,22,13],
    “dtype”:“float32”,
    “稀疏”:错误,
    “衣衫褴褛”:错误,
    “名称”:“输入\u密集\u输入”
    }
    },
    {
    “类名”:“稠密”,
    “配置”:{
    “名称”:“输入”,
    “可培训”:没错,
    “批处理输入形状”:[null,22,13],
    “dtype”:“float32”,
    “单位”:24,
    “激活”:“tanh”,
    “使用偏见”:正确,
    “内核_初始值设定项”:{
    “类别名称”:“GlorotUniform”,
    “config”:{“seed”:null}
    },
    “bias_初始值设定项”:{“class_name”:“Zeros”,“config”:{},
    “内核正则化器”:null,
    “偏差正则化器”:null,
    “活动\正则化器”:null,
    “内核约束”:null,
    “偏差约束”:空
    }
    },
    {
    “类别名称”:“GRU”,
    “配置”:{
    “名称”:“gru”,
    “可培训”:没错,
    “dtype”:“float32”,
    “返回_序列”:true,
    “返回状态”:false,
    “向后走”:错,
    “有状态”:错误,
    “展开”:错误,
    “时间大调”:错,
    “单位”:24,
    “激活”:“tanh”,
    “反复激活”:“乙状结肠”,
    “使用偏见”:正确,
    “内核_初始值设定项”:{
    “类别名称”:“GlorotUniform”,
    “config”:{“seed”:null}
    },
    “循环_初始值设定项”:{
    “类名称”:“正交”,
    “配置”:{“增益”:1.0,“种子”:null}
    },
    “bias_初始值设定项”:{“class_name”:“Zeros”,“config”:{},
    “内核正则化器”:{
    “类别名称”:“L2”,
    “配置”:{“l2”:9.999999774752427E-7}
    },
    “递归正则化器”:{
    “类别名称”:“L2”,
    “配置”:{“l2”:9.999999774752427E-7}
    },
    “偏差正则化器”:null,
    “活动\正则化器”:null,
    “内核约束”:null,
    “循环_约束”:空,
    “偏差约束”:空,
    “辍学”:0.0,
    “经常性辍学”:0.0,
    "落实":二,,
    “复位后”:false
    }
    },
    {
    “类名称”:“展平”,
    “配置”:{
    “名称”:“展平”,
    “可培训”:没错,
    “dtype”:“float32”,
    “数据格式”:“最后一个通道”
    }
    },
    {
    “类名”:“稠密”,
    “配置”:{
    “名称”:“密度”,
    “可培训”:没错,
    “dtype”:“float32”,
    “单位”:2,
    “激活”:“softmax”,
    “使用偏见”:正确,
    “内核_初始值设定项”:{
    “类别名称”:“GlorotUniform”,
    “config”:{“seed”:null}
    },
    “bias_初始值设定项”:{“class_name”:“Zeros”,“config”:{},
    “内核正则化器”:null,
    “偏差正则化器”:null,
    “活动\正则化器”:null,
    “内核约束”:null,
    “偏差约束”:空
    }
    }
    ]
    }
    },
    “培训配置”:{
    “损失”:“绝对熵”,
    “指标”:[“准确度”],
    “加权_度量”:空,
    “损失权重”:空,
    “优化器配置”:{
    “类别名称”:“Nadam”,
    “配置”:{
    “名称”:“那达慕”,
    “学习率”:0.002000094909926,
    “衰变”:0.004000000189989805,
    “beta_1”:0.8999979761581421,
    “beta_2”:0.9990000128746033,
    “ε”:1e-7
    }
    }
    }
    },
    “权重最大”:[
    {
    “路径”:[“group1-shard1of1.bin”],
    “重量”:[
    {“name”:“dense/kernel”,“shape”:[528,2],“dtype”:“float32”},
    {“name”:“dense/bias”,“shape”:[2],“dtype”:“float32”},
    {“name”:“gru/gru_cell/kernel”,“shape”:[24,72],“dtype”:“float32”},
    {
    “名称”:“gru/gru_单元/循环_内核”,
    “形状”:[24,72],
    “数据类型”:“float32”
    },
    {“name”:“gru/gru_cell/bias”,“shape”:[72],“dtype”:“float32”},
    {“name”:“input_dense/kernel”,“shape”:[13,24],“dtype”:“float32”},
    {“名称”:“输入密度/偏差”,“形状”:[24],“数据类型”:“浮动32”}
    ]
    }
    ]
    }
    
    选项1

    没有类
    L1
    L2
    ;它们只是接口(更多)

    有一个类
    L1L2
    ,它将接受配置并返回正确的正则化器。您可以手动将所有出现的
    L2
    替换为
    L1L2

    选择2

    注册一个L2类

    class L2 {
    
        static className = 'L2';
    
        constructor(config) {
           return tf.regularizers.l1l2(config)
        }
    }
    tf.serialization.registerClass(L2);
    
    // now load the model