pytorch基础实现
-
模型形式:
Logistic 回归的模型形式和线性回归一样,都是 y = wx + b,其中 x 可以是一个多维的特征,唯一不同的地方在于 Logistic 回归会对 y 作用一个 logistic 函数,将其变为一种概率的结果。 Logistic 函数作为 Logistic 回归的核心, Logistic 函数,也被称为 Sigmoid 函数。 -
Sigmoid函数
公式:S(x) = 1/1+e^-x
https://baike.baidu.com/item/Sigmoid函数/7981407?fr=aladdin
逻辑回归实质是Linear线性函数(wx+b)与一个sigmoid函数的结合。
-
代码实现
import
torch`
import torch.nn as nn
import torchvision
import torchvision.transforms as transforms#训练模型的超参数
input_size = 784num_classes = 10
num_epochs = 5
batch_size = 100
learning_rate = 0.001
#MNIST 数据集 (样本,标签)
train_dataset = torchvision.datasets.MNIST(root=’./data’,
train=True, transform=transforms.ToTensor(), download=True)
test_dataset = torchvision.datasets.MNIST(root=’./data’,
train=False, transform=transforms.ToTensor())
#构建数据管道
train_loader = torch.utils.data.DataLoader(dataset=train_dataset,
batch_size=batch_size, shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset,
batch_size=batch_size, shuffle=False)
#搭建逻辑回归模型, 主要体现在后边的loss上,使用交叉熵
model = nn.Linear(input_size, num_classes)
#损失函数和优化算法
#nn.CrossEntropyLoss() computes softmax internally
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
#train_loader的大小,也就是含有多少个bach。
total_step = len(train_loader)
#训练模型
#在整个数据集上迭代的次数
for epoch in range(num_epochs):每次取一个bach进行训练。
for i, (images, labels) in enumerate(train_loader):
# 将数据reshape到模型需要的大小。
images = images.reshape(-1, 28*28)# 前向传播 outputs = model(images) # 计算模型的loss loss = criterion(outputs, labels) # 后向传播,更新模型参数 optimizer.zero_grad() loss.backward() optimizer.step() # 每100个batch,打印一次结果 if (i+1) % 100 == 0: print ('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}' .format(epoch+1, num_epochs, i+1, total_step, loss.item()))
#模型测试
#在测试阶段,不用计算梯度
with torch.no_grad():
correct = 0
total = 0
for images, labels in test_loader:
images = images.reshape(-1, 28*28)
outputs = model(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum()print(‘Accuracy of the model on the 10000 test images: {} %’.format(100 * correct / total))
保存模型
torch.save(model.state_dict(), ‘model.ckpt’)