Tensorflow, в чем разница между None, -1 и ? при указании формы тензора?

Я часто видел использование символов "Нет", "-1" и " ?", чтобы программа могла динамически определять размер тензора (например, размер пакета), по-видимому, с тем же эффектом:

x = tf.placeholder(tf.float32, [None, 48, 48, 3], name='InputData')

input = tf.reshape(input, [-1, input_size])

foo("bar", shape=(?,48), dtype=float32)

Существуют ли какие-либо функциональные различия в использовании одного из этих символов по сравнению с другим?

Спасибо


person David Yu    schedule 07.08.2018    source источник
comment
Ты пытался?   -  person Timmy    schedule 07.08.2018
comment
Насколько я знаю, ключевое слово None является единственным, которое принимается tf.placeholder, а reshape принимает только -1 в качестве новой формы тензора, что сбивает с толку, потому что в документации по тензорному потоку обе эти функции принимают объект формы в качестве второго аргумента. . Я не уверен в случае использования ? символ, есть аналогичный пост об этом в stackoverflow.com/questions/40951602/, но они не упомянули, является ли ни один из -1 приемлемым вводом.   -  person David Yu    schedule 07.08.2018
comment
Спасибо. Мне очень жаль, но я не могу вам ответить.   -  person Timmy    schedule 09.08.2018


Ответы (1)


Я думаю об этом так:

None означает неуказанный размер. Например, если вы определяете заполнитель, вы используете None, чтобы сказать, что "это измерение может иметь любой размер".
Заполнитель может иметь несколько измерений None. Это просто означает, что несколько измерений могут иметь разный размер. Даже вся фигура может быть None для указания неизвестного количества измерений.

-1 — это инструкция для Tensorflow самостоятельно определить размер измерения. В tf.reshape(input, [-1, input_size]) это означает "изменить его таким образом, чтобы второе измерение было input_size, а первое измерение соответствовало общему количеству элементов".
Это не обязательно означает, что размер неизвестен, так как он для None. Если ваш входной тензор имеет известный размер 10 элементов и вы изменяете форму до [-1, 2], Tensorflow может вывести полную форму [5, 2].
-1 используется исключительно для удобства. Вы всегда можете явно записать форму, вместо того, чтобы позволить Tensorflow вывести ее. None, с другой стороны, необходим для принятия тензоров переменного размера.
В фигуре может быть только один -1. Множественные не имеют смысла, потому что было бы невозможно вывести форму. Например. если у вас есть 12 элементов в тензоре, изменение формы до [-1, -1, 2] не определено - должны ли мы делать [3, 2, 2]? [2, 3, 2]? [6, 1, 2]?...

Наконец, вопросительный знак — это то, что Tensorflow использует для обозначения «неизвестного» измерения при печати тензоров и/или их форм. Пример, который вы разместили, на самом деле приведет к синтаксической ошибке - вы не можете использовать вопросительные знаки самостоятельно. Причинами неизвестных измерений, конечно, могут быть заполнители с размерностями None, и часто тензоры, которые определены в терминах заполнителей (т. е. результат некоторых примененных к ним операций), также будут иметь неизвестные измерения. Также некоторые операции могут не указывать (частично) их выходную форму, что также может привести к неизвестным.

Вероятно, есть еще некоторые технические детали, которые я здесь упустил, но, как правило: используйте None для заполнителей и используйте -1 для изменения формы. Это должно охватывать большинство вариантов использования.

person xdurch0    schedule 08.08.2018