A1Project's picture
Update app.py
2f6255f verified
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)