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

Posted ZSYL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识图谱深度学习:Keras 初探相关的知识,希望对你有一定的参考价值。

Keras 简介

Keras是一个由Python编写的开源人工神经网络库,可以作为Tensorflow、Microsoft-CNTK和Theano的高阶应用程序接口,进行深度学习模型的设计、调试、评估、应用和可视化

Keras在代码结构上由面向对象方法编写,完全模块化并具有可扩展性,其运行机制和说明文档有将用户体验和使用难度纳入考虑,并试图简化复杂算法的实现难度。
Keras支持现代人工智能领域的主流算法,包括前馈结构和递归结构的神经网络,也可以通过封装参与构建统计学习模型。
在硬件和开发环境方面,Keras支持多操作系统下的多GPU并行计算,可以根据后台设置转化为Tensorflow、Microsoft-CNTK等系统下的组件

Python 的深度学习库——Keras。Keras 是常见深度学习库如 Theano,Tensorflow 的高级封装,Keras 本身并不具备底层运算的能力,而是一个具备这种底层运算能力的 backend(后端)协同工作。

先行步骤

安装需要的包:

pip install tensorflow==1.13.1
pip install keras==2.1.6

关于 tensorflow 的安装,请参考详细内容 Tensorflow 2.0 最新版(2.4.1) 安装教程

Sequential 顺序模型

Keras 的核心数据结构是 model,一种组织网络层的方式。最简单的模型是 Sequential 顺序模型,它由多个网络层线性堆叠。 Sequential 模型如下所示:

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

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

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

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

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

打印模型的结构

model.summary()

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

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

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

model.predict(np.random.rand(3,16))

函数式 API

函数式 API 用于构建更加复杂的网络结构,它允许构建任意的神经网络图,如多个输入或多个输出,这是 Sequential 顺序模型无法做到的。

  • 函数式 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))

全连接层 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)

全连接层实现以下操作: output = activation(dot(input, kernel) + bias) 其中 activation 是按逐个元素计算的激活函数,kernel 是由网络层创建的权值矩阵,以及 bias 是其创建的偏置向量 (只在 use_biasTrue 时才有用)。

参数设置

  • units: 正整数,节点数,即输出空间维度。
  • activation: 激活函数。 若不指定,则不使用激活函数。
  • use_bias: 布尔值,该层是否使用偏置向量。
  • kernel_initializer: kernel 权值矩阵的初始化器。
  • bias_initializer: 偏置向量的初始化器。
  • kernel_regularizer: 运用到 kernel 权值矩阵的正则化函数。
  • bias_regularizer: 运用到偏置向的的正则化函数。
  • activity_regularizer: 运用到层的输出的正则化函数。
  • kernel_constraint: 运用到 kernel 权值矩阵的约束函数。
  • 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)

1D 卷积层的卷积核以单维度上的层输入进行卷积,以生成输出张量。 如果 use_biasTrue, 则会创建一个偏置向量并将其添加到输出中。 最后,如果 activation 不是 None,也会应用于输出。

参数设置

filters: 整数,输出空间的维度,即卷积核的数量。 kernel_size: 整数,或者单个整数表示的元组或列表,指明 1D 卷积窗口的长度。 strides: 一个整数,或者单个整数表示的元组或列表, 指明卷积的步长。 padding: "valid", "causal""same" 之一。"valid" 表示不填充。"same" 表示填充输入以使输出具有与原始输入相同的长度。 "causal" 表示因果(膨胀)卷积。 data_format: 字符串, "channels_last" (默认,TensorFlow 作为 backend 时使用) 或 "channels_first" 之一。 dilation_rate: 一个整数,或者单个整数表示的元组或列表,指定用于膨胀卷积的膨胀率。 activation: 要使用的激活函数,如未指定,则不使用激活函数。 use_bias: 布尔值,该层是否使用偏置向量。 kernel_initializer: kernel 权值矩阵的初始化器。 bias_initializer: 偏置向量的初始化器。 kernel_regularizer: 运用到 kernel 权值矩阵的正则化函数。 bias_regularizer: 运用到偏置向量的正则化函数。activity_regularizer: 运用到层输出的正则化函数。 kernel_constraint: 运用到 kernel 权值矩阵的约束函数。 bias_constraint: 运用到偏置向量的约束函数。

输入尺寸

(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

嵌入层 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)

Embedding 层用于将正整数(索引值)转换为固定尺寸的稠密向量,常用于 NLP 模型的第一层,输入数据是用词袋模型等方法提取的正整数值。

参数设置

  • input_dim: int > 0。词汇表大小, 即最大整数 index + 1。
  • output_dim: int >= 0。词向量的维度。
  • embeddings_initializer: embeddings 矩阵的初始化方法。
  • embeddings_regularizer: embeddings matrix 的正则化方法。
  • embeddings_constraint: embeddings matrix 的约束函数。
  • mask_zero: 是否把 0 看作为一个应该被遮蔽的特殊的 “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

长短期记忆网络层 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)

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_sequencesFalse,只输出序列最后一个值,为 (batch_size, units) 的 2D 张量
  • return_sequencesTrue,输出全部序列,为 (batch_size, new_feature_len,units) 的 2D 张量

例子

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

双向封装器 Bidirectional

keras.layers.Bidirectional(layer, merge_mode='concat', weights=None)

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

参数设置

  • layer: Recurrent 实例。
  • merge_mode: 前向和后向 RNN 的输出的结合模式。 为 {‘sum’, ‘mul’, ‘concat’, ‘ave’, None} 其中之一。 如果是 None,输出不会被结合,而是作为一个列表被返回。
  • weights: 要在 Bidirectional 模型中加载的初始权重

例子

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()

总结

在本实验中,我们学习了 Keras 的基本使用方法,在后续的实验中,我们将用 Keras 进行命名实体识别关系抽取的任务。

Keras 最初发行的时候,TensorFlow 还没有开源。那时的 Keras 主要使用的是 Theano 后端。2015年底 TensorFlow 开源后,Keras 才开始搭建TensorFlow 后端。如今 TensorFlowKeras 最常用的后端。特别是在 TensorFlow 2.0 发行之后,TensorFlow 2.0 删除了篇冗余API,使用 Keras 和 eager execution 轻松构建模型。因此,本教程中的 Keras 代码均可以用 tf.keras 进行无缝转换。

任重道远

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

加油!

以上是关于知识图谱深度学习:Keras 初探的主要内容,如果未能解决你的问题,请参考以下文章

知识图谱陈华钧:知识图谱与深度学习优势互补,将破解更多金融科技难题

转载KG-知识图谱初探

转载KG-知识图谱初探

40+篇必看2020综述论文《深度学习/机器学习/知识图谱/NLP/CV》大集合

50+篇必看2020综述论文《深度学习/机器学习/知识图谱/NLP/CV》大集合

重启人工智能:当深度学习遇上知识图谱