【问题标题】:How to fix ValueError: Graph disconnected: cannot obtain value for tensor in tensorflow?如何修复 ValueError: Graph disconnected: cannot get value for tensor in tensorflow?
【发布时间】:2021-05-22 17:37:51
【问题描述】:

当我使用 tf.kears.layer 功能 API 构建我的实验模型时,我得到了 GraphDisconnected 错误,如下所示:

ValueError Traceback(最近调用 最后)

在 () 35 个输出 = x 36 ---> 37 模型 = tf.keras.Model(输入=输入,输出=输出) 38 模型.summary()

4 帧

/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/functional.py 在_map_graph_network(输入,输出) 988 '以下前几层 ' 989 '被访问没有问题:' + --> 990 str(layers_with_complete_input)) 991 for x in nest.flatten(node.outputs): 第992章

ValueError: Graph disconnected: cannot get value for tensor Tensor("input_63:0", shape=(?, 32, 32, 32), dtype=float32) 在层 “tf_op_layer_Pow_105”。访问了以下先前的层 没有问题:[]

为了理解这个错误,我查看了可能的 SO 帖子,但无法删除该错误。我认为这是因为某些层的形状不匹配。我仔细检查了每一层的形状,但错误仍然存​​在。我不确定是什么导致了问题。任何人都可以提出解决此错误的可能想法吗?有什么快速解决办法吗?

更新:我的完整编码尝试

def my_func(x):
    n = 2
    c = tf.constant([1, -1/6], dtype=tf.float32)
    p = tf.constant([1,3], dtype=tf.float32)
    W,H, C = x.shape[1:].as_list()
    inputs = tf.keras.Input(shape=(W,H,C))
    xx = inputs
    res = []
    for i in range(n):
        m = c[i] * tf.math.pow(xx, p[i])
        res.append(m)
    csum = tf.math.cumsum(res)
    csum_tr = tf.transpose(csum, perm=[1, 2, 3, 4, 0])
    new_x = tf.reshape(csum_tr, tf.constant([-1, W, H, C*n]))
    return new_x

inputs = tf.keras.Input(shape=(32,32,3))

conv_1 = Conv2D(64, kernel_size = (3, 3), padding='same')(inputs)
BN_1 = BatchNormalization(axis=-1)(conv_1)
pool_1 = MaxPooling2D(strides=(1,1), pool_size=(3,3), padding='same')(BN_1)
z0 = my_func(pool_1)

conv_2 = Conv2D(64, kernel_size = (3, 3), padding='same')(z0)
BN_2 = BatchNormalization(axis=-1)(conv_2)
pool_2 = MaxPooling2D(strides=(1,1), pool_size=(3,3), padding='same')(BN_2)
z1 = my_func(pool_2)
merged_2 = concatenate([z0, z1], axis=-1)
act_2 = Activation('tanh')(merged_2)

x = Conv2D(64, kernel_size = (3, 3), padding='same', activation='relu')(act_2)
x = BatchNormalization(axis=-1)(x)
x = Activation('relu')(x)
x = MaxPooling2D(pool_size=(3,3))(x)
x = Dropout(0.1)(x)

x = Flatten()(x)
x = Dense(128)(x)
x = BatchNormalization()(x)
x = Activation('tanh')(x)
x = Dropout(0.1)(x)

x = Dense(10)(x)
x = Activation('softmax')(x)
outputs = x

model = tf.keras.Model(inputs=inputs, outputs=outputs)
model.summary()

谁能指出导致问题的原因?我应该如何修复上面的图表断开错误?有什么快速的想法吗?谢谢!

【问题讨论】:

    标签: python tensorflow machine-learning keras deep-learning


    【解决方案1】:

    这是编写自定义函数的正确方法...无需使用额外的Input

    def my_func(x):
        
        n = 2
        c = tf.constant([1, -1/6], dtype=tf.float32)
        p = tf.constant([1,3], dtype=tf.float32)
        W, H, C = x.shape[1:].as_list()
    
        res = []
        for i in range(n):
            m = c[i] * tf.math.pow(x, p[i])
            res.append(m)
        
        csum = tf.math.cumsum(res)
        csum_tr = tf.transpose(csum, perm=[1, 2, 3, 4, 0])
        new_x = tf.reshape(csum_tr, tf.constant([-1, W, H, C*n]))
        
        return new_x
    

    您可以使用Lambda 层将其简单地应用到您的网络中

    inputs = tf.keras.Input(shape=(32,32,3))
    
    conv_1 = Conv2D(64, kernel_size = (3, 3), padding='same')(inputs)
    BN_1 = BatchNormalization(axis=-1)(conv_1)
    pool_1 = MaxPooling2D(strides=(1,1), pool_size=(3,3), padding='same')(BN_1)
    z0 = Lambda(my_func)(pool_1)  ## <=================
    
    conv_2 = Conv2D(64, kernel_size = (3, 3), padding='same')(z0)
    BN_2 = BatchNormalization(axis=-1)(conv_2)
    pool_2 = MaxPooling2D(strides=(1,1), pool_size=(3,3), padding='same')(BN_2)
    z1 = Lambda(my_func)(pool_2)  ## <=================
    merged_2 = concatenate([z0, z1], axis=-1)
    act_2 = Activation('tanh')(merged_2)
    
    x = Conv2D(64, kernel_size = (3, 3), padding='same', activation='relu')(act_2)
    x = BatchNormalization(axis=-1)(x)
    x = Activation('relu')(x)
    x = MaxPooling2D(pool_size=(3,3))(x)
    x = Dropout(0.1)(x)
    
    x = Flatten()(x)
    x = Dense(128)(x)
    x = BatchNormalization()(x)
    x = Activation('tanh')(x)
    x = Dropout(0.1)(x)
    
    x = Dense(10)(x)
    x = Activation('softmax')(x)
    outputs = x
    
    model = tf.keras.Model(inputs=inputs, outputs=outputs)
    model.summary()
    

    【讨论】:

      猜你喜欢
      • 2020-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-20
      • 2019-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多