python - 如何在`tensorflow.keras`中替换`keras.layers.merge._Merge`
问题描述
我想使用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
输出形状的歧义。
解决方案
我稍微修改了您的代码以使用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())
推荐阅读
- outsystems - 处理空值 oustystems
- apache-spark - 使用 Apache Spark Hidden REST API 提交 python 脚本
- neo4j - 如何重写 Cypher 查询,分组时返回大量节点
- r - R Markdown文档中的换行符没有两个空格
- javascript - RxJS 使用两个参数订阅
- html - 使用 Apache Tika 从 PDF 中提取正确的 HTML 文档
- jms - Red Hat JBoss AMQ 客户端 用于故障转移和重新连接的示例 java 程序
- python - Python:从 .py 文件中导入函数以及所需的模块
- android - 用于 Android 的 MuPDF 编译在 generateJsonModelRelease 中失败
- javascript - 将捆绑的 css 移动到不同的目录会将 URL 前缀 ../ 更改为仅 /