首页 > 解决方案 > 如何更改 tensorflow.layers.dense() 层的输入?

问题描述

在张量流中,layers.dense(inputs, units, activation) 实现了一个具有任意激活函数的多层感知器层。假设我像这样定义了我的密集层:

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)

我现在怎么能得到dense_layer,它可能已经预训练了权重来应用于inputx_2?(如果可能,不为 input_y 分配 inputx_2 的值?)使用不同的 batch_size(batch_size_2 而不是 batch_size)会导致任何麻烦吗?

标签: tensorflowneural-network

解决方案


您可以使用 '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)

由于“重用”属性,dense_layer 和dense_layer2 共享权重,但dense_layer 应用于input_x,dense_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)

推荐阅读