如何用Keras的Lambda函数编写L1、L2、Ln-normalize(避坑指南)

00 使用函数和库

  • Tensorflow
  • Keras(backend:Tensorflow)
  • Lambda
  • tf.div
  • tf.norm

 

01 代码

OUT_LAYER = Lambda(lambda x: tf.div(x,tf.norm(x,n,axis=1,keep_dims=True)),name='ln_norm1')(IN_LAYER) #IN_LAYER DATA_FORMAT:[None,Num],if [None,Num,1,1]->insert flatten(IN_LAYER)

02 分析

  1. 使用Ln-normalize时设置代码中传参n=Ln,如L1时n=1,L2时n=2
  2. axis=1,意味着在第1个维度进行normalize(注意:维度从0开始计数)
  3. keep_dim,保留维度,如输入是[256,64],axis=1,则tf.norm输出结果是[256,1](if keep_dim=1),[256](otherwise)

03 避坑

  • tensorflow所有的函数(包括以tf为后端的keras)都是以张量形式计算,意味着有批次,则输入是[batch_size,(featuremap_size)],所以tf.sum这类函数一定要注意限定维度,否则作用范围为全维度。
  • 而且使用L1-normalize容易导致交叉熵loss函数出现loss=nan,原因是一个损失项为0,log0=负无穷,导致模型不收敛甚至乱收敛。
  • tensorflow中的矩阵之间的(对应元素)除法不能直接用除号'/',可能会导致出错
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值