- keras中的后端backend及其相关函数
- 一、K.prod
- 二、K.cast
- 三、K.expand_dims
- 三、K.squeeze
- 四、batch_gather
- 五、variable
- 六、placeholder
- 七、shape
- 八、int_shape
- 九、ndim
- 十、dtype
- 十一、eval
- 十二、zeros / ones / eye / zeros_like / ones_like
- 十三、dot
- 十四、batch_dot
- 十五、transpose
- 十六、max / min / sum / prod
- 十七、cumsum / cumprod
- 十八、reshape
- 十九、permute_dimensions
- 二十、temporal_padding
- 二十一、one-hot
- 二十二、relu / elu / softmax / … / categorical_crossentropy / …
- 参考
layout: post
title: keras后端引擎K及其方法
subtitle: 后端backend及其对应的方法
date: 2019-12-02
author: NSX
header-img: img/post-bg-ios9-web.jpg
catalog: true
tags:
- 技术
- Keras
keras中的后端backend及其相关函数
Keras 是一个模型级的库,提供了快速构建深度学习网络的模块。Keras 并不处理如张量乘法、卷积等底层操作。这些操作依赖于某种特定的、优化良好的张量操作库。Keras 依赖于处理张量的库就称为“后端引擎”。Keras 提供了多种后端引擎Theano/Tensorflow,并将其函数统一封装,使得用户可以以同一个接口调用不同后端引擎的函数。
一、K.prod
keras.backend.prod(x, axis=None, keepdims=False)
功能:在某一指定轴,计算张量中的值的乘积。
参数
- x: 张量或变量。
- axis: 一个整数需要计算乘积的轴。
- keepdims: 布尔值,是否保留原尺寸。 如果 keepdims 为 False,则张量的秩减 1。 如果 keepdims 为 True,缩小的维度保留为长度 1。
返回
- x 的元素的乘积的张量。
Numpy 实现
def prod(x, axis=None, keepdims=False):
if isinstance(axis, list):
axis = tuple(axis)
return np.prod(x, axis=axis, keepdims=keepdims)
具体例子:
import numpy as np
x=np.array([[2,4,6],[2,4,6]])
scaling = np.prod(x, axis=1, keepdims=False)
print(x)
print(scaling)
二、K.cast
keras.backend.cast(x, dtype)
功能:改变张量的数据类型 并返回。 你可以转换一个 Keras 变量,但它仍然返回一个 Keras 张量。
参数
- x: Keras 张量(或变量)。
- dtype: 字符串, (‘float16’, ‘float32’ 或 ‘float64’)。
返回
- Keras 张量,类型为 dtype。
具体例子:
>>> from keras import backend as K
>>> input = K.placeholder((2, 3), dtype='float32')
>>> input
<tf.Tensor 'Placeholder_2:0' shape=(2, 3) dtype=float32>
# It doesn't work in-place as below.
>>> K.cast(input, dtype='float16')
<tf.Tensor 'Cast_1:0' shape=(2, 3) dtype=float16>
>>> input
<tf.Tensor 'Placeholder_2:0' shape=(2, 3) dtype=float32>
# you need to assign it.
>>> input = K.cast(input, dtype='float16')
>>> input
<tf.Tensor 'Cast_2:0' shape=(2, 3) dtype=float16>
三、K.expand_dims
K.expand_dims(x, dim=-1)
功能:拓展维度,在下标为
dim
的轴上增加一维
三、K.squeeze
K.squeeze(x, axis)
功能:将下标为
axis
的一维从张量中移除
四、batch_gather
K.tf.batch_gather(params, indices)
功能
- 按index索引选择序列中的值
- 支持对张量的批量索引
主要参数:
- params:被索引的张量
- indices:一维索引张量
返回值
- 通过indices获取params下标的张量。
例如:
import tensorflow as tf
seq = [1,2,3]
idxs = [2]
idxs = K.cast(idxs, 'int32')
a = K.tf.batch_gather(seq, idxs)
with tf.Session() as sess:
print(a.eval())
五、variable
K.variable(value, dtype='float32', name=None)
功能:实例化一个张量,返回之
参数:
- value:用来初始化张量的值
- dtype:张量数据类型
- name:张量的名字(可选)
示例:
>>> from keras import backend as K
>>> val = np.array([[1, 2], [3, 4]])
>>> kvar = K.variable(value=val, dtype='float64', name='example_var')
>>> K.dtype(kvar)
'float64'
>>> print(kvar)
example_var
>>> kvar.eval()
array([[ 1., 2.],
[ 3., 4.]])
六、placeholder
K.placeholder(shape=None, ndim=None, dtype='float32', name=None)
功能:实例化一个占位符,返回之
参数:
- shape:占位符的shape(整数tuple,可能包含None)
- ndim: 占位符张量的阶数,要初始化一个占位符,至少指定
shape
和ndim
之一,如果都指定则使用shape
- dtype: 占位符数据类型
- name: 占位符名称(可选)
示例:
>>> from keras import backend as K
>>> input_ph = K.placeholder(shape=(2, 4, 5))
>>> input_ph._keras_shape
(2, 4, 5)
>>> input_ph
<tf.Tensor 'Placeholder_4:0' shape=(2, 4, 5) dtype=float32>
七、shape
K.shape(x)
功能:返回一个张量的符号shape,符号shape的意思是返回值本身也是一个tensor,
示例:
>>> from keras import backend as K
>>> tf_session = K.get_session()
>>> val = np.array([[1, 2], [3, 4]])
>>> kvar = K.variable(value=val)
>>> input = keras.backend.placeholder(shape=(2, 4, 5))
>>> K.shape(kvar)
<tf.Tensor 'Shape_8:0' shape=(2,) dtype=int32>
>>> K.shape(input)
<tf.Tensor 'Shape_9:0' shape=(3,) dtype=int32>
__To get integer shape (Instead, you can use K.int_shape(x))__
>>> K.shape(kvar).eval(session=tf_session)
array([2, 2], dtype=int32)
>>> K.shape(input).eval(session=tf_session)
array([2, 4, 5], dtype=int32)
八、int_shape
K.int_shape(x)
功能:以整数Tuple或None的形式返回张量shape
示例:
>>> from keras import backend as K
>>> input = K.placeholder(shape=(2, 4, 5))
>>> K.int_shape(input)
(2, 4, 5)
>>> val = np.array([[1, 2], [3, 4]])
>>> kvar = K.variable(value=val)
>>> K.int_shape(kvar)
(2, 2)
九、ndim
K.ndim(x)
功能:返回张量的阶数,为整数
示例:
>>> from keras import backend as K
>>> input = K.placeholder(shape=(2, 4, 5))
>>> val = np.array([[1, 2], [3, 4]])
>>> kvar = K.variable(value=val)
>>> K.ndim(input)
3
>>> K.ndim(kvar)
2
十、dtype
K.dtype(x)
功能:返回张量的数据类型,为字符串
示例:
>>> from keras import backend as K
>>> K.dtype(K.placeholder(shape=(2,4,5)))
'float32'
>>> K.dtype(K.placeholder(shape=(2,4,5), dtype='float32'))
'float32'
>>> K.dtype(K.placeholder(shape=(2,4,5), dtype='float64'))
'float64'
__Keras var
十一、eval
K.eval(x)
功能:求得张量的值,返回一个 Numpy array
示例:
>>> from keras import backend as K
>>> kvar = K.variable(np.array([[1, 2], [3, 4]]), dtype='float32')
>>> K.eval(kvar)
array([[ 1., 2.],
[ 3., 4.]], dtype=float32)
十二、zeros / ones / eye / zeros_like / ones_like
K.zeros(shape, dtype='float32', name=None)
K.ones(shape, dtype='float32', name=None)
eye(size, dtype='float32', name=None)
zeros_like(x, name=None)
ones_like(x, name=None)
功能: 生成一个全0张量 生成一个全1张量 生成一个单位矩阵
示例:
>>> from keras import backend as K
>>> kvar = K.zeros((3,4))
>>> kvar = K.ones((3,4))
>>> kvar = K.eye(3)
>>> K.eval(kvar)
>>> kvar_zeros = K.zeros_like(kvar)
十三、dot
K.dot(x, y)
功能:求两个张量的乘积
示例:
>>> x = K.placeholder(shape=(2, 3))
>>> y = K.placeholder(shape=(3, 4))
>>> xy = K.dot(x, y)
>>> xy
<tf.Tensor 'MatMul_9:0' shape=(2, 4) dtype=float32>
十四、batch_dot
K.batch_dot(x, y, axes=None)
功能:按批进行张量乘法
- 该函数用于计算x和y的点积,其中x和y都是成batch出现的数据。即它的数据shape形如
(batch_size,:)
。- batch_dot将产生比输入张量维度低的张量,如果张量的维度被减至1,则通过
expand_dims
保证其维度至少为2参数:
- x,y:阶数大于等于2的张量,在tensorflow下,只支持大于等于3阶的张量
- axes:目标结果的维度,为整数或整数列表,
axes[0]
和axes[1]
应相同例如
- 假设
x = [[1, 2],[3,4]]
,y = [[5, 6],[7, 8]]
,则batch_dot(x, y, axes=1) = [[17, 53]]
,即x.dot(y.T)
的主对角元素,此过程中我们没有计算过反对角元素的值
示例:
>>> x_batch = K.ones(shape=(32, 20, 1))
>>> y_batch = K.ones(shape=(32, 30, 20))
>>> xy_batch_dot = K.batch_dot(x_batch, y_batch, axes=[1, 2])
>>> K.int_shape(xy_batch_dot)
(32, 1, 30)
十五、transpose
K.transpose(x)
功能:张量转置,返回转置后的tensor
示例:
>>> var = K.variable([[1, 2, 3], [4, 5, 6]])
>>> K.eval(var)
array([[ 1., 2., 3.],
[ 4., 5., 6.]], dtype=float32)
>>> var_transposed = K.transpose(var)
>>> K.eval(var_transposed)
array([[ 1., 4.],
[ 2., 5.],
[ 3., 6.]], dtype=float32)
十六、max / min / sum / prod
功能:
- 求张量中的最大值
- 求张量中的最小值
- 在给定轴上计算张量中元素之和
- 在给定轴上计算张量中元素之积
十七、cumsum / cumprod
K.cumsum(x, axis=0)
cumprod(x, axis=0)
功能:
- 在给定轴上求张量的累积和
- 在给定轴上求张量的累积积
十八、reshape
K.reshape(x, shape)
功能:将张量的shape变换为指定shape
十九、permute_dimensions
K.permute_dimensions(x, pattern)
功能:按照给定的模式重排一个张量的轴
参数:
- pattern:代表维度下标的tuple如
(0, 2, 1)
二十、temporal_padding
K.temporal_padding(x, padding=1)
功能:向3D张量中间的那个维度的左右两端填充
padding
个0值
二十一、one-hot
K.one_hot(indices, nb_classes)
功能:输入为n维的整数张量,形如(batch_size, dim1, dim2, … dim(n-1)),输出为(n+1)维的one-hot编码,形如(batch_size, dim1, dim2, … dim(n-1), nb_classes)
二十二、relu / elu / softmax / … / categorical_crossentropy / …
K.
功能:
示例: