学习笔记|B 站 UP 主 刘二大人 《PyTorch深度学习实践》视频知识点总结
传送门 PyTorch深度学习实践——处理多维特征的输入

视频中截图
在这里插入图片描述

  1. 乘的权重(w)都一样,加的偏置(b)也一样。b变成矩阵时使用广播机制。神经网络的参数w和b是网络需要学习的,其他是已知的。
  2. 学习能力越强,有可能会把输入样本中噪声的规律也学到。我们要学习数据本身真实数据的规律,学习能力要有泛化能力。
  3. 该神经网络共3层;第一层是8维到6维的非线性空间变换,第二层是6维到4维的非线性空间变换,第三层是4维到1维的非线性空间变换。
  4. 本算法中torch.nn.Sigmoid() # 将其看作是网络的一层,而不是简单的函数使用
  5. torch.sigmoid、torch.nn.Sigmoid和torch.nn.functional.sigmoid的区别

1. 多维特征的线性模型

对于 n n n 维输入特征 X = [ x 1 , x 2 , . . . , x n ] X = [x_1, x_2, ..., x_n] X=[x1,x2,...,xn],线性模型的形式扩展为:
y p r e d = w 1 x 1 + w 2 x 2 + . . . + w n x n + b = W ⋅ X + b y_{pred} = w_1x_1 + w_2x_2 + ... + w_nx_n + b = W \cdot X + b ypred=w1x1+w2x2+...+wnxn+b=WX+b
其中:

  • W = [ w 1 , w 2 , . . . , w n ] W = [w_1, w_2, ..., w_n] W=[w1,w2,...,wn]权重向量(维度与输入特征一致);
  • b b b 是偏置(标量);
  • 本质仍是线性组合,只是特征维度从 1 维变为 n n n 维。

2. 关键注意事项

  • 特征维度匹配:模型输入层的维度必须与特征维度严格一致,否则会出现维度不匹配错误;
  • 数据标准化/归一化:多维特征往往存在量纲差异(如面积单位是㎡,价格单位是万元),需通过标准化(Z-Score)归一化(Min-Max) 消除量纲影响,提升模型收敛速度;
  • 反向传播逻辑不变:损失函数对多维权重 W W W 的梯度仍通过链式法则计算,只是梯度维度与权重维度一致。

3. 源代码

import numpy as np
import torch
import matplotlib.pyplot as plt
 
# prepare dataset
xy = np.loadtxt('diabetes.csv', delimiter=',', dtype=np.float32)
x_data = torch.from_numpy(xy[:, :-1]) # 第一个‘:’是指读取所有行,第二个‘:’是指从第一列开始,最后一列不要
y_data = torch.from_numpy(xy[:, [-1]]) # [-1] 最后得到的是个矩阵
 
# design model using class
 
 
class Model(torch.nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.linear1 = torch.nn.Linear(8, 6) # 输入数据x的特征是8维,x有8个特征
        self.linear2 = torch.nn.Linear(6, 4)
        self.linear3 = torch.nn.Linear(4, 1)
        self.sigmoid = torch.nn.Sigmoid() # 将其看作是网络的一层,而不是简单的函数使用
 
    def forward(self, x):
        x = self.sigmoid(self.linear1(x))
        x = self.sigmoid(self.linear2(x))
        x = self.sigmoid(self.linear3(x)) # y hat
        return x
 
 
model = Model()
 
# construct loss and optimizer
# criterion = torch.nn.BCELoss(size_average = True)
criterion = torch.nn.BCELoss(reduction='mean')  
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
 
epoch_list = []
loss_list = []
# training cycle forward, backward, update
for epoch in range(100):
    y_pred = model(x_data)
    loss = criterion(y_pred, y_data)
    print(epoch, loss.item())
    epoch_list.append(epoch)
    loss_list.append(loss.item())
 
    optimizer.zero_grad()
    loss.backward()
 
    optimizer.step()
 
 
plt.plot(epoch_list, loss_list)
plt.ylabel('loss')
plt.xlabel('epoch')
plt.show()

diabetes.csv数据集老师给了下载地址,该数据集需和源代码放在同一个文件夹内。

更多推荐