我的计算图中有一个张量,我想在每个训练步骤之后添加一行。我怎样才能做到这一点?
更详细:我正在获取渐变optimizer.compute_gradients
,我想根据渐变历史修改这些渐变。这是我尝试使用的代码:
def process_gradient(gradient, optimizer, name):
reshaped_gradient = flatten(gradient)
if gradient.name in optimizer._slots:
optimizer._slots[gradient.name] += [reshaped_gradient]
else:
optimizer._slots[gradient.name] = [reshaped_gradient]
# each
gradients_over_time = tf.stack(optimizer._slots[gradient.name])
print('gradients_over_time.get_shape()', gradients_over_time.get_shape())
return gradient
...
grads_and_vars = optimizer.compute_gradients(cost_function)
train_step = optimizer.apply_gradients([(process_gradient(grad, optimizer, str(i)), var) for i, (grad, var) in enumerate(grads_and_vars)])
我还尝试保留一个变量,用于通过连接新行来跟踪行,但这不起作用。
我最终使用了tf.py_func
来实现这一点。我在 Python 函数中访问的全局列表中跟踪状态。这里应用了渐变:
# process each individual gradient before applying it
train_step = optimizer.apply_gradients([(process_gradient(grad, str(i)), var) for i, (grad, var) in enumerate(grads_and_vars)])
这是我随着时间的推移跟踪状态的地方,并将使用构建的状态:
def construct_processor(name):
global_gradients_over_time = {}
def python_process_gradient(gradient):
reshaped_gradient = gradient.flatten()
if name in global_gradients_over_time:
global_gradients_over_time[name].append(reshaped_gradient)
else:
global_gradients_over_time[name] = [reshaped_gradient]
# process gradients somehow
return gradient
return python_process_gradient
def process_gradient(gradient, name):
return tf.py_func(construct_processor(name), [gradient], tf.float32)
construct_processor
只是允许您一次处理一个渐变,为每组渐变命名,以便我可以在全局字典中找到它们。我认为,这种方法还可以使内存远离 GPU。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)