Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import tensorflow as tf | |
| import numpy as np | |
| import matplotlib.pyplot as plt | |
| from sklearn.datasets import make_moons, make_circles, make_blobs | |
| from sklearn.model_selection import train_test_split | |
| from sklearn.preprocessing import StandardScaler | |
| from tensorflow.keras import models, layers, optimizers | |
| # --- Dataset Generator --- | |
| def get_dataset(name, n_samples=1000, noise=0.2): | |
| if name == "Moons": | |
| return make_moons(n_samples=n_samples, noise=noise) | |
| elif name == "Circles": | |
| return make_circles(n_samples=n_samples, noise=noise) | |
| else: | |
| return make_blobs(n_samples=n_samples, centers=2, cluster_std=1.5, random_state=42) | |
| # --- Model Builder --- | |
| def build_model(activation, lr, num_layers, num_neurons): | |
| model = models.Sequential([layers.Input(shape=(2,))]) | |
| for _ in range(num_layers): | |
| model.add(layers.Dense(num_neurons, activation=activation)) | |
| model.add(layers.Dense(1, activation='sigmoid')) | |
| model.compile(optimizer=optimizers.Adam(learning_rate=lr), | |
| loss='binary_crossentropy', metrics=['accuracy']) | |
| return model | |
| # --- Decision Boundary Plotter --- | |
| def visualize_decision_boundary(model, X, y): | |
| x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 | |
| y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1 | |
| xx, yy = np.meshgrid(np.linspace(x_min, x_max, 300), | |
| np.linspace(y_min, y_max, 300)) | |
| grid = np.c_[xx.ravel(), yy.ravel()] | |
| preds = model.predict(grid, verbose=0).reshape(xx.shape) | |
| fig, ax = plt.subplots(figsize=(7, 6)) | |
| ax.contourf(xx, yy, preds, cmap='RdBu', alpha=0.6) | |
| ax.scatter(X[:, 0], X[:, 1], c=y, cmap='RdBu', edgecolors='k', s=25) | |
| ax.set(title="Decision Boundary", xlabel="Feature 1", ylabel="Feature 2") | |
| return fig | |
| # --- Loss Plotter --- | |
| def plot_loss(history): | |
| fig, ax = plt.subplots(figsize=(7, 5)) | |
| ax.plot(history.history['loss'], label='Train Loss') | |
| ax.plot(history.history['val_loss'], label='Test Loss') | |
| ax.set(title="Training vs Testing Loss", xlabel="Epoch", ylabel="Loss") | |
| ax.legend() | |
| ax.grid(True, linestyle='--', alpha=0.7) | |
| return fig | |
| # --- Streamlit UI --- | |
| st.set_page_config(page_title="TensorFlow Playground", layout="centered") | |
| st.title(" TensorFlow Playground") | |
| st.write("Explore how hyperparameters affect decision boundaries in neural networks.") | |
| # --- Sidebar Controls --- | |
| st.sidebar.header("🔧 Hyperparameters") | |
| dataset = st.sidebar.selectbox("Select Dataset", ["Moons", "Circles", "Blobs"]) | |
| noise = st.sidebar.slider("Dataset Noise", 0.0, 1.0, 0.2, 0.01) | |
| activation = st.sidebar.selectbox("Activation Function", ["relu", "sigmoid", "tanh"]) | |
| lr = st.sidebar.slider("Learning Rate", 0.001, 0.1, 0.01, 0.001) | |
| split = st.sidebar.slider("Train-Test Split", 0.1, 0.9, 0.7, 0.05) | |
| batch = st.sidebar.select_slider("Batch Size", options=list(range(8, 129, 8)), value=32) | |
| epochs = st.sidebar.slider("Epochs", 10, 300, 100, 10) | |
| num_neurons = st.sidebar.slider("Neurons/Layer", 1, 100, 10) | |
| num_layers = st.sidebar.slider("Hidden Layers", 1, 5, 2) | |
| # --- Train Button --- | |
| if st.button(" Train Model"): | |
| with st.spinner("Training the model..."): | |
| X, y = get_dataset(dataset, noise=noise) | |
| X = StandardScaler().fit_transform(X) | |
| X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=split, random_state=42) | |
| model = build_model(activation, lr, num_layers, num_neurons) | |
| history = model.fit(X_train, y_train, validation_data=(X_test, y_test), | |
| batch_size=batch, epochs=epochs, verbose=0) | |
| test_loss, test_acc = model.evaluate(X_test, y_test, verbose=0) | |
| st.success(f"✅ Trained Successfully! Test Accuracy: {test_acc:.2f}") | |
| st.subheader(" Decision Boundary") | |
| st.pyplot(visualize_decision_boundary(model, X, y)) | |
| st.subheader(" Loss Over Epochs") | |
| st.pyplot(plot_loss(history)) |