Я наткнулся на странное поведение тензорного потока. После повсеместного tf.print это привело меня к причине, как показано в следующем коде, но я не знаю, почему это произошло, если только условие многопоточности или построение графика не пропустили сегмент кода. Не вижу, чтобы это случилось.
# Ragged tensor may have empty rows. So, for tensor arithmetic operation,
# we need to create zero-padded tensors to replace them.
# This implementation only keeps the first entry of each row.
# So, the output tensor is a normal tensor.
def pad_empty_ragged_tensor(ragtensor):
tf.print("Ragged tensor padding empty tensor...", output_stream=sys.stdout)
batch_size = ragtensor.shape[0]
n_rows = ragtensor.row_lengths()
tf.print("row_lengths(): ", n_rows, output_stream=sys.stdout)
new_tensor = []
for i in range(batch_size):
tf.print("n_rows[i]: ", n_rows[i], output_stream=sys.stdout)
if tf.equal(n_rows[i], 0): # Tried n_rows[i] == 0 too
tf.print("Create zero padded tensor...", output_stream=sys.stdout)
num_zeros = ragtensor.shape[-1]
tensor = tf.tile([[0]], [1, num_zeros])
tensor = tf.cast(tensor, dtype=ragtensor.dtype)
else:
tf.print("Take first entry from the row", output_stream=sys.stdout)
tensor = ragtensor[i,0:1]
new_tensor.append(tensor)
tensor = tf.stack(new_tensor, axis=0) # [batch, 1, [y, x, h, w]]
tensor.set_shape([batch_size, 1, ragtensor.shape[-1]])
tf.print("The padded tensor shape: ", tensor.shape, output_stream=sys.stdout)
return tensor
Вот сегмент трассировки печати:
row_lengths(): [1 1 0 ... 1 1 1]
n_rows[i]: 1
Take first entry from the row
n_rows[i]: 1
Take first entry from the row
n_rows[i]: 0
Take first entry from the row
n_rows[i]: 1
Take first entry from the row
Как показано, блок условий if tf.equal(n_rows[i], 0): # Tried n_rows[i] == 0 too
никогда не вызывался. Каждый раз он попадает в условие «еще», даже если условие равенства выполнено. Кто-нибудь может намекнуть мне, что пошло не так? Кстати, отладка тензорного потока также сложна. Точка останова в VSCode не была достигнута после выполнения графика. tfdbg также не работает с нетерпеливым исполнением. Предложение по этому вопросу также очень полезно для меня.
Мой dev env:
- ОС: Ubuntu18.04
- Python: 3.6
- Tensorflow-GPU: 1,14
- GPU: RTX2070
- Cuda: 10,1
- Cudnn: 7,6
- IDE: VS код
- Режим Tensorflow: Стремительное исполнение
Заранее спасибо