繁体   English   中英

是否可以在没有输入层的 Keras 功能 API 中创建 model ?

[英]Is it possible to create a model in Keras Functional API without an input layer?

我想创建一个 model,它由 Keras 中的 2 个卷积层、一个展平层和一个密集层组成。 这将是一个具有共享权重的 model,因此没有任何预定义的输入层。

可以使用顺序方式进行:

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Conv2D(10,3,2,'valid',activation=tf.nn.relu))
model.add(tf.keras.layers.Conv2D(20,3,2,'valid',activation=tf.nn.relu))
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(200,activation=tf.nn.relu))

但是,使用功能 API 会产生 TypeError:

model2 = tf.keras.layers.Conv2D(10,3,2,'valid',activation=tf.nn.relu)
model2 = tf.keras.layers.Conv2D(20,3,2,'valid',activation=tf.nn.relu)(model2)
model2 = tf.keras.layers.Flatten()(model2)
model2 = tf.keras.layers.Dense(200,activation=tf.nn.relu)(model2)

错误:

TypeError: Inputs to a layer should be tensors. Got: <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7fb060598100>

这样做是不可能的,还是我错过了什么?

keras 顺序 api 设计为更易于使用,因此不如功能性 api 灵活。 这样做的好处是可以通过传递给它的任何数据形状自动推断输入“层”形状。 缺点是这个更容易使用 model 被简化了,所以你不能做像使用多个输入这样的事情。

来自keras文档:

顺序 model 在以下情况下不适用:

  • 您的 model 有多个输入或多个输出
  • 您的任何层都有多个输入或多个输出
  • 您需要进行图层共享
  • 您想要非线性拓扑(例如残差连接、多分支模型)

功能 api 被设计为更灵活,即多输入,因此它不会为您进行任何类型的自动推理,因此会出现错误。 在这种情况下,您必须显式传递一个输入层。 对于您的用例,它不会自动推断形状可能看起来很奇怪,但是当您考虑更广泛的用例场景时,它是有意义的。

所以第二种情况应该是:

model2 = tf.keras.layers.Input((10,3,2)) # specified input layer
model2 = tf.keras.layers.Conv2D(10,3,2,'valid',activation=tf.nn.relu)(model2)
model2 = tf.keras.layers.Conv2D(20,3,2,'valid',activation=tf.nn.relu)(model2)
model2 = tf.keras.layers.Flatten()(model2)
model2 = tf.keras.layers.Dense(200,activation=tf.nn.relu)(model2)

更新

如果要创建两个单独的模型并将它们连接在一起,则应使用功能 API,然后由于其限制,因此您必须使用输入层。 因此,您可以执行以下操作:

import tensorflow as tf
from tensorflow.keras.layers import Input, Flatten, Dense, concatenate, Conv2D
from tensorflow.keras.models import Model

input1 = Input((10,3,2))
model1 = Dense(200,activation=tf.nn.relu)(input1)

input2 = Input((10,3,2))
model2 = Dense(200,activation=tf.nn.relu)(input2)

merged = concatenate([model1, model2])

merged = Conv2D(10,3,2,'valid',activation=tf.nn.relu)(merged)
merged = Flatten()(merged)
merged = Dense(200,activation=tf.nn.relu)(merged)

model = Model(inputs=[input1, input2], outputs=merged)

上面我们有两个单独的输入,然后是两个 Dense 层 - 您可以根据需要构建这些单独的线,然后将它们合并在一起以通过卷积层,您需要使用tf.keras.layers.concatenate层,以及然后你可以从那里继续联合 model。 将整个东西包装在 Model object 中,然后允许您访问训练和推理方法,如拟合/预测等。

keras中的链接通过在层中传播tensors来工作。 因此,在您的第二个示例中,一开始model2keras.layers.Layer的实例,而不是tf.Tensor的实例,这就是您收到错误的原因。

Input创建一个张量,然后可以使用它来链接图层。 因此,如果没有特定原因,您只需添加一个:

model2 = tf.keras.layers.Input((10,3,2))
model2 = tf.keras.layers.Conv2D(10,3,2,'valid',activation=tf.nn.relu)(model2)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM