tf.distribute.Strategy:TypeError:转换类型为<;的对象失败;类别';tensorflow.python.distribute.values.PerReplica'&燃气轮机;到张量
从TensorFlow网站上的示例来看,似乎没有关于如何使代码适应使用分发策略的资源。我的原始代码包括操纵张量,例如tf.distribute.Strategy:TypeError:转换类型为<;的对象失败;类别';tensorflow.python.distribute.values.PerReplica'&燃气轮机;到张量,python,tensorflow,distributed-computing,Python,Tensorflow,Distributed Computing,从TensorFlow网站上的示例来看,似乎没有关于如何使代码适应使用分发策略的资源。我的原始代码包括操纵张量,例如tf.expand_dims(x,axis=1)。然而,当使用分布式策略时,我得到了上述错误,因为expand_dims()无法处理PerReplica对象。有关错误的详细信息,请参见下文: 目录:佩雷普利卡:{ 0/副本:0/任务:0/设备:GPU:0:Tensor(“IteratorGetNext:0”,形状=(?,2,3),数据类型=float32,设备=/副本:0/任务:0
tf.expand_dims(x,axis=1)
。然而,当使用分布式策略时,我得到了上述错误,因为expand_dims()
无法处理PerReplica
对象。有关错误的详细信息,请参见下文:
目录:佩雷普利卡:{
0/副本:0/任务:0/设备:GPU:0:Tensor(“IteratorGetNext:0”,形状=(?,2,3),数据类型=float32,设备=/副本:0/任务:0/设备:GPU:0),
1/副本:0/任务:0/设备:GPU:1:Tensor(“IteratorGetNext_1:0”,shape=(?,2,3),dtype=float32,设备=/副本:0/任务:0/设备:GPU:1)
}
任何人都知道这个问题的解决方案吗?
PerReplica
对象通常是通过运行策略返回的。实验运行v2/run(…)
,您可以将其视为将这些消息对包装在一起的特殊指令:
{i-th GPU名称:i-th GPU返回的张量},用于所有可用设备中的i。它看起来像一个dict,但不是一个真正的dict,classPerReplica
为许多用例定义了额外的方法/属性,例如,在分布式上下文下跨设备减少张量。对于您的情况:
x = strategy.experimental_run_v2(...)
if strategy.num_replicas_in_sync > 1: # x is PerReplica object for multi-devices
tensors_list = x.values # a list [x_from_dev_a, x_from_dev_b, ...]
y = tf.concat(tensors_list, axis=0) # axis=0 at batch dim
else:
y = x # x is a tensor as it is for single device
tf.expand_dims(y, axis=1)
您好,谢谢您提供的简单解决方案。我使用的是tf 2.2,它工作起来很有魅力——但如果我们可以使用
.values
属性访问PerReplica
对象中的值,那么策略的用途是什么。减少TensorFlow提供的功能?我们可以自己轻松减少产量!