Python教程:一文弄懂Python列表
Python列表是一种有序的数据集合,可以存储各种数据类型,并通过索引来访问元素。以下是关于Python列表的一些基本概念和操作:
创建列表:
- 直接定义:
my_list = [element1, element2, ...]
- 列表推导式:
new_list = [expression for item in iterable]
- 直接定义:
列表长度和元素:
len(my_list)
可以获取列表的长度my_list[index]
访问特定位置的元素,从0开始计数
添加、删除和修改元素:
my_list.append(element)
添加元素到列表末尾my_list.pop([index])
删除并返回指定位置的元素,默认删除最后一个my_list[index] = new_element
修改元素值
切片和复制:
slice_syntax = my_list[start:end:step]
用于选取部分元素,步长可选copy_list = my_list.copy()
创建列表的浅拷贝
内置函数:
sum(list)
对所有数字求和sorted_list = sorted(my_list)
返回一个新的排序后的列表
循环遍历:
- 使用for循环:
for element in my_list:
- 使用for循环:
一文弄懂模型知识蒸馏、剪枝
深度学习中模型的知识蒸馏与剪枝技术原理及应用
知识蒸馏的技术原理及应用
知识蒸馏是一种有效的模型压缩策略,旨在将复杂的教师模型(teacher model)所蕴含的知识迁移到较为简单的学生模型(student model)。这种方法不仅能够保持较高的预测准确性,还能显著减小模型尺寸并提升运行效率。具体来说,在训练过程中,学生模型不仅要拟合原始数据集上的标签信息,还要尽可能模仿教师模型给出的概率分布,即所谓的“暗知识”或软标签[^1]。
为了实现这一点,通常会采用温度缩放机制调整softmax函数的输出,使得教师网络产生的概率分布更加平滑,便于学生更好地捕捉其特征表示能力。此外,还可以引入额外损失项来强化这种迁移过程的效果,比如基于中间层激活值的一致性约束等[^5]。
import torch.nn.functional as F
def knowledge_distillation_loss(student_logits, teacher_logits, temperature=2.0):
soft_student = F.softmax(student_logits / temperature, dim=-1)
soft_teacher = F.softmax(teacher_logits / temperature, dim=-1)
loss_kd = F.kl_div(
input=F.log_softmax(student_logits / temperature, dim=-1),
target=F.softmax(teacher_logits / temperature, dim=-1),
reduction='batchmean'
) * (temperature ** 2)
return loss_kd
剪枝的方法论及其应用场景
相比之下,剪枝则是另一种不同的模型简化手段,主要关注于移除那些对整体性能贡献较小甚至可以忽略不计的部分——通常是连接权值接近零的位置。通过对神经元间联系强度进行评估筛选,并逐步去除冗余组件,最终得到一个更为紧凑高效的版本[^3]。
实际操作时,一般先完成一次完整的预训练阶段;接着依据设定的标准挑选出待修剪的目标节点/边;最后重新微调剩余结构直至满足预期指标为止。值得注意的是,尽管此法能在一定程度上缓解过拟合现象的发生几率,但也可能导致泛化能力下降等问题出现,因此需谨慎对待参数设置环节[^2]。
from functools import partial
import numpy as np
def prune_weights(model, pruning_ratio=0.2):
all_params = []
for name, param in model.named_parameters():
if 'weight' in name and not ('bn' in name or 'bias' in name):
all_params.append((name, param.data.cpu().numpy()))
flat_params = np.concatenate([p.flatten() for _, p in all_params])
threshold = np.percentile(abs(flat_params), q=(pruning_ratio*100))
with torch.no_grad():
for layer_name, weights in all_params:
mask = abs(weights) >= threshold
pruned_tensor = torch.from_numpy(mask.astype(int)).cuda()
getattr(model, '.'.join(layer_name.split('.')[:-1]))._parameters[layer_name.split('.')[-1]].mul_(pruned_tensor)
一文弄懂神经网络中的反向传播法
反向传播算法概念
反向传播算法是一种用于训练人工神经网络的监督学习方法。此算法的核心在于利用链式法则计算损失函数相对于各权重的梯度,从而调整这些权重以最小化预测误差[^1]。
原理阐述
正向传递阶段
在网络接收输入数据并进行正向传播的过程中,每层节点依据前一层传来的加权和加上偏置项后的激活值作为自身的输出。这一过程持续至最终输出层产生模型对于给定样本集的预测结果[^4]。
def forward_pass(input_data, weights, biases):
activations = input_data
for w_layer, b_layer in zip(weights[:-1], biases[:-1]):
z = np.dot(w_layer.T, activations) + b_layer
activations = sigmoid(z)
# For the output layer using softmax activation function.
final_z = np.dot(weights[-1]
predictions = softmax(final_z)
return predictions
计算误差
当获得预测值之后,会将其与实际标签对比得出差异程度——即所谓的“误差”。通常采用均方差(MSE)或交叉熵(Cross Entropy Loss)等形式表达这种差距大小。
反向传播阶段
一旦确定了整体系统的总误差,则可以开始执行真正的核心部分—反向传播:
- 从末端到前端逐步回溯:按照从输出层往回走的方式依次处理各个隐藏单元;
- 应用链式法则:借助于微分学里的链式法则来解析当前层级上的局部变化如何影响全局性能指标;
- 累积贡献量:记录下每个连接边所携带的信息流强度及其方向性特征,以便后续更新操作时能够精准定位责任归属[^3]。
def backward_pass(predictions, actual_labels, weights, learning_rate=0.01):
error = predictions - actual_labels # Calculate delta at output layer.
deltas = []
for i in reversed(range(len(weights))):
if i == len(weights)-1:
delta = error * derivative_softmax(predictions)
else:
delta = (deltas[-1].dot(weights[i+1])) * derivative_sigmoid(layer_activations[i])
deltas.append(delta)
deltas.reverse()
gradients = []
for d, a in zip(deltas, [input_data]+layer_activations[:-1]):
gradient = d[:,np.newaxis]*a[np.newaxis,:]
gradients.append(gradient)
updated_weights = [
weight - learning_rate*grad
for grad, weight in zip(gradients, weights)]
return updated_weights
参数更新
最后一步便是根据之前收集好的信息完成对原始参数矩阵Wij以及biases的具体修正工作。一般而言,这涉及到简单的减去按比例缩放过的梯度向量。
实现总结
综上所述,在构建一个多层感知机架构下的深度学习框架时,除了要精心设计好每一级之间的映射关系外,更重要的是掌握一套有效的优化策略使得整个体系能够在有限次数内收敛到较优解附近。而BP正是这样一种经典而又实用的技术手段之一[^2]。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![docx](https://img-home.csdnimg.cn/images/20241231044901.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)