如何在 Keras Functional API 中创建具有多个共享层的模型?
How to create a model with multiple shared layers in Keras Functional API?
我想要一个有 2 个输入的模型,几个共享权重的隐藏层,然后是单独的输出层。
我看过这个问题及其接受的答案:。这正是我想要实现的,只是有多个共享的密集层。
基本上,这就是他们所做的:
(我稍微修改了一下,让它有 2 个独立的输出层)
ip_shape1 = tf.keras.layers.Input(shape=(5,))
ip_shape2 = tf.keras.layers.Input(shape=(5,))
dense = tf.keras.layers.Dense(1, activation="sigmoid", kernel_initializer="ones")
op1 = dense(ip_shape1)
op2 = dense(ip_shape2)
op1 = tf.keras.layers.Dense(1,activation=tf.nn.sigmoid)(op1)
op2 = tf.keras.layers.Dense(1,activation=tf.nn.sigmoid)(op2)
model = tf.keras.models.Model(inputs=[ip_shape1, ip_shape2], outputs=[op1,op2])
我想做同样的事情,只是有 2 个共享隐藏层:
ip_shape1 = tf.keras.layers.Input(shape=(5,))
ip_shape2 = tf.keras.layers.Input(shape=(5,))
dense = tf.keras.layers.Dense(1, activation="sigmoid", kernel_initializer="ones", input_shape=(5,))
dense = tf.keras.layers.Dense(1, activation="sigmoid", kernel_initializer="ones")(dense)
op1 = dense(ip_shape1)
op2 = dense(ip_shape2)
op1 = tf.keras.layers.Dense(1,activation=tf.nn.sigmoid)(op1)
op2 = tf.keras.layers.Dense(1,activation=tf.nn.sigmoid)(op2)
model = tf.keras.models.Model(inputs=[ip_shape1, ip_shape2], outputs=[op1,op2])
但是当我尝试这样做时,出现错误:
TypeError: Inputs to a layer should be tensors. Got: <tensorflow.python.keras.layers.core.Dense object at 0x7f7286dc7c70>
错误发生在以下行:
dense = tf.keras.layers.Dense(1, activation="sigmoid", kernel_initializer="ones")(dense)
本质上,你是在用 dense
(另一个 Keras 层)调用密集层。相反,层 tf.keras.layers.Dense
需要一个张量作为输入。
我假设你想合成两个共享的密集层。这可以通过以下方式实现:
dense_1 = tf.keras.layers.Dense(1, activation="sigmoid", kernel_initializer="ones", input_shape=(5,))
dense_2 = tf.keras.layers.Dense(1, activation="sigmoid", kernel_initializer="ones")
op1 = dense_1(ip_shape1)
op1 = dense_2(op1)
op2 = dense_1(ip_shape2)
op2 = dense_2(op2)
注意:未测试。
我想要一个有 2 个输入的模型,几个共享权重的隐藏层,然后是单独的输出层。
我看过这个问题及其接受的答案:
基本上,这就是他们所做的:
(我稍微修改了一下,让它有 2 个独立的输出层)
ip_shape1 = tf.keras.layers.Input(shape=(5,))
ip_shape2 = tf.keras.layers.Input(shape=(5,))
dense = tf.keras.layers.Dense(1, activation="sigmoid", kernel_initializer="ones")
op1 = dense(ip_shape1)
op2 = dense(ip_shape2)
op1 = tf.keras.layers.Dense(1,activation=tf.nn.sigmoid)(op1)
op2 = tf.keras.layers.Dense(1,activation=tf.nn.sigmoid)(op2)
model = tf.keras.models.Model(inputs=[ip_shape1, ip_shape2], outputs=[op1,op2])
我想做同样的事情,只是有 2 个共享隐藏层:
ip_shape1 = tf.keras.layers.Input(shape=(5,))
ip_shape2 = tf.keras.layers.Input(shape=(5,))
dense = tf.keras.layers.Dense(1, activation="sigmoid", kernel_initializer="ones", input_shape=(5,))
dense = tf.keras.layers.Dense(1, activation="sigmoid", kernel_initializer="ones")(dense)
op1 = dense(ip_shape1)
op2 = dense(ip_shape2)
op1 = tf.keras.layers.Dense(1,activation=tf.nn.sigmoid)(op1)
op2 = tf.keras.layers.Dense(1,activation=tf.nn.sigmoid)(op2)
model = tf.keras.models.Model(inputs=[ip_shape1, ip_shape2], outputs=[op1,op2])
但是当我尝试这样做时,出现错误:
TypeError: Inputs to a layer should be tensors. Got: <tensorflow.python.keras.layers.core.Dense object at 0x7f7286dc7c70>
错误发生在以下行:
dense = tf.keras.layers.Dense(1, activation="sigmoid", kernel_initializer="ones")(dense)
本质上,你是在用 dense
(另一个 Keras 层)调用密集层。相反,层 tf.keras.layers.Dense
需要一个张量作为输入。
我假设你想合成两个共享的密集层。这可以通过以下方式实现:
dense_1 = tf.keras.layers.Dense(1, activation="sigmoid", kernel_initializer="ones", input_shape=(5,))
dense_2 = tf.keras.layers.Dense(1, activation="sigmoid", kernel_initializer="ones")
op1 = dense_1(ip_shape1)
op1 = dense_2(op1)
op2 = dense_1(ip_shape2)
op2 = dense_2(op2)
注意:未测试。