336 skaitymai
336 skaitymai

Nėra „TensorFlow“ be jutiklių

Per ilgai; Skaityti

Tensorai yra daugialypiai diapazonai, esantys „TensorFlow“ branduolyje, leidžiantys efektyviai pateikti ir manipuliuoti duomenimis.Šis vadovas apima tensorų kūrimą, operacijas ir pažangias sąvokas, tokias kaip transliavimas ir ragged tensors, suteikiant visapusišką supratimą mašinų mokymosi specialistams.
featured image - Nėra „TensorFlow“ be jutiklių
Tensor Flow - [Technical Documentation] HackerNoon profile picture
0-item

Turinio apžvalga

  • Pagrindiniai
  • Apie formas
  • indeksavimas
  • Manipuliuoja formomis
  • Daugiau apie DTypes
  • Transliavimas
  • tf.convert_to į tensor
  • Įtemptas tenisas
  • String tenzoriai
  • Sutaupyti teniso

Tenzoriai yra daugialypiai diapazonai, turintys vienodą tipą (vadinamądtypeGalite pamatyti visus palaikytusdtypesįtf.dtypes.

Jei esate susipažinę suNumerisTendencijos yra tokios, kaipnp.arrays.

Visi tensoriai yra nepakeičiami, kaip ir Python skaičiai ir eilutės: jūs niekada negalite atnaujinti tensoriaus turinio, tik sukurti naują.

import tensorflow as tf
import numpy as np

2024-08-15 03:05:18.327501: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:485] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered
2024-08-15 03:05:18.348450: E external/local_xla/xla/stream_executor/cuda/cuda_dnn.cc:8454] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered
2024-08-15 03:05:18.354825: E external/local_xla/xla/stream_executor/cuda/cuda_blas.cc:1452] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered

Pagrindiniai

Pirmiausia sukurkite keletą pagrindinių įtampų.

Čia yra „skalaras“ arba „rank-0“ tensorius. „skalaras“ turi vieną reikšmę ir jokių „ašių“.

# This will be an int32 tensor by default; see "dtypes" below.
rank_0_tensor = tf.constant(4)
print(rank_0_tensor)

tf.Tensor(4, shape=(), dtype=int32)
WARNING: All log messages before absl::InitializeLog() is called are written to STDERR
I0000 00:00:1723691120.932442  176945 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723691120.936343  176945 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723691120.940040  176945 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723691120.943264  176945 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723691120.954872  176945 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723691120.958376  176945 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723691120.961894  176945 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723691120.964843  176945 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723691120.967730  176945 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723691120.971300  176945 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723691120.974711  176945 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723691120.977717  176945 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723691122.208679  176945 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723691122.210786  176945 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723691122.212791  176945 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723691122.214776  176945 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723691122.216798  176945 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723691122.218734  176945 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723691122.220650  176945 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723691122.222554  176945 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723691122.224486  176945 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723691122.226429  176945 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723691122.228329  176945 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723691122.230251  176945 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723691122.269036  176945 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723691122.271069  176945 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723691122.273006  176945 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723691122.274956  176945 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723691122.276917  176945 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723691122.278854  176945 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723691122.280754  176945 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723691122.282664  176945 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723691122.284613  176945 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723691122.287058  176945 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723691122.289508  176945 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723691122.291891  176945 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355


„Vektorius“ arba „rank-1“ tenzorius yra kaip reikšmių sąrašas.

# Let's make this a float tensor.
rank_1_tensor = tf.constant([2.0, 3.0, 4.0])
print(rank_1_tensor)
tf.Tensor([2. 3. 4.], shape=(3,), dtype=float32)


A "matrix" or "rank-2" tensor has two axes:

# If you want to be specific, you can set the dtype (see below) at creation time
rank_2_tensor = tf.constant([[1, 2],
                             [3, 4],
                             [5, 6]], dtype=tf.float16)
print(rank_2_tensor)
tf.Tensor(
[[1. 2.]
 [3. 4.]
 [5. 6.]], shape=(3, 2), dtype=float16)

A scalar, shape: []

A vector, shape: [3]

A matrix, shape: [3, 2]

