繁体   English   中英

使用 Tensorflow 2.0 的神经网络中的条件参数

[英]Conditional parameters in Neural network using Tensorflow 2.0

我对由两个神经网络NN1(), NN2()组成的架构感兴趣,这样

第一个神经网络weights_for_NN2 = NN1(inputs1)的输出是第二个神经网络的参数/权重。 然后最终的输出outputs = NN2(inputs2)将用于损失 function L = loss(outputs) 所以当我们反向传播时,我们只需要更新NN1的权重

现在我只是像玩具一样运行一个简单的线性回归; 这是我的代码

model = keras.Sequential([
    keras.layers.Dense(128,input_shape=(1,), activation='relu'),
    keras.layers.Dense(2,input_shape=(128,))
])


class ConditionalModel(object):
    def __init__(self):

        self.W = tf.Variable([[5.0]],name="kernel")
        self.b = tf.Variable([0.0],name="bias")
        self.variables = [self.W,self.b]

    def __call__(self, x):
        return self.W * x + self.b

def loss(predicted_y, target_y):
    return tf.reduce_mean(tf.square(predicted_y - target_y))

# do the training 
cond_model = ConditionalModel()
optimizer = tf.keras.optimizers.SGD(lr=.1)
def train(model, inputs, outputs, learning_rate):
    with tf.GradientTape() as tape:

        param = model(tf.reshape(inputs,[-1,1]))
        w = tf.reduce_mean(param[:,:-1],axis=0)
        b = tf.reduce_mean(param[:,-1],axis=0)
        for var in cond_model.variables:
            if "kernel" in var.name:
                var.assign(tf.reshape(w,[1,1]))
            elif "bias" in var.name:
                var.assign(tf.reshape(b,[1,]))

    current_loss = loss(tf.squeeze(cond_model(tf.reshape(inputs,[-1,1]))), outputs)
    gradients = tape.gradient(current_loss, model.trainable_weights)
    print(gradients) # it prints [None,None,None,None] here
    optimizer.apply_gradients(zip(gradients, model.trainable_weights))

这是创建一些玩具数据的代码

TRUE_W = 3.0
TRUE_b = 2.0
NUM_EXAMPLES = 1000

inputs  = tf.random.normal(shape=[NUM_EXAMPLES])
noise   = tf.random.normal(shape=[NUM_EXAMPLES])
outputs = inputs * TRUE_W + TRUE_b + noise

上面的代码不起作用,因为ValueError: No gradients provided for any variable of my NN1 我相信这是我如何为我的NN2赋值导致NN1计算图的路径被破坏的方式。 知道如何解决这个问题吗?

修改Wb直接解决bug。

for var in cond_model.variables:
    if "kernel" in var.name:
        cond_model.W = tf.reshape(w,[1,1])
    elif "bias" in var.name:
        cond_model.b = tf.reshape(b,[1])

然后可以得到model.trainable_weights的梯度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM