在tensorflow层中.dense(输入,单位,激活)实现具有任意激活功能的多层感知器层。 说我这样定义我的密集层:
inputx = tf.placeholder(float, shape=[batch_size, input_size])
dense_layer = tf.layers.dense(inputx, 128, tf.nn.relu)
现在稍后,我想提供一些其他输入,例如,出于某种原因从检查点或仅在同一图形中将其还原后:
inputx_2 = tf.some_operation(whatever_thisdoes, shape = [batch_size_2, input_size])
inputx = tf.placeholder(float, shape=[batch_size, input_size])
dense_layer = tf.layers.dense(inputx, 128, tf.nn.relu)
我现在如何才能获得density_layer并且它可能已经被预先训练的权重应用于inputx_2? (如果可能,是否不为input_y分配inputx_2的值?) 使用其他batch_size(batch_size_2而不是batch_size)是否会引起麻烦?
答案 0 :(得分:0)
您可以使用'name'和'reuse'参数来实现此行为:
inputx = tf.placeholder(float, shape=[batch_size, input_size])
inputx_2 = tf.some_operation(whatever_thisdoes, shape = [batch_size_2, input_size])
dense_layer = tf.layers.dense(inputx, 128, tf.nn.relu, name='dense_layer')
dense_layer2 = tf.layers.dense(inputx_2, 128, tf.nn.relu, name='dense_layer', reuse=True)
由于使用了'reuse'属性,deny_layer和density_layer2均共享权重,但是density_layer应用于input_x,而density_layer2应用于inputx_2。
使用不相同的batch_size(batch_size_2而不是batch_size)是否会引起麻烦?
不。您可以轻松地验证这一点:
with tf.Session() as sess:
out = dense_layer.eval({inputx: np.ones([batch_size, input_size])})
out2 = dense_layer2.eval({inputx_2: np.ones([batch_size_2, input_size])})
assert np.array_equal(out[0,:], out2[0,:])
我建议您创建一个前向传递函数,以轻松地为所有模型重现此行为,例如:
def forward_pass(x, name='Model', reuse=False):
with tf.variable_scope(name, reuse=reuse):
x = tf.some_ops(x, ...)
...
return x
然后,您可以将任何张量传递给正向传递,
out = forward_pass(inputx)
out2 = forward_pass(inputx_2, reuse=True)