Keras:误解 Keras 在调用模型、提供输入时做了什么?

数据挖掘 Python 喀拉斯 机器学习模型 数据科学模型
2022-02-16 19:27:56

在一个名为的类Generator中,我使用以下方法定义了一个模型define_model

def define_model(self):
    conv2d = Generator.__last_block()
    output = Activation('tanh')(conv2d)
    model = Model(self.input_layer, output)
    return model

在另一个文件中,我正在编写我的 Python 程序的入口点,它调用生成器的define_model方法:

generator = Generator()
generator_model = generator.define_model()

input_low_resolution = Input(shape=low_resolution_shape)
generated_high_resolution_images = generator_model(input_low_resolution)

当我阅读课程时,我对这段代码有一个疑问:Keras 在执行该行时会做什么generated_high_resolution_images = generator_model(input_low_resolution)

据我所知,它没有定义模型(我的模型已经定义了generator.define_model()!)。而且由于没有调用 Keras 方法或其他方法trainfit我推断这条线不会训练模型。

顺便说一句,这对我来说真的很奇怪,因为它将参数传递给引用(对对象的引用是generator_model,参数是input_low_resolution)。通常我们将参数传递给引用的方法(构造函数和其他方法)。

1个回答

当您调用模型时,Keras 会做很多事情。我想最重要的是它定义了可训练的变量和基于输入和输出的图形。例如,实际上制作任何密集层,而不仅仅是表示。

例如,如果你做了mod1=generator_model(input_low_resolution)mod2=generator_model(input_low_resolution),那么如果你训练mod1thenmod2不会受到影响,因为它们有不同的参数。因此,.define_model只需为您的模型创建一个“句柄”,当调用它时,它实际上会“构建”它。

当您想要混合和匹配多层配置或使用更复杂的结构(例如 GAN 或 ADDA)时,此功能非常有用。

我认为您的实现并不完全规范,实际上我建议您查看tensorflow.keras.Model 示例在这里,他们介绍了一种非常好的、规范的方式来制作你自己的模型。

此外,Keras 模型类 APIKeras 功能 API 入门可能会有所帮助。