首页 > 解决方案 > 如何创建一个动态依赖于输入维度(而不是批量大小)的 keras 模型?

问题描述

如果您使用 keras 子类 api,并且您想根据输入维度 x = (batch_dim, n) 生成一堆层 (n),有没有办法在 build 方法中执行此操作?

或者是在初始化时将输入昏暗传递到模型中以便可以在初始化范围内创建层的唯一方法?

更新:伪代码(未经测试)示例

class BigModel(tf.keras.models.Model):
    def __init__(self):
        super.__init__()
        self._my_submodels = list()

    def build(self, input_shape):
        for i in range(input_shape[1]):
            self.my_submodels.append(MyModel(param=i))

    def call(self, *inputs):
        stuff = list()
        for submodel in self.my_submodels:
            stuff.append(submodel(*inputs))
        # do something amazing with all the models
        fan_in = ... # combine 
        return fan_in

您可能可以使用具有大量拆分的模型以更矢量化的方式重写整个结构,但它会更难阅读和处理,我认为新的 tf 2.0 允许这种动态性而不会造成任何成本损失。

标签: kerastensorflow2.0

解决方案


是的,而不是使用batch_shape = (batch_size, input_dim),使用batch_shape=(None, input_dim)它允许任意数量的batch_size。


推荐阅读