Python Deep Learning(简称D2L)是一本开源的深度学习入门教程,由李沐等数位大佬创建及维护。它不仅仅详细地介绍了深度学习的原理和常用算法,同时也提供了丰富的Python示例代码,方便读者在实战中掌握知识。
一、 目录结构
Python D2L的教程结构清晰,包含14章共76节课,每节课都以具体的实例为主线,辅以阐述深度学习知识的代码和文字,非常易于初学者理解掌握。以下是Python D2L教程的章节目录:
|-----Preface
|-----Preliminary
| |------Preliminaries
| |------Data Manipugation
| |------Linear Algebra
| |------Probability and Statistics
|-----Dive into Deep Learning
| |------Linear Neural Networks
| |------Multilayer Perceptrons
| |------Deep Learning Computational Performance
| |------Convolutional Neural Networks
| |------Modern Convolutional Neural Networks
| |------Recurrent Neural Networks
| |------Modern Recurrent Neural Networks
| |------Attention Mechanisms
|-----Appendix
| |------Appendix-A:
| |------Appendix-B:
| |------Appendix-C:
| |------Appendix-D:
值得一提的是,Python D2L提供了很多工具,让你可以直接在GitHub上打开教程,一边学习一边实践。GitHub上还提供了一些深度学习的实践案例和丰富的 datasets,可以让读者更好地巩固所学知识。
二、字典介绍和应用
在深度学习中,字典是经常使用的数据结构,它用来储存键-值对。Python D2L提供了非常详细的字典介绍和应用示例,让初学者可以很好地理解它的用途。
首先,Python D2L使用字典来记录Token序列的出现次数,如以下示例:
counts = dict()
tokens = ['apple', 'banana', 'apple', 'banana', 'banana']
for token in tokens:
# 如果字典中已存在此token,计数器+1
if token in counts:
counts[token] += 1
# 如果字典中不存在此token,将其计数器设为1
else:
counts[token] = 1
counts
>>>> {'apple': 2, 'banana': 3}
此外,在深度学习中,还常常使用字典来替换标记,如下所示:
d2l.set_figsize()
img = image.imread('catdog.jpg')
d2l.plt.imshow(img.asnumpy())
上述代码中,d2l.set_figsize()可以设置图片大小,而image.imread('catdog.jpg')则是读取本地图片文件。可以看到,img是一个图片类型的序列,我们需要将序列转换为tensor类型进行矩阵操作。这里用到了Python D2L内部的字典d2l.plt来实现,其中plt表示“Plotting”。
三、矩阵操作
在深度学习算法中,矩阵操作是经常使用的操作之一。Python D2L详细介绍了矩阵的基本概念、矩阵的数值计算等等。以下为Python D2L中的矩阵操作代码示例:
import torch
from torch import nn
import torchvision
net = nn.Sequential(nn.Conv2d(1, 6, kernel_size=5, padding=2), nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2),
nn.Conv2d(6, 16, kernel_size=5), nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2), nn.Flatten(),
nn.Linear(16 * 5 * 5, 120), nn.ReLU(),
nn.Linear(120, 84), nn.ReLU(), nn.Linear(84, 10))
X = torch.randn(size=(1, 1, 28, 28), dtype=torch.float32)
for layer in net:
X = layer(X)
print(layer.__class__.__name__, 'Output shape:\t', X.shape)
上述代码实现了一个LeNet,用于在MNIST数据集上进行手写数字识别的训练和测试。
四、实战案例
Python D2L提供了多个实战案例,让读者可以更好的掌握深度学习的知识。以下为Python D2L中的图像分类代码示例:
# 导入类库
import torch
import torchvision
from torch import nn
from torch.nn import functional as F
from torchvision import transforms
from torch.utils.data import DataLoader
# 定义模型参数
in_channels, out_channels, kernel_size = 1, 10, 5
batch_size, num_epochs, lr = 256, 10, 0.5
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
# 加载数据集
train_dataset = torchvision.datasets.FashionMNIST(root='data/FashionMNIST', train=True, transform=transforms.ToTensor())
test_dataset = torchvision.datasets.FashionMNIST(root='data/FashionMNIST', train=False, transform=transforms.ToTensor())
train_data = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_data = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)
# 定义模型
class LeNet(nn.Module):
def __init__(self):
super(LeNet, self).__init__()
self.conv = nn.Sequential(nn.Conv2d(in_channels, out_channels, kernel_size),
nn.ReLU(),
nn.MaxPool2d(2, 2),
nn.Conv2d(out_channels, out_channels * 2, kernel_size),
nn.ReLU(),
nn.MaxPool2d(2, 2))
self.fc = nn.Sequential(nn.Linear(out_channels * 2 * 4 * 4, out_channels * 2),
nn.ReLU(),
nn.Linear(out_channels * 2, 10))
def forward(self, x):
conv_out = self.conv(x)
res = self.fc(conv_out.view(conv_out.shape[0], -1))
return res
# 定义损失函数和优化器
net = LeNet()
loss_fn = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(net.parameters(), lr=lr)
# 训练模型
for epoch in range(num_epochs):
for batch_idx, (images, targets) in enumerate(train_data):
images, targets = images.to(device), targets.to(device)
outputs = net(images)
loss = loss_fn(outputs, targets)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if batch_idx % 200 == 0:
print('Epoch:{}, batch_index:{}/{}, train_loss:{:.3f}'.format(
epoch, batch_idx, len(train_data), loss.item()))
# 测试模型
net.eval()
with torch.no_grad():
correct, total = 0, 0
for images, labels in test_data:
images, labels = images.to(device), labels.to(device)
outputs = net(images)
_, preds = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (preds == labels).sum().item()
print('Accuracy of the model on the test images: {:.2f}%'.format(100 * correct / total))
上述代码实现了图像识别的训练和测试,在FashionMNIST数据集上获得了不错的测试结果。
五、总结
本文介绍了Python D2L的基本结构、字典介绍和应用、矩阵操作以及实战案例等内容。Python D2L不仅仅是一本Python开源的深度学习教程,还提供了丰富的示例和实践,使初学者可以更好地理解深度学习的相关知识。如果你也想学习深度学习,Python D2L是一个不错的选择。