Learn practical skills, build real-world projects, and advance your career
Copyright 2019 The TensorFlow Authors.
#@title Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

Let's start with a model that's very effective at learning Cats v Dogs.

It's similar to the previous models that you have used, but I have updated the layers definition. Note that there are now 4 convolutional layers with 32, 64, 128 and 128 convolutions respectively.

Also, this will train for 100 epochs, because I want to plot the graph of loss and accuracy.

!wget --no-check-certificate \
    https://storage.googleapis.com/mledu-datasets/cats_and_dogs_filtered.zip \
    -O /tmp/cats_and_dogs_filtered.zip
  
import os
import zipfile
import tensorflow as tf
from tensorflow.keras.optimizers import RMSprop
from tensorflow.keras.preprocessing.image import ImageDataGenerator

local_zip = '/tmp/cats_and_dogs_filtered.zip'
zip_ref = zipfile.ZipFile(local_zip, 'r')
zip_ref.extractall('/tmp')
zip_ref.close()

base_dir = '/tmp/cats_and_dogs_filtered'
train_dir = os.path.join(base_dir, 'train')
validation_dir = os.path.join(base_dir, 'validation')

# Directory with our training cat pictures
train_cats_dir = os.path.join(train_dir, 'cats')

# Directory with our training dog pictures
train_dogs_dir = os.path.join(train_dir, 'dogs')

# Directory with our validation cat pictures
validation_cats_dir = os.path.join(validation_dir, 'cats')

# Directory with our validation dog pictures
validation_dogs_dir = os.path.join(validation_dir, 'dogs')

model = tf.keras.models.Sequential([
    tf.keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(150, 150, 3)),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Conv2D(128, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Conv2D(128, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(512, activation='relu'),
    tf.keras.layers.Dense(1, activation='sigmoid')
])

model.compile(loss='binary_crossentropy',
              optimizer=RMSprop(lr=1e-4),
              metrics=['accuracy'])

# All images will be rescaled by 1./255
train_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)

# Flow training images in batches of 20 using train_datagen generator
train_generator = train_datagen.flow_from_directory(
        train_dir,  # This is the source directory for training images
        target_size=(150, 150),  # All images will be resized to 150x150
        batch_size=20,
        # Since we use binary_crossentropy loss, we need binary labels
        class_mode='binary')

# Flow validation images in batches of 20 using test_datagen generator
validation_generator = test_datagen.flow_from_directory(
        validation_dir,
        target_size=(150, 150),
        batch_size=20,
        class_mode='binary')

history = model.fit(
      train_generator,
      steps_per_epoch=100,  # 2000 images = batch_size * steps
      epochs=100,
      validation_data=validation_generator,
      validation_steps=50,  # 1000 images = batch_size * steps
      verbose=2)
