|
|
@@ -0,0 +1,625 @@
|
|
|
+
|
|
|
+## 深度学习
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+### 深度学习入门手册
|
|
|
+
|
|
|
+
|
|
|
+以下是一份深度学习的入门手册,旨在帮助你理解深度学习的基本概念、工具和技术,并通过简单的代码示例来展示如何使用深度学习解决实际问题。
|
|
|
+
|
|
|
+**深度学习入门手册**
|
|
|
+
|
|
|
+# 一、深度学习简介
|
|
|
+深度学习是机器学习的一个子领域,它基于人工神经网络,试图从大量的数据中自动学习特征表示。与传统的机器学习方法相比,深度学习模型可以自动学习数据的层次化表示,通常在处理图像、音频、文本等复杂数据时表现出色。
|
|
|
+
|
|
|
+## (一)核心概念
|
|
|
+- **神经网络**:深度学习的基础,由许多相互连接的神经元组成,这些神经元按照层状结构排列,包括输入层、隐藏层和输出层。每个神经元接收输入,进行加权求和,并通过激活函数产生输出。
|
|
|
+- **激活函数**:引入非线性,使得神经网络可以学习非线性关系。常见的激活函数有 Sigmoid、ReLU(Rectified Linear Unit)、Tanh 等。
|
|
|
+- **损失函数**:衡量模型预测结果与真实结果之间的差异,常见的有均方误差(MSE)、交叉熵损失(Cross Entropy Loss)等,用于训练过程中优化模型。
|
|
|
+- **优化器**:根据损失函数的梯度更新神经网络的权重,以最小化损失。常见的优化器有随机梯度下降(SGD)、Adam、RMSProp 等。
|
|
|
+
|
|
|
+
|
|
|
+# 二、深度学习框架
|
|
|
+目前有许多深度学习框架可供选择,以下是几个常用的:
|
|
|
+- **TensorFlow**:由 Google 开发,功能强大且灵活,提供了从简单到复杂的各种深度学习模型的实现。
|
|
|
+- **PyTorch**:以其动态计算图和易于使用的接口而受到欢迎,特别适合研究和开发。
|
|
|
+- **Keras**:一个高级的神经网络 API,可以在 TensorFlow 或 Theano 上运行,提供了简洁的接口,适合快速开发。
|
|
|
+
|
|
|
+
|
|
|
+# 三、深度学习入门步骤
|
|
|
+
|
|
|
+## (一)环境搭建
|
|
|
+以下是使用 PyTorch 搭建深度学习环境的示例:
|
|
|
+```bash
|
|
|
+pip install torch torchvision torchtext
|
|
|
+```
|
|
|
+
|
|
|
+
|
|
|
+## (二)数据准备
|
|
|
+深度学习的第一步是准备数据。以图像分类任务为例,我们可以使用 `torchvision` 中的 `MNIST` 数据集。
|
|
|
+```python
|
|
|
+import torch
|
|
|
+import torchvision
|
|
|
+import torchvision.transforms as transforms
|
|
|
+
|
|
|
+# 定义数据预处理
|
|
|
+transform = transforms.Compose(
|
|
|
+ [transforms.ToTensor(),
|
|
|
+ transforms.Normalize((0.5,), (0.5,))]
|
|
|
+)
|
|
|
+
|
|
|
+# 下载训练集和测试集
|
|
|
+trainset = torchvision.datasets.MNIST(root='./data', train=True,
|
|
|
+ download=True, transform=transform)
|
|
|
+trainloader = torch.utils.data.DataLoader(trainset, batch_size=64,
|
|
|
+ shuffle=True, num_workers=2)
|
|
|
+
|
|
|
+testset = torchvision.datasets.MNIST(root='./data', train=False,
|
|
|
+ download=True, transform=transform)
|
|
|
+testloader = torch.utils.data.DataLoader(testset, batch_size=64,
|
|
|
+ shuffle=False, num_workers=2)
|
|
|
+```
|
|
|
+- **解释**:
|
|
|
+ - `transforms.ToTensor()` 将图像转换为 PyTorch 的 `Tensor` 类型。
|
|
|
+ - `transforms.Normalize((0.5,), (0.5,))` 对数据进行标准化,使其范围在 -1 到 1 之间。
|
|
|
+ - `torch.utils.data.DataLoader` 用于将数据集封装为可迭代的数据加载器,便于批量处理。
|
|
|
+
|
|
|
+
|
|
|
+## (三)构建神经网络
|
|
|
+下面是一个简单的全连接神经网络的 PyTorch 实现:
|
|
|
+```python
|
|
|
+import torch.nn as nn
|
|
|
+import torch.nn.functional as F
|
|
|
+
|
|
|
+
|
|
|
+class SimpleNet(nn.Module):
|
|
|
+ def __init__(self):
|
|
|
+ super(SimpleNet, self).__init__()
|
|
|
+ self.fc1 = nn.Linear(28 * 28, 128) # 输入层到第一个隐藏层
|
|
|
+ self.fc2 = nn.Linear(128, 64) # 第一个隐藏层到第二个隐藏层
|
|
|
+ self.fc3 = nn.Linear(64, 10) # 第二个隐藏层到输出层
|
|
|
+
|
|
|
+ def forward(self, x):
|
|
|
+ x = x.view(-1, 28 * 28) # 将图像展平
|
|
|
+ x = F.relu(self.fc1(x)) # 第一个隐藏层,使用 ReLU 激活函数
|
|
|
+ x = F.relu(self.fc2(x)) # 第二个隐藏层,使用 ReLU 激活函数
|
|
|
+ x = self.fc3(x) # 输出层
|
|
|
+ return x
|
|
|
+
|
|
|
+
|
|
|
+net = SimpleNet()
|
|
|
+```
|
|
|
+- **解释**:
|
|
|
+ - `nn.Linear` 表示全连接层。
|
|
|
+ - `forward` 方法定义了数据的前向传播路径,将输入通过各层和激活函数。
|
|
|
+
|
|
|
+
|
|
|
+## (四)定义损失函数和优化器
|
|
|
+选择合适的损失函数和优化器:
|
|
|
+```python
|
|
|
+import torch.optim as optim
|
|
|
+
|
|
|
+criterion = nn.CrossEntropyLoss()
|
|
|
+optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
|
|
|
+```
|
|
|
+- **解释**:
|
|
|
+ - `nn.CrossEntropyLoss()` 用于多分类任务。
|
|
|
+ - `optim.SGD` 是随机梯度下降优化器,`lr` 是学习率,`momentum` 可以加速收敛。
|
|
|
+
|
|
|
+
|
|
|
+## (五)训练模型
|
|
|
+以下是训练网络的代码:
|
|
|
+```python
|
|
|
+# 训练周期
|
|
|
+epochs = 10
|
|
|
+
|
|
|
+for epoch in range(epochs):
|
|
|
+ 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()
|
|
|
+ if i % 200 == 199:
|
|
|
+ print(f'Epoch {epoch + 1}, Batch {i + 1}, Loss: {running_loss / 200:.3f}')
|
|
|
+ running_loss = 0.0
|
|
|
+
|
|
|
+print('Finished Training')
|
|
|
+```
|
|
|
+- **解释**:
|
|
|
+ - 每个 `epoch` 遍历整个数据集,`optimizer.zero_grad()` 清除梯度。
|
|
|
+ - `outputs = net(inputs)` 是前向传播,`loss.backward()` 是反向传播,`optimizer.step()` 更新权重。
|
|
|
+
|
|
|
+
|
|
|
+## (六)测试模型
|
|
|
+以下是测试模型性能的代码:
|
|
|
+```python
|
|
|
+correct = 0
|
|
|
+total = 0
|
|
|
+with torch.no_grad():
|
|
|
+ for data in testloader:
|
|
|
+ inputs, labels = data
|
|
|
+ outputs = net(inputs)
|
|
|
+ _, predicted = torch.max(outputs.data, 1)
|
|
|
+ total += labels.size(0)
|
|
|
+ correct += (predicted == labels).sum().item()
|
|
|
+
|
|
|
+print(f'Accuracy of the network on the 10000 test images: {100 * correct / total}%')
|
|
|
+```
|
|
|
+- **解释**:
|
|
|
+ - `torch.no_grad()` 表示在测试阶段不计算梯度。
|
|
|
+ - `torch.max(outputs.data, 1)` 找出每个样本输出概率最大的类别作为预测类别。
|
|
|
+
|
|
|
+
|
|
|
+## (七)保存和加载模型
|
|
|
+保存和加载训练好的模型:
|
|
|
+```python
|
|
|
+# 保存模型
|
|
|
+torch.save(net.state_dict(), 'simplenet.pth')
|
|
|
+
|
|
|
+# 加载模型
|
|
|
+net = SimpleNet()
|
|
|
+net.load_state_dict(torch.load('simplenet.pth'))
|
|
|
+```
|
|
|
+
|
|
|
+
|
|
|
+### 深度学习常见算法
|
|
|
+
|
|
|
+
|
|
|
+以下是深度学习中的一些常见算法:
|
|
|
+
|
|
|
+## 一、多层感知机(Multilayer Perceptron,MLP)
|
|
|
+- **算法介绍**:
|
|
|
+ - MLP是一种最基本的前馈神经网络,由输入层、一个或多个隐藏层和输出层组成。每层包含多个神经元,神经元之间全连接。每个神经元接收上一层神经元的输出,经过加权求和和激活函数处理后传递给下一层。
|
|
|
+ - 激活函数用于引入非线性,常见的激活函数有 Sigmoid、ReLU、Tanh 等。
|
|
|
+ - MLP可以处理各种类型的数据,如分类、回归等任务,但在处理图像、音频、文本等复杂数据时,可能需要更多的预处理和特征工程。
|
|
|
+- **代码示例**:
|
|
|
+```python
|
|
|
+import torch
|
|
|
+import torch.nn as nn
|
|
|
+import torch.optim as optim
|
|
|
+from torch.utils.data import DataLoader
|
|
|
+from torchvision import datasets, transforms
|
|
|
+
|
|
|
+
|
|
|
+# 数据预处理
|
|
|
+transform = transforms.Compose([
|
|
|
+ transforms.ToTensor(),
|
|
|
+ transforms.Normalize((0.5,), (0.5,))
|
|
|
+])
|
|
|
+
|
|
|
+
|
|
|
+# 加载MNIST数据集
|
|
|
+trainset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
|
|
|
+trainloader = DataLoader(trainset, batch_size=64, shuffle=True)
|
|
|
+
|
|
|
+
|
|
|
+# 定义MLP模型
|
|
|
+class MLP(nn.Module):
|
|
|
+ def __init__(self):
|
|
|
+ super(MLP, self).__init__()
|
|
|
+ self.fc1 = nn.Linear(28 * 28, 512)
|
|
|
+ self.fc2 = nn.Linear(512, 256)
|
|
|
+ self.fc3 = nn.Linear(256, 10)
|
|
|
+
|
|
|
+ def forward(self, x):
|
|
|
+ x = x.view(-1, 28 * 28)
|
|
|
+ x = torch.relu(self.fc1(x))
|
|
|
+ x = torch.relu(self.fc2(x))
|
|
|
+ x = self.fc3(x)
|
|
|
+ return x
|
|
|
+
|
|
|
+
|
|
|
+model = MLP()
|
|
|
+
|
|
|
+
|
|
|
+# 定义损失函数和优化器
|
|
|
+criterion = nn.CrossEntropyLoss()
|
|
|
+optimizer = optim.SGD(model.parameters(), lr=0.01)
|
|
|
+
|
|
|
+
|
|
|
+# 训练模型
|
|
|
+for epoch in range(10):
|
|
|
+ running_loss = 0.0
|
|
|
+ for i, data in enumerate(trainloader, 0):
|
|
|
+ inputs, labels = data
|
|
|
+ optimizer.zero_grad()
|
|
|
+ outputs = model(inputs)
|
|
|
+ loss = criterion(outputs, labels)
|
|
|
+ loss.backward()
|
|
|
+ optimizer.step()
|
|
|
+ running_loss += loss.item()
|
|
|
+ if i % 100 == 99:
|
|
|
+ print(f'Epoch {epoch + 1}, Batch {i + 1}, Loss: {running_loss / 100:.3f}')
|
|
|
+ running_loss = 0.0
|
|
|
+```
|
|
|
+- **代码解释**:
|
|
|
+ - 首先,我们使用 `transforms` 对 MNIST 数据集进行预处理,将图像转换为张量并标准化。
|
|
|
+ - 定义 `MLP` 模型,包含三个全连接层,使用 `ReLU` 作为激活函数。
|
|
|
+ - 采用 `CrossEntropyLoss` 作为损失函数,`SGD` 作为优化器。
|
|
|
+ - 在训练过程中,对每个 `batch` 进行前向传播、计算损失、反向传播和参数更新。
|
|
|
+
|
|
|
+
|
|
|
+## 二、卷积神经网络(Convolutional Neural Network,CNN)
|
|
|
+- **算法介绍**:
|
|
|
+ - CNN是专门为处理具有网格结构数据(如图像)而设计的网络。它由卷积层、池化层、全连接层等组成。
|
|
|
+ - 卷积层使用卷积核在输入上滑动进行卷积操作,提取局部特征。池化层(如最大池化、平均池化)对特征图进行降维操作,减少参数和计算量。
|
|
|
+ - 常见的 CNN 架构包括 LeNet、AlexNet、VGG、ResNet 等,用于图像分类、目标检测、图像分割等任务。
|
|
|
+- **代码示例**:
|
|
|
+```python
|
|
|
+import torch
|
|
|
+import torch.nn as nn
|
|
|
+import torch.optim as optim
|
|
|
+from torch.utils.data import DataLoader
|
|
|
+from torchvision import datasets, transforms
|
|
|
+
|
|
|
+
|
|
|
+# 数据预处理
|
|
|
+transform = transforms.Compose([
|
|
|
+ transforms.ToTensor(),
|
|
|
+ transforms.Normalize((0.5,), (0.5,))
|
|
|
+])
|
|
|
+
|
|
|
+
|
|
|
+# 加载MNIST数据集
|
|
|
+trainset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
|
|
|
+trainloader = DataLoader(trainset, batch_size=64, shuffle=True)
|
|
|
+
|
|
|
+
|
|
|
+# 定义简单的CNN模型
|
|
|
+class SimpleCNN(nn.Module):
|
|
|
+ def __init__(self):
|
|
|
+ super(SimpleCNN, self).__init__()
|
|
|
+ self.conv1 = nn.Conv2d(1, 32, 3, 1)
|
|
|
+ self.conv2 = nn.Conv2d(32, 64, 3, 1)
|
|
|
+ self.fc1 = nn.Linear(64 * 5 * 5, 128)
|
|
|
+ self.fc2 = nn.Linear(128, 10)
|
|
|
+
|
|
|
+
|
|
|
+ def forward(self, x):
|
|
|
+ x = torch.relu(self.conv1(x))
|
|
|
+ x = torch.max_pool2d(x, 2)
|
|
|
+ x = torch.relu(self.conv2(x))
|
|
|
+ x = torch.max_pool2d(x, 2)
|
|
|
+ x = torch.flatten(x, 1)
|
|
|
+ x = torch.relu(self.fc1(x))
|
|
|
+ x = self.fc2(x)
|
|
|
+ return x
|
|
|
+
|
|
|
+
|
|
|
+model = SimpleCNN()
|
|
|
+
|
|
|
+
|
|
|
+# 定义损失函数和优化器
|
|
|
+criterion = nn.CrossEntropyLoss()
|
|
|
+optimizer = optim.Adam(model.parameters(), lr=0.001)
|
|
|
+
|
|
|
+
|
|
|
+# 训练模型
|
|
|
+for epoch in range(10):
|
|
|
+ running_loss = 0.0
|
|
|
+ for i, data in enumerate(trainloader, 0):
|
|
|
+ inputs, labels = data
|
|
|
+ optimizer.zero_grad()
|
|
|
+ outputs = model(inputs)
|
|
|
+ loss = criterion(outputs, labels)
|
|
|
+ loss.backward()
|
|
|
+ optimizer.step()
|
|
|
+ running_loss += loss.item()
|
|
|
+ if i % 100 == 99:
|
|
|
+ print(f'Epoch {epoch + 1}, Batch {i + 1}, Loss: {running_loss / 100:.3f}')
|
|
|
+ running_loss = 0.0
|
|
|
+```
|
|
|
+- **代码解释**:
|
|
|
+ - 定义了一个简单的 `CNN` 模型,包含两个卷积层、两个池化层和两个全连接层。
|
|
|
+ - 卷积层使用 `Conv2d` 模块,池化层使用 `max_pool2d` 模块。
|
|
|
+ - 使用 `Adam` 优化器进行训练,训练过程与 `MLP` 类似。
|
|
|
+
|
|
|
+
|
|
|
+## 三、循环神经网络(Recurrent Neural Network,RNN)
|
|
|
+- **算法介绍**:
|
|
|
+ - RNN 主要用于处理序列数据,如时间序列、文本等。它具有内部的循环结构,允许信息在序列中传递。
|
|
|
+ - 基本的 RNN 存在梯度消失和梯度爆炸问题,因此发展出了 LSTM(Long Short-Term Memory)和 GRU(Gated Recurrent Unit)等变种,通过门控机制解决这些问题。
|
|
|
+ - 可用于文本生成、机器翻译、语音识别等任务。
|
|
|
+- **代码示例**:
|
|
|
+```python
|
|
|
+import torch
|
|
|
+import torch.nn as nn
|
|
|
+import torch.optim as optim
|
|
|
+
|
|
|
+
|
|
|
+# 定义简单的RNN模型
|
|
|
+class SimpleRNN(nn.Module):
|
|
|
+ def __init__(self, input_size, hidden_size, output_size):
|
|
|
+ super(SimpleRNN, self).__init__()
|
|
|
+ self.rnn = nn.RNN(input_size, hidden_size, batch_first=True)
|
|
|
+ self.fc = nn.Linear(hidden_size, output_size)
|
|
|
+
|
|
|
+
|
|
|
+ def forward(self, x):
|
|
|
+ out, _ = self.rnn(x)
|
|
|
+ out = self.fc(out[:, -1, :])
|
|
|
+ return out
|
|
|
+
|
|
|
+
|
|
|
+# 输入和输出维度
|
|
|
+input_size = 10
|
|
|
+hidden_size = 20
|
|
|
+output_size = 1
|
|
|
+
|
|
|
+
|
|
|
+# 创建模型、损失函数和优化器
|
|
|
+model = SimpleRNN(input_size, hidden_size, output_size)
|
|
|
+criterion = nn.MSELoss()
|
|
|
+optimizer = optim.Adam(model.parameters(), lr=0.01)
|
|
|
+
|
|
|
+
|
|
|
+# 输入数据
|
|
|
+x = torch.randn(1, 5, input_size)
|
|
|
+y = torch.randn(1, output_size)
|
|
|
+
|
|
|
+
|
|
|
+# 训练模型
|
|
|
+for epoch in range(100):
|
|
|
+ optimizer.zero_grad()
|
|
|
+ output = model(x)
|
|
|
+ loss = criterion(output, y)
|
|
|
+ loss.backward()
|
|
|
+ optimizer.step()
|
|
|
+```
|
|
|
+- **代码解释**:
|
|
|
+ - 定义了一个简单的 `RNN` 模型,包含一个 `RNN` 层和一个全连接层。
|
|
|
+ - `batch_first=True` 表示输入数据的维度顺序为 `(batch, seq_length, input_size)`。
|
|
|
+ - 使用 `MSELoss` 作为损失函数,`Adam` 作为优化器,对随机生成的数据进行训练。
|
|
|
+
|
|
|
+
|
|
|
+## 四、长短时记忆网络(Long Short-Term Memory,LSTM)
|
|
|
+- **算法介绍**:
|
|
|
+ - LSTM 是一种特殊的 RNN,具有记忆单元和三个门(输入门、遗忘门、输出门),可以更好地处理长序列中的长期依赖问题。
|
|
|
+ - 能够在处理序列数据时选择性地记住或忘记信息,使其在自然语言处理、时间序列预测等任务中表现出色。
|
|
|
+- **代码示例**:
|
|
|
+```python
|
|
|
+import torch
|
|
|
+import torch.nn as nn
|
|
|
+import torch.optim as optim
|
|
|
+
|
|
|
+
|
|
|
+# 定义简单的LSTM模型
|
|
|
+class SimpleLSTM(nn.Module):
|
|
|
+ def __init__(self, input_size, hidden_size, output_size):
|
|
|
+ super(SimpleLSTM, self).__init__()
|
|
|
+ self.lstm = nn.LSTM(input_size, hidden_size, batch_first=True)
|
|
|
+ self.fc = nn.Linear(hidden_size, output_size)
|
|
|
+
|
|
|
+
|
|
|
+ def forward(self, x):
|
|
|
+ out, _ = self.lstm(x)
|
|
|
+ out = self.fc(out[:, -1, :])
|
|
|
+ return out
|
|
|
+
|
|
|
+
|
|
|
+# 输入和输出维度
|
|
|
+input_size = 10
|
|
|
+hidden_size = 20
|
|
|
+output_size = 1
|
|
|
+
|
|
|
+
|
|
|
+# 创建模型、损失函数和优化器
|
|
|
+model = SimpleLSTM(input_size, hidden_size, output_size)
|
|
|
+criterion = nn.MSELoss()
|
|
|
+optimizer = optim.Adam(model.parameters(), lr=0.01)
|
|
|
+
|
|
|
+
|
|
|
+# 输入数据
|
|
|
+x = torch.randn(1, 5, input_size)
|
|
|
+y = torch.randn(1, output_size)
|
|
|
+
|
|
|
+
|
|
|
+# 训练模型
|
|
|
+for epoch in range(100):
|
|
|
+ optimizer.zero_grad()
|
|
|
+ output = model(x)
|
|
|
+ loss = criterion(output, y)
|
|
|
+ loss.backward()
|
|
|
+ optimizer.step()
|
|
|
+```
|
|
|
+- **代码解释**:
|
|
|
+ - 定义了一个简单的 `LSTM` 模型,包含一个 `LSTM` 层和一个全连接层。
|
|
|
+ - `batch_first=True` 表示输入数据的维度顺序为 `(batch, seq_length, input_size)`。
|
|
|
+ - 训练过程与 `RNN` 类似,但使用 `LSTM` 层处理序列数据。
|
|
|
+
|
|
|
+
|
|
|
+## 五、生成对抗网络(Generative Adversarial Network,GAN)
|
|
|
+- **算法介绍**:
|
|
|
+ - GAN 由生成器(Generator)和判别器(Discriminator)组成。生成器试图生成逼真的数据,判别器试图区分真实数据和生成器生成的数据。
|
|
|
+ - 两者通过对抗训练,最终生成器可以生成高质量的模拟数据,可用于图像生成、数据增强、风格迁移等任务。
|
|
|
+- **代码示例**:
|
|
|
+```python
|
|
|
+import torch
|
|
|
+import torch.nn as nn
|
|
|
+import torch.optim as optim
|
|
|
+
|
|
|
+
|
|
|
+# 定义生成器
|
|
|
+class Generator(nn.Module):
|
|
|
+ def __init__(self, input_size, output_size):
|
|
|
+ super(Generator, self).__init__()
|
|
|
+ self.main = nn.Sequential(
|
|
|
+ nn.Linear(input_size, 128),
|
|
|
+ nn.ReLU(),
|
|
|
+ nn.Linear(128, 256),
|
|
|
+ nn.ReLU(),
|
|
|
+ nn.Linear(256, output_size),
|
|
|
+ nn.Tanh()
|
|
|
+ )
|
|
|
+
|
|
|
+
|
|
|
+ def forward(self, x):
|
|
|
+ return self.main(x)
|
|
|
+
|
|
|
+
|
|
|
+# 定义判别器
|
|
|
+class Discriminator(nn.Module):
|
|
|
+ def __init__(self, input_size):
|
|
|
+ super(Discriminator, self).__init__()
|
|
|
+ self.main = nn.Sequential(
|
|
|
+ nn.Linear(input_size, 128),
|
|
|
+ nn.LeakyReLU(0.2),
|
|
|
+ nn.Linear(128, 64),
|
|
|
+ nn.LeakyReLU(0.2),
|
|
|
+ nn.Linear(64, 1),
|
|
|
+ nn.Sigmoid()
|
|
|
+ )
|
|
|
+
|
|
|
+
|
|
|
+ def forward(self, x):
|
|
|
+ return self.main(x)
|
|
|
+
|
|
|
+
|
|
|
+# 输入和输出维度
|
|
|
+input_size = 100
|
|
|
+output_size = 784
|
|
|
+
|
|
|
+
|
|
|
+# 创建生成器和判别器
|
|
|
+generator = Generator(input_size, output_size)
|
|
|
+discriminator = Discriminator(output_size)
|
|
|
+
|
|
|
+
|
|
|
+# 定义损失函数和优化器
|
|
|
+criterion = nn.BCELoss()
|
|
|
+optimizer_G = optim.Adam(generator.parameters(), lr=0.0002)
|
|
|
+optimizer_D = optim.Adam(discriminator.parameters(), lr=0.0002)
|
|
|
+
|
|
|
+
|
|
|
+# 训练过程
|
|
|
+for epoch in range(100):
|
|
|
+ # 训练判别器
|
|
|
+ optimizer_D.zero_grad()
|
|
|
+ real_data = torch.randn(64, output_size)
|
|
|
+ real_labels = torch.ones(64, 1)
|
|
|
+ fake_data = generator(torch.randn(64, input_size))
|
|
|
+ fake_labels = torch.zeros(64, 1)
|
|
|
+
|
|
|
+
|
|
|
+ real_output = discriminator(real_data)
|
|
|
+ fake_output = discriminator(fake_data.detach())
|
|
|
+
|
|
|
+
|
|
|
+ loss_D_real = criterion(real_output, real_labels)
|
|
|
+ loss_D_fake = criterion(fake_output, fake_labels)
|
|
|
+ loss_D = loss_D_real + loss_D_fake
|
|
|
+ loss_D.backward()
|
|
|
+ optimizer_D.step()
|
|
|
+
|
|
|
+
|
|
|
+ # 训练生成器
|
|
|
+ optimizer_G.zero_grad()
|
|
|
+ fake_data = generator(torch.randn(64, input_size))
|
|
|
+ fake_output = discriminator(fake_data)
|
|
|
+ loss_G = criterion(fake_output, real_labels)
|
|
|
+ loss_G.backward()
|
|
|
+ optimizer_G.step()
|
|
|
+```
|
|
|
+- **代码解释**:
|
|
|
+ - 生成器将随机噪声作为输入,输出模拟数据。判别器将输入数据判断为真或假。
|
|
|
+ - 使用 `BCELoss` 作为损失函数,`Adam` 作为优化器。
|
|
|
+ - 训练过程中,先训练判别器区分真假数据,再训练生成器生成更逼真的数据。
|
|
|
+
|
|
|
+
|
|
|
+## 六、自编码器(Autoencoder)
|
|
|
+- **算法介绍**:
|
|
|
+ - 自编码器是一种无监督学习算法,由编码器和解码器组成。编码器将输入数据压缩为低维表示(隐层),解码器将隐层表示还原为原始数据。
|
|
|
+ - 可用于数据降维、特征提取、去噪等任务。
|
|
|
+- **代码示例**:
|
|
|
+```python
|
|
|
+import torch
|
|
|
+import torch.nn as nn
|
|
|
+import torch.optim as optim
|
|
|
+
|
|
|
+
|
|
|
+# 定义自编码器
|
|
|
+class Autoencoder(nn.Module):
|
|
|
+ def __init__(self):
|
|
|
+ super(Autoencoder, self).__init__()
|
|
|
+ self.encoder = nn.Sequential(
|
|
|
+ nn.Linear(784, 128),
|
|
|
+ nn.ReLU(),
|
|
|
+ nn.Linear(128, 64),
|
|
|
+ nn.ReLU(),
|
|
|
+ nn.Linear(64, 32)
|
|
|
+ )
|
|
|
+ self.decoder = nn.Sequential(
|
|
|
+ nn.Linear(32, 64),
|
|
|
+ nn.ReLU(),
|
|
|
+ nn.Linear(64, 128),
|
|
|
+ nn.ReLU(),
|
|
|
+ nn.Linear(128, 784),
|
|
|
+ nn.Tanh()
|
|
|
+ )
|
|
|
+
|
|
|
+
|
|
|
+ def forward(self, x):
|
|
|
+ x = self.encoder(x)
|
|
|
+ x = self.decoder(x)
|
|
|
+ return x
|
|
|
+
|
|
|
+
|
|
|
+model = Autoencoder()
|
|
|
+
|
|
|
+
|
|
|
+# 定义损失函数和优化器
|
|
|
+criterion = nn.MSELoss()
|
|
|
+optimizer = optim.Adam(model.parameters(), lr=0.001)
|
|
|
+
|
|
|
+
|
|
|
+# 输入数据
|
|
|
+x = torch.randn(1, 784)
|
|
|
+
|
|
|
+
|
|
|
+# 训练模型
|
|
|
+for epoch in range(100):
|
|
|
+ optimizer.zero_grad()
|
|
|
+ outputs = model(x)
|
|
|
+ loss = criterion(outputs, x)
|
|
|
+ loss.backward()
|
|
|
+ optimizer.step()
|
|
|
+```
|
|
|
+- **代码解释**:
|
|
|
+ - 编码器将输入数据降维,解码器将其还原。
|
|
|
+ - 使用 `MSELoss` 作为损失函数,`Adam` 作为优化器,训练过程旨在最小化重构误差。
|
|
|
+
|
|
|
+
|
|
|
+这些深度学习算法是深度学习领域的基础,每个算法都有其独特的特点和适用场景,在实际应用中,可根据具体任务选择合适的算法并进行相应的调参和优化。
|
|
|
+
|
|
|
+深度学习领域在不断发展,新的算法和改进不断涌现,你可以通过阅读学术论文、参加在线课程、参与开源项目等方式不断更新知识,提升技能。
|
|
|
+
|
|
|
+
|
|
|
+# 四、深度学习的应用
|
|
|
+深度学习在许多领域都有广泛的应用,包括但不限于:
|
|
|
+- **图像识别**:如物体识别、人脸识别、场景分类等。
|
|
|
+- **自然语言处理**:文本分类、机器翻译、情感分析等。
|
|
|
+- **语音识别**:语音转文本、语音命令识别等。
|
|
|
+
|
|
|
+
|
|
|
+# 五、进阶学习资源
|
|
|
+- **在线课程**:Coursera 上的“深度学习专项课程”,由 Andrew Ng 教授讲授,涵盖深度学习的基础知识和实践。
|
|
|
+- **书籍**:《Deep Learning》(深度学习),由 Ian Goodfellow 等人编写,是深度学习领域的经典著作。
|
|
|
+- **论文**:在 arXiv 和顶级会议(如 NeurIPS、ICML、ICLR)上阅读最新的深度学习论文,了解前沿研究。
|
|
|
+
|
|
|
+
|
|
|
+# 六、总结
|
|
|
+深度学习是一个强大的工具,通过上述步骤,你可以开始你的深度学习之旅。从数据准备、构建模型到训练和测试,这个入门手册提供了一个基本的框架。随着学习的深入,你可以探索更复杂的模型、优化技术和应用领域。
|
|
|
+
|
|
|
+
|
|
|
+以上手册只是深度学习的一个简单入门,深度学习领域非常广阔,不断有新的技术和方法涌现,你可以通过实践、阅读文献和参与开源项目等方式不断提升自己的能力。
|