繁体   English   中英

如何在`tensorflow.keras`中替换`keras.layers.merge._Merge`

[英]How to substitute `keras.layers.merge._Merge` in `tensorflow.keras`

我想使用tf.keras API 创建一个自定义合并层。 但是,新的 API 隐藏了我想继承的keras.layers.merge._Merge class。

这样做的目的是创建一个可以对两个不同层的输出进行加权求和/合并的层。 Before, and in keras python API (not the one included in tensorflow.keras ) I could inherit from keras.layers.merge._Merge class, which is now not accessible from tensorflow.keras .

在我能做到这一点之前在哪里

class RandomWeightedAverage(keras.layers.merge._Merge):
    def __init__(self, batch_size):
        super().__init__()
        self.batch_size = batch_size
    def _merge_function(self, inputs):
        alpha = K.random_uniform((self.batch_size, 1, 1, 1))
        return (alpha * inputs[0]) + ((1 - alpha) * inputs[1])

现在,如果使用tensorflow.keras ,我不能使用相同的逻辑

class RandomWeightedAverage(tf.keras.layers.merge._Merge):
    def __init__(self, batch_size):
        super().__init__()
        self.batch_size = batch_size
    def _merge_function(self, inputs):
        alpha = K.random_uniform((self.batch_size, 1, 1, 1))
        return (alpha * inputs[0]) + ((1 - alpha) * inputs[1])

生产

AttributeError: module 'tensorflow.python.keras.api._v1.keras.layers' has no attribute 'merge'

我也尝试过从Layer class 继承

class RandomWeightedAverage(tensorflow.keras.layers.Layer):
    def __init__(self, batch_size):
        super().__init__()
        self.batch_size = batch_size
    def call(self, inputs):
        alpha = K.random_uniform((self.batch_size, 1, 1, 1))
        return (alpha * inputs[0]) + ((1 - alpha) * inputs[1])

这给了我一个 output 形状等于multiple的层,而我希望 output 形状定义明确。 我进一步尝试

class RandomWeightedAverage(tensorflow.keras.layers.Layer):
    def __init__(self, batch_size):
        super().__init__()
        self.batch_size = batch_size
    def call(self, inputs):
        alpha = K.random_uniform((self.batch_size, 1, 1, 1))
        return (alpha * inputs[0]) + ((1 - alpha) * inputs[1])

    def compute_output_shape(self, input_shape):
        return input_shape[0]

但这并没有解决 output 形状的multiple歧义。

我稍微修改了您的代码以使用tf.random_uniform而不是K.random_uniform并且它在 1.13.1 和 1.14.0 上运行良好(完整的代码片段和下面的model.summary() )。

import tensorflow as tf
print(tf.__version__)


class RandomWeightedAverage(tf.keras.layers.Layer):
    def __init__(self, batch_size):
        super().__init__()
        self.batch_size = batch_size

    def call(self, inputs, **kwargs):
        alpha = tf.random_uniform((self.batch_size, 1, 1, 1))
        return (alpha * inputs[0]) + ((1 - alpha) * inputs[1])

    def compute_output_shape(self, input_shape):
        return input_shape[0]


x1 = tf.keras.layers.Input((32, 32, 1))
x2 = tf.keras.layers.Input((32, 32, 1))

y = RandomWeightedAverage(4)(inputs=[x1, x2])

model = tf.keras.Model(inputs=[x1, x2], outputs=[y])

print(model.summary())

模型摘要

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM