Как мне разработать специальный слой и точность управления в автоэнкодере? - PullRequest
0 голосов
/ 12 июня 2019

Я использую Keras для создания автоэнкодера со следующей архитектурой

enter image description here

Каждый вход (x_train) представляет собой массив 8X8, в котором каждый элемент принимает только 0, 0,25, 0,5 или 0,75 (или 0, 1, 2, 3, если кому-то нравится). Текущая функция активации выходного слоя - сигмовидная, которая, как мы знаем, преобразует значения в [0, 1], следовательно, реконструированный x_train_pre (output) также ранжируется в пределах [0, 1].

И все же, если я использую функцию стоимости, скажем MSE, для вычисления разницы между x_train и x_train_pre, x_train_pre действительно должен быть ТОЧНО тем же, что и x_train, чтобы MSE равнялся нулю в должном элементе. Другими словами, скажем, один элемент в x_train равен 0, а соответствующий ему x_train_pre равен 0,1, в моей системе они одинаковы (нет вклада ошибки в функцию стоимости), потому что все выходные данные в диапазоне от [0, 0,25) должны быть с округлением вниз (до минимума) до 0. Он рассматривается как прогноз ПРАВИЛЬНЫЙ , не вызывающий ошибок в функции стоимости.

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

То есть

def MyActivatioN(x):

    # y is the function value
    # How about dy = Del(y)/Del(x)?
    if (x>=0) && (x < 0.25):
        y = 0
    elif (x>=0.25) && (x<0.5):
        y = 0.25
    elif (x>=0.5) && (x<0.75):
        y = 0.5
    else:
        y = 0.75
    return y

Так как мне рассчитать dy = Del (y) / Del (x)? --Del (), представляющий частичную операцию деривации. Мне ДЕЙСТВИТЕЛЬНО нужен такой новый слой?

Мой второй вопрос заключается в том, что в настоящее время я использую MSE в качестве функции стоимости, но если на самом деле в моем вводе / выводе есть 4 класса, я должен вместо этого использовать categoryorccsentsenty или kld в Keras? Но автоэнкодеры - это проблема регрессии - измерение различий между исходными и восстановленными данными, поэтому, похоже, я не должен. Я в замешательстве.

Кроме того, по своей природе авто-кодер действительно полезен вектор признаков, извлеченный из скрытого слоя между кодером и декодером, как показано на диаграмме выше. В моем случае каждый из векторов признаков должен храниться в массиве 1X8 uint8 (unsigned char). Но весь автоэнкодер работает с точностью до float32. Поэтому, если я извлекаю и сохраняю свои векторы функций в uint8 и использую их для последующего вывода декодера. Декодированный вывод (реконструированный x_train_pre) не будет таким точным или корректным, как на этапе обучения, который также поддерживает векторы объектов с точностью до float32.

Итак, мой третий вопрос: что я должен сделать для хранения векторов признаков в uint8, не влияя на производительность декодера? Должен ли я заставить Keras запускать обучение в uint8 для всего или создать еще один округленный слой после кодировщика, чтобы получить векторные векторы функций uint8, или что-то еще?

Я слышал, что в Керасе может быть тренировка смешанной точности, например, я могу

    from keras import backend as K

    K.set_floatx('float16')

или измените файл keras.json. Но подходит ли он только для какого-то конкретного графического процессора? Мой К620М. Также он поддерживает uint8?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...