tf.nn.conv2d_transpose выдает InvalidArgumentError: Conv2DCustomBackpropInput: вход и фильтр должны иметь одинаковую глубину

У меня возникают проблемы с корректной работой tf.nn.conv2d_transpose. Вот небольшая репродукция того, что я пытаюсь сделать:

import tensorflow as tf
import numpy as np

# Shape (2, 3, 3, 1) == (batch_sz, height, width, channels)
inp = tf.Variable(np.array(
    [
        [
            [[1], [2], [3]],
            [[2], [3], [4]],
            [[7], [8], [9]]
        ],
        [
            [[3], [2], [1]],
            [[2], [7], [2]],
            [[3], [2], [0]]
        ]
    ], dtype = np.float32
))
# Shape (5, 5, 3, 1) == (kH, kW, out_channels, in_channels)
ker = tf.Variable(np.array(
    [
        [[[1],[2],[1]], [[2],[2],[2]], [[1],[2],[1]], [[2],[1],[1]], [[1],[1],[1]]],
        [[[1],[2],[1]], [[2],[2],[2]], [[1],[2],[1]], [[2],[1],[1]], [[1],[1],[1]]],
        [[[1],[2],[1]], [[2],[2],[2]], [[1],[2],[1]], [[2],[1],[1]], [[1],[1],[1]]],
        [[[1],[2],[1]], [[2],[2],[2]], [[1],[2],[1]], [[2],[1],[1]], [[1],[1],[1]]],
        [[[1],[2],[1]], [[2],[2],[2]], [[1],[2],[1]], [[2],[1],[1]], [[1],[1],[1]]]
    ], dtype = np.float32
))
out = tf.nn.conv2d_transpose(inp, ker, (2, 7, 7, 1), (1, 1, 1, 1), padding='SAME', data_format='NHWC', name='conv_transpose')

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    output, kernel, input = sess.run([out, ker, inp])

Я хочу выполнить транспонированную свертку на входе 3x3x1 с использованием трех фильтров 5x5x1. Я ожидаю, что результат будет иметь форму 7x7x3, но вместо этого я получаю сообщение об ошибке:

InvalidArgumentError: Conv2DCustomBackpropInput: input and filter must have the same depth
     [[Node: conv_transpose_2 = Conv2DBackpropInput[T=DT_FLOAT, data_format="NHWC", dilations=[1, 1, 1, 1], padding="SAME", strides=[1, 1, 1, 1], use_cudnn_on_gpu=true, _device="/job:localhost/replica:0/task:0/device:CPU:0"](conv_transpose_2/output_shape, Variable_21/read, Variable_20/read)]]

Разве вход и глубина фильтра не равны 1? Я не вижу, что я делаю неправильно - любые подсказки будут действительно оценены. Я специально хочу использовать tf.nn.conv2d_transpose, а не tf.layers.conv2d_transpose.


person narrkey    schedule 19.05.2018    source источник
comment
Вы расширили 0-е и 3-е измерение ваших массивов?   -  person marcopah    schedule 19.05.2018
comment
Извините, что звучу как нуб. Нет у меня нет. Зачем мне это делать? Мои массивы еще не в формате, требуемом conv2d_transpose - [batches, in_height, in_width,channels] для ввода и [filter_height, filter_width, out_channels, in_channels] для фильтров --> Документы: tensorflow.org/api_docs/python/tf/nn/conv2d_transpose   -  person narrkey    schedule 19.05.2018


Ответы (1)


Эта проблема аналогична этой проблеме с переполнением стека.

Вы должны внести следующие изменения, чтобы ваш код заработал.

  1. Форма inp должна быть (2, 3, 3, 3) вместо (2, 3, 3, 1)
  2. Форма ker должна быть (5,5,1,3) вместо (5,5,3,1)
  3. Заполнение должно быть установлено на «ДЕЙСТВИТЕЛЬНО» вместо «ТАКОЕ ЖЕ», только тогда Output Shape будет отличаться от Input Shape.

Ниже указан рабочий код (сделал с нулями для простоты реализации):

import tensorflow as tf
import numpy as np

# Shape (2, 3, 3, 3) == (batch_sz, height, width, channels)
inp = tf.Variable(np.array(np.zeros((2, 3, 3, 3)) , dtype = np.float32))

# Shape (5, 5, 3, 1) == (kH, kW, out_channels, in_channels)
ker = tf.Variable(np.zeros((5,5,1,3)) , dtype = np.float32)

out = tf.nn.conv2d_transpose(value = inp, filter = ker, output_shape=(2, 7, 7, 1), 
                             strides=(1, 1, 1, 1), padding='VALID', data_format='NHWC', name='conv_transpose')

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    output, kernel, input = sess.run([out, ker, inp])
person Tensorflow Support    schedule 12.11.2019