Вы можете использовать аргумент '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)
И плотность, и плотность_плотика разделяют веса благодаря атрибуту 'повторное использование', но плотское_приложение применяется к input_x, а плотность_2 к 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)