PyTorch简易搭建一个神经网络

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
)
复制代码

设置参数

  1. root
  2. train为训练集时为True,为测试集时为False
  3. download为True为需要进行下载
  4. 数据归一transform为自定义的数据归一方法
  5. 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
)
复制代码
  1. 无train、download参数
  2. 数据集按格式命名

Pytorch会将iage_patめ下面的数据在训练或测试时自动加載

在训练模型的时候, Pytorch会根据 image_path下子文件夹的名字自动给所加载的数据添加标签

在加载私人数据集的时候,数据集所在文件夹应保持一下结构:

/toy_dataset
    /class 1
    /class 2
    ...
复制代码

2、自定义数据集以及加载方式

www.jianshu.com/p/2d9927a70…

还未使用过,先存着下次用的时候看

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)
复制代码

猜你喜欢

转载自juejin.im/post/7064278931876085791