#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)