如何在 `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
这样做的目的是创建一个层,该层可以对两个不同层的输出执行加权 sum/merge。之前,在 keras
python API 中(不是 tensorflow.keras
中包含的那个)我可以从 keras.layers.merge._Merge
class 继承,现在不是可从 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])
这给了我一个输出形状等于 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
作为输出形状的歧义。
我稍微修改了您的代码以使用 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())
我想使用 tf.keras
API 创建自定义合并层。但是,新的API隐藏了我想继承的keras.layers.merge._Merge
class
这样做的目的是创建一个层,该层可以对两个不同层的输出执行加权 sum/merge。之前,在 keras
python API 中(不是 tensorflow.keras
中包含的那个)我可以从 keras.layers.merge._Merge
class 继承,现在不是可从 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])
这给了我一个输出形状等于 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
作为输出形状的歧义。
我稍微修改了您的代码以使用 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())