【问题标题】:Graph disconnected: cannot obtain value for tensor Tensor("conv2d_1_input:0", shape=(?, 128, 128, 1), dtype=float32)图表断开:无法获取张量的值 Tensor("conv2d_1_input:0", shape=(?, 128, 128, 1), dtype=float32)
【发布时间】:2020-01-16 10:42:04
【问题描述】:

我正在尝试实现一个自动编码器,它可以获取 3 个不同的输入并融合这三个图像。我想在编码器中获取层的输出并将其与解码器中的层连接,但是当我运行它时,我得到图形断开错误。 这是我的代码:

def create_model(input_shape):
   input_1 = keras.layers.Input(input_shape)
   input_2 = keras.layers.Input(input_shape)
   input_3 = keras.layers.Input(input_shape)

   network = keras.models.Sequential([
   keras.layers.Conv2D(32, (7, 7), activation=tf.nn.relu, padding='SAME',input_shape=input_shape),
   keras.layers.Conv2D(32, (7, 7), activation=tf.nn.relu, padding='SAME', name = 'a'),
   keras.layers.AvgPool2D((2, 2)),
   keras.layers.BatchNormalization(),
   keras.layers.Dropout(0.3)])

   encoded_1 = network(input_1)
   encoded_2 = network(input_2)
   encoded_3 = network(input_3)

   a = network.get_layer('a').output

   x = keras.layers.Concatenate()([encoded_1,encoded_2,encoded_3])

   x = keras.layers.Conv2D(32, (3, 3), activation=tf.nn.relu, padding='SAME')(x)
   x = keras.layers.UpSampling2D((2,2))(x)
   x = keras.layers.BatchNormalization()(x)
   x = keras.layers.Dropout(0.3)(x)

   x = keras.layers.Concatenate()([x,a])
   x = keras.layers.Conv2D(32, (3, 3), activation=tf.nn.relu, padding='SAME')(x)
   x = keras.layers.UpSampling2D((2,2))(x)
   x = keras.layers.BatchNormalization()(x)
   x = keras.layers.Dropout(0.3)(x)

   decoded = keras.layers.Conv2D(3, (3, 3), activation=tf.nn.relu, padding='SAME')(x)

   final_net= keras.models.Model(inputs=[input_1,input_2,input_3],outputs=decoded)
   return final_net

错误是:

图形断开连接:无法在“conv2d_1_input”层获取张量 Tensor("conv2d_1_input:0", shape=(?, 128, 128, 1), dtype=float32) 的值。访问以下之前的层没有问题:['input_6', 'input_5', 'input_4', 'sequential_1', 'sequential_1', 'sequential_1', 'concatenate', 'conv2d_2']

这是因为连接了 [x,a]。我试图从三个图像中获取层的输出,例如:

encoder_1.get_layer('a').output
encoder_2.get_layer('a').output
encoder_3.get_layer('a').output

但我得到一个错误“'Tensor' object has no attribute 'output'

【问题讨论】:

  • a = network.get_layer('a').output 这是有问题的行。您试图在不提供实际输入的情况下获得层的输出。你到底想在这里做什么?
  • 我想将这三幅图像输入网络,然后为每幅图像获取层 'a' 的输出,然后将它们连接起来并在解码器中使用。例如,我连接'a1,a2,a3',它们分别是每个图像的输出,然后在解码器中使用它们。我想将其用作跳过连接层。
  • 澄清:'a1,a2,a3' 是每个图像的层 'a' 的输出,我想将它们连接起来并在解码器中使用它们跨度>

标签: python tensorflow keras autoencoder


【解决方案1】:

如果需要获取a1a2a3 输出,则需要创建子网。并且可以连接xa如下。

def create_model(input_shape):
   input_1 = keras.layers.Input(input_shape)
   input_2 = keras.layers.Input(input_shape)
   input_3 = keras.layers.Input(input_shape)

   network = keras.models.Sequential([
   keras.layers.Conv2D(32, (7, 7), activation=tf.nn.relu, padding='SAME',input_shape=input_shape),
   keras.layers.Conv2D(32, (7, 7), activation=tf.nn.relu, padding='SAME', name = 'a'),
   keras.layers.AvgPool2D((2, 2)),
   keras.layers.BatchNormalization(),
   keras.layers.Dropout(0.3)])

   encoded_1 = network(input_1)
   encoded_2 = network(input_2)
   encoded_3 = network(input_3)

   subnet = keras.models.Sequential()
   for l in network.layers:
     subnet.add(l)
     if l.name == 'a': break

   a1 = subnet(input_1)
   a2 = subnet(input_2)
   a3 = subnet(input_3)

   x = keras.layers.Concatenate()([encoded_1,encoded_2,encoded_3])
   a = keras.layers.Concatenate()([a1,a2,a3])

   x = keras.layers.Conv2D(32, (3, 3), activation=tf.nn.relu, padding='SAME')(x)
   x = keras.layers.UpSampling2D((2,2))(x)
   x = keras.layers.BatchNormalization()(x)
   x = keras.layers.Dropout(0.3)(x)

   x = keras.layers.Concatenate()([x,a])
   x = keras.layers.Conv2D(32, (3, 3), activation=tf.nn.relu, padding='SAME')(x)
   x = keras.layers.UpSampling2D((2,2))(x)
   x = keras.layers.BatchNormalization()(x)
   x = keras.layers.Dropout(0.3)(x)

   decoded = keras.layers.Conv2D(3, (3, 3), activation=tf.nn.relu, padding='SAME')(x)

   final_net= keras.models.Model(inputs=[input_1,input_2,input_3],outputs=decoded)
   return final_net

【讨论】:

  • 感谢您的回答,但首先,我将对 x 进行上采样,然后连接 xa。我的问题是如何获得 a1、a2、a3 以及如何使用它们。我使用了您的想法,但在上一行中出现了一个新错误,因为“应在至少 2 个输入的列表上调用 Concatenate
  • 非常感谢。一切都好,谢谢。我只有一个问题:这个网络是否准确地得到了原始网络层中的内容?我的意思是他们得到了准确的输出吗?
  • @A.omrani 没有得到你的问题。你能改写吗?
  • 让我从一开始就解释一下,我想得到每个图像的层 'a' 的确切输出。我的意思是,当我将每个图像输入网络时,'a' 层将为每个图像提取一些特定特征,我想在解码器中使用这些特征。所以我的问题是,当我使用这个子网并获得层 'a' 的输出时,这些特征是否与每个图像的原始网络相同?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-11
  • 2019-10-23
  • 2018-04-25
  • 2019-06-06
  • 1970-01-01
  • 2019-04-22
相关资源
最近更新 更多