【问题标题】:Why do I get this graph disconnected error?为什么我会收到此图断开连接错误?
【发布时间】:2020-01-31 13:01:42
【问题描述】:

我正在尝试创建一个densenet,但是当我尝试编译模型时,我收到了这个错误消息。这是我的模型:

from tensorflow import keras
from keras.utils import plot_model
dropoutRate = 0.2

def globalAvgPooling(x):
  height = np.shape(x)[2]
  width = np.shape(x)[1]
  poolSize = [width, height]
  return tf.keras.layers.AveragePooling2D(pool_size=poolSize, strides=1)(x)

def concatenation(layers):
  return tf.keras.layers.concatenate(layers, axis=3)

class DenseNet():
  def __init__(self, filters, numBlocks, numClasses, training):
    self.filters = filters
    self.numBlocks = numBlocks
    self.training = training
    self.numClasses = numClasses
    self.model = self.denseNet()

  def bottleneckLayer(self, inputX):
    x = tf.keras.layers.BatchNormalization()(inputs=inputX, training=self.training)
    x = tf.keras.activations.relu(x)
    x = tf.keras.layers.Conv2D(use_bias=False, filters=self.filters, kernel_size=1, strides=1, padding='same')(x)
    x = tf.layers.dropout(inputs=x, rate=dropoutRate, training=self.training)
    x = tf.keras.layers.BatchNormalization()(inputs=inputX, training=self.training)
    x = tf.keras.activations.relu(x)
    x = tf.keras.layers.Conv2D(use_bias=False, filters=self.filters, kernel_size=3, strides=1, padding='same')(x)
    x = tf.layers.dropout(inputs=x, rate=dropoutRate, training=self.training)
    return x


  def denseBlock(self, inputX, numLayers):
    concatLayers = list()
    concatLayers.append(inputX)
    x = self.bottleneckLayer(inputX=inputX)
    concatLayers.append(x)
    for i in range(self.numBlocks - 1):
      x = concatenation(concatLayers)
      x = self.bottleneckLayer(inputX=x)
      concatLayers.append(x)

    x = concatenation(concatLayers)
    return x


  def transitionLayer(self, inputX):
    x = tf.keras.layers.BatchNormalization()(inputs=inputX, training=self.training)
    x = tf.keras.activations.relu(x)
    x = tf.keras.layers.Conv2D(use_bias=False, filters=self.filters, kernel_size=1, strides=1, padding='same')(x)
    x = tf.layers.dropout(inputs=x, rate=dropoutRate, training=self.training)
    x = tf.keras.layers.AveragePooling2D(pool_size=[2,2], strides=2, padding='valid')(x)
    return x

  def denseNet(self):
    inputs = keras.Input(shape=(32,32,3))
    x = tf.keras.layers.Conv2D(use_bias=False, filters=self.filters, kernel_size=7, strides=1, padding='same')(inputs)
    x = self.denseBlock(inputX=x, numLayers=6) #Dense block 1 with 6 layers
    x = self.transitionLayer(inputX=x)
    x = self.denseBlock(inputX=x, numLayers=12) #Dense block 2 with 12 layers
    x = self.transitionLayer(inputX=x)
    x = self.denseBlock(inputX=x, numLayers= 48) #Dense block 3 with 48 layers
    x = self.transitionLayer(inputX=x)
    x = self.denseBlock(inputX=x, numLayers=32) #Dense block 4 with 32 layers (final block)
    x = globalAvgPooling(x=x)
    x = tf.keras.layers.Softmax()(x)
    outputs = tf.keras.layers.Dense(units=self.numClasses)(x)
    model = keras.Model(inputs=inputs, outputs=outputs)
    return x
tf.compat.v1.disable_eager_execution()
growthK = 24
numBlock = 2

cameraModel = DenseNet(filters=growthK, numBlocks=numBlock, numClasses=4, training=True).model

这是我收到的错误消息:

ValueError: Graph disconnected: cannot obtain value for tensor 
    Tensor("dropout_109/dropout/mul_1:0", shape=(?, 32, 32, 24), dtype=float32)
    at layer "concatenate_48". The following previous layers were accessed without issue:
    ['input_6', 'conv2d_120', 'batch_normalization_115', 'tf_op_layer_Relu_115', 'conv2d_122', 'dropout_108']

我做错了什么?

【问题讨论】:

  • 知道dropout_109是哪一层吗?

标签: python tensorflow keras deep-learning


【解决方案1】:

错误来自以下行:

x = tf.keras.layers.BatchNormalization()(inputs=inputX, training=self.training)

因为我认为您的 inputs 参数不好。 它应该看起来像:

x = tf.keras.layers.BatchNormalization()(inputs=x, training=self.training)

这就是图断开连接的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-22
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    相关资源
    最近更新 更多