#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. Это было именно то, что я искал! Спасибо 🙂