【问题标题】:How to access gradients and modify weights (parameters) directly during training with CNTK?如何在使用 CNTK 训练期间直接访问梯度和修改权重(参数)?
【发布时间】:2017-01-23 20:19:27
【问题描述】:

我想计算梯度值(每个示例或小批量),并将权重直接修改为任何值(这样我可以用任何方法控制梯度下降,而不仅仅是提供的 sgd / 学习率计划)。 我使用的是python接口。

【问题讨论】:

  • 欢迎来到 StackOverflow!您可能想查看How to Ask guide,了解有关提出可能得到答案的问题的一些提示:特别是,了解您已经尝试过的方法以及为什么它不起作用很重要。

标签: python deep-learning cntk


【解决方案1】:

要获得渐变,请参阅grad 方法in the docs。要暂时更新权重,您可以使用.value 属性:

>>> w = C.Parameter((2,3), init=C.glorot_uniform())
>>> w.value
array([[-0.80213612, -0.7965923 , -0.10688281],
       [-1.0493834 , -0.32666588,  0.90124035]], dtype=float32)
>>> w.value = w.value + 1
>>> w.value
array([[ 0.19786388,  0.2034077 ,  0.89311719],
       [-0.0493834 ,  0.67333412,  1.90124035]], dtype=float32)

CNTK 在其路线图上支持轻松规范用户定义的学习器,这将减少您必须编写的样板代码量。预计这将在 2017 年 3 月左右推出。

【讨论】:

    【解决方案2】:

    这是执行此类操作的tutorial

    # 如果 episode_number % BATCH_SIZE_BASELINE == 0,则等待一些批次完成以减少噪音:

    grads = {W1: gradBuffer['W1'].astype(np.float32),
             W2: gradBuffer['W2'].astype(np.float32)}
    updated = sgd.update(grads, BATCH_SIZE_BASELINE)
    
    # reset the gradBuffer
    gradBuffer = dict((var.name, np.zeros(shape=var.shape))
            for var in loss.parameters if var.name in ['W1', 'W2', 'b1', 'b2'])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-11
      • 1970-01-01
      • 1970-01-01
      • 2019-05-27
      • 2019-11-29
      • 1970-01-01
      相关资源
      最近更新 更多