如何更改tensorflow.layers.dense()层的输入?

时间:2018-09-10 08:30:53

标签: tensorflow neural-network

在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)是否会引起麻烦?

1 个答案:

答案 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)