Keras教程

在此作业中,你将:

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

我们为什么要使用Keras?开发Keras的目的是使深度学习工程师能够快速构建和实验不同的模型。正如TensorFlow是一个比Python跟高级的框架一样,Keras是一个甚至更高层的框架,能够以最小的延迟将想法付诸实践是找到良好模型的关键。但是,Keras比低级框架更具限制性,因此可以在TensorFlow中实现一些非常复杂的模型,而在Keras中实现这些模型较为困难。话虽如此,Keras仍可以在许多常见模型上正常工作。

在本练习中,你将解决"the Happy House"问题,我们将在下面进行解释。

import numpy as np
# import tensorflow as tf
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
Using TensorFlow backend.

注意:如你所见,我们从Keras导入了许多函数。你可以在笔记本中直接调用他们;

例如:X = Input(...)X = ZeroPadding2D(...)

1 The Happy House 挑战

你决定与五个朋友在下个假期一起度过一星期。你们来道一个非常方便的房子,附近有好多事情可以做。但是最重要的好处是,每个人在家里时都承诺要快乐。因此,任何想要进入房屋的人都必须证明自己目前的幸福状态。

作为一名深度学习专家,要确保严格执行“Happy”规则,你将要构建一种算法,改算法使用前门摄像头中的图片来检查该人是否快乐。仅当该人感到高兴时,门才应打开。

你已经通过门前摄像头收集了你的朋友和你自己的照片。数据集是附带标签的。

