import torch
import numpy as np

xy = np.loadtxt('diabetes.csv.gz', delimiter=',', dtype=np.float32)
x_data = torch.from_numpy(xy[:, 0:-1])  # 前8列作为特征
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)  # 输入层->隐藏层1
        self.linear2 = torch.nn.Linear(6, 4)  # 隐藏层1->隐藏层2
        self.linear3 = torch.nn.Linear(4, 1)  # 隐藏层2->输出层
        self.sigmoid = torch.nn.Sigmoid()  # Sigmoid激活函数
    # 前向传播步骤:
    # ①输入数据通过第一个线性变换 + Sigmoid激活
    # ②结果通过第二个线性变换 + Sigmoid激活
    # ③最后通过第三个线性变换 + 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(size_average=True)  # 二元交叉熵损失(已弃用)
criterion = torch.nn.BCELoss(reduction='mean') # 二元交叉熵损失函数(取平均)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)  # SGD优化器

for epoch in range(1000):
    y_pred = model(x_data) # 前向传播
    loss = criterion(y_pred, y_data) # 计算损失
    print("epoch:", epoch, "loss:", loss.item())
    optimizer.zero_grad() # 梯度清零
    loss.backward() # 反向传播(自动计算梯度)
    optimizer.step() # 参数更新(自动使用梯度更新所有参数)

更多推荐