Pytorch使用
Pytorch中文文档链接:pytorch-cn.readthedocs.io/zh/latest/
简易网络搭建
简易网络搭建学习视频参考:www.bilibili.com/video/BV1e4…
1、数据加载与归一化
公共数据集
# 训练数据集
trainset = torchvision.datasets.CIFAR10(
root='./data', train=True, download=True, transform=transform
)
trainloader = torch.utils.data.DataLoader(
trainset, batch_size=4, shuffle=True, num_workers=2
)
# 测试数据集
testset = torchvision.datasets.CIFAR10(
root='./data', train=False, download=True, transform=transform
)
testloader = torch.utils.data.DataLoader(
testset, batch_size=4, shuffle=False, num_workers=2
)
复制代码
设置参数
- root
- train为训练集时为True,为测试集时为False
- download为True为需要进行下载
- 数据归一transform为自定义的数据归一方法
- num_workers为几核一起使用
私人数据集
1、ImageFolder加载
privatrainset = torchvision.datasets.ImageFolder(
root='./data', transform=transform
)
privadataloader = torch.utils.data.DataLoader(
privatrainset, batch_size=4, shuffle=False, num_workers=2
)
复制代码
- 无train、download参数
- 数据集按格式命名
Pytorch会将iage_patめ下面的数据在训练或测试时自动加載
在训练模型的时候, Pytorch会根据 image_path下子文件夹的名字自动给所加载的数据添加标签
在加载私人数据集的时候,数据集所在文件夹应保持一下结构:
/toy_dataset
/class 1
/class 2
...
复制代码
2、自定义数据集以及加载方式
还未使用过,先存着下次用的时候看
2、定义神经网络
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(3, 6, kernel_size=(3, 3))
self.conv2 = nn.Conv2d(6, 16, kernel_size=(3, 3))
self.fc1 = nn.Linear(16*28*28, 512)
self.fc2 = nn.Linear(512, 64)
self.fc3 = nn.Linear(64, 10)
def forward(self, x):
x = self.conv1(x)
x = F.relu(x)
x = self.conv2(x)
x = F.relu(x)
x = x.view(-1, 16*28*28)
x = self.fc1(x)
x = F.relu(x)
x = self.fc2(x)
x = F.relu(x)
x = self.fc3(x)
return x
复制代码
- 继承nn.Module类并进行网络搭建,这里搭建两个卷积层,三个全连接层
- 定义forward函数,确定网络的执行顺序
3、定义权值更新规则与损失函数
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
复制代码
- 定义损失函数为交叉熵损失函数
- 采用SGD优化,learning rate=0.001,momentum=0.9
4、训练神经网络
for epoch in range(1):
for i, data in enumerate(trainloader):
images, labels = data
outputs = net(images)
loss = criterion(outputs, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
复制代码
- 定义训练次数epoch,每一个epoch代表全部数据训练了一轮
- 依次读取训练集for i, data in enumerate(trainloader)
- 梯度清0
- 反向传播
- 反向优化一步
5、模型测试
correct = 0
total = 0
with torch.no_grad():#不计算梯度
for data in testloader:
images, labels = data
outputs = net(images)
_, predicted = torch.max(outputs.data, 1)#预测取出label
correct += (predicted == labels).sum()
total += labels.size(0)
print('准确率:', float(correct)/total)
复制代码
6、保存和读取模型
# 保存模型
torch.save(net.state_dict(), './model.pt')
# 读取模型
net_2 = Net()
net_2.load_state_dict(torch.load('./model.pt'))
correct = 0
total = 0
with torch.no_grad():
for data in testloader:
images, labels = data
outputs = net(images)
_, predicted = torch.max(outputs.data, 1)
correct += (predicted == labels).sum()
total += labels.size(0)
复制代码