运行以下代码以标准化数据集并查看其维度。

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.Tprint ("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张图片

现在该解决"Happy"挑战了。

2 在Keras中建立模型

Keras非常适合快速制作原型,你可以在很短的时间内,建立一个能够获得出色结果的模型。

这是Keras中的模型构建示例:

def model(input_shape):# 将输入占位符定义为形状为input_shape的张量。请将此视为您的输入图像!X_input = Input(input_shape)# 零填充:用零填充X_input的边界X = ZeroPadding2D((3, 3))(X_input)# CONV -> BN -> RELU 应用于 X X = Conv2D(32, (7, 7), strides = (1, 1), name = 'conv0')(X)X = BatchNormalization(axis = 3, name = 'bn0')(X)X = Activation('relu')(X)# MAXPOOLX = MaxPooling2D((2, 2), name = 'max_pool')(X)# Flatten X (意思是把它转换成一个向量) + 全连接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不同。不是在正向传播的每个步骤上创建和分配新变量,例如X,Z1,A1,Z2,A2等,以用于不同层的计算,Keras代码上面的每一行只使用X=...将X重新分配给新值。换句话说,在正向传播的每个步骤中,我们只是将计算中的最新值写入相同的变量X。唯一的例外是X_input,我们将其分开并没有覆盖,因为我们最终需要它来创建Keras模型实例(上面的model = Model(inputs = X_input, ...))。

练习:实现一个HappyModel()。我们建议你首先使用我们建议的结构来实现模型,然后再使用该模型作为初始模型来完成本任务的其余部分。之后请返回并主动尝试其他模型结构。例如,你可能会从上面的模型中获得启发,但是随后根据需要更改网络体系结构和超参数,你还可以使用其他函数,例如AveragePooling2D(), GlobalMaxPooling2D(), Dropout()

注意:注意数据的维度。利用你再视频中学到的知识,确保卷积、池化和全连接层适用。

def HappyModel(input_shape):# 你可以随意使用上面提到的提纲开始练习,并一次完成整个练习(包括本笔记后面的部分)。这次回归还尝试了其他网络架构。X_input = Input(shape=input_shape)X = ZeroPadding2D(padding=(1, 1))(X_input)X = Conv2D(8, kernel_size=(3,3), strides=(1,1))(X)X = BatchNormalization(axis=3)(X)X = Activation('relu')(X)X = MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='valid')(X)X = ZeroPadding2D(padding=(1, 1))(X)X = Conv2D(16, kernel_size=(3,3), strides=(1,1))(X)X = BatchNormalization(axis=3)(X)X = Activation('relu')(X)X = MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='valid')(X)X = ZeroPadding2D(padding=(1, 1))(X)X = Conv2D(32, kernel_size=(3,3), strides=(1,1))(X)X = BatchNormalization(axis=3)(X)X = Activation('relu')(X)X = MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='valid')(X)# FCX = Flatten()(X)Y = Dense(1, activation='sigmoid')(X)model = Model(inputs = X_input, outputs = Y, name='HappyModel')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 documentation

练习:第一步,创建模型

happyModel = HappyModel((64, 64, 3))

练习:实施第二步,编译模型以配置学习过程。正确选择compile()的3个参数。

提示:“快乐挑战”是一个二进制分类问题。

import keras
happyModel.compile(optimizer = keras.optimizers.Adam(lr = 0.001, beta_1 = 0.9, beta_2 = 0.999, epsilon = 1e-08, decay = 0.0), loss = 'binary_crossentropy', metrics = ['accuracy'])

练习:实施第三步,训练模型。选择epoch和批次大小。

happyModel.fit(x = X_train, y = Y_train, batch_size = 16, epochs = 20)
Epoch 1/20
600/600 [==============================] - 2s 4ms/step - loss: 0.0043 - accuracy: 1.0000
Epoch 2/20
600/600 [==============================] - 2s 4ms/step - loss: 0.0073 - accuracy: 0.9983
Epoch 3/20
600/600 [==============================] - 2s 4ms/step - loss: 0.0052 - accuracy: 0.9983
Epoch 4/20
600/600 [==============================] - 2s 4ms/step - loss: 0.0042 - accuracy: 1.0000
Epoch 5/20
600/600 [==============================] - 2s 4ms/step - loss: 0.0030 - accuracy: 1.0000
Epoch 6/20
600/600 [==============================] - 2s 4ms/step - loss: 0.0031 - accuracy: 1.0000
Epoch 7/20
600/600 [==============================] - 2s 4ms/step - loss: 0.0054 - accuracy: 1.0000
Epoch 8/20
600/600 [==============================] - 2s 4ms/step - loss: 0.0054 - accuracy: 0.9983
Epoch 9/20
600/600 [==============================] - 2s 4ms/step - loss: 0.0030 - accuracy: 1.0000
Epoch 10/20
600/600 [==============================] - 2s 4ms/step - loss: 0.0040 - accuracy: 0.9983
Epoch 11/20
600/600 [==============================] - 2s 4ms/step - loss: 0.0023 - accuracy: 1.0000
Epoch 12/20
600/600 [==============================] - 2s 4ms/step - loss: 0.0019 - accuracy: 1.0000
Epoch 13/20
600/600 [==============================] - 2s 4ms/step - loss: 0.0014 - accuracy: 1.0000
Epoch 14/20
600/600 [==============================] - 2s 4ms/step - loss: 0.0012 - accuracy: 1.0000
Epoch 15/20
600/600 [==============================] - 2s 4ms/step - loss: 0.0013 - accuracy: 1.0000
Epoch 16/20
600/600 [==============================] - 2s 4ms/step - loss: 0.0012 - accuracy: 1.0000
Epoch 17/20
600/600 [==============================] - 2s 4ms/step - loss: 0.0011 - accuracy: 1.0000
Epoch 18/20
600/600 [==============================] - 2s 4ms/step - loss: 0.0012 - accuracy: 1.0000
Epoch 19/20
600/600 [==============================] - 2s 4ms/step - loss: 0.0011 - accuracy: 1.0000
Epoch 20/20
600/600 [==============================] - 2s 4ms/step - loss: 0.0011 - accuracy: 1.0000<keras.callbacks.callbacks.History at 0x27d0ddb8208>

请注意,如果再次运行fit()model将继续使用已经学习的参数进行训练,而不是重新初始化它们。

练习:实施第四步,测试/评估模型。

preds = happyModel.evaluate(x = X_test, y = Y_test)
print()
print ("Loss = " + str(preds[0]))
print ("Test Accuracy = " + str(preds[1]))
150/150 [==============================] - 0s 2ms/stepLoss = 0.06309129178524017
Test Accuracy = 0.9733333587646484

如果你的happyModel()函数起作用,在训练和测试集上的测试结果应该比随机猜测(50%)更好。要通过此作业,你必须至少达到75%的准确性。

为了给你提供一个比较点,我们的模型在batch size为16个和adam优化器的情况下,在40个epoch内获得了95%的测试准确度(和99%的训练准确度)。但是我们的模型仅需2-5个epoch即可获得不错的准确性,因此,如果你要比较不同的模型,则还可以在几个epoch上训练各种模型,并观察比较它们。

如果你尚未达到75%的准确度,可以尝试以下方法来达到此目的:

  • 尝试使用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)
    
  • 你可以在此模块之后使用MAXPOOL。这将帮助你降低高度和宽度尺寸。
  • 更改优化器。我们发现Adam行之有效。
  • 如果模型运行困难,并且遇到内存问题,请降低batch_size(例如12)
  • 运行更多epoch,直到看到训练精度达到稳定。

