Как перебрать 2D-матрицы тензора активации 4D (None, x, y, z) из слоя resnet? - PullRequest
0 голосов
/ 14 мая 2019

Я хочу перебрать 2D матрицы четырехмерного тензора, который является выходом слоя Resnet (карты активации или карты объектов), чтобы немного изменить его во время теста

Примечание: я использую керас

Я пытался преобразовать тензор в массив numpy, используя разные коды, и я получаю некоторые странные ошибки

Подводя итог: мне просто нужно применить некоторую модификацию к тензору активации слоя resnet, а затем продолжить прямой проход, чтобы "возможно" получить некоторое повышение точности

1 Ответ

0 голосов
/ 14 мая 2019

Вы можете использовать keras.backend.function . Поскольку вы не предоставили структуру модели, я буду использовать следующую модель с выходным значением 4D тензора.

model = Sequential(
   [
      Conv2D(z, 3, input_shape=(x, y, 3), padding="same"),
   ]
);

print(model.output.shape) # None, x, y, z)

В этой модели можно использовать функцию keras.backend.function для получения выходных значений в определенном месте. В вашем случае вы пытаетесь получить последние 2 измерения, поэтому вам нужно индексировать, используя индекс пакета и индекс ширины (при условии формата данных channel_last).

def get_model_output_at(model, batch_index, width_index):
    output = model.output[batch_index][width_index]
    return keras.backend.function(model.input, output)

Теперь вы можете использовать эту функцию для получения 2D-тензоров с использованием определенной индексации.

func = get_model_output_at(model, 0, 0) # To access the first row of the first image(batch 0 and row 0).
images = np.random.randn(10, x, y, z) # Random images
output = func(images)
print(output.shape)  # (y, z)

EDIT

Чтобы перебрать карту объектов, используйте следующую функцию

def get_feature_map_at(model, index):
    output = model.output[:, :, :, index]
    return keras.backend.function(model.input, output)

Теперь, используя вышеуказанную функцию, вы можете перебирать каждую карту объектов.

image = np.random.randn(1, 55, 55, 256) 
for i in range(model.output.shape[-1]):
     feature_map_i_function = get_feature_map_at(model, i)
     feature_map_i = feature_map_i_function(image).reshape(55, 55)


На самом деле есть лучший способ решения вышеуказанной задачи с использованием model.predict и циклического перебора массива результатов.

image = np.random.randn(1, 55, 55, 256) 
predicted_feature_map = model.predict(image)
for i in range(predicted_feature_map.shape[-1]):
    feature_map_i = predicted_feature_map[:, :, :, i].reshape(55,55)

...