Below is code with a link to a happy or sad dataset which contains 80 images, 40 happy and 40 sad. Create a convolutional neural network that trains to 100% accuracy on these images, which cancels training upon hitting training accuracy of >.999

Hint -- it will work best with 3 convolutional layers.

In [1]:
import tensorflow as tf
import os
import zipfile
from os import path, getcwd, chdir

# DO NOT CHANGE THE LINE BELOW. If you are developing in a local
# environment, then grab happy-or-sad.zip from the Coursera Jupyter Notebook
# and place it inside a local folder and edit the path to that location
path = f"{getcwd()}/../tmp2/happy-or-sad.zip"

zip_ref = zipfile.ZipFile(path, 'r')
zip_ref.extractall("/tmp/h-or-s")
zip_ref.close()
In [2]:
# GRADED FUNCTION: train_happy_sad_model
def train_happy_sad_model():
    # Please write your code only where you are indicated.
    # please do not remove # model fitting inline comments.

    DESIRED_ACCURACY = 0.999

    class myCallback(tf.keras.callbacks.Callback):
         # Your Code
        def on_epoch_end(self, epoch, logs={}):
            if logs.get('acc') > 0.999:
                self.model.stop_training = True

    callbacks = myCallback()
    
    # This Code Block should Define and Compile the Model. Please assume the images are 150 X 150 in your implementation.
    model = tf.keras.models.Sequential([
        # Your Code Here
        tf.keras.layers.Conv2D(128, (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(32, (3,3), activation='relu'),
        tf.keras.layers.MaxPooling2D((2,2)),
        tf.keras.layers.Flatten(),
        tf.keras.layers.Dense(128, activation='relu'),
        tf.keras.layers.Dense(1, activation='sigmoid')
    ])

    from tensorflow.keras.optimizers import RMSprop

    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['acc'])
        

    # This code block should create an instance of an ImageDataGenerator called train_datagen 
    # And a train_generator by calling train_datagen.flow_from_directory

    from tensorflow.keras.preprocessing.image import ImageDataGenerator

    train_datagen = ImageDataGenerator(rescale=1./255)
#                                         featurewise_center=True,
#                                         featurewise_std_normalization=True,
#                                         rotation_range=20,
#                                         width_shift_range=0.2,
#                                         height_shift_range=0.2,
#                                         horizontal_flip=True)

    # Please use a target_size of 150 X 150.
    train_generator = train_datagen.flow_from_directory("/tmp/h-or-s",
                                                        target_size=(150, 150),
                                                        batch_size=4,
                                                        class_mode='binary')
    # Expected output: 'Found 80 images belonging to 2 classes'

    # This code block should call model.fit_generator and train for
    # a number of epochs.
    # model fitting
    history = model.fit_generator(train_generator,
                                 steps_per_epoch=20, 
                                  epochs = 20,
                                 callbacks=[callbacks])
    # model fitting
    return history.history['acc'][-1]
In [3]:
# The Expected output: "Reached 99.9% accuracy so cancelling training!""
train_happy_sad_model()
WARNING: Logging before flag parsing goes to stderr.
W1217 07:40:14.306748 140717632821056 deprecation.py:506] From /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/init_ops.py:1251: calling VarianceScaling.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.
Instructions for updating:
Call initializer instance with the dtype argument instead of passing it to the constructor
W1217 07:40:14.643880 140717632821056 deprecation.py:323] From /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/nn_impl.py:180: add_dispatch_support.<locals>.wrapper (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use tf.where in 2.0, which has the same broadcast rule as np.where
Found 80 images belonging to 2 classes.
Epoch 1/20
20/20 [==============================] - 5s 236ms/step - loss: 0.4519 - acc: 0.7750
Epoch 2/20
20/20 [==============================] - 1s 25ms/step - loss: 0.3110 - acc: 0.8875
Epoch 3/20
20/20 [==============================] - 1s 25ms/step - loss: 0.1120 - acc: 0.9500
Epoch 4/20
20/20 [==============================] - 0s 25ms/step - loss: 0.1642 - acc: 0.9250
Epoch 5/20
20/20 [==============================] - 0s 25ms/step - loss: 0.2693 - acc: 0.9125
Epoch 6/20
20/20 [==============================] - 1s 30ms/step - loss: 0.0761 - acc: 0.9750
Epoch 7/20
20/20 [==============================] - 1s 25ms/step - loss: 0.1518 - acc: 0.9750
Epoch 8/20
20/20 [==============================] - 1s 25ms/step - loss: 0.0129 - acc: 1.0000
Out[3]:
1.0
In [4]:
# Now click the 'Submit Assignment' button above.
# Once that is complete, please run the following two cells to save your work and close the notebook
In [ ]:
%%javascript
<!-- Save the notebook -->
IPython.notebook.save_checkpoint();
In [ ]:
%%javascript
IPython.notebook.session.delete();
window.onbeforeunload = null
setTimeout(function() { window.close(); }, 1000);