gpt4 book ai didi

python - 为什么我们说 Keras 中的函数式 API 用于非顺序模型?

转载 作者:太空宇宙 更新时间:2023-11-03 12:36:49 24 4
gpt4 key购买 nike

据我所知,我们仍然需要创建一个模型并使用 functional API 向模型添加层。 .为什么有人说函数式人工智能是用来创建非时序神经网络的?

最佳答案

Why people said it is used to non-sequential neural network?

问题在于,对于 Sequential Model,当您调用 .add() 方法时,您将逐步(顺序)定义模型。然而,在函数式 API(特别是 Model 类)上,您有更多的自由,因为您可以定义接收不同输入的不同,然后实例化 一个模型,其中 Model 创建者使用这些层中的任何一个(不一定以逐步或顺序的方式)。

换句话说,当调用 model = Sequential() 时,您在那一刻实例化您的模型对象(然后为其添加层和约束)。在函数式 API 中,您创建图层,然后通过调用 model = Model(inputs=in, outputs=out) 来实例化您的模型,其中包含您想要的输入和输出图层).如您所见,这两种方法可以等效,例如,这两种方法是相同的:

from keras.models import Sequential, Model
from keras.layers import Input, Dense, Activation
#---Using the Sequential model
model = Sequential() #Object is instantiated here
model.add(Dense(32, input_dim=784))
model.add(Activation('relu'))
#---Or using the Functional API
a = Input(shape=(784,))
b = Dense(32, activation='relu')(a)
model = Model(inputs=a, outputs=b) #Object is instantiated here

仅考虑这一点,那么选择走哪条路更多取决于您的个人风格和编码偏好。现在,与顺序模型相比,使用函数式 API 有一个主要优势,即您可以在不同模型之间共享或重用层

编译和拟合模型时,将编译和训练其所有关联层。因此,共享这些层的任何其他模型也将反射(reflect)这些变化。这使您可以自由地做很多事情,例如获取网络的子模型、重新定义它们、获取其相关输出、将它们合并到更复杂的模型中等等,而无需为每个子模型再次训练。

为了更清楚地说明,这里有一个示例(基于 this Keras Autoencoder 博客文章)说明了上一段中讨论的内容:

from keras.layers import Input, Dense
from keras.models import Model
#Create an autoencoder, along with its encoder and decoder model
input_img = Input(shape=(784,))
encoded = Dense(32, activation='relu')(input_img)
decoded = Dense(784, activation='sigmoid')(encoded)

#Here we define our autoencoder model: image -> encoding -> decoded image
autoencoder = Model(input_img, decoded)

#Now here is the advantage of the Funcional API
#We can reuse those layers to obtain an encoder model (image -> encoding)
#as well as a decoder model (encoding -> image)
#but compile all three by just compiling and fitting the Autoencoder model
encoder = Model(input_img, encoded) #see how the 'encoded' layer is output
# create a placeholder for an encoded (32-dimensional) input
encoded_input = Input(shape=(32,))
# retrieve the last layer of the autoencoder model
decoder_layer = autoencoder.layers[-1]
# create the decoder model
decoder = Model(encoded_input, decoder_layer(encoded_input))
#compile and fit with your data
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')
autoencoder.fit(X,Y,...)

在此之后,您将能够分别对 encoderdecoder 模型进行预测(例如,可视化您的编码),以及使用autoencoder 模型作为一个整体。此时,做下面的事情是等价的:

#obtain reconstructed representation directly
autoencoder_imgs = autoencoder.predict(x_test)
#obtain reconstructed representation by joining encoder and decoder models
encoder_imgs = encoder.predict(x_test)
decoded_imgs = decoder.predict(encoded_imgs)

希望这对您有所帮助。就个人而言,我总是尝试改用函数式 API,无论我是否想重用或回收层,因为发现它更冗长,但这取决于您的决定。

关于python - 为什么我们说 Keras 中的函数式 API 用于非顺序模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47274299/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com