我正在寻找使用Keras创建暹罗网络的方法,但我发现this article on Medium不幸地使用Lambda层来计算卷积网络的两种输出编码之间的绝对差。问题是我无法在网络中使用Lambda图层,因为我想将最终的Keras模型转换为tfjs模型,并且根据Tensorflowjs,这些类型的图层无法转换。
我的问题是:是否可以使用“合并层”获得相同的结果,或者是否可以使用与tensorlfowjs兼容的另一个Keras层?如果是,请给我一个例子,因为我是Keras的新手。 我到处寻找其他暹罗实现,但是所有人都使用了Lambda层。
答案 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