Tensorflow, реализация функции активации квадратного корня (ошибка формирования) - PullRequest
0 голосов
/ 23 сентября 2018

В целях реализации классификации NN я нашел несколько действительно полезных учебных пособий, таких как этот (2 скрытых слоя, вывод с горячим кодированием, регуляризация выпадения, нормализация и т. Д.), Которые помогли мне снемного кривой обучения за Tensorflow API.Однако, прочитав публикацию о функциях активации SQRT и увидев оптимистическую обратную связь, я хотел бы поэкспериментировать с ней в своей архитектуре NN.

Не найдя его в Tensorflow API, я посмотрел, как определить пользовательские функции активации, и обнаружил это решение для переполнения стека и решил, что его «можно реализовать»с примитивами Tensorflow.

Так что если функция активации SQRT должна быть такой (прошу прощения, вставка выглядит лучше, чем печатать сама):

Square root activation function

Я вставил этот код вместо функции ReLU скрытого слоя:

# ==== old activation function
# b = bias value x bias weight
# inputs = x data 
# w = weights
y = tf.nn.relu( tf.add( tf.matmul(w, tf.transpose(inputs)), b))

# ===== new act function
net = tf.cast( tf.add( tf.matmul(w, tf.transpose(inputs)), b), tf.float32)  # net input to activation function
cond = tf.greater_equal(net, tf.constant(0.0, dtype=tf.float32))            # >= condition
condTrue = tf.sqrt(net)                                   # if True
minOne = tf.constant(-1.0, shape=(N,1) dtype=tf.float32)  # -1 constant value
condFalse = tf.matmul(minOne, tf.sqrt( tf.abs(net)))      # if False
y = tf.cond(cond, lambda: condTrue, lambda: condFalse)    # act. function output 

Но если я пытаюсь запустить этот код, я получаю ошибку формирования:

ValueError ("Размеры должныбыть равными, но равны 1 и 107 для 'MatMul_2' (op: 'MatMul') с формами ввода: [107,1], [107,?]. ",)

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

Между всеми умножениями, сложениями и транспонированиями я теряю следо том, какие требуемые основные формы данных тензоров должны быть.Будет ли мой код правильно определять предполагаемую функцию активации (а как насчет обратной производной?), А если нет, опишите, где и как я ошибся?

Буду признателен за любую помощь, пожалуйста, я хотел бы лучше понять проблему (так как я все еще изучаю API)

1 Ответ

0 голосов
/ 23 сентября 2018

Вы можете использовать более простую логику для реализации функции активации:

x = tf.constant([ -4, 4, -2, 2, 0], tf.float32)
act = tf.sign(x)* tf.sqrt(tf.abs(x))

with tf.Session() as sess:
   print(sess.run(act))

#[-2.  2. -1.4142135 1.4142135 0. ]
...