Пример дилатационной свертки-деконволюции (tensorflow)

Я пытаюсь создать автоэнкодер на основе расширенных сверток. Меня смущают различные подходы к солнечному налогу, а также выборка вниз/вверх. Как мы можем сделать это только для одного слоя, который сохраняет размеры ввода и вывода?

-используя tf.nn.atrous_conv2d, а затем tf.nn.atrous_conv2d_transpose

-используя tf.nn.conv2d, а затем tf.nn.conv2d_transpose

заранее спасибо


person moha    schedule 20.04.2018    source источник


Ответы (2)


Раньше я не использовал расширение, но работаю с автоэнкодерами на основе сверток. Вот пример архитектуры, которая принимает входные данные размером 28x28x1, такие как изображения mnist. Используя шаг 2, размер будет уменьшен до 14x14x1, а затем до 7x7x1. Затем он будет сглажен, а затем уменьшен до 32, размера кодировки. После этого набор транспонированных слоев свертки с шагом 2 увеличит размер обратно до 28x28x1.

Вот пример кода:

def autoencoder_network(x):
encoder_14 = tf.layers.conv2d(x, filters=1, kernel_size=3, strides=2, padding='same', activation=tf.nn.relu)
encoder_7 = tf.layers.conv2d(encoder_14, filters=1,kernel_size=3, strides=2, padding='same', activation=tf.nn.relu)
flatten_dim = np.prod(encoder_7.get_shape().as_list()[1:])
flat = tf.reshape(encoder_7, [-1, flatten_dim])
code = tf.layers.dense(flat, 32, activation=tf.nn.relu)
hidden_decoder = tf.layers.dense(code, flatten_dim, activation=tf.nn.relu)
decoder_7 = tf.reshape(hidden_decoder, [-1, 7, 7, 1])
decoder_14 = tf.layers.conv2d_transpose(decoder_7, 1, 3, strides=2, padding='same', activation=tf.nn.relu)
output = tf.layers.conv2d_transpose(decoder_14, 1, 3, strides=2, padding='same', activation=tf.nn.relu)
return code, output
person Mohammed Alali    schedule 24.09.2018

Я сделал следующее. кажется, что размеры матриц разумны. Это правильно?

X=tf.random_uniform(shape=(256,256,3),minval=0,maxval=100,dtype=tf.float32,seed=None,name=None)

input2d = tf.reshape(X, [-1,256,256,3])
print(input2d.shape)

dilation_rate=2

in_channels=3
out_channels=32
kernelsize_h=4
kernelsize_w=4

filter = tf.get_variable("filter", [kernelsize_h, kernelsize_w, in_channels, out_channels], dtype=tf.float32,  initializer=tf.random_normal_initializer(0, 0.02))
output=tf.nn.atrous_conv2d(input2d, filter, rate=dilation_rate, padding="SAME")
print(output.shape)
filterBack = tf.get_variable("filterBack", [kernelsize_h, kernelsize_w, in_channels,out_channels], dtype=tf.float32, initializer=tf.random_normal_initializer(0, 0.02))
output_shape=[1,256,256,3]
reversed=tf.nn.atrous_conv2d_transpose(output,filterBack,output_shape,rate=dilation_rate,padding="SAME")
print(reversed.shape)

и результаты: (1, 256, 256, 3) (1, 256, 256, 32) (1, 256, 256, 3)

person moha    schedule 20.04.2018