0

J'ai lu cet article sur l'utilisation de "convolutions de redimensionnement" plutôt que sur la méthode de "déconvolution" (c'est-à-dire la convolution transposée) pour générer des images avec des réseaux de neurones. Il est clair comment cela fonctionne avec une taille de foulée de 1, mais comment l'implémenteriez-vous pour une taille de foulée> 1?Pouvez-vous seulement avoir la taille de foulée 1 avec des circonvolutions de redimensionnement?

Voici comment j'ai implémenté ceci dans TensorFlow. Remarque: Il s'agit de la deuxième couche de "déconvolution" dans la partie décodeur d'un réseau d'autoencodeur.

h_d_upsample2 = tf.image.resize_images(images=h_d_conv3, 
             size=(int(self.c2_size), int(self.c2_size)), 
             method=tf.image.ResizeMethod.NEAREST_NEIGHBOR) 
h_d_conv2 = tf.layers.conv2d(inputs=h_d_upsample2, 
          filters=FLAGS.C2, 
          kernel_size=(FLAGS.c2_kernel, FLAGS.c2_kernel), 
          padding='same', 
          activation=tf.nn.relu) 

Répondre

0

La raison pour laquelle nous utilisons transposed convolution est d'augmenter la résolution du activation maps. Maintenant, si vous voulez le remplacer par conv2d with stride, vous diminuez la résolution, lorsque votre objectif est d'augmenter la résolution de sortie. Cela dit, vous pouvez utiliser strides mais vous devez appliquer un facteur de réajustement plus important pour obtenir la résolution désirée.

0

Le redimensionnement d'images n'est vraiment pas une option viable pour les couches intermédiaires du réseau. vous pouvez essayer

comment l'implémenteriez-vous pour une taille de foulée> 1?

# best practice is to use the transposed_conv2d function, this function works with stride >1 . 
# output_shape_width_height = stride * input_shape_width_height 
# input_shape = [32, 32, 48], output_shape = [64, 64, 128] 
stride = 2 
filter_size_w =filter_size_h= 2 
shape = [filter_size_w, filter_size_h, output_shape[-1], input_shape[-1]] 
w = tf.get_variable(
    name='W', 
    shape=shape, 
    initializer=tf.contrib.layers.variance_scalling_initializer(), 
    trainable=trainable) 

output = tf.nn.conv2d_transpose(
     input, w, output_shape=output_shape, strides=[1, stride, stride, 1])