当前位置: 代码迷 >> 综合 >> 吴恩达Deep Learning编程作业 Course4- 卷积神经网络-第二周作业:Keras tutorial-the Happy House
  详细解决方案

吴恩达Deep Learning编程作业 Course4- 卷积神经网络-第二周作业:Keras tutorial-the Happy House

热度:65   发布时间:2023-10-11 16:16:59.0

吴恩达Deep Learning编程作业 Course4- 卷积神经网络-第二周作业:Keras tutorial-the Happy House

这一周的作业我们将学习:

  1. 如何使用Keras-一个高级的神经网络API,能够运行在Tensorflow和CNTK这几个框架之上。
  2. 如何在几个小时内建立一个深度学习算法。

为什么使用Keras?
Keras能够使得我们很快的建立不同的神经网络模型。TensorFlow是一个比python高级的框架,而Keras是比TensorFlow还高级的框架,提供了额外的抽象方法。最关键的是Keras可以使你较快的从想法到实现,让你更快的找到好的模型。但是Keras的缺点是比低级框架受到更多限制,所以很多复杂的模型还是选择用TensorFlow实现而不是Keras。但是我们还是可以说在很多常见模型上Keras是比较好的。

在这个练习中,我们需要解决“Happy House”问题,我们需要下载需要的包来解决这个问题,如下所示:
代码:

import numpy as np
from keras import layers
from keras.layers import Input,Activation,ZeroPadding2D,BatchNormalization,Flatten,Conv2D
from keras.layers import AveragePooling2D,MaxPooling2D,Dropout,GlobalAveragePooling2D,GlobalMaxPool2D
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
#kt_utils文件代码放在文章最后
from Week4.Second.utils.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

1.The Happy House

题目背景:你租了一个房子,希望让每个进入的人都证明他们处于幸福、开心的状态。

看到这个题目,我们首先想到的就是建立一个深度学习模型,使用门口的摄像头获得进入者的图片,用模型检测这个人是否处于开心的状态。

假设我们已经收集了很多朋友和自己的照片,均是由门口的摄像头拍摄,且数据集经过标记。

1.1 确定数据集的属性

if __name__ == "__main__":X_train_orig, Y_train_orig, X_test_orig, Y_test_orig, classes = load_dataset()X_train = X_train_orig / 255X_test = X_test_orig / 255Y_train = Y_train_orig.TY_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))

运行结果:
吴恩达Deep Learning编程作业 Course4- 卷积神经网络-第二周作业:Keras tutorial-the Happy House

2. 使用Keras建立模型

使用keras建立模型的例子:
代码:

def model(input_shape):#1.定义一个输入数据向量,相当于tensor占位符X_input = Input(input_shape)#2.Zero_paddingX = ZeroPadding2D((3, 3))(X_input)#3. Conv -> BN -> RELU Block applied to XX = Conv2D(32, (7, 7), strides=(1, 1), name='conv0')(X)#axis的值取决于按照qnput的哪一个维度进行BN,如果输入为channel_last,[height, width, channel]则axis = 3X = BatchNormalization(axis=3, name='bn0')(X)X = Activation('relu')(X)#4.MaxPOOLX = MaxPooling2D((2, 2), name='max_pool')#5.Flatten X + FullyConnectedX = Flatten()(X)X = Dense(1, activation='sigmoid', name='fc')(X)model = Model(inputs = X_input, outputs = X, name='HappyModel')return model

从上面的例子我们可以看出,Keras将我们建立模型的过程简化了很多,接下来我么就利用Kera来完成一个HappyModel()模型的建立。

练习:实现HappyModel()。我们建议您从使用我们建议的体系结构来实现一个模型开始,然后使用这个模型作为您的初始模型来完成剩下的任务。后面你需要主动尝试其他的模型架构。例如,您可以从上面的模型中获得灵感,然后根据需要改变网络架构和超参数。你还可以使用其他函数:AveragePooling2D(), GlobalMaxPooling2D(), Dropout()
代码:

def HappyModel(input_shape):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')return model

现在我们已经建立了一个模型了,如果想要训练和测试这个模型,在Keras中需要4步。

  1. 创建模型
  2. 编译模型,model.compile(optimizer = "...", loss = "...", metrics = ["accuracy"])
  3. 使用训练数据训练模型:model.fit(x = ..., y = ..., epochs = ..., batch_size = ...)
  4. 使用测试数据测试模型:model.evaluate(x = ..., y = ...)

代码:

    #1.创建模型happyModel = HappyModel(X_train.shape[1:])#2.编译模型happyModel.compile('adam', 'binary_crossentropy', metrics=['accuracy'])#3.训练模型happyModel.fit(X_train, Y_train, epochs=40, batch_size=50)

部分运行结果截图(训练过程太长,不一一放上来了,只放第40次迭代过程):
吴恩达Deep Learning编程作业 Course4- 卷积神经网络-第二周作业:Keras tutorial-the Happy House
注意,如果再次运行fit(),模型将继续使用它已经学习过的参数进行训练,而不是重新初始化它们。

评价模型:

 #4.测试模型preds = happyModel.evaluate(X_test, Y_test, batch_size=32, verbose=1, sample_weight=None)print()print("Loss = " + str(preds[0]))print("Test Accuracy = " + str(preds[1]))

运行结果:
吴恩达Deep Learning编程作业 Course4- 卷积神经网络-第二周作业:Keras tutorial-the Happy House
如果你的准确度没有高于75%,那么可以尝试者改变模型。

  • 改变池化层的大小,减小宽度高度。
  • 换一个优化器,这里我们使用的adam。
  • 如果内存不够,模型难以运行,降低batch(通常我们会选择12)。
  • 进行更多的迭代。

总结:

  • Keras是推荐用于快速原型制作的工具。它允许我们快速尝试不同的模型架构。
  • 记住如何在Keras中编写模型,以及在测试集中对模型进行评估的四个步骤,创建->编译->适合/训练->评估/测试。

3. 用自己的图片测试模型

原始图片:
吴恩达Deep Learning编程作业 Course4- 卷积神经网络-第二周作业:Keras tutorial-the Happy House
代码:

    img_path = 'datasets/my_image.jpg'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))

运行结果:
吴恩达Deep Learning编程作业 Course4- 卷积神经网络-第二周作业:Keras tutorial-the Happy House
吴恩达Deep Learning编程作业 Course4- 卷积神经网络-第二周作业:Keras tutorial-the Happy House

4. Keras中其他非常有用的函数

  • model.summary():在表中打印各层输入/输出大小的详细信息。
  • plot_model():在一个漂亮的布局中绘制图形,我们可以使用SVG()将其保存为png格式图片。

代码:

    happyModel.summary()plot_model(happyModel, to_file='HappyModel.png')SVG(model_to_dot(happyModel).create(prog='dot', format='svg'))

运行结果:
吴恩达Deep Learning编程作业 Course4- 卷积神经网络-第二周作业:Keras tutorial-the Happy House
吴恩达Deep Learning编程作业 Course4- 卷积神经网络-第二周作业:Keras tutorial-the Happy House

工具代码

kt_utils.py

import keras.backend as K
import math
import numpy as np
import h5py
import matplotlib.pyplot as pltdef mean_pred(y_true, y_pred):return K.mean(y_pred)def load_dataset():train_dataset = h5py.File('datasets/train_happy.h5', "r")train_set_x_orig = np.array(train_dataset["train_set_x"][:]) # your train set featurestrain_set_y_orig = np.array(train_dataset["train_set_y"][:]) # your train set labelstest_dataset = h5py.File('datasets/test_happy.h5', "r")test_set_x_orig = np.array(test_dataset["test_set_x"][:]) # your test set featurestest_set_y_orig = np.array(test_dataset["test_set_y"][:]) # your test set labelsclasses = np.array(test_dataset["list_classes"][:]) # the list of classestrain_set_y_orig = train_set_y_orig.reshape((1, train_set_y_orig.shape[0]))test_set_y_orig = test_set_y_orig.reshape((1, test_set_y_orig.shape[0]))return train_set_x_orig, train_set_y_orig, test_set_x_orig, test_set_y_orig, classes
  相关解决方案