Advertisement

【知识图谱】深度学习:Keras 初探

阅读量:

Keras 初步

*Keras 是一种基于 TensorFlow 平台的高级深度学习框架。
在使用 Keras 前,请确保已安装并正确配置 TensorFlow 环境。
在 Keras 中实现神经网络模型通常分为几个关键步骤。
首先需要理解 Keras 中的基本概念和术语。
其次要掌握如何使用 Sequential 类进行模型组织。
此外还需要熟悉 Functional API 的基本用法。
了解如何定义和使用全连接层结构(Dense Layer)至关重要。
对于图像处理任务则需要掌握一维卷积操作(Conv1D)的应用方法。
嵌入层的主要作用是将输入数据映射至向量空间表示。
在处理序列数据时应了解长短时记忆单元(LSTM Units)的工作原理。
通过这些基本组件可以逐步构建复杂的深度学习架构。
完成项目后请记得保存并提交代码以便后续调试和验证。

Keras 简介

Keras是一个基于Python设计的开放源代码的人工神经网络框架,在深度学习领域具有重要地位。它不仅提供了针对Tensorflow、Microsoft-CNTK以及Theano等应用的高级API接口,并且能够有效支持从模型设计到调试、评估、应用以及可视化的完整流程。

在代码架构上(软件系统设计上),Keras采用面向对象的方法进行开发,并遵循高度可扩展的设计理念。该系统的工作原理及文档说明充分考虑到了用户体验与操作复杂度问题,并致力于降低实现复杂度。
该平台集成了当前人工智能领域的主要技术路线(如前馈神经网络及其递归架构),并且能够方便地融入各种统计学习模型构建过程。
在硬件配置方面(运算环境设置上),Keras支持多种操作系统环境下的多GPU并行计算,并根据具体需求可以选择性地转换至Tensorflow、Microsoft-CNTK等框架组件。

Python 中的深度学习库是 Keras。作为常见深度学习框架中的高级封装模块,在Theano和Tensorflow的基础上开发而来。虽然自身不具备底层运算功能,并不具备直接执行基础计算的能力, 但其主要功能体现在与 backend 协同工作的这一特性上。

先行步骤

安装需要的包:

复制代码
    pip install tensorflow==1.13.1
    pip install keras==2.1.6
    
    
      
      
    
    AI助手

涵盖 TensorFlow 的安装过程,请查阅详细信息 Tensorflow 2.0 最新版(2.4.1) 安装教程

Sequential 顺序模型

Keras的核心数据架构以model为基础。最基础的架构采用顺序架构设计,其主要由一系列按顺序排列的神经网络层构成。
...

复制代码
    from keras.models import Sequential  # Sequential adj. 连续的;相继的;有顺序的
    from keras.layers import Dense  # Dense:adj. 稠密的;浓厚的;愚钝的  layers:图层面板,图层集合;层面板(layer复数形式)
    import numpy as np
    # 初始化 model 
    model = Sequential()
    
    
      
      
      
      
      
    
    AI助手

初始化模型之后,就可以通过 add 方法来堆叠模型了

复制代码
    # 添加全连接层作为第一层,全连接层的节点数为64,激活函数为 relu,以(*, 16) 的数组作为输入
    model.add(Dense(units=64, activation='relu', input_shape=(16,)))
    # 添加第二个全连接层,节点数为1,激活函数为 sigmoid,在第一层之后就不需要指定输入尺寸了,Keras 会自动计算
    model.add(Dense(units=1, activation='sigmoid'))
    
    
      
      
      
      
    
    AI助手

在完成模型的构建后,使用 compile 来配置学习过程

复制代码
    model.compile(loss='binary_crossentropy', # 定义损失函数为二元交叉熵函数
              optimizer='sgd', # 梯度更新算法为随机梯度下降算法
              metrics=['accuracy']) # 模型的评估标准为精度
    
    
      
      
      
    
    AI助手

打印模型的结构

复制代码
    model.summary()
    
    
      
    
    AI助手

现在就可以用 fit 在训练数据上进行迭代了

复制代码
    # fit 方法接收的第一个数据是训练的输入数据,第二个数据为训练的期望输出数据
    model.fit(np.random.rand(32,16),np.ones(32),epochs=30, batch_size=32)
    # 训练完成后保存模型参数
    model.save('model.h5')
    
    
      
      
      
      
    
    AI助手

训练完成后,对新的数据进行预测

复制代码
    model.predict(np.random.rand(3,16))
    
    
      
    
    AI助手

函数式 API

基于函数式的接口设计能够有效支持构建复杂的网络架构。该接口不仅允许处理多种输入与输出数据,并且能够灵活配置各种神经网络层组合方式(如全连接层、卷积层等),这是传统的顺序模型框架所不具备的优势。

  • 函数式 API 中网络层的实现具有可调用性。该实现接受张量作为输入并被设计为返回一个张量。
  • 输入与输出都是张量,在构建模型时都可以用来定义。
