Стек вызовов функций: ошибка keras_scratch_graph

Я повторно реализую проект text2speech. Я столкнулся с ошибкой Function call stack: keras_scratch_graph в части декодера. Сетевая архитектура взята из статьи Deep Voice 3.

Я использую keras из TF 2.0 в Google Colab. Ниже приведен код для модели Decoder Keras.

y1 = tf.ones(shape = (16, 203, 320))
def Decoder(name = "decoder"):
    # Decoder Prenet
    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)
    #prev_max_attentions_li = K.Input(tensor = prev_max_attentions_li)
    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)

    print("=======================================================================================================")
    print("The FC value is ", fc_out)
    print("=======================================================================================================")

    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]))

    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)
        print("=======================================================================================================")
        print("The FC value is ", fc_out)
        print("=======================================================================================================")
        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)

decode = Decoder()
kin = tf.ones(shape = (16, 180, 256))
vin = tf.ones(shape = (16, 180, 256))
print(decode(kin, vin))
tf.keras.utils.plot_model(decode, to_file = "decoder.png", show_shapes = True)

Когда я тестирую некоторые данные, он показывает сообщения об ошибках ниже. Будут проблемы с "fc_out", но я не знаю, как передать вывод "fc_out" из первого цикла for во второй цикл for? Любой ответ будет оценен.

File "Decoder.py", line 60, in <module>
    decode = Decoder()
  File "Decoder.py", line 33, in Decoder
    dpout = K.layers.Dropout(rate = 0)(fc_out)
  File "/Users/ydc/dl-npm/lib/python3.7/site-packages/tensorflow/python/keras/engine/base_layer.py", line 596, in __call__
    base_layer_utils.create_keras_history(inputs)
  File "/Users/ydc/dl-npm/lib/python3.7/site-packages/tensorflow/python/keras/engine/base_layer_utils.py", line 199, in create_keras_history
    _, created_layers = _create_keras_history_helper(tensors, set(), [])
  File "/Users/ydc/dl-npm/lib/python3.7/site-packages/tensorflow/python/keras/engine/base_layer_utils.py", line 245, in _create_keras_history_helper
    layer_inputs, processed_ops, created_layers)
  File "/Users/ydc/dl-npm/lib/python3.7/site-packages/tensorflow/python/keras/engine/base_layer_utils.py", line 245, in _create_keras_history_helper
    layer_inputs, processed_ops, created_layers)
  File "/Users/ydc/dl-npm/lib/python3.7/site-packages/tensorflow/python/keras/engine/base_layer_utils.py", line 245, in _create_keras_history_helper
    layer_inputs, processed_ops, created_layers)
  File "/Users/ydc/dl-npm/lib/python3.7/site-packages/tensorflow/python/keras/engine/base_layer_utils.py", line 243, in _create_keras_history_helper
    constants[i] = backend.function([], op_input)([])
  File "/Users/ydc/dl-npm/lib/python3.7/site-packages/tensorflow/python/keras/backend.py", line 3510, in __call__
    outputs = self._graph_fn(*converted_inputs)
  File "/Users/ydc/dl-npm/lib/python3.7/site-packages/tensorflow/python/eager/function.py", line 572, in __call__
    return self._call_flat(args)
  File "/Users/ydc/dl-npm/lib/python3.7/site-packages/tensorflow/python/eager/function.py", line 671, in _call_flat
    outputs = self._inference_function.call(ctx, args)
  File "/Users/ydc/dl-npm/lib/python3.7/site-packages/tensorflow/python/eager/function.py", line 445, in call
    ctx=ctx)
  File "/Users/ydc/dl-npm/lib/python3.7/site-packages/tensorflow/python/eager/execute.py", line 67, in quick_execute
    six.raise_from(core._status_to_exception(e.code, message), None)
  File "<string>", line 3, in raise_from
