![]() | ![]() | ![]() | ![]() |
Nesne algılama ve NLP gibi ML uygulamaları üzerinde çalışırken bazen tensörlerin alt bölümleri (dilimleri) ile çalışmak gerekir. Örneğin, model mimariniz yönlendirme içeriyorsa, burada bir katman hangi eğitim örneğinin sonraki katmana yönlendirileceğini kontrol edebilir. Bu durumda, tensörleri bölmek ve doğru sırayla tekrar bir araya getirmek için tensör dilimleme işlemlerini kullanabilirsiniz.
NLP uygulamalarında, eğitim sırasında kelime maskeleme yapmak için tensör dilimlemeyi kullanabilirsiniz. Örneğin, her cümlede maskelenecek bir kelime dizini seçerek, kelimeyi etiket olarak çıkararak ve ardından seçilen kelimeyi bir maske simgesiyle değiştirerek bir cümle listesinden eğitim verileri oluşturabilirsiniz.
Bu kılavuzda, TensorFlow API'lerini aşağıdakiler için nasıl kullanacağınızı öğreneceksiniz:
- Bir tensörden dilimleri ayıklayın
- Bir tensörde belirli indekslerde veri ekleme
Bu kılavuz, tensör indekslemeye aşina olduğunuzu varsayar. Bu kılavuza başlamadan önce Tensor ve TensorFlow NumPy kılavuzlarının indeksleme bölümlerini okuyun.
Kurmak
import tensorflow as tf
import numpy as np
Tensör dilimlerini ayıklayın
tf.slice kullanarak tf.slice
benzeri tensör dilimleme gerçekleştirin.
t1 = tf.constant([0, 1, 2, 3, 4, 5, 6, 7])
print(tf.slice(t1,
begin=[1],
size=[3]))
tf.Tensor([1 2 3], shape=(3,), dtype=int32)
Alternatif olarak, daha Pythonic bir sözdizimi kullanabilirsiniz. Tensör dilimlerinin bir start-stop aralığında eşit aralıklarla yerleştirildiğini unutmayın.
print(t1[1:4])
tf.Tensor([1 2 3], shape=(3,), dtype=int32)
print(t1[-3:])
tf.Tensor([5 6 7], shape=(3,), dtype=int32)
2 boyutlu tensörler için şöyle bir şey kullanabilirsiniz:
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])
tf.Tensor( [[ 1 2] [ 6 7] [11 12]], shape=(3, 2), dtype=int32)
tf.slice
daha yüksek boyutlu tensörlerde de kullanabilirsiniz.
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]))
tf.Tensor([[[25 27]]], shape=(1, 1, 2), dtype=int32)
Ayrıca, tensör boyutları üzerinde 'uzun adımlarla' geçerek tensör dilimlerini çıkarmak için tf.strided_slice
kullanabilirsiniz.
Bir tensörün tek bir ekseninden belirli indeksleri çıkarmak için tf.gather
kullanın.
print(tf.gather(t1,
indices=[0, 3, 6]))
# This is similar to doing
t1[::3]
tf.Tensor([0 3 6], shape=(3,), dtype=int32) <tf.Tensor: shape=(3,), dtype=int32, numpy=array([0, 3, 6], dtype=int32)>
tf.gather
, dizinlerin eşit aralıklı olmasını gerektirmez.
alphabet = tf.constant(list('abcdefghijklmnopqrstuvwxyz'))
print(tf.gather(alphabet,
indices=[2, 0, 19, 18]))
tf.Tensor([b'c' b'a' b't' b's'], shape=(4,), dtype=string)
Bir tensörün birden çok ekseninden dilimleri çıkarmak için tf.gather_nd
kullanın. Bu, yalnızca satırları veya sütunları yerine bir matrisin öğelerini toplamak istediğinizde kullanışlıdır.
t4 = tf.constant([[0, 5],
[1, 6],
[2, 7],
[3, 8],
[4, 9]])
print(tf.gather_nd(t4,
indices=[[2], [3], [0]]))
tf.Tensor( [[2 7] [3 8] [0 5]], shape=(3, 2), dtype=int32)
t5 = np.reshape(np.arange(18), [2, 3, 3])
print(tf.gather_nd(t5,
indices=[[0, 0, 0], [1, 2, 1]]))
tf.Tensor([ 0 16], shape=(2,), dtype=int64)
# Return a list of two matrices
print(tf.gather_nd(t5,
indices=[[[0, 0], [0, 2]], [[1, 0], [1, 2]]]))
tf.Tensor( [[[ 0 1 2] [ 6 7 8]] [[ 9 10 11] [15 16 17]]], shape=(2, 2, 3), dtype=int64)
# Return one matrix
print(tf.gather_nd(t5,
indices=[[0, 0], [0, 2], [1, 0], [1, 2]]))
tf.Tensor( [[ 0 1 2] [ 6 7 8] [ 9 10 11] [15 16 17]], shape=(4, 3), dtype=int64)
Tensörlere veri ekleme
Bir tensörün belirli dilimlerine/endekslerine veri eklemek için tf.scatter_nd
kullanın. Değer eklediğiniz tensörün sıfır başlatılmış olduğuna dikkat edin.
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))
tf.Tensor([ 0 2 0 4 0 6 0 8 0 10], shape=(10,), dtype=int32)
Sıfır başlatılmış tensörler gerektiren tf.scatter_nd
gibi yöntemler, seyrek tensör başlatıcılara benzer. Seyrek tensör işlemlerinin davranışını taklit etmek için tf.gather_nd
ve tf.scatter_nd
kullanabilirsiniz.
Bu iki yöntemi birlikte kullanarak seyrek bir tensör oluşturduğunuz bir örnek düşünün.
# 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)
tf.Tensor( [[ 0 0 2 0 0] [ 0 0 0 0 0] [ 0 11 0 0 0] [ 0 0 0 18 0]], shape=(4, 5), dtype=int32)
Bu şuna benzer:
t9 = tf.SparseTensor(indices=[[0, 2], [2, 1], [3, 3]],
values=[2, 11, 18],
dense_shape=[4, 5])
print(t9)
SparseTensor(indices=tf.Tensor( [[0 2] [2 1] [3 3]], shape=(3, 2), dtype=int64), values=tf.Tensor([ 2 11 18], shape=(3,), dtype=int32), dense_shape=tf.Tensor([4 5], shape=(2,), dtype=int64))
# Convert the sparse tensor into a dense tensor
t10 = tf.sparse.to_dense(t9)
print(t10)
tf.Tensor( [[ 0 0 2 0 0] [ 0 0 0 0 0] [ 0 11 0 0 0] [ 0 0 0 18 0]], shape=(4, 5), dtype=int32)
Önceden var olan değerlere sahip bir tensöre veri eklemek için tf.tensor_scatter_nd_add
kullanın.
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)
tf.Tensor( [[2 7 6] [9 5 1] [4 3 8]], shape=(3, 3), dtype=int32)
Benzer şekilde, önceden var olan değerlere sahip bir tensörden değerleri çıkarmak için tf.tensor_scatter_nd_sub
kullanın.
# 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)
tf.Tensor( [[1 0 0] [0 1 0] [0 0 1]], shape=(3, 3), dtype=int32)
Öğe bazında minimum değerleri bir tf.tensor_scatter_nd_min
diğerine kopyalamak için tf.tensor_scatter_nd_min kullanın.
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)
tf.Tensor( [[-2 -7 -6] [-9 -5 1] [-4 -3 -8]], shape=(3, 3), dtype=int32)
Benzer şekilde, eleman bazında maksimum değerleri bir tf.tensor_scatter_nd_max
diğerine kopyalamak için tf.tensor_scatter_nd_max kullanın.
t16 = tf.tensor_scatter_nd_max(t14,
indices=[[0, 2], [1, 1], [2, 0]],
updates=[6, 5, 4])
print(t16)
tf.Tensor( [[-2 -7 6] [-9 5 1] [ 4 -3 -8]], shape=(3, 3), dtype=int32)
Daha fazla okuma ve kaynaklar
Bu kılavuzda, tensörlerinizdeki öğeler üzerinde daha hassas kontrol uygulamak için TensorFlow'da bulunan tensör dilimleme işlemlerini nasıl kullanacağınızı öğrendiniz.
TensorFlow NumPy ile kullanılabilen
tf.experimental.numpy.take_along_axis
vetf.experimental.numpy.take
gibi dilimleme işlemlerine göz atın.Ayrıca Tensör kılavuzuna ve Değişken kılavuzuna bakın.