Если я правильно понимаю, каждый x
в предоставленном вычислительном графе является просто скаляром (один канал пикселя). В этом случае, чтобы применить преобразование к каждому пикселю, вы можете:
- Свести входной сигнал 4D
(b, h, w, c)
, поступающий от сверточного слоя, в тензор формы (b, h*w*c)
. - Примените преобразование к результирующему тензору.
- Отмените изменение формы, чтобы получить 4-мерный тензор формы (b, h, w, c) `назад, для которого было применено" расширение Тейлора " поэлементно.
Этого можно достичь следующим образом:
shape_cnn = h.shape # Shape=(bs, h, w, c)
flat_dim = h.shape[1] * h.shape[2] * h.shape[3]
h = tf.reshape(h, (-1, flat_dim))
taylor_model = taylor_expansion_network(input_dim=flat_dim, max_pow=approx_order)
h = taylor_model(h)
h = tf.reshape(h, (-1, shape_cnn[1], shape_cnn[2], shape_cnn[3]))
ПРИМЕЧАНИЕ: Я заимствую функцию taylor_expansion_network
у this ответ .
ОБНОВЛЕНИЕ: Я все еще не совсем понимаю конечную цель, но, возможно, это обновление приблизит нас к желаемому результату. Я изменил taylor_expansion_network
, чтобы применить первую часть конвейера к RGB-изображениям формы (width, height, nb_channels=3)
, возвращая тензор формы (width, height, nb_channels=3, max_pow+1)
:
def taylor_expansion_network_2(width, height, nb_channels=3, max_pow=2):
input_dim = width * height * nb_channels
x = Input((width, height, nb_channels,))
h = tf.reshape(x, (-1, input_dim))
# Raise input x_i to power p_i for each i in [0, max_pow].
def raise_power(x, max_pow):
x_ = x[..., None] # Shape=(batch_size, input_dim, 1)
x_ = tf.tile(x_, multiples=[1, 1, max_pow + 1]) # Shape=(batch_size, input_dim, max_pow+1)
pows = tf.range(0, max_pow + 1, dtype=tf.float32) # Shape=(max_pow+1,)
x_p = tf.pow(x_, pows) # Shape=(batch_size, input_dim, max_pow+1)
return x_p
h = raise_power(h, max_pow)
# Compute s_i for each i in [0, max_pow]
h = tf.cumsum(h, axis=-1) # Shape=(batch_size, input_dim, max_pow+1)
# Get the input format back
h = tf.reshape(h, (-1, width, height, nb_channels, max_pow+1)) # Shape=(batch_size, w, h, nb_channels, max_pow+1)
# Return Taylor expansion model
model = Model(inputs=x, outputs=h)
model.summary()
return model
В этой модифицированной модели последний шаг конвейер, а именно сумма w_i * s_i
для каждого i
, не применяется. Теперь вы можете использовать полученный тензор формы (width, height, nb_channels=3, max_pow+1)
любым удобным для вас способом.