f in x
Neural Networks with PyTorch: A Practical Guide for Developers
> cd .. / HUB_EDITORIALE
Intelligenza Artificiale

Neural Networks with PyTorch: A Practical Guide for Developers

[2026-06-12] Author: Ing. Calogero Bono

You've written code that works, but when you try to build a neural network with PyTorch you get lost among tensors, autograd, and modules. You're not alone. The framework is powerful, but the learning curve is steep if you come from traditional stacks. We, at Meteora Web, use it daily for applied machine learning projects with real clients. As with any tool, the trick is to understand the fundamentals before writing a line of code. This guide takes you straight to the point: create, train, and evaluate a neural network with PyTorch, no fluff.

Why PyTorch?

PyTorch has become the de facto standard for deep learning research and production for one reason: it combines flexibility and control. Unlike frameworks like TensorFlow (in its 1.x version), PyTorch uses a dynamic computation graph: you can run normal Python code, debug with print(), and modify the network structure on the fly. If you come from web development, think of it as an environment where network logic is written in the same language as the rest of your application.

Dynamic vs Static

In a static graph (TensorFlow 1.x), you define the graph first, then execute it. With PyTorch, the graph is built on the fly during the forward pass. This means you can use conditions, loops, and Python functions without tricks. For a developer, it's a gift: the code reflects exactly what happens.

Sponsored Protocol

Python Integration

PyTorch is a pure Python library (with C++ runtime underneath). Tensors, autograd, modules: everything is accessible from Python. There is no separate template language, no abstract configuration files. If you know Python, you already know half of PyTorch.

Immediate action for you: open a terminal and install PyTorch with pip install torch torchvision. Then verify with python -c "import torch; print(torch.__version__)".

The core building blocks: Tensors, Autograd, and nn.Module

Tensors: the new array

The tensor is PyTorch's equivalent of a NumPy array, but with GPU support and automatic derivative tracking. Every piece of data that enters a neural network must be converted to a tensor.

import torch

# Tensor from list
x = torch.tensor([[1, 2], [3, 4]], dtype=torch.float32)
print(x.shape)  # torch.Size([2, 2])

# Tensor from numpy
import numpy as np
np_array = np.array([1, 2, 3])
x_tensor = torch.from_numpy(np_array)

# Tensor on GPU (if available)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
x_gpu = x.to(device)

Common mistake: forgetting to convert data to float32. PyTorch expects float32 by default in neural networks. np.float64 or int64 cause silent type errors.

Autograd: automatic derivatives

Any tensor with requires_grad=True records the operations performed on it. When you call .backward(), PyTorch computes the gradients with respect to that tensor. It is the heart of training.

Sponsored Protocol

x = torch.tensor([2.0, 3.0], requires_grad=True)
y = x[0]2 + x[1]3
y.backward()
print(x.grad)  # tensor([4., 27.])  -> derivatives: 2*x[0], 3*x[1]^2

Caution: gradients accumulate. After each optimization step, zero them with optimizer.zero_grad() or manually.

nn.Module: the base class for every network

All models in PyTorch inherit from torch.nn.Module. Define layers in __init__ and the forward pass in forward.

import torch.nn as nn

class SimpleNet(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc1 = nn.Linear(10, 50)
        self.relu = nn.ReLU()
        self.fc2 = nn.Linear(50, 2)

    def forward(self, x):
        x = self.fc1(x)
        x = self.relu(x)
        return self.fc2(x)

Building a complete neural network: step by step

Let's take a concrete problem: binary classification on 2D data (e.g., separating two clusters).

1. Generate sample data

import torch
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split

X, y = make_moons(n_samples=1000, noise=0.1, random_state=42)
X = torch.tensor(X, dtype=torch.float32)
y = torch.tensor(y, dtype=torch.long)  # CrossEntropyLoss expects long

X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)

2. Define the model

