Подтвердить что ты не робот

Как получить размеры тензора (в TensorFlow) на время построения графика?

Я пытаюсь сделать Op, который не ведет себя так, как ожидалось.

graph = tf.Graph()
with graph.as_default():
  train_dataset = tf.placeholder(tf.int32, shape=[128, 2])
  embeddings = tf.Variable(
    tf.random_uniform([50000, 64], -1.0, 1.0))
  embed = tf.nn.embedding_lookup(embeddings, train_dataset)
  embed = tf.reduce_sum(embed, reduction_indices=0)

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

4b9b3361

Ответ 2

Я вижу, что большинство людей путают насчет tf.shape(tensor) и tensor.get_shape() Дайте понять:

  • tf.shape

tf.shape используется для динамической формы. Если ваша тензорная форма меняется, используйте ее. Пример: вход представляет собой изображение с изменяемой шириной и высотой, мы хотим изменить его размер до половины его размера, тогда мы можем написать что-то вроде:
new_height = tf.shape(image)[0] / 2

  1. tensor.get_shape

tensor.get_shape используется для фиксированных фигур, что означает, что на графике можно вывести форму тензора .

Вывод: tf.shape можно использовать почти везде, но t.get_shape только для фигур можно выводить из графика.

Ответ 3

Функция для доступа к значениям:

def shape(tensor):
    s = tensor.get_shape()
    return tuple([s[i].value for i in range(0, len(s))])

Пример:

batch_size, num_feats = shape(logits)

Ответ 4

Просто распечатайте встроенный график построения (ops) без запуска:

import tensorflow as tf

...

train_dataset = tf.placeholder(tf.int32, shape=[128, 2])
embeddings = tf.Variable(
    tf.random_uniform([50000, 64], -1.0, 1.0))
embed = tf.nn.embedding_lookup(embeddings, train_dataset)
print (embed)

Это покажет форму тензора вложения:

Tensor("embedding_lookup:0", shape=(128, 2, 64), dtype=float32)

Как правило, хорошо проверять формы всех тензоров перед обучением ваших моделей.

Ответ 5

Пусть все будет просто. Если вам нужно указать один номер для количества измерений, например 2, 3, 4, etc.,, просто используйте tf.rank(). Но, если вам нужна точная форма тензора, используйте tensor.get_shape()

with tf.Session() as sess:
   arr = tf.random_normal(shape=(10, 32, 32, 128))
   a = tf.random_gamma(shape=(3, 3, 1), alpha=0.1)
   print(sess.run([tf.rank(arr), tf.rank(a)]))
   print(arr.get_shape(), ", ", a.get_shape())     


# for tf.rank()    
[4, 3]

# for tf.get_shape()
Output: (10, 32, 32, 128) , (3, 3, 1)