首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Keras上的多GPU模型(具有状态的LSTM )不起作用

Keras上的多GPU模型(具有状态的LSTM )不起作用
EN

Stack Overflow用户
提问于 2017-11-08 22:03:07
回答 2查看 1.8K关注 0票数 1

我正在使用有状态的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。请帮帮忙。

提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2017-11-09 11:42:42

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

有状态层需要固定的批处理大小(请参阅模型开头的参数batch_shapebatch_input_shape )。

您可以尝试重新创建模型,将batch_shape (或batch_input_shape)更改为256 (如果当前为512)。或者相反,如果我弄错了当前的价值。

如果您已经有一个经过训练的模型,您想要保持的权重,您可以创建另一个模型与相同类型的层和相同的形状,只改变输入形状。然后你就可以newModel.set_weights(oldModel.get_weights())

尽管如此,我不认为并行化有状态模型是安全的。在有状态模型中,"batch2“是"batch1”的续集。两个批次代表“相同”的顺序,顺序是绝对重要的。如果batch2在batch1之前被处理,您将输入一个倒排序列,您的模型将错误地学习它。

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

票数 2
EN

Stack Overflow用户

发布于 2017-12-07 22:31:34

我目前正在开发gpu,这是一个用于为多GPU培训构建有状态RNN模型的实验实用工具。

Daniel M ller的答复相反,我认为您可以明确地说明顺序:在哪个GPU上处理哪个子批处理以及如何将结果重新组合在一起。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47190463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档