赞
踩
先来介绍几个比较重要的函数
交叉熵损失函数,在pytorch中若模型使用CrossEntropyLoss这个loss函数,则不应该在最后一层再使用softmax进行激活,因为CrossEntropyLoss函数包括了softmax和计算交叉熵两个过程。
分析实例:https://www.jianshu.com/p/e184663e2f8a
这个类提供了很多图片预处理的方法
transforms.ToTensor()是将图片转换成PyTorch中处理的对象Tensor,并且转化的过程中PyTorch自动将图片标准化了,也就是Tensor的范围是0-1;transforms.Normalize()需要传入两个参数:第一个参数是均值,第二个参数是方差,做的处理就是减均值,再除以方差。
transforms.Compose()将各种预处理操作组合在一起,如在下面的代码中先利用transforms.ToTensor将像素点的值由0-255转换到0-1,transforms.Normalize([0.5], [0.5])表示减去0.5再除以0.5,这样可以将图片转化到了-1到1之间,注意这是因为图片是灰度图,所以只有一个通道,如果是彩色图,有三个通道,那么用transforms.Normalize([a, b, c], [d, e, f])来表示每个通道对应的均值和方差。
torch.utils.data.DataLoader建立一个数据迭代器,先看看 dataloader.py脚本是怎么写的:
init(构造函数)中的几个重要的属性:
脚本分析:https://blog.csdn.net/u014380165/article/details/79058479
多层全连接网络实现MNIST手写数字分类的代码如下:
import torch from torch import optim, nn from torch.autograd import Variable from torch.utils.data import DataLoader from torchvision import datasets, transforms import numpy as np # 加载数据集 def get_data(): # 定义数据预处理操作, transforms.Compose将各种预处理操作组合在一起 data_tf = transforms.Compose([transforms.ToTensor(), transforms.Normalize([0.5], [0.5])]) train_dataset = datasets.MNIST(root='./data', train=True, transform=data_tf, download=True) test_dataset = datasets.MNIST(root='./data', train=False, transform=data_tf, download=True) train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True, drop_last=True) #test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False, drop_last=True) return train_loader, test_dataset # 构建模型,三层神经网络 class batch_net(nn.Module): def __init__(self, in_dim, hidden1_dim, hidden2_dim, out_dim): super(batch_net, self).__init__() self.layer1 = nn.Sequential(nn.Linear(in_dim, hidden1_dim), nn.BatchNorm1d(hidden1_dim), nn.ReLU(True)) self.layer2 = nn.Sequential(nn.Linear(hidden1_dim, hidden2_dim), nn.BatchNorm1d(hidden2_dim), nn.ReLU(True)) self.layer3 = nn.Sequential(nn.Linear(hidden2_dim, out_dim)) def forward(self, x): x = self.layer1(x) x = self.layer2(x) x = self.layer3(x) return x if __name__ == "__main__": # 超参数配置 batch_size = 64 learning_rate = 1e-2 num_epoches = 5 # 加载数据集 train_dataset, test_dataset = get_data() # 导入网络,并定义损失函数和优化器 model = batch_net(28*28, 300, 100, 10) if torch.cuda.is_available(): model = model.cuda() criterion = nn.CrossEntropyLoss() opitimizer = optim.SGD(model.parameters(), lr=learning_rate) # 开始训练 for i in range(num_epoches): for img, label in train_dataset: img = img.view(64, -1) img = Variable(img) #print(img.size()) label = Variable(label) # forward out = model(img) loss = criterion(out, label) # backward opitimizer.zero_grad() loss.backward() opitimizer.step() # 打印 print("epoches= {},loss is {}".format(i, loss)) # 测试 model.eval() count = 0 for data in test_dataset: img, label = data img = img.view(img.size(0), -1) img = Variable(img, volatile=True) #label = Variable(label, volatile=True) out = model(img) _, predict = torch.max(out, 1) if predict == label: count += 1 print("acc = {}".format(count/len(test_dataset)))
运行结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。