Skip to main content Skills Marketplace Discover and explore AI skills built by the community.
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Copy promptShow prompt details A direct command skips the review prompt. Inspect the source before running it.
npx skills add https://github.com/davila7/claude-code-templates --skill tensorboardThe command stays on one line. Scroll horizontally to inspect it before copying.
Prefer a local copy? Download the files currently available to SkillsMP.
Download Zip Downloading... More from this repository
Related occupations SOC
Based on SOC occupation classification
name tensorboard description Visualize training metrics, debug models with histograms, compare experiments, visualize model graphs, and profile performance with TensorBoard - Google's ML visualization toolkit version 1.0.0 author Orchestra Research license MIT tags ["MLOps","TensorBoard","Visualization","Training Metrics","Model Debugging","PyTorch","TensorFlow","Experiment Tracking","Performance Profiling"] dependencies ["tensorboard","torch","tensorflow"]
TensorBoard: Visualization Toolkit for ML
When to Use This Skill
Use TensorBoard when you need to:
Visualize training metrics like loss and accuracy over time
Debug models with histograms and distributions
Compare experiments across multiple runs
Visualize model graphs and architecture
Project embeddings to lower dimensions (t-SNE, PCA)
Track hyperparameter experiments
Profile performance and identify bottlenecks
Visualize images and text during trainingUsers : 20M+ downloads/year | GitHub Stars : 27k+ | License : Apache 2.0
Installation
pip install tensorboard
pip install torch torchvision tensorboard
pip install tensorflow
tensorboard --logdir=runs
Quick Start
PyTorch from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter('runs/experiment_1' )
for epoch in range (10 ):
train_loss = train_epoch()
val_acc = validate()
writer.add_scalar('Loss/train' , train_loss, epoch)
writer.add_scalar('Accuracy/val' , val_acc, epoch)
writer.close()
TensorFlow/Keras import tensorflow as tf
tensorboard_callback = tf.keras.callbacks.TensorBoard(
log_dir='logs/fit' ,
histogram_freq=1
)
model.fit(
x_train, y_train,
epochs=10 ,
validation_data=(x_val, y_val),
callbacks=[tensorboard_callback]
)
Core Concepts
1. SummaryWriter (PyTorch) from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter()
writer = SummaryWriter('runs/experiment_1' )
writer = SummaryWriter(comment='baseline' )
writer.add_scalar('Loss/train' , 0.5 , step=0 )
writer.add_scalar('Loss/train' , 0.3 , step=1 )
writer.flush()
writer.close()
2. Logging Scalars
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter()
for epoch in range (100 ):
train_loss = train()
val_loss = validate()
writer.add_scalar('Loss/train' , train_loss, epoch)
writer.add_scalar('Loss/val' , val_loss, epoch)
writer.add_scalar('Accuracy/train' , train_acc, epoch)
writer.add_scalar('Accuracy/val' , val_acc, epoch)
lr = optimizer.param_groups[0 ]['lr' ]
writer.add_scalar('Learning_rate' , lr, epoch)
writer.close()
import tensorflow as tf
train_summary_writer = tf.summary.create_file_writer('logs/train' )
val_summary_writer = tf.summary.create_file_writer('logs/val' )
for epoch in range (100 ):
with train_summary_writer.as_default():
tf.summary.scalar('loss' , train_loss, step=epoch)
tf.summary.scalar('accuracy' , train_acc, step=epoch)
with val_summary_writer.as_default():
tf.summary.scalar('loss' , val_loss, step=epoch)
tf.summary.scalar('accuracy' , val_acc, step=epoch)
3. Logging Multiple Scalars
writer.add_scalars('Loss' , {
'train' : train_loss,
'validation' : val_loss,
'test' : test_loss
}, epoch)
writer.add_scalars('Metrics' , {
'accuracy' : accuracy,
'precision' : precision,
'recall' : recall,
'f1' : f1_score
}, epoch)
4. Logging Images
import torch
from torchvision.utils import make_grid
writer.add_image('Input/sample' , img_tensor, epoch)
img_grid = make_grid(images[:64 ], nrow=8 )
writer.add_image('Batch/inputs' , img_grid, epoch)
pred_grid = make_grid(predictions[:16 ], nrow=4 )
writer.add_image('Predictions' , pred_grid, epoch)
import tensorflow as tf
with file_writer.as_default():
tf.summary.image('Training samples' , images, step=epoch, max_outputs=25 )
5. Logging Histograms
for name, param in model.named_parameters():
writer.add_histogram(name, param, epoch)
if param.grad is not None :
writer.add_histogram(f'{name} .grad' , param.grad, epoch)
writer.add_histogram('Activations/relu1' , activations, epoch)
with file_writer.as_default():
tf.summary.histogram('weights/layer1' , layer1.kernel, step=epoch)
tf.summary.histogram('activations/relu1' , activations, step=epoch)
6. Logging Model Graph
import torch
model = MyModel()
dummy_input = torch.randn(1 , 3 , 224 , 224 )
writer.add_graph(model, dummy_input)
writer.close()
tensorboard_callback = tf.keras.callbacks.TensorBoard(
log_dir='logs' ,
write_graph=True
)
model.fit(x, y, callbacks=[tensorboard_callback])
Advanced Features
Embedding Projector Visualize high-dimensional data (embeddings, features) in 2D/3D.
import torch
from torch.utils.tensorboard import SummaryWriter
embeddings = model.get_embeddings(data)
metadata = ['class_1' , 'class_2' , 'class_1' , ...]
label_images = torch.stack([img1, img2, img3, ...])
writer.add_embedding(
embeddings,
metadata=metadata,
label_img=label_images,
global_step=epoch
)
Navigate to "Projector" tab
Choose PCA, t-SNE, or UMAP visualization
Search, filter, and explore clusters
Hyperparameter Tuning from torch.utils.tensorboard import SummaryWriter
for lr in [0.001 , 0.01 , 0.1 ]:
for batch_size in [16 , 32 , 64 ]:
writer = SummaryWriter(f'runs/lr{lr} _bs{batch_size} ' )
writer.add_hparams(
{'lr' : lr, 'batch_size' : batch_size},
{'hparam/accuracy' : final_acc, 'hparam/loss' : final_loss}
)
for epoch in range (10 ):
loss = train(lr, batch_size)
writer.add_scalar('Loss/train' , loss, epoch)
writer.close()
Text Logging
writer.add_text('Predictions' , f'Epoch {epoch} : {predictions} ' , epoch)
writer.add_text('Config' , str (config), 0 )
markdown_table = """
| Metric | Value |
|--------|-------|
| Accuracy | 0.95 |
| F1 Score | 0.93 |
"""
writer.add_text('Results' , markdown_table, epoch)
PR Curves Precision-Recall curves for classification.
from torch.utils.tensorboard import SummaryWriter
predictions = model(test_data)
labels = test_labels
for i in range (num_classes):
writer.add_pr_curve(
f'PR_curve/class_{i} ' ,
labels == i,
predictions[:, i],
global_step=epoch
)
Integration Examples
PyTorch Training Loop import torch
import torch.nn as nn
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter('runs/resnet_experiment' )
model = ResNet50()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001 )
criterion = nn.CrossEntropyLoss()
dummy_input = torch.randn(1 , 3 , 224 , 224 )
writer.add_graph(model, dummy_input)
for epoch in range (50 ):
model.train()
train_loss = 0.0
train_correct = 0
for batch_idx, (data, target) in enumerate (train_loader):
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward()
optimizer.step()
train_loss += loss.item()
pred = output.argmax(dim=1 )
train_correct += pred.eq(target).sum ().item()
if batch_idx % 100 == 0 :
global_step = epoch * len (train_loader) + batch_idx
writer.add_scalar('Loss/train_batch' , loss.item(), global_step)
train_loss /= len (train_loader)
train_acc = train_correct / len (train_loader.dataset)
model.eval ()
val_loss = 0.0
val_correct = 0
with torch.no_grad():
for data, target in val_loader:
output = model(data)
val_loss += criterion(output, target).item()
pred = output.argmax(dim=1 )
val_correct += pred.eq(target).sum ().item()
val_loss /= len (val_loader)
val_acc = val_correct / len (val_loader.dataset)
writer.add_scalars('Loss' , {'train' : train_loss, 'val' : val_loss}, epoch)
writer.add_scalars('Accuracy' , {'train' : train_acc, 'val' : val_acc}, epoch)
writer.add_scalar('Learning_rate' , optimizer.param_groups[0 ]['lr' ], epoch)
if epoch % 5 == 0 :
for name, param in model.named_parameters():
writer.add_histogram(name, param, epoch)
if epoch % 10 == 0 :
sample_images = data[:8 ]
writer.add_image('Sample_inputs' , make_grid(sample_images), epoch)
writer.close()
TensorFlow/Keras Training import tensorflow as tf
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(32 , 3 , activation='relu' , input_shape=(28 , 28 , 1 )),
tf.keras.layers.MaxPooling2D(),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128 , activation='relu' ),
tf.keras.layers.Dense(10 , activation='softmax' )
])
model.compile (
optimizer='adam' ,
loss='sparse_categorical_crossentropy' ,
metrics=['accuracy' ]
)
tensorboard_callback = tf.keras.callbacks.TensorBoard(
log_dir='logs/fit' ,
histogram_freq=1 ,
write_graph=True ,
write_images=True ,
update_freq='epoch' ,
profile_batch='500,520' ,
embeddings_freq=1
)
model.fit(
x_train, y_train,
epochs=10 ,
validation_data=(x_val, y_val),
callbacks=[tensorboard_callback]
)
Comparing Experiments
Multiple Runs
python train.py --lr 0.001 --logdir runs/exp1
python train.py --lr 0.01 --logdir runs/exp2
python train.py --lr 0.1 --logdir runs/exp3
tensorboard --logdir=runs
All runs appear in the same dashboard
Toggle runs on/off for comparison
Use regex to filter run names
Overlay charts to compare metrics
Organizing Experiments
runs/
├── baseline/
│ ├── run_1/
│ └── run_2/
├── improved/
│ ├── run_1/
│ └── run_2/
└── final/
└── run_1/
writer = SummaryWriter('runs/baseline/run_1' )
Best Practices
1. Use Descriptive Run Names
from datetime import datetime
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S' )
writer = SummaryWriter(f'runs/resnet50_lr0.001_bs32_{timestamp} ' )
writer = SummaryWriter()
2. Group Related Metrics
writer.add_scalar('Loss/train' , train_loss, step)
writer.add_scalar('Loss/val' , val_loss, step)
writer.add_scalar('Accuracy/train' , train_acc, step)
writer.add_scalar('Accuracy/val' , val_acc, step)
writer.add_scalar('train_loss' , train_loss, step)
writer.add_scalar('val_loss' , val_loss, step)
3. Log Regularly but Not Too Often
for epoch in range (100 ):
for batch_idx, (data, target) in enumerate (train_loader):
loss = train_step(data, target)
if batch_idx % 100 == 0 :
writer.add_scalar('Loss/batch' , loss, global_step)
writer.add_scalar('Loss/epoch' , epoch_loss, epoch)
for batch in train_loader:
writer.add_scalar('Loss' , loss, step)
4. Close Writer When Done
with SummaryWriter('runs/exp1' ) as writer:
for epoch in range (10 ):
writer.add_scalar('Loss' , loss, epoch)
writer = SummaryWriter('runs/exp1' )
writer.close()
5. Use Separate Writers for Train/Val
train_writer = SummaryWriter('runs/exp1/train' )
val_writer = SummaryWriter('runs/exp1/val' )
train_writer.add_scalar('loss' , train_loss, epoch)
val_writer.add_scalar('loss' , val_loss, epoch)
Performance Profiling
TensorFlow Profiler
tensorboard_callback = tf.keras.callbacks.TensorBoard(
log_dir='logs' ,
profile_batch='10,20'
)
model.fit(x, y, callbacks=[tensorboard_callback])
PyTorch Profiler import torch.profiler as profiler
with profiler.profile(
activities=[
profiler.ProfilerActivity.CPU,
profiler.ProfilerActivity.CUDA
],
on_trace_ready=torch.profiler.tensorboard_trace_handler('./runs/profiler' ),
record_shapes=True ,
with_stack=True
) as prof:
for batch in train_loader:
loss = train_step(batch)
prof.step()
Resources
See Also
references/visualization.md - Comprehensive visualization guide
references/profiling.md - Performance profiling patterns
references/integrations.md - Framework-specific integration examples