首页 > 解决方案 > 为什么在构建 Keras 模型时同时使用 Sequential API 和 Functional API?

问题描述

我正在尝试理解使用 Keras 制作的 DCGAN 的代码,该代码使用顺序 api 创建模型,然后将其包装在功能性 api 模型中。为什么包括功能模型而不是仅使用顺序模型?

我有点初学者,我正在尝试了解这个 Keras GAN 的设计:

https://github.com/eriklindernoren/Keras-GAN/blob/master/dcgan/dcgan.py

例如,在构建生成器时,使用顺序 API 定义模型,然后使用功能 API 和顺序模型创建新模型。

def build_generator(self):

        model = Sequential()

        model.add(Dense(128 * 7 * 7, activation="relu", input_dim=self.latent_dim))
        model.add(Reshape((7, 7, 128)))
        model.add(UpSampling2D())
        model.add(Conv2D(128, kernel_size=3, padding="same"))
        model.add(BatchNormalization(momentum=0.8))
        model.add(Activation("relu"))
        model.add(UpSampling2D())
        model.add(Conv2D(64, kernel_size=3, padding="same"))
        model.add(BatchNormalization(momentum=0.8))
        model.add(Activation("relu"))
        model.add(Conv2D(self.channels, kernel_size=3, padding="same"))
        model.add(Activation("tanh"))

        model.summary()

        noise = Input(shape=(self.latent_dim,))
        img = model(noise)

        return Model(noise, img)

这与仅使用顺序模型有何不同?(对不起,如果这是一个愚蠢的问题)

标签: pythonkerasdeep-learning

解决方案


顺序模型和函数模型在实践中是相同的。除了功能模型,您可以创建更复杂的架构,因为每个层都存储有变量。当您没有独特的“线性”模型并且 GAN 就在其中时,它会很方便。

使用功能 API构建的模型示例:

inputs = Input(shape=(784,))

# a layer instance is callable on a tensor, and returns a tensor
layer1 = Dense(64, activation='relu')(inputs)
layer2 = Dense(64, activation='relu')(layer1)
predictions = Dense(10, activation='softmax')(layer2)

# This creates a model that includes
# the Input layer and three Dense layers
model = Model(inputs=inputs, outputs=predictions)

您清楚地看到每一层都可以轻松访问。而使用Sequential API 也是如此:

model = Sequential()
model.add(Input(shape=(784,))
model.add(Dense(64, activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dense(10, activation='softmax'))

当然,对于这样一个简单的模型,顺序模型更清晰。但是现在如果要添加第二个模型(例如生成器),函数式 API 更简洁,因为您可以为每一层声明一个变量并将该层添加到模型** 在同一行** 而使用顺序 API不能。


推荐阅读