吴恩达深度学习第4课CNN第2周编程作业--keras教程

程序实现目标:识别脸部图片上的表情

编程任务内容

  1. 学习使用keras(高级神经网络API),keras是python编程框架,并且能够在包括TensorFlow和CNTK在内的多个较低级框架之上运行。
  2. 了解如何在几个小时内构建深度学习算法。

加载packages

import numpy as np
from keras import layers
from keras.layers import Input, Dense, Activation, ZeroPadding2D, BatchNormalization, Flatten, Conv2D
from keras.layers import AveragePooling2D, MaxPooling2D, Dropout, GlobalMaxPooling2D, GlobalAveragePooling2D
from keras.models import Model
from keras.preprocessing import image
from keras.utils import layer_utils
from keras.utils.data_utils import get_file
from keras.applications.imagenet_utils import preprocess_input
import pydot
from IPython.display import SVG
from keras.utils.vis_utils import model_to_dot
from keras.utils import plot_model
from kt_utils import *

import keras.backend as K
K.set_image_data_format('channels_last')
import matplotlib.pyplot as plt
from matplotlib.pyplot import imshow

%matplotlib inline

注意:我们从Keras导入了很多函数。 可以通过直接在代码中调用它们来使用它们。比如:X = Input(…) 或X = ZeroPadding2D(…).

1 - 情绪追踪
使用场景:

  1. 附近的社区卫生诊所正在帮助当地居民监测他们的心理健康。
  2. 作为研究的一部分,他们要求志愿者记录全天的情绪。
  3. 为了帮助参与者更轻松地跟踪他们的情绪,要求您创建一个应用程序,该应用程序将根据志愿者为自己的面部表情拍摄的一些图片对他们的情绪进行分类。
  4. 作为概念验证,您首先需要训练模型以检测某人的情绪是“快乐”还是“不快乐”。

为了构建和训练该模型,已经收集了附近一些志愿者的照片。 数据集被标记(labeled)。

标记0和1来区分是否是笑脸

运行以下代码以标准化(normalize)数据集并了解矩阵形状。

X_train_orig, Y_train_orig, X_test_orig, Y_test_orig, classes = load_dataset()

#Normalize image vectors
X_train = X_train_orig/255.
X_test = X_test_orig/255.

#Reshape
Y_train = Y_train_orig.T
Y_test = Y_test_orig.T

print ("number of training examples = " + str(X_train.shape[0]))
print ("number of test examples = " + str(X_test.shape[0]))
print ("X_train shape: " + str(X_train.shape))
print ("Y_train shape: " + str(Y_train.shape))
print ("X_test shape: " + str(X_test.shape))
print ("Y_test shape: " + str(Y_test.shape))

输出如下
number of training examples = 600
number of test examples = 150
X_train shape: (600, 64, 64, 3)
Y_train shape: (600, 1)
X_test shape: (150, 64, 64, 3)
Y_test shape: (150, 1)

“面部”数据集的详细信息:

  • 图片的形状(64,64,3)
  • 培训:600张图片
  • 测试:150张图片

