我只想在自定义图层内进行一些数字验证。
假设我们有一个非常简单的自定义层:
class test_layer(keras.layers.Layer):
def __init__(self, **kwargs):
super(test_layer, self).__init__(**kwargs)
def build(self, input_shape):
self.w = K.variable(1.)
self._trainable_weights.append(self.w)
super(test_layer, self).build(input_shape)
def call(self, x, **kwargs):
m = x * x # Set break point here
n = self.w * K.sqrt(x)
return m + n
Run Code Online (Sandbox Code Playgroud)
和主程序:
import tensorflow as tf
import keras
import keras.backend as K
input = keras.layers.Input((100,1))
y = test_layer()(input)
model = keras.Model(input,y)
model.predict(np.ones((100,1)))
Run Code Online (Sandbox Code Playgroud)
如果我在该行设置断点调试m = x * x,程序在执行时会在此处暂停y = test_layer()(input),这是因为图形已构建,call()方法被调用。
但是当我model.predict()用来赋予它真正的价值,并且想看看它是否正常工作时,它不会在该行停顿m = …
例如, 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。
我的问题是:
这个技巧对我有用吗?可以正确计算梯度吗?
如果情况A更加复杂怎么办?例如,如果我想创建:
哪里w1, w2, ..., w6是要更新的权重。