转载于https://keras-cn.readthedocs.io/en/latest/backend/#keras
Keras后端
Keras是一个模型级的库,提供了快速构建深度学习网络的模块。Keras并不处理如张量乘法、卷积等底层操作。这些操作依赖于某种特定的、优化良好的张量操作库。Keras依赖于处理张量的库就称为“后端引擎”。Keras提供了三种后端引擎Theano/Tensorflow/CNTK,并将其函数统一封装,使得用户可以以同一个接口调用不同后端引擎的函数。
1 切换后端
2 使用抽象的Keras后端来编写代码
如果你希望你编写的Keras模块能够同时在Theano和TensorFlow两个后端上使用,你可以通过Keras后端接口来编写代码。
from keras import backend as K
下面的代码实例化了一个输入占位符,等价于tf.placeholder()
,T.matrix()
,T.tensor3()
等
input = K.placeholder(shape=(2, 4, 5))
# also works:
input = K.placeholder(shape=(None, 4, 5))
# also works:
input = K.placeholder(ndim=3)
下面的代码实例化了一个共享变量(shared),等价于tf.variable()
或 theano.shared()
val = np.random.random((3, 4, 5))
var = K.variable(value=val)
# all-zeros variable:
var = K.zeros(shape=(3, 4, 5))
# all-ones:
var = K.ones(shape=(3, 4, 5))
大多数你需要的张量操作都可以通过统一的Keras后端接口完成,而不关心具体执行这些操作的是Theano还是TensorFlow
a = b + c * K.abs(d)
c = K.dot(a, K.transpose(b))
a = K.sum(b, axis=2)
a = K.softmax(b)
a = concatenate([b, c], axis=-1)
# etc...
Keras后端函数
(1)backend()
返回当前后端
(2)epsilon()
以数值形式返回一个(一般来说很小的)数,用以防止除0错误
(3)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.]])
(4)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>
(5)random_uniform_variable(shape, low, high, dtype=None, name=None, seed=None)
初始化一个Keras变量,其数值为从一个均匀分布中采样的样本,返回之。
参数:
shape:张量shape
low:浮点数,均匀分布之下界
high:浮点数,均匀分布之上界
dtype:数据类型
name:张量名
seed:随机数种子
>>> kvar = K.random_uniform_variable((2,3), 0, 1)
>>> kvar
<tensorflow.python.ops.variables.Variable object at 0x10ab40b10>
>>> K.eval(kvar)
array([[ 0.10940075, 0.10047495, 0.476143 ],
[ 0.66137183, 0.00869417, 0.89220798]], dtype=float32)
(6)batch_dot(x, y, axes=None
)按批进行张量乘法,该函数用于计算x和y的点积,
参数:
x,y:阶数大于等于2的张量,在tensorflow下,只支持大于等于3阶的张量
axes:目标结果的维度,为整数或整数列表,axes[0]和axes[1]应相同
其中x和y都是成batch出现的数据。即它的数据shape形如(batch_size,:)。batch_dot将产生比输入张量维度低的张量,如果张量的维度被减至1,则通过expand_dims保证其维度至少为2 例如,假设x = [[1, 2],[3,4]] , y = [[5, 6],[7, 8]],则batch_dot(x, y, axes=1) = [[17, 53]],即x.dot(y.T)的主对角元素,此过程中我们没有计算过反对角元素的值
示例: 假设x=[[1,2],[3,4]],y=[[5,6],[7,8]],则batch_dot(x, y, axes=1)为[[17, 53]],恰好为x.dot(y.T)的主对角元,整个过程没有计算反对角元的元素。
我们做一下shape的推导,假设x是一个shape为(100,20)的tensor,y是一个shape为(100,30,20)的tensor,假设axes=(1,2),则输出tensor的shape通过循环x.shape和y.shape确定:
x.shape[0]:值为100,加入到输入shape里
x.shape[1]:20,不加入输出shape里,因为该维度的值会被求和(dot_axes[0]=1)
y.shape[0]:值为100,不加入到输出shape里,y的第一维总是被忽略
y.shape[1]:30,加入到输出shape里
y.shape[2]:20,不加到output shape里,y的第二个维度会被求和(dot_axes[1]=2)
结果为(100, 30)
>>> 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)
(7)normalize_batch_in_training(x, gamma, beta, reduction_axes, epsilon=0.0001)
对一个batch数据先计算其均值和方差,然后再进行batch_normalization
(8)batch_normalization(x, mean, var, beta, gamma, epsilon=0.0001)
对一个batch的数据进行batch_normalization,计算公式为: output = (x-mean)/(sqrt(var)+epsilon)*gamma+beta
(9)concatenate(tensors, axis=-1)
在给定轴上将一个列表中的张量串联为一个张量 specified axis
(10)reshape(x, shape)
将张量的shape变换为指定shape
(11)arange(start, stop=None, step=1, dtype='int32')
生成1D的整数序列张量,该函数的参数与Theano的arange函数含义相同,如果只有一个参数被提供了,那么它实际上就是stop参数的值。为了与tensorflow的默认保持匹配,函数返回张量的默认数据类型是int32
(12)tile(x, n)
将x在各个维度上重复n次,x为张量,n为与x维度数目相同的列表