Tensorflow,Keras:如何创建仅在特定位置更新的可训练变量?

Mr *_*les 6 python gradient-descent keras tensorflow tensor

例如, y=Ax

其中A对角矩阵,其可训练的权重(w1, w2, w3)位于对角线上。

A = [w1 ... ...
    ...  w2 ...
    ... ... w3]
Run Code Online (Sandbox Code Playgroud)

如何A在Tensorflow或Keras中创建这样的可训练的?

如果我尝试A = tf.Variable(np.eye(3)),可训练权重的总数将是3 * 3 = 9,而不是3。因为我只是想更新(W1,W2,W3)是3层的权重。

可能要使用一个技巧A = tf.Variable([1, 1, 1]) * np.eye(3),以便将3个可训练的权重映射到的对角线A

我的问题是:

  1. 这个技巧对我有用吗?可以正确计算梯度吗?

  2. 如果情况A更加复杂怎么办?例如,如果我想创建:

更复杂的例子

哪里w1, w2, ..., w6是要更新的权重。

P-G*_*-Gn 4

您有两种不同的工具来解决这个问题。

  1. 您可以创建所需的变量并将它们重新排列成所需的形式。
  2. 您可以创建超出需要的变量,然后丢弃一些变量以达到所需的形式。

这两种方法并不是唯一的,您可以混合使用#1 和#2 类型的连续步骤。

例如,对于您的第一个示例(对角矩阵),我们可以使用方法#1。

w = tf.Variable(tf.zeros(n))
A = tf.diag(w) # creates a diagonal matrix with elements of w
Run Code Online (Sandbox Code Playgroud)

对于第二个更复杂的示例,我们可以使用方法#2。

A = tf.Variable(tf.zeros((n, n)))
A = tf.matrix_band_part(A, 1, 1) # keep only the central band of width 3
A = tf.matrix_set_diag(A, tf.ones(n)) # set diagonal to 1
Run Code Online (Sandbox Code Playgroud)