A scalar, the number 4

The line with 3 sections, each one containing a number.

A 3x2 grid, with each cell containing a number.

A scalar, the number 4

The line with 3 sections, each one containing a number.

A 3x2 grid, with each cell containing a number.

Tensors may have more axes; here is a tensor with three axes:

# There can be an arbitrary number of
# axes (sometimes called "dimensions")
rank_3_tensor = tf.constant([
  [[0, 1, 2, 3, 4],
   [5, 6, 7, 8, 9]],
  [[10, 11, 12, 13, 14],
   [15, 16, 17, 18, 19]],
  [[20, 21, 22, 23, 24],
   [25, 26, 27, 28, 29]],])

print(rank_3_tensor)
tf.Tensor(
[[[ 0  1  2  3  4]
  [ 5  6  7  8  9]]

 [[10 11 12 13 14]
  [15 16 17 18 19]]

 [[20 21 22 23 24]
  [25 26 27 28 29]]], shape=(3, 2, 5), dtype=int32)

Yra daug būdų, kaip galėtumėte vizualizuoti tensorių su daugiau nei dviem ašimis.

A 3-axis tensor, shape: [3, 2, 5]



Galite konvertuoti tensorių į NumPy matmenį naudodaminp.arrayArba įtensor.numpyMetodinis metodas :

np.array(rank_2_tensor)
array([[1., 2.],
       [3., 4.],
       [5., 6.]], dtype=float16)
rank_2_tensor.numpy()
array([[1., 2.],
       [3., 4.],
       [5., 6.]], dtype=float16)

Tenzoriai dažnai turi plūduriuojančius ir inkstus, tačiau jie turi daug kitų tipų, įskaitant:

  • Kompleksiniai skaičiai
  • Stringų

bazėtf.Tensorklasė reikalauja, kad tensoriai būtų "tiesioginiai"---tai yra, kiekvienoje ašyje, kiekvienas elementas yra to paties dydžio.

  • Įtempti įtampos
  • Taupyti įtampą

Galite atlikti pagrindinę matematiką apie tensorius, įskaitant pridėjimą, elementų dauginimąsi ir matricos dauginimąsi.

a = tf.constant([[1, 2],
                 [3, 4]])
b = tf.constant([[1, 1],
                 [1, 1]]) # Could have also said `tf.ones([2,2], dtype=tf.int32)`

print(tf.add(a, b), "\n")
print(tf.multiply(a, b), "\n")
print(tf.matmul(a, b), "\n")
tf.Tensor(
[[2 3]
 [4 5]], shape=(2, 2), dtype=int32) 

tf.Tensor(
[[1 2]
 [3 4]], shape=(2, 2), dtype=int32) 

tf.Tensor(
[[3 3]
 [7 7]], shape=(2, 2), dtype=int32)
print(a + b, "\n") # element-wise addition
print(a * b, "\n") # element-wise multiplication
print(a @ b, "\n") # matrix multiplication

tf.Tensor(
[[2 3]
 [4 5]], shape=(2, 2), dtype=int32) 

tf.Tensor(
[[1 2]
 [3 4]], shape=(2, 2), dtype=int32) 

tf.Tensor(
[[3 3]
 [7 7]], shape=(2, 2), dtype=int32)

Tenzoriai naudojami visų rūšių operacijose (arba „Ops“).

c = tf.constant([[4.0, 5.0], [10.0, 1.0]])

# Find the largest value
print(tf.reduce_max(c))
# Find the index of the largest value
print(tf.math.argmax(c))
# Compute the softmax
print(tf.nn.softmax(c))
tf.Tensor(10.0, shape=(), dtype=float32)
tf.Tensor([1 0], shape=(2,), dtype=int64)
tf.Tensor(
[[2.6894143e-01 7.3105854e-01]
 [9.9987662e-01 1.2339458e-04]], shape=(2, 2), dtype=float32)

Pastaba: Paprastai ten, kur funkcija TensorFlow tikisi Tensor kaip įvesties, funkcija taip pat priims viską, ką galima konvertuoti į Tensor naudojant tf.convert_to_tensor.

