Как получить размеры тензора (в 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 Tensor. Я знаю, что это можно сделать во время работы, но для такой простой операции слишком много работы. Какой самый простой способ сделать это?

Tensor.get_shape() из этой записи .

Из документации :

 c = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]) print(c.get_shape()) ==> TensorShape([Dimension(2), Dimension(3)]) 

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

  1. tf.shape

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

  1. tensor.get_shape

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

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

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

 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) 

Просто распечатайте встроенный график построения (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) 

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

Давайте сделаем это простым, черт возьми. Если вы хотите использовать один номер для количества измерений, например 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)