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 分析
- 使用Ln-normalize时设置代码中传参n=Ln,如L1时n=1,L2时n=2
- axis=1,意味着在第1个维度进行normalize(注意:维度从0开始计数)
- 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中的矩阵之间的(对应元素)除法不能直接用除号'/',可能会导致出错