后端backend及其对应的方法

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 实现

1
2
3
4
def prod(x, axis=None, keepdims=False):
if isinstance(axis, list):
axis = tuple(axis)
return np.prod(x, axis=axis, keepdims=keepdims)

具体例子:

1
2
3
4
5
6
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。

具体例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> 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下标的张量。

例如:

1
2
3
4
5
6
7
8
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:张量的名字(可选)

示例:

1
2
3
4
5
6
7
8
9
10
>>> 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: 占位符张量的阶数,要初始化一个占位符,至少指定shapendim之一,如果都指定则使用shape
  • dtype: 占位符数据类型
  • name: 占位符名称(可选)

示例:

1
2
3
4
5
6
>>> 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


> 功能:返回一个张量的符号shape,符号shape的意思是返回值本身也是一个tensor,

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> 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

示例:

1
2
3
4
5
6
7
8
>>> 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


> 功能:返回张量的阶数,为整数

示例:

1
2
3
4
5
6
7
8
>>> 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)

功能:返回张量的数据类型,为字符串

示例:

1
2
3
4
5
6
7
8
>>> 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


> 功能:求得张量的值,返回一个 **Numpy array**

示例:

1
2
3
4
5
>>> 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
1
2
3
4
5
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张量 > > 生成一个单位矩阵 示例:
1
2
3
4
5
6
7
>>> 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)

功能:求两个张量的乘积

示例:

1
2
3
4
5
>>> 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)的主对角元素,此过程中我们没有计算过反对角元素的值

示例:

1
2
3
4
5
>>> 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


> 功能:张量转置,返回转置后的tensor

示例:

1
2
3
4
5
6
7
8
9
>>> 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 ```K.max(x, axis=None, keepdims=False)

K.min(x, axis=None, keepdims=False)

K.sum(x, axis=None, keepdims=False)

K.prod(x, axis=None, keepdims=False)

功能:

  • 求张量中的最大值
  • 求张量中的最小值
  • 在给定轴上计算张量中元素之和
  • 在给定轴上计算张量中元素之积

十七、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.

功能:

示例:

1

参考


keras后端引擎K及其方法
http://example.com/2019/12/02/2019-12-02-keras后端引擎K及其方法/
作者
NSX
发布于
2019年12月2日
许可协议