Learn practical skills, build real-world projects, and advance your career
Created 4 years ago
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()