Keras学习指导

阿里云2000元红包!本站用户参与享受九折优惠!

前言

kears是一个基于python的深度学习框架,与tensorflow相比,keras能够更加容易的搭建各种深度学习模型,并且keras提供了丰富的API用以实现神经网络的各种功能。本篇文章将会结合笑脸检测的应用学习keras框架的使用,更多有关keras框架的学习,可以参考相关文档。

导入相关库

在实现整个模型之前,需要导入相关库,这些库主要跟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

假定,放学后,你要和你的朋友一起要度过一个假期,有一所很方便的房子,附近有很多事可以做,但是唯一的要求是,进入这所房子需要承诺一定是快乐的状态,所以,进入这所房子之前,需要一款能够识别快乐状态与否的程序。

对于此问题,用1和0表示快乐或者不快乐,具体示例如下图所示:

数据集处理

实现整个应用之前,首先需要处理数据集,具体如下所示:

整个数据集包含了750张64×64的三通道图像,为此,训练集的大小为600,测试集的大小为150,并且,加载数据集之后,需要做归一化处理,具体实现如下代码所示:


def load_dataset():
    train_dataset = h5py.File('datasets/train_happy.h5', "r")
    train_set_x_orig = np.array(train_dataset["train_set_x"][:]) # 训练集特征
    train_set_y_orig = np.array(train_dataset["train_set_y"][:]) # 训练集标签
    test_dataset = h5py.File('datasets/test_happy.h5', "r")
    test_set_x_orig = np.array(test_dataset["test_set_x"][:]) #测试集特征
    test_set_y_orig = np.array(test_dataset["test_set_y"][:]) # 测试集标签
    classes = np.array(test_dataset["list_classes"][:]) # 类别列表
    
    train_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
X_train_orig, Y_train_orig, X_test_orig, Y_test_orig, classes = load_dataset()
#归一化处理
X_train = X_train_orig/255.
X_test = X_test_orig/255.
Y_train = Y_train_orig.T
Y_test = Y_test_orig.T

利用keras构建模型

数据集处理好了之后,可以利用Keras中强大的API构建一个简单的卷积神经网络了,具体如下所示:


def HappyModel(input_shape):
    """
   
    参数:
    input_shape -- 输入图像数据集的大小
    返回值:
    model -- keras中一个模型类的实例
    """
  
    # 网络架构实现代码
#输入数据集的尺寸
    X_input = Input(shape=input_shape)
#对输入数据集进行零值填充,padding=1
    X = ZeroPadding2D(padding=(1, 1))(X_input)
#定义卷积层,过滤矩阵(卷积核)大小为3×3,步长为1
    X = Conv2D(8, kernel_size=(3,3), strides=(1,1))(X)
# 该层在每个batch上将前一层的激活值重新规范化,即使得其输出数据的均值接近0,其标准差接近1
    X = BatchNormalization(axis=3)(X)
#激活函数,选择relu
    X = Activation('relu')(X)
#实现最大池化,池化大小为2×2,步长为2
    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)
    
    # 全连接层
    X = Flatten()(X)
#输出层,激活函数选择sigmoid
    Y = Dense(1, activation='sigmoid')(X)
    
    model = Model(inputs = X_input, outputs = Y, name='HappyModel')
    return model

注意:构建模型时用到了BatchNormalization()函数,该函数的具体作用如下:

  • 加速收敛;
  • 控制过拟合,可以少用或不用Dropout和正则化;
  • 降低网络对初始化权重不敏感 ;
  • 允许使用较大的学习率。
    关于该函数的更多介绍,可以查看相关文档。

编译模型

搭建好模型之后,在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'])

在模型的编译中,可以很方便的实现一些参数的设置,如学习率,优化算法及其优化算法的参数,损失函数等。

拟合模型

在keras中,编译后的模型,需要拟合,并且在拟合的过程中设置迭代次数和批量大小,具体实现,如下所示:


happyModel.fit(x=X_train, y=Y_train, batch_size=16, epochs=20)

拟合模型的过程中,可以看到每一次迭代过程中的信息,具体如下所示:

评估模型

利用训练集拟合模型之后,就可以利用测试集评估模型了,具体代码如下所示:


preds = happyModel.evaluate(x=X_test, y=Y_test)
print()
print ("Loss = " + str(preds[0]))  #第一个参数,损失
print ("Test Accuracy = " + str(preds[1]))# 第二个参数,测试集精确度

模型预测

训练好之后的模型,可以利用直接利用训练集得到的参数进行预测了,具体如下所示:

keras的其他用法

  • 输出模型的信息
    在keras中,可以很容易的输出模型训练完毕之后的一些基本信息,如下所示:

happyModel.summary()

  • 输出模型结构
    keras结合pydot包,可以很方便的输出模型的整体结构,具体如下所示:

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

注意:pydot包的安装,由于版本问题,会遇到很多困难,可以参考如下文章:
pydot的安装方法

总结

利用keras实现深度学习模型时,主要分为以下几个步骤:

  1. 搭建模型
  2. 编译模型
  3. 拟合模型
  4. 评估模型
  5. 模型预测

https://www.jianshu.com/p/2e4f6eb7b6b4

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论