我正在使用有状态的keras (Tensorflow后端)处理LSTM模型,我不能在多GPU平台上并行化它。下面是指向代码的链接。我收到了跟随错误。
tensorflow.python.framework.errors_impl.InvalidArgumentError:不相容形状: 256,75,39 vs. 512,75,39[Node: training/cna/gradients/loss/concatenate_1_loss/mul_grad/BroadcastGradientArgs = BroadcastGradientArgsdevice="/job:localhost/replica:0/task:0/gpu:0“]] [节点:复制1/顺序1/稠密_1/truediv/_473= _Recvclient_terminated=false,recv_device="/job:localhost/replica:0/task:0/cpu:0",send_device="/job:localhost/replica:0/task:0/gpu:1",send_device_incarnation=1,tensor_name="edge_3032_replica_1/sequential_1/dense_1/truediv",tensor_type=DT_FLOAT,_device="/job:localhost/replica:0/task:0/cpu:0"]
我使用的是2个GPU,批量大小为256。请帮帮忙。
提前谢谢。
发布于 2017-11-09 11:42:42
发生此错误的原因很简单,因为您正在将一个大小为512的原始批划分为两个大小为256的较小批。
有状态层需要固定的批处理大小(请参阅模型开头的参数batch_shape或batch_input_shape )。
您可以尝试重新创建模型,将batch_shape (或batch_input_shape)更改为256 (如果当前为512)。或者相反,如果我弄错了当前的价值。
如果您已经有一个经过训练的模型,您想要保持的权重,您可以创建另一个模型与相同类型的层和相同的形状,只改变输入形状。然后你就可以newModel.set_weights(oldModel.get_weights())了
尽管如此,我不认为并行化有状态模型是安全的。在有状态模型中,"batch2“是"batch1”的续集。两个批次代表“相同”的顺序,顺序是绝对重要的。如果batch2在batch1之前被处理,您将输入一个倒排序列,您的模型将错误地学习它。
除非您发现Keras文档明确声明您可以安全地并行化一个有状态模型,否则仔细检查(经过多次尝试)如果并行化模型总是给出与单个GPU模型相同的结果,您可能会从中受益。
发布于 2017-12-07 22:31:34
我目前正在开发gpu,这是一个用于为多GPU培训构建有状态RNN模型的实验实用工具。
与Daniel M ller的答复相反,我认为您可以明确地说明顺序:在哪个GPU上处理哪个子批处理以及如何将结果重新组合在一起。
我仍然需要测试它是否在多个GPU上正确训练,以及它是否能够并行任何任意有状态模型。因此,我对任何人使用此实用程序的体验都感兴趣!
https://stackoverflow.com/questions/47190463
复制相似问题