Мне нужно нелинейно расширить значение каждого пикселя из 1 вектора тусклого пикселя с расширением ряда Тейлора конкретной нелинейной функции (e^x or log(x) or log(1+e^x)
), но моя текущая реализация мне не подходит, по крайней мере, на основе концепций ряда Тейлора. Основная интуиция заключается в том, чтобы использовать массив пикселей в качестве входных нейронов для модели CNN, где каждый пиксель должен быть нелинейно расширен с помощью расширения ряда Тейлора нелинейной функции.
новое обновление 1:
Насколько я понимаю из ряда Тейлора, ряд Тейлора записывается для функции F
переменной x
с точки зрения значения функции F
и ее производных для другого значения переменной x0
. В моей задаче F
— это функция нелинейного преобразования признаков (также известных как пиксели), x
— это значение каждого пикселя, x0
— аппроксимация ряда Маклорена в точке 0.
новое обновление 2
если мы используем ряд Тейлора log(1+e^x)
с порядком аппроксимации 2, каждое значение пикселя даст два новых пикселя, взяв первый и второй члены расширения ряда Тейлора.
графическая иллюстрация
Вот графическая иллюстрация приведенной выше формулировки:
Где X
— массив пикселей, p
— порядок аппроксимации ряда Тейлора, а α
— коэффициент разложения Тейлора.
Я хотел нелинейно расширить векторы пикселей с помощью расширения ряда Тейлора нелинейной функции, как показано на иллюстрации выше.
Моя текущая попытка
Это моя текущая попытка, которая не работает правильно для массивов пикселей. Я думал о том, как применить ту же идею к пиксельным массивам.
def taylor_func(x, approx_order=2):
x_ = x[..., None]
x_ = tf.tile(x_, multiples=[1, 1, approx_order+ 1])
pows = tf.range(0, approx_order + 1, dtype=tf.float32)
x_p = tf.pow(x_, pows)
x_p_ = x_p[..., None]
return x_p_
x = Input(shape=(4,4,3))
x_new = Lambda(lambda x: taylor_func(x, max_pow))(x)
моя новая обновленная попытка:
x_input= Input(shape=(32, 32,3))
def maclurin_exp(x, powers=2):
out= 0
for k in range(powers):
out+= ((-1)**k) * (x ** (2*k)) / (math.factorial(2 * k))
return res
x_input_new = Lambda(lambda x: maclurin_exp(x, max_pow))(x_input)
Эта попытка не дает того, что описывает приведенная выше математическая формулировка. Бьюсь об заклад, я что-то пропустил, делая расширение. Может ли кто-нибудь указать мне, как сделать это правильно? Любая лучшая идея?
цель
Я хотел взять пиксельный вектор и сделать его нелинейно распределенным или расширенным с помощью расширения ряда Тейлора определенной нелинейной функции. Есть ли способ сделать это? Есть предположения? Спасибо
N
наM
со значениями пикселейx[i]
на составной массив размеромpN
наM
с блоками элементов формыx[i]**k
, сk=1...p
иp
в качестве степени усечения ряда Тейлора? - person Aramakus   schedule 10.07.2020F
переменнойx
через значение функцииF
и ее производных по другому значению переменнойx0
. Так что мне непонятно, что такое функция и что такое переменная, когда вы говоритеexpand pixel vector with Taylor series expansion
. Представляет ли функция значение пикселя, а переменная — его координаты в двумерном массиве (дискретные значения)? - person Aramakus   schedule 11.07.2020function is Taylor expansion of non-linear function
. Рассмотрим простую усеченную степень 2 ряда Тейлора, как в исходном постеF(x) = F(x0) + F'(x0)*(x-x0) + 0.5*F''(x0)*(x-x0)**2
. Какие здесьF
,x
иx0
? Еслиx
— исходное изображение, то что такоеx0
? - person Aramakus   schedule 11.07.2020x2 = tf.pow(x, 2)
, а затемx_tot = tf.concat([x, x2], axis = -2)
и использовал бы это как ввод. Но я не думаю, что в этом есть какая-то польза, поскольку нелинейные преобразования в функции активации, как правило, дают вам возможности ваших входов. - person Aramakus   schedule 13.07.2020