{"metadata":{"kernelspec":{"display_name":"Python 3 (ipykernel)","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.12.4"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":3362,"databundleVersionId":31148,"sourceType":"competition"}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"id":"a00adcc3-b0ec-4fc8-9d12-a98aed55ddbd","cell_type":"code","source":"import zipfile\nimport os\n\n# مسار ملف ZIP\nzip_path = 'dogs-vs-cats/train.zip'\nextract_to = 'dogs-vs-cats/train'\n\n# فك الضغط\nwith zipfile.ZipFile(zip_path, 'r') as zip_ref:\n    zip_ref.extractall(extract_to)\n\nprint(\"extract is suc\")\n","metadata":{},"outputs":[],"execution_count":null},{"id":"eb004c04-6b39-4d1d-9f17-1a1c39c9e705","cell_type":"code","source":"","metadata":{},"outputs":[],"execution_count":null},{"id":"3e28f26f-5ddf-4844-a9eb-f227eb4e7e49","cell_type":"code","source":"train_dir=\"dogs-vs-cats/train/\"\nvalidation_dir=\"dogs-vs-cats/test1/\"","metadata":{},"outputs":[],"execution_count":null},{"id":"13769426-1620-4573-818c-e742a30da6c5","cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator\n\n# إعداد مولد البيانات للتدريب مع التحويلات\ntrain_datagen = ImageDataGenerator(\n    rescale=1.0/255.0,         # إعادة قياس القيم إلى [0, 1]\n    rotation_range=20,         # تدوير الصور عشوائيًا\n    width_shift_range=0.2,     # تحريك الصور أفقيًا\n    height_shift_range=0.2,    # تحريك الصور رأسيًا\n    shear_range=0.2,           # قص الصور\n    zoom_range=0.2,            # تكبير/تصغير الصور\n    horizontal_flip=True,      # عكس الصور أفقيًا\n    fill_mode='nearest'        # ملء المساحات الفارغة بعد التحويل\n)\n\n# إعداد مولد البيانات للتحقق\nvalidation_datagen = ImageDataGenerator(\n    rescale=1.0/255.0  # إعادة قياس القيم إلى [0, 1]\n)\n\n# إعداد بيانات التدريب\ntrain_generator = train_datagen.flow_from_directory(\n    train_dir,              # مسار بيانات التدريب\n    target_size=(150, 150),    # تغيير حجم الصور (الطول والعرض)\n    batch_size=20,             # حجم الدفعة\n    class_mode='binary'   # وضع التصنيف (للفئات المتعددة)\n)\n\n# إعداد بيانات التحقق\nvalidation_generator = validation_datagen.flow_from_directory(\n    validation_dir,         # مسار بيانات التحقق\n    target_size=(150, 150),    # تغيير حجم الصور (الطول والعرض)\n    batch_size=20,             # حجم الدفعة\n    class_mode='binary'   # وضع التصنيف (للفئات المتعددة)\n)\n","metadata":{},"outputs":[],"execution_count":null},{"id":"682f0e35-448a-4e47-afb3-323ec2ae3797","cell_type":"code","source":"from tensorflow.keras import layers, models\n\n# إنشاء نموذج بسيط\nmodel = models.Sequential([\n    layers.Conv2D(32, (3, 3), activation='relu', input_shape=(150, 150, 3)),\n    layers.MaxPooling2D((2, 2)),\n    layers.Conv2D(64, (3, 3), activation='relu'),\n    layers.MaxPooling2D((2, 2)),\n    layers.Conv2D(128, (3, 3), activation='relu'),\n    layers.MaxPooling2D((2, 2)),\n    layers.Conv2D(128, (3, 3), activation='relu'),\n    layers.MaxPooling2D((2, 2)),\n    layers.Flatten(),\n    layers.Dense(512, activation='relu'),\n    layers.Dense(1, activation='sigmoid')  # لأنك تستخدم `binary` كتصنيف\n])\n\n# تجميع النموذج\nmodel.compile(\n    optimizer='adam',\n    loss='binary_crossentropy',\n    metrics=['accuracy']\n)","metadata":{},"outputs":[],"execution_count":null},{"id":"9f58601d-b894-4665-805a-c901d3ba65c5","cell_type":"code","source":"model.summary()","metadata":{},"outputs":[],"execution_count":null},{"id":"8397f187-7806-43d4-a098-94af5cac4e32","cell_type":"code","source":"history = model.fit(\n    train_generator,\n    steps_per_epoch=100,  # عدد الدفعات في كل عصر تدريب\n    epochs=30,            # عدد الفترات التدريبية\n    validation_data=validation_generator,\n    validation_steps=50   # عدد الدفعات في التحقق\n)","metadata":{},"outputs":[],"execution_count":null},{"id":"0be31d86-644d-43f9-88a2-82226f624105","cell_type":"code","source":"import matplotlib.pyplot as plt\n\n# رسم دقة النموذج\nacc = history.history['accuracy']\nval_acc = history.history['val_accuracy']\nloss = history.history['loss']\nval_loss = history.history['val_loss']\n\nepochs = range(len(acc))\n\nplt.plot(epochs, acc, 'bo', label='Training accuracy')\nplt.plot(epochs, val_acc, 'b', label='Validation accuracy')\nplt.title('Training and validation accuracy')\nplt.legend()\n\nplt.figure()\n\nplt.plot(epochs, loss, 'bo', label='Training loss')\nplt.plot(epochs, val_loss, 'b', label='Validation loss')\nplt.title('Training and validation loss')\nplt.legend()\n\nplt.show()","metadata":{},"outputs":[],"execution_count":null},{"id":"d984a9a2-c77e-475e-b65f-55d1c8d46fa6","cell_type":"code","source":"","metadata":{},"outputs":[],"execution_count":null},{"id":"0a6419d7-ec69-4a8c-8441-ebdcab26eb70","cell_type":"code","source":"from tensorflow.keras.datasets import cifar10\n\n# تحميل بيانات CIFAR-10\n(x_train, y_train), (x_test, y_test) = cifar10.load_data()\n\n# تطبيع البيانات (Normalization) لجعل القيم بين 0 و 1\nx_train = x_train.astype('float32') / 255.0\nx_test = x_test.astype('float32') / 255.0","metadata":{},"outputs":[],"execution_count":null},{"id":"daaa9e60-08ac-4e63-aa63-b194be1d8be6","cell_type":"code","source":"from tensorflow.keras.datasets import mnist\n\n# تحميل بيانات MNIST\n(x_train, y_train), (x_test, y_test) = mnist.load_data()\n\n# إضافة قناة للأبعاد (لأن MNIST رمادي اللون)\nx_train = x_train.reshape(-1, 28, 28, 1).astype('float32') / 255.0\nx_test = x_test.reshape(-1, 28, 28, 1).astype('float32') / 255.0","metadata":{},"outputs":[],"execution_count":null},{"id":"76721e16-9267-4d46-9587-6a34c675a5f4","cell_type":"code","source":"from tensorflow.keras.utils import to_categorical\n\n# تحويل y_train و y_test إلى One-Hot Encoding\nnum_classes = 10  # عدد الفئات\ny_train = to_categorical(y_train, num_classes)\ny_test = to_categorical(y_test, num_classes)","metadata":{},"outputs":[],"execution_count":null},{"id":"800513ba-db02-4873-8d3e-0b3ee5a4dccf","cell_type":"code","source":"print(f\"x_train shape: {x_train.shape}\")  # بيانات التدريب\nprint(f\"y_train shape: {y_train.shape}\")  # تسميات التدريب\nprint(f\"x_test shape: {x_test.shape}\")    # بيانات التحقق\nprint(f\"y_test shape: {y_test.shape}\")    # تسميات التحقق","metadata":{},"outputs":[],"execution_count":null},{"id":"9b6c4972-648e-48cd-bd22-0caca41ffdfc","cell_type":"code","source":"from tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense\n\n# تحديد أبعاد الإدخال\ninput_shape = (28, 28, 1)  # صور رمادية\nnum_classes = 10           # عدد الفئات\n\n# بناء النموذج\nmodel = Sequential([\n    Conv2D(32, (3, 3), activation='relu', input_shape=input_shape),\n    MaxPooling2D(pool_size=(2, 2)),\n    Conv2D(64, (3, 3), activation='relu'),\n    MaxPooling2D(pool_size=(2, 2)),\n    Flatten(),\n    Dense(128, activation='relu'),\n    Dense(num_classes, activation='softmax')\n])\n\n# تجميع النموذج\nmodel.compile(optimizer='adam',\n              loss='categorical_crossentropy',\n              metrics=['accuracy'])\n\n# عرض ملخص النموذج\nmodel.summary()","metadata":{},"outputs":[],"execution_count":null},{"id":"74379374-38d6-4ac5-901b-d2bef0d5198a","cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator\n\n# إنشاء مولد بيانات مع التحولات\ndatagen = ImageDataGenerator(\n    rotation_range=20,      # تدوير الصور حتى 20 درجة\n    width_shift_range=0.2,  # تغيير الموقع أفقيًا حتى 20% من العرض\n    height_shift_range=0.2, # تغيير الموقع عموديًا حتى 20% من الارتفاع\n    shear_range=0.2,        # قص الصور (shear)\n    zoom_range=0.2,         # تكبير الصور\n    horizontal_flip=True,   # قلب الصور أفقيًا\n    fill_mode='nearest'     # ملء المساحات الناتجة عن التحويلات\n)\n\n# تدريب النموذج مع مولد البيانات\nbatch_size = 64\ntrain_generator = datagen.flow(x_train, y_train, batch_size=batch_size)\n\nmodel.fit(train_generator, epochs=10, validation_data=(x_test, y_test))","metadata":{},"outputs":[],"execution_count":null},{"id":"7c69f78a-d05f-4dab-9a2b-f52b56d8c426","cell_type":"code","source":"import numpy as np\n# Assuming y_train and y_test are one-hot encoded, convert them to integer labels\ny_train = np.argmax(y_train, axis=-1)  # Convert from one-hot to integer labels\ny_test = np.argmax(y_test, axis=-1)    # Convert from one-hot to integer labels","metadata":{},"outputs":[],"execution_count":null},{"id":"8edab9b9-4234-464c-81f8-f94d138f09e7","cell_type":"code","source":"","metadata":{},"outputs":[],"execution_count":null},{"id":"d80fc314-6a57-4337-b9de-ee0cb1940300","cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow.keras import Sequential\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense\n\n# Define model input shape\ninput_shape = (28, 28, 3)\n\n# Define the model\nmodel = Sequential([\n    # Convolutional layers\n    Conv2D(32, (3, 3), activation='relu', input_shape=input_shape),\n    MaxPooling2D(pool_size=(2, 2)),\n    Conv2D(64, (3, 3), activation='relu'),\n    MaxPooling2D(pool_size=(2, 2)),\n    \n    # Flatten layer to reshape the output\n    Flatten(),\n    \n    # Dense layers\n    Dense(128, activation='relu'),\n    Dense(10, activation='softmax')  # Assuming 10 classes for classification\n])\n\n# Compile the model\nmodel.compile(optimizer='adam', \n              loss='sparse_categorical_crossentropy', \n              metrics=['accuracy'])\n\n# Augmentation function\ndef augment_image(image, label):\n    image = tf.image.resize(image, [28, 28])  # Resize to 28x28\n    image = tf.image.random_flip_left_right(image)  # Flip horizontally\n    image = tf.image.random_flip_up_down(image)  # Flip vertically\n    image = tf.image.random_brightness(image, max_delta=0.1)  # Random brightness\n    image = tf.image.random_contrast(image, 0.8, 1.2)  # Random contrast\n    return image, label\n\n# Create train dataset with augmentation\ntrain_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train))\ntrain_dataset = train_dataset.map(augment_image).batch(batch_size).shuffle(1000)\n\n# Train the model\nmodel.fit(train_dataset, epochs=10, validation_data=(x_test, y_test))","metadata":{},"outputs":[],"execution_count":null},{"id":"b6b8ba5e-135c-4809-9650-f0a763109cfe","cell_type":"code","source":"","metadata":{},"outputs":[],"execution_count":null},{"id":"c4346a61-8b65-4c74-83c2-9365d000ab69","cell_type":"code","source":"","metadata":{},"outputs":[],"execution_count":null},{"id":"37eb188a-08f8-4df0-81a7-d0f6b98701b1","cell_type":"code","source":"from tensorflow.keras.layers import Dropout\n\nmodel.add(Dropout(0.5))  # يسقط 50% من الوحدات في الطبقة","metadata":{},"outputs":[],"execution_count":null},{"id":"9ee9f10a-b867-41b4-9b6f-5e74095be64e","cell_type":"code","source":"from tensorflow.keras.regularizers import l2\n\nmodel.add(Dense(64, activation='relu', kernel_regularizer=l2(0.01)))","metadata":{},"outputs":[],"execution_count":null},{"id":"6c602b79-7e9f-43bf-9914-fee8a4f3eb80","cell_type":"code","source":"input_shape = (28, 28, 1)  # Update to 1 channel for grayscale\nmodel = Sequential([\n    Conv2D(32, (3, 3), activation='relu', input_shape=input_shape),\n    MaxPooling2D(pool_size=(2, 2)),\n    Conv2D(64, (3, 3), activation='relu'),\n    MaxPooling2D(pool_size=(2, 2)),\n    Flatten(),\n    Dense(128, activation='relu'),\n    Dense(num_classes, activation='softmax')\n])","metadata":{},"outputs":[],"execution_count":null},{"id":"acc62557-3f18-47cf-8154-2fac398dc0e0","cell_type":"code","source":"print(x_train.shape)\nprint(x_test.shape)","metadata":{},"outputs":[],"execution_count":null},{"id":"bfe210b8-f954-43b2-a45c-2ced634df1e1","cell_type":"code","source":"import numpy as np\n\n# تأكد من أن البيانات هي مصفوفات NumPy\nx_train = np.array(x_train)\nx_test = np.array(x_test)\n\n# التأكد من الأبعاد\nprint(x_train.shape)  # يجب أن تكون (60000, 28, 28, 3)\nprint(x_test.shape)   # يجب أن تكون (10000, 28, 28, 3)","metadata":{},"outputs":[],"execution_count":null},{"id":"730f9c14-5049-4aca-82e7-510572f776b6","cell_type":"code","source":"import cv2\n\n# تحويل الصور من RGB إلى Grayscale\nx_train_gray = np.array([cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) for image in x_train])\nx_test_gray = np.array([cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) for image in x_test])\n\n# إضافة القناة الثالثة لكي تتوافق مع شكل المدخلات المطلوبة\nx_train_gray = x_train_gray[..., np.newaxis]\nx_test_gray = x_test_gray[..., np.newaxis]\n\n# التأكد من الأبعاد بعد التحويل\nprint(x_train_gray.shape)  # يجب أن تكون (60000, 28, 28, 1)\nprint(x_test_gray.shape)   # يجب أن تكون (10000, 28, 28, 1)","metadata":{},"outputs":[],"execution_count":null},{"id":"e636e8d4-8f32-49c8-b81f-5ae580d40f92","cell_type":"code","source":"from tensorflow.keras.utils import to_categorical\n\n# تحويل التسميات إلى one-hot encoding\ny_test_one_hot = to_categorical(y_test, num_classes=10)  # افترض أن لديك 10 فئات\n\n# تدريب النموذج مع البيانات المحوّلة\nmodel.fit(train_generator, epochs=50, validation_data=(x_test_gray, y_test_one_hot), callbacks=[early_stop])","metadata":{},"outputs":[],"execution_count":null},{"id":"5b243a72-c47e-43b4-b45e-241399e63da6","cell_type":"code","source":"# تقييم النموذج على بيانات الاختبار\ntest_loss, test_accuracy = model.evaluate(x_test_gray, y_test_one_hot)\nprint(f\"Test accuracy: {test_accuracy}, Test loss: {test_loss}\")","metadata":{},"outputs":[],"execution_count":null},{"id":"baf3de55-ab10-4615-85fd-9e0d6dc9204d","cell_type":"code","source":"history = model.fit(train_generator, epochs=50, validation_data=(x_test_gray, y_test_one_hot), callbacks=[early_stop])","metadata":{},"outputs":[],"execution_count":null},{"id":"bafbb665-faa4-4369-a50d-54355157667b","cell_type":"code","source":"print(history.history.keys())","metadata":{},"outputs":[],"execution_count":null},{"id":"8cb99fea-546c-4912-be3b-dbd9157f0a3d","cell_type":"code","source":"import matplotlib.pyplot as plt\n\n# رسم دقة التدريب والاختبار\nplt.figure(figsize=(12, 6))\n\n# دقة التدريب\nplt.subplot(1, 2, 1)\nplt.plot(history.history['accuracy'], label='Training Accuracy')\nplt.plot(history.history['val_accuracy'], label='Validation Accuracy')\nplt.title('Training and Validation Accuracy')\nplt.xlabel('Epochs')\nplt.ylabel('Accuracy')\nplt.legend()\n\n# خسارة التدريب والاختبار\nplt.subplot(1, 2, 2)\nplt.plot(history.history['loss'], label='Training Loss')\nplt.plot(history.history['val_loss'], label='Validation Loss')\nplt.title('Training and Validation Loss')\nplt.xlabel('Epochs')\nplt.ylabel('Loss')\nplt.legend()\n\nplt.tight_layout()\nplt.show()","metadata":{},"outputs":[],"execution_count":null},{"id":"53f6fb08-e8cc-4789-b344-8fed01405773","cell_type":"code","source":"model.save('cats_vs_dogs_modelnew.h5')","metadata":{},"outputs":[],"execution_count":null},{"id":"b3358847-903d-46be-a7a2-cfb81832df29","cell_type":"code","source":"","metadata":{},"outputs":[],"execution_count":null},{"id":"2a8afbc6-9c94-4c82-a3aa-5f6932b07dc4","cell_type":"code","source":"","metadata":{},"outputs":[],"execution_count":null},{"id":"78ae495a-9352-47c3-8ce1-b6f6e3dba384","cell_type":"code","source":"","metadata":{},"outputs":[],"execution_count":null}]}