Once the machine learning model is defined and the data is prepared, the next step is training the model. Training involves feeding data into the model and adjusting its parameters (weights and biases) to minimize the error between the predicted and actual outputs.
In this example, we will train a simple linear regression model using TensorFlow.
Steps to Train a Model
1. Prepare Training Data
Before training, ensure the dataset is divided into training and testing subsets. Use only the training data for this step.
from sklearn.model_selection import train_test_split
# Split the dataset
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Convert to TensorFlow tensors
import tensorflow as tf
X_train_tf = tf.convert_to_tensor(X_train, dtype=tf.float32)
y_train_tf = tf.convert_to_tensor(y_train, dtype=tf.float32)
2. Define the Training Loop
The training loop involves iterating through epochs, where each epoch updates the model parameters based on the loss function. TensorFlow’s GradientTape
computes gradients for optimization.
# Define the training loop
def train_model(X_train, y_train, epochs=200):
for epoch in range(epochs):
with tf.GradientTape() as tape:
# Forward pass: calculate predictions
predictions = linear_model(X_train)
# Compute the loss
loss = loss_fn(y_train, predictions)
# Backward pass: compute gradients
gradients = tape.gradient(loss, [m, b])
# Update weights and biases
optimizer.apply_gradients(zip(gradients, [m, b]))
# Log progress every 20 epochs
if (epoch + 1) % 20 == 0:
print(f"Epoch {epoch + 1}: Loss = {loss.numpy():.4f}")
3. Train the Model
Start the training process with a specified number of epochs.
# Train the model
train_model(X_train_tf, y_train_tf, epochs=200)
Code Walkthrough
import numpy as np
import tensorflow as tf
from sklearn.model_selection import train_test_split
# Generate synthetic data
np.random.seed(42)
X = np.random.rand(100).astype(np.float32)
y = 2 * X + 1 + np.random.normal(0, 0.1, 100).astype(np.float32)
# Split the data
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Convert to TensorFlow tensors
X_train_tf = tf.convert_to_tensor(X_train, dtype=tf.float32)
y_train_tf = tf.convert_to_tensor(y_train, dtype=tf.float32)
# Define trainable variables
m = tf.Variable(0.0)
b = tf.Variable(0.0)
# Define the linear regression model
def linear_model(X):
return m * X + b
# Define the Mean Squared Error (MSE) loss function
def loss_fn(y_true, y_pred):
return tf.reduce_mean(tf.square(y_true - y_pred))
# Define the optimizer
optimizer = tf.optimizers.SGD(learning_rate=0.1)
# Training loop
def train_model(X_train, y_train, epochs=200):
for epoch in range(epochs):
with tf.GradientTape() as tape:
predictions = linear_model(X_train)
loss = loss_fn(y_train, predictions)
gradients = tape.gradient(loss, [m, b])
optimizer.apply_gradients(zip(gradients, [m, b]))
if (epoch + 1) % 20 == 0:
print(f"Epoch {epoch + 1}: Loss = {loss.numpy():.4f}")
# Train the model
train_model(X_train_tf, y_train_tf, epochs=200)
# Output trained parameters
print(f"Trained Slope (m): {m.numpy():.4f}")
print(f"Trained Intercept (b): {b.numpy():.4f}")
Expected Output
During training, the model outputs the loss value for every 20 epochs. After training, the final slope (mm) and intercept (bb) should closely approximate the true relationship in the data (y = 2X + 1):
Example Output:
Epoch 20: Loss = 0.0502
Epoch 40: Loss = 0.0256
...
Epoch 200: Loss = 0.0031
Trained Slope (m): 2.0048
Trained Intercept (b): 1.0025
Visualization of Training Results
To evaluate the training, visualize the model’s predictions against the training data:
import matplotlib.pyplot as plt
# Plot training data and the learned model
plt.scatter(X_train, y_train, label='Training Data', color='blue')
plt.plot(X_train, linear_model(X_train_tf).numpy(), label='Learned Model', color='red')
plt.xlabel('X')
plt.ylabel('y')
plt.title('Training Data vs Learned Model')
plt.legend()
plt.show()
Key Insights
- Convergence: Monitor the loss values to ensure they decrease steadily.
- Overfitting: Avoid overtraining by stopping training when loss reduction plateaus.
- Visualization: Compare the learned model with the actual data to validate training success.