Forráskód Böngészése

Update deeplearning.md

zhongqiao yuan 1 éve
szülő
commit
8dae018cf9
1 módosított fájl, 158 hozzáadás és 153 törlés
  1. 158 153
      ml/deeplearning.md

+ 158 - 153
ml/deeplearning.md

@@ -1,4 +1,3 @@
-
 ## 深度学习
 
 
@@ -20,158 +19,6 @@
 - **优化器**:根据损失函数的梯度更新神经网络的权重,以最小化损失。常见的优化器有随机梯度下降(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'))
-```
-
 
 ### 深度学习常见算法
 
@@ -603,6 +450,164 @@ for epoch in range(100):
 这些深度学习算法是深度学习领域的基础,每个算法都有其独特的特点和适用场景,在实际应用中,可根据具体任务选择合适的算法并进行相应的调参和优化。
 
 深度学习领域在不断发展,新的算法和改进不断涌现,你可以通过阅读学术论文、参加在线课程、参与开源项目等方式不断更新知识,提升技能。
+
+
+### 深度学习一般都是一个流程,所以很容易就会发明 框架
+
+
+
+# 二、深度学习框架
+目前有许多深度学习框架可供选择,以下是几个常用的:
+- **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'))
+```
+
  
 
 # 四、深度学习的应用