В настоящее время пишу собственный генератор данных для Keras, и я хочу случайным образом перевернуть входной массив numpy во время обучения для целей увеличения данных.
X
: входной массив формы (batchsize, y_dim, x_dim)
to_flip
: логический массив формы (batchsize, X_rank)
, который описывает, какие оси нужно переворачивать
Например:
X = [[[0, 1],
[2, 3]],
[[4, 5],
[6, 7]]]
to_flip = [[0, 1],
[1, 0]]
flipped_X = [[[1, 0],
[3, 2]],
[[6, 7],
[4, 5]]]
или любую комбинацию оси (обе оси / оси не перевернуты). Я не мог понять, как использовать np.flip
или расширенную индексацию (например, X[::-1]
), чтобы получить этот эффект. В идеале я мог бы найти решение, которое можно было бы применить ко всей партии без явных циклов, потому что я считаю, что такое решение будет быстрее.
Лучшее решение, которое у меня есть на данный момент:
def flip_axes(an_input, axes_to_flip):
axis_inds_to_flip = np.where(axes_to_flip.reshape(-1))[0]
return np.flip(an_input, axis_inds_to_flip)[None, ...]
flipped_X = np.concatenate([flip_axes(an_input, axes_to_flip)
for an_input, axes_to_flip
in zip(X, to_flip)], axis=0)
У кого-нибудь есть мысли? Действительно ли это будет быстрее, чем то, что я написал здесь?
edit: Я изменил свое решение, чтобы оно работало, и добавил свою мотивацию для вопроса.