传送门:07.处理多维特征的输入_哔哩哔哩_bilibili
多维度输入问题
计算图构建成矩阵相乘就行
import numpy as np import torch import matplotlib.pyplot as plt # delimiter=',' 间隔符是什么 xy = np.loadtxt(r'C:\Users\86196\Desktop\diabetes.csv.gz',delimiter=',',dtype=np.float32) # 千万记得加r # torch.from_numpy(array)是PyTorch中的一个函数,它可以把NumPy的数组转化为PyTorch的张量。 # xy[:, :-1]是在对NumPy数组xy进行切片操作。:表示选择所有行,:-1表示从第一列开始,到倒数第二列结束(不包括最后一列)。 x_data = torch.from_numpy(xy[:, :-1]) # [:[-1]]是使用NumPy的负索引,表示选择最后一列。所以,xy[:, [-1]]得到的是xy数组的最后一列的视图。 y_data = torch.from_numpy(xy[:, [-1]]) 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() # 3.Construct loss and optimizer criterion = torch.nn.BCELoss(size_average=True, reduction='sum') optimizer = torch.optim.SGD(model.parameters(),lr=0.1) # criterion 依旧会构造计算图 # 创建了一个二值交叉熵损失函数(Binary Cross Entropy Loss)。这个函数通常用于二分类问题。 # reduction='mean'意味着在计算损失时,会对每个样本的损失值求平均,得到一个整体的平均损失。 # 也可以写 reduction='sum' # class torch.nn.MSELoss(reduce=True) reduce是问是不是要降维,一般要降维,所以不写 # optimizer 优化器 不会构造计算图 # class torch.optim.SGD(params,Is=<object object>,momentum=0,dampeming=0,weight_decay=0,nesterov=Fale) # parameters找出需要训练的权重,这里我model.parameters(),所以找出的是w # Ir是leaning rate 学习率,就是α # 最后得到的optimizer优化器知道对哪些权重(w)做优化,也知道学习率是多少 epoch_list = [] loss_list = [] for epoch in range(100): # 前馈 y_pred = model(x_data) # 训练 loss = criterion(y_pred, y_data) # 得到loss 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()
另外几种激活函数: