P89LPC912/913/914双时钟80C51内核解析与低功耗设计实战
2026/6/11 19:08:55
Torch创建的tensor能够指定从磁盘提取后的存储地址,可以是内存或者显存。转移的命令为model.to("cuda")data.to("cuda")或者采用data.cuda()。如果需要使用显存运算,必须把模型参数和数据转移至显存中。Numpy创建的数组只能在cpu中,因为其存储只能在内存中。
基于torch创建tensor的简单操作:
torch.arange(12)torch.randn((shape))(圆括号内表示shape的形状)torch.ones(shape)torch.zeros(shape)查看tensor属性的命令:
tensor.shape、tensor.numel()、tensor.ndimtensor.device、tensor.dtype、tensor.is_cudatensor.is_contiguous()tensor.requires_grad(查看是否需要计算梯度)、tensor.grad(梯度值)、tensor.grad_fn(梯度函数)改变tensor形状的方法:
new_tensor = old_tensor.reshape(shape)new_tensor = old_tensor.reshape((-1, wide))或new_tensor = old_tensor.reshape((long, -1))(-1表示自动计算该维度)按元素计算可分为两种类型:
torch.exp(x)、torch.log()、torch.sin()X+Y、X*Y、X/Y、X*torch.exp(Y)(要求两个tensor大小相同)张量拼接:torch.cat((X,Y), dim=0/1)(需保证拼接维度外的其他维度相同)
张量求和:X.sum()(对所有元素求和)
当两个数组维度不同时,广播机制会自动扩展维度较小的数组:
索引和切片操作与Python列表类似,语法为tensor[start:end:step]。注意部分操作可能导致降维。
避免创建新对象的内存优化方法:
X[:] = X + YX += Y(推荐,更简洁)对比示例:
Y=torch.arange(12)before=id(Y)Y=X+Y# 创建新对象,内存地址改变new=id(Y)print(before==new)# 输出FalseX[:]=X+Y# 原地修改,内存地址不变# 或 X += Y与NumPy数组互转:
X.numpy()torch.tensor(array)张量转标量(仅适用于一维张量):
a.item()(推荐,返回Python标量)float(a)或int(a)(类型转换)结合pandas进行数据预处理的完整流程:
importpandasaspd dataframe=pd.read_csv("文件路径.csv")# 提取特征列inputs=dataframe.iloc[:,0:2]# 用均值填充缺失值inputs.fillna(inputs.mean(),inplace=True)# 或删除含缺失值的行df.dropna(axis=0,how='any',inplace=True)# axis=0表示行,how='any'表示只要有缺失就删除importtorch# 先获取numpy数组,再转换为tensortensor_data=torch.tensor(inputs.values)数据存储维度体系:
数学符号规范:
torch.abs()、torch.exp()torch.add()、torch.mul()A.sum()(返回标量)A.sum(dim=0)(沿第0维求和,降维操作)keepdims=True参数保持维度:A.sum(dim=0, keepdims=True)A.cumsum(dim=0)| 操作 | 代码 | 输入形状 | 输出形状 |
|---|---|---|---|
| 全元素求和 | A.sum() | (3,4) | () |
| 按行求和 | A.sum(dim=0) | (3,4) | (4,) |
| 按列求和 | A.sum(dim=1) | (3,4) | (3,) |
| 保持维度求和 | A.sum(dim=0, keepdims=True) | (3,4) | (1,4) |
torch.dot(a, b)(要求a和b都是1维张量)torch.mv(A, b)torch.mm(A, B)(要求A的列数等于B的行数)torch.sum(torch.abs(a))torch.norm(b)torch.norm(A)(与向量L2范数使用相同函数)函数可微的数学定义:
f′(x)=limh→0f(x+h)−f(x)hf'(x) = \lim_{h \to 0} \frac{f(x+h) - f(x)}{h}f′(x)=h→0limhf(x+h)−f(x)
可微条件:函数在该点的左右导数存在且相等
| 函数类型 | 数学表示 | 导数/偏导数表示 |
|---|---|---|
| 标量到标量 | f:R→Rf: \mathbb{R} \rightarrow \mathbb{R}f:R→R | dfdx\frac{df}{dx}dxdf或f′(x)f'(x)f′(x) |
| 向量到标量 | f:Rn→Rf: \mathbb{R}^n \rightarrow \mathbb{R}f:Rn→R | ∂f∂xi\frac{\partial f}{\partial x_i}∂xi∂f(偏导数) |
| 向量到向量 | f:Rn→Rmf: \mathbb{R}^n \rightarrow \mathbb{R}^mf:Rn→Rm | 雅可比矩阵J∈Rm×n\mathbf{J} \in \mathbb{R}^{m \times n}J∈Rm×n,其中Jij=∂fi∂xjJ_{ij} = \frac{\partial f_i}{\partial x_j}Jij=∂xj∂fi |
深度学习反向传播基于链式法则:
PyTorch的自动微分通过计算图实现,核心流程如下:
w=torch.randn(2,requires_grad=True)# 随机初始化权重并开启梯度追踪b=torch.randn(1,requires_grad=True)# 随机初始化偏置并开启梯度追踪# 假设X为输入特征,Y_true为真实标签Y_pred=torch.matmul(X,w)+b# 线性预测loss=torch.mean((Y_true-Y_pred)**2)# 均方误差损失loss.backward()# 从loss开始反向传播计算梯度# 此时w.grad和b.grad中存储了对应的梯度值learning_rate=0.01withtorch.no_grad():# 关闭梯度追踪以节省内存w-=w.grad*learning_rate b-=b.grad*learning_rate# 清零梯度(重要!否则梯度会累积)w.grad.zero_()b.grad.zero_()in-place操作(如w -= ...)减少内存消耗