利用torch.nn实现logistic回归在人工构造的数据集上进行训练和测试:
(1)(2)(3)同手动实现
(4)构建内置迭代器
- #构建迭代器
- lr = 0.03
- batch_size = 10
- # 将训练数据的特征和标签组合
- dataset = Data.TensorDataset(x, y)
- # 把 dataset 放入 DataLoader
- data_iter = Data.DataLoader(
- dataset=dataset, # torch TensorDataset format
- batch_size=batch_size, # mini batch size
- shuffle=True, # 是否打乱数据 (训练集一般需要进行打乱)
- num_workers=0, # 多线程来读数据,注意在Windows下需要设置为0
- )
(5)构建Logistic模型
- #构建Logistic模型
- class LogisticNet(torch.nn.Module):
- def __init__(self, n_feature):
- super(LogisticNet, self).__init__()
- self.linear = torch.nn.Linear(n_feature, 1)
- self.sigmoid = torch.nn.Sigmoid()
- # forward 定义前向传播
- def forward(self, x):
- x = self.linear(x)
- x = self.sigmoid(x)
- return x
- net = LogisticNet(2)
(6)参数初始化和定义损失函数及优化方法
- #参数初始化
- init.normal_(net.linear.weight, mean=0, std=1.0)
- init.constant_(net.linear.bias, val=0) # 也可以直接修改bias的data:net[0].bias.data.fill_(0)
- #损失函数和优化方法
- loss = torch.nn.BCELoss()
- optimizer = optim.SGD(net.parameters(), lr=0.03) #梯度下降的学习率指定为0.03
(7)开始训练并输出每轮最后一批次训练集的平均损失
- #开始训练并计算每轮损失
- num_epochs = 20
- for epoch in range(1, num_epochs + 1):
- for X, Y in data_iter:
- output = net(X)
- l = loss(output, Y.view(-1, 1))
- optimizer.zero_grad() # 梯度清零,等价于net.zero_grad()
- l.backward()
- optimizer.step()
- print('epoch %d, loss: %f' % (epoch, l.item()))#仅最后一批训练集的损失的均值
- # 训练集上的正确率
- allTrain = 0
- rightTrain = 0
- for train_x, train_y in data_iter:
- allTrain += len(train_y)
- train_out = net(train_x)
- mask = train_out.ge(0.5).float()
- correct = (mask.view(-1, 1) == train_y.view(-1, 1)).sum()
- rightTrain += correct.float().sum()
- print('train accuracy: %f' % (rightTrain/allTrain))