jupyter使用方法:
- 命令行cd到本地的指定目录下,jupyter notebook 打开
- .ipnb:jupyter指定文件
- 全部运行:cell -> run all
- Folder:新建文件夹
- Terminal:打开命令行
- shift + 回车 == 运行这行
- 蓝:命令模式 回车跳入
- m:变为Markdown
- y:变成代码单元格
- b:下方创建新单元格
- a:上方
- d:删除
- l:标注行数
- 绿:编辑模式 esc返回
算力云链接: AutoDL算力云
一列:[: , 1]
A_sum_axis0 = A.sum(axis=0)
# 求和所有的行元素来降维
A_sum_axis01 = A.sum(axis=[0,1])
# 对行和列进行求和
A.mean(axis=0)
# 相当于:(除法也可以降维)
A.sum(axis=0) / A.shape[0]
sum_A = A.sum(axis=1, keepdims=True)
# 意味着被求和的维度的大小变为1,总轴数不变
A / sum_A
# 利用广播机制,实现对元素求其在本行中的占比
A.cumsum(axis=0)
# 对axis轴逐轴累加,不影响轴数
torch.dot(x, y)
# y为标量(相同位置的元素相乘再相加)
# 相当于:
torch.sum(x * y)
torch.mv(A, x)
# A中axis=1的长度必须与x长度相等
torch.mm(A, B)
# 矩阵乘法,行乘列···
L 2 L_2 L2范数:向量元素平方和的平方根:
∥ x ∥ 2 = ∑ i = 1 n x i 2 , \|\mathbf{x}\|_2 = \sqrt{\sum_{i=1}^n x_i^2}, ∥x∥2=i=1∑nxi2,
torch.norm(u)
# 返回标量
L 1 L_1 L1范数:向量元素的绝对值之和:
∥ x ∥ 1 = ∑ i = 1 n ∣ x i ∣ . \|\mathbf{x}\|_1 = \sum_{i=1}^n \left|x_i \right|. ∥x∥1=i=1∑n∣xi∣.
torch.abs(u).sum()
# 与L2范数相比,受异常值的影响更小
F范数(Frobenius):把矩阵的所有元素拉成一条向量,再做其范数
∥ X ∥ F o r b = ∑ i = 1 m ∑ j = 1 n x i j 2 \|\mathbf{X}\|_{Forb} = \sqrt{\sum_{i=1}^m \sum_{j=1}^n x_{ij}^2} ∥X∥Forb=i=1∑mj=1∑nxij2
torch.norm(torch.ones((4, 9)))
# Frobenius范数满足向量范数的所有性质,它就像是矩阵形向量的范数。
补充:
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean())# .mean:取平均
print(inputs)
inputs = pd.get_dummies(inputs, dummy_na=True)
print(inputs)
import torch
X = torch.tensor(inputs.to_numpy(dtype=float))
y = torch.tensor(outputs.to_numpy(dtype=float))
X, y
x.requires_grad_(True) # 等价于x=torch.arange(4.0,requires_grad=True)
x.grad # 默认值是None
# x.grad 可访问梯度
y.backward() # 反向传播
x.grad # 显示梯度
# 在默认情况下,PyTorch会累积梯度,我们需要清除之前的值
x.grad.zero_() # 清零梯度
y = x.sum()
y.backward()
x.grad
import numpy as np
import torch
from torch.utils import data
from d2l import torch as d2l
from torch import nn
true_w = torch.tensor([2, -3.4])
true_b = 4.2
d2l.synthetic_data(true_w, true_b, 1000)
# 根据true_w,true_b,构造随机的1000大小的数据集
def load_array(data_arrays, batch_size, is_train=True):
"""构造一个PyTorch数据迭代器"""
dataset = data.TensorDataset(*data_arrays)
# data.TensorDataset:对数据进行封装;
return data.DataLoader(dataset, batch_size, shuffle=is_train)
# data.DataLoader:对数据进行加载
# 设定批量大小,开始迭代
batch_size = 10
data_iter = load_array((features, labels), batch_size)
# features:特征 labels:标签
next(iter(data_iter))
# 使用iter构造Python迭代器,并使用next从迭代器中获取第一项
net = nn.Sequential(nn.Linear(2, 1))
# Linear:单层线性回归层(输入,输出)
# nn.Sequential():有序容器,一个个执行模块,可以允许将整个容器视为单个模块
net[0].weight.data.normal_(0, 0.01)
# 访问Sequential容器的第一层的权重数据 .normal_(均值,方差):使用正态分布来替换data的值
net[0].bias.data.fill_(0)
# 偏差设置
loss = nn.MSELoss()
# MSELoss:计算均方误差,平方范数
trainer = torch.optim.SGD(net.parameters(), lr=0.03)
# SGD(stochastic gradient descent):随机梯度下降
# .parameters:包含所有w和b的字典
# lr:学习率
num_epochs = 3 # 迭代三个周期
for epoch in range(num_epochs):
for X, y in data_iter:
# 在data_iter中一次次把X和y取出
l = loss(net(X) ,y)
# net(X):预测值
trainer.zero_grad()
# 优化器trainer把梯度清零,不然会累加
l.backward()
# 往回计算w,b
trainer.step()
# step()对模型进行更新
l = loss(net(features), labels)
print(f'epoch {epoch + 1}, loss {l:f}')
# 每迭代一次进行打印记录
查torch手册!
回归问题和分类问题的区别:
回归(多少?):估计一个连续值(例:房价预测,输入连续值,输出一个最佳的(与真实值的区别作为损失))
分类:(哪一个?)预测一个离散问题(例:识别猫狗,多输出,输出i是预测为第i类的置信度)
从回归到多分类–均方损失
o 1 = x 1 w 11 + x 2 w 12 + x 3 w 13 + x 4 w 14 + b 1 , o 2 = x 1 w 21 + x 2 w 22 + x 3 w 23 + x 4 w 24 + b 2 , o 3 = x 1 w 31 + x 2 w 32 + x 3 w 33 + x 4 w 34 + b 3 . \begin{aligned} o_1 &= x_1 w_{11} + x_2 w_{12} + x_3 w_{13} + x_4 w_{14} + b_1,\\ o_2 &= x_1 w_{21} + x_2 w_{22} + x_3 w_{23} + x_4 w_{24} + b_2,\\ o_3 &= x_1 w_{31} + x_2 w_{32} + x_3 w_{33} + x_4 w_{34} + b_3. \end{aligned} o1o2o3=x1w11+x2w12+x3w13+x4w14+b1,=x1w21+x2w22+x3w23+x4w24+b2,=x1w31+x2w32+x3w33+x4w34+b3.
Softmax回归是分类问题
作用:将具体的值转换为相对的概率(非负,和为一)
y ^ = s o f t m a x ( o ) 其中 y ^ j = exp ( o j ) ∑ k exp ( o k ) \hat{\mathbf{y}} = \mathrm{softmax}(\mathbf{o})\quad \text{其中}\quad \hat{y}_j = \frac{\exp(o_j)}{\sum_k \exp(o_k)} y^=softmax(o)其中y^j=∑kexp(ok)exp(oj)
exp(x) == ex
损失函数(交叉熵损失):度量预测的效果
索引 i i i的样本由特征向量 x ( i ) \mathbf{x}^{(i)} x(i)和独热标签向量 y ( i ) \mathbf{y}^{(i)} y(i)组成
l ( y , y ^ ) = − ∑ j = 1 q y j log y ^ j . l(\mathbf{y}, \hat{\mathbf{y}}) = - \sum_{j=1}^q y_j \log \hat{y}_j. l(y,y^)=−j=1∑qyjlogy^j.