python基础
ps:针对po主自身的遗忘知识进行补充,
1. python继承
python
class person():#注意这里有()
def __init__(self,name,age):
self.name = name
self.age = age
def print_name(self):
print(name)
def print_age(self):
print(age)
myname = person("wan",18) #实例化。之后才能调用函数使用
print(myname.print_name())#这里返回结果为None,因为print_name()没有返回值
class superman(person):
def __inti__(self,name,age):
super(superman,self).__init__(name,age)#注意
self.fly_ = True
def fly(self):
if self.fly_ == True:
print("我会飞")
2.numpy
python
list1 = [
[1,2,3,4,5],
[6,7,8,9,10],
[11,12,13,14,15]
]# 3行5列 构造成张量
array = np.array(list1) #把list1 转化成矩阵
list1[1:3] #取出第2,3行的子列表
array[:, :] #先取行,再取列,这里全部行列都取
idx = [1,3]
array([: idx]) #所有行 + 第2列 + 第3列
3.tensor张量
(1) 列表转数组/张量
python
list1 = [
[1,2,3,4,5],
[6,7,8,9,10],
[11,12,13,14,15]
]
print(list1) # 打印原生Python二维列表
array = np.array(list1) # 列表转NumPy数组
tensor1 = torch.tensor(list1) # 列表转PyTorch张量
print(tensor1) # 打印PyTorch张量(格式比NumPy更贴近深度学习框架)
print(array) # 打印NumPy数组
输出结果

(2)pytorch自动求导
python
x = torch.tensor(3.0) # 创建标量张量(单个数值),值为3.0
x.requires_grad_(True) # 开启梯度追踪:告诉PyTorch要记录x的运算,用于后续求导
y = x**2 # 计算y = x²,PyTorch会构建「计算图」(记录y依赖x的运算过程)
y.backward() # 反向传播:计算y对x的梯度(导数),梯度会存到x.grad中(理论值=2*x=6.0)
x = x.detach() # 剥离梯度追踪:返回新张量,和原x共享数据,但不再记录运算(requires_grad=False)
x.grad = torch.tensor(0.0) # 手动将x的梯度置0(通常在优化器更新参数后做,这里是手动演示)
y2 = x**2 # 此时x已剥离梯度,PyTorch不会构建计算图
y2.backward() # ❌ 这里会报错!因为y2没有梯度追踪,无法反向传播
# print(y2) # 若忽略报错,会输出9.0(3²)
# print(x.grad) # 输出0.0(因为反向传播失败,梯度未更新)
(3) 张量初始化
python
tensor1 = torch.ones((100,4))# 100行 x 4 列的全为1)
print(tensor1)
tensor2 = torch.zeros((10,4)) # 10 个4列的全为0
print(tensor2)
tensor3 = torch.normal(10,1,(3,10,4))# 正态分布
# normal(均值,标准差,三维向量)
print(tensor3))
torch.ones((100,4))表示shape为(100,4)全为1的二维张量
torch.normal(正态分布随机数字)
注意上述代码中的()两层括号
上述结果
tensor([[1., 1., 1., 1.],
[1., 1., 1., 1.],
..., # 共100行
[1., 1., 1., 1.]])
tensor([[0., 0., 0., 0.],
[0., 0., 0., 0.],
..., # 共10行
[0., 0., 0., 0.]])
tensor([[[ 9.2990, 10.3007, 11.7141, 8.4621],
[ 8.9293, 11.7105, 9.7123, 10.5644],
[10.5153, 9.0564, 10.2623, 11.8146],
[ 9.6422, 8.5480, 9.0676, 9.1018],
[ 8.9979, 10.1083, 9.2720, 10.3965],
[11.6095, 12.1560, 9.7455, 11.2057],
[10.3238, 10.3913, 9.7489, 11.1586],
[10.3277, 9.9176, 8.7060, 9.4850],
[11.6660, 9.8273, 10.0534, 11.0817],
[ 7.6588, 9.7928, 10.2590, 11.3895]],
[[ 9.2820, 10.3872, 9.7100, 9.1333],
[ 9.2947, 10.0347, 11.1755, 9.9202],
[10.9146, 11.0291, 9.5526, 10.4831],
[11.0311, 10.3769, 11.4328, 9.3844],
[10.2222, 10.0463, 10.8848, 12.3220],
[10.4420, 8.0401, 10.6381, 9.4674],
[11.4755, 11.3810, 8.4529, 8.1777],
[11.2544, 8.3422, 11.7195, 9.2538],
[ 9.8136, 8.8172, 10.8308, 10.2737],
[10.1588, 10.9774, 11.0225, 7.1054]],
[[ 9.1870, 10.3700, 9.4246, 10.0032],
[11.0332, 10.0739, 9.6832, 10.6644],
[10.7322, 9.4124, 8.5966, 11.5322],
[10.0094, 10.2329, 10.3478, 9.2008],
[10.7984, 8.8747, 10.2707, 11.7471],
[ 9.5634, 10.0287, 9.5285, 10.8278],
[ 9.3333, 10.1836, 10.3081, 10.2077],
[ 9.7549, 9.4539, 10.4862, 9.7735],
[10.2071, 10.4261, 11.3190, 9.7748],
[11.9193, 10.1932, 11.4428, 10.0864]]])
(4) 张量求和 + 查看张量形状
python
tensor1 = torch.ones((10,4))
sum1 = torch.sum(tensor1, dim=1, keepdim=True)
print(sum1)
print(tensor1.shape)
sum(目标张量,求和维度(0 = 下,1 = 右),保持原维度结构不变)
keepdim = 默认是False,求和后变成10行1列,当keepdim = True 时,求和后变成1行10列
tensor([[4.],
[4.],
[4.],
[4.],
[4.],
[4.],
[4.],
[4.],
[4.],
[4.]]) 加了keepdim = True
tensor([4., 4., 4., 4., 4., 4., 4., 4., 4., 4.]) # 不加keepdim 默认False
torch.Size([10, 4])
二、 pytorch基本操作
1、创建张量的函数
torch.normal(0, 1, (data_num, len(w))) - 生成正态分布的张量
torch.tensor([8.1,2,2,4]) - 创建指定值的张量
torch.tensor(1.1) - 创建标量张量
2、数学运算函数
torch.matmul(x, w) - 矩阵乘法运算
torch.sum(abs(pre_y-y)) - 计算张量元素的和
torch.abs() - 计算绝对值(在maeLoss函数中)
3、张量属性
requires_grad=True - 设置张量是否需要计算梯度
shape - 获取张量的形状信息
4、梯度相关操作
loss.backward() - 执行反向传播计算梯度
para.grad - 访问参数的梯度值
para.grad.zero_() - 将梯度值清零
5、张量转换方法
detach() - 从计算图中断开张量,返回一个新的张量但不参与梯度计算
numpy() - 将PyTorch张量转换为NumPy数组