Python 带分区变量的Tensorflow指数移动平均值

Python 带分区变量的Tensorflow指数移动平均值,python,tensorflow,Python,Tensorflow,我试图使用分区变量来使用tf.train.ExponentialMovingAverage 我使用custom\u getter创建图形的EMA版本 如果我不使用partitioner来创建变量,则以下代码将按预期工作:将变量设置为零后,衰减为1,此变量的EMA版本将保持原始值 但是,如果使用分区器,则会出现以下问题 tf1.12由于ema_getter无法找到PartitionedVariable的平均值,因此这两个变量是同一对象 tf.1.15我得到了一个AttributeError:“Pa

我试图使用
分区变量
来使用
tf.train.ExponentialMovingAverage

我使用
custom\u getter
创建图形的EMA版本

如果我不使用
partitioner
来创建变量,则以下代码将按预期工作:将变量设置为零后,衰减为1,此变量的EMA版本将保持原始值

但是,如果使用分区器,则会出现以下问题

tf1.12由于
ema_getter
无法找到
PartitionedVariable
的平均值,因此这两个变量是同一对象

tf.1.15我得到了一个
AttributeError:“PartitionedVariable”对象没有属性“experimental\u ref”

这是我的密码

将tensorflow导入为tf
将numpy作为np导入
def ema_getter(ema):
def_ema_getter(getter,name,*args,**kwargs):
var=getter(名称,*args,**kwargs)
均线风险=均线平均值(风险值)
如果不是ema_变量:
警告(f“找不到{name}的EMA”)
如果ema\U var else var返回ema\U var
返回(ema)getter
如果名称=“\uuuuu main\uuuuuuuu”:
使用分区器=True
var=tf.get\u变量(
name='var',
形状=[10,2],
初始值设定项=tf.ones\u初始值设定项(),
分区器=tf。如果使用分区器,则固定分区器大小(2,轴=0),否则无
)
var_sum=tf.减少var_sum(var)
ema=tf.训练指数移动平均值(1.0)
变量=tf.get\u集合(
tf.GraphKeys.TRAINABLE_VARIABLES,tf.get_variable_scope().name)
ema_op=ema.apply(变量)
使用tf.variable\u scope(tf.get\u variable\u scope(),reuse=True,custom\u getter=ema\u getter(ema)):
var\u ema=tf.get\u变量(
name='var',
形状=[10,2],
分区器=tf。如果使用分区器,则固定分区器大小(2,轴=0),否则无
)
打印(f“EMA变量名:{var_EMA.name}”)
var\u ema\u sum=tf.减少总和(var\u ema)
使用tf.Session()作为sess:
sess.run(tf.global\u variables\u initializer())
评估运行(ema_op)
打印(sess.run(var#u sum))#20.0
打印(sess.run(var_ema_sum))#20.0
sess.run(tf.assign(var,tf.zeros_-like(var)))
评估运行(ema_op)
打印(sess.run(var#u sum))0.0
打印(sess.run(var_ema_sum))应为20.0

到目前为止,我的理解是,
PartitionedVariable
并不是标准的
变量
,而仅仅是其他
变量
列表的外壳

custom_getter
需要考虑到这一点,并使用原始
PartitionedVariable
变量的ema版本手动检索和重建
PartitionedVariable

然而,这似乎有点骇人听闻——使用
。\uuuuu类\uuuuuuuuu
,因为我找不到一种方法来以干净的方式导入
PartitionedVariable
,或者访问私有属性
\u partitions
,例如

在这里共享我当前的修复

将tensorflow导入为tf
将numpy作为np导入
def ema_getter(ema):
def_ema_getter(getter,name,*args,**kwargs):
var=getter(名称,*args,**kwargs)
#手动重新构造if PartitionedVariable
如果变量.\uuuuu类.\uuuuu名称.\uuuuu==“PartitionedVariable”:
ema_vs=[v在var中的平均值(v)]
ema\u var=var.\u类__(
name=var.name,
形状=变量形状,
dtype=var.dtype,
变量列表=ema\u vs,
分区=var.\u分区,
)
其他:
均线风险=均线平均值(风险值)
如果不是ema_变量:
警告(f“找不到{name}的EMA”)
如果ema\U var else var返回ema\U var
返回(ema)getter
如果名称=“\uuuuu main\uuuuuuuu”:
使用分区器=True
var=tf.get\u变量(
name='var',
形状=[10,2],
初始值设定项=tf.ones\u初始值设定项(),
分区器=tf。如果使用分区器,则固定分区器大小(2,轴=0),否则无
)
var_sum=tf.减少var_sum(var)
ema=tf.训练指数移动平均值(1.0)
变量=tf.get\u集合(
tf.GraphKeys.TRAINABLE_VARIABLES,tf.get_variable_scope().name)
ema_op=ema.apply(变量)
使用tf.variable\u scope(tf.get\u variable\u scope(),reuse=True,custom\u getter=ema\u getter(ema)):
var\u ema=tf.get\u变量(
name='var',
形状=[10,2],
分区器=tf。如果使用分区器,则固定分区器大小(2,轴=0),否则无
)
打印(f“EMA变量名:{var_EMA.name}”)
var\u ema\u sum=tf.减少总和(var\u ema)
使用tf.Session()作为sess:
sess.run(tf.global\u variables\u initializer())
评估运行(ema_op)
打印(sess.run(var_sum))
打印(sess.run(var\u ema\u sum))
sess.run(tf.assign(var,tf.zeros_-like(var)))
评估运行(ema_op)
打印(sess.run(var_sum))
打印(sess.run(var\u ema\u sum))