Pastaba: Paprastai ten, kur funkcija TensorFlow tikisi Tensor kaip įvesties, funkcija taip pat priims viską, ką galima konvertuoti į Tensor naudojant tf.convert_to_tensor.

tf.convert_to_tensor([1,2,3])
<tf.Tensor: shape=(3,), dtype=int32, numpy=array([1, 2, 3], dtype=int32)>
tf.reduce_max([1,2,3])
<tf.Tensor: shape=(), dtype=int32, numpy=3>
tf.reduce_max(np.array([1,2,3]))
<tf.Tensor: shape=(), dtype=int64, numpy=3>


Apie formas

Tenzoriai turi formų. Kai kurie žodynai:

  • Forma: Kiekvienos tensoriaus ašies ilgis (elementų skaičius).
  • Skalaras turi reitingą 0, vektoris turi reitingą 1, matrica yra reitingas 2.
  • ašis arba matmuo: tam tikras tensoriaus matmuo.
  • Dydis: Bendras elementų skaičius tensoriuje, formos vektoriaus elementų produktas.

Pastaba: Nors galite matyti nuorodą į „dviejų dimensijų tensorių“, rank-2 tensorius paprastai neapibūdina 2D erdvės.

Pastaba: Nors galite matyti nuorodą į „dviejų dimensijų tensorių“, rank-2 tensorius paprastai neapibūdina 2D erdvės.

Tenzoriai irtf.TensorShapeobjektai turi patogias savybes prieigai prie šių:

rank_4_tensor = tf.zeros([3, 2, 4, 5])


A rank-4 tensor, shape: [3, 2, 4, 5]

A tensor shape is like a vector.

A 4-axis tensor

A tensor shape is like a vector.

A 4-axis tensor

print("Type of every element:", rank_4_tensor.dtype)
print("Number of axes:", rank_4_tensor.ndim)
print("Shape of tensor:", rank_4_tensor.shape)
print("Elements along axis 0 of tensor:", rank_4_tensor.shape[0])
print("Elements along the last axis of tensor:", rank_4_tensor.shape[-1])
print("Total number of elements (3*2*4*5): ", tf.size(rank_4_tensor).numpy())
Type of every element: <dtype: 'float32'>
Number of axes: 4
Shape of tensor: (3, 2, 4, 5)
Elements along axis 0 of tensor: 3
Elements along the last axis of tensor: 5
Total number of elements (3*2*4*5):  120

Tačiau atkreipkite dėmesį, kadTensor.ndimirTensor.shapeAtributas negrįžtaTensorobjektai. jei jums reikiaTensorNaudokitėstf.rankarbatf.shapeŠis skirtumas yra subtilus, tačiau jis gali būti svarbus kuriant grafikus (vėliau).

tf.rank(rank_4_tensor)
<tf.Tensor: shape=(), dtype=int32, numpy=4>
tf.shape(rank_4_tensor)
<tf.Tensor: shape=(4,), dtype=int32, numpy=array([3, 2, 4, 5], dtype=int32)>

Nors ašys dažnai vadinamos jų indeksais, visada turėtumėte sekti kiekvienos reikšmę.Dažnai ašys yra išdėstytos iš globalios į vietinę: pirmoji partijos ašis, po to erdviniai matmenys, o paskutinės kiekvienos vietos savybės.

Typical axis order

Keep track of what each axis is. A 4-axis tensor might be: Batch, Width, Height, Features

Keep track of what each axis is. A 4-axis tensor might be: Batch, Width, Height, Features


indeksavimas

Vienos ašies indeksavimas

TensorFlow seka standartines Python indeksavimo taisykles, panašias įIndeksuoti sąrašą ar eilutę Python, ir pagrindinės NumPy indeksavimo taisyklės.

  • Indeksai prasideda nuo 0
  • Neigiami rodikliai skaičiuojami atgal nuo pabaigos
  • Kolonos, :, naudojamos skiltelėms: start:stop:step


rank_1_tensor = tf.constant([0, 1, 1, 2, 3, 5, 8, 13, 21, 34])
print(rank_1_tensor.numpy())
[ 0  1  1  2  3  5  8 13 21 34]