复制代码
    from keras.layers import Input, Dense, concatenate
    from keras.models import Model
    
    # 定义第一个输入层,Input 返回一个张量
    input1 = Input(shape=(8,))
    # 同理定义第二个输入层
    input2 = Input(shape=(16,))
    
    # 定义全连接层,接收输入层为参数,并返回一个张量
    x1 = Dense(64, activation='relu')(input1)
    x2 = Dense(64, activation='relu')(input2)
    
    # 连接两个输出
    x = concatenate([x1,x2])
    
    # 定义模型输出
    output = Dense(1, activation='sigmoid')(x)
    
    # 定义模型,这里创建了一个包含两个输入和一个输出的全连接模型
    model = Model(inputs=[input1, input2], outputs=output)
    
    # 与 Sequential 相同,配置学习过程
    model.compile(loss='binary_crossentropy', optimizer='sgd', metrics=['accuracy']) 
    
    # 通过传递数组的方式进行训练
    model.fit([np.random.rand(32,8),np.random.rand(32,16)], np.ones(32))
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    AI助手

全连接层 Dense

复制代码
    keras.layers.Dense(units, activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)
    
    
      
    
    AI助手

该全连接层通过以下方式执行运算:输出结果等于激活函数作用于输入与权重矩阵点积后再加偏置的结果。其中激活函数的作用是对输入向量中的每个元素进行逐个处理。权重矩阵是在网络构造阶段预先定义好的参数。其中偏置向量仅在标志位use_bias设置为True时才会被引入到计算过程中。

参数设置

  • units代表正整数值,并指定了神经元的数量和输出空间维度。
  • activation字段定义了模型使用的激活机制。若无指定,默认情况下将不应用任何激活函数。
  • use_bias是一个布尔类型的变量,默认情况下该层将采用偏置向量;若设置为False,则将忽略偏置项。
  • kernel_initializer参数指定了权重矩阵的初始化方法;支持多种预定义初始化策略或自定义实现方式。
  • bias_initializer用于设定偏置向量的初始化方式;其作用仅限于在存在use_bias=True的情况下才被调用。
  • kernel_regularizer定义了对权重矩阵进行正则化的策略;此过程旨在防止过拟合并提升模型泛化能力。
  • bias_regularizer则是应用于偏置向量的正则化方法;通常与kernel_regularizer配合使用以达到更好的正则效果。
  • activity_regularizer用于对层输出施加额外的正则化约束;这一步骤有助于防止模型过于复杂而影响性能评估结果的质量。
  • kernel_constraint指定了权重矩阵需要满足的具体约束条件;这些约束通常与优化算法结合使用以保证训练过程的有效性。
  • bias_constraint则是对偏置向量施加了相应的限制条件;这些限制同样会在优化过程中被考虑进去以确保模型行为的一致性和稳定性。

输出尺寸

(batch_size, ..., input_dim) 的 nD 张量。

输出尺寸

(batch_size, ..., units) 的 nD 张量。

1D 卷积层 Conv1D

复制代码
    keras.layers.Conv1D(filters, kernel_size, strides=1, padding='valid', 
    data_format='channels_last', dilation_rate=1, activation=None, use_bias=True,
     kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)
    
    
      
      
      
    
    AI助手

该1D卷积层通过对其输入通道进行深度可分离卷积操作来提取特征,并将处理后的数据传递给下一层网络结构。若参数设置为True,则会对输出结果施加激活函数影响;此外,在使用bias参数时(即当use_bias=True),会创建一个偏置向量并将其添加到输出中。

参数设置

filter数量: 整数类型变量,默认情况下设置为通道数量。
卷积核宽度: 整数类型变量或单个整数表示的元组/列表,默认设置为1D卷积窗口宽度。
步长: 整数类型变量或单个整数表示的元组/列表,默认设置为卷积操作步长。
填充方式: 限定词类型变量可选值包括'valid'(无填充)、'causal'(因果卷积)或'same'(与输入相同长度输出)。
数据格式: 字符串类型变量可选值包括'channels_last'(默认)即TensorFlow默认模式下使用;以及'channels_first'等其他模式选择。
膨胀率: 整数类型变量或单个整数表示的元组/列表,默认情况下设定为空值时应用标准卷积操作。
激活函数: 指定使用的激活函数类型,默认情况下不采用任何激活函数。
偏置向量是否存在: 布尔值型变量决定该层是否采用偏置向量。
权重矩阵初始化方式: 决定权重矩阵初始化方法的相关设置。
偏置向量初始化方式: 决定偏置向量初始化方法的相关设置。
权重矩阵正则化策略: 决定权重矩阵正则化方法的相关设置。
偏置向量正则化策略: 决定偏置向量正则化方法的相关设置。
输出正则化策略: 决定层输出结果应用正则化方法的相关设置。
权重矩阵约束条件: 决定权重矩阵应用约束条件的相关设置。

