tf.distribute.Strategy:TypeError:转换类型为<;的对象失败;类别';tensorflow.python.distribute.values.PerReplica'&燃气轮机;到张量

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

从TensorFlow网站上的示例来看,似乎没有关于如何使代码适应使用分发策略的资源。我的原始代码包括操纵张量,例如
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,class
PerReplica
为许多用例定义了额外的方法/属性,例如,在分布式上下文下跨设备减少张量。对于您的情况:

 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提供的功能?我们可以自己轻松减少产量!