本文旨在记录自己学习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')

技术
下载桌面版
GitHub
百度网盘(提取码:draw)
Gitee
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:766591547
关注微信