最近要将tf的模型移植到tpu平台,tpu设备肯定是不支持keras的,需要做函数的迁移。我计划所有keras的函数用numpy来实现,numpy的矩阵运算还是很快的。keras和numpy有很多功能相同的函数,但也要注意一些细节的区别。
concatenate函数
keras的该函数默认axis为-1(倒数第一个轴),而np的默认为0
tf.keras.layers.Concatenate(
axis=-1, **kwargs
)
np.concatenate()
sigmoid函数
这个函数在np中是没有的,需要自己写:
tf.keras.layers.sigmoid()
def sigmoid(x):
s = 1 / (1 + np.exp(-x))
return s
该函数还是比较简单的,但会有warning:
RuntimeWarning: overflow encountered in exp
这是因为inx中的值很大时,exp(inx)可能会发生溢出
所以需要继续优化:
def sigmoid(inx):
# 对sigmoid函数的优化,避免了出现极大的数据溢出
inx[inx>=0] = 1.0/(1+np.exp(-inx[inx>=0]))
inx[inx<0] = np.exp(inx[inx<0])/(1+np.exp(inx[inx<0]))
上述写法没有使用if语句来判断正负性,但运行还是比较慢的,虽然规避了warning,所以实际使用还是不推荐的,还是选择有warning的那种实现方法。
像tile等函数直接将keras换为np即可,但还有上述以及cast(换为np.array())等函数,需要改写。