本文参加新星计划人工智能(Pytorch)赛道:https://bbs.csdn.net/topics/613989052
目录
一、Pytorch深度学习框架
二、卷积神经网络
三、代码实战
内容:
一、Pytorch深度学习框架
PyTorch是一个开源的深度学习框架,它基于Torch进行了重新实现,主要支持GPU加速计算,同时也可以在CPU上运行。PyTorch框架提供了强大的自动求导功能,可以轻松地构建神经网络模型,并通过反向传播算法来优化模型的各种参数。
PyTorch框架特点:
动态图:PyTorch使用动态图来表示计算图,使得在定义模型时更加灵活自由,可以根据需要对模型进行修改和调整。
易于调试:PyTorch具有良好的调试工具,可以帮助开发者快速定位和解决问题。
易于使用:PyTorch的API设计简洁明了,使得使用起来非常方便快捷。
社区支持:PyTorch近几年特别热,它拥有庞大的社区支持,有海量的资料和教程可供参考,可以快速入门和解决问题。
二、卷积神经网络
卷积神经网络(CNN)是一种深度学习模型,主要应用于图像识别、语音识别等领域。与传统的神经网络相比,CNN引入了卷积层和池化层,可以有效地减少模型参数,提高模型性能。
CNN的核心是卷积层,它通过卷积运算来提取输入特征的空间信息。卷积层包括多个卷积核,每个卷积核可以检测输入数据中的某个特定特征,并生成相应的输出特征图。卷积层的参数共享机制可以大大减少模型参数数量,降低过拟合的风险。
池化层用于进一步降低特征图的维度,同时也可以增强模型的鲁棒性。池化操作通常采用最大池化或平均池化,即对输入特征图中的每个子区域取最大值或平均值,生成新的特征图。
除了卷积层和池化层,CNN还包括全连接层和激活函数等组件,可以构建非常复杂的模型。CNN在图像处理任务中表现出色,它是计算机视觉领域的主流模型之一。
卷积神经网络的基本层与原理:
卷积操作:卷积操作是卷积神经网络的核心操作之一,其目的是从输入数据中提取特征。卷积操作的本质是一种线性变换,它通过一个卷积核在输入数据上进行滑动,并计算每个位置上卷积核与输入数据的内积,得到一个新的特征图。卷积操作可以有效地减少需要学习的参数数量,并且具有平移不变性,即如果输入图像发生平移,提取出的特征不会发生改变。
池化操作:卷积操作得到的特征图通常比输入数据的尺寸大,为了减少特征图的尺寸,降低计算复杂度,我们通常会使用池化操作对特征图进行下采样。常见的池化操作包括最大池化、平均池化等,它们分别选取特定区域内的最大值或平均值作为该区域的输出,从而将特征图的尺寸降低。
激活函数:卷积神经网络通常在卷积和池化操作之后添加一个非线性激活函数,例如ReLU函数,以增强神经网络的表达能力。
全连接层:全连接层是卷积神经网络中的一种常用结构,它将卷积和池化得到的特征图映射到输出类别上。在全连接层中,每个节点都与前一层中的所有节点相连,因此需要学习的参数非常多,计算复杂度也较高。
Dropout层:Dropout操作是常用的正则化技术,可用于防止过拟合。它在训练时随机删除一部分神经元,使得每个神经元的输出不能依赖于其他神经元的存在,从而增加模型的泛化能力。
三、代码实战
下面我将用PyTorch框架搭载一个卷积神经网络模型,手把手教大家构建CNN网络,包括输入层,卷积层,池化层等。通过PyTorch搭建CNN进行图像分类,图像分类的数据集采用CIFAR10数据集,下面的简单易懂的代码部分:
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
# 定义超参数
batch_size = 64
epochs = 10
learning_rate = 0.01
# 判断是否有可用的GPU
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# 定义数据增强方式
transform_train = transforms.Compose([
transforms.RandomCrop(32, padding=4),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])
transform_test = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])
# 加载CIFAR10数据集
train_dataset = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform_train)
test_dataset = datasets.CIFAR10(root='./data', train=False, download=True, transform=transform_test)
# 创建数据加载器
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True, num_workers=2)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=batch_size, shuffle=False, num_workers=2)
# 定义卷积神经网络模型
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(3, 32, kernel_size=3, padding=1)
self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)
self.fc1 = nn.Linear(64 * 8 * 8, 512)
self.fc2 = nn.Linear(512, 10)
def forward(self, x):
x = nn.functional.relu(self.conv1(x))
x = nn.functional.max_pool2d(x, 2)
x = nn.functional.relu(self.conv2(x))
x = nn.functional.max_pool2d(x, 2)
x = x.view(-1, 64 * 8 * 8)
x = nn.functional.relu(self.fc1(x))
x = self.fc2(x)
return x
net = Net().to(device)
# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=learning_rate, momentum=0.9, weight_decay=5e-4)
if __name__=='__main__':
# 训练模型
for epoch in range(epochs):
running_loss = 0.0
for i, data in enumerate(train_loader, 0):
inputs, labels = data[0].to(device), data[1].to(device)
optimizer.zero_grad()
outputs = net(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
if i % 100 == 99:
print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 100))
running_loss = 0.0
print('训练完成')
# 评估模型性能并进行预测
correct = 0
total = 0
with torch.no_grad():
for data in test_loader:
images, labels = data[0].to(device), data[1].to(device)
outputs = net(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print('Accuracy of the network on the 10000 test images: %d %%' % (
100 * correct / total))
classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')
class_correct = list(0. for i in range(10))
class_total = list(0. for i in range(10))
with torch.no_grad():
for data in test_loader:
images, labels = data[0].to(device), data[1].to(device)
outputs = net(images)
_, predicted = torch.max(outputs, 1)
c = (predicted == labels).squeeze()
for i in range(len(labels)):
label = labels[i]
class_correct[label] += c[i].item()
class_total[label] += 1
for i in range(10):
print('Accuracy of %5s : %2d %%' % (
classes[i], 100 * class_correct[i] / class_total[i]))
通过运行,可以得到几图片类别的识别结果。