{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":3004,"databundleVersionId":861823,"sourceType":"competition"}],"dockerImageVersionId":30732,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# ⭐Ahmed Gaitani Code ✨","metadata":{}},{"cell_type":"markdown","source":"# ⭐PyTorch ***Vs*** ⭐TansorFlow","metadata":{}},{"cell_type":"markdown","source":"# 1: Imports","metadata":{}},{"cell_type":"code","source":"# Imports for TensorFlow and Keras\nimport tensorflow as tf\nfrom tensorflow.keras import layers, models\nfrom tensorflow.keras.utils import to_categorical\n\n# Imports for PyTorch\nimport torch\nimport torch.nn as nn\nimport torch.optim as optim\nimport torchvision.transforms as transforms\nfrom torch.utils.data import DataLoader, Dataset\nimport pandas as pd\nimport numpy as np\nfrom sklearn.model_selection import train_test_split","metadata":{"execution":{"iopub.status.busy":"2024-10-31T22:57:09.566772Z","iopub.execute_input":"2024-10-31T22:57:09.567158Z","iopub.status.idle":"2024-10-31T22:57:28.173701Z","shell.execute_reply.started":"2024-10-31T22:57:09.567125Z","shell.execute_reply":"2024-10-31T22:57:28.172735Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 2: Load and Preprocess the Data","metadata":{}},{"cell_type":"code","source":"# Load data for both TensorFlow and PyTorch\ntrain_data = pd.read_csv('/kaggle/input/digit-recognizer/train.csv')\ntest_data = pd.read_csv('/kaggle/input/digit-recognizer/test.csv')\n\n# Split data into features and labels\nx = train_data.iloc[:, 1:].values\ny = train_data.iloc[:, 0].values\n\n# Normalize pixel values\nx_tf = x / 255.0\nx_pt = x / 255.0\n\n# Reshape data for TensorFlow\nx_tf = x_tf.reshape(-1, 28, 28, 1)\n\n# Reshape data for PyTorch\nx_pt = x_pt.reshape(-1, 28, 28)\n\n# Convert labels to one-hot encoding for TensorFlow\ny_tf = to_categorical(y)\n\n# Split data into training and validation sets\nx_train_tf, x_val_tf, y_train_tf, y_val_tf = train_test_split(x_tf, y_tf, test_size=0.1, random_state=42)\n\n# Create PyTorch datasets and dataloaders\nclass DigitDataset(Dataset):\n    def __init__(self, data, labels=None, transform=None):\n        self.data = data\n        self.labels = labels\n        self.transform = transform\n\n    def __len__(self):\n        return len(self.data)\n\n    def __getitem__(self, idx):\n        img = self.data[idx].reshape(28, 28, 1).astype('float32')\n        if self.transform:\n            img = self.transform(img)\n        if self.labels is not None:\n            return img, self.labels[idx]\n        else:\n            return img\n\n# Define transformations\ntransform = transforms.ToTensor()\n\n# Create datasets and dataloaders for PyTorch\ntrain_dataset_pt = DigitDataset(x_pt, y, transform=transform)\ntrain_loader_pt = DataLoader(train_dataset_pt, batch_size=64, shuffle=True)\n\n# Create test dataset and dataloader for PyTorch\ntest_dataset_pt = DigitDataset(test_data.values, transform=transform)\ntest_loader_pt = DataLoader(test_dataset_pt, batch_size=64, shuffle=False)","metadata":{"execution":{"iopub.status.busy":"2024-10-31T22:57:28.175874Z","iopub.execute_input":"2024-10-31T22:57:28.176701Z","iopub.status.idle":"2024-10-31T22:57:34.717790Z","shell.execute_reply.started":"2024-10-31T22:57:28.176664Z","shell.execute_reply":"2024-10-31T22:57:34.716896Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 3: Define Models","metadata":{}},{"cell_type":"markdown","source":"**TensorFlow Model**","metadata":{}},{"cell_type":"code","source":"def create_tf_model():\n    model = models.Sequential([\n        layers.Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1)),\n        layers.MaxPooling2D(pool_size=(2, 2)),\n        layers.Conv2D(64, kernel_size=(3, 3), activation='relu'),\n        layers.MaxPooling2D(pool_size=(2, 2)),\n        layers.Conv2D(128, kernel_size=(3, 3), activation='relu'),\n        layers.MaxPooling2D(pool_size=(2, 2)),\n        layers.Flatten(),\n        layers.Dense(128, activation='relu'),\n        layers.Dropout(0.2),\n        layers.Dense(10, activation='softmax')\n    ])\n    return model\n\n# Create TensorFlow model\nmodel_tf = create_tf_model()","metadata":{"execution":{"iopub.status.busy":"2024-10-31T23:00:44.347209Z","iopub.execute_input":"2024-10-31T23:00:44.347643Z","iopub.status.idle":"2024-10-31T23:00:44.406311Z","shell.execute_reply.started":"2024-10-31T23:00:44.347609Z","shell.execute_reply":"2024-10-31T23:00:44.405466Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**PyTorch Model**","metadata":{}},{"cell_type":"code","source":"\nclass DigitModel(nn.Module):\n    def __init__(self):\n        super(DigitModel, self).__init__()\n        self.model = nn.Sequential(\n            nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1),\n            nn.ReLU(),\n            nn.MaxPool2d(kernel_size=2, stride=2),\n            nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1),\n            nn.ReLU(),\n            nn.MaxPool2d(kernel_size=2, stride=2),\n            nn.Flatten(),\n            nn.Linear(64 * 7 * 7, 128),\n            nn.ReLU(),\n            nn.Dropout(0.2),\n            nn.Linear(128, 10)\n        )\n\n    def forward(self, x):\n        return self.model(x)\n\n# Create PyTorch model instance\nmodel_pt = DigitModel()","metadata":{"execution":{"iopub.status.busy":"2024-10-31T23:04:07.375556Z","iopub.execute_input":"2024-10-31T23:04:07.376470Z","iopub.status.idle":"2024-10-31T23:04:07.389691Z","shell.execute_reply.started":"2024-10-31T23:04:07.376433Z","shell.execute_reply":"2024-10-31T23:04:07.388623Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 4: Compile and Train Models","metadata":{}},{"cell_type":"markdown","source":"**TensorFlow Model**","metadata":{}},{"cell_type":"code","source":"# Compile TensorFlow model\nmodel_tf.compile(optimizer='adam',\n                 loss='categorical_crossentropy',\n                 metrics=['accuracy'])\n\n# Train TensorFlow model\nhistory_tf = model_tf.fit(x_train_tf, y_train_tf, epochs=15, validation_data=(x_val_tf, y_val_tf))","metadata":{"execution":{"iopub.status.busy":"2024-10-31T23:00:53.376646Z","iopub.execute_input":"2024-10-31T23:00:53.377081Z","iopub.status.idle":"2024-10-31T23:01:47.363442Z","shell.execute_reply.started":"2024-10-31T23:00:53.377050Z","shell.execute_reply":"2024-10-31T23:01:47.362391Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**PyTorch Model**","metadata":{}},{"cell_type":"code","source":"# Check for GPU availability\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\nmodel_pt.to(device)\n\n# Define loss function and optimizer for PyTorch\ncriterion_pt = nn.CrossEntropyLoss()\noptimizer_pt = optim.Adam(model_pt.parameters(), lr=0.001)\n\n# Training loop for PyTorch model\nnum_epochs = 10\nfor epoch in range(num_epochs):\n    model_pt.train()\n    running_loss = 0.0\n    for imgs, labels in train_loader_pt:\n        imgs, labels = imgs.to(device), labels.to(device)\n        optimizer_pt.zero_grad()\n        outputs = model_pt(imgs)\n        loss = criterion_pt(outputs, labels)\n        loss.backward()\n        optimizer_pt.step()\n        running_loss += loss.item()\n    \n    print(f'Epoch [{epoch + 1}/{num_epochs}], Loss: {running_loss / len(train_loader_pt):.4f}')\n    ","metadata":{"execution":{"iopub.status.busy":"2024-10-31T23:04:11.844334Z","iopub.execute_input":"2024-10-31T23:04:11.844769Z","iopub.status.idle":"2024-10-31T23:04:40.479542Z","shell.execute_reply.started":"2024-10-31T23:04:11.844739Z","shell.execute_reply":"2024-10-31T23:04:40.478543Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 5: Evaluate and Predict","metadata":{}},{"cell_type":"markdown","source":"**TensorFlow model**","metadata":{}},{"cell_type":"code","source":"# Evaluate TensorFlow model on validation data\nval_loss_tf, val_acc_tf = model_tf.evaluate(x_val_tf, y_val_tf)\nprint(f'TensorFlow Validation Loss: {val_loss_tf}, Validation Accuracy: {val_acc_tf}')\n\n# Make predictions on test data using TensorFlow model\npredictions_tf = model_tf.predict(test_data.values.reshape(-1, 28, 28, 1) / 255.0)\npredicted_labels_tf = np.argmax(predictions_tf, axis=1)\n\n# Print TensorFlow predictions\nprint(\"TensorFlow Predictions:\")\nprint(predicted_labels_tf)","metadata":{"execution":{"iopub.status.busy":"2024-10-31T23:02:04.079349Z","iopub.execute_input":"2024-10-31T23:02:04.080056Z","iopub.status.idle":"2024-10-31T23:02:06.821275Z","shell.execute_reply.started":"2024-10-31T23:02:04.080022Z","shell.execute_reply":"2024-10-31T23:02:06.820209Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**PyTorch Model**","metadata":{}},{"cell_type":"code","source":"# Evaluation on validation data for PyTorch model\nmodel_pt.eval()\ncorrect = 0\ntotal = 0\nwith torch.no_grad():\n    for imgs, labels in train_loader_pt:\n        imgs, labels = imgs.to(device), labels.to(device)\n        outputs = model_pt(imgs)\n        _, predicted = torch.max(outputs.data, 1)\n        total += labels.size(0)\n        correct += (predicted == labels).sum().item()\n\nprint(f'PyTorch Model Accuracy on Training Data: {100 * correct / total:.2f}%')\n\n\n# Make predictions on test data using PyTorch model\nmodel_pt.eval()\npredictions_pt = []\nwith torch.no_grad():\n    for imgs in test_loader_pt:  # Use test_loader_pt here\n        imgs = imgs.to(device)\n        outputs = model_pt(imgs)\n        _, predicted = torch.max(outputs, 1)\n        predictions_pt.extend(predicted.cpu().numpy())\n\n# Ensure predictions_pt has 28000 rows\nassert len(predictions_pt) == 28000, \"Number of predictions should be 28000\"\n","metadata":{"execution":{"iopub.status.busy":"2024-07-12T19:59:05.315521Z","iopub.execute_input":"2024-07-12T19:59:05.315917Z","iopub.status.idle":"2024-07-12T19:59:26.390103Z","shell.execute_reply.started":"2024-07-12T19:59:05.315888Z","shell.execute_reply":"2024-07-12T19:59:26.389066Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 6: Prepare Submission","metadata":{}},{"cell_type":"markdown","source":"**TensorFlow model**","metadata":{}},{"cell_type":"code","source":"# Prepare submission for TensorFlow model\nsubmission_tf = pd.DataFrame({'ImageId': list(range(1, len(predicted_labels_tf) + 1)),\n                              'Label': predicted_labels_tf})\nsubmission_tf.to_csv('submission_tf.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2024-07-12T20:02:22.330182Z","iopub.execute_input":"2024-07-12T20:02:22.330644Z","iopub.status.idle":"2024-07-12T20:02:22.392562Z","shell.execute_reply.started":"2024-07-12T20:02:22.330607Z","shell.execute_reply":"2024-07-12T20:02:22.391472Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**PyTorch model**","metadata":{}},{"cell_type":"code","source":"# Prepare submission for PyTorch model\nsubmission_pt = pd.DataFrame({'ImageId': list(range(1, len(predictions_pt) + 1)),\n                              'Label': predictions_pt})\nsubmission_pt.to_csv('submission_pt.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2024-07-12T20:02:24.539976Z","iopub.execute_input":"2024-07-12T20:02:24.540412Z","iopub.status.idle":"2024-07-12T20:02:24.705286Z","shell.execute_reply.started":"2024-07-12T20:02:24.540360Z","shell.execute_reply":"2024-07-12T20:02:24.704086Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Assuming your model is trained and named 'model'\nmodel_tf.save('digit_recognizer_model.h5')  # This saves it as an HDF5 file\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-10-31T23:02:17.679845Z","iopub.execute_input":"2024-10-31T23:02:17.680219Z","iopub.status.idle":"2024-10-31T23:02:17.732793Z","shell.execute_reply.started":"2024-10-31T23:02:17.680190Z","shell.execute_reply":"2024-10-31T23:02:17.731546Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}