Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否可以在Keras Functional API中创建一个没有输入层的模型?_Python_Tensorflow_Keras_Functional Api - Fatal编程技术网

Python 是否可以在Keras Functional API中创建一个没有输入层的模型?

Python 是否可以在Keras Functional API中创建一个没有输入层的模型?,python,tensorflow,keras,functional-api,Python,Tensorflow,Keras,Functional Api,我想在Keras中创建一个由两个卷积层、一个扁平层和一个致密层组成的模型。这将是一个具有共享权重的模型,因此没有任何预定义的输入层 可以使用顺序方式执行以下操作: 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=

我想在Keras中创建一个由两个卷积层、一个扁平层和一个致密层组成的模型。这将是一个具有共享权重的模型,因此没有任何预定义的输入层

可以使用顺序方式执行以下操作:

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会产生类型错误:

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>
TypeError:层的输入应该是张量。得到了:

这样做是不可能的,还是我遗漏了什么?

keras中的链接通过在层中传播
张量来工作。因此,在第二个示例中,在开始时,
model2
是一个
keras.layers.Layer
的实例,而不是一个
tf.Tensor
,这就是为什么会出现错误

创建一个张量,然后可用于链接层。因此,如果没有具体原因,您只需添加一个:

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

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

从文档中:

在以下情况下,顺序模型不适用:

  • 您的模型具有多个输入或多个输出
  • 任何层都有多个输入或多个输出
  • 你需要做图层共享
  • 您需要非线性拓扑(例如,剩余连接、 多分支模型)
函数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)

上面我们有两个单独的输入,然后是两个密集层-您可以根据需要构建这些单独的线,然后将它们合并在一起以通过卷积层,您需要使用
tf.keras.layers.concatenate
层,然后您可以从那里继续关节模型。将整个内容包装在模型对象中,然后允许您访问训练和推理方法,如拟合/预测等。

您不能添加输入层的具体原因是什么?在API(顺序或函数)中都不可能,没有输入层的神经网络毫无意义,你为什么要做这样的事?我想分享重量。因此,两个独立的输入层,然后是几个共享的卷积层,然后是两个独立的输出层。当然可以只使用一个共享层(),但我还没有看到如何使用更多共享层的示例。但是如果我尝试将更多的链接在一起,就会出现错误。谢谢你的回答。如何附加2个输入层?这就是为什么我想做没有输入层,有一系列没有输入的层,然后将两个单独的输入层传递给序列,制作两个单独的模型,分别输入,单独输出,但共享卷积层。参见更新的答案谢谢,但我想这仍然不是我想要实现的。我想要这样的东西(),但是有多个共享层(他们在链接问题中称之为稠密层)。我可能会问另一个问题,因为我问了X,但我真正需要的是Y。我同意,也许单独问一个问题更清楚。如果您认为我回答了您最初的问题,但我希望您能“接受”: