Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
tensorflow
GitHub Repository: tensorflow/docs-l10n
Path: blob/master/site/pt-br/guide/tensor_slicing.ipynb
25115 views
Kernel: Python 3
#@title Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License.

Introdução ao fatiamento de tensores

Ao trabalhar com aplicativos de ML, como a detecção de objetos e o NLP, às vezes é preciso trabalhar com subseções (fatias) de tensores. Por exemplo, se a arquitetura do modelo incluir roteamento, em que uma camada pode controlar o exemplo de treinamento roteado para a próxima camada. Nesse caso, você pode usar ops de fatiamento de tensores para dividir os tensores e colocá-los de volta na ordem certa.

Em aplicativos NLP, você pode usar o fatiamento de tensores para o mascaramento de palavras durante o treinamento. Por exemplo, você pode gerar dados de treinamento a partir de uma lista de frases ao escolher um índice de palavras para mascarar em cada frase, tirando a palavra como um rótulo e a substituindo por um token de máscara.

Neste guia, você aprenderá a usar as APIs TensorFlow para:

  • Extrair fatias de um tensor

  • Inserir dados em índices específicos de um tensor

Este guia presume a familiaridade com a indexação de tensores. Leia as seções de indexação dos guias sobre Tensores e NumPy do TensorFlow antes de começar com este tutorial.

Configuração

import tensorflow as tf import numpy as np

Extraia fatias de tensores

Realize o fatiamento de tensores semelhante ao do NumPy usando tf.slice.

t1 = tf.constant([0, 1, 2, 3, 4, 5, 6, 7]) print(tf.slice(t1, begin=[1], size=[3]))

Como alternativa, você pode usar uma sintaxe mais pythônica. Observe que as fatias do tensor estão uniformemente espaçadas em um intervalo start-stop.

print(t1[1:4])

print(t1[-3:])

Para tensores bidimensionais, você pode usar algo como:

t2 = tf.constant([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19]]) print(t2[:-1, 1:3])

Você também pode usar tf.slice em tensores com mais dimensões.

t3 = tf.constant([[[1, 3, 5, 7], [9, 11, 13, 15]], [[17, 19, 21, 23], [25, 27, 29, 31]] ]) print(tf.slice(t3, begin=[1, 1, 0], size=[1, 1, 2]))

Além disso, é possível usar tf.strided_slice para extrair fatias de tensores com o "striding" sobre as dimensões de tensores.

Use tf.gather para extrair índices específicos de um único eixo de um tensor.

print(tf.gather(t1, indices=[0, 3, 6])) # This is similar to doing t1[::3]

tf.gather não requer que os índices estejam uniformemente espaçados.

alphabet = tf.constant(list('abcdefghijklmnopqrstuvwxyz')) print(tf.gather(alphabet, indices=[2, 0, 19, 18]))

Para extrair fatias de vários eixos de um tensor, use tf.gather_nd. Isso é útil quando você quer coletar os elementos de uma matriz, e não só as linhas ou colunas.

t4 = tf.constant([[0, 5], [1, 6], [2, 7], [3, 8], [4, 9]]) print(tf.gather_nd(t4, indices=[[2], [3], [0]]))

t5 = np.reshape(np.arange(18), [2, 3, 3]) print(tf.gather_nd(t5, indices=[[0, 0, 0], [1, 2, 1]]))
# Return a list of two matrices print(tf.gather_nd(t5, indices=[[[0, 0], [0, 2]], [[1, 0], [1, 2]]]))
# Return one matrix print(tf.gather_nd(t5, indices=[[0, 0], [0, 2], [1, 0], [1, 2]]))

Insira dados em tensores

Use tf.scatter_nd para inserir dados em fatias/índices específicos de um tensor. Observe que o tensor em que você inserir valores é inicializado com zeros.

t6 = tf.constant([10]) indices = tf.constant([[1], [3], [5], [7], [9]]) data = tf.constant([2, 4, 6, 8, 10]) print(tf.scatter_nd(indices=indices, updates=data, shape=t6))

Métodos como tf.scatter_nd que exigem tensores inicializados com zeros são semelhantes aos inicializadores de tensores esparsos. Você pode usar tf.gather_nd e tf.scatter_nd para imitar o comportamento das ops de tensores esparsos.

Considere um exemplo em que você constrói um tensor esparso usando esses dois métodos em conjunto.

# Gather values from one tensor by specifying indices new_indices = tf.constant([[0, 2], [2, 1], [3, 3]]) t7 = tf.gather_nd(t2, indices=new_indices)

# Add these values into a new tensor t8 = tf.scatter_nd(indices=new_indices, updates=t7, shape=tf.constant([4, 5])) print(t8)

Isso é parecido com o seguinte:

t9 = tf.SparseTensor(indices=[[0, 2], [2, 1], [3, 3]], values=[2, 11, 18], dense_shape=[4, 5]) print(t9)
# Convert the sparse tensor into a dense tensor t10 = tf.sparse.to_dense(t9) print(t10)

Para inserir dados em um tensor com valores pré-existentes, use tf.tensor_scatter_nd_add.

t11 = tf.constant([[2, 7, 0], [9, 0, 1], [0, 3, 8]]) # Convert the tensor into a magic square by inserting numbers at appropriate indices t12 = tf.tensor_scatter_nd_add(t11, indices=[[0, 2], [1, 1], [2, 0]], updates=[6, 5, 4]) print(t12)

De maneira semelhante, use tf.tensor_scatter_nd_sub para subtrair valores de um tensor com valores pré-existentes.

# Convert the tensor into an identity matrix t13 = tf.tensor_scatter_nd_sub(t11, indices=[[0, 0], [0, 1], [1, 0], [1, 1], [1, 2], [2, 1], [2, 2]], updates=[1, 7, 9, -1, 1, 3, 7]) print(t13)

Use tf.tensor_scatter_nd_min para copiar os valores mínimos elemento a elemento de um tensor para outro.

t14 = tf.constant([[-2, -7, 0], [-9, 0, 1], [0, -3, -8]]) t15 = tf.tensor_scatter_nd_min(t14, indices=[[0, 2], [1, 1], [2, 0]], updates=[-6, -5, -4]) print(t15)

De maneira semelhante, use tf.tensor_scatter_nd_max para copiar os valores máximos elemento a elemento de um tensor para outro.

t16 = tf.tensor_scatter_nd_max(t14, indices=[[0, 2], [1, 1], [2, 0]], updates=[6, 5, 4]) print(t16)

Leituras e recursos adicionais

Neste guia, você aprendeu a usar as operações de fatiamento de tensores disponíveis com o TensorFlow para exercer um controle mais fino sobre os elementos nos seus tensores.

  • Confira as operações de fatiamento disponíveis com o NumPy do TensorFlow, como tf.experimental.numpy.take_along_axis e tf.experimental.numpy.take.

  • Consulte também o Guia de tensores e o Guia de variáveis.