Как tf.layers.dense () взаимодействует с входами более высокого разрешения?

В tensorflow Layers.dense (входы, единицы измерения, активация) реализует слой многослойного персептрона с произвольной функцией активации.

Выход = активация (matmul (вход, веса) + смещение)

Обычно input имеет shape = [batch_size, input_size] и может выглядеть так: (единицы = 128 и Activation = tf.nn.relu выбираются произвольно)

inputx = tf.placeholder(float, shape=[batch_size, input_size])
dense_layer = tf.layers.dense(inputx, 128, tf.nn.relu)

Я не нашел никакой документации о том, что произойдет, если я буду вводить более размерный ввод, например. потому что у одного может быть time_steps, приводящий к тензору shape = [time_step, batch_size, input_size]. Здесь нужно, чтобы слой применялся к каждому отдельному input_vector для каждого временного шага для каждого элемента пакета. Другими словами, внутренний matmul Layers.dense () должен просто использовать широковещательную рассылку в стиле numpy. Действительно ли происходит то, что я ожидаю здесь? Т.е. является:

inputx = tf.placeholder(float, shape=[time_step, batch_size, input_size])
dense_layer = tf.layers.dense(inputx, 128, tf.nn.relu)

применение плотного слоя к каждому входу размера input_size для каждого time_step для каждого элемента в batch_size? В результате должен получиться тензор (см. «Плотный_слой» выше) shape = [time_step, batch_size, 128] Я спрашиваю, например, tf.matmul не поддерживает трансляцию в стиле numpy, поэтому я не уверен, как tenorflow обрабатывает эти случаи.

Обновлено: Этот пост связан, но не дает окончательного ответа на мой вопрос

На самом деле ответ на вопрос, который вы связали, относится и к вашему. layers.dense использует tensordot таким образом, что вы, по сути, обрабатываете каждый временной шаг независимо.

xdurch0 10.09.2018 11:35
8
1
1 766
1

Ответы 1

Вы можете проверить свои ожидания, проверив форму плотного ядра следующим образом.

>>> inputx = tf.placeholder(float, shape=[2,3,4])
>>> dense_layer = tf.layers.dense(inputx, 128, tf.nn.relu)
>>> g=tf.get_default_graph()
>>> g.get_collection('variables')
[<tf.Variable 'dense/kernel:0' shape=(4, 128) dtype=float32_ref>, <tf.Variable 'dense/bias:0' shape=(128,) dtype=float32_ref>]

Поведение плотного слоя такое же, как и у свернутого слоя.

Вы можете рассматривать inputx как изображение, которое имеет ширину = 2, высоту = 3 и канал = 4, а плотный слой - как сверточный слой, который имеет 128 фильтров, а размер фильтров - 1 * 1.

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