Как смоделировать градиент ReLU с помощью tf.GradientTape - PullRequest
0 голосов
/ 26 сентября 2019

TensorFlow имеет функцию под названием GradientTape , которая позволяет получать градиенты методом Монте-Карло (?).

Я пытаюсь смоделировать градиент ReLU, но это не работает наотрицательная половина X.

#colab or ipython reset
%reset -f

#libs
import tensorflow as tf;

#init
tf.enable_eager_execution();

#code
x = tf.convert_to_tensor([-3,-2,-1,0,1,2,3],dtype=tf.float32);

with tf.GradientTape() as t:
  t.watch(x);
  y = fx = x; #THIS IS JUST THE POSITIVE HALF OF X

dy_dx = t.gradient(y,x);
print(dy_dx); 

Думаю, мне нужно что-то изменить в строке y = fx = x, например, добавив if x<=0, но не могу понять, как.

ВышеКод распечатывается:

tf.Tensor([1. 1. 1. 1. 1. 1. 1.], shape=(7,), dtype=float32)

Но он должен быть:

tf.Tensor([0. 0. 0. 0. 1. 1. 1.], shape=(7,), dtype=float32)

1 Ответ

0 голосов
/ 26 сентября 2019

Следующая функция grad имитирует условную X функции ReLU, но я не знаю, является ли это предложенным, предлагаемым способом сделать это:

#ipython
%reset -f

#libs
import tensorflow as tf;
import numpy      as np;

#init
tf.enable_eager_execution();

#code
X = tf.convert_to_tensor([-3,-2,-1,0,1,2,3], dtype=tf.float32);

with tf.GradientTape() as T:
  T.watch(X);
  Y = Fx = X;
#end with

Dy_Dx = T.gradient(Y,X);
#print(Dy_Dx);

#get gradient of function Fx with conditional X
def grad(Y,At):
  if (At<=0): return 0;

  for I in range(len(X)):
    if X[I].numpy()==At:
      return Dy_Dx[I].numpy();
#end def

print(grad(Y,-3));
print(grad(Y,-2));
print(grad(Y,-1));
print(grad(Y,-0));
print(grad(Y,1));
print(grad(Y,2));
print(grad(Y,3));

print("\nDone.");
#eof
...