tf系列3——张量、变量和求导

本文深入探讨TensorFlow中的张量操作,包括张量类型、阶、固定值与随机值张量的创建、类型转换及其它操作。进一步讲解了TensorFlow变量的使用,并通过对比NumPy实现,详细阐述了TensorFlow下线性回归模型的求导过程,展示了自动求导的优势。

1 Tensorflow张量

在这里插入图片描述

1.1 张量类型

在这里插入图片描述

1.2 张量的阶

在这里插入图片描述
在这里插入图片描述

1.3 张量操作

1.3.1 创建固定值张量

在这里插入图片描述

1.3.2 创建随机值张量

在这里插入图片描述

1.3.3 张量类型的变换

在这里插入图片描述

1.3.4 张量的其它操作

在这里插入图片描述
官网链接https://www.tensorflow.org/api_docs/python/tf/Tensor

2 Tensorflow变量(tf.Variable(initial_value=3.)

在这里插入图片描述

3 求导

在这里插入图片描述
在这里插入图片描述

3.1 普通NumPy 下的线性回归求导实现

在这里插入图片描述

import numpy as np

X_raw = np.array([2013, 2014, 2015, 2016, 2017], dtype=np.float32)
y_raw = np.array([12000, 14000, 15000, 16500, 17500], dtype=np.float32)

X = (X_raw - X_raw.min()) / (X_raw.max() - X_raw.min())
y = (y_raw - y_raw.min()) / (y_raw.max() - y_raw.min())

a, b = 0, 0
num_epoch = 10000
learning_rate = 1e-3
for e in range(num_epoch):
    # 手动计算损失函数关于自变量(模型参数)的梯度
    y_pred = a * X + b
    grad_a, grad_b = (y_pred - y).dot(X), (y_pred - y).sum()

    # 更新参数
    a, b = a - learning_rate * grad_a, b - learning_rate * grad_b
print(a, b)



3.2 TensorFlow 下的线性回归求导

在这里插入图片描述

import numpy as np

X_raw = np.array([2013, 2014, 2015, 2016, 2017], dtype=np.float32)
y_raw = np.array([12000, 14000, 15000, 16500, 17500], dtype=np.float32)

X = (X_raw - X_raw.min()) / (X_raw.max() - X_raw.min())
y = (y_raw - y_raw.min()) / (y_raw.max() - y_raw.min())


# 1、定义Tensor类型
X = tf.constant(X)
y = tf.constant(y)

# 2、参数使用变量初始化
a = tf.Variable(initial_value=0.)
b = tf.Variable(initial_value=0.)
variables = [a, b]

num_epoch = 10000
optimizer = tf.keras.optimizers.SGD(learning_rate=1e-3)
for e in range(num_epoch):
    # 使用tf.GradientTape()记录损失函数的梯度信息
    with tf.GradientTape() as tape:
        y_pred = a * X + b
        loss = 0.5 * tf.reduce_sum(tf.square(y_pred - y))
    # TensorFlow自动计算损失函数关于自变量(模型参数)的梯度
    grads = tape.gradient(loss, variables)
    # TensorFlow自动根据梯度更新参数
    optimizer.apply_gradients(grads_and_vars=zip(grads, variables))

print(a, b)

在这里插入图片描述

### 基于梯度的 LRP 方法在 TensorFlow 中的实现及其代码解释 基于梯度的 Layer-wise Relevance Propagation (LRP) 是一种用于分析深度神经网络内部工作机制的方法。它通过将输出层的相关性分数逐步传播回输入层,帮助识别哪些输入特征对模型预测最为重要。下面是对给定代码片段的功能分解详细说明。 #### 1. 初始化阶段 ```python class GradientBasedLRP: def __init__(self, model): self.model = model ``` 此部分定义了一个名为 `GradientBasedLRP` 的类,并接受一个已训练好的模型作为参数。这一步骤确保了我们可以访问模型中的各层结构以及它们之间的连接关系[^1]。 #### 2. 正向传播与目标设定 ```python def relevance_propagation(self, input_tensor, target_class=None): ... activations = [] x = input_tensor for i, layer in enumerate(intermediate_model.layers[1:]): activation = layer(x) activations.append(activation) x = activation ``` 在此函数中,首先构建了一个新的子模型 `intermediate_model` 来捕获每一层的激活值。接着,对于每一个隐藏层,记录下当前状态下的激活情况。这些激活值将在后续步骤中被用来指导相关性的重新分配。 #### 3. 热编码生成 ```python output_layer = self.model.layers[-1](activations[-1]) if target_class is None: target_class = tf.argmax(output_layer, axis=-1) one_hot_output = tf.one_hot(target_class, depth=output_layer.shape[-1]) ``` 当没有明确指出感兴趣的目标类别时,默认选择具有最高置信度的那个分类结果作为我们的研究对象。随后构造对应的 One-Hot 编码形式的一维数组,准备进入下一步——即计算相对于这个选定标签的概率估计的变化率。 #### 4. 反向传播处理 ```python with tf.GradientTape() as tape: tape.watch(input_tensor) loss = tf.reduce_sum(one_hot_output * output_layer) grads = tape.gradient(loss, input_tensor) ``` 利用 TensorFlow 提供的强大工具 `tf.GradientTape()` ,可以自动追踪整个前馈过程中涉及的所有变量变化轨迹。在这里特别监视的是输入张量本身,因为我们希望了解每个像素位置上的微小扰动如何影响最终判定得分。之后通过对数似然代价函数求导得到全局敏感度指标集合。 #### 5. 相关性计算 ```python relevance_score = input_tensor * grads return relevance_score.numpy() ``` 最后一步简单直观:只需把之前获得的整体灵敏系数矩阵同原始图像相乘即可得出局部贡献度评估图谱。这样做的好处在于既保留了空间分辨率又兼顾到了语义信息的重要性权重分布特性[^1]。 --- ### 结论 综上所述,这段程序确实体现了基于梯度的 LRP 思想精髓所在之处,并且完全兼容现代框架如 Tensorflow 进行高效数值运算需求。值得注意的是,在实际部署当中还需要考虑更多边界条件处理等问题才能达到工业级水准的应用效果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

太阳花bigdata

如果文章给您带来帮助,感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值