Почему пользовательская функция активации вызывает в сети нулевые потери и низкую точность?

Я пытался создать настраиваемую функцию активации с помощью tflearn, внося следующие изменения:

добавить мою пользовательскую функцию активации в activation.py

def my_activation(x):
    return tf.where(x >= 0.0, tf.div( x**2 , x + tf.constant(0.6)) , 0.01*x)

и добавьте его в __init__.py

from .activations import linear, tanh, sigmoid, softmax, softplus, softsign,\
relu, relu6, leaky_relu, prelu, elu, crelu, selu, my_activation

Поскольку тензорный поток может выполнять вычисление градиента автоматически, мне не нужно реализовывать функцию градиента. Как указано в статье Стиль программирования глубокого обучения,

Раньше, когда кто-то определял новую модель, им приходилось выполнять расчеты производной вручную. Хотя математика достаточно проста, для сложных моделей это может потребовать много времени и утомить. Все современные библиотеки глубокого обучения значительно упрощают работу практикующего / исследователя, автоматически решая задачу вычисления градиента.

Я обучил модель на наборе данных cifar10, используя этот код: https://github.com/tflearn/tflearn/blob/master/examples/images/convnet_cifar10.py, но изменил все активации relu на my_activation.

К сожалению, эта простая модификация приводит к тому, что сеть ничего не узнает:

Training Step: 46  | total loss: 0.00002 | time: 1.434s
| Adam | epoch: 001 | loss: 0.00002 - acc: 0.0885 -- iter: 04416/50000
Training Step: 47  | total loss: 0.00002 | time: 1.448s
| Adam | epoch: 001 | loss: 0.00002 - acc: 0.0945 -- iter: 04512/50000
Training Step: 48  | total loss: 0.00001 | time: 1.462s
| Adam | epoch: 001 | loss: 0.00001 - acc: 0.0927 -- iter: 04608/50000
Training Step: 49  | total loss: 0.00001 | time: 1.476s
| Adam | epoch: 001 | loss: 0.00001 - acc: 0.0896 -- iter: 04704/50000
Training Step: 50  | total loss: 0.00001 | time: 1.491s
| Adam | epoch: 001 | loss: 0.00001 - acc: 0.0919 -- iter: 04800/50000
Training Step: 51  | total loss: 0.00001 | time: 1.504s
| Adam | epoch: 001 | loss: 0.00001 - acc: 0.0890 -- iter: 04896/50000
Training Step: 52  | total loss: 0.00001 | time: 1.518s
| Adam | epoch: 001 | loss: 0.00001 - acc: 0.0944 -- iter: 04992/50000
Training Step: 53  | total loss: 0.00001 | time: 1.539s
| Adam | epoch: 001 | loss: 0.00001 - acc: 0.0989 -- iter: 05088/50000
Training Step: 54  | total loss: 0.00001 | time: 1.553s
| Adam | epoch: 001 | loss: 0.00001 - acc: 0.0951 -- iter: 05184/50000
Training Step: 55  | total loss: 0.00000 | time: 1.567s
| Adam | epoch: 001 | loss: 0.00000 - acc: 0.0964 -- iter: 05280/50000
Training Step: 56  | total loss: 0.00000 | time: 1.580s
| Adam | epoch: 001 | loss: 0.00000 - acc: 0.0931 -- iter: 05376/50000
Training Step: 57  | total loss: 0.00000 | time: 1.594s
| Adam | epoch: 001 | loss: 0.00000 - acc: 0.0903 -- iter: 05472/50000
Training Step: 58  | total loss: 0.00000 | time: 1.613s
| Adam | epoch: 001 | loss: 0.00000 - acc: 0.0851 -- iter: 05568/50000
Training Step: 59  | total loss: 0.00000 | time: 1.641s
| Adam | epoch: 001 | loss: 0.00000 - acc: 0.0835 -- iter: 05664/50000
Training Step: 60  | total loss: 0.00000 | time: 1.674s
| Adam | epoch: 001 | loss: 0.00000 - acc: 0.0834 -- iter: 05760/50000

Поскольку я только новичок, я не знаю, причина, по которой сеть стала нулевой потерей и низкой точностью (вывод NaN? Дедвейт?). Кто-нибудь может сказать мне, как это исправить? Благодарность!

Обратите внимание, что я не спрашиваю, как создать настраиваемую функцию активации. Вопросы о том, как создать настраиваемую функцию:


person 応振强    schedule 14.10.2017    source источник
comment
Возможный дубликат Как сделать пользовательский функция активации только с Python в Tensorflow?   -  person Sam Hartman    schedule 14.10.2017


Ответы (1)


Почему пользовательская функция активации вызывает в сети нулевые потери и низкую точность?

Потому что эта сеть не распространяется через вашу новую активацию. То, что вы сделали, - это только начало создания настраиваемой функции активации. См. этот вопрос: "... Как объяснено в источниках, упомянутых выше, существует прием для определения градиентов функции с использованием tf.RegisterGradient и _2 _... ".

На самом деле я не уверен, что ваша активация намного лучше, чем tflearn.activations.leaky_relu, но если вы действительно хотите предоставив настраиваемую активацию, вам нужно будет закодировать градиент и зарегистрировать его, как описано выше.

person Maxim    schedule 14.10.2017