Indeksavimas su skaleriu pašalina ašį:

print("First:", rank_1_tensor[0].numpy())
print("Second:", rank_1_tensor[1].numpy())
print("Last:", rank_1_tensor[-1].numpy())
First: 0
Second: 1
Last: 34

Indeksavimas su a:Slice išlaiko ašį:

print("Everything:", rank_1_tensor[:].numpy())
print("Before 4:", rank_1_tensor[:4].numpy())
print("From 4 to the end:", rank_1_tensor[4:].numpy())
print("From 2, before 7:", rank_1_tensor[2:7].numpy())
print("Every other item:", rank_1_tensor[::2].numpy())
print("Reversed:", rank_1_tensor[::-1].numpy())
Everything: [ 0  1  1  2  3  5  8 13 21 34]
Before 4: [0 1 1 2]
From 4 to the end: [ 3  5  8 13 21 34]
From 2, before 7: [1 2 3 5 8]
Every other item: [ 0  1  3  8 21]
Reversed: [34 21 13  8  5  3  2  1  1  0]

Daugiasluoksnis indeksavimas

Aukštesnės klasės tensoriai yra indeksuojami praleidžiant kelis indeksus.

Tos pačios taisyklės, kaip ir vieno ašies atveju, taikomos kiekvienai ašiai atskirai.

print(rank_2_tensor.numpy())
[[1. 2.]
 [3. 4.]
 [5. 6.]]

Praleidžiant visą skaičių kiekvienam indeksui, rezultatas yra skalė.

# Pull out a single value from a 2-rank tensor
print(rank_2_tensor[1, 1].numpy())

You can index using any combination of integers and slices:

# Get row and column tensors
print("Second row:", rank_2_tensor[1, :].numpy())
print("Second column:", rank_2_tensor[:, 1].numpy())
print("Last row:", rank_2_tensor[-1, :].numpy())
print("First item in last column:", rank_2_tensor[0, -1].numpy())
print("Skip the first row:")
print(rank_2_tensor[1:, :].numpy(), "\n")
Second row: [3. 4.]
Second column: [2. 4. 6.]
Last row: [5. 6.]
First item in last column: 2.0
Skip the first row:
[[3. 4.]
 [5. 6.]]

Here is an example with a 3-axis tensor:

print(rank_3_tensor[:, :, 4])
tf.Tensor(
[[ 4  9]
 [14 19]
 [24 29]], shape=(3, 2), dtype=int32)


Selecting the last feature across all locations in each example in the batch

A 3x2x5 tensor with all the values at the index-4 of the last axis selected.

The selected values packed into a 2-axis tensor.

A 3x2x5 tensor with all the values at the index-4 of the last axis selected.

The selected values packed into a 2-axis tensor.

Skaitykite apieTenzorų pjovimo vadovassužinoti, kaip galite taikyti indeksavimą, kad manipuliuotumėte atskirais jūsų tensorių elementais.

Manipuliuoja formomis

Tenzoriaus pertvarkymas yra labai naudingas.

# Shape returns a `TensorShape` object that shows the size along each axis
x = tf.constant([[1], [2], [3]])
print(x.shape)
(3, 1)
# You can convert this object into a Python list, too
print(x.shape.as_list())
[3, 1]

Galite performuoti įtampą į naują formą.tf.reshapeoperacija yra greita ir nebrangi, nes pagrindiniai duomenys nereikia dubliuoti.

# You can reshape a tensor to a new shape.
# Note that you're passing in a list
reshaped = tf.reshape(x, [1, 3])
print(x.shape)
print(reshaped.shape)
(3, 1)
(1, 3)

Duomenys išlaiko savo išdėstymą atmintyje ir sukuriamas naujas tensorius su prašoma forma, nukreipdamas į tuos pačius duomenis. „TensorFlow“ naudoja C stiliaus „row-major“ atminties rūšiavimą, kur dešiniojo indekso padidinimas atitinka vieną atminties žingsnį.

print(rank_3_tensor)
tf.Tensor(
[[[ 0  1  2  3  4]
  [ 5  6  7  8  9]]

 [[10 11 12 13 14]
  [15 16 17 18 19]]

 [[20 21 22 23 24]
  [25 26 27 28 29]]], shape=(3, 2, 5), dtype=int32)