class BinaryClassifier(nn.Module):
    def __init__(self):
        super().__init__()
        self.net = nn.Sequential(
            nn.Linear(2, 16),
            nn.ReLU(),
            nn.Linear(16, 16),
            nn.ReLU(),
            nn.Linear(16, 2)  # output logits for 2 classes
        )
    def forward(self, x):
        return self.net(x)

model = BinaryClassifier()

3. Loss and optimizer

criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)

4. Training loop

epochs = 100
batch_size = 32

for epoch in range(epochs):
    # Shuffle data
    perm = torch.randperm(len(X_train))
    X_train_shuffled = X_train[perm]
    y_train_shuffled = y_train[perm]

    for i in range(0, len(X_train), batch_size):
        X_batch = X_train_shuffled[i:i+batch_size]
        y_batch = y_train_shuffled[i:i+batch_size]

        # Forward
        outputs = model(X_batch)
        loss = criterion(outputs, y_batch)

        # Backward
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

    if (epoch+1) % 10 == 0:
        with torch.no_grad():
            val_outputs = model(X_val)
            val_loss = criterion(val_outputs, y_val)
            _, predicted = torch.max(val_outputs, 1)
            acc = (predicted == y_val).float().mean()
        print(f'Epoch {epoch+1}, Loss: {loss.item():.4f}, Val Loss: {val_loss.item():.4f}, Acc: {acc.item():.2f}')

Note: you are building the loop manually. In production, use DataLoader for automatic batching (see best practices).

Sponsored Protocol

Moving to GPU: real acceleration

The real power of PyTorch is the GPU. Simply move model and data to the correct device.

Sponsored Protocol

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)

# Inside loop:
X_batch = X_batch.to(device)
y_batch = y_batch.to(device)

Common mistake: forgetting to move the targets as well. Gradients won't propagate if tensors are on different devices. Always check with tensor.device.

Best practices for developers moving to production

Use DataLoader

Instead of handling batches manually, use torch.utils.data.DataLoader. It provides shuffling, parallelism, and automatic mini-batching.

from torch.utils.data import TensorDataset, DataLoader

train_dataset = TensorDataset(X_train, y_train)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)

for X_batch, y_batch in train_loader:
    # ready to use
    pass

Saving and loading the model

Save only the state_dict (weights) for flexibility and safety. Never save the entire object.

Sponsored Protocol

# Save
torch.save(model.state_dict(), 'model.pth')

# Load
model = BinaryClassifier()
model.load_state_dict(torch.load('model.pth', map_location=device))
model.eval()

Evaluation mode

Before making predictions, call model.eval(). It disables dropout and batch normalization. After training, call model.train() if you resume.

Tracking with TensorBoard

Use torch.utils.tensorboard to log losses, metrics, and graphs. We've integrated it into several platforms for our clients.

In summary — what to do now

  1. Install PyTorch in your development environment (pip install torch torchvision).
  2. Copy the code above for binary classification and run it. Experiment with more layers, different activations (ReLU, Tanh, GELU).
  3. Switch to a real dataset: load MNIST or CIFAR-10 using torchvision.datasets and adapt the network (input size, output).
  4. Add GPU if you have an NVIDIA card. Note the speed difference.
  5. Read the official documentation: PyTorch Docs is clear and complete.

We, at Meteora Web, have built PyTorch models for clients ranging from document recognition to sales forecasting. The framework is incredibly powerful if you treat it as an extension of Python — not as a black box. Start with these fundamentals, and the rest will follow.

Ing. Calogero Bono

> AUTHOR_EXTRACTED

Ing. Calogero Bono

Ingegnere Informatico, co-fondatore di Meteora Web. Esperto in architetture software, sicurezza informatica e sviluppo sistemi scalabili.
[ Read Full Dossier ]

> METEORA_WEB // DIGITAL AGENCY

We build the digital presence your business deserves.

Websites, social media, online advertising, e-commerce and high-performance hosting, engineered with method by computer engineers in Sciacca, for all of Italy.

> MW_JOURNAL

> READ_ALL()