我正在重新实现一个 text2speech 项目。我在解码器部分面临 函数调用堆栈:keras_scratch_graph 错误。网络架构来自 Deep Voice 3 论文。
我在 Google Colab 上使用来自 TF 2.0 的 keras。下面是解码器 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
原文由 user8882401 发布,翻译遵循 CC BY-SA 4.0 许可协议
我的情况是 tensorflow 示例代码在 Google colab 中运行良好,但在我的机器中运行不正常,因为我遇到了 keras_scratch_graph 错误。
然后我在开头添加这段 Python 代码,它工作正常。
默认情况下,TensorFlow 映射进程可见的所有 GPU 的几乎所有 GPU 内存(受制于
CUDA_VISIBLE_DEVICES
)。在某些情况下,希望进程只分配可用内存的一个子集,或者只增加进程需要的内存使用量。
例如,你想同时用一个 GPU 训练多个小模型。通过调用
tf.config.experimental.set_memory_growth
,它尝试只分配运行时分配所需的 GPU 内存:它开始分配非常少的内存,并且随着程序运行和需要更多 GPU 内存,我们扩展分配给 TensorFlow 进程的 GPU 内存区域。希望能帮助到你!