[英]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
计算图的路径被破坏的方式。 知道如何解决这个问题吗?
修改W
和b
直接解决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.