2016-08-18 11 views
7

Samouczki Tensorflow obejmują użycie tf.expand_dims, aby dodać "wymiar wsadowy" do tensora. Czytałem dokumenty dla tej funkcji, ale nadal jest to dla mnie dość tajemnicze. Czy ktoś wie dokładnie, w jakich okolicznościach należy to wykorzystać?Tensorflow: Kiedy używasz tf.expand_dims?

Mój kod znajduje się poniżej. Moim zamiarem jest obliczenie straty na podstawie odległości między przewidywanymi i rzeczywistymi pojemnikami. (Np. Jeśli predictedBin = 10 i truthBin = 7 następnie binDistanceLoss = 3).

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

W tym przypadku muszę zastosować tf.expand_dims do predictedBin i binDistanceLoss? Z góry dziękuję.

Odpowiedz

16

expand_dims nie doda ani nie zredukuje elementów w tensorze, tylko zmienia kształt, dodając 1 do wymiarów. Na przykład wektor z 10 elementami może być traktowany jako macierz 10x1.

Sytuacja, z którą się spotkałem, aby użyć expand_dims, to próba skonstruowania ConvNet w celu klasyfikacji obrazów w skali szarości. Obrazy w skali szarości zostaną załadowane jako macierz o rozmiarze [320, 320]. Jednak tf.nn.conv2d wymaga danych wejściowych do [batch, in_height, in_width, in_channels], gdzie w moich danych brakuje wymiaru in_channels, który w tym przypadku powinien być 1. Więc użyłem expand_dims, aby dodać jeszcze jeden wymiar.

W twoim przypadku nie potrzebuję expand_dims.

6

Aby dodać do odpowiedzi Da Tonga, możesz rozwinąć więcej niż jeden wymiar w tym samym czasie. Na przykład, jeśli wykonujesz operację TensorFlow na conv1d na wektorach rangi 1, musisz podać je z trzecim stopniem.

Wykonywanie expand_dims można odczytać, ale może wprowadzić pewne obciążenie na wykres obliczeniowy. Można uzyskać taką samą funkcjonalność w jednym-liner z reshape:

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) 

UWAGA: W przypadku, gdy pojawia się błąd TypeError: Failed to convert object of type <type 'list'> to Tensor., spróbuj przejść tf.shape(x)[0] zamiast x.get_shape()[0] jak sugeruje here.

Mam nadzieję, że pomoże!
Cheers,
Andres

+0

Czy uruchamiać żadnych testów w celu sprawdzenia, czy robi jeden 'reshape' jest szybszy niż robi, powiedzmy, dwa lub trzy' expand_dims'? – Nathan

+0

niezupełnie! Zajrzałem do [źródeł] (https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/ops/array_ops.py), ale nie byłem w stanie zrozumieć, gdzie jest gen_array_ops, więc mogę powiedzieć wiele ... byłby zdecydowanie zainteresowany widząc niektóre testy –

Powiązane problemy