即使你已达到75%的准确性,也可以调整模型,尝试获得更好的结果。

注意:如果你调整模型超参数,则测试集实际上将成为开发集,并且你的模型最终可能会过拟合测试(开发)集。但仅出于此作业的目的,我们在此无需担心。

3 结论

现在,你只需要将此模型连接到房屋的前门摄像头即可。

我们希望你从这项作业中记住什么

  • Keras是我们建议用于快速制作模型的工具。它使你可以快速尝试不同的模型架构。你有想用Keras实现日常生活中任何深度学习的应用吗?
  • 记住如何在Keras中编码模型以及完成在测试集上评估模型的四个步骤。创建->编译->调整/训练->评估/测试。

4 使用你自己的图像进行测试

现在,你可以拍张照片,看看是否可以进入快乐之家。要做到这一点:

  1. 单击此笔记本上部栏中的"File",然后单击"Open"以在Coursera Hub上运行。
  2. 将图像添加到Jupyter Notebook的目录中,在"images"文件夹中
  3. 在以下代码中写下你的图片名称
  4. 运行代码并检查算法是否正确(0表示unhappy,1表示happy)!

训练/测试集非常相似。例如,所有图片都是在相同背景下拍摄的(因为前门摄像头始终安装在同一位置)。这使问题变得更容易,但是根据该数据训练的模型也可能无法在你自己的数据上工作。但是,可以尝试一下!

img_path = 'images/smail01.png'img = image.load_img(img_path, target_size=(64, 64))
imshow(img)x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)print(happyModel.predict(x))
[[1.]]

5 Keras中的其他有用函数

你会发现Keras中其他两个有用的基本功能是:

  • model.summary():以表格形式打印每层输入输出的详细信息
  • plot_model():绘制图形,如果你想在社交媒体上共享它,可以使用SVG()将其另存为“ .png”,它保存在笔记本计算机上方栏中的"File"然后"Open…" 中。
happyModel.summary()
Model: "HappyModel"
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
input_2 (InputLayer)         (None, 64, 64, 3)         0
_________________________________________________________________
zero_padding2d_4 (ZeroPaddin (None, 66, 66, 3)         0
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 64, 64, 8)         224
_________________________________________________________________
batch_normalization_4 (Batch (None, 64, 64, 8)         32
_________________________________________________________________
activation_4 (Activation)    (None, 64, 64, 8)         0
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 32, 32, 8)         0
_________________________________________________________________
zero_padding2d_5 (ZeroPaddin (None, 34, 34, 8)         0
_________________________________________________________________
conv2d_5 (Conv2D)            (None, 32, 32, 16)        1168
_________________________________________________________________
batch_normalization_5 (Batch (None, 32, 32, 16)        64
_________________________________________________________________
activation_5 (Activation)    (None, 32, 32, 16)        0
_________________________________________________________________
max_pooling2d_5 (MaxPooling2 (None, 16, 16, 16)        0
_________________________________________________________________
zero_padding2d_6 (ZeroPaddin (None, 18, 18, 16)        0
_________________________________________________________________
conv2d_6 (Conv2D)            (None, 16, 16, 32)        4640
_________________________________________________________________
batch_normalization_6 (Batch (None, 16, 16, 32)        128
_________________________________________________________________
activation_6 (Activation)    (None, 16, 16, 32)        0
_________________________________________________________________
max_pooling2d_6 (MaxPooling2 (None, 8, 8, 32)          0
_________________________________________________________________
flatten_2 (Flatten)          (None, 2048)              0
_________________________________________________________________
dense_2 (Dense)              (None, 1)                 2049
=================================================================
Total params: 8,305
Trainable params: 8,193
Non-trainable params: 112
_________________________________________________________________

dense_2 (Dense)              (None, 1)                 2049
=================================================================
Total params: 8,305
Trainable params: 8,193
Non-trainable params: 112
_________________________________________________________________

Python吴恩达深度学习作业13 -- Keras教程相关推荐

  1. Python吴恩达深度学习作业16 -- 人脸识别

    人脸识别 - the Happy House 在此次作业中,你将学习构建人脸识别系统. 人脸识别问题通常分为两类: 人脸验证:比如在某些机场,系统通过扫描你的护照,然后确认你(携带护照的人)是本人,从 ...

  2. Python吴恩达深度学习作业20 -- 用LSTM网络创作一首爵士小歌

    用LSTM网络创作一首爵士小歌 在本次作业中,你将使用LSTM实现乐曲生成模型.你可以在作业结束时试听自己创作的音乐. 你将学习: 将LSTM应用于音乐生成. 通过深度学习生成自己的爵士乐曲. fro ...

  3. Python吴恩达深度学习作业24 -- 语音识别关键字

    关键字语音识别 在本周的视频中,你学习了如何将深度学习应用于语音识别.在此作业中,你将构建语音数据集并实现用于关键词检测(有时也称为唤醒词或触发词检测)的算法.关键词识别是一项技术,可让诸如Amazo ...

  4. Python吴恩达深度学习作业4 -- 构建深度神经网络

    逐步构建你的深度神经网络 在此之前你已经训练了一个2层的神经网络(只有一个隐藏层).本周,你将学会构建一个任意层数的深度神经网络! 在此作业中,你将实现构建深度神经网络所需的所有函数. 在下一个作业中 ...

  5. Python吴恩达深度学习作业22 -- Emoji表情情感分类器

    Emojify! 此次你将使用单词向量表示来构建Emojifier表情符号. 你是否曾经想过让短信更具表现力?你的emojifier应用程序将帮助你做到这一点.因此,与其写"恭喜晋升!有机会 ...

  6. 吴恩达深度学习作业(week2)-(1)

    出发 作业地址https://github.com/robbertliu/deeplearning.ai-andrewNG 视频,bilibili吴恩达深度学习. 推荐食用方式 def basic_s ...

  7. 吴恩达深度学习作业编程1【识别猫片】

    1.jumpyter基本操作 shift+enter执行程序 2.向量化和非向量化的区别 import numpy as np a=np.array([1,2,3,4])#创建一个数组 print(a ...

  8. 吴恩达深度学习作业之deepleraning_L1W2_h1

    #吴恩达<深度学习>L1W2作业1 知识点:numpy入门,函数向量化实现 ''' 做完这个作业,你能学会:用ipython notebook 用numpy,包括函数调用及向量矩阵运算 理 ...

  9. 吴恩达深度学习 —— 2.13 逻辑回归的向量化

    我们先回顾逻辑回归的正向传播过程,如果有m个训练样本,对第一个样本进行预测,需要计算出z,并计算激活函数,计算第一个样本的y^\hat{y}y^​,如下所示:z(1)=wT∗x(1)+bz^{(1)} ...

最新文章

  1. [转载].Freescale.伦德全 - 电路板级的电磁兼容设计
  2. 第四周课程总结及实验报告
  3. mysql 日志丢失_失而复得数据库日志文件丢失后的恢复
  4. 自定义列表字段类型(3)
  5. python模拟ajax请求_短信炸弹—用Python模拟ajax请求
  6. python内函数名加括号和不加括号的区别,python中 函数名加括号与不加括号
  7. easyui表单提交,后台获取不到值
  8. web之表单form
  9. 谷歌开源 Pigweed,用于提升嵌入式开发效率
  10. python是什么内容
  11. LED恒流驱动芯片NU9910用于LED舞台灯光驱动控制芯片拼对拼SMD802
  12. 攻防视角下的信息收集
  13. php后端学习重点是,后端开发新手/小白学习之-前后端如何交互详解和重点学习...
  14. FreeRTOS+STM32L+ESP8266+MQTT协议传输温湿度数据,控制继电器到阿里云物联网平台
  15. 关于android的Haxm报错调试问题
  16. php 系统分隔符,php脚本由哪个分隔符包围
  17. 程序员版「成语新解」,万万没想到你们竟是这样的……
  18. picker多选 vant_vant框架picker选择器形式列表,以及封装
  19. java分页类Page
  20. 计算机网络——什么是计算机网络

热门文章

  1. Java语言Switch语句详解(一)
  2. 【电气专业知识问答】问:电动机的电气性能有什么要求?
  3. 【苹果推】imessage群发条件文档(推送证书)开发工具Pushnotification
  4. http client的英文文档 牛逼
  5. 有什么好用的测量仪器尺子?手机也能其妙满足
  6. Web2.0的系统架构与六大关键问题
  7. SAP中成本估算取价与价格协议的状态关联测试
  8. 关于联想小新16pro无网络问题_雪雪专享篇(安装网卡驱动篇)
  9. MS Materials Studio 安装
  10. Spring框架学习 思维导图