Jei išlyginate tensorių, galite pamatyti, kokia tvarka jis išdėstytas atmintyje.

# A `-1` passed in the `shape` argument says "Whatever fits".
print(tf.reshape(rank_3_tensor, [-1]))
tf.Tensor(
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
 24 25 26 27 28 29], shape=(30,), dtype=int32)

Paprastai vienintelis protingas naudojimasistf.reshapeyra sujungti arba padalinti gretimas ašis (arba pridėti / pašalinti1ir s).

Dėl šio 3x2x5 įtempimo, pertvarkymas į (3x2)x5 arba 3x(2x5) yra abu pagrįsti dalykai, kuriuos reikia padaryti, nes gabalėliai nesimaišo:

print(tf.reshape(rank_3_tensor, [3*2, 5]), "\n")
print(tf.reshape(rank_3_tensor, [3, -1]))
tf.Tensor(
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]
 [25 26 27 28 29]], shape=(6, 5), dtype=int32) 

tf.Tensor(
[[ 0  1  2  3  4  5  6  7  8  9]
 [10 11 12 13 14 15 16 17 18 19]
 [20 21 22 23 24 25 26 27 28 29]], shape=(3, 10), dtype=int32)



Some good reshapes.

A 3x2x5 tensor

The same data reshaped to (3x2)x5

The same data reshaped to 3x(2x5)

A 3x2x5 tensor

The same data reshaped to (3x2)x5

The same data reshaped to 3x(2x5)

Performavimas "dirbs" bet kokiai naujai formai su tuo pačiu bendru elementų skaičiumi, tačiau jis nedarys nieko naudingo, jei nesilaikysite ašies tvarkos.

Akių keitimas įtf.reshapeTai neveikia; jums reikiatf.transposeDėl to

# Bad examples: don't do this

# You can't reorder axes with reshape.
print(tf.reshape(rank_3_tensor, [2, 3, 5]), "\n") 

# This is a mess
print(tf.reshape(rank_3_tensor, [5, 6]), "\n")

# This doesn't work at all
try:
  tf.reshape(rank_3_tensor, [7, -1])
except Exception as e:
  print(f"{type(e).__name__}: {e}")


tf.Tensor(
[[[ 0  1  2  3  4]
  [ 5  6  7  8  9]
  [10 11 12 13 14]]

 [[15 16 17 18 19]
  [20 21 22 23 24]
  [25 26 27 28 29]]], shape=(2, 3, 5), dtype=int32) 

tf.Tensor(
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]
 [24 25 26 27 28 29]], shape=(5, 6), dtype=int32) 

InvalidArgumentError: { {function_node __wrapped__Reshape_device_/job:localhost/replica:0/task:0/device:GPU:0} } Input to reshape is a tensor with 30 values, but the requested shape requires a multiple of 7 [Op:Reshape]



Some bad reshapes.

You can't reorder axes, use tf.transpose for that

Anything that mixes the slices of data together is probably wrong.

The new shape must fit exactly.

You can't reorder axes, use tf.transpose for that

Anything that mixes the slices of data together is probably wrong.

The new shape must fit exactly.

Galite paleisti ne visiškai apibrėžtas formas.None(ašių ilgis nežinomas) arba visa forma yraNone(Tenzoriaus lygis nėra žinomas)

Išskyrus tf.RaggedTensor, tokios formos įvyks tik TensorFlow simbolinių grafikos kūrimo API kontekste:

  • TF funkcijos
  • Stiprus funkcinis ugnis.


Daugiau apieDTypes

Dvynių

Patikrinkite atf.TensorDuomenų tipas NaudokiteTensor.dtypeNekilnojamojo turto .

Kai kuriant atf.Tensoriš Python objekto galite pasirinktinai nurodyti duomenų tipą.

Jei ne, TensorFlow pasirenka duomenų tipą, kuris gali atstovauti jūsų duomenis.tf.int32Python plūduriuojantys taškų skaičiaitf.float32Priešingu atveju TensorFlow naudoja tas pačias taisykles, kurias NumPy naudoja konvertuojant į diapazonus.

