问题描述
我在TensorFlow v2.x中为自定义优化器实现稀疏矩阵支持更新时遇到了问题
# Dense Matrix Implementation
def _resource_apply_dense(self,grad,handle,apply_state=None):
# Sparse Matrix Implementation
def _resource_apply_sparse(self,indices,apply_state=None):
_resource_apply_dense 正常运行。但是 _resource_apply_sparse 无法正常工作。
def _resource_apply_sparse(self,apply_state=None):
# Method 1
handle_new = tf.gather(handle,indices)
gradients_sum = self.get_slot(handle,"gradients_sum")
grad_norm_sum = self.get_slot(handle,"grad_norm_sum")
tilde_w = self.get_slot(handle,"tilde_w")
lr = self.get_slot(handle,"L")
reward = self.get_slot(handle,"reward")
lr_update = tf.maximum(lr,tf.abs(grad))
gradients_sum_update = gradients_sum + grad
grad_norm_sum_update = grad_norm_sum + tf.abs(grad)
reward_update = tf.maximum(reward - grad * tilde_w,0)
new_w = (
-gradients_sum_update
/ (
lr_update
* (
tf.maximum(
grad_norm_sum_update + lr_update,self._alpha * lr_update
)
)
)
* (reward_update + lr_update)
)
var_update = handle_new - tilde_w + new_w
tilde_w_update = new_w
gradients_sum_update_op = state_ops.assign(gradients_sum,gradients_sum_update)
grad_norm_sum_update_op = state_ops.assign(grad_norm_sum,grad_norm_sum_update)
var_update_op = self._resource_scatter_update(handle,var_update)
tilde_w_update_op = state_ops.assign(tilde_w,tilde_w_update)
lr_update_op = state_ops.assign(lr,lr_update)
reward_update_op = state_ops.assign(reward,reward_update)
return control_flow_ops.group(
*[
gradients_sum_update_op,var_update_op,grad_norm_sum_update_op,tilde_w_update_op,reward_update_op,lr_update_op,]
)
在下面找到pyTest函数。
def run_sparse_sample(iterations,expected,optimizer):
var_0 = tf.Variable([1.0,2.0])
var_1 = tf.Variable([3.0,4.0])
grad_0 = tf.IndexedSlices(tf.constant([0.1]),tf.constant([0]),tf.constant([2]))
grad_1 = tf.IndexedSlices(tf.constant([0.04]),tf.constant([1]),tf.constant([2]))
grads_and_vars = list(zip([grad_0,grad_1],[var_0,var_1]))
for _ in range(iterations):
optimizer.apply_gradients(grads_and_vars)
np.testing.assert_allclose(var_0.read_value(),expected[0],atol=2e-4)
np.testing.assert_allclose(var_1.read_value(),expected[1],atol=2e-4)
def test_sparse_sample_with_default_alpha():
run_sparse_sample(
iterations=5,expected=[
[0.84528893,1.845289],[2.845289,3.845289]
],optimizer=COCOB(),)
如果有人可以帮助我,那将是很棒的。让我知道是否需要更多详细信息。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)