合并两个没有lambda层的编码,以便转换Keras模型和TFJS

时间:2019-04-30 17:46:06

标签: keras tensorflowjs-converter

我正在寻找使用Keras创建暹罗网络的方法,但我发现this article on Medium不幸地使用Lambda层来计算卷积网络的两种输出编码之间的绝对差。问题是我无法在网络中使用Lambda图层,因为我想将最终的Keras模型转换为tfjs模型,并且根据Tensorflowjs,这些类型的图层无法转换。

我的问题是:是否可以使用“合并层”获得相同的结果,或者是否可以使用与tensorlfowjs兼容的另一个Keras层?如果是,请给我一个例子,因为我是Keras的新手。 我到处寻找其他暹罗实现,但是所有人都使用了Lambda层。

1 个答案:

答案 0 :(得分:2)

可以创建和注册自定义Lambda层。

这里是siamese_net的子集(只是为了演示lambda层的使用)

left_input = tf.keras.Input(shape=(32,)) 
right_input = tf.keras.Input(shape=(32,))  

L1_layer = Lambda(lambda tensors:tf.abs(tensors[0] - tensors[1]))
L1_distance = L1_layer([left_input, right_input])

prediction = Dense(1,activation='sigmoid')(L1_distance)

model = Model(inputs=[left_input,right_input],outputs=prediction)

保存模型

model.save('my_model.h5') 

将模型转换为js

tensorflowjs_converter \
    --input_format=keras \
    my_model.h5 \
    tfjs

在javascript中使用模型

class Lambda extends tf.layers.Layer {
    constructor() {
      super({})
    }

    static get className() {
      return 'Lambda';
    }

    computeOutputShape(inputShape) {
      return [inputShape[0]];
    }

    call(inputs, kwargs) {
      this.invokeCallHook(inputs, kwargs);
      return tf.abs(inputs[0].sub(inputs[1]))
    }
  }

  tf.serialization.SerializationMap.register(Lambda);

这里是colab