Как объединить два тензора разной формы в 2d свертке в tensorflow?

#python #tensorflow #keras

#python #tensorflow #keras

Вопрос:

В моем вычислительном конвейере я использовал пользовательскую функцию, которая собирается создавать пользовательские блоки keras, и я использовал эти блоки несколько раз с Conv2D . В конце я получил два разных тензора, которые отображают карты с разной формой тензора: TensorShape([None, 21, 21, 64]) и TensorShape([None, 10, 10, 192]) . В этом случае использование tf.keras.layers.concatenate для выполнения конкатенации у меня не работает. Кто-нибудь может указать мне, как объединить эти два тензора в один? Есть идея, как это сделать?

если бы я мог объединить тензоры с формой TensorShape([None, 21, 21, 64]) и TensorShape([None, 10, 10, 192]) , я хочу сделать следующее после конкатенации.

 x = Conv2D(32, (2, 2), strides=(1,1), padding='same')(merged_tensors)
x = BatchNormalization(axis=-1)(x)
x = Activation('relu')(x)
x = MaxPooling2D(pool_size=(2,2))(x)
x = Flatten()(x)
x = Dense(256)(x)
x = BatchNormalization()(x)
x = Activation('relu')(x)
x = Dropout(0.25)(x)
x = Dropout(0.25)(x)
x = Dense(10)(x)
x = Activation('softmax')(x)
outputs = x

model = tf.keras.Model(inputs=inputs, outputs=outputs)
  

Я попытался изменить форму тензоров с помощью TensorShape([None, 21, 21, 64]) и TensorShape([None, 10, 10, 192]) в 1D свертке и выполнить слияние, а затем преобразовать выходные данные обратно в 2d свертку. Мой способ не работает. Кто-нибудь может предложить возможный способ сделать это? Есть мысли?

Обновить

Я все еще не уверен, что способ получения выходной формы конкатенации будет TensorShape([None, 21 10, 21 10, 192 64]) или нет, потому что я не уверен, что это имеет смысл с точки зрения математики. точка зрения. Как сделать эту конкатенацию простой и правильной? какой была бы правильная форма объединенного? Есть идеи?

Ответ №1:

Чтобы выполнить объединение, вы должны предоставить слои с одинаковыми формами, за исключением оси объединения … в случае изображений, если вы хотите объединить их по размерности объектов (ось -1), слои должны иметь одинаковые batch_dim, ширину и высоту.

Если вы хотите принудительно выполнить операцию, вам нужно сделать что-то, что соответствует размерностям. Возможность — это дополнение. Ниже приведен пример, в котором я объединяю два слоя с последней размерностью

 batch_dim = 32
x1 = np.random.uniform(0,1, (batch_dim, 10,10,192)).astype('float32')
x2 = np.random.uniform(0,1, (batch_dim, 21,21,64)).astype('float32')

merged_tensors = Concatenate()([ZeroPadding2D(((6,5),(6,5)))(x1), x2]) # (batch_dim, 21, 21, 192 64)
  

с объединением вместо заполнения:

 batch_dim = 32
x1 = np.random.uniform(0,1, (batch_dim, 10,10,192)).astype('float32')
x2 = np.random.uniform(0,1, (batch_dim, 21,21,64)).astype('float32')

merged_tensors = Concatenate()([MaxPool2D(2)(x2), x1]) # (batch_dim, 10, 10, 192 64)