Tensores em TensorFlow

imagem


O principal objeto manipulado no Tensorflow é o tensor. O que são tensores, quais são, quais propriedades eles têm e como manipulá-los, leia o guia de tradução do tensorflow.org.


TensorFlow, como o nome indica, é uma plataforma para definir e executar cálculos usando tensores. Um tensor é uma generalização de vetores e matrizes para dimensões mais altas. Dentro do TensorFlow, os tensores são representados como matrizes n-dimensionais dos tipos de dados básicos.


Ao escrever um programa TensorFlow, o principal objeto que você manipula e passa é tf.Tensor . Os programas TensorFlow funcionam criando primeiro um gráfico de objetos tf.Tensor e descrevendo em detalhes como cada tensor é calculado com base nos outros tensores disponíveis e, em seguida, executando partes deste gráfico para obter os resultados do cálculo.


tf.Tensor possui as seguintes opções:


  • tipo de dados ( float32 , int32 ou string , por exemplo)
  • tamanhos (forma)

Todos os elementos tensores têm o mesmo tipo de dados e é sempre conhecido. As dimensões (o número de medidas e o tamanho de cada medida) podem ser apenas parcialmente conhecidas. O resultado da maioria das operações são tensores com tamanhos conhecidos, se as dimensões na entrada também são completamente conhecidas, mas em alguns casos é possível conhecer as dimensões do tensor apenas durante a execução do gráfico.


Os principais tipos de tensores são os seguintes:


  • tf.Variable
  • tf.constant
  • tf.placeholder
  • tf.SparseTensor

Com exceção de tf.Variable , o valor do tensor é inalterado, ou seja, no contexto de uma execução, um tensor pode ter apenas um valor. No entanto, calcular o mesmo tensor duas vezes pode retornar valores diferentes; por exemplo, o mesmo tensor pode ser o resultado da leitura de dados de um disco ou da geração de um número aleatório.


Grau


A classificação do objeto tf.Tensor é o número de suas dimensões. Os sinônimos de uma classificação são ordem , grau , dimensão . Observe que uma classificação no TensorFlow não é a mesma que uma matriz em matemática. Como mostra a tabela a seguir, cada classificação no Tensorflow corresponde a alguma entidade matemática:


GrauEntidade matemática
0 0Escalar (apenas valor)
1Vetor (magnitude e direção)
2Matriz (tabela de números)
33-Tensor (cubo de números)
nn-tensor (bem, você entendeu)

Classificação 0


O seguinte trecho demonstra a criação de várias variáveis ​​da classificação 0:


 mammal = tf.Variable("Elephant", tf.string) ignition = tf.Variable(451, tf.int16) floating = tf.Variable(3.14159265359, tf.float64) its_complicated = tf.Variable(12.3 - 4.85j, tf.complex64) 

Nota: Uma sequência é considerada um único objeto no TensorFlow, não uma sequência de caracteres. É possível ter escalares de strings, vetores de linhas etc.

Grau 1


Para criar um objeto tf.Tensor de classificação 1, você pode passar uma lista de elementos como valores iniciais. Por exemplo:


 mystr = tf.Variable(["Hello"], tf.string) cool_numbers = tf.Variable([3.14159, 2.71828], tf.float32) first_primes = tf.Variable([2, 3, 5, 7, 11], tf.int32) its_very_complicated = tf.Variable([12.3 - 4.85j, 7.5 - 6.23j], tf.complex64) 

Classificação mais alta


A classificação 2 do objeto tf.Tensor consiste em pelo menos uma linha e uma coluna:


 mymat = tf.Variable([[7],[11]], tf.int16) myxor = tf.Variable([[False, True],[True, False]], tf.bool) linear_squares = tf.Variable([[4], [9], [16], [25]], tf.int32) squarish_squares = tf.Variable([ [4, 9], [16, 25] ], tf.int32) rank_of_squares = tf.rank(squarish_squares) mymatC = tf.Variable([[7],[11]], tf.int32) 

Da mesma forma, os tensores de classificação mais alta consistem em matrizes n-dimensionais. Por exemplo, ao processar imagens, muitos tensores de classificação 4 são usados, com dimensões correspondentes ao número de exemplo no pacote, altura da imagem, largura da imagem e canal de cores.


 my_image = tf.zeros([10, 299, 299, 3]) #   x  x  x    

Obtendo a tf.Tensor objeto tf.Tensor


Para determinar a classificação do objeto tf.Tensor , chame o método tf.rank . Por exemplo, o método a seguir determina programaticamente a classificação de tf.Tensor especificado acima:


 r = tf.rank(my_image) #   , r   4. 

Links para fatias tf.Tensor


Como tf.Tensor é uma matriz n-dimensional de células, para acessar uma única célula em tf.Tensor é necessário especificar n índices.


Para tensores de classificação 0 (escalares), os índices não são necessários, pois esse já é apenas um número.


Para um tensor de classificação 1 (vetor), passar um único índice dará acesso ao número:


 my_scalar = my_vector[2] 

Observe que o índice passado para [] pode ser um escalar tf.Tensor se você desejar selecionar dinamicamente um elemento de um vetor.


Para tensores de classificação 2 ou superior, a situação é mais interessante. Para tf.Tensor rank 2, passar dois números retorna conforme o esperado por um escalar:


 my_scalar = my_matrix[1, 2] 

Passar um único número, no entanto, retorna um subvetor da matriz da seguinte maneira:


 my_row_vector = my_matrix[2] my_column_vector = my_matrix[:, 3] 

Notação : na sintaxe, a alocação de sub-matriz em python é usada como "deixe esta dimensão em paz". Isso é útil em tensores de alto escalão, pois permite o acesso a subvetores, submatrizes e até outros subtensores.


