更新:正如@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>]
我希望这能帮到你.