Я пытаюсь реализовать нечто подобное функции ShuffleNet channel_shuffle, см. ShuffleNet в Керасе. Функция выглядит так:
def channel_shuffle(x, groups):
"""
Parameters
----------
x:
Input tensor of with `channels_last` data format
groups: int
number of groups per channel
Returns
-------
channel shuffled output tensor
Examples
--------
Example for a 1D Array with 3 groups
>>> d = np.array([0,1,2,3,4,5,6,7,8])
>>> x = np.reshape(d, (3,3))
>>> x = np.transpose(x, [1,0])
>>> x = np.reshape(x, (9,))
'[0 1 2 3 4 5 6 7 8] --> [0 3 6 1 4 7 2 5 8]'
"""
height, width, in_channels = x.shape.as_list()[1:]
channels_per_group = in_channels // groups
x = K.reshape(x, [-1, height, width, groups, channels_per_group])
x = K.permute_dimensions(x, (0, 1, 2, 4, 3)) # transpose
x = K.reshape(x, [-1, height, width, in_channels])
return x
Это работает, когда форма входа сети известна, например (256, 256, 3). Но если я попытаюсь изменить его на (Нет, Нет, 3), чтобы включить изображения разных размеров, он сломается. Это потому, что изменить форму x невозможно, так как высота и ширина - None. У меня вопрос: возможно ли изменить эту функцию, чтобы включить эту функцию, и если да, то как?