Скорее всего, разница не в графике, а просто в именах узлов, то есть узлы concat
и concat_1
слева - это те же узлы, что и соотв. concat_1
и concat
справа.
Дело в том, что, когда вы не предоставляете явное имя для узла, вам нужно найти тензор потока, и соглашение об именах довольно неэффективно. В первый раз, когда ему нужно дать имя узлу, он делает это с его типом. Когда он снова сталкивается с ситуацией, он просто добавляет _
+ увеличивающееся число к имени.
Возьмите этот пример:
import tensorflow as tf
x = tf.placeholder(tf.float32, (1,), name='x')
y = tf.placeholder(tf.float32, (1,), name='y')
z = tf.placeholder(tf.float32, (1,), name='z')
xy = tf.concat([x, y], axis=0) # named 'concat'
xz = tf.concat([x, z], axis=0) # named 'concat_1'
График выглядит так:
Теперь, если мы построим тот же тот же график , но на этот раз создадим xz
до xy
, мы получим следующий график:
Таким образом, график на самом деле не изменился - изменились только имена. Вероятно, это то, что произошло в вашем случае: те же операции были созданы, но не в том же порядке.
Тот факт, что имена изменились для узлов без сохранения состояния, таких как concat
, не важен, потому что при загрузке не будут перенаправлены веса сохраненная модель, например. Тем не менее, если стабильность именования важна для вас, вы можете либо дать явные имена своим операциям, либо поместить их в разные области:
xy = tf.concat([x, y], axis=0, name='xy')
xz = tf.concat([x, z], axis=0, name='xz')
Гораздо сложнее c, если переменные имя переключателя. Это одна из причин, по которой tf.get_variable
- который заставляет переменные иметь имя и вызывает ошибку при возникновении конфликта имен - был предпочтительным способом работы с переменными в эпоху, предшествующую TF2.