Keras tutorial - Emotion Detection in Images of Faces

Welcome to the first assignment of week 2. In this assignment, you will:

  1. Learn to use Keras, a high-level neural networks API (programming framework), written in Python and capable of running on top of several lower-level frameworks including TensorFlow and CNTK.
  2. See how you can in a couple of hours build a deep learning algorithm.

Why are we using Keras?

Updates

If you were working on the notebook before this update...

List of updates

Load packages

Note: As you can see, we've imported a lot of functions from Keras. You can use them by calling them directly in your code. Ex: X = Input(...) or X = ZeroPadding2D(...).

In other words, unlike TensorFlow, you don't have to create the graph and then make a separate sess.run() call to evaluate those variables.

1 - Emotion Tracking

To build and train this model, you have gathered pictures of some volunteers in a nearby neighborhood. The dataset is labeled.

Run the following code to normalize the dataset and learn about its shapes.

Details of the "Face" dataset:

2 - Building a model in Keras

Keras is very good for rapid prototyping. In just a short time you will be able to build a model that achieves outstanding results.

Here is an example of a model in Keras:

def model(input_shape):
    """
    input_shape: The height, width and channels as a tuple.  
        Note that this does not include the 'batch' as a dimension.
        If you have a batch like 'X_train', 
        then you can provide the input_shape using
        X_train.shape[1:]
    """

    # Define the input placeholder as a tensor with shape input_shape. Think of this as your input image!
    X_input = Input(input_shape)

    # Zero-Padding: pads the border of X_input with zeroes
    X = ZeroPadding2D((3, 3))(X_input)

    # CONV -> BN -> RELU Block applied to X
    X = Conv2D(32, (7, 7), strides = (1, 1), name = 'conv0')(X)
    X = BatchNormalization(axis = 3, name = 'bn0')(X)
    X = Activation('relu')(X)

    # MAXPOOL
    X = MaxPooling2D((2, 2), name='max_pool')(X)

    # FLATTEN X (means convert it to a vector) + FULLYCONNECTED
    X = Flatten()(X)
    X = Dense(1, activation='sigmoid', name='fc')(X)

    # Create model. This creates your Keras model instance, you'll use this instance to train/test the model.
    model = Model(inputs = X_input, outputs = X, name='HappyModel')

    return model

Variable naming convention

Objects as functions

Exercise: Implement a HappyModel().

Note: Be careful with your data's shapes. Use what you've learned in the videos to make sure your convolutional, pooling and fully-connected layers are adapted to the volumes you're applying it to.

You have now built a function to describe your model. To train and test this model, there are four steps in Keras:

  1. Create the model by calling the function above

  2. Compile the model by calling model.compile(optimizer = "...", loss = "...", metrics = ["accuracy"])

  3. Train the model on train data by calling model.fit(x = ..., y = ..., epochs = ..., batch_size = ...)

  4. Test the model on test data by calling model.evaluate(x = ..., y = ...)

If you want to know more about model.compile(), model.fit(), model.evaluate() and their arguments, refer to the official Keras documentation.

Step 1: create the model.

Hint:
The input_shape parameter is a tuple (height, width, channels). It excludes the batch number.
Try X_train.shape[1:] as the input_shape.

Step 2: compile the model

Hint:
Optimizers you can try include 'adam', 'sgd' or others. See the documentation for optimizers
The "happiness detection" is a binary classification problem. The loss function that you can use is 'binary_cross_entropy'. Note that 'categorical_cross_entropy' won't work with your data set as its formatted, because the data is an array of 0 or 1 rather than two arrays (one for each category). Documentation for losses

Step 3: train the model

Hint:
Use the 'X_train', 'Y_train' variables. Use integers for the epochs and batch_size

Note: If you run fit() again, the model will continue to train with the parameters it has already learned instead of reinitializing them.

Step 4: evaluate model

Hint:
Use the 'X_test' and 'Y_test' variables to evaluate the model's performance.

Expected performance

If your happyModel() function worked, its accuracy should be better than random guessing (50% accuracy).

To give you a point of comparison, our model gets around 95% test accuracy in 40 epochs (and 99% train accuracy) with a mini batch size of 16 and "adam" optimizer.

Tips for improving your model

If you have not yet achieved a very good accuracy (>= 80%), here are some things tips:

Note: If you perform hyperparameter tuning on your model, the test set actually becomes a dev set, and your model might end up overfitting to the test (dev) set. Normally, you'll want separate dev and test sets. The dev set is used for parameter tuning, and the test set is used once to estimate the model's performance in production.

3 - Conclusion

Congratulations, you have created a proof of concept for "happiness detection"!

Key Points to remember

  1. Create
  2. Compile
  3. Fit/Train
  4. Evaluate/Test

4 - Test with your own image (Optional)

Congratulations on finishing this assignment. You can now take a picture of your face and see if it can classify whether your expression is "happy" or "not happy". To do that:

  1. Click on "File" in the upper bar of this notebook, then click "Open" to go on your Coursera Hub.
  2. Add your image to this Jupyter Notebook's directory, in the "images" folder
  3. Write your image's name in the following code
  4. Run the code and check if the algorithm is right (0 is not happy, 1 is happy)!

The training/test sets were quite similar; for example, all the pictures were taken against the same background (since a front door camera is always mounted in the same position). This makes the problem easier, but a model trained on this data may or may not work on your own data. But feel free to give it a try!

5 - Other useful functions in Keras (Optional)

Two other basic features of Keras that you'll find useful are:

Run the following code.