Пользовательский градиент OP сбивает тензор потока - PullRequest
0 голосов
/ 23 сентября 2019

Я создал пользовательскую опцию для tenorflow 2-beta1 с градиентами, но когда я запускаю алгоритм обучения, тензор потока вылетает с кодом выхода -1073740791 (0xC0000409).

Перед сбоем я получаю сообщение об ошибке, ожидаемоеint32, но получил int64 (F tensorflow/core/framework/tensor.cc:631] Check failed: dtype() == expected_dtype (9 vs. 3) int32 expected, got int64).Поэтому я попытался привести единственные значения int64 в моем операторе к int32, но оно все еще сохраняется. Я понятия не имею, почему, кроме моего градиента, может быть какая-то не связанная ошибка.Модульный тест моей пользовательской операции проходит.

Похоже, что ошибка возникает перед возвратом из, но после выполнения функции поезда, которая работала до этого (хотя это может быть неточным, поскольку перед повторным циклом она циклически повторяется несколько раз)/ сбой).Единственное, что я изменил, так как это работало, это переключение на разреженные тензоры для части моей нейронной сети из-за ограничений памяти.

Это мой расчет градиента:

@ops.RegisterGradient("BatchSparseDenseMatmul")
def _batch_sparse_dense_matmul_grad(op, grad):
    a_indices, a_values, a_shape = op.inputs[:3]
    b = op.inputs[3]
    b_grad = batch_matmul_module.batch_sparse_dense_matmul(a_indices, a_values, a_shape, grad, transpose_a=True)
    rows = a_indices[:, 1]
    cols = a_indices[:, 2]
    parts_a = array_ops.gather(grad, rows)
    parts_b = array_ops.gather(b, cols)
    a_values_grad = math_ops.reduce_sum(parts_a * parts_b, axis=1)
    return tf.cast(a_indices, tf.int32), a_values_grad, tf.cast(a_shape, tf.int32), b_grad

Поскольку я скопировал большую часть кода для градиентов из вычисления spare_dense_matmul, возможно, я сделал что-то не так при настройкекод, так как я не до конца понимаю, для чего нужны gather и reduced_sum.Любая помощь приветствуется!

РЕДАКТИРОВАТЬ:

Я бросил входы в свой канал, вот так:

batch_matmul_module.batch_sparse_dense_matmul(tf.cast(a.indices, tf.int32), a.values, tf.cast(a.dense_shape, tf.int32), b)

ошибка исчезла, ноЯ получаю Cannot reshape a tensor with 0 elements to shape [1,1,11520] (11520 elements) for 'Reshape_18' (op: 'Reshape') with input shapes: [0,0], [3] and with input tensors computed as partial shapes: input[1] = [1,1,11520]., но я думаю, что это не связано.

Другое редактирование:

Как только я исправил ошибку, показанную в последнем редактировании, я снова получаю ту же ошибку,но я уверен, что ошибка не связана с операцией, показанной выше, так как для тестирования небольших данных я мог бы использовать to_dense и matmul.Есть ли способ отладить это?

...