我们可以创建具有可变大小输入的卷积神经网络

ip = keras.layers.Input((None, None, 3))
op = keras.layers.Conv2D(3, (2, 2))(ip)

model=keras.models.Model(inputs = [ip], outputs = [op])

有没有办法知道特定输入的输出层op的大小?

我知道这个简单的例子有一个计算大小的公式.有没有办法让模特帮我计算尺寸?

我能做到这一点的一种方法是运行一些样本数据.

x = numpy.random.random((1, 64, 64, 3))
y = model(x)

现在我可以看到它们的两个形状1,64,64,3和1,63,63,3.

我的目标是能够使用不同的CNN网络,我不知道如何计算一般的大小,例如Resnet101.我对输出有不同的比例值,我希望能够在训练期间对我的地面真实数据进行比例尺.

我可以从模型和输入数据中获得输出大小,而不需要运行示例吗?

推荐答案

更新:正如@Matt提到的,只需用新的Input拨打model就足够了.不需要为不同的输入创建新模型.然而,在这种情况下,需要保持不指定各自的尺寸.所以这是行不通的:

import keras_core as keras

ip = keras.layers.Input((10, 10, 3))
op = keras.layers.Conv2D(3, (5, 5))(ip)
model = keras.models.Model(inputs = [ip], outputs = [op])

model(keras.layers.Input((100, 100, 3)))

虽然这样做是为了:

import keras_core as keras

ip = keras.layers.Input((None, None, 3))
op = keras.layers.Conv2D(3, (5, 5))(ip)
model = keras.models.Model(inputs = [ip], outputs = [op])

model(keras.layers.Input((100, 100, 3)))

如果您仍然想要一个固定但不同的输入,您必须按照我下面的建议实现一些东西:

当你使用keras.layers.Input((100, 100, 3))时,它实际上创建了一个KerasTensor对象,它看起来像是一个懒惰的/未初始化的张量对象.通过__call__递归地将其传递到其他层,实际上修改了输出形状(不计算任何Flop):

import keras_core as keras

ip = keras.layers.Input((100, 100, 3))
op = keras.layers.Conv2D(3, (5, 5))(ip)

print(op)

model = keras.models.Model(inputs = [ip], outputs = [op])

打印:

<KerasTensor shape=(None, 96, 96, 3), dtype=float32, sparse=False, name=keras_tensor_39>

同样的对象也可以通过model.output.我想这里的解决方案是稍微重构你的代码并定义一个函数,它为给定的不同输入创建模型,沿着以下路由:

import keras_core as keras

def create_model(ip):
    op = keras.layers.Conv2D(3, (5, 5))(ip)
    return keras.models.Model(inputs = [ip], outputs = [op])

model_1 = create_model(keras.layers.Input((10, 10, 3)))
model_2 = create_model(keras.layers.Input((100, 100, 3)))

print(model_1.output)
print(model_2.output)

它打印:

[<KerasTensor shape=(None, 6, 6, 3), dtype=float32, sparse=False, name=keras_tensor_54>]
[<KerasTensor shape=(None, 96, 96, 3), dtype=float32, sparse=False, name=keras_tensor_56>]

我希望这能帮到你.

Python相关问答推荐

给定数据点,制定它们的关系

在Pandas框架中截短至固定数量的列

计算相同形状的两个张量的SSE损失

Pydantic 2.7.0模型接受字符串日期时间或无

即使在可见的情况下也不相互作用

如何使用pandasDataFrames和scipy高度优化相关性计算

Deliveryter Notebook -无法在for循环中更新matplotlib情节(保留之前的情节),也无法使用动画子功能对情节进行动画

使用groupby Pandas的一些操作

如果条件不满足,我如何获得掩码的第一个索引并获得None?

如何使用Python以编程方式判断和检索Angular网站的动态内容?

我想一列Panadas的Rashrame,这是一个URL,我保存为CSV,可以直接点击

Pandas—在数据透视表中占总数的百分比

为一个组的每个子组绘制,

Django RawSQL注释字段

Python列表不会在条件while循环中正确随机化'

如何使用两个关键函数来排序一个多索引框架?

Polars将相同的自定义函数应用于组中的多个列,

处理Gekko的非最优解

如何重新组织我的Pandas DataFrame,使列名成为列值?

当HTTP 201响应包含 Big Data 的POST请求时,应该是什么?