Kan je alleen PyTorch gebruiken zonder NumPy?

Voor deep learning ontwikkelaars is dit een verwarrende vraag.

Als je de fine‑tuning code bekijkt, zie je twee namen die altijd samen voorkomen.

 import numpy as np
 import torch

“Waarom heb ik NumPy nodig als alle tensor‑operaties al in PyTorch zitten?” “Zijn de concepten niet overlappend, moet ik NumPy toch apart leren?”

Ik had zelf dezelfde vragen, en op basis van een duidelijke uitleg heb ik dit samengevat.


1. Wat is het verschil tussen NumPy en PyTorch?



In het kort: PyTorch is

“NumPy op de GPU + automatische differentiatie (autograd)”

De rollen zijn als volgt:

  • NumPy
  • Bibliotheek voor arrays/matrices op de CPU
  • De facto “Python‑standaard” voor numerieke berekeningen, lineaire algebra en statistiek
  • Werkt rond de datastructuur ndarray

  • PyTorch

  • API die sterk lijkt op NumPy
  • Kan draaien op de CPU én GPU (CUDA)
  • Ondersteunt automatische differentiatie → mogelijk maken van deep learning

PyTorch‑ontwikkelaars hebben de NumPy‑syntaxis bijna volledig overgenomen.

  • np.array([...])torch.tensor([...])
  • x_np.shapex_torch.shape
  • np.reshape(x, ...)x_torch.view(...) of x_torch.reshape(...)

Wanneer je PyTorch‑tensor‑operaties leert, leer je dus ook automatisch de NumPy‑stijl.


2. Moet je eerst NumPy leren?

Veel tutorials beginnen met NumPy, maar vanuit een praktische invalshoek is het antwoord:

Je hoeft niet eerst NumPy te leren. PyTorch kan direct met tensor‑operaties beginnen.

Reden:

  • Concepten als vorm, broadcasting en indexing werken vrijwel identiek in NumPy en PyTorch.
  • In deep learning gebruiken we vooral “tensor‑operaties + automatische differentiatie”, wat alleen in PyTorch aanwezig is.

Dus als deep learning je doel is:

  1. Leer eerst de PyTorch‑tensor‑manipulatie.
  2. Wanneer je np.xxx tegenkomt, begrijp het als “de CPU‑array‑versie van een PyTorch‑operatie”.

3. Waarom zie je toch nog steeds NumPy?



Je vraagt je af:

“Als PyTorch krachtiger is, waarom gebruiken we nog steeds NumPy?”

Het antwoord: de meeste Python‑data‑ en wetenschappelijke ecosystemen zijn op NumPy gebaseerd.

3‑1. Data‑voorbereiding: de wereld van NumPy

Veel libraries die je gebruikt voor data‑voorbereiding werken met NumPy‑arrays:

  • OpenCV, Pillow → afbeeldingen worden teruggegeven als NumPy‑arrays
  • pandasDataFrame.values / to_numpy() gebruiken NumPy‑arrays
  • Diverse statistische/numerieke pakketten → input/output is meestal NumPy‑gebaseerd

Kortom, “data manipulatie vóór het model” gebeurt vaak met NumPy.

3‑2. Model‑training/ inferentie: de wereld van PyTorch

import numpy as np
import torch

x_np = ...  # NumPy‑array na preprocessing
x_tensor = torch.from_numpy(x_np)  # naar tensor converteren
x_tensor = x_tensor.to("cuda")     # naar GPU

out = model(x_tensor)

Vanaf dit punt is het een PyTorch‑wereld.

3‑3. Visualisatie, opslag, post‑processing: terug naar NumPy

Resultaten van het model gebruiken we vaak met:

  • matplotlib voor grafieken
  • pandas voor CSV‑export
  • Eenvoudige statistische berekeningen

Deze libraries werken allemaal met NumPy‑arrays, dus we moeten de tensor terug converteren:

out_cpu = out.detach().cpu().numpy()

Een veelvoorkomende fout is:

TypeError: can't convert cuda:0 device type tensor to numpy

Je moet eerst naar de CPU verplaatsen en dan converteren.


4. Systeem‑niveau: “Zero‑Copy” delen

Een interessant detail: wanneer je een NumPy‑array naar een tensor converteert, wordt er niet gekopieerd.

x_np = np.random.randn(3, 3)
x_tensor = torch.from_numpy(x_np)  # hier!

torch.from_numpy(...) deelt dezelfde geheugen‑buffer als NumPy. Dus grote arrays hoeven niet extra geheugen te gebruiken.

Omgekeerd:

x_np2 = x_tensor.numpy()

(voor een CPU‑tensor) levert een NumPy‑array die dezelfde buffer gebruikt.

Dit betekent dat wijzigingen in één reflecteren in de ander:

x_np = np.zeros((2, 2))
x_tensor = torch.from_numpy(x_np)

x_tensor[0, 0] = 1
print(x_np)
# [[1. 0.]
#  [0. 0.]]  ← NumPy‑array verandert ook

Samengevat:

  • PyTorch en NumPy kunnen op de CPU geheugen delen.
  • Hierdoor kun je “preprocessing (NumPy) ↔ training (PyTorch) ↔ post‑processing (NumPy)” zonder grote kopie‑kosten.

5. Een eenvoudig voorbeeld van het volledige proces

Stel je een eenvoudige beeld‑classificatie‑workflow voor:

import cv2
import numpy as np
import torch

# 1. Afbeelding laden & NumPy‑preprocessing (NumPy‑gebied)
img = cv2.imread("cat.png")          # shape: (H, W, C), BGR, NumPy array
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = cv2.resize(img, (224, 224))
img = img.astype(np.float32) / 255.0
img = np.transpose(img, (2, 0, 1))   # (C, H, W)

# 2. NumPy → PyTorch‑tensor & GPU‑verplaatsing (PyTorch‑gebied)
x = torch.from_numpy(img)            # shape: (3, 224, 224)
x = x.unsqueeze(0)                   # batch: (1, 3, 224, 224)
x = x.to("cuda")

# 3. Model inferentie
with torch.no_grad():
    logits = model(x)
    probs = torch.softmax(logits, dim=1)

# 4. Resultaten terug naar NumPy voor post‑processing (NumPy‑gebied)
probs_np = probs.cpu().numpy()
pred_class = np.argmax(probs_np, axis=1)[0]

De code laat zien hoe de grenzen tussen NumPy en PyTorch duidelijk zijn: input/output in NumPy, de kern van training in PyTorch.


6. Samenvatting: een handig perspectief

Kortom, dit is genoeg om te begrijpen:

  1. Studeren van PyTorch is vergelijkbaar met het leren van een “toekomst‑gerichte” versie van NumPy. Tensor‑manipulatie en broadcasting zijn vrijwel hetzelfde.
  2. Je hoeft niet diep in NumPy te duiken als je deep learning wilt doen. Leer PyTorch en behandel np.xxx als de CPU‑versie.
  3. In de praktijk zie je echter nog steeds NumPy voor: * Data‑voorbereiding * Visualisatie, opslag en statistiek * Frequent gebruik van .numpy(), torch.from_numpy, .cpu()
  4. Zero‑Copy: PyTorch en NumPy delen geheugen, waardoor grote datasets efficiënt kunnen worden overgedragen.

Met dit inzicht kun je soepel schakelen tussen de twee werelden – een essentieel vaardigheidsniveau voor moderne Python‑deep‑learning ontwikkelaars.

image