tensorflow的tf.nn.l2_normalize()与tf.norm()

本文深入探讨了TensorFlow中L2归一化的实现方法,包括tf.nn.l2_normalize和tf.norm结合tf.div的使用,通过代码实例展示了两种方法的一致性,并对比了它们在向量归一化上的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

tensorflow的归一化在很多时候都会用到,tensorflow代码里面也有多个实现方式,下面主要以L2归一化来讲解。

    1. tf.nn.l2_normalize()
函数原型:l2_normalize(x, dim, epsilon=1e-12, name=None)
x为输入的向量; 
dim为指定按哪个维度求l2范化,dim取值为0或1,0代表列,1代表行; 
epsilon为l2范化的最小值边界;
    1. tf.norm()与tf.div()联合使用
函数原型:norm(tensor, ord='euclidean', axis=None, keep_dims=False, name=None)
用于计算向量,矩阵和tensor的范数,默认情况下是计算欧氏距离的L2范数
tensor为待计算范数的输入
ord指定计算哪一种范数
axis为按哪个维度计算范数,可取0或1,0代表列,1代表行
keep_dims是否保持维度不变,默认False

函数原型:div(x, y, name=None)
实现对应元素的x/y操作

程序实例

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@Time       : 2019/4/22 16:17
@Author     : Li Shanlu
@File       : tensorflow_norm.py
@Software   : PyCharm
@Description: 描述tf.nn.l2_normalize的使用和tf.norm方法的异同
"""

import tensorflow as tf

input_data = tf.constant([[1.0,2,3],[2.0,3,4],[3.0,4,5]])
output_1 = tf.nn.l2_normalize(input_data, dim=1, epsilon=1e-10, name='nn_l2_norm')
normal = tf.norm(input_data, axis=1, keep_dims=True, name='normal')  # 求每行对应的L2范数(欧式距离)
output_2 = tf.div(input_data, normal, name='div_normal')
normal_1 = tf.norm(output_1, axis=1, keep_dims=True, name='normal_1')
output_3 = tf.div(output_1, normal_1, name='div_normal_1')

with tf.Session() as sess:
    print("input_data:\n", sess.run(input_data))
    print("output_1:\n", sess.run(output_1))
    print("normal:\n", sess.run(normal))
    print("output_2:\n", sess.run(output_2))
    print("normal_1:\n", sess.run(normal_1))
    print("output_3:\n", sess.run(output_3))

运行结果如下:
input_data:
 [[1. 2. 3.]
 [2. 3. 4.]
 [3. 4. 5.]]
output_1:
 [[0.26726124 0.5345225  0.8017837 ]
 [0.37139067 0.557086   0.74278134]
 [0.42426407 0.56568545 0.7071068 ]]
normal:
 [[3.7416575]
 [5.3851647]
 [7.071068 ]]
output_2:
 [[0.26726124 0.5345225  0.8017837 ]
 [0.37139067 0.55708605 0.74278134]
 [0.42426407 0.56568545 0.70710677]]
normal_1:
 [[0.99999994]
 [1.        ]
 [1.        ]]
output_3:
 [[0.26726127 0.53452253 0.80178374]
 [0.37139067 0.557086   0.74278134]
 [0.42426407 0.56568545 0.7071068 ]]

Process finished with exit code 0
### SimCLR 实现用于深度学习中的聚类 SimCLR 是一种对比学习框架,旨在无监督方式下学习视觉表征。通过最大化不同图像增广视图之间的互信息,SimCLR 能够捕捉数据的本质特征并生成强大的表征向量[^1]。 对于聚类应用而言,在完成预训练阶段之后,可以通过冻结基础编码器网络参数,并在其顶部附加一个轻量级分类头来进行下游任务的学习。具体实现流程如下: #### 数据准备增强 为了确保模型能够学到鲁棒且具有区分力的特征,需要对输入样本实施一系列随机变换操作,如裁剪、翻转、颜色抖动等。这些处理有助于增加正样本对间的差异性,从而促使模型聚焦于更深层次的内容理解而非表面统计特性。 ```python import tensorflow as tf from tensorflow.keras import layers, models def create_data_augmentation_pipeline(): data_augmentation = tf.keras.Sequential([ layers.RandomFlip("horizontal"), layers.RandomRotation(0.2), layers.RandomContrast(factor=0.5) ]) return data_augmentation ``` #### 构建SimCLR架构 构建双塔结构——两个分支共享相同的骨干网络权重,分别接收同一张原始图片的不同版本作为输入。经过投影头部转换后的输出会被送入损失函数计算部分以评估相似度得分。 ```python class SimCLRLoss(tf.keras.Model): def __init__(self, temperature=0.5): super(SimCLRLoss, self).__init__() self.temperature = temperature def call(self, z_i, z_j): batch_size = tf.shape(z_i)[0] # Normalize the representations along the feature dimension. zi_norm = tf.math.l2_normalize(z_i, axis=-1) zj_norm = tf.math.l2_normalize(z_j, axis=-1) logits_ii = tf.matmul(zi_norm, zi_norm, transpose_b=True) / self.temperature logits_ij = tf.matmul(zi_norm, zj_norm, transpose_b=True) / self.temperature labels = tf.range(batch_size) loss_a = tf.nn.sparse_softmax_cross_entropy_with_logits(labels, logits_ij) loss_b = tf.nn.sparse_softmax_cross_entropy_with_logits(labels, tf.transpose(logits_ij)) total_loss = tf.reduce_mean(loss_a + loss_b) return total_loss ``` #### 应用至聚类场景 当希望利用上述获得的良好初始化状态执行聚类任务时,则可以在微调过程中采用诸如 KMeans 或者 Gaussian Mixture Model 等传统方法直接作用于提取出来的特征空间上;也可以进一步设计端到端可导的形式,比如 DEC(Deep Embedded Clustering),即先让神经网络收敛后再逐步调整目标分布直至稳定下来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值