Установка весов фильтров сверточного слоя

#tensorflow #keras #deep-learning

#tensorflow #keras #глубокое обучение

Вопрос:

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

Для создания этих фильтров я использую Unet-магистраль и извлекаю карты объектов из слоя с узким местом. Карты объектов имеют размер H x W X 512, где H — высота карты объектов, W — ширина, а 512 — количество каналов (карт).

Эти функции передаются в свертку 1×1, чтобы уменьшить количество фильтров до H X W X 128, и функции также передаются на адаптивный уровень объединения, чтобы уменьшить H X W X 512 до k x k x 512, где k — размер фильтра (например, 5). Затем фильтр также подается через свертку 1 x 1, чтобы уменьшить его до 128.

Это дает мне карту объектов f = H x W x 128 и ядро фильтра g размером k x k x 128.

Теперь я хочу свернуть f с g и попробовал следующее в keras:

 conv = Conv2D(128, kernel_size = 5, kernel_initializer = g, trainable = False)(f)
  

К сожалению, это не работает, и я просто получаю сообщение об ошибке:

«Не удалось интерпретировать идентификатор инициализатора: Tensor(«strided_slice:0″, shape = (5,5,128), dtype = float32)»

Теперь мне интересно, что я делаю не так?

Кроме того, я должен упомянуть, что форма выходного tnesor после среднего объединения / 1×1 conv равна (? , 5, 5, 128), где ? это размер пакета. Чтобы получить ядро, я попробовал что-то вроде:

 g = g[0,:,:,:]
  

Спасибо за любой совет,

приветствия,

Майкл

Ответ №1:

Аргумент kernel_initializer конструктора Conv2D ожидает не ядро, а функцию, которая будет инициализировать ядро. Вы можете прочитать больше в документации

Если вы просто хотите выполнить свертку без обучаемых весов, вам лучше использовать встроенную функцию tensorflow tf.nn.conv2d :

 conv = tf.nn.conv2d(f,g,strides=[1,1,1,1],padding='VALID')
  

Комментарии:

1. Это было именно то, что я искал! Спасибо 🙂