Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow Keras上的多GPU模型(带状态的LSTM)不工作_Tensorflow_Keras_Lstm_Multi Gpu - Fatal编程技术网

Tensorflow Keras上的多GPU模型(带状态的LSTM)不工作

Tensorflow Keras上的多GPU模型(带状态的LSTM)不工作,tensorflow,keras,lstm,multi-gpu,Tensorflow,Keras,Lstm,Multi Gpu,我正在使用keras(Tensorflow后端)开发有状态的LSTM模型;我不能在多GPU平台上并行化它。我得到以下错误 tensorflow.python.framework.errors\u impl.InvalidArgumentError:不兼容的形状:[256,75,39]与[512,75,39] [[Node:training/cna/gradients/loss/concatenate_1_loss/mul_grad/BroadcastGradientArgs=BroadcastG

我正在使用keras(Tensorflow后端)开发有状态的LSTM模型;我不能在多GPU平台上并行化它。我得到以下错误

tensorflow.python.framework.errors\u impl.InvalidArgumentError:不兼容的形状:[256,75,39]与[512,75,39]

[[Node:training/cna/gradients/loss/concatenate_1_loss/mul_grad/BroadcastGradientArgs=BroadcastGradientArgs[T=DT_INT32,[u class=[“loc:@loss/concatenate_1_loss/mul”],[u device=“/job:localhost/replica:0/task:0/gpu:0”](training/cna/gradients/loss/concatenate_1_loss/mul_grad/Shape,training/cna/gradients/concatenate_1_1_loss/mul_Shape]

[[Node:replica\u 1/sequential\u 1/dense\u 1/truediv/\u 473=\u Recvclient\u terminated=false,recv\u device=“/job:localhost/replica:0/task:0/cpu:0”,send\u device\u化身=1,tensor\u name=“edge\u 3032\u replica\u 1/sequential\u 1/Densive\u 1/truediv”,tensor\u type=DT\u FLOAT,\u device=“/job:localhost/replica:0/task:0/cpu:0”]]

我正在使用2个GPU,批量大小为256。请帮助


提前感谢。

发生此错误的原因很简单,因为您正在将大小为512的原始批次划分为大小为256的两个较小批次

有状态层需要固定的批大小(请参见模型开头的参数
batch\u shape
batch\u input\u shape

您可以尝试重新创建模型,将
batch\u shape
(或
batch\u input\u shape
)更改为256(如果当前为512)。或者,如果我对当前值的理解有误,则可以改为其他方式

如果您已经有一个经过训练的模型,其中包含要保留的权重,则可以创建另一个具有相同类型图层和相同形状的模型,只更改输入形状。然后可以
newModel.set_weights(oldModel.get_weights())


也就是说,我认为并行化一个有状态模型是不安全的。在有状态模型中,“batch2”是“batch1”的续集。两个批都代表“相同”的序列,顺序绝对重要。如果batch2在batch1之前得到处理,您将输入一个反向序列,您的模型将学习到错误

除非您发现Keras文档明确声明您可以安全地并行化有状态模型,否则您可能会从仔细检查中获益(经过多次尝试)如果并行化模型总是给出与单个GPU模型相同的结果。

我目前正在研究的是一个实验实用程序,用于为多GPU训练构建有状态RNN模型

与此相反,我认为您可以明确地说明顺序:在哪个GPU上处理哪个子批处理,以及如何将结果放回一起


我仍然需要测试它是否在多个GPU上正确训练,以及它是否可以并行任何任意有状态模型。因此,我对任何人使用此实用程序的体验都感兴趣!

您能修复代码的链接吗?