思路
数据准备
1 2 3
| xy = np.loadtxt('diabetes.csv', delimiter=',', dtype=np.float32) x_data = torch.from_numpy(xy[:, :-1]) y_data = torch.from_numpy(xy[:, [-1]])
|
x_data表示读取所有行,从第一列读到倒数第二列
y_data表示读取所有行的最后一列
模型设计
1 2 3 4 5 6 7 8 9 10 11 12 13
| class Model(torch.nn.Module): def __init__(self): super(Model, self).__init__() self.linear1 = torch.nn.Linear(8, 6) 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)) return x
|
- 三层全连接层:构建三层神经网络模型,维度变化:
8 -> 6 -> 4 -> 1,逐层降低维度
- 激活函数:每层后接Sigmoid,将输出压缩到[0, 1]范围
- 前向传播:数据依次通过各层和Sigmoid,最终输出预测值
损失函数与优化器
1 2
| criterion = torch.nn.BCELoss(reduction='mean') optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
|
$$
BCELoss(y_{pred},y_{true})=-\frac{1}{N}\sum_{i=1}^{N}[y_{true}^{(i)}\cdot log(y_{pred}^{(i)})+(1-y_{true}^{(i)})\cdot log(1-y_{pred})^{(i)}]
$$
$$
\theta_{t+1}=\theta_{t}-\eta \cdot\nabla_{\theta}\mathcal{L}(\theta_{t})
$$
训练循环
- 前向传播:输入数据得到预测值
y_pred
- 计算损失:比较
y_pred与y_data
- 反向传播:计算梯度
loss.backward(),清零历史梯度optimizer.zero_grad()
- 参数更新:调整模型参数
optimizer.step()
- 记录损失
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 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()
|
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| import numpy as np import torch import matplotlib.pyplot as plt
xy = np.loadtxt('diabetes.csv', delimiter=',', dtype=np.float32) x_data = torch.from_numpy(xy[:, :-1]) 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) 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)) return x
model = Model()
criterion = torch.nn.BCELoss(reduction='mean') optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
epoch_list = [] loss_list = []
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()
|