Несовместимые размеры из tf.conv3d с дилатацией и заполнением «VALID»

1

При использовании сверток Tensorflow с дилатациями и добавлением VALID в 1D и 2D размер выходного тензора меньше, чем без дилатаций, как и ожидалось. Однако с 3D-свертками это не так, и одна и та же форма выводится независимо от растяжек. Отметка "REFLECT" используется, даже если запрашивается "VALID".

Использование Tensorflow 1.8.0.

import tensorflow as tf
import numpy as np

data = tf.constant(np.ones((1, 12, 1)))
weights = tf.constant(np.ones((3, 1, 1)))
conv = tf.nn.convolution(data, weights, "VALID")
conv_dil = tf.nn.convolution(data, weights, "VALID", dilation_rate=[2])

data2D = tf.constant(np.ones((1, 12, 12, 1)))
weights2D = tf.constant(np.ones((3, 3, 1, 1)))

conv2D = tf.nn.conv2d(data2D, weights2D, [1, 1, 1, 1], "VALID")
conv_dil2D = tf.nn.conv2d(data2D, weights2D, [1, 1, 1, 1], "VALID", dilations=[1, 2, 2, 1])

data3D = np.ones((1, 12, 12, 12, 1))
data3D[0, 0, 2, 0, 0] = 2
data3D[0, 0, 1, 0, 0] = 2
data3D = tf.constant(data3D)
weights3D = tf.constant(np.ones((3, 3, 3, 1, 1)))


conv3D = tf.nn.conv3d(data3D, weights3D, [1, 1, 1, 1, 1], "VALID")
conv_dil3D = tf.nn.conv3d(data3D, weights3D, [1, 1, 1, 1, 1], "VALID", dilations=[1, 2, 2, 2, 1])


with tf.Session() as sess:
    conv_out, conv_dil_out, conv2D_out, conv_dil2D_out, conv3D_out, conv_dil3D_out = sess.run([conv, conv_dil, conv2D, conv_dil2D, conv3D, conv_dil3D])
    print("1D")
    print(conv_out.shape)
    print(conv_dil_out.shape)
    print("2D")
    print(conv2D_out.shape)
    print(conv_dil2D_out.shape)
    print("3D")
    print(conv3D_out.shape)
    print(conv_dil3D_out.shape)
    print("Values:")
    print(conv_dil3D_out[0, 0, 0, 0, 0])
    print(conv_dil3D_out[0, 0, 0, 2, 0])
    print(conv_dil3D_out[0, 0, 2, 0, 0])

Результаты в:

1D
(1, 10, 1)
(1, 8, 1)
2D
(1, 10, 10, 1)
(1, 8, 8, 1)
3D
(1, 10, 10, 10, 1)
(1, 10, 10, 10, 1)
Ценности:
29,0
27,0
28,0

  • 1
    Я не могу воспроизвести проблему с версией 1.10.0. С процессором я получаю «Реализация процессора в Conv3D в настоящее время поддерживает только расширенную скорость 1». С GPU мне сначала нужно изменить ваш код, потому что вы используете tf.float64 (из-за настроек NumPy по умолчанию), а ядро GPU Conv3D доступно только для tf.float16 и tf.float32 . После изменения типов полученная форма будет правильной. Попробуйте обновить вашу версию TensorFlow.
  • 0
    Спасибо за попытку воспроизвести @jdehesa. Я только что обновился до 1.10 и теперь размер правильный. У меня был поиск, прежде чем я отправил, но ничего не смог найти, но я думаю, что это было исправлено где-то между 1.8 и 1.10. Он также работает в 3 раза быстрее .... стоит обновления.
Теги:
tensorflow
neural-network

1 ответ

0
Лучший ответ

Обновлен до 1.10, и проблема исчезнет. Размер расширенного выхода conv3d теперь (1, 8, 8, 8, 1), как и ожидалось.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню