Тензорные потоки вообще не являются массивами, когда они выполняются, они являются только ссылками на строящийся вычислительный граф.Возможно, вы захотите просмотреть учебник о том, как Tensorflow строит графики .
У вас есть две проблемы с вашей функцией потерь: во-первых, свертывание по любой оси не приведет к скаляру, поэтому он выиграл 'Невозможно взять производную, а во-вторых, np.gradient
, по-видимому, не существует в Tensorflow.
Для первой проблемы вы можете решить ее, уменьшив вдоль оставшейся оси gradient_y
или gradient_x
.Я не знаю, какую функцию вы можете использовать, потому что я не знаю ваше приложение.
Вторую проблему можно решить двумя способами:
- Вы можете обернуть
np.gradient
с использованием py_func
, но вы планируете использовать это как функцию потерь, так что вы захотите взять градиент этой функции, и определение градиента вызова py_func
равно сложный . - Напишите свою собственную версию
np.gradient
, используя чистый Tensorflow.
Например, вот 1D np.gradient
в тензорном потоке ( не проверено ):
def gradient(x):
d = x[1:]-x[:-1]
fd = tf.concat([x,x[-1]], 0).expand_dims(1)
bd = tf.concat([x[0],x], 0).expand_dims(1)
d = tf.concat([fd,bd], 1)
return tf.reduce_mean(d,1)