keras后端

转载于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维度数目相同的列表

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值