Spaces:
Sleeping
Sleeping
import numpy as np | |
import pandas as pd | |
import tensorflow as tf | |
from tensorflow import keras | |
from tensorflow.keras.models import Sequential | |
from tensorflow.keras.layers import Dense, Dropout, Input | |
from tensorflow.keras.regularizers import l2 | |
from tensorflow.keras.callbacks import EarlyStopping | |
from sklearn.model_selection import train_test_split | |
from sklearn.preprocessing import StandardScaler | |
import gradio as gr | |
# Updated dataset with 56-day strength values (Including 0.48 w/c ratio) | |
w_c_ratio = [0.36, 0.40, 0.44, 0.48, 0.52] * 6 | |
curing_days = [7] * 10 + [28] * 10 + [56] * 10 | |
fly_ash_content = [22] * 5 + [33] * 5 + [22] * 5 + [33] * 5 + [22] * 5 + [33] * 5 | |
compressive_strength = [ | |
22.82, 20.17, 17.46, 18.37, 12.79, # 7 days, 22% fly ash | |
18.68, 16.78, 15.15, 12.84, 10.20, # 7 days, 33% fly ash | |
30.36, 28.78, 27.01, 26.24, 22.50, # 28 days, 22% fly ash | |
29.19, 26.67, 24.62, 19.79, 15.47, # 28 days, 33% fly ash | |
32.68, 30.31, 28.51, 27.41, 24.07, # 56 days, 22% fly ash | |
32.13, 29.33, 27.20, 21.37, 16.58 # 56 days, 33% fly ash | |
] | |
data = { | |
"w/c_ratio": w_c_ratio, | |
"inverse_wc_ratio": [1/x for x in w_c_ratio], | |
"wc_ratio_squared": [x**2 for x in w_c_ratio], # New feature | |
"log_curing_days": [np.log(x) for x in curing_days], # New feature | |
"curing_days": curing_days, | |
"fly_ash_content": fly_ash_content, | |
"compressive_strength": compressive_strength | |
} | |
df = pd.DataFrame(data) | |
# Define input (X) and output (y) | |
X = df[['w/c_ratio', 'inverse_wc_ratio', 'wc_ratio_squared', 'log_curing_days', 'curing_days', 'fly_ash_content']] | |
y = df['compressive_strength'] | |
# Standardize input features | |
scaler = StandardScaler() | |
X_scaled = scaler.fit_transform(X) | |
y_mean = y.mean() | |
y_std = y.std() | |
y_scaled = (y - y_mean) / y_std # Scale target variable | |
# Split data into training and testing sets | |
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y_scaled, test_size=0.2, random_state=42) | |
# Define optimized ANN model | |
model = Sequential([ | |
Input(shape=(X_train.shape[1],)), | |
Dense(256, activation=tf.keras.activations.swish, kernel_regularizer=l2(0.003)), | |
Dropout(0.05), | |
Dense(128, activation=tf.keras.activations.swish, kernel_regularizer=l2(0.005)), | |
Dropout(0.1), | |
Dense(64, activation=tf.keras.activations.swish, kernel_regularizer=l2(0.005)), | |
Dense(32, activation=tf.keras.activations.swish, kernel_regularizer=l2(0.005)), | |
Dense(16, activation=tf.keras.activations.swish, kernel_regularizer=l2(0.005)), | |
Dense(1, activation='linear') | |
]) | |
# Compile the model | |
model.compile(optimizer=keras.optimizers.Adam(learning_rate=0.0002), | |
loss='mse', # Using MSE for better regression learning | |
metrics=['mae']) | |
# Train the model with early stopping | |
early_stopping = EarlyStopping(monitor='val_loss', patience=50, restore_best_weights=True) | |
model.fit(X_train, y_train, epochs=5000, batch_size=32, validation_data=(X_test, y_test), verbose=0, callbacks=[early_stopping]) | |
# Save and reload model using new Keras format | |
model.save("ann_model.keras") | |
model = keras.models.load_model("ann_model.keras") | |
# Function for prediction | |
def predict_strength(wc_ratio, curing_days, fly_ash): | |
input_data = np.array([[wc_ratio, 1/wc_ratio, wc_ratio**2, np.log(curing_days), curing_days, fly_ash]]) | |
input_scaled = scaler.transform(input_data) | |
prediction_scaled = model.predict(input_scaled)[0][0] | |
prediction = (prediction_scaled * y_std) + y_mean # Inverse scaling | |
# Generate strength trend graph up to 56 days | |
curing_days_range = np.linspace(7, 56, 10) | |
predicted_values = [model.predict(scaler.transform([[wc_ratio, 1/wc_ratio, wc_ratio**2, np.log(d), d, fly_ash]]))[0][0] for d in curing_days_range] | |
predicted_values = [(p * y_std) + y_mean for p in predicted_values] # Inverse scaling | |
import matplotlib.pyplot as plt | |
plt.figure(figsize=(7, 5)) | |
plt.plot(curing_days_range, predicted_values, marker='o', linestyle='-', color='blue', label="Predicted Compressive Strength") | |
plt.xlabel("Curing Period (Days)") | |
plt.ylabel("Predicted Compressive Strength (MPa)") | |
plt.title("Strength Prediction Trend") | |
plt.grid(True, linestyle="--", alpha=0.7) | |
plt.legend() | |
plt.savefig("prediction_plot.png") | |
plt.close() | |
return prediction, "prediction_plot.png" | |
# Gradio UI | |
demo = gr.Blocks() | |
with demo: | |
gr.Markdown("# Compressive Strength Predictor") | |
with gr.Row(): | |
wc_input = gr.Number(label="Enter w/c ratio") | |
days_input = gr.Number(label="Enter curing days") | |
fly_ash_dropdown = gr.Dropdown([22, 33], label="Fly Ash % in PPC", value=22) | |
predict_button = gr.Button("Predict") | |
output_strength = gr.Number(label="Predicted Compressive Strength (MPa)") | |
output_graph = gr.Image() | |
predict_button.click(predict_strength, inputs=[wc_input, days_input, fly_ash_dropdown], outputs=[output_strength, output_graph]) | |
demo.launch(share=True) | |