# Import required libraries import streamlit as st import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt import io from sklearn.datasets import make_classification, make_moons, make_circles, make_regression from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from keras.models import Sequential from keras.layers import InputLayer, Dense from keras.regularizers import L1, L2 from mlxtend.plotting import plot_decision_regions import warnings warnings.filterwarnings("ignore") from io import StringIO # Main Title st.title('Tensor Flow Playground') # Sidebar Title st.sidebar.title('Tensorflow Playground') # Problem Type problem_type = st.sidebar.selectbox('Problem Type', ['None', 'Classification', 'Regression', 'Moons', 'Circles']) # Choose Dataset st.sidebar.title('Choose Dataset') # Datasets data_set = st.sidebar.selectbox('Datasets', [ '1.ushape.csv', '2.concerticcir1.csv', '3.concertriccir2.csv', '4.linearsep.csv', '5.outlier.csv', '6.overlap.csv', '7.xor.csv', '8.twospirals.csv', '9.random.csv', 'None' ]) # Learning Rate learning_rate = st.sidebar.selectbox('Learning Rate', [0.00001, 0.0001, 0.001, 0.01, 0.03, 0.1, 0.3, 1, 3, 10]) # Activation Function activation_func = st.sidebar.selectbox('Activation', ['tanh', 'Sigmoid', 'linear', 'relu', 'softmax']) # Regularization Rate regularization_rate = st.sidebar.selectbox('Regularization Rate', [0.00001, 0.0001, 0.001, 0.01, 0.03, 0.1, 0.3, 1, 3, 10]) # Regularization Type regularization = st.sidebar.selectbox('Regularization', ['None', 'L1', 'L2']) # Epochs epochs = st.sidebar.select_slider("Select number of Epochs", options=[i for i in range(1, 1001)]) # Test Size test_size = st.sidebar.slider("Test Size (%)", min_value=10, max_value=90, value=25, step=1) / 100 # Hidden Layers hidden_layers = st.sidebar.select_slider('Hidden Layers', options=[i for i in range(1, 51)]) # Neurons in Each Layer neurons_per_layer = [] for i in range(1, hidden_layers + 1): n = st.sidebar.text_input(f'No of Neurons in Layer {i}', '2') try: neurons_per_layer.append(int(n)) except ValueError: st.error(f"Invalid input for the number of neurons in Layer {i}. Please enter an integer.") # Batch Size if data_set != 'None': try: # Read the CSV file using the provided file name df = pd.read_csv(data_set) except FileNotFoundError: st.error(f"File '{data_set}' not found. Please check the file name and try again.") except Exception as e: st.error(f"An error occurred: {e}") X = df.iloc[:, :2].values y = df.iloc[:, -1].values batch_size = st.sidebar.select_slider("Batch Size", options=[i for i in range(1, X.shape[0] + 1)]) else: batch_size = st.sidebar.select_slider("Batch Size", options=[i for i in range(1, 10001)]) # Regularization configuration kernel_regularizer = None bias_regularizer = None if regularization == 'L1': kernel_regularizer = L1(regularization_rate) bias_regularizer = L1(regularization_rate) elif regularization == 'L2': kernel_regularizer = L2(regularization_rate) bias_regularizer = L2(regularization_rate) # Initialize session state if 'model' not in st.session_state: st.session_state.model = None if 'history' not in st.session_state: st.session_state.history = None if 'X_train' not in st.session_state: st.session_state.X_train = None if 'y_train' not in st.session_state: st.session_state.y_train = None if 'X_test' not in st.session_state: st.session_state.X_test = None if 'y_test' not in st.session_state: st.session_state.y_test = None if st.sidebar.button('Submit'): if data_set != "None": try: # Read the CSV file using the provided file name df = pd.read_csv(data_set) except FileNotFoundError: st.error(f"File '{data_set}' not found. Please check the file name and try again.") except Exception as e: st.error(f"An error occurred: {e}") X = df.iloc[:, :2].values y = df.iloc[:, -1].values problem_type = 'Classification' # Treat as classification if dataset is chosen elif problem_type in ['Classification', 'Moons', 'Circles']: if problem_type == 'Classification': X, y = make_classification(n_samples=10000, n_features=2, n_informative=2, n_redundant=0, n_repeated=0, n_classes=2, class_sep=2.5, random_state=10) elif problem_type == 'Moons': X, y = make_moons(n_samples=10000, noise=0.1, random_state=20) elif problem_type == 'Circles': X, y = make_circles(n_samples=10000, noise=0.05, random_state=20) elif problem_type == 'Regression': X, y = make_regression(n_samples=10000, n_features=2, n_informative=2, n_targets=1, noise=0.05, random_state=20) else: st.write("Please select a valid dataset or problem type.") st.stop() # Data visualization st.subheader("Visualization of Data Points with Class Labels") fig, ax = plt.subplots(figsize=(10, 6)) if problem_type in ['Classification', 'Moons', 'Circles']: sns.scatterplot(x=X[:, 0], y=X[:, 1], hue=y, ax=ax) ax.set_xlabel('Feature 1') ax.set_ylabel('Feature 2') else: sns.scatterplot(x=X[:, 0], y=X[:, 1], ax=ax) ax.set_xlabel('Feature 1') ax.set_ylabel('Feature 2') st.pyplot(fig) # Split train/test X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size, random_state=20, stratify=y if problem_type != 'Regression' else None) # Standardize scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) # Save model and training data in session state st.session_state.X_train = X_train st.session_state.y_train = y_train st.session_state.X_test = X_test st.session_state.y_test = y_test # Build the model model = Sequential() model.add(InputLayer(input_shape=(2,))) for neurons in neurons_per_layer: model.add(Dense(units=neurons, activation=activation_func, use_bias=True, kernel_regularizer=kernel_regularizer, bias_regularizer=bias_regularizer)) # Final layer configuration based on problem type if problem_type == 'Regression': model.add(Dense(units=1, activation='linear', use_bias=True)) loss_function = 'mse' metrics = ['mse', 'mae'] else: model.add(Dense(units=1, activation='sigmoid', use_bias=True)) loss_function = 'binary_crossentropy' metrics = ['accuracy'] # Compile the model model.compile(optimizer='sgd', loss=loss_function, metrics=metrics) # Display model summary st.subheader("Model Summary") summary_str = StringIO() model.summary(print_fn=lambda x: summary_str.write(x + '\n')) st.text(summary_str.getvalue()) # Training the model history = model.fit(X_train, y_train, epochs=epochs, batch_size=batch_size, verbose=1, validation_split=0.2) # Save history in session state st.session_state.history = history # Plot loss and validation loss fig, ax = plt.subplots(figsize=(10, 6)) ax.plot(range(1, epochs + 1), history.history['loss'], label='Train loss') ax.plot(range(1, epochs + 1), history.history['val_loss'], label='Val loss') ax.set_title("Training and Validation Loss Analysis") ax.set_xlabel('Epochs') ax.set_ylabel('Loss') ax.legend() st.pyplot(fig) if problem_type != 'Regression': # Plot accuracy and validation accuracy fig, ax = plt.subplots(figsize=(10, 6)) ax.plot(range(1, epochs + 1), history.history['accuracy'], label='Train Accuracy') ax.plot(range(1, epochs + 1), history.history['val_accuracy'], label='Val Accuracy') ax.set_title('Training and Validation Accuracy Analysis') ax.set_xlabel('Epochs') ax.set_ylabel('Accuracy') ax.legend() st.pyplot(fig) # Plot decision surface st.subheader('Decision Boundary on Training Data') fig, ax = plt.subplots(figsize=(10, 6)) plot_decision_regions(X=st.session_state.X_train, y=st.session_state.y_train.astype(int), clf=model) st.pyplot(fig) st.subheader('Decision Boundary on Test Data') fig, ax = plt.subplots(figsize=(10, 6)) plot_decision_regions(X=st.session_state.X_test, y=st.session_state.y_test.astype(int), clf=model) st.pyplot(fig) elif problem_type == 'Regression': # Plot accuracy and validation accuracy fig, ax = plt.subplots(figsize=(10, 6)) ax.plot(range(1, epochs + 1), history.history['mae'], label='Train mae') ax.plot(range(1, epochs + 1), history.history['val_mae'], label='Val mae') ax.set_title('Training and Validation MAE Analysis') ax.set_xlabel('Epochs') ax.set_ylabel('MAE') ax.legend() st.pyplot(fig)