我们可以创建一个具有可变大小输入的卷积神经网络
ip = keras.layers.Input((None, None, 3))
op = keras.layers.Conv2D(3, (2, 2))(ip)
model=keras.models.Model(inputs = [ip], outputs = [op])
有没有办法知道特定输入的输出层操作的大小?
我知道有一个公式可以计算这个简单示例的大小。有没有办法让模型为我计算尺寸?
我可以做到的一种方法是运行一些示例数据。
x = numpy.random.random((1, 64, 64, 3))
y = model(x)
现在我可以看到它们的形状 1, 64, 64, 3 和 1, 63, 63, 3。
我的目标是能够使用不同的 cnn 网络,但我不知道如何计算一般大小,例如 Resnet101。我的输出有不同的缩放值,并且我希望能够在训练期间缩放我的地面实况数据。
我可以仅从模型和输入数据获取输出大小,而无需运行样本吗?
更新:正如@matt提到的,只需
model
用 new调用Input
就足够了。无需为不同的输入创建新模型。然而,在这种情况下,需要保持各自的尺寸未指定。所以这不起作用:虽然这确实:
如果您仍然想要固定但不同的输入,则必须按照我下面建议的方式实现一些内容:
当你使用
keras.layers.Input((100, 100, 3))
它时,它实际上创建了一个KerasTensor
对象,它似乎是一个惰性/未初始化的张量对象。通过 递归地将其传递到其他层__call__
,实际上修改了输出形状(不计算任何触发器):印刷:
也可以通过 获得相同的对象
model.output
。我想这里的解决方案是稍微重构您的代码并定义一个函数,该函数为给定的不同输入创建模型,大致如下:哪个打印:
我希望这有帮助。
根据特定输入获取大小。
现在输出是具有特定形状的定义张量,我认为在这种情况下它实际上并没有运行模型。
总的来说,有一个著名的公式:
当然,当考虑 padding = "same" 时,事情会变得有点复杂:
在哪里
使用后一个公式时请小心。有时它可能会让你失望。