Я думаю об этом так:
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