Я думаю, что предложенный трюк на самом деле не правильный. Что происходит со слоем tf.conv3d()
, так это то, что входные данные сворачиваются по измерению глубины (=фактическая партия) И затем суммируются с полученными картами объектов. С padding='SAME'
результирующее количество выходов оказывается таким же, как размер партии, так что можно одурачить!
РЕДАКТИРОВАТЬ: я думаю, что возможный способ выполнить свертка с разными фильтрами для разных элементов мини-пакета включает в себя «взлом» свертки по глубине. Предположим, что размер партии MB
известен:
inp = tf.placeholder(tf.float32, [MB, H, W, channels_img])
# F has shape (MB, fh, fw, channels, out_channels)
# REM: with the notation in the question, we need: channels_img==channels
F = tf.transpose(F, [1, 2, 0, 3, 4])
F = tf.reshape(F, [fh, fw, channels*MB, out_channels)
inp_r = tf.transpose(inp, [1, 2, 0, 3]) # shape (H, W, MB, channels_img)
inp_r = tf.reshape(inp, [1, H, W, MB*channels_img])
out = tf.nn.depthwise_conv2d(
inp_r,
filter=F,
strides=[1, 1, 1, 1],
padding='VALID') # here no requirement about padding being 'VALID', use whatever you want.
# Now out shape is (1, H, W, MB*channels*out_channels)
out = tf.reshape(out, [H, W, MB, channels, out_channels) # careful about the order of depthwise conv out_channels!
out = tf.transpose(out, [2, 0, 1, 3, 4])
out = tf.reduce_sum(out, axis=3)
# out shape is now (MB, H, W, out_channels)
В случае, если MB
неизвестно, его можно определить динамически, используя tf.shape()
(я думаю)
person
drasros
schedule
18.09.2017
tf.expand_dims
, чтобы добавить «поддельное измерение мини-пакета», а затем использоватьtf.nn.conv3d
, где глубина фильтра соответствует размеру пакета. Не уверен, насколько хорошо это будет работать с переменным размером партии. - person Robert Lacok   schedule 06.02.2017batch_size = tf.shape(input)[0]
, чтобы вывести измерение и использовать только часть фильтра. Чисто предложение, хотя я никогда не пробовал ничего подобного, поэтому это может вызвать проблемы. - person Robert Lacok   schedule 06.02.2017tf.nn.conv3d
. Если вы хотите написать ответ, я приму его. - person patapouf_ai   schedule 07.02.2017batch_size = tf.shape(input)[0]
не работает, потому что размер неизвестен, но кажется, что он не нужен. - person patapouf_ai   schedule 07.02.2017