import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.preprocessing import image
import numpy as np
import matplotlib.pyplot as plt
import os
import randomCat vs Dog Image Classification using CNN
train_datagen = ImageDataGenerator(rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)
training_set = train_datagen.flow_from_directory('/kaggle/input/cat-vs-dog-image-classification-making-prediction/dataset/training_set',
target_size=(64, 64),
batch_size=32,
class_mode='binary')
# Data preprocessing for testing
test_datagen = ImageDataGenerator(rescale=1./255)
test_set = test_datagen.flow_from_directory('/kaggle/input/cat-vs-dog-image-classification-making-prediction/dataset/test_set',
target_size=(64, 64),
batch_size=32,
class_mode='binary')Found 8000 images belonging to 2 classes.
Found 2000 images belonging to 2 classes.
cnn = Sequential([
Conv2D(filters=32, kernel_size=3, activation='relu', input_shape=(64, 64, 3)),
MaxPooling2D(pool_size=2, strides=2),
Conv2D(filters=32, kernel_size=3, activation='relu'),
MaxPooling2D(pool_size=2, strides=2),
Flatten(),
Dense(units=128, activation='relu'),
Dense(units=1, activation='sigmoid')
])cnn.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])weights_path = '/kaggle/working/cnn_weights.weights.h5'# Check if weights file exists, if not, train and save weights
if not os.path.exists(weights_path):
# Training the CNN and saving history
history = cnn.fit(x=training_set, validation_data=test_set, epochs=50)
# Save weights after training
cnn.save_weights(weights_path) # Corrected line
else:
# Load weights if they exist
cnn.load_weights(weights_path)Epoch 1/50
3/250 ━━━━━━━━━━━━━━━━━━━━ 20s 85ms/step - accuracy: 0.4948 - loss: 0.9775243/250 ━━━━━━━━━━━━━━━━━━━━ 1s 161ms/step - accuracy: 0.5563 - loss: 0.7044250/250 ━━━━━━━━━━━━━━━━━━━━ 52s 189ms/step - accuracy: 0.5575 - loss: 0.7032 - val_accuracy: 0.5940 - val_loss: 0.7075
Epoch 2/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 28s 108ms/step - accuracy: 0.6480 - loss: 0.6198 - val_accuracy: 0.6615 - val_loss: 0.6100
Epoch 3/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 27s 107ms/step - accuracy: 0.7039 - loss: 0.5704 - val_accuracy: 0.7200 - val_loss: 0.5532
Epoch 4/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 28s 107ms/step - accuracy: 0.7240 - loss: 0.5406 - val_accuracy: 0.7335 - val_loss: 0.5515
Epoch 5/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 28s 111ms/step - accuracy: 0.7422 - loss: 0.5201 - val_accuracy: 0.7505 - val_loss: 0.5182
Epoch 6/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 27s 106ms/step - accuracy: 0.7535 - loss: 0.5014 - val_accuracy: 0.7405 - val_loss: 0.5360
Epoch 7/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 29s 113ms/step - accuracy: 0.7723 - loss: 0.4817 - val_accuracy: 0.7530 - val_loss: 0.5243
Epoch 8/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 28s 109ms/step - accuracy: 0.7802 - loss: 0.4588 - val_accuracy: 0.7790 - val_loss: 0.4908
Epoch 9/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 28s 109ms/step - accuracy: 0.7746 - loss: 0.4603 - val_accuracy: 0.7765 - val_loss: 0.4936
Epoch 10/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 27s 106ms/step - accuracy: 0.7827 - loss: 0.4496 - val_accuracy: 0.7720 - val_loss: 0.5128
Epoch 11/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 28s 108ms/step - accuracy: 0.7955 - loss: 0.4283 - val_accuracy: 0.7710 - val_loss: 0.5021
Epoch 12/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 41s 107ms/step - accuracy: 0.8071 - loss: 0.4188 - val_accuracy: 0.7800 - val_loss: 0.5005
Epoch 13/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 28s 109ms/step - accuracy: 0.8127 - loss: 0.3984 - val_accuracy: 0.7945 - val_loss: 0.4851
Epoch 14/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 27s 105ms/step - accuracy: 0.8237 - loss: 0.3866 - val_accuracy: 0.7755 - val_loss: 0.5020
Epoch 15/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 27s 107ms/step - accuracy: 0.8229 - loss: 0.3898 - val_accuracy: 0.7825 - val_loss: 0.5094
Epoch 16/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 27s 107ms/step - accuracy: 0.8265 - loss: 0.3790 - val_accuracy: 0.7860 - val_loss: 0.5039
Epoch 17/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 28s 110ms/step - accuracy: 0.8415 - loss: 0.3529 - val_accuracy: 0.7845 - val_loss: 0.5114
Epoch 18/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 28s 108ms/step - accuracy: 0.8447 - loss: 0.3508 - val_accuracy: 0.7840 - val_loss: 0.5060
Epoch 19/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 28s 109ms/step - accuracy: 0.8607 - loss: 0.3208 - val_accuracy: 0.7900 - val_loss: 0.5487
Epoch 20/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 40s 155ms/step - accuracy: 0.8711 - loss: 0.3126 - val_accuracy: 0.7760 - val_loss: 0.5507
Epoch 21/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 46s 181ms/step - accuracy: 0.8634 - loss: 0.3108 - val_accuracy: 0.7630 - val_loss: 0.5786
Epoch 22/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 37s 139ms/step - accuracy: 0.8684 - loss: 0.2999 - val_accuracy: 0.7670 - val_loss: 0.6191
Epoch 23/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 38s 149ms/step - accuracy: 0.8806 - loss: 0.2820 - val_accuracy: 0.7885 - val_loss: 0.5603
Epoch 24/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 37s 144ms/step - accuracy: 0.8719 - loss: 0.2970 - val_accuracy: 0.7700 - val_loss: 0.6221
Epoch 25/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 36s 141ms/step - accuracy: 0.8860 - loss: 0.2701 - val_accuracy: 0.7645 - val_loss: 0.6214
Epoch 26/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 37s 145ms/step - accuracy: 0.8923 - loss: 0.2586 - val_accuracy: 0.7865 - val_loss: 0.6405
Epoch 27/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 44s 172ms/step - accuracy: 0.8955 - loss: 0.2457 - val_accuracy: 0.7840 - val_loss: 0.5636
Epoch 28/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 31s 122ms/step - accuracy: 0.9038 - loss: 0.2312 - val_accuracy: 0.7820 - val_loss: 0.6396
Epoch 29/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 28s 109ms/step - accuracy: 0.9003 - loss: 0.2356 - val_accuracy: 0.7950 - val_loss: 0.5884
Epoch 30/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 27s 106ms/step - accuracy: 0.9149 - loss: 0.2186 - val_accuracy: 0.7875 - val_loss: 0.7087
Epoch 31/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 28s 109ms/step - accuracy: 0.9036 - loss: 0.2348 - val_accuracy: 0.7815 - val_loss: 0.7269
Epoch 32/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 28s 109ms/step - accuracy: 0.9144 - loss: 0.2165 - val_accuracy: 0.7865 - val_loss: 0.6700
Epoch 33/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 31s 122ms/step - accuracy: 0.9205 - loss: 0.2039 - val_accuracy: 0.7790 - val_loss: 0.7728
Epoch 34/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 39s 114ms/step - accuracy: 0.9211 - loss: 0.1911 - val_accuracy: 0.7855 - val_loss: 0.6496
Epoch 35/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 28s 109ms/step - accuracy: 0.9194 - loss: 0.1924 - val_accuracy: 0.7785 - val_loss: 0.6315
Epoch 36/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 29s 113ms/step - accuracy: 0.9204 - loss: 0.1937 - val_accuracy: 0.7675 - val_loss: 0.8211
Epoch 37/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 29s 112ms/step - accuracy: 0.9324 - loss: 0.1745 - val_accuracy: 0.7800 - val_loss: 0.8673
Epoch 38/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 29s 113ms/step - accuracy: 0.9369 - loss: 0.1588 - val_accuracy: 0.7840 - val_loss: 0.7244
Epoch 39/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 28s 111ms/step - accuracy: 0.9402 - loss: 0.1567 - val_accuracy: 0.7950 - val_loss: 0.7386
Epoch 40/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 27s 107ms/step - accuracy: 0.9392 - loss: 0.1633 - val_accuracy: 0.7825 - val_loss: 0.8240
Epoch 41/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 28s 108ms/step - accuracy: 0.9330 - loss: 0.1631 - val_accuracy: 0.7860 - val_loss: 0.8064
Epoch 42/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 27s 105ms/step - accuracy: 0.9465 - loss: 0.1354 - val_accuracy: 0.7705 - val_loss: 0.7274
Epoch 43/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 27s 107ms/step - accuracy: 0.9388 - loss: 0.1577 - val_accuracy: 0.7785 - val_loss: 0.7972
Epoch 44/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 28s 110ms/step - accuracy: 0.9380 - loss: 0.1610 - val_accuracy: 0.7920 - val_loss: 0.9024
Epoch 45/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 27s 107ms/step - accuracy: 0.9417 - loss: 0.1466 - val_accuracy: 0.7840 - val_loss: 0.8283
Epoch 46/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 41s 106ms/step - accuracy: 0.9435 - loss: 0.1532 - val_accuracy: 0.7835 - val_loss: 0.8140
Epoch 47/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 28s 110ms/step - accuracy: 0.9450 - loss: 0.1518 - val_accuracy: 0.7890 - val_loss: 0.8356
Epoch 48/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 28s 109ms/step - accuracy: 0.9540 - loss: 0.1212 - val_accuracy: 0.7855 - val_loss: 0.8239
Epoch 49/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 28s 110ms/step - accuracy: 0.9547 - loss: 0.1201 - val_accuracy: 0.7970 - val_loss: 0.8161
Epoch 50/50
250/250 ━━━━━━━━━━━━━━━━━━━━ 28s 108ms/step - accuracy: 0.9487 - loss: 0.1280 - val_accuracy: 0.7960 - val_loss: 0.7628
if 'history' in locals():
plt.figure(figsize=(8, 6))
plt.plot(history.history['accuracy'], label='Training Accuracy')
plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
plt.title('Model Accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(loc='upper left')
plt.show()
test_image_dir = '/kaggle/input/cat-vs-dog-image-classification-making-prediction/dataset/test_set'
categories = os.listdir(test_image_dir)
selected_category = random.choice(categories)
selected_image = random.choice(os.listdir(os.path.join(test_image_dir, selected_category)))
selected_image_path = os.path.join(test_image_dir, selected_category, selected_image)test_image = image.load_img(selected_image_path, target_size=(64, 64))
test_image_array = image.img_to_array(test_image)
test_image_array = np.expand_dims(test_image_array, axis=0)
test_image_array /= 255.0result = cnn.predict(test_image_array)
confidence = result[0][0]1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 405ms/step
if confidence > 0.5:
prediction = 'dog'
confidence_percentage = confidence * 100
else:
prediction = 'cat'
confidence_percentage = (1 - confidence) * 100plt.imshow(test_image)
plt.title(f'Prediction: {prediction} ({confidence_percentage:.2f}%)')
plt.axis('on')
plt.show()