Dimensões


As dimensões do tensor são o número de elementos em cada dimensão. A documentação do TensorFlow usa três convenções para descrever a dimensão de um tensor: classificação, dimensões e número de dimensões. A tabela a seguir mostra como eles se relacionam:


GrauDimensõesNúmero de mediçõesExemplo
0 0[]0-DTensor 0-D. Escalar.
1[D0]1-DTensor de tamanho 1-D [5].
2[D0, D1]2-DTensor de tamanho 2D [3, 4].
3[D0, D1, D2]3-DTensor de tamanho 3D [1, 4, 3].
n[D0, D1, ... Dn-1]nDTensor de tamanho [D0, D1, ... Dn-1].

Os tamanhos podem ser representados como listas / tuplas de inteiros do Python, ou usando
tf.TensorShape .


Obtendo o tamanho do objeto tf.Tensor


Existem duas maneiras de obter tf.Tensor dimensões tf.Tensor . Ao construir um gráfico, geralmente é útil perguntar o que já se sabe sobre o tamanho do tensor. Isso pode ser feito lendo a propriedade shape do objeto tf.Tensor . Este método retorna um objeto TensorShape , que é uma maneira conveniente.
representações de tamanhos parcialmente definidos (desde que ao construir um gráfico, nem todos os tamanhos podem ser totalmente conhecidos).


Você também pode obter tf.Tensor que representa as dimensões totalmente definidas de outro tf.Tensor em tempo de execução. Isso é feito tf.shape operação tf.shape . Dessa maneira, é possível criar um gráfico que manipule os tamanhos dos tensores, criando outros tensores, dependendo dos tamanhos dinâmicos da entrada tf.Tensor .


Por exemplo, você pode criar um vetor de zeros do mesmo tamanho que o número de colunas de uma determinada matriz:


 zeros = tf.zeros(my_matrix.shape[1]) 

Redimensionar tf.Tensor


O número de elementos tensores é o produto de todas as suas medições. O número de elementos escalares é sempre 1 . Como muitos tamanhos diferentes podem fornecer o mesmo número de elementos, geralmente é conveniente redimensionar tf.Tensor sem alterar seus elementos. Isso pode ser feito usando tf.reshape .


Os exemplos a seguir mostram como redimensionar um tensor:


 rank_three_tensor = tf.ones([3, 4, 5]) matrix = tf.reshape(rank_three_tensor, [6, 10]) #    #   6x10 matrixB = tf.reshape(matrix, [3, -1]) #     #  3x20. -1  reshape   #    . matrixAlt = tf.reshape(matrixB, [4, 3, -1]) #     #  4x3x5 # ,         #   .     #         #     . yet_another = tf.reshape(matrixAlt, [13, 2, -1]) # ERROR! 

Tipos de dados


Além da dimensão, os tensores têm um tipo de dados. Um tf.Tensor específico não pode ter mais de um tipo de dados. No entanto, é possível serializar estruturas de dados arbitrárias em uma string e armazená-las no tf.Tensor .


Você pode converter tf.Tensor de um tipo de dados para outro usando tf.cast :


 #         . float_tensor = tf.cast(tf.constant([1, 2, 3]), dtype=tf.float32) 

Para visualizar o tipo de dados tf.Tensor , use a propriedade Tensor.dtype .


Ao criar tf.Tensor partir de um objeto python, é possível especificar opcionalmente um tipo de dados. Caso contrário, o TensorFlow selecionará um tipo de dados que pode representar seus dados. O TensorFlow converte números inteiros do Python em tf.int32 e números de ponto flutuante em tf.float32 . Em outros casos, o TensorFlow usa as mesmas regras que numpy ao converter matrizes.


Avaliação tensorial


Após a criação de um gráfico computacional, você pode executar um cálculo que
irá gerar um tf.Tensor específico e extrair o valor atribuído a ele. Isso geralmente é útil para depuração, bem como para trabalhar a maior parte do TensorFlow.


A maneira mais fácil de avaliar o Tensor é usar o método Tensor.eval . Por exemplo:


 constant = tf.constant([1, 2, 3]) tensor = constant * constant print(tensor.eval()) 

O método eval funciona apenas quando o padrão tf.Session . Tensor.eval retorna uma matriz numpy com o mesmo conteúdo que o tensor.


Às vezes, é impossível avaliar tf.Tensor sem contexto, porque seu valor pode depender de informações dinâmicas que não estão disponíveis. Por exemplo, os tensores dependentes do placeholder não podem ser avaliados sem fornecer um valor para o placeholder .


 p = tf.placeholder(tf.float32) t = p + 1.0 t.eval() #   ,   placeholder   . t.eval(feed_dict={p:2.0}) #  ,     #   placeholder. 

Observe que você pode usar qualquer tf.Tensor , não apenas o espaço reservado.


Outros modelos de modelos podem tornar o tf.Tensor mais difícil de avaliar. O TensorFlow não pode avaliar diretamente o tf.Tensor definido dentro de funções ou nas construções de fluxo de controle. Se tf.Tensor depender do valor da fila, a pontuação tf.Tensor funcionará apenas quando algo for colocado na fila; caso contrário, a estimativa do tensor congelará. Ao trabalhar com filas, lembre-se de chamar tf.train.start_queue_runners antes de avaliar qualquer tf.Tensor .


Após a verificação, a tradução também aparecerá no Tensorflow.org. Se você deseja participar da tradução da documentação do site Tensorflow.org para o russo, entre em contato com um comentário ou pessoal. Quaisquer correções ou comentários são apreciados.

Source: https://habr.com/ru/post/pt484214/


All Articles