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

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

具体例子:

  1. import numpy as np
  2. x=np.array([[2,4,6],[2,4,6]])
  3. scaling = np.prod(x, axis=1, keepdims=False)
  4. print(x)
  5. print(scaling)

二、K.cast

keras.backend.cast(x, dtype)

功能:改变张量的数据类型 并返回。 你可以转换一个 Keras 变量,但它仍然返回一个 Keras 张量。

参数

  • x: Keras 张量(或变量)。
  • dtype: 字符串, (‘float16’, ‘float32’ 或 ‘float64’)。

返回

  • Keras 张量,类型为 dtype。

具体例子:

  1. >>> from keras import backend as K
  2. >>> input = K.placeholder((2, 3), dtype='float32')
  3. >>> input
  4. <tf.Tensor 'Placeholder_2:0' shape=(2, 3) dtype=float32>
  5. # It doesn't work in-place as below.
  6. >>> K.cast(input, dtype='float16')
  7. <tf.Tensor 'Cast_1:0' shape=(2, 3) dtype=float16>
  8. >>> input
  9. <tf.Tensor 'Placeholder_2:0' shape=(2, 3) dtype=float32>
  10. # you need to assign it.
  11. >>> input = K.cast(input, dtype='float16')
  12. >>> input
  13. <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. import tensorflow as tf
  2. seq = [1,2,3]
  3. idxs = [2]
  4. idxs = K.cast(idxs, 'int32')
  5. a = K.tf.batch_gather(seq, idxs)
  6. with tf.Session() as sess:
  7. print(a.eval())

五、variable

K.variable(value, dtype='float32', name=None)

功能:实例化一个张量,返回之

参数:

  • value:用来初始化张量的值
  • dtype:张量数据类型
  • name:张量的名字(可选)

示例:

  1. >>> from keras import backend as K
  2. >>> val = np.array([[1, 2], [3, 4]])
  3. >>> kvar = K.variable(value=val, dtype='float64', name='example_var')
  4. >>> K.dtype(kvar)
  5. 'float64'
  6. >>> print(kvar)
  7. example_var
  8. >>> kvar.eval()
  9. array([[ 1., 2.],
  10. [ 3., 4.]])

六、placeholder

K.placeholder(shape=None, ndim=None, dtype='float32', name=None)

功能:实例化一个占位符,返回之

参数:

  • shape:占位符的shape(整数tuple,可能包含None)
  • ndim: 占位符张量的阶数,要初始化一个占位符,至少指定shapendim之一,如果都指定则使用shape
  • dtype: 占位符数据类型
  • name: 占位符名称(可选)

示例:

  1. >>> from keras import backend as K
  2. >>> input_ph = K.placeholder(shape=(2, 4, 5))
  3. >>> input_ph._keras_shape
  4. (2, 4, 5)
  5. >>> input_ph
  6. <tf.Tensor 'Placeholder_4:0' shape=(2, 4, 5) dtype=float32>

七、shape

K.shape(x)

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

示例:

  1. >>> from keras import backend as K
  2. >>> tf_session = K.get_session()
  3. >>> val = np.array([[1, 2], [3, 4]])
  4. >>> kvar = K.variable(value=val)
  5. >>> input = keras.backend.placeholder(shape=(2, 4, 5))
  6. >>> K.shape(kvar)
  7. <tf.Tensor 'Shape_8:0' shape=(2,) dtype=int32>
  8. >>> K.shape(input)
  9. <tf.Tensor 'Shape_9:0' shape=(3,) dtype=int32>
  10. __To get integer shape (Instead, you can use K.int_shape(x))__
  11. >>> K.shape(kvar).eval(session=tf_session)
  12. array([2, 2], dtype=int32)
  13. >>> K.shape(input).eval(session=tf_session)
  14. array([2, 4, 5], dtype=int32)

八、int_shape

K.int_shape(x)

功能:以整数Tuple或None的形式返回张量shape

示例:

  1. >>> from keras import backend as K
  2. >>> input = K.placeholder(shape=(2, 4, 5))
  3. >>> K.int_shape(input)
  4. (2, 4, 5)
  5. >>> val = np.array([[1, 2], [3, 4]])
  6. >>> kvar = K.variable(value=val)
  7. >>> K.int_shape(kvar)
  8. (2, 2)

九、ndim

K.ndim(x)

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

示例:

  1. >>> from keras import backend as K
  2. >>> input = K.placeholder(shape=(2, 4, 5))
  3. >>> val = np.array([[1, 2], [3, 4]])
  4. >>> kvar = K.variable(value=val)
  5. >>> K.ndim(input)
  6. 3
  7. >>> K.ndim(kvar)
  8. 2

十、dtype

K.dtype(x)

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

示例:

  1. >>> from keras import backend as K
  2. >>> K.dtype(K.placeholder(shape=(2,4,5)))
  3. 'float32'
  4. >>> K.dtype(K.placeholder(shape=(2,4,5), dtype='float32'))
  5. 'float32'
  6. >>> K.dtype(K.placeholder(shape=(2,4,5), dtype='float64'))
  7. 'float64'
  8. __Keras var

十一、eval

K.eval(x)

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

示例:

  1. >>> from keras import backend as K
  2. >>> kvar = K.variable(np.array([[1, 2], [3, 4]]), dtype='float32')
  3. >>> K.eval(kvar)
  4. array([[ 1., 2.],
  5. [ 3., 4.]], dtype=float32)

十二、zeros / ones / eye / zeros_like / ones_like

  1. K.zeros(shape, dtype='float32', name=None)
  2. K.ones(shape, dtype='float32', name=None)
  3. eye(size, dtype='float32', name=None)
  4. zeros_like(x, name=None)
  5. ones_like(x, name=None)

功能: 生成一个全0张量 生成一个全1张量 生成一个单位矩阵

示例:

  1. >>> from keras import backend as K
  2. >>> kvar = K.zeros((3,4))
  3. >>> kvar = K.ones((3,4))
  4. >>> kvar = K.eye(3)
  5. >>> K.eval(kvar)
  6. >>> kvar_zeros = K.zeros_like(kvar)

十三、dot

K.dot(x, y)

功能:求两个张量的乘积

示例:

  1. >>> x = K.placeholder(shape=(2, 3))
  2. >>> y = K.placeholder(shape=(3, 4))
  3. >>> xy = K.dot(x, y)
  4. >>> xy
  5. <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. >>> x_batch = K.ones(shape=(32, 20, 1))
  2. >>> y_batch = K.ones(shape=(32, 30, 20))
  3. >>> xy_batch_dot = K.batch_dot(x_batch, y_batch, axes=[1, 2])
  4. >>> K.int_shape(xy_batch_dot)
  5. (32, 1, 30)

十五、transpose

K.transpose(x)

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

示例:

  1. >>> var = K.variable([[1, 2, 3], [4, 5, 6]])
  2. >>> K.eval(var)
  3. array([[ 1., 2., 3.],
  4. [ 4., 5., 6.]], dtype=float32)
  5. >>> var_transposed = K.transpose(var)
  6. >>> K.eval(var_transposed)
  7. array([[ 1., 4.],
  8. [ 2., 5.],
  9. [ 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.

功能:

示例:

参考