吴恩达深度神经网络笔记—Keras入门

什么是Keras

Keras是为了使深度学习工程师能够很快地建立和实验不同的模型的框架,正如TensorFlow是一个比Python更高级的框架,Keras是一个更高层次的框架,并提供了额外的抽象方法。最关键的是Keras能够以最短的时间让想法变为现实。然而,Keras比底层框架更具有限制性,所以有一些非常复杂的模型可以在TensorFlow中实现,但在Keras中却没有。
看看如何在几个小时内建立一个深入的学习算法。

导包

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入门_第1张图片

加载数据集

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)

判断是否笑脸数据集详情:

  1. 图像维度:(64,64,3)
  2. 训练集数量:600
  3. 测试集数量:150

使用Keras框架构建模型

Keras构建模型演示:

def model(input_shape):

定义一个tensor的placeholder,维度为input_shape

X_input = Input(input_shape)

使用0填充:X_input的周围填充0

X = ZeroPadding2D((3, 3))(X_input)

对X使用 CONV -> BN -> RELU 块

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框架使用的变量名和我们以前使用的numpy和TensorFlow变量不一样。它不是在前向传播的每一步上创建新变量(比如X, Z1, A1, Z2, A2,…)以便于不同层之间的计算。在Keras中,我们使用X覆盖了所有的值,没有保存每一层结果,我们只需要最新的值,唯一例外的就是X_input,我们将它分离出来是因为它是输入的数据,我们要在最后的创建模型那一步中用到。

定义happyModel

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

设计好了我们的模型了,要训练并测试模型我们需要这么做:

  1. 创建一个模型实体。
HappyModel = HappyModel(X_train.shape[1:])
  1. 编译模型,可以使用这个语句:model.compile(optimizer = “…”, loss = “…”, metrics = [“accuracy”])。
HappyModel.compile(optimizer = "adam", loss = "binary_crossentropy", metrics = ["accuracy"])
  1. 训练模型:model.fit(x = …, y = …, epochs = …, batch_size = …)。
HappyModel.fit(x = X_train, y = Y_train, epochs = 40, batch_size = 50)
  1. 评估模型:model.evaluate(x = …, y = …)。
preds = HappyModel.evaluate(x = X_test, y = Y_test)

查看结果:

print()
print ("Loss = " + str(preds[0]))
print ("Test Accuracy = " + str(preds[1]))
Loss = 0.1047554463148117
Test Accuracy = 0.9666666388511658

优化手段

你可以在每个块后面使用最大值池化层,它将会减少宽、高的维度。
改变优化器,这里我们使用的是Adam
如果模型难以运行,并且遇到了内存不够的问题,那么就降低batch_size(12通常是一个很好的折中方案)
运行更多迭代,直到看到有良好效果的时候。

你可能感兴趣的:(深度学习,python)