输入尺寸

(batch_size, feature_len, input_dim) 的 3D 张量

输出尺寸

(batch_size, new_feature_len, filters) 的 3D 张量

例子

复制代码
    from keras.layers import Conv1D
    
    model = Sequential()
    # 模型将输入一个大小为 (batch, steps, input_dim) 的矩阵
    # 模型的输出尺度为 (batch, new_steps, filters)
    model.add(Conv1D(filters=32, kernel_size=3,input_shape=(10,12)))
    
    model.compile('rmsprop', 'mse')
    # 初始化一个 (32, 10, 12) 的矩阵 
    input_array = np.random.randn(32, 10, 12)
    output_array = model.predict(input_array)
    input_array.shape, output_array.shape
    
    
      
      
      
      
      
      
      
      
      
      
      
      
    
    AI助手

嵌入层 Embedding

复制代码
    keras.layers.Embedding(input_dim, output_dim, embeddings_initializer='uniform', 
    	embeddings_regularizer=None,activity_regularizer=None, embeddings_constraint=None, 
    	mask_zero=False, input_length=None)
    
    
      
      
      
    
    AI助手

嵌入层负责将索引值映射为固定长度的连续向量。它通常作为自然语言处理模型的基础组件,并通过技术手段处理这些数值信息。

参数设置

  • input_dim 是一个大于 0 的整数。
    该词表大小即为最大整数 index 加 1 的值。
  • output_dim 是一个大于等于零的整数。
    该数值代表词向量所具有的维度。
  • embeddings_initializer 定义着嵌入矩阵的初始化方法。
  • embeddings_regularizer 指定了嵌入矩阵使用的正则化方法。
  • embeddings_constraint 设定了嵌入矩阵需要满足的约束函数。
  • mask_zero 表示是否将索引为零的值视为特殊的 "padding" 值进行遮蔽处理。
  • input_length 表示输入序列的具体长度,在需要连接Flatten层和Dense层时此参数是必不可少的,在这种情况下Dense层输出维度也就无法确定。

输入尺寸

(batch_size, sequence_length) 的 2D 张量

输出尺寸

(batch_size, sequence_length, output_dim) 的 3D 张量

例子

复制代码
    from keras.layers import Embedding
    
    model = Sequential()
    # 模型将输入一个大小为 (batch, input_length) 的整数矩阵,输入中最大的整数(即词索引)不应该大于 999 (词汇表大小)
    # 模型的输出尺度为 (batch, 15, 8)。
    model.add(Embedding(1000, 8, input_length=15))
    
    
    model.compile('rmsprop', 'mse')
    # 初始化一个 (4,15)的随机正整数矩阵作为输入
    input_array = np.random.randint(1000, size=(4, 15))
    output_array = model.predict(input_array)
    input_array.shape, output_array.shape
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    AI助手

长短期记忆网络层 LSTM

复制代码
    keras.layers.LSTM(units, activation='tanh', recurrent_activation='hard_sigmoid', 
    use_bias=True, kernel_initializer='glorot_uniform', recurrent_initializer='orthogonal', 
    bias_initializer='zeros', unit_forget_bias=True, kernel_regularizer=None, 
    recurrent_regularizer=None, bias_regularizer=None, activity_regularizer=None, 
    kernel_constraint=None, recurrent_constraint=None, bias_constraint=None, dropout=0.0, 
    recurrent_dropout=0.0, implementation=1, return_sequences=False, return_state=False, 
    go_backwards=False, stateful=False, unroll=False)
    
    
      
      
      
      
      
      
      
    
    AI助手

LSTM 是一种特殊的 RNN ,能够学习长的依赖关系。