tensorflow.python.framework.errors_impl.FailedPreconditionError:  Error while reading resource variable _AnonymousVar19 from Container: localhost. This could mean that the variable was uninitialized. Not found: Resource localhost/_AnonymousVar19/N10tensorflow3VarE does not exist.
     [[node dense_7/BiasAdd/ReadVariableOp (defined at Decoder.py:33) ]] [Op:__inference_keras_scratch_graph_566]

Function call stack:
keras_scratch_graph


person user8882401    schedule 16.07.2019    source источник
comment
Вы решили эту проблему?? Я столкнулся с той же проблемой сейчас.   -  person Sree    schedule 14.10.2019


Ответы (7)


Моя ситуация заключается в том, что пример кода tensorflow отлично работает в Google Colab, но не на моей машине, так как я получил ошибку keras_scratch_graph.

Затем я добавляю этот код 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 отображает почти всю память графического процессора всех графических процессоров (с учетом CUDA_VISIBLE_DEVICES), видимых для процесса.

В некоторых случаях желательно, чтобы процесс выделял только подмножество доступной памяти или увеличивал использование памяти только по мере необходимости.

Например, вы хотите одновременно обучить несколько небольших моделей с помощью одного графического процессора. Вызывая tf.config.experimental.set_memory_growth, который пытается выделить ровно столько памяти GPU, сколько необходимо для распределения во время выполнения: вначале выделяется очень мало памяти, а по мере запуска программы и необходимости большего объема памяти GPU мы расширяем область памяти GPU, выделенную для Процесс TensorFlow.

Надеюсь, поможет!

person kenchan13    schedule 08.01.2020
comment
Спасибо за развернутый ответ. Я сталкиваюсь с той же ошибкой, когда tf.config.experimental.list_physical_devices('GPU') дает пустой список, т.е. gpus равно False. Можете ли вы представить себе причину этого? - person Leonard; 27.01.2020
comment
@Rumo В основном это проблема установки. Если вы используете TF 2.0+, простой способ проверить, установили ли вы TF с поддержкой графического процессора, — использовать либо tf.test.is_built_with_cuda(), либо tf.test.is_built_with_gpu_support(). Если это возвращает False, вам придется переустановить TensorFlow, как описано в документации. - person Suraj Donthi; 28.01.2020
comment
@SurajDonthi Спасибо, но я не хочу использовать поддержку графического процессора. Я имел в виду, что эта ошибка связана не только с проблемами графического процессора. В моем случае причина заключалась в том, что я использовал tf.metrics.iou, который не поддерживается для нетерпеливого режима. Заработало после перехода на tf.keras.MeanIoU. Я думаю, что эта ошибка может возникнуть по очень разным причинам. - person Leonard; 29.01.2020

Я получал аналогичную ошибку. Я уменьшил размер пакета, и ошибка исчезла. Я не знаю почему, но это сработало для меня. Я предполагаю, что что-то связано с чрезмерным стекированием.

person phoenix    schedule 06.11.2019
comment
это исправило это для меня, спасибо - person dasvootz; 06.02.2021

Я думаю, что дело в графическом процессоре. посмотрите на трассировку:

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? Я даже не знал.

person Magister    schedule 17.11.2019

Если вы используете 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)

Кроме того, вы можете уменьшить размер пакета или изменить другой компьютер или облачные сервисы, такие как Google Colab, Amazon Cloud, для запуска ваших кодов, потому что я думаю, что это связано с ограничением памяти.

person Lingfeng Zhang    schedule 02.04.2020

в моем случае мне пришлось обновить keras и tensorflow

pip install -U tensorflow keras 
person Paddy    schedule 06.08.2020

Вам нужно добавить этот код вверху вашего скрипта, у меня он работает на 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)])
person Sadidul Islam    schedule 27.07.2020

Следующая версия Tensorflow и Keras удалила мою проблему:

tensorflow==2.2.0
keras=2.3.1
person Hafizur Rahman    schedule 15.06.2020
comment
У меня есть эти версии keras и tensorflow, и все еще есть эта ошибка. - person Ahmad Moussa; 18.06.2020
comment
Вы пробовали keras=2.3.2? - person Hafizur Rahman; 19.06.2020