Ответ 1
Tensor.get_shape()
from этот пост.
c = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
print(c.get_shape())
==> TensorShape([Dimension(2), Dimension(3)])
Я пытаюсь сделать 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.get_shape()
from этот пост.
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()
Дайте понять:
tf.shape
tf.shape
используется для динамической формы. Если ваша тензорная форма меняется, используйте ее.
Пример: вход представляет собой изображение с изменяемой шириной и высотой, мы хотим изменить его размер до половины его размера, тогда мы можем написать что-то вроде: new_height = tf.shape(image)[0] / 2
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)
Метод tf.shape - это статический метод TensorFlow. Тем не менее, существует метод get_shape для класса Tensor. См
https://www.tensorflow.org/api_docs/python/tf/Tensor#get_shape