Вот регулярное выражение, которое будет захватывать то, что находится между коровой и молоком (без начального / конечного пространства):
srctext = "My cow always gives milk.";
var re = /(.*cow\s+)(.*)(\s+milk.*)/;
var newtext = srctext.replace(re, "$2");
Хотя это не видно в сгенерированном коде, переменная шага фактически будет автоматически помещена в Tensor с помощью цикла for, который преобразуется в TF while_loop.
Вы можете проверить это, добавив оператор печати:
loss = train_one_step(model, optimizer, x, y)
print(step)
if tf.equal(step % 10, 0):
Да, ты прав. Целочисленная переменная step остается переменной Python даже при преобразовании в графическое представление. Вы можете увидеть результат конвертации, позвонив по номеру tf.autograph.to_code(train.python_function)
.
Не сообщая весь код, но только часть, связанную с переменной step
, вы увидите, что
def loop_body(loop_vars, loss_1, step_1):
with ag__.function_scope('loop_body'):
x, y = loop_vars
step_1 += 1
все еще является операцией Python (в противном случае это будет step_1.assign_add(1)
, если шаг 1 был tf.Tensor
).
Для получения дополнительной информации об автографе и tf.function я предлагаю прочитать статью https://pgaleone.eu/tensorflow/tf.function/2019/03/21/dissecting-tf-function-part-1/ , который легко объясняет, что происходит, когда функция преобразуется.