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

时间:2019-09-27 11:13:43

标签: python tensorflow keras tf.keras

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

此操作的目的是创建一个可以对两个不同层的输出执行加权求和/合并的层。以前,在keras python API中(而不是tensorflow.keras中包含的那个),我可以从keras.layers.merge._Merge类继承,而现在无法从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 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])

这给了我一层输出形状等于multiple的图层,而我希望输出形状得到很好的定义。我进一步尝试了

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]

但这并不能解决multiple作为输出形状的歧义。

1 个答案:

答案 0 :(得分:2)

我对您的代码进行了少许修改,以使用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())

model summary