参数设置

  • units : 正整数,输出空间的维度。
  • activation : 要使用的激活函数。 如果传入 None,则不使用激活函数。
  • recurrent_activation : 用于循环时间步的激活函数。 默认:分段线性近似 sigmoid。如果传入 None,则不使用激活函数。
  • use_bias : 布尔值,该层是否使用偏置向量。
  • kernel_initializer : kernel 权值矩阵的初始化器, 用于输入的线性转换。
  • recurrent_initializer : recurrent_kernel 权值矩阵 的初始化器,用于循环层状态的线性转换。
  • bias_initializer :偏置向量的初始化器。
  • unit_forget_bias : 布尔值。 如果为 True,初始化时,将忘记门的偏置加 1。 将其设置为 True 同时还会强制 bias_initializer=“zeros”。
  • kernel_regularizer : 运用到 kernel 权值矩阵的正则化函数。
  • recurrent_regularizer : 运用到 recurrent_kernel 权值矩阵的正则化函数。
  • bias_regularizer : 运用到偏置向量的正则化函数。
  • activity_regularizer : 运用到层输出(它的激活值)的正则化函数。
  • kernel_constraint : 运用到 kernel 权值矩阵的约束函数。
  • recurrent_constraint : 运用到 recurrent_kernel 权值矩阵的约束函数。
  • bias_constraint : 运用到偏置向量的约束函数。
  • dropout : 在 0 和 1 之间的浮点数。 单元的丢弃比例,用于输入的线性转换。
  • recurrent_dropout : 在 0 和 1 之间的浮点数。 单元的丢弃比例,用于循环层状态的线性转换。
  • implementation : 实现模式,1 或 2。 模式 1 将把它的操作结构化为更多的小的点积和加法操作, 而模式 2 将把它们分批到更少,更大的操作中。 这些模式在不同的硬件和不同的应用中具有不同的性能配置文件。
  • return_sequences : 布尔值。是返回输出序列中的最后一个输出,还是全部序列。
  • return_state : 布尔值。除了输出之外是否返回最后一个状态。
  • go_backwards : 布尔值。默认 False,如果为 True,则向后处理输入序列并返回相反的序列。
  • stateful : 布尔值。默认 False, 如果为 True,则批次中索引 i 处的每个样品的最后状态 将用作下一批次中索引 i 样品的初始状态。
  • unroll : 布尔值。默认 False,如果为 True,则网络将展开,否则将使用符号循环。

输入尺寸

(batch_size, feature_len, input_dim) 的 3D 张量

输出尺寸

  • return_sequences被设置为False时,则模型仅返回最后一个时间步的特征向量。该特征向量的形状将形成为(batch_size, units)大小的二维张量。
    • return_sequences被设置为True时,则模型将完整地返回所有时间步上的特征向量集合。此时输出的张量形状将变为(batch_size, new_feature_len, units)

例子

复制代码
    from keras.layers import LSTM 
    
    model = Sequential()
    # 模型将输入一个大小为 (batch, feature_len, input_dim) 的矩阵
    # 模型的输出尺度为 (batch, 1000)。
    model.add(LSTM(units=1000,return_sequences=True,input_shape=(10,3)))
    model.compile('rmsprop', 'mse')
    # 初始化一个 (4, 10, 3)的随机矩阵作为输入
    input_array = np.random.randn(4, 10, 3)
    output_array = model.predict(input_array)
    input_array.shape, output_array.shape
    
    
      
      
      
      
      
      
      
      
      
      
      
    
    AI助手

双向封装器 Bidirectional

复制代码
    keras.layers.Bidirectional(layer, merge_mode='concat', weights=None)
    
    
      
    
    AI助手

RNN 的双向封装器,对序列进行前向和后向计算。

参数设置

  • :Recurrent神经网络实例。
  • 合并模式:其正向和反向递归神经网络的输出融合方式,默认设置为{'sum', 'mul', 'concat', 'ave', None}其中之一的选择项。若设置为None,则将各方向输出分别作为列表返回。
  • 权重参数:在BiRNN模型中加载的初始权重参数

例子

复制代码
    from keras.layers import Bidirectional
    
    model = Sequential()
    # 封装 LTSM 层为 Bi-LSTM
    model.add(Bidirectional(LSTM(10, return_sequences=True),
                        input_shape=(5, 10)))
    model.compile(loss='categorical_crossentropy', optimizer='rmsprop')
    # 输出模型信息
    model.summary()
    
    
      
      
      
      
      
      
      
      
      
    
    AI助手

总结

本次实验中, 我们掌握了 Keras 的基础知识;在后续实验中, 我们将负责运用 Keras 执行命名实体识别和关系抽取的任务.

在 Keras 首发时, TensorFlow 还未开源。早期版本的 Keras 主要依赖于 Theano 作为后端库。随着 TensorFlow 于2015年底开源, Keras 开始整合其后端库。如今 TensorFlow 已成为 Keras 最主要的后端选择。特别是在 TensorFlow 2.0 推出以来, TensorFlow 2.0 删除了部分冗余API,借助 Keras 和 eager execution 技术轻松构建模型变得更为便捷。因此在本教程中所有代码示例均可直接迁移至 tf.keras 模块中。

知识图谱

知识图谱

知网图谱

知识图谱

知识图谱

知识图谱

知识图谱

知识图谱

知识图谱

知识图谱

知识图谱

知识图谱

知识图谱

【知识图谱】Python.py2neo操作Neo4j

知识图谱

知识网络模型

【知识图谱】深度学习:Keras 初探

【知识图谱】命名实体识别(NLP)

【知识图谱】关系抽取与总结展望

任重道远

仅仅一篇博文,根本搞不定 Keras

加油!

全部评论 (0)

还没有任何评论哟~