Оператор == всегда предназначен для сравнения ссылок на объекты, тогда как метод сравнения строк .equals () переопределяется для сравнения содержимого:
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2); // It prints false (reference comparison)
System.out.println(s1.equals(s2)); // It prints true (content comparison)
Ваши наблюдения над наименованием Tensor
абсолютно правильны: имя Tensor
является конкатенацией
:
) и Поэтому тензор с именем "foo:2"
является выходом op с именем "foo"
в позиции 2 (с индексами, начинающимися с нуля).
Именование объектов tf.Variable
немного странно. Каждый tf.Variable
содержит объект изменчивого тензора , который содержит состояние переменной (и несколько других тензоров). A "Variable"
op (который имеет имя "variable_name"
в вашем примере) «производит» этот изменяемый тензор каждый раз, когда он запускается как его 0-й выход, поэтому имя изменяемого тензора "variable_name:0"
.
Поскольку a tf.Variable
в основном неотличим от tf.Tensor
& mdash; в нем его можно использовать в тех же местах: mdash; мы приняли решение сделать имена переменных похожими на имена тензоров, поэтому свойство Variable.name
возвращает имя изменяемый тензор. (Это контрастирует с объектами tf.QueueBase
и tf.ReaderBase
, которые не используются непосредственно в качестве тензоров (вместо этого вы должны вызывать методы на них для создания ops, которые работают на их состоянии), поэтому они не имеют тензорного имени.)
print(tf.split([0, 1, 2, 3, 4, 5], 5, name="split_op")[3].name)
, который печатает имя тензора в индексе 3 на выходах"split_op"
, будет печатать"split_op:3"
. – mrry 18 July 2018 в 21:49