2016-08-18 13 views
7

Tensorflow eğiticileri, bir tensöre "toplu boyut" eklemek için tf.expand_dims kullanımını içerir. Bu işlev için dokümanlar okudum ama hala benim için oldukça gizemli. Bunun hangi koşullarda kullanılması gerektiğini bilen var mı?Tensorflow: tf.expand_dims kullanıldığında?

Kodum aşağıda. Amacım, öngörülen ve gerçek kutular arasındaki mesafeye bağlı olarak bir kayıp hesaplamaktır. (Örneğin, predictedBin = 10 ve truthBin = 7, daha sonra binDistanceLoss = 3). Bu durumda

batch_size = tf.size(truthValues_placeholder) 
labels = tf.expand_dims(truthValues_placeholder, 1) 
predictedBin = tf.argmax(logits) 
binDistanceLoss = tf.abs(tf.sub(labels, logits)) 

, ben predictedBin ve binDistanceLoss için tf.expand_dims uygulamak gerekir? Şimdiden teşekkürler.

cevap

16

expand_dims, tensördeki öğeleri eklemeyecek veya azaltmayacak, boyutlara 1 ekleyerek şekli değiştirecektir. Örneğin, 10 elementli bir vektör 10x1 matris olarak ele alınabilir.

expand_dims numaralı telefonu kullanmak için karşılaştığım durum, gri tonlamalı görüntüleri sınıflandırmak için bir ConvNet oluşturmaya çalıştığım zamandı. Gri tonlamalı görüntüler, [320, 320] boyutunda matris olarak yüklenir. Ancak, tf.nn.conv2d,boyutunun eksik olduğu ve bu durumda 1 olması gereken girdinin eksik olduğu [batch, in_height, in_width, in_channels] olması gerekir. Bu yüzden bir tane daha boyut eklemek için expand_dims'u kullandım.

Sizin durumunuzda, expand_dims'a ihtiyacınız olduğunu düşünmüyorum.

6

Da Tong'un yanıtına eklemek için, aynı anda birden fazla boyutu genişletmek isteyebilirsiniz. Örneğin, TensorFlow'un conv1d işlemini sıra 1'in vektörlerinde gerçekleştiriyorsanız, bunları üçüncü sırayla beslemeniz gerekir. expand_dims10'un birkaç kez gerçekleştirilmesi okunabilir, ancak hesaplama grafiğine biraz yük getirebilir. Sen reshape ile tek astarın içinde aynı işlevselliği elde edebilirsiniz:

import tensorflow as tf 

# having some tensor of rank 1, it could be an audio signal, a word vector... 
tensor = tf.ones(100) 
print(tensor.get_shape()) # => (100,) 

# expand its dimensionality to fit into conv2d 
tensor_expand = tf.expand_dims(tensor, 0) 
tensor_expand = tf.expand_dims(tensor_expand, 0) 
tensor_expand = tf.expand_dims(tensor_expand, -1) 
print(tensor_expand.get_shape()) # => (1, 1, 100, 1) 

# do the same in one line with reshape 
tensor_reshape = tf.reshape(tensor, [1, 1, tensor.get_shape().as_list()[0],1]) 
print(tensor_reshape.get_shape()) # => (1, 1, 100, 1) 

NOT: hatayı TypeError: Failed to convert object of type <type 'list'> to Tensor. olsun durumda, here önerildiği gibi tf.shape(x)[0] geçmesi yerine x.get_shape()[0] deneyin.

Umut eder!
Alkış,
Andres

+0

Bir 'reshape' yapıyor, diyelim ki, iki ya da üç' expand_dims' yapmaktan daha hızlı olup olmadığını görmek için herhangi testler var mı? – Nathan

+0

gerçekten değil! [Kaynak] 'a bir göz attım (https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/ops/array_ops.py) ancak gen_array_ops'ın nerede olduğunu anlayamadım. Söyleyemem ... kesinlikle bazı testler yapmakla ilgilenirdi –