属性错误:tensorflow.python.framework.ops.EagerTensor对象没有属性_is_graph_network

时间:2019-07-16 17:17:22

标签: python tensorflow keras nlp tensorflow2.0

我正在重新实现一个text2speech项目。 我在解码器部分遇到属性错误。 网络体系结构来自Deep Voice 3论文。

我正在Google Colab上使用TF 2.0中的keras。 以下是Decoder Keras Model的代码。

y1 = tf.zeros(shape = (16, 203, 320))
def Decoder(name = "decoder"):

    din = tf.concat((tf.zeros_like(y1[:, :1, -hp.mel:]), y1[:, :-1, -hp.mel:]), 1)
    keys = K.Input(shape = (180, 256), batch_size = 16, name = "keys")
    vals = K.Input(shape = (180, 256), batch_size = 16, name = "vals")
    prev_max_attentions_li = tf.ones(shape=(hp.dlayer, hp.batch_size), dtype=tf.int32)

    for i in range(hp.dlayer):
        dpout = K.layers.Dropout(rate = 0 if i == 0 else hp.dropout)(din)
        fc_out = K.layers.Dense(hp.char_embed, activation = 'relu')(dpout)
            query_pe = K.layers.Embedding(hp.Ty, hp.char_embed)(tf.tile(tf.expand_dims(tf.range(hp.Ty // hp.r), 0), [hp.batch_size, 1]))
            key_pe = K.layers.Embedding(hp.Tx, hp.char_embed)(tf.tile(tf.expand_dims(tf.range(hp.Tx), 0), [hp.batch_size, 1]))
    return fc_out

    alignments_li, max_attentions_li = [], []
    for i in range(hp.dlayer):
        dpout = K.layers.Dropout(rate = 0)(fc_out)
        queries = K.layers.Conv1D(hp.datten_size, hp.dfilter, padding = 'causal', dilation_rate = 2**i)(dpout)
        fc_out = (queries + fc_out) * tf.math.sqrt(0.5)
        queries = fc_out + query_pe
        keys += key_pe

        tensor, alignments, max_attentions = Attention(name = "attention")(queries, keys, vals, prev_max_attentions_li[i])

        fc_out = (tensor + queries) * tf.math.sqrt(0.5)

        alignments_li.append(alignments)
        max_attentions_li.append(max_attentions)

    decoder_output = fc_out

    dpout = K.layers.Dropout(rate = 0)(decoder_output)
    mel_logits = K.layers.Dense(hp.mel * hp.r)(dpout)

    dpout = K.layers.Dropout(rate = 0)(fc_out)
    done_output = K.layers.Dense(2)(dpout)

    return K.Model(inputs = [keys, vals], outputs = [mel_logits, done_output, decoder_output, alignments_li, max_attentions_li], name = name)

decoder = Decoder()
keyin = tf.ones(shape = (16, 180, 256))
valin = tf.ones(shape = (16, 180, 256))
#print(decoder((keyin, valin)))
tf.keras.utils.plot_model(decoder, to_file = "decoder.png", show_shapes = True)

当我用一些数据进行测试时,它显示以下错误消息。 我在哪里错了?

--> 129 if not model._is_graph_network:
    130     node = pydot.Node(str(id(model)), label=model.name)
    131     dot.add_node(node)

AttributeError: 'tensorflow.python.framework.ops.EagerTensor' object has no attribute '_is_graph_network'

7 个答案:

答案 0 :(得分:8)

我的情况是,在遇到keras_scratch_graph错误时,tensorflow示例代码在Google colab中工作正常,但在我的机器中无法正常工作。

然后我在开头添加此Python代码,它可以正常工作。

gpus = tf.config.experimental.list_physical_devices('GPU')
if gpus:
    try:
        # Restrict TensorFlow to only use the fourth GPU
        tf.config.experimental.set_visible_devices(gpus[0], 'GPU')

        # Currently, memory growth needs to be the same across GPUs
        for gpu in gpus:
            tf.config.experimental.set_memory_growth(gpu, True)
        logical_gpus = tf.config.experimental.list_logical_devices('GPU')
        print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPUs")
    except RuntimeError as e:
        # Memory growth must be set before GPUs have been initialized
        print(e)

默认情况下,TensorFlow会映射该进程可见的所有GPU的几乎所有GPU内存(受CUDA_VISIBLE_DEVICES约束)。

在某些情况下,希望进程仅分配可用内存的子集,或者仅增加进程所需的内存使用量。

例如,您想同时使用一个GPU训练多个小型模型。 通过调用tf.config.experimental.set_memory_growth,它尝试仅分配运行时分配所需的GPU内存:它开始分配的内存很少,并且随着程序的运行和需要更多的GPU内存,我们扩展了GPU内存分配给TensorFlow流程的区域。

希望有帮助!

答案 1 :(得分:1)

如果您使用Tensorflow-GPU,则添加:

physical_devices = tf.config.experimental.list_physical_devices('GPU')
print("physical_devices-------------", len(physical_devices))
tf.config.experimental.set_memory_growth(physical_devices[0], True)

此外,您可以减小batch_size或更改其他计算机或云服务(例如google colab,亚马逊云)来运行代码,因为我认为这是因为内存的限制。

答案 2 :(得分:1)

在我的情况下,我不得不更新keras和tensorflow

pip install -U tensorflow keras 

答案 3 :(得分:0)

我遇到了类似的错误。我减小了批量大小,错误消失了。我不知道为什么,但是对我有用。我猜是与过度堆叠有关的。

答案 4 :(得分:0)

我认为这与gpu有关。看一下回溯:

  
File "/Users/ydc/dl-npm/lib/python3.7/site-packages/tensorflow/python/eager/function.py", line 572, in __call__
    return self._call_flat(args)

tf正在呼吁执行,这意味着如果有可用的版本,将使用gpu。在测试密集网络时,我遇到了同样的问题:

inputs=Input(shape=(100,)
             )
x=Dense(32, activation='relu')(inputs)
x=Dense(32, activation='relu')(x)
x=Dense(32, activation='relu')(x)
outputs=Dense(10, activation='softmax')(x)
model=Model(inputs=inputs, outputs=outputs)
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
t=tf.zeros([1,100])
model.predict(t, steps=1, batch_size=1)

...它给出了类似的回溯,也链接到了渴望执行的地方。 然后,当我使用以下行禁用gpu时:

tf.config.experimental.set_visible_devices([], 'GPU')

...代码运行正常。看看这是否有助于解决问题。 顺便说一句,colab甚至支持gpu吗?我什至都不知道。

答案 5 :(得分:0)

您需要在脚本顶部添加此代码,它在TensorFlow 2.2.0上对我有效

if tf.config.list_physical_devices('GPU'):
    physical_devices = tf.config.list_physical_devices('GPU')
    tf.config.experimental.set_memory_growth(physical_devices[0], enable=True)
    tf.config.experimental.set_virtual_device_configuration(physical_devices[0], [tf.config.experimental.VirtualDeviceConfiguration(memory_limit=4000)])

答案 6 :(得分:-1)

以下Tensorflow和Keras版本消除了我的问题:

UINavigationController