Galite pasirinkti iš tipo į tipą.

the_f64_tensor = tf.constant([2.2, 3.3, 4.4], dtype=tf.float64)
the_f16_tensor = tf.cast(the_f64_tensor, dtype=tf.float16)
# Now, cast to an uint8 and lose the decimal precision
the_u8_tensor = tf.cast(the_f16_tensor, dtype=tf.uint8)
print(the_u8_tensor)
tf.Tensor([2 3 4], shape=(3,), dtype=uint8)


Transliavimas

Transliavimas yra sąvoka, pasiskolinta išLygiavertė funkcija NumPyTrumpai tariant, esant tam tikroms sąlygoms, mažesni įtempėjai automatiškai "ištempti", kad atitiktų didesnius įtempėjus, kai jie vykdo kombinuotas operacijas.

Paprasčiausias ir labiausiai paplitęs atvejis yra tada, kai bandoma padauginti ar pridėti tensorių į skalę.

x = tf.constant([1, 2, 3])

y = tf.constant(2)
z = tf.constant([2, 2, 2])
# All of these are the same computation
print(tf.multiply(x, 2))
print(x * y)
print(x * z)
tf.Tensor([2 4 6], shape=(3,), dtype=int32)
tf.Tensor([2 4 6], shape=(3,), dtype=int32)
tf.Tensor([2 4 6], shape=(3,), dtype=int32)

Panašiai 1 ilgio ašys gali būti ištemptos, kad atitiktų kitus argumentus.

Šiuo atveju 3x1 matrica elementiniu būdu padauginama iš 1x4 matricos, kad būtų sukurta 3x4 matrica.[4].

# These are the same computations
x = tf.reshape(x,[3,1])
y = tf.range(1, 5)
print(x, "\n")
print(y, "\n")
print(tf.multiply(x, y))
tf.Tensor(
[[1]
 [2]
 [3]], shape=(3, 1), dtype=int32) 

tf.Tensor([1 2 3 4], shape=(4,), dtype=int32) 

tf.Tensor(
[[ 1  2  3  4]
 [ 2  4  6  8]
 [ 3  6  9 12]], shape=(3, 4), dtype=int32)

A broadcasted add: a [3, 1] times a [1, 4] gives a [3,4]

Adding a 3x1 matrix to a 4x1 matrix results in a 3x4 matrix

Adding a 3x1 matrix to a 4x1 matrix results in a 3x4 matrix

Štai tokia pati operacija be transliacijos:

x_stretch = tf.constant([[1, 1, 1, 1],
                         [2, 2, 2, 2],
                         [3, 3, 3, 3]])

y_stretch = tf.constant([[1, 2, 3, 4],
                         [1, 2, 3, 4],
                         [1, 2, 3, 4]])

print(x_stretch * y_stretch)  # Again, operator overloading
tf.Tensor(
[[ 1  2  3  4]
 [ 2  4  6  8]
 [ 3  6  9 12]], shape=(3, 4), dtype=int32)

Daugeliu atvejų transliavimas yra efektyvus tiek laiko, tiek erdvėje, nes transliavimo operacija niekada neįgyvendina išplėstų tensorių atmintyje.

Jūs matote, kaip atrodo transliacija naudojanttf.broadcast_to.

print(tf.broadcast_to(tf.constant([1, 2, 3]), [3, 3]))
tf.Tensor(
[[1 2 3]
 [1 2 3]
 [1 2 3]], shape=(3, 3), dtype=int32)

Priešingai nei matematika,broadcast_toJis nedaro nieko ypatingo, kad išsaugotų atmintį.Čia jūs materializuojate tensorių.

Jis gali tapti dar sudėtingesnis.Šiame skyriujeIš Jake VanderPlas knygosPython duomenų mokslo vadovėlisrodo daugiau transliavimo gudrybių (vėl NumPy).


tf.convert_to į tensor

Dauguma operatorių, kaiptf.matmulirtf.reshapePaimkite klasės argumentustf.TensorTačiau, jūs pastebėsite aukščiau atveju, Python objektus, suformuotus kaip tensorius, priimami.

