pytorch模型构建

pytorch模型构建,第1张

本文旨在记录自己学习pytorch所构建的第一个模型,后续将会写有关自然语言处理的相关分享,帮助其他和我一样深度学习领域的小白理解这项技术。

首先,我们学习深度学习不同与其他python扩展内容,深度学习所涉及到的一些专业知识需要有一定的数学和理论基础,不然在听实践课的时候,会一头雾水,这是博主的亲身经历,希望大家脚踏实地,好好学习基础,少走弯路。

下面的内容将围绕所构建的模型来阐述。

配置

博主用的是3.7的python和1.11.0的torch库。不要下载pytorch!注意是torch!

然后需要安装几个支持库和必须的库

numpy

six

pillow

torch-version(计算机视觉)

matplotlib

 导入库
import torch.nn as nn
import torch
import torch.functional as F
import torchvision
import torch.optim as optim
import torchvision.transforms as trans
import matplotlib.pyplot as plt
import numpy as np
张量转换器

我们想要训练模型,那么我们就要知道,我们训练的到底是什么。我们使用tensorflow和pytorch时,模型训练的是张量,关于张量可能有不同的叫法,但本质上是矩阵。所以,一般情况下,我们自己构建数据集和模型时,一定要注意数据类型的转换。

trans = trans.Compose(
    [trans.ToTensor(),
     trans.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]
)
下载数据集 

下载数据集大家肯定没问题的,下载完之后,可以把download的值改为False或者把download=Ture这段删掉,不影响后面训练的。

# 训练集导入
trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True,transform=trans)
# 训练集加载
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=True, num_workers=0)

# 测试集导入
testset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True,transform=trans)
# 测试集加载
testloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=False, num_workers=0)

# 分类集
classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')

下载完,在我们的本目录下会出现一个data文件夹,里面就是CIFAR10数据集。

 

 

定义模型类

__init__()函数,初始化一个简单的网络,两层卷积,一层池化,三层全连接 

参数:Conv2d中,3代表输入维度,6代表输出维度,5代表卷积核的大小(5*5的卷积核)

MaxPool2d中,(2*2)代表池化窗口大小。

三个全连接网络的参数要传递正确,第一层全连接传递给第二层时,第二层的接收参数数量要与第一层的传递参数数量相等,最后输出10与我们要识别的物品种类数有关,这里我们识别了十种物品,所以输出为10.

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        #两层卷积网络,中间是一层池化
        self.conv1 = nn.Conv2d(3, 6, 5)
        self.pool = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(6, 16, 5)
        # 三个全连接网络
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        x = self.pool(torch.relu(self.conv1(x)))
        x = self.pool(torch.relu(self.conv2(x)))
        x = x.view(-1, 16 * 5 * 5)
        x = torch.relu(self.fc1(x))
        x = torch.relu(self.fc2(x))
        x = self.fc3(x)
        return x


net = Net()
构建损失函数与优化器
criterion = nn.CrossEntropyLoss()
optimzier = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

这一步没有什么问题,torch中提供的方法还是很便捷的。

 构建训练函数

这里我选择进行了两轮训练。其中enumerate函数是用来遍历集合对象,同时返回对象的下标。0代表下标从0开始。

def epoch():
    for epochs in range(2):
        running_loss = 0.0
        for i, data in enumerate(trainloader, 0):
            # data contains inputs and labels
            inputs, labels = data
            # 梯度归零
            optimzier.zero_grad()
            # 输入图像张 量进入网络
            outputs = net(inputs)
            # 利用输出outputs和labels计算损失值
            loss = criterion(outputs, labels)
            # 反向传播+参数更新
            loss.backward()
            optimzier.step()

            # print the turn and loss
            running_loss += loss.item()
            if (i + 1) % 2000 == 0:
                print('[%d,%5d] loss:%.3f' % (epochs + 1, i + 1, running_loss / 2000))
                running_loss = 0.0
    print("finish")


epoch()
最后一步,保存模型
PATH = './cifar_net.pth'

torch.save(net.state_dict(),PATH)

print('success save')

到这,我们的一个简单的pytorch模型就构建好了。

respect!最后附上源码

import torch.nn as nn
import torch
import torch.functional as F
import torchvision
import torch.optim as optim
import torchvision.transforms as trans
import matplotlib.pyplot as plt
import numpy as np


class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        # 第一层卷积网络,输入通道1层,输出6层,卷积核3*3
        self.conv1 = nn.Conv2d(3, 6, 5)
        self.pool = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(6, 16, 5)
        # 三个全连接网络
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        x = self.pool(torch.relu(self.conv1(x)))
        x = self.pool(torch.relu(self.conv2(x)))
        x = x.view(-1, 16 * 5 * 5)
        x = torch.relu(self.fc1(x))
        x = torch.relu(self.fc2(x))
        x = self.fc3(x)
        return x


net = Net()

criterion = nn.CrossEntropyLoss()
optimzier = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

trans = trans.Compose(
    [trans.ToTensor(),
     trans.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]
)
# 训练集导入
trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True,transform=trans)
# 训练集加载
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=True, num_workers=0)

# 测试集导入
testset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True,transform=trans)
# 测试集加载
testloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=False, num_workers=0)

# 分类集
classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')


# # 构建图片展示函数
# def imshow(img):
#     img = img / 2 + 0.5
#     npimg = img.numpy()
#     plt.imshow(np.transpose(npimg, (1, 2, 0)))
#     plt.show()
#
#
# # 读取一张图片从迭代器
# dataiter = iter(trainloader)
# images, labels = dataiter.next()
# # 展示图片
# imshow(torchvision.utils.make_grid(images))
# # print the label
# print(' '.join('%5s' % classes[labels[j]] for j in range(4)))


def epoch():
    for epochs in range(2):
        running_loss = 0.0
        for i, data in enumerate(trainloader, 0):
            # data contains inputs and labels
            inputs, labels = data
            # 梯度归零
            optimzier.zero_grad()
            # 输入图像张 量进入网络
            outputs = net(inputs)
            # 利用输出outputs和labels计算损失值
            loss = criterion(outputs, labels)
            # 反向传播+参数更新
            loss.backward()
            optimzier.step()

            # print the turn and loss
            running_loss += loss.item()
            if (i + 1) % 2000 == 0:
                print('[%d,%5d] loss:%.3f' % (epochs + 1, i + 1, running_loss / 2000))
                running_loss = 0.0
    print("finish")


epoch()

PATH = './cifar_net.pth'

torch.save(net.state_dict(),PATH)

print('success save')

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/727965.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存