{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Iris Classification with TensorFlow (Python)\\n",
"This notebook trains a neural network on the Iris dataset using only `iris.json`, splits it into training/testing sets, and plots training/validation accuracy and loss."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"!pip install pandas numpy tensorflow scikit-learn matplotlib"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import json\\n",
"import numpy as np\\n",
"import tensorflow as tf\\n",
"from tensorflow.keras.models import Sequential\\n",
"from tensorflow.keras.layers import Dense\\n",
"from sklearn.preprocessing import LabelBinarizer\\n",
"from sklearn.model_selection import train_test_split\\n",
"import matplotlib.pyplot as plt\\n",
"\\n",
"# Upload iris.json\\n",
"from google.colab import files\\n",
"uploaded = files.upload() # Upload iris.json"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Load the JSON file\\n",
"iris_data = json.load(open('iris.json'))\\n",
"\\n",
"# Convert to numpy arrays\\n",
"X = np.array([[item['sepal_length'], item['sepal_width'], item['petal_length'], item['petal_width']] for item in iris_data])\\n",
"y_raw = [item['species'] for item in iris_data]\\n",
"\\n",
"# One-hot encode the labels\\n",
"encoder = LabelBinarizer()\\n",
"y = encoder.fit_transform(y_raw)\\n",
"\\n",
"# Split into training and testing sets (80/20)\\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Build the neural network\\n",
"model = Sequential([\\n",
" Dense(5, input_shape=(4,), activation='sigmoid'),\\n",
" Dense(3, activation='sigmoid'),\\n",
" Dense(3, activation='sigmoid')\\n",
"])\\n",
"\\n",
"# Compile the model using categorical_crossentropy for classification\\n",
"model.compile(\\n",
" optimizer=tf.keras.optimizers.Adam(learning_rate=0.06),\\n",
" loss='categorical_crossentropy',\\n",
" metrics=['accuracy']\\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Train the model\\n",
"history = model.fit(\\n",
" X_train, y_train,\\n",
" epochs=100,\\n",
" verbose=1,\\n",
" validation_data=(X_test, y_test)\\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Plot training & validation accuracy and loss\\n",
"plt.figure(figsize=(12,5))\\n",
"\\n",
"plt.subplot(1,2,1)\\n",
"plt.plot(history.history['accuracy'], label='Train Accuracy')\\n",
"plt.plot(history.history['val_accuracy'], label='Validation Accuracy')\\n",
"plt.title('Model Accuracy')\\n",
"plt.xlabel('Epoch')\\n",
"plt.ylabel('Accuracy')\\n",
"plt.legend()\\n",
"\\n",
"plt.subplot(1,2,2)\\n",
"plt.plot(history.history['loss'], label='Train Loss')\\n",
"plt.plot(history.history['val_loss'], label='Validation Loss')\\n",
"plt.title('Model Loss')\\n",
"plt.xlabel('Epoch')\\n",
"plt.ylabel('Loss')\\n",
"plt.legend()\\n",
"\\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Evaluate / Predict on testing set\\n",
"predictions = model.predict(X_test)\\n",
"\\n",
"print(\\"Predictions (probabilities):\\")\\n",
"print(predictions)\\n",
"\\n",
"# Convert predictions to labels\\n",
"predicted_labels = encoder.inverse_transform(np.round(predictions))\\n",
"print(\\"Predicted species:\\")\\n",
"print(predicted_labels)\\n",
"\\n",
"# Compare with actual labels\\n",
"actual_labels = encoder.inverse_transform(y_test)\\n",
"print(\\"Actual species:\\")\\n",
"print(actual_labels)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"name": "python",
"version": "3.10"
}
},
"nbformat": 4,
"nbformat_minor": 5
}