本文旨在记录自己学习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')
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)