Как изменить ввод слоя tensorflow.layers.dense ()?

В tensorflow Layers.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
944
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать аргументы 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)

Оба типа «density_layer» и «Thick_layer2» имеют одинаковые веса благодаря атрибуту «reuse», но «density_layer» применяется к input_x, а «density_layer2» - к inputx_2.

Would having a different batch_size (batch_size_2 instead of batch_size) cause any trouble?

Нет. В этом легко убедиться:

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)

Другие вопросы по теме