gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 00:31:36 25 4
gpt4 key购买 nike

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

这样做的目的是创建一个可以对两个不同层的输出进行加权求和/合并的层。之前,在 keras python API(不是 tensorflow.keras 中包含的 API)中,我可以从 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]

但这并没有解决输出形状的多重歧义。

最佳答案

我稍微修改了您的代码以使用 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

关于python - 如何在 `keras.layers.merge._Merge` 中替换 `tensorflow.keras`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58133430/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com