--2020-09-14 03:26:59-- https://storage.googleapis.com/mledu-datasets/cats_and_dogs_filtered.zip Resolving storage.googleapis.com (storage.googleapis.com)... 74.125.142.128, 74.125.195.128, 74.125.20.128, ... Connecting to storage.googleapis.com (storage.googleapis.com)|74.125.142.128|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 68606236 (65M) [application/zip] Saving to: ‘/tmp/cats_and_dogs_filtered.zip’ /tmp/cats_and_dogs_ 100%[===================>] 65.43M 136MB/s in 0.5s 2020-09-14 03:27:00 (136 MB/s) - ‘/tmp/cats_and_dogs_filtered.zip’ saved [68606236/68606236] Found 2000 images belonging to 2 classes. Found 1000 images belonging to 2 classes. Epoch 1/100 100/100 - 9s - loss: 0.6915 - accuracy: 0.5215 - val_loss: 0.7177 - val_accuracy: 0.5000 Epoch 2/100 100/100 - 9s - loss: 0.6638 - accuracy: 0.6105 - val_loss: 0.6455 - val_accuracy: 0.6420 Epoch 3/100 100/100 - 9s - loss: 0.6091 - accuracy: 0.6695 - val_loss: 0.6090 - val_accuracy: 0.6720 Epoch 4/100 100/100 - 9s - loss: 0.5693 - accuracy: 0.7015 - val_loss: 0.5834 - val_accuracy: 0.6870 Epoch 5/100 100/100 - 9s - loss: 0.5445 - accuracy: 0.7200 - val_loss: 0.5763 - val_accuracy: 0.7150 Epoch 6/100 100/100 - 9s - loss: 0.5151 - accuracy: 0.7385 - val_loss: 0.5631 - val_accuracy: 0.7060 Epoch 7/100 100/100 - 9s - loss: 0.4942 - accuracy: 0.7670 - val_loss: 0.6494 - val_accuracy: 0.6590 Epoch 8/100 100/100 - 9s - loss: 0.4631 - accuracy: 0.7875 - val_loss: 0.5376 - val_accuracy: 0.7420 Epoch 9/100 100/100 - 9s - loss: 0.4458 - accuracy: 0.7920 - val_loss: 0.5412 - val_accuracy: 0.7380 Epoch 10/100 100/100 - 9s - loss: 0.4117 - accuracy: 0.8175 - val_loss: 0.5617 - val_accuracy: 0.7360 Epoch 11/100 100/100 - 9s - loss: 0.3910 - accuracy: 0.8315 - val_loss: 0.5357 - val_accuracy: 0.7490 Epoch 12/100 100/100 - 9s - loss: 0.3721 - accuracy: 0.8330 - val_loss: 0.5482 - val_accuracy: 0.7330 Epoch 13/100 100/100 - 9s - loss: 0.3458 - accuracy: 0.8525 - val_loss: 0.5409 - val_accuracy: 0.7550 Epoch 14/100 100/100 - 9s - loss: 0.3334 - accuracy: 0.8535 - val_loss: 0.5290 - val_accuracy: 0.7540 Epoch 15/100 100/100 - 9s - loss: 0.3018 - accuracy: 0.8730 - val_loss: 0.5379 - val_accuracy: 0.7580 Epoch 16/100 100/100 - 9s - loss: 0.2787 - accuracy: 0.8840 - val_loss: 0.5552 - val_accuracy: 0.7580 Epoch 17/100 100/100 - 9s - loss: 0.2589 - accuracy: 0.9000 - val_loss: 0.5666 - val_accuracy: 0.7630 Epoch 18/100 100/100 - 9s - loss: 0.2387 - accuracy: 0.9085 - val_loss: 0.6661 - val_accuracy: 0.7070 Epoch 19/100 100/100 - 9s - loss: 0.2122 - accuracy: 0.9225 - val_loss: 0.5895 - val_accuracy: 0.7580 Epoch 20/100 100/100 - 9s - loss: 0.1977 - accuracy: 0.9315 - val_loss: 0.6207 - val_accuracy: 0.7540 Epoch 21/100 100/100 - 9s - loss: 0.1720 - accuracy: 0.9410 - val_loss: 0.6505 - val_accuracy: 0.7330 Epoch 22/100 100/100 - 9s - loss: 0.1608 - accuracy: 0.9410 - val_loss: 0.6518 - val_accuracy: 0.7580 Epoch 23/100 100/100 - 9s - loss: 0.1456 - accuracy: 0.9460 - val_loss: 0.6480 - val_accuracy: 0.7650 Epoch 24/100 100/100 - 9s - loss: 0.1343 - accuracy: 0.9540 - val_loss: 0.6814 - val_accuracy: 0.7360 Epoch 25/100 100/100 - 9s - loss: 0.1130 - accuracy: 0.9640 - val_loss: 0.7158 - val_accuracy: 0.7510 Epoch 26/100 100/100 - 9s - loss: 0.1075 - accuracy: 0.9665 - val_loss: 0.6720 - val_accuracy: 0.7460 Epoch 27/100 100/100 - 9s - loss: 0.0815 - accuracy: 0.9775 - val_loss: 0.8185 - val_accuracy: 0.7390 Epoch 28/100 100/100 - 9s - loss: 0.0711 - accuracy: 0.9775 - val_loss: 0.8072 - val_accuracy: 0.7490 Epoch 29/100 100/100 - 9s - loss: 0.0621 - accuracy: 0.9795 - val_loss: 0.8301 - val_accuracy: 0.7500 Epoch 30/100 100/100 - 9s - loss: 0.0510 - accuracy: 0.9890 - val_loss: 0.9947 - val_accuracy: 0.7300 Epoch 31/100 100/100 - 9s - loss: 0.0448 - accuracy: 0.9880 - val_loss: 1.0096 - val_accuracy: 0.7330 Epoch 32/100 100/100 - 9s - loss: 0.0400 - accuracy: 0.9905 - val_loss: 0.9325 - val_accuracy: 0.7550 Epoch 33/100 100/100 - 9s - loss: 0.0338 - accuracy: 0.9900 - val_loss: 0.9216 - val_accuracy: 0.7550 Epoch 34/100 100/100 - 9s - loss: 0.0358 - accuracy: 0.9895 - val_loss: 1.0086 - val_accuracy: 0.7510 Epoch 35/100 100/100 - 9s - loss: 0.0250 - accuracy: 0.9940 - val_loss: 1.0951 - val_accuracy: 0.7350 Epoch 36/100 100/100 - 9s - loss: 0.0210 - accuracy: 0.9950 - val_loss: 1.0745 - val_accuracy: 0.7560 Epoch 37/100 100/100 - 9s - loss: 0.0163 - accuracy: 0.9965 - val_loss: 1.1755 - val_accuracy: 0.7460 Epoch 38/100 100/100 - 9s - loss: 0.0294 - accuracy: 0.9900 - val_loss: 1.1784 - val_accuracy: 0.7340 Epoch 39/100 100/100 - 9s - loss: 0.0264 - accuracy: 0.9945 - val_loss: 1.0600 - val_accuracy: 0.7480 Epoch 40/100 100/100 - 9s - loss: 0.0165 - accuracy: 0.9960 - val_loss: 1.1974 - val_accuracy: 0.7390 Epoch 41/100 100/100 - 9s - loss: 0.0100 - accuracy: 0.9975 - val_loss: 1.2921 - val_accuracy: 0.7450 Epoch 42/100 100/100 - 9s - loss: 0.0114 - accuracy: 0.9965 - val_loss: 1.3441 - val_accuracy: 0.7500 Epoch 43/100 100/100 - 9s - loss: 0.0145 - accuracy: 0.9975 - val_loss: 1.3180 - val_accuracy: 0.7410 Epoch 44/100 100/100 - 9s - loss: 0.0107 - accuracy: 0.9960 - val_loss: 1.3558 - val_accuracy: 0.7530 Epoch 45/100 100/100 - 9s - loss: 0.0073 - accuracy: 0.9980 - val_loss: 1.5130 - val_accuracy: 0.7390 Epoch 46/100 100/100 - 9s - loss: 0.0165 - accuracy: 0.9950 - val_loss: 1.4636 - val_accuracy: 0.7500 Epoch 47/100 100/100 - 9s - loss: 0.0055 - accuracy: 0.9985 - val_loss: 1.4557 - val_accuracy: 0.7370 Epoch 48/100 100/100 - 9s - loss: 0.0185 - accuracy: 0.9945 - val_loss: 1.3668 - val_accuracy: 0.7520 Epoch 49/100 100/100 - 9s - loss: 0.0077 - accuracy: 0.9965 - val_loss: 1.6044 - val_accuracy: 0.7450 Epoch 50/100 100/100 - 9s - loss: 0.0114 - accuracy: 0.9965 - val_loss: 1.4963 - val_accuracy: 0.7670 Epoch 51/100 100/100 - 9s - loss: 0.0056 - accuracy: 0.9980 - val_loss: 1.5509 - val_accuracy: 0.7450 Epoch 52/100 100/100 - 9s - loss: 0.0068 - accuracy: 0.9970 - val_loss: 1.5987 - val_accuracy: 0.7560 Epoch 53/100 100/100 - 9s - loss: 0.0163 - accuracy: 0.9975 - val_loss: 1.5897 - val_accuracy: 0.7620 Epoch 54/100 100/100 - 9s - loss: 0.0069 - accuracy: 0.9975 - val_loss: 1.5807 - val_accuracy: 0.7590 Epoch 55/100 100/100 - 9s - loss: 0.0092 - accuracy: 0.9975 - val_loss: 1.6285 - val_accuracy: 0.7630 Epoch 56/100 100/100 - 9s - loss: 0.0083 - accuracy: 0.9970 - val_loss: 1.6651 - val_accuracy: 0.7480 Epoch 57/100 100/100 - 9s - loss: 0.0132 - accuracy: 0.9960 - val_loss: 1.7201 - val_accuracy: 0.7470 Epoch 58/100 100/100 - 9s - loss: 0.0061 - accuracy: 0.9985 - val_loss: 1.7059 - val_accuracy: 0.7450 Epoch 59/100 100/100 - 9s - loss: 0.0079 - accuracy: 0.9985 - val_loss: 1.6708 - val_accuracy: 0.7320 Epoch 60/100 100/100 - 9s - loss: 0.0039 - accuracy: 0.9980 - val_loss: 1.7207 - val_accuracy: 0.7410 Epoch 61/100 100/100 - 9s - loss: 0.0037 - accuracy: 0.9985 - val_loss: 1.7854 - val_accuracy: 0.7510 Epoch 62/100 100/100 - 9s - loss: 0.0036 - accuracy: 0.9985 - val_loss: 1.8150 - val_accuracy: 0.7540 Epoch 63/100 100/100 - 9s - loss: 0.0218 - accuracy: 0.9970 - val_loss: 1.6977 - val_accuracy: 0.7510 Epoch 64/100 100/100 - 9s - loss: 0.0044 - accuracy: 0.9980 - val_loss: 1.7740 - val_accuracy: 0.7580 Epoch 65/100 100/100 - 9s - loss: 0.0078 - accuracy: 0.9975 - val_loss: 1.7391 - val_accuracy: 0.7600 Epoch 66/100 100/100 - 9s - loss: 0.0066 - accuracy: 0.9965 - val_loss: 1.8499 - val_accuracy: 0.7500 Epoch 67/100 100/100 - 9s - loss: 0.0125 - accuracy: 0.9955 - val_loss: 1.9349 - val_accuracy: 0.7410 Epoch 68/100 100/100 - 9s - loss: 0.0134 - accuracy: 0.9985 - val_loss: 1.9546 - val_accuracy: 0.7390 Epoch 69/100 100/100 - 9s - loss: 6.2762e-04 - accuracy: 1.0000 - val_loss: 1.9254 - val_accuracy: 0.7600 Epoch 70/100 100/100 - 9s - loss: 0.0047 - accuracy: 0.9975 - val_loss: 1.8966 - val_accuracy: 0.7540 Epoch 71/100 100/100 - 9s - loss: 0.0059 - accuracy: 0.9980 - val_loss: 1.8852 - val_accuracy: 0.7510 Epoch 72/100 100/100 - 9s - loss: 0.0052 - accuracy: 0.9995 - val_loss: 1.9385 - val_accuracy: 0.7470 Epoch 73/100 100/100 - 9s - loss: 0.0062 - accuracy: 0.9990 - val_loss: 1.9000 - val_accuracy: 0.7510 Epoch 74/100 100/100 - 9s - loss: 0.0058 - accuracy: 0.9985 - val_loss: 2.0499 - val_accuracy: 0.7390 Epoch 75/100 100/100 - 9s - loss: 0.0039 - accuracy: 0.9990 - val_loss: 1.9887 - val_accuracy: 0.7420 Epoch 76/100 100/100 - 9s - loss: 0.0142 - accuracy: 0.9975 - val_loss: 1.9553 - val_accuracy: 0.7400 Epoch 77/100 100/100 - 9s - loss: 1.4534e-04 - accuracy: 1.0000 - val_loss: 1.9683 - val_accuracy: 0.7470 Epoch 78/100 100/100 - 9s - loss: 0.0069 - accuracy: 0.9975 - val_loss: 2.0299 - val_accuracy: 0.7540 Epoch 79/100 100/100 - 9s - loss: 0.0044 - accuracy: 0.9990 - val_loss: 2.1586 - val_accuracy: 0.7380 Epoch 80/100 100/100 - 9s - loss: 0.0069 - accuracy: 0.9985 - val_loss: 2.3945 - val_accuracy: 0.7360 Epoch 81/100 100/100 - 9s - loss: 0.0026 - accuracy: 0.9995 - val_loss: 2.0699 - val_accuracy: 0.7590 Epoch 82/100 100/100 - 9s - loss: 0.0057 - accuracy: 0.9980 - val_loss: 2.2350 - val_accuracy: 0.7570 Epoch 83/100 100/100 - 9s - loss: 0.0043 - accuracy: 0.9990 - val_loss: 2.2689 - val_accuracy: 0.7510 Epoch 84/100 100/100 - 9s - loss: 0.0193 - accuracy: 0.9980 - val_loss: 2.0597 - val_accuracy: 0.7340 Epoch 85/100 100/100 - 9s - loss: 1.1092e-04 - accuracy: 1.0000 - val_loss: 2.1473 - val_accuracy: 0.7570 Epoch 86/100 100/100 - 9s - loss: 0.0069 - accuracy: 0.9980 - val_loss: 2.0671 - val_accuracy: 0.7500 Epoch 87/100 100/100 - 9s - loss: 0.0032 - accuracy: 0.9990 - val_loss: 2.1788 - val_accuracy: 0.7340 Epoch 88/100 100/100 - 9s - loss: 3.5682e-05 - accuracy: 1.0000 - val_loss: 2.2502 - val_accuracy: 0.7510 Epoch 89/100 100/100 - 9s - loss: 0.0037 - accuracy: 0.9990 - val_loss: 2.3685 - val_accuracy: 0.7460 Epoch 90/100 100/100 - 9s - loss: 0.0076 - accuracy: 0.9975 - val_loss: 2.3399 - val_accuracy: 0.7450 Epoch 91/100 100/100 - 9s - loss: 0.0034 - accuracy: 0.9985 - val_loss: 2.3642 - val_accuracy: 0.7400 Epoch 92/100 100/100 - 9s - loss: 0.0044 - accuracy: 0.9975 - val_loss: 2.2102 - val_accuracy: 0.7440 Epoch 93/100 100/100 - 9s - loss: 0.0045 - accuracy: 0.9985 - val_loss: 2.2458 - val_accuracy: 0.7600 Epoch 94/100 100/100 - 9s - loss: 0.0011 - accuracy: 1.0000 - val_loss: 2.2579 - val_accuracy: 0.7510 Epoch 95/100 100/100 - 9s - loss: 0.0034 - accuracy: 0.9990 - val_loss: 2.3665 - val_accuracy: 0.7420 Epoch 96/100 100/100 - 9s - loss: 3.5710e-04 - accuracy: 1.0000 - val_loss: 2.3718 - val_accuracy: 0.7530 Epoch 97/100 100/100 - 9s - loss: 0.0012 - accuracy: 0.9995 - val_loss: 2.5163 - val_accuracy: 0.7460 Epoch 98/100 100/100 - 9s - loss: 0.0073 - accuracy: 0.9980 - val_loss: 2.3906 - val_accuracy: 0.7370 Epoch 99/100 100/100 - 9s - loss: 0.0041 - accuracy: 0.9990 - val_loss: 2.4135 - val_accuracy: 0.7400 Epoch 100/100 100/100 - 9s - loss: 0.0131 - accuracy: 0.9970 - val_loss: 2.3862 - val_accuracy: 0.7370
import matplotlib.pyplot as plt
acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']

epochs = range(len(acc))

plt.plot(epochs, acc, 'bo', label='Training accuracy')
plt.plot(epochs, val_acc, 'b', label='Validation accuracy')
plt.title('Training and validation accuracy')

plt.figure()

plt.plot(epochs, loss, 'bo', label='Training Loss')
plt.plot(epochs, val_loss, 'b', label='Validation Loss')
plt.title('Training and validation loss')
plt.legend()

plt.show()
Notebook Image
Notebook Image