2-在Keras中建立模型
这是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:]
"""

# 将输入placeholder定义为具有input_shape形状的张量,将此视为输入图像!
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 (将X转化为向量) + FULLYCONNECTED(FC)
X = Flatten()(X)
X = Dense(1, activation='sigmoid', name='fc')(X)

# 创建模型。 这将创建Keras模型实例,将使用该实例来训练/测试模型。
model = Model(inputs = X_input, outputs = X, name='HappyModel')

return model

变量命名

  • 请注意,Keras对变量名使用的约定与我们之前在numpy和TensorFlow中使用的约定不同。不是为每个步骤和每一层创建唯一的变量名,例如X1,Z1,A1…
  • Keras在每一步都重复使用并覆盖相同的变量,如:
    X=…,
    X=…,
    X=…,
  • X_input是一个例外,我们将其区分开,因为稍后需要
    对象作为函数
  • 注意每个语句中有两对括号。 例如:
X = ZeroPadding2D((33))(X_input)

第一个是构造函数调用,该调用创建一个对象(ZeroPadding2D)。

  • 在Python中,对象可以称为函数。

搜索’python object as function,您可以阅读此博客文章Python Pandemonium。 请参阅标题为“对象作为函数”的部分。

  • 上面那行代码等效于此:
ZP = ZeroPadding2D((33))#ZP是可以作为函数调用的对象
X = ZP(X_input)

练习:实现一个HappyModel()。

  • 这个任务比大多数任务更开放。
  • 首先使用我们建议的体系结构实现模型,然后使用该模型作为您的初始模型来完成本次分配的其余部分。
  • *稍后,请返回并尝试其他模型架构。
  • 例如,您可能会从上面的模型中获得启发,但是随后根据需要更改网络体系结构和超参数。
  • 您还可以使用其他函数,例如AveragePooling2D(),GlobalMaxPooling2D(),Dropout()

注意:请注意数据的形状。 利用学到的知识,确保卷积,池化和完全连接的层适应要对其应用的volumes。

# GRADED FUNCTION: HappyModel

def HappyModel(input_shape):
    """
    Implementation of the HappyModel.
    
    Arguments:
    input_shape -- shape of the images of the dataset
        (height, width, 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:]
    Returns:
    model -- a Model() instance in Keras
    
    """

   
   
    
    ### START CODE HERE ###
    # Feel free to use the suggested outline in the text above to get started, and run through the whole
    # exercise (including the later portions of this notebook) once. The come back also try out other
    # network architectures as well. 
    
    X_input = Input(input_shape)
    X = ZeroPadding2D((3, 3))(X_input)
    X = Conv2D(32, (7, 7), strides = (1, 1), name = 'conv0')(X)
    X = BatchNormalization(axis = 3, name = 'bn0')(X)
    X = Activation('relu')(X)
    X = MaxPooling2D((2, 2), name='max_pool')(X)
    X = Flatten()(X)
    X = Dense(1, activation='sigmoid', name='fc')(X)
    model = Model(inputs = X_input, outputs = X, name='HappyModel')
    ### END CODE HERE ###
    
    return model 

现在,您已经构建了一个描述模型的函数。 为了训练和测试该模型,Keras包含四个步骤:

  1. 通过调用上面的函数创建模型
  2. 通过调用model.compile(optimizer =“ ...”,loss =“ ...”,metrics = [“accuracy”]来编译模型
  3. 通过调用model.fit(x = ...,y = ...,epochs = ...,batch_size = ...)在训练数据上训练模型
  4. 通过调用model.evaluate(x = ...,y = ...)在测试数据上测试模型

如果您想了解有关model.compile(),model.fit(),model.evaluate()及其参数的更多信息,请参考Keras官方文档
步骤1:建立模型。
提示
input_shape参数是一个元组(高度,宽度,通道channel)。 它不包括batch编号。尝试使用X_train.shape [1:]作为input_shape。(X_train.shape为(600, 64, 64, 3),是一个元组,用切片法[1:]从第1个索引开始截取,则截取的大小为(64, 64, 3),正好合适)

### START CODE HERE ### (1 line)
happyModel = HappyModel(X_train.shape[1:] )
### END CODE HERE ###

步骤2:编译模型
提示:可以尝试的optimizers包括“ adam”,“ sgd”或其他。 请参阅有关optimizers的文档
“幸福检测”是一个二进制分类问题。 您可以使用的loss function是“ binary_cross_entropy”。
请注意,“ categorical_cross_entropy”不适用于格式化的数据集,因为数据是0或1的数组,而不是两个数组(每个类别一个)。 losses参考文件

### START CODE HERE ### (1 line)
happyModel.compile(optimizer = "Adam", loss = "binary_crossentropy", metrics = ["accuracy"])
### END CODE HERE ###

步骤3:训练模型
提示:使用“ X_train”,“ Y_train”变量。 epochs和batch_size是整数
注意:如果再次运行fit(),模型将继续使用已经学习的参数进行训练,而不是重新初始化它们。

### START CODE HERE ### (1 line)
#遍历训练集40次,每一次遍历时,每组64个图片,一共600张图片
happyModel.fit(x =X_train, y = Y_train, epochs = 40, batch_size = 64)
### END CODE HERE ###
  运行结果:
Epoch 1/40
600/600 [==============================] - 13s - loss: 4.1428 - acc: 0.5150    
Epoch 2/40
600/600 [==============================] - 12s - loss: 1.7255 - acc: 0.6267    
Epoch 3/40
600/600 [==============================] - 12s - loss: 0.6038 - acc: 0.7633    
Epoch 4/40
600/600 [==============================] - 12s - loss: 0.2690 - acc: 0.8767    
Epoch 5/40
600/600 [==============================] - 12s - loss: 0.1917 - acc: 0.9200    
Epoch 6/40
600/600 [==============================] - 12s - loss: 0.1441 - acc: 0.9533    
Epoch 7/40
600/600 [==============================] - 13s - loss: 0.1372 - acc: 0.9517    
Epoch 8/40
600/600 [==============================] - 12s - loss: 0.1172 - acc: 0.9617    
Epoch 9/40
600/600 [==============================] - 12s - loss: 0.1069 - acc: 0.9650    
Epoch 10/40
600/600 [==============================] - 12s - loss: 0.1016 - acc: 0.9800    
Epoch 11/40
600/600 [==============================] - 12s - loss: 0.1060 - acc: 0.9717    
Epoch 12/40
600/600 [==============================] - 12s - loss: 0.1098 - acc: 0.9650    
Epoch 13/40
600/600 [==============================] - 12s - loss: 0.1028 - acc: 0.9683    
Epoch 14/40
600/600 [==============================] - 13s - loss: 0.0846 - acc: 0.9817    
Epoch 15/40
600/600 [==============================] - 12s - loss: 0.1014 - acc: 0.9617    
Epoch 16/40
600/600 [==============================] - 12s - loss: 0.0719 - acc: 0.9717    
Epoch 17/40
600/600 [==============================] - 13s - loss: 0.0850 - acc: 0.9650    
Epoch 18/40
600/600 [==============================] - 13s - loss: 0.0890 - acc: 0.9667    
Epoch 19/40
600/600 [==============================] - 13s - loss: 0.0532 - acc: 0.9833    
Epoch 20/40
600/600 [==============================] - 12s - loss: 0.0569 - acc: 0.9833    
Epoch 21/40
600/600 [==============================] - 13s - loss: 0.0516 - acc: 0.9850    
Epoch 22/40
600/600 [==============================] - 12s - loss: 0.0466 - acc: 0.9850    
Epoch 23/40
600/600 [==============================] - 12s - loss: 0.0448 - acc: 0.9900    
Epoch 24/40
600/600 [==============================] - 12s - loss: 0.0428 - acc: 0.9883    
Epoch 25/40
600/600 [==============================] - 12s - loss: 0.0335 - acc: 0.9917    
Epoch 26/40
600/600 [==============================] - 12s - loss: 0.0389 - acc: 0.9900    
Epoch 27/40
600/600 [==============================] - 13s - loss: 0.0438 - acc: 0.9883    
Epoch 28/40
600/600 [==============================] - 12s - loss: 0.0463 - acc: 0.9850    
Epoch 29/40
600/600 [==============================] - 13s - loss: 0.0366 - acc: 0.9883    
Epoch 30/40
600/600 [==============================] - 12s - loss: 0.0331 - acc: 0.9917    
Epoch 31/40
600/600 [==============================] - 13s - loss: 0.0341 - acc: 0.9867    
Epoch 32/40
600/600 [==============================] - 12s - loss: 0.0299 - acc: 0.9900    
Epoch 33/40
600/600 [==============================] - 12s - loss: 0.0277 - acc: 0.9900    
Epoch 34/40
600/600 [==============================] - 13s - loss: 0.0348 - acc: 0.9900    
Epoch 35/40
600/600 [==============================] - 12s - loss: 0.0331 - acc: 0.9850    
Epoch 36/40
600/600 [==============================] - 13s - loss: 0.0285 - acc: 0.9917    
Epoch 37/40
600/600 [==============================] - 12s - loss: 0.0250 - acc: 0.9900    
Epoch 38/40
600/600 [==============================] - 12s - loss: 0.0239 - acc: 0.9950    
Epoch 39/40
600/600 [==============================] - 12s - loss: 0.0249 - acc: 0.9933    
Epoch 40/40
600/600 [==============================] - 13s - loss: 0.0230 - acc: 0.9933    
<keras.callbacks.History at 0x7f130a8b8710>
        ↑准确率99.33%   损失0.023

步骤4:评估模型
提示:使用’X_test’和’Y_test’变量评估模型的性能。

### START CODE HERE ### (1 line)
preds = happyModel.evaluate(x = X_test, y = Y_test)
### END CODE HERE ###
print()
print ("Loss = " + str(preds[0]))
print ("Test Accuracy = " + str(preds[1]))
    运行结果:
150/150 [==============================] - 1s     

Loss = 0.140935474833
Test Accuracy = 0.940000003974
           ↑准确率94%    损失0.141

预期表现
如果happyModel()函数起作用,则其准确性应优于随机猜测(50%的准确性)。为了给一个参考,我们的模型在40个时期内获得了大约95%的测试准确度(以及99%的训练集准确度),其中最小批量大小为16,并且使用了“ adam”优化程序。

改善模型的tips
如果尚未达到非常好的准确性(> = 80%),那么这里有一些提示:

  • 使用CONV-> BATCHNORM-> RELU块,例如:
X = Conv2D(32, (3, 3), strides = (1, 1), name = 'conv0')(X)
X = BatchNormalization(axis = 3, name = 'bn0')(X)
X = Activation('relu')(X)

直到高度和宽度尺寸都非常小,并且通道的数量也很大(例如≈32)。然后,您可以展平volume并使用FC。

  • 在此类块之后使用MAXPOOL,帮助降低高度和宽度尺寸。
  • 更改optimizer。“ adam”效果很好。
  • 如果遇到内存问题,请降低batch_size(例如12)
  • 运行更多的epoch,直到看到训练集的精度不再提高。

注意:如果您对模型执行超参数调整,则测试集实际上会变成开发集,并且您的模型最终可能会过度适合测试(开发)集。通常,您将需要单独的开发和测试集。开发集用于参数调整,测试集用于评估模型在生产中的性能。

3-结论
恭喜,您已经创建了“幸福检测”的概念证明!

要记住的要点
Keras是我们建议用于快速 prototyping的工具。它可以让用户快速尝试不同的模型架构。
记住Keras中的四个步骤:

  1. 创建
  2. 编译
  3. 拟合/训练
  4. 评估/测试

4-使用自己的图像进行测试(选做)

5-Keras中的其他有用功能(选做)
Keras的其他两个有用的基本功能是:

model.summary():在表格中以其输入/输出的大小打印图层的详细信息
plot_model():以漂亮的布局绘制图形。

  运行以下代码。
happyModel.summary()
plot_model(happyModel, to_file='HappyModel.png')
 输出↓
 Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 64, 64, 3)         0         
_________________________________________________________________
zero_padding2d_1 (ZeroPaddin (None, 70, 70, 3)         0         
_________________________________________________________________
conv0 (Conv2D)               (None, 64, 64, 32)        4736      
_________________________________________________________________
bn0 (BatchNormalization)     (None, 64, 64, 32)        128       
_________________________________________________________________
activation_1 (Activation)    (None, 64, 64, 32)        0         
_________________________________________________________________
max_pool (MaxPooling2D)      (None, 32, 32, 32)        0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 32768)             0         
_________________________________________________________________
fc (Dense)                   (None, 1)                 32769     
=================================================================
Total params: 37,633
Trainable params: 37,569
Non-trainable params: 64

在这里插入图片描述在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值