Keras后端 Keras是一个模型级的库,提供了快速构建深度学习网络的模块
切换后端
修改Keras配置文件
定义环境变量KERAS_BACKEND
覆盖配置文件中设置(见python
修改环境变量的3中方式)
Keras后端抽象 可以通过Keras后端接口来编写代码,使得Keras模块能够同时在
Theano和TensorFlow两个后端上使用
大多数张量操作都可以通过统一的Keras后端接口完成,不必
关心具体执行后端
1 2 3 4 5 6 7 8 9 10 11 12 13 from keras import backend as Kinput = K.placeholder(shape=(2 , 4 , 5 ))input = K.placeholder(shape=(None , 4 , 5 ))input = K.placeholder(ndim=3 ) val = np.random.random((3 , 4 , 5 )) var = K.variable(value=val) var = K.zeros(shape=(3 , 4 , 5 )) var = K.ones(shape=(3 , 4 , 5 ))
配置相关函数 backend
返回当前后端
epsilon
返回数字表达式使用fuzz factor
set_epsilon
设置模糊因子的值
floatx
返回默认的浮点数数据类型
set_floatx
1 2 3 K.set_floatx( floatx="float16" /"float32" /"float64" )
设置默认的浮点数数据类型(字符串表示)
cast_to_floatx
将NDA转换为默认的Keras floatx类型(的NDA)
例子
1 2 3 4 5 6 7 8 K.floatx() arr = np.array([1.0 , 2.0 ], dtype="flaot64" ) arr.dtype new_arr = K.cast_to_float(arr) new_arr.dtype
返回图像的默认维度顺序
channels_last
channels_first
1 2 3 K.set_image_data_format( data_format="channel_first" /"channel_last" )
设置图像的默认维度顺序
辅助函数 is_keras_tensor
判断是否是Keras Tensor对象
1 2 3 4 5 6 7 8 9 10 11 np_var = np.array([1 , 2 ]) K.is_keras_tensor(np_var) keras_var = K.variable(np_var) K.is_keras_tensor(keras_var) keras_placeholder = K.placeholder(shape=(2 , 4 , 5 )) K.is_keras_tensor(keras_placeholder)
get_uid
1 K.get_uid(prefix='' /str )
获得默认计算图的uid
reset_uids
重置图的标识符
clear_session
结束当前的TF计算图,并创建新图
manual_variable_initialization
1 2 3 K.manual_variable_initialization( value=False /True )
设置变量手动初始化标志
learning_phase
返回学习阶段标致
set_learning_phase
1 2 3 K.set_learning_phase( value=0 /1 )
设置学习阶段为固定值
OPs、Tensors is_sparse
判断一个Tensor是不是一个稀疏的Tensor
稀不稀疏由Tensor的类型决定,而不是Tensor实际上有多稀疏
1 2 3 4 5 6 7 from keras import backend as Ka = K.placeholder((2 , 2 ), sparse=False ) print (K.is_sparse(a)) b = K.placeholder((2 , 2 ), sparse=True ) print (K.is_sparse(b))
to_dense
将一个稀疏tensor转换一个不稀疏的tensor并返回
variable
1 2 3 4 5 def variable ( value, dtype='float32' /str , name=None )
实例化一个张量,返回之
参数
value
:用来初始化张量的值
dtype
:张量数据类型
name
:张量的名字(可选)
placeholder
1 2 3 4 5 6 def placeholder ( shape=None , ndim=None , dtype='float32' /str , name=None )
实例化一个占位符
参数
shape
:占位符的shape(整数tuple,可能包含None)
ndim
: 占位符张量的阶数
要初始化占位符,至少指定shape
和ndim
之一,
如果都指定则使用shape
dtype
: 占位符数据类型
name
: 占位符名称(可选)
shape
返回张量的符号shape
1 2 3 4 5 6 7 8 9 10 11 12 13 14 from keras import backend as Ktf_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) K.shape(input ) K.shape(kvar).eval (session=tf_session) K.shape(input ).eval (session=tf_session)
int_shape
返回张量shape
1 2 3 4 5 6 7 8 from keras import backend as Kinput = K.placeholder(shape=(2 , 4 , 5 ))K.int_shape(input ) val = np.array([[1 , 2 ], [3 , 4 ]]) kvar = K.variable(value=val) K.int_shape(kvar)
ndim
返回张量的阶数
1 2 3 4 5 6 7 8 from keras import backend as Kinput = K.placeholder(shape=(2 , 4 , 5 ))val = np.array([[1 , 2 ], [3 , 4 ]]) kvar = K.variable(value=val) K.ndim(input ) K.ndim(kvar)
dtype
返回张量的数据类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 from keras import backend as KK.dtype(K.placeholder(shape=(2 ,4 ,5 ))) K.dtype(K.placeholder(shape=(2 ,4 ,5 ), dtype='float32' )) K.dtype(K.placeholder(shape=(2 ,4 ,5 ), dtype='float64' )) kvar = K.variable(np.array([[1 , 2 ], [3 , 4 ]])) K.dtype(kvar) kvar = K.variable(np.array([[1 , 2 ], [3 , 4 ]]), dtype='float32' ) K.dtype(kvar)
eval
求得张量的值
1 2 3 4 5 from keras import backend as Kkvar = K.variable(np.array([[1 , 2 ], [3 , 4 ]]), dtype='float32' ) K.eval (kvar)
`zeros 1 2 3 4 5 def zeros ( shape, dtype='float32' , name=None )
生成shape
大小的全0张量
1 2 3 4 5 6 from keras import backend as Kkvar = K.zeros((3 ,4 )) K.eval (kvar)
ones
1 2 3 4 5 def ones ( shape, dtype='float32' , name=None )
生成shape
大小的全1张量
eye
1 2 3 4 5 def eye ( size, dtype='float32' , name=None )
生成size
大小的单位阵
zeros_like
1 2 3 4 def zeros_like ( x, name=None )
生成与x
shape相同的全0张量
ones_like
1 2 3 4 def ones_like ( x, name=None )
生成与x
shape相同的全1张量
随机常量OPs 1 2 3 4 5 6 7 8 def random_uniform_variable ( shape, low, high, dtype=None , name=None , seed=None )
初始化均匀分布常量OPs
参数
low
:浮点数,均匀分布之下界
high
:浮点数,均匀分布之上界
dtype
:数据类型
name
:张量名
seed
:随机数种子
count_params
返回张量中标量的个数
cast
改变张量的数据类型
参数
dtype
:float16
/float32
/float64
update
用new_x
更新x
update_add
1 def update_add (x, increment )
将x
增加increment
并更新x
update_sub
1 def update_sub (x, decrement )
将x
减少decrement
并更新x
moving_average_update
1 2 3 4 5 def moving_average_update ( x, value, momentum )
使用移动平均更新x
dot
求两个张量的点乘
1 2 3 4 5 x = K.placeholder(shape=(2 , 3 )) y = K.placeholder(shape=(3 , 4 )) xy = K.dot(x, y) xy
当试图计算两个N阶张量的乘积时,与Theano行为相同
(2, 3).(4, 3, 5) = (2, 4, 5))
1 2 3 4 5 x = K.placeholder(shape=(32 , 28 , 3 )) y = K.placeholder(shape=(3 , 4 )) xy = K.dot(x, y) xy
1 2 3 4 5 x = K.random_uniform_variable(shape=(2 , 3 ), low=0 , high=1 ) y = K.ones((4 , 3 , 5 )) xy = K.dot(x, y) K.int_shape(xy)
batch_dot
1 def batch_dot (x, y, axes=None )
按批进行张量x
和y
的点积
参数
x
:按batch分块的数据
y
;同x
axes
:指定进行点乘的轴
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)
transpose
张量转置
gather
1 def gather (reference, indices )
在给定的张量中检索给定下标的向量
参数
reference
:张量
indices
:整数张量,其元素为要查询的下标
返回值:同reference
数据类型相同的张量
max
1 2 3 4 5 def max ( x, axis=None /int , keepdims=False )
求张量中的最大值
min
1 def min (x, axis=None , keepdims=False )
求张量中的最小值
sum
1 sum (x, axis=None , keepdims=False )
计算张量中元素之和
prod
1 prod(x, axis=None , keepdims=False )
计算张量中元素之积
cumsum
在给定轴上求张量的累积和
cumprod
在给定轴上求张量的累积积
var
1 def var (x, axis=None , keepdims=False )
在给定轴上计算张量方差
std
1 def std (x, axis=None , keepdims=False )
在给定轴上求张量元素之标准差
mean
1 def mean (x, axis=None , keepdims=False )
在给定轴上求张量元素之均值
any
1 def any (x, axis=None , keepdims=False )
按位或,返回数据类型为uint8的张量(元素为0或1)
all
1 def any (x, axis=None , keepdims=False )
按位与,返回类型为uint8de tensor
argmax
在给定轴上求张量之最大元素下标
argmin
在给定轴上求张量之最小元素下标
Element-Wise OPs square
逐元素平方
abs
逐元素绝对值
sqrt
逐元素开方
exp
逐元素求自然指数
log
逐元素求自然对数
logsumexp
1 def logsumexp (x, axis=None , keepdims=False )
在给定轴上计算log(sum(exp()))
该函数在数值稳定性上超过手动计算log(sum(exp()))
,可以
避免由exp
和log
导致的上溢和下溢
round
逐元素四舍五入
sign
逐元素求元素的符号
pow
逐元素求x的a次方
clip
1 2 3 4 5 def clip ( x, min_value, max_value )
逐元素clip(将超出指定范围的数强制变为边界值)
equal
逐元素判相等关系
not_equal
逐元素判不等关系
greater
逐元素判断x>y
关系
greater_equal
逐元素判断x>=y
关系
lesser
逐元素判断x<y
关系
lesser_equal
逐元素判断x<=y
关系
maximum
逐元素取两个张量的最大值
minimum
逐元素取两个张量的最小值
sin
逐元素求正弦值
cos
逐元素求余弦值
变换OPs batch_normalization
1 2 3 4 5 6 7 8 def batch_normalization ( x, mean, var, beta, gamma, epsilon=0.0001 )
对batch的数据进行batch_normalization ,计算公式为:
$output = (x-mean)/(\sqrt(var)+\epsilon)*\gamma+\beta$
normalize_batch_in_training
1 2 3 4 5 6 7 def normalize_batch_in_training ( x, gamma, beta, reduction_axes, epsilon=0.0001 )
对batch数据先计算其均值和方差,然后再进行
batch_normalization
concatenate
1 def concatenate (tensors, axis=-1 )
在给定轴上将一个列表中的张量串联为一个张量
reshape
将张量的shape变换为指定shape
permute_dimensions
1 2 3 4 def permute_dimensions ( x, pattern(tuple (int ) ) )
按照给定的模式重排一个张量的轴
参数
pattern
:代表维度下标的tuple如(0, 2, 1)
resize_images
1 2 3 4 5 6 def resize_images ( X, height_factor(uint ), width_factor(uint ), dim_ordering=None /'th' /'tf' )
依据给定的缩放因子height_factor
、width_factor
,改变batch
数据(图片)的shape
参数
height_factor
/width_factor
:正整数
resize_volumes
1 2 3 4 5 6 7 def resize_volumes ( X, depth_factor, height_factor, width_factor, dim_ordering )
依据给定的缩放因子,改变一个5D张量数据的shape
repeat_elements
1 def repeat_elements (x, rep, axis )
在给定轴上重复张量元素 rep
次
repeat
重复2D张量
arange
1 2 3 4 5 6 def arange ( start, stop=None , step=1 , dtype="int32" )
生成1D的整数序列张量
参数:同np.arange
返回值:默认数据类型是int32
的张量
tile
将x
在各个维度上重复n[i]
次
batch_flatten
将n阶张量转变为2阶张量,第一维度保留不变
expand_dims
1 def expand_dims (x, dim=-1 )
在dim
指定轴后增加一维(轴)
squeeze
将axis
指定的轴从张量中移除(保留轴上首组张量切片)
temporal_padding
1 def temporal_padding (x, padding=1 )
向3D张量中间那个维度的左右两端填充padding
个0值
asymmetric_temporal_padding
1 2 3 4 5 def asymmetric_temporal_padding ( x, left_pad=1 , right_pad=1 )
向3D张量中间的那个维度的左右分别填充0值
spatial_2d_padding
1 2 3 4 5 def spatial_2d_padding ( x, padding=(1 , 1 ), dim_ordering='th' )
向4D张量高度、宽度左右两端填充padding[0]
和padding[1]
个0值
spatial_3d_padding
1 2 3 4 5 def spatial_3d_padding ( x, padding=(1 , 1 , 1 ), dim_ordering='th' )
向5D张量深度、高度、宽度三个维度上填充0值
stack
将列表x
中张量堆积起来形成维度+1的新张量
one_hot
1 def one_hot (indices, nb_classes )
为张量indices
进行one_hot 编码
参数
indices
:n维的整数张量
nb_classes
:one_hot 编码列表
输出:n+1维整数张量,最后维为编码
reverse
将一个张量在给定轴上反转
get_value
以NDA的形式返回张量的值
batch_get_value
以[NDA]
的形式返回多个张量的值
set_value
从NDA将值载入张量中
batch_set_value
1 def batch_set_value (tuples )
将多个值载入多个张量变量中
print_tensor
1 def print_tensor(x, message='')
在求值时打印张量的信息,并返回原张量
function
1 def function (inputs, outputs, updates=[] )
实例化一个Keras函数
参数
inputs
:列表,其元素为占位符或张量变量
outputs
:输出张量的列表
updates
:张量列表
gradients
1 def gradients (loss, variables )
返回loss
函数关于variables
的梯度
stop_gradient
1 def stop_gradient (variables )
Returns variables
but with zero gradient with respect to every other variables.
rnn
1 2 3 4 5 6 7 8 9 10 def rnn ( step_function, inputs, initial_states, go_backwards=False , mask=None , constants=None , unroll=False , input_length=None )
在张量的时间维上迭代
switch
1 2 3 4 5 def switch ( condition, then_expression, else_expression )
依据给定condition
(整数或布尔值)在两个表达式之间切换
参数
condition
:标量张量
then_expression
:TensorFlow表达式
else_expression
: TensorFlow表达式
in_train_phase
1 def in_train_phase (x, alt )
如果处于训练模式,则选择x
,否则选择alt
in_test_phase
1 def in_test_phase (x, alt )
如果处于测试模式,则选择x
,否则选择alt
预定义(激活)函数 relu
1 2 3 4 5 def relu ( x, alpha=0.0 , max_value=None )
修正线性单元
参数
alpha
:负半区斜率
max_value
: 饱和门限
elu
指数线性单元
softmax
计算张量的softmax值
softplus
返回张量的softplus值
softsign
返回张量的softsign值
sigmoid
逐元素计算sigmoid值
hard_sigmoid
分段线性近似的sigmoid,计算速度更快
tanh
逐元素计算tanh值
预定义目标函数 categorical_crossentropy
1 2 3 4 5 def categorical_crossentropy ( output, target, from_logits=False )
计算output
、target
的Categorical Crossentropy(类别交叉熵)
sparse_categorical_crossentropy
1 2 3 4 5 def sparse_categorical_crossentropy ( output, target, from_logits=False )
计算output
、target
的Categorical Crossentropy(类别交叉熵)
参数
output
target
:同output
shape相等,需为整形张量
binary_crossentropy
1 2 3 4 5 def binary_crossentropy ( output, target, from_logits=False )
计算输出张量和目标张量的交叉熵
dropout
1 def dropout (x, level, seed=None )
随机将x
中一定比例的值设置为0,并放缩整个Tensor
l2_normalize
1 def l2_normalize (x, axis )
在给定轴上对张量进行L2范数规范化
in_top_k
1 def in_top_k (predictions, targets, k )
判断目标是否在predictions
的前k大值位置
参数
predictions
:预测值张量
targets
:真值张量
k
:整数
conv1d
1 2 3 4 5 6 7 8 def conv1d ( x, kernel, strides=1 , border_mode="valid" /"same" , image_shape=None , filter_shape=None )
1D卷积
参数
kernel
:卷积核张量
strides
:步长,整型
border_mode
conv2d
1 2 3 4 5 6 7 8 9 def conv2d ( x, kernel, strides=(1 , 1 ), border_mode="valid" /"same" , dim_ordering="th" /"tf" , image_shape=None , filter_shape=None )
2D卷积
参数
kernel
:卷积核张量
strides
:步长,长为2的tuple
deconv2d
1 2 3 4 5 6 7 8 9 10 def deconv2d ( x, kernel, output_shape, strides=(1 , 1 ), border_mode="valid" /"same" , dim_ordering="th" /"tf" , image_shape=None , filter_shape=None )
2D反卷积(转置卷积)
参数
x
:输入张量
kernel
:卷积核张量
output_shape
: 输出shape的1D的整数张量
strides
:步长,tuple类型
conv3d
1 2 3 4 5 6 7 8 9 def conv3d ( x, kernel, strides=(1 , 1 , 1 ), border_mode="valid" /"same" , dim_ordering="th" /"tf" , volume_shape=None , filter_shape=None )
3D卷积
pool2d
1 2 3 4 5 6 7 8 def pool2d ( x, pool_size, strides=(1 , 1 ), border_mode="valid" /"same" , dim_ordering="th" /"tf" , pool_mode="max" /"avg" )
2D池化
参数
pool_size
:含有两个整数的tuple,池的大小
strides
:含有两个整数的tuple,步长
pool_mode
: “max”,“avg”之一,池化方式
pool3d
1 2 3 4 5 6 7 8 def pool3d ( x, pool_size, strides=(1 , 1 , 1 ), border_mode="valid" /"same" , dim_ordering="th" /"tf" , pool_mode="max" /"avg" )
3D池化
bias_add
1 def bias_add (x, bias, data_format=None )
为张量增加一个偏置项
random_normal
1 2 3 4 5 6 7 def random_normal ( shape, mean=0.0 , stddev=1.0 , dtype=None , seed=None )
生成服从正态分布的张量
1 2 3 4 5 6 7 def random_uniform ( shape, minval=0.0 , maxval=1.0 , dtype=None , seed=None )
生成服从均匀分布值的张量
random_binomial
1 2 3 4 5 6 def random_binomial ( shape, p=0.0 , dtype=None , seed=None )
返回具有二项分布值的张量
truncated_normall
1 2 3 4 5 6 7 def truncated_normal ( shape, mean=0.0 , stddev=1.0 , dtype=None , seed=None )
生成服从截尾正态分布值的张量,即在距离均值两个标准差之外的
数据将会被截断并重新生成
ctc_label_dense_to_sparse
1 def ctc_label_dense_to_sparse (labels, label_lengths )
将ctc标签从稠密形式转换为稀疏形式
ctc_batch_cost
1 2 3 4 5 6 def ctc_batch_cost ( y_true, y_pred, input_length, label_length )
在batch上运行CTC损失算法
参数
y_true
:包含标签的真值张量
y_pred
:包含预测值或输出的softmax值的张量
input_length
:包含y_pred
中每个batch的序列长
label_length
:包含y_true
中每个batch的序列长张量
返回值:包含了每个元素的CTC损失的张量
ctc_decode
1 2 3 4 5 6 7 8 def ctc_decode ( y_pred, input_length, greedy=True , beam_width=None , dict_seq_lens=None , dict_values=None )
使用贪婪算法或带约束的字典搜索算法解码softmax的输出
map_fn
1 def map_fn (fn, elems, name=None )
元素elems在函数fn上的映射,并返回结果
foldl
1 2 3 4 5 6 def foldl ( fn, elems, initializer=None , name=None )
用fn从左到右连接它们,以减少elems
值
参数
fn
:函数,例如:lambda acc, x: acc + x
elems
:张量
initializer
:初始化的值(elems[0])
name
:节点名
返回值:与initializer
类型和形状一致
foldr
1 2 3 4 5 6 def foldr ( fn, elems, initializer=None , name=None )
减少elems
,用fn
从右到左连接它们
参数
fn
:函数,例如:lambda acc, x: acc + x
elems
:张量
initializer
:初始化的值(elems[-1])
name
:节点名
返回值:与initializer
类型和形状一致
_width=None,
dict_seq_lens=None,
dict_values=None
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 使用贪婪算法或带约束的字典搜索算法解码softmax的输出 - 参数 - `y_pred`:包含预测值或输出的softmax值的张量 - `input_length`:包含`y_pred`中每个batch序列长的张量 - `greedy`:使用贪婪算法 - `dict_seq_lens`:`dic_values`列表中各元素的长度 - `dict_values`:列表的列表,代表字典 - 返回值:包含了路径可能性(以softmax概率的形式)张量 - 注意仍然需要一个用来取出argmax和处理空白标签的函数 #### `map_fn` ```python def map_fn(fn, elems, name=None)
元素elems在函数fn上的映射,并返回结果
foldl
1 2 3 4 5 6 def foldl ( fn, elems, initializer=None , name=None )
用fn从左到右连接它们,以减少elems
值
参数
fn
:函数,例如:lambda acc, x: acc + x
elems
:张量
initializer
:初始化的值(elems[0])
name
:节点名
返回值:与initializer
类型和形状一致
foldr
1 2 3 4 5 6 def foldr ( fn, elems, initializer=None , name=None )
减少elems
,用fn
从右到左连接它们
参数
fn
:函数,例如:lambda acc, x: acc + x
elems
:张量
initializer
:初始化的值(elems[-1])
name
:节点名
返回值:与initializer
类型和形状一致
name
:节点名
返回值:与initializer
类型和形状一致