Artykuł pochodzi z wydania: Październik 2026
Zanim zbudujemy sieć neuronową, musimy poznać strukturę danych, na której ona pracuje: tensor. Najpierw przygotujemy środowisko pracy, a następnie krok po kroku przejdziemy od pojedynczej liczby, przez wektory i macierze, aż po tensory wielowymiarowe.
Projekty w Pythonie możemy pisać na dwa sposoby – globalnie i lokalnie. Jeżeli chcemy, aby moduły Pythona (wymagane do naszego nowego projektu) były dostępne dla pozostałych projektów, oraz chcemy współdzielić interpreter kodu, to używamy opcji globalnej. Nie zawsze jednak okazuje się to takie proste.
Przygotowanie środowiska
W przypadku większej liczby projektów programistycznych na danym komputerze takie rozwiązanie może okazać się problematyczne. Jeden kod może bowiem potrzebować interpretera Python w wersji 3.1, inny natomiast 3.2, bo na 3.1 nie działa. Podobnie z modułami (bibliotekami) – może się okazać, że dany projekt uruchamia się tylko na jednej wersji modułu, bo nowsza ma już inne API, nieobsługiwane przez nasz stary kod.
Aby uniknąć takich problemów, programiści wykorzystują lokalne projekty. Rozwiązanie to polega na umieszczeniu interpretera Python i bibliotek w osobnym, wskazanym folderze, do którego ma dostęp tylko nasz projekt – pliki nie sią współdzielone z innymi projektami. W Pythonie takie rozwiązanie nazywa się środowiskiem wirtualnym (venv, virtual environments). W takim środowisku możemy wykorzystać dowolną wersję Pythona, którą mamy zainstalowaną.
Aby wylistować posiadane wersje, wykonujemy komendę py -0 lub – aby odczytać ścieżki – py –list-paths albo py -0p. Polecenie python -m venv /sciezka/projektu/venv skopiuje domyślny interpreter do folderu venv we wskazanym w ścieżce folderze. W tym właśnie folderze będą również instalowane moduły. Opcja -m pozwala na wskazanie modułu Python, który chcemy użyć; w tym przypadku jest to moduł venv. Jeżeli planujemy użyć konkretnej wersji Pythona, wystarczy ją wskazać, np. poprzez py -3.11 -m venv venv.
Po wykonaniu komendy we wskazanym katalogu znajdziemy kilka folderów. W folderze Scripts znajdziemy interpreter, moduł pip do instalacji pakietów i kilka skryptów. Kolejnym krokiem jest aktywacja venv w terminalu, abyśmy przełączyli się na nowe środowisko wirtualne, dzięki czemu zmienne środowiskowe (m.in. PATH) będą wskazywać na folder Scripts. Aktywacja wykonywana jest skryptem w pliku activate, activate. bat lub Activate.ps1. Po jego uruchomieniu zobaczymy (venv) przed ścieżką w terminalu.
Rodzaje tensorów w NumPy i PyTorch
Sieci neuronowe działają na liczbach. Wszystko, co wchodzi do sieci i z niej wychodzi, jest liczbą. W celu efektywnego (szybkiego) wykonywania operacji matematycznych powstały specjalne typy danych i biblioteki, które przewyższają osiągi natywnych typów i metod w Pythonie. Python bowiem przechowuje tablicę liczb jako listę obiektów – każdy element jest osobnym obiektem. Dodatkowo musi przechowywać adresy tych obiektów (wskaźniki). Z tego powodu rozwiązanie to jest wolne i zajmuje dużo miejsca w pamięci.
W artykule opiszemy strukturę danych zwaną tensorem, udostępnianą przez biblioteki NumPy i PyTorch. NumPy jest biblioteką, która zwiększa szybkość wykonywanych obliczeń matematycznych, zmniejsza rozmiar przechowywanych danych w pamięci i ułatwia programiście pracę, udostępniając mu proste API. NumPy została napisana w języku C, co w połączeniu z jednorodnym typem danych, ciągłym układem danych w pamięci oraz wektoryzacją operacji (wykonywaniem pętli wewnątrz skompilowanego kodu C zamiast w interpreterze Pythona) daje jej przewagę wydajnościową nad natywnymi strukturami Pythona. W NumPy odpowiednikiem tensora jest tablica wielowymiarowa (multidimensional array, typ numpy. ndarray) – sama biblioteka nie nazywa tej struktury tensorem, ale koncepcyjnie odgrywa ona identyczną rolę. Obie biblioteki przechowują elementy w ciągłej pamięci (nie rozrzucone), bez opakowywania ich w obiekty. Informacje o typie danych (dtype – data type), shape, znajdują się w metadanych. Wszystkie elementy w tablicy są tego samego typu.
Aby dodać NumPy do projektu, należy w terminalu, w naszym środowisku wirtualnym, zainstalować ją poleceniem pip install numpy. Po instalacji znajdzie się ona w folderze Lib.
Teraz możemy jej użyć w skrypcie Python. W głównym folderze projektu tworzymy plik main.py i zamieszczamy w nim linijkę importującą zainstalowaną bibliotekę: import numpy as np. Alias po „as” wskazuje, jak będziemy się odnosić do zaimportowanej biblioteki w kodzie.
Tensor, który zawiera tylko jedną liczbę, nazywamy skalarem (tensor 0D, tensor, którego liczba osi wynosi 0, rank 0). Liczbę osi możemy sprawdzić we właściwości ndim:
scalar = np.array(1)
print(’scalar: ’, scalar) # wartość: 1
print(’scalar ndim (liczba osi): ’, scalar.ndim)
# scalar ndim (liczba osi): 0
print(’scalar shape: ’, scalar.shape) # scalar shape: ()
Strukturą 1D nazywamy wektor. Zapisujemy go, dodając nawiasy kwadratowe. Wektor może przechowywać jeden lub wiele skalarów. W porównaniu ze skalarem ma on jedną oś, a liczbę elementów możemy odczytać poprzez właściwość shape. Typem shape jest krotka (tuple) zapisywana w nawiasach – każda wartość informuje o liczbie elementów w danej osi.
vector = np.array([1,4,7,9,88])
print(vector)
print(’vector ndim (liczba osi): ’, vector.ndim)
# vector ndim (liczba osi): 1
print(’vector shape: ’, vector.shape) # vector shape: (5,)
Jeżeli do wektora dodamy kolejny wymiar (oś), otrzymamy macierz, czyli tensor 2D. Macierz ma dwie osie (rank 2), które w uproszczeniu nazywamy wierszem (axis 0, oś 0) i kolumną (axis 1, oś 1). Macierz możemy traktować jak tablice wektorów. Do zapisu macierzy używamy zewnętrznych nawiasów kwadratowych, a każdy wiersz zamknięty jest w oddzielne nawiasy.
matrix =np.array(
[
[16,80,9],
[13,20,5]
]
)
print(’matrix: ’, matrix)
print(’matrix ndim (liczba osi): ’, matrix.ndim)
# matrix ndim (liczba osi): 2
print(’matrix shape: ’, matrix.shape) # matrix shape: (2,3)
[…]
Jan Nowak
Autor jest informatykiem z doświadczeniem w jednostkach sektora publicznego.





