原文发布时间:2023-03-03 11:15:52
由于质量分过低,因此进行完善更新
主要补充:
1、分享一个简单的深度学习代码案例(手写数字识别)分析
2、我是如何阅读深度学习代码的,以及一些小白阶段性的思路。
努力上路的小白一枚,麻烦路过的大佬指导一二,同时希望能和大家交流学习~
和学长学姐、实习老师们交流后的目前思路:
代码看累了,就看《动手学深度学习》文档:基于PyTorch框架,从底层函数实现基础功能,再到框架的高级功能
http://zh.gluon.ai/chapter_preface/preface.html
争取更新学习这个文档的专栏,记录学习过程
20天吃掉那只Pytorch
https://jackiexiao.github.io/eat_pytorch_in_20_days/
这个感觉更浅一点儿,之后复习看吧
量身定做了一套话术hhh,亲身测试还不错
我是一个深度学习代码小白,请你用中文写上注释,能让我能轻松理解下面这段代码。注意包含所有函数、调用和参数的注释。以同样的python代码块样式返回你写的代码给我
# -*- coding: utf-8 -*- """ Created on Mon Feb 27 11:23:44 2023 """
作为一个深度学习领域的小白,我仍然记得当初初次尝试阅读深度学习代码时所面对的挑战。那时,代码看起来晦涩难懂,但随着时间的推移和不断的学习,我逐渐克服了这些困难。
在这篇博客中,我将分享我是如何阅读深度学习代码的,以及一些小白阶段性的思路。
我发现大多数深度学习代码都是用Python编写的,所以我决定学习Python。起初,我只掌握了一些基本的Python语法,如变量、条件语句和循环。这使我能够理解和修改简单的代码示例。
深度学习是一个复杂的领域,所以我开始了解神经网络、卷积神经网络、循环神经网络等基本概念。这些概念是理解深度学习代码的基础,所以我花了一些时间来阅读教科书、在线教程和学习资料。
深度学习代码通常使用深度学习框架和库来实现,如TensorFlow、PyTorch等。我选择了PyTorch,因为它有着强大的社区支持和丰富的资源。
我开始学习如何构建神经网络、进行数据预处理和训练模型。这需要不断的实践和尝试,过程可能比想象要更久一点,但是学完了就轻松了。
逐渐熟悉了基本概念和工具后,我开始阅读一些简单的示例代码。
选择了一些经典的任务,如手写数字识别,因为它们有大量的教程和示例代码可供学习。然后我尝试理解代码的结构、数据流和关键步骤。
深度学习代码的调试是一个常见的挑战。我遇到了很多错误,但每个错误都是一个学习机会。我学会了如何查找错误、尝试不同的解决方法,以及如何进行实验来测试不同的模型和参数设置。这个过程需要耐心和毅力,但我发现它是非常有益的。
在学习深度学习代码的过程中,文档和资源是非常重要的。
我开始查阅PyTorch官方文档、在线教程和博客文章,以解决问题和理解代码。这帮助我更好地理解框架的功能和用法。
深度学习领域有着庞大的社区,充满了热情的从业者。我加入了很多社群潜水,观望大佬们的交流,我发现社群成员愿意分享知识和帮助新手,这对我来说是一种巨大的鼓舞。
参与了CSDN的博客笔记记录,与其他人互动和分享自己的进展,对我来说是学习的一种很好的方式。
这是一个简单的深度学习代码示例,它包括了数据加载、数据预处理、模型构建、模型编译、训练和评估等步骤。通过逐行分析代码,可以更好地理解深度学习代码的结构和逻辑。当熟悉这些基本步骤后,可以尝试更复杂的任务和模型。
当学习深度学习代码时,逐行分析代码是非常有帮助的。下面是一个PyTorch示例(手写数字识别),我将逐行进行分析:
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
transforms
模块和一些视觉数据集(torchvision
)。transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])
transforms.Compose
允许将多个数据转换操作组合在一起。在这里,我们定义了两个转换操作,分别是将图像转换为张量(transforms.ToTensor()
)和将像素值进行标准化(transforms.Normalize
)。trainset = torchvision.datasets.MNIST(root='./data', train=True, download=True, transform=transform)
torchvision.datasets
中加载MNIST数据集。root
参数指定了数据集的本地保存路径,train=True
表示加载训练数据集,download=True
表示如果数据集不存在则下载它,最后,transform
参数指定了我们之前定义的数据转换。trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)
batch_size
参数指定了每个批次包含的样本数,shuffle=True
表示在每个周期(epoch)开始时对数据进行洗牌,以随机排列样本。以上是代码的前半部分,它主要涉及数据加载和预处理。接下来,我们将继续分析代码的后半部分。
# 步骤2:定义神经网络模型
class Net(nn.Module):
def __init__(self):
super(Net, self).__init()
self.conv1 = nn.Conv2d(1, 6, 5)
self.pool = nn.MaxPool2d(2, 2)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16 * 4 * 4, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = x.view(-1, 16 * 4 * 4)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
net = Net()
这部分代码定义了神经网络模型。我们创建了一个名为Net
的类,它继承自nn.Module
,这是PyTorch中构建模型的常用方式。在构造函数中,我们定义了模型的各层(卷积层、池化层、全连接层)以及它们的参数。这个模型是一个卷积神经网络(CNN),用于手写数字识别。
forward
方法定义了数据在模型中的前向传播流程。它描述了数据如何从一层传递到下一层,包括卷积操作、激活函数(ReLU)、池化操作和全连接层。
最后,我们创建了一个net
实例,这是我们的神经网络模型的一个具体实例化对象。
# 步骤3:定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
这部分代码定义了损失函数和优化器。我们使用了交叉熵损失(nn.CrossEntropyLoss
)作为损失函数,这是常用于分类问题的损失函数。
优化器使用了随机梯度下降(SGD),并通过lr
参数指定了学习率,通过momentum
参数指定了动量。
这就完成了神经网络模型的定义和损失函数、优化器的设置。接下来,我们将继续分析代码的训练和评估部分。
让我们继续分析PyTorch示例代码的训练和评估部分:
# 步骤4:训练模型
for epoch in range(5):
running_loss = 0.0
for i, data in enumerate(trainloader, 0):
inputs, labels = data
optimizer.zero_grad()
outputs = net(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
print('Epoch %d loss: %.3f' % (epoch + 1, running_loss / (i + 1))
print('Finished Training')
这部分代码进行了模型的训练。它使用一个外层循环遍历5个训练周期(epochs),每个周期中使用一个内层循环遍历训练数据集中的小批次(batch)。
在每个批次中,首先调用optimizer.zero_grad()
来清除之前批次的梯度信息。然后,将输入数据(inputs
)传递给模型,模型产生输出(outputs
)。接着,计算损失(loss
)并使用loss.backward()
进行反向传播计算梯度。最后,通过optimizer.step()
来更新模型的参数,以减小损失。
我们还计算了每个周期的平均损失,并在每个周期结束后打印出来,以监视训练的进展。
# 步骤5:评估模型
testset = torchvision.datasets.MNIST(root='./data', train=False, download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=64, shuffle=False)
correct = 0
total = 0
with torch.no_grad():
for data in testloader:
images, labels = data
outputs = net(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print('Accuracy on test images: %.2f %%' % (100 * correct / total))
这部分代码用于评估模型的性能。我们加载了测试数据集,并使用testloader
来将测试数据划分成小批次。
在with torch.no_grad()
块中,我们遍历每个批次,计算模型的预测结果,并统计模型在测试数据集上的准确度。
最后,我们打印出测试准确度,这是模型在测试数据上正确分类的比例。
这就完成了整个示例代码的分析。通过逐行分析代码,可以更好地理解PyTorch中的深度学习训练和评估过程。
希望这个示例对你理解深度学习代码的工作方式有所帮助。
阅读深度学习代码对于小白来说可能是一个挑战,但通过坚持学习和不断实践,我渐渐克服了这个困难。不要害怕犯错,不要害怕提问,因为深度学习是一个充满机会和创新的领域。通过逐步学习和积累经验,可以慢慢地读懂深度学习代码,为这个领域做出自己的贡献。