При использовании сверток Tensorflow с дилатацией и VALID-заполнением в 1D и 2D размер выходного тензора меньше, чем без дилатаций, как и ожидалось.Однако с трехмерными свертками это не так, и одна и та же форма выводится независимо от расширений.Кажется, что используется отступ «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,027,028,0