Ищете простой способ добавить дополнительные каналы нулей к тензору NxNx C с неизвестным размером пакета? - PullRequest
0 голосов
/ 14 июля 2020

Итак, в настоящее время у меня есть этот код, который заменяет тензор BxNxNxC на тензор BxNxNx(C+P), где B - размер пакета, C - количество каналов, а P - количество каналов заполнения, которые я хочу add:

A = <some BxNxNxC tensor>

P = <some calculation>
padding_tensor = keras.layers.UpSampling3D(size=[1, 1, P])(tf.zeros_like(A)[:, :, :, 0:1])

# This is the BxNxNx(C+P) tensor
concat = keras.layers.Concatenate(axis=3)([A, padding_tensor])

Причина, по которой я делаю это по кругу, заключается в том, что я не могу напрямую создать padding_tensor правильного размера, потому что кажется невозможным получить размер пакета для определения формы.

Мне нужен чистый способ сделать это, потому что я смотрю на графики вычислений моих моделей, и это добавляет много раздувания. Если можно как бы скрыть все эти операции в одном вычислительном узле, я был бы достаточно доволен этим, но предпочел бы не использовать 3 операции для чего-то столь же простого, как заполнение.

Я также подозреваю, что это будет немного медленным, но я недостаточно знаю о тензорном потоке, чтобы действительно знать.

1 Ответ

1 голос
/ 14 июля 2020

это мое предложение ... Я инициализирую поддельный слой conv2d нулями и делаю его не обучаемым, это приведет к 0 на выходе

batch, H, W, F, C, P = 32, 28, 28, 3, 5, 6

X = np.random.uniform(0,1, (batch,H,W,F))

inp = Input((H,W,F))

x_c = Conv2D(C,3, padding='same')(inp) # BxNxNxC
x_p = Conv2D(P,3, padding='same', kernel_initializer='zeros', name='zeros')(inp) # BxNxNxP
concat = Concatenate()([x_c,x_p]) # BxNxNx(C+P)

model = Model(inp, concat)
model.get_layer('zeros').trainable = False # important
model.summary()

# check if zeros
model.predict(X)[:,:,:,-P:].sum() # 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...