Dauguma, bet ne visi, „Ops Call“convert_to_tensorYra konversijų registras, ir dauguma objektų klasių, pvz., NumPyndarray,TensorShapePython sąrašai irtf.VariableVisi jie bus konvertuojami automatiškai.

Štaitf.register_tensor_conversion_functiondaugiau informacijos, o jei turite savo tipą, norėtumėte automatiškai konvertuoti į tensorių.


Įtemptas tenisas

Tenzorius su kintamu elementų skaičiumi išilgai tam tikros ašies vadinamas „gąsčiu“.tf.ragged.RaggedTensorDėl sugadintų duomenų.

Pavyzdžiui, tai negali būti pateikta kaip įprastas tensorius:

tf.RaggedTensor, shape: [4, None]

A 2-axis ragged tensor, each row can have a different length.

A 2-axis ragged tensor, each row can have a different length.

ragged_list = [
    [0, 1, 2, 3],
    [4, 5],
    [6, 7, 8],
    [9]]
try:
  tensor = tf.constant(ragged_list)
except Exception as e:
  print(f"{type(e).__name__}: {e}")
ValueError: Can't convert non-rectangular Python sequence to Tensor.

Užuot sukūrę atf.RaggedTensorNaudotitf.ragged.constant:

ragged_tensor = tf.ragged.constant(ragged_list)
print(ragged_tensor)
<tf.RaggedTensor [[0, 1, 2, 3], [4, 5], [6, 7, 8], [9]]>

Iš a formostf.RaggedTensorbus keletas ašys su nežinomais ilgio:

print(ragged_tensor.shape)
(4, None)


String įtampos

tf.stringyra adtype, tai reiškia, kad galite pateikti duomenis kaip eilutes (kintamosios ilgio baitų diapazonus) tensoriuose.

Strungės yra atominės ir negali būti indeksuojamos taip, kaip yra Python strings. Strengto ilgis nėra viena iš tensoriaus ašies.tf.stringsUžduotys juos manipuliuoti.

Štai scalar string tensor:

# Tensors can be strings, too here is a scalar string.
scalar_string_tensor = tf.constant("Gray wolf")
print(scalar_string_tensor)
tf.Tensor(b'Gray wolf', shape=(), dtype=string)

Vektoriaus stringų sąrašas:

A vector of strings, shape: [3,]

The string length is not one of the tensor's axes.

The string length is not one of the tensor's axes.


# If you have three string tensors of different lengths, this is OK.
tensor_of_strings = tf.constant(["Gray wolf",
                                 "Quick brown fox",
                                 "Lazy dog"])
# Note that the shape is (3,). The string length is not included.
print(tensor_of_strings)
tf.Tensor([b'Gray wolf' b'Quick brown fox' b'Lazy dog'], shape=(3,), dtype=string)

Aukščiau pateiktame spausdinimebPrefiksas rodo, kadtf.stringdtype nėra unicode eilutė, bet byte eilutė.Unicode vadovėlisdaugiau apie darbą su Unicode tekstu „TensorFlow“.

Jei siunčiate Unicode simbolius, jie yra koduojami UTF-8.

tf.constant("🥳👍")
<tf.Tensor: shape=(), dtype=string, numpy=b'\xf0\x9f\xa5\xb3\xf0\x9f\x91\x8d'>

Kai kurias pagrindines funkcijas su eilutėmis galima rastitf.stringsĮskaitanttf.strings.split.

# You can use split to split a string into a set of tensors
print(tf.strings.split(scalar_string_tensor, sep=" "))
tf.Tensor([b'Gray' b'wolf'], shape=(2,), dtype=string)
# ...but it turns into a `RaggedTensor` if you split up a tensor of strings,
# as each string might be split into a different number of parts.
print(tf.strings.split(tensor_of_strings))
<tf.RaggedTensor [[b'Gray', b'wolf'], [b'Quick', b'brown', b'fox'], [b'Lazy', b'dog']]>

Three strings split, shape: [3, None]

Splitting multiple strings returns a tf.RaggedTensor

Splitting multiple strings returns a tf.RaggedTensor

irtf.strings.to_number:

text = tf.constant("1 10 100")
print(tf.strings.to_number(tf.strings.split(text, " ")))
tf.Tensor([  1.  10. 100.], shape=(3,), dtype=float32)

Nors jūs negalite naudotitf.castNorėdami paversti eilutės tensorių į skaičius, galite jį konvertuoti į bytes, o tada į skaičius.

byte_strings = tf.strings.bytes_split(tf.constant("Duck"))
byte_ints = tf.io.decode_raw(tf.constant("Duck"), tf.uint8)
print("Byte strings:", byte_strings)
print("Bytes:", byte_ints)
Byte strings: tf.Tensor([b'D' b'u' b'c' b'k'], shape=(4,), dtype=string)
Bytes: tf.Tensor([ 68 117  99 107], shape=(4,), dtype=uint8)
# Or split it up as unicode and then decode it
unicode_bytes = tf.constant("アヒル 🦆")
unicode_char_bytes = tf.strings.unicode_split(unicode_bytes, "UTF-8")
unicode_values = tf.strings.unicode_decode(unicode_bytes, "UTF-8")

print("\nUnicode bytes:", unicode_bytes)
print("\nUnicode chars:", unicode_char_bytes)
print("\nUnicode values:", unicode_values)
Unicode bytes: tf.Tensor(b'\xe3\x82\xa2\xe3\x83\x92\xe3\x83\xab \xf0\x9f\xa6\x86', shape=(), dtype=string)

Unicode chars: tf.Tensor([b'\xe3\x82\xa2' b'\xe3\x83\x92' b'\xe3\x83\xab' b' ' b'\xf0\x9f\xa6\x86'], shape=(5,), dtype=string)

Unicode values: tf.Tensor([ 12450  12498  12523     32 129414], shape=(5,), dtype=int32)

tf.stringdtype naudojamas visiems „TensorFlow“ žaliųjų baitų duomenims.tf.ioModulyje yra funkcijų, skirtų duomenims konvertuoti į ir iš baitų, įskaitant vaizdų dekodavimą ir CSV analizę.

Taupyti įtampą

Kartais jūsų duomenys yra menki, pavyzdžiui, labai plati įterpimo erdvė. TensorFlow palaikotf.sparse.SparseTensorir susijusias operacijas, kad būtų galima efektyviai saugoti trūkstamus duomenis.

tf.SparseTensor, shape: [3, 4]

An 3x4 grid, with values in only two of the cells.

An 3x4 grid, with values in only two of the cells.

# Sparse tensors store values by index in a memory-efficient manner
sparse_tensor = tf.sparse.SparseTensor(indices=[[0, 0], [1, 2]],
                                       values=[1, 2],
                                       dense_shape=[3, 4])
print(sparse_tensor, "\n")

# You can convert sparse tensors to dense
print(tf.sparse.to_dense(sparse_tensor))
SparseTensor(indices=tf.Tensor(
[[0 0]
 [1 2]], shape=(2, 2), dtype=int64), values=tf.Tensor([1 2], shape=(2,), dtype=int32), dense_shape=tf.Tensor([3 4], shape=(2,), dtype=int64)) 

tf.Tensor(
[[1 0 0 0]
 [0 0 2 0]
 [0 0 0 0]], shape=(3, 4), dtype=int32)

Iš pradžių paskelbtas „TensorFlow“ svetainėje, šis straipsnis čia pasirodo pagal naują antraštę ir yra licencijuotas pagal CC BY 4.0.

Originally published on the TensorFlow svetainė,Šis straipsnis pasirodo čia pagal naują antraštę ir yra licencijuotas pagalCC BY 4.0.Kodų pavyzdžiai, bendrinami pagalApache 2.0 License.

TensorFlow svetainė


L O A D I N G
. . . comments & more!

About Author

Tensor Flow - [Technical Documentation] HackerNoon profile picture
Tensor Flow - [Technical Documentation]@tensorflow
TensorFlow is an open-source machine learning framework developed by Google for numerical computation and building mach

PABAIGTI ŽYMES

ŠIS STRAIPSNIS BUVO PRISTATYMAS...

Trending Topics

blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks