Как я могу применить TensorFlow 2D Convolution (tf.nn.conv2d) к одному (не пакетному) 2D изображению? - PullRequest
1 голос
/ 29 апреля 2019

Я хотел бы использовать функцию tf.nn.conv2d() на примере одного изображения, но в документации TensorFlow, похоже, упоминается только применение этого преобразования к серии изображений.

В документах упоминается, что входное изображение должно иметь форму [batch, in_height, in_width, in_channels], а ядро ​​должно иметь форму [filter_height, filter_width, in_channels, out_channels].Однако, какой самый простой способ достижения двумерной свертки с входной формой [in_height, in_width, in_channels]?

Вот пример текущего подхода, где img имеет форму (высота, ширина, каналы):

img = tf.random_uniform((10,10,3))  # a single image
img = tf.nn.conv2d([img], kernel)[0] # creating a batch of 1, then indexing the single example

Я изменяю ввод следующим образом:

[in_height, in_width, in_channels]->[1, in_height, in_width, in_channels]->[in_height, in_width, in_channels]

Это похоже на ненужную и дорогостоящую операцию, когда меня интересует только преобразование одного примера.

Есть ли простой / стандартный способ сделать это, не требующий изменения формы?

1 Ответ

0 голосов
/ 30 апреля 2019

AFAIK нет пути обойти это. Кажется ( здесь и здесь ), что первая операция создает копию (кто-то исправит меня, если я ошибаюсь). Вместо этого вы можете использовать tf.expand_dims, однако, это IMO более читабельно из-за его многословия.

С другой стороны, взятие элемента 0 из тензора в этом случае не должно выполнять копирование и является почти бесплатным.

Наиболее важно , за исключением небольшого неудобства с синтаксисом (например, [0]), эти операции определенно не являются дорогостоящими , особенно в контексте выполнения свертки.

КСТАТИ. Другие готовые альтернативные слои, такие как * в 1020 *, также требуют первого пакета в качестве первого измерения.

...