知识图谱深度学习: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_bias
为 True
时才有用)。
参数设置
- 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_bias
为 True
, 则会创建一个偏置向量并将其添加到输出中。 最后,如果 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_sequences
为 False,只输出序列最后一个值,为(batch_size, units)
的 2D 张量 - 若
return_sequences
为 True,输出全部序列,为(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 后端。如今 TensorFlow
是 Keras
最常用的后端。特别是在 TensorFlow 2.0
发行之后,TensorFlow 2.0
删除了篇冗余API,使用 Keras 和 eager execution 轻松构建模型。因此,本教程中的 Keras
代码均可以用 tf.keras
进行无缝转换。
任重道远
仅仅一篇博文,根本搞不定 Keras
加油!
以上是关于知识图谱深度学习:Keras 初探的主要内容,如果未能解决你的问题,请参考以下文章
知识图谱陈华钧:知识图谱与深度学习优势互补,将破解更多金融科技难题
40+篇必看2020综述论文《深度学习/机器学习/知识图谱/NLP/CV》大集合