يوم مجتمع ML هو 9 نوفمبر! الانضمام إلينا للحصول على التحديثات من TensorFlow، JAX، وأكثر معرفة المزيد

مقدمة لتقطيع الموتر

عرض على TensorFlow.org تشغيل في Google Colab عرض المصدر على جيثب تحميل دفتر

عند العمل على تطبيقات ML مثل اكتشاف الكائنات ومعالجة اللغات الطبيعية ، من الضروري أحيانًا العمل مع الأقسام الفرعية (شرائح) من الموترات. على سبيل المثال ، إذا كانت بنية النموذج الخاصة بك تتضمن التوجيه ، حيث قد تتحكم إحدى الطبقات في مثال التدريب الذي يتم توجيهه إلى الطبقة التالية. في هذه الحالة ، يمكنك استخدام عمليات التقطيع الموتر لتقسيم الموترات وإعادة تجميعها معًا بالترتيب الصحيح.

في تطبيقات البرمجة اللغوية العصبية ، يمكنك استخدام تقطيع الموتر لأداء إخفاء الكلمات أثناء التدريب. على سبيل المثال ، يمكنك إنشاء بيانات تدريب من قائمة الجمل عن طريق اختيار فهرس الكلمات لإخفائها في كل جملة ، وإخراج الكلمة كتسمية ، ثم استبدال الكلمة المختارة برمز مميز للقناع.

في هذا الدليل ، ستتعلم كيفية استخدام TensorFlow APIs من أجل:

  • استخراج شرائح من موتر
  • أدخل البيانات في فهارس محددة في موتر

يفترض هذا الدليل الإلمام بفهرسة الموتر. قراءة المقاطع فهرسة التنسور و TensorFlow نمباي أدلة قبل الشروع في العمل مع هذا الدليل.

اقامة

import tensorflow as tf
import numpy as np

استخراج شرائح الموتر

أداء نمباي مثل تشريح موتر باستخدام tf.slice .

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)

بدلاً من ذلك ، يمكنك استخدام المزيد من بناء جملة Pythonic. لاحظ أن شرائح الموتر متباعدة بالتساوي على نطاق بدء-توقف.

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)

بالنسبة إلى الموترات ثنائية الأبعاد ، يمكنك استخدام شيء مثل:

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 على التنسورات الأبعاد أعلى أيضا.

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)

يمكنك أيضا استخدام tf.strided_slice لاستخراج شرائح من التنسورات التي كتبها 'سائرين "على أبعاد الموترة.

استخدام tf.gather لمؤشرات استخراج محددة من محور واحد من الموترة.

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 لا تتطلب مؤشرات إلى أن متباعدة بشكل متساو.

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)

لاستخراج شرائح من محاور متعددة من الموترة، واستخدام tf.gather_nd . يكون هذا مفيدًا عندما تريد تجميع عناصر المصفوفة بدلاً من مجرد صفوفها أو أعمدتها.

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)

أدخل البيانات في الموترات

استخدام tf.scatter_nd لادخال البيانات في شرائح / مؤشرات محددة من الموترة. لاحظ أن الموتر الذي تقوم بإدخال القيم فيه هو صفر تهيئة.

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)

أساليب مثل tf.scatter_nd التي تتطلب تهيئة-صفر التنسورات مماثلة لمتفرق موتر المهيآت. يمكنك استخدام tf.gather_nd و tf.scatter_nd لتقليد سلوك التقاط موتر متفرق.

ضع في اعتبارك مثالًا حيث تقوم ببناء موتر متفرق باستخدام هاتين الطريقتين بالتزامن.

# 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)

هذا مشابه لـ:

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)

لإدراج البيانات في موتر مع القيم الموجودة من قبل، واستخدام 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)
tf.Tensor(
[[2 7 6]
 [9 5 1]
 [4 3 8]], shape=(3, 3), dtype=int32)

وبالمثل، واستخدام tf.tensor_scatter_nd_sub لطرح القيم من موتر مع القيم الموجودة من قبل.

# 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)

استخدام tf.tensor_scatter_nd_min لنسخ قيم الحد الأدنى عنصر الحكمة من موتر واحد إلى آخر.

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)

وبالمثل، واستخدام tf.tensor_scatter_nd_max لنسخ القيم أقصى عنصر الحكمة من موتر واحد إلى آخر.

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)

مزيد من القراءة والموارد

في هذا الدليل ، تعلمت كيفية استخدام عمليات التقطيع الموتر المتوفرة مع TensorFlow لممارسة سيطرة أفضل على العناصر الموجودة